diff --git a/DEPS b/DEPS
index d206824..92cfa10 100644
--- a/DEPS
+++ b/DEPS
@@ -40,11 +40,11 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling Skia
   # and whatever else without interference from each other.
-  'skia_revision': '2cb7a1a3bf6917c125c55f9eebcc13019f9adb1b',
+  'skia_revision': '114a3c0b2b26c84b9d0907a99fd8ab7938631246',
   # 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': 'ab3accbebd8e0942c654438dff6616a9bce35fac',
+  'v8_revision': '2a69daf1572f8920d156ba3f9cf60e72955d6bf2',
   # 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.
@@ -64,7 +64,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': 'b58ff22b729a9b141a7d735254ffa2cbf3ce2b22',
+  'pdfium_revision': '9a505796f3fe8c1d0cbc3f7e4e7db41fc1fde137',
   # 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.
@@ -96,7 +96,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': 'ea7d9cf8f40e262803d8799f5525c84617664e1f',
+  'catapult_revision': 'e18c0f9c7950833973f15a784ff39cab7a5673c5',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libFuzzer
   # and whatever else without interference from each other.
diff --git a/android_webview/browser/renderer_host/aw_render_view_host_ext.cc b/android_webview/browser/renderer_host/aw_render_view_host_ext.cc
index 33b2f4f4..5df224c 100644
--- a/android_webview/browser/renderer_host/aw_render_view_host_ext.cc
+++ b/android_webview/browser/renderer_host/aw_render_view_host_ext.cc
@@ -32,11 +32,12 @@
 }
 
 AwRenderViewHostExt::~AwRenderViewHostExt() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   ClearImageRequests();
 }
 
 void AwRenderViewHostExt::DocumentHasImages(DocumentHasImagesResult result) {
-  DCHECK(CalledOnValidThread());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   if (!web_contents()->GetRenderViewHost()) {
     result.Run(false);
     return;
@@ -56,12 +57,12 @@
 }
 
 void AwRenderViewHostExt::ClearCache() {
-  DCHECK(CalledOnValidThread());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   Send(new AwViewMsg_ClearCache);
 }
 
 void AwRenderViewHostExt::KillRenderProcess() {
-  DCHECK(CalledOnValidThread());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   Send(new AwViewMsg_KillProcess);
 }
 
@@ -76,7 +77,7 @@
 void AwRenderViewHostExt::RequestNewHitTestDataAt(
     const gfx::PointF& touch_center,
     const gfx::SizeF& touch_area) {
-  DCHECK(CalledOnValidThread());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   // We only need to get blink::WebView on the renderer side to invoke the
   // blink hit test API, so sending this IPC to main frame is enough.
   Send(new AwViewMsg_DoHitTest(web_contents()->GetMainFrame()->GetRoutingID(),
@@ -84,24 +85,24 @@
 }
 
 const AwHitTestData& AwRenderViewHostExt::GetLastHitTestData() const {
-  DCHECK(CalledOnValidThread());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   return last_hit_test_data_;
 }
 
 void AwRenderViewHostExt::SetTextZoomFactor(float factor) {
-  DCHECK(CalledOnValidThread());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   Send(new AwViewMsg_SetTextZoomFactor(
       web_contents()->GetMainFrame()->GetRoutingID(), factor));
 }
 
 void AwRenderViewHostExt::ResetScrollAndScaleState() {
-  DCHECK(CalledOnValidThread());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   Send(new AwViewMsg_ResetScrollAndScaleState(
       web_contents()->GetMainFrame()->GetRoutingID()));
 }
 
 void AwRenderViewHostExt::SetInitialPageScale(double page_scale_factor) {
-  DCHECK(CalledOnValidThread());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   Send(new AwViewMsg_SetInitialPageScale(
       web_contents()->GetMainFrame()->GetRoutingID(), page_scale_factor));
 }
@@ -158,7 +159,7 @@
 
 void AwRenderViewHostExt::DidFinishNavigation(
     content::NavigationHandle* navigation_handle) {
-  DCHECK(CalledOnValidThread());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   if (!navigation_handle->HasCommitted() ||
       (!navigation_handle->IsInMainFrame() &&
        !navigation_handle->HasSubframeNavigationEntryCommitted()))
@@ -201,7 +202,7 @@
   if (render_frame_host != web_contents()->GetMainFrame())
     return;
 
-  DCHECK(CalledOnValidThread());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   std::map<int, DocumentHasImagesResult>::iterator pending_req =
       image_requests_callback_map_.find(msg_id);
   if (pending_req == image_requests_callback_map_.end()) {
@@ -224,7 +225,7 @@
   if (main_frame_host != web_contents()->GetMainFrame())
     return;
 
-  DCHECK(CalledOnValidThread());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   last_hit_test_data_ = hit_test_data;
   has_new_hit_test_data_ = true;
 }
diff --git a/android_webview/browser/renderer_host/aw_render_view_host_ext.h b/android_webview/browser/renderer_host/aw_render_view_host_ext.h
index 4396123..c0dcbde 100644
--- a/android_webview/browser/renderer_host/aw_render_view_host_ext.h
+++ b/android_webview/browser/renderer_host/aw_render_view_host_ext.h
@@ -10,7 +10,7 @@
 #include "android_webview/common/aw_hit_test_data.h"
 #include "base/callback_forward.h"
 #include "base/macros.h"
-#include "base/threading/non_thread_safe.h"
+#include "base/sequence_checker.h"
 #include "third_party/skia/include/core/SkColor.h"
 #include "ui/gfx/geometry/point_f.h"
 #include "ui/gfx/geometry/size.h"
@@ -31,8 +31,7 @@
 
 // Provides RenderViewHost wrapper functionality for sending WebView-specific
 // IPC messages to the renderer and from there to WebKit.
-class AwRenderViewHostExt : public content::WebContentsObserver,
-                            public base::NonThreadSafe {
+class AwRenderViewHostExt : public content::WebContentsObserver {
  public:
 
   // To send receive messages to a RenderView we take the WebContents instance,
@@ -117,6 +116,8 @@
 
   bool has_new_hit_test_data_;
 
+  SEQUENCE_CHECKER(sequence_checker_);
+
   DISALLOW_COPY_AND_ASSIGN(AwRenderViewHostExt);
 };
 
diff --git a/ash/accelerators/accelerator_controller.cc b/ash/accelerators/accelerator_controller.cc
index 9ca596b..21e54ed 100644
--- a/ash/accelerators/accelerator_controller.cc
+++ b/ash/accelerators/accelerator_controller.cc
@@ -527,7 +527,7 @@
 void HandleShowStylusTools() {
   base::RecordAction(UserMetricsAction("Accel_Show_Stylus_Tools"));
   GetRootWindowController(Shell::GetRootWindowForNewWindows())
-      ->GetShelf()
+      ->shelf()
       ->GetStatusAreaWidget()
       ->palette_tray()
       ->ShowPalette();
diff --git a/ash/app_list/app_list_presenter_delegate.cc b/ash/app_list/app_list_presenter_delegate.cc
index 258a88d4..e32d7c94 100644
--- a/ash/app_list/app_list_presenter_delegate.cc
+++ b/ash/app_list/app_list_presenter_delegate.cc
@@ -77,8 +77,6 @@
   if (keyboard_controller)
     keyboard_controller->RemoveObserver(this);
   Shell::Get()->RemovePreTargetHandler(this);
-  WmWindow* window = WmWindow::Get(view_->GetWidget()->GetNativeWindow());
-  window->GetRootWindowController()->GetShelf()->RemoveObserver(this);
   Shell::Get()->RemoveShellObserver(this);
 }
 
@@ -111,11 +109,10 @@
   if (keyboard_controller)
     keyboard_controller->AddObserver(this);
   Shell::Get()->AddPreTargetHandler(this);
-  Shelf* shelf = Shelf::ForWindow(root_window);
-  shelf->AddObserver(this);
 
   // By setting us as DnD recipient, the app list knows that we can
   // handle items.
+  Shelf* shelf = Shelf::ForWindow(root_window);
   view->SetDragAndDropHostOfCurrentAppList(
       shelf->shelf_widget()->GetDragAndDropHostForAppList());
 }
@@ -239,11 +236,4 @@
     presenter_->Dismiss();
 }
 
-////////////////////////////////////////////////////////////////////////////////
-// AppListPresenterDelegate, ShelfObserver implementation:
-
-void AppListPresenterDelegate::OnShelfIconPositionsChanged() {
-  UpdateBounds();
-}
-
 }  // namespace ash
diff --git a/ash/app_list/app_list_presenter_delegate.h b/ash/app_list/app_list_presenter_delegate.h
index feb25e2..e7cfcf4 100644
--- a/ash/app_list/app_list_presenter_delegate.h
+++ b/ash/app_list/app_list_presenter_delegate.h
@@ -8,7 +8,6 @@
 #include <stdint.h>
 
 #include "ash/ash_export.h"
-#include "ash/shelf/shelf_observer.h"
 #include "ash/shell_observer.h"
 #include "base/macros.h"
 #include "ui/app_list/presenter/app_list_presenter_delegate.h"
@@ -36,8 +35,7 @@
     : public app_list::AppListPresenterDelegate,
       public ui::EventHandler,
       public keyboard::KeyboardControllerObserver,
-      public ShellObserver,
-      public ShelfObserver {
+      public ShellObserver {
  public:
   AppListPresenterDelegate(
       app_list::AppListPresenterImpl* presenter,
@@ -69,9 +67,6 @@
   // ShellObserver overrides:
   void OnOverviewModeStarting() override;
 
-  // ShelfObserver overrides:
-  void OnShelfIconPositionsChanged() override;
-
   // Whether the app list is visible (or in the process of being shown).
   bool is_visible_ = false;
 
diff --git a/ash/ash_touch_exploration_manager_chromeos.cc b/ash/ash_touch_exploration_manager_chromeos.cc
index 6120ffbf..58cda1d 100644
--- a/ash/ash_touch_exploration_manager_chromeos.cc
+++ b/ash/ash_touch_exploration_manager_chromeos.cc
@@ -5,6 +5,7 @@
 #include "ash/ash_touch_exploration_manager_chromeos.h"
 
 #include "ash/accessibility_delegate.h"
+#include "ash/keyboard/keyboard_observer_register.h"
 #include "ash/root_window_controller.h"
 #include "ash/shared/app_types.h"
 #include "ash/shell.h"
@@ -18,6 +19,7 @@
 #include "chromeos/chromeos_switches.h"
 #include "ui/aura/client/aura_constants.h"
 #include "ui/chromeos/touch_exploration_controller.h"
+#include "ui/keyboard/keyboard_controller.h"
 #include "ui/wm/public/activation_client.h"
 
 namespace ash {
@@ -28,7 +30,9 @@
       audio_handler_(chromeos::CrasAudioHandler::Get()),
       enable_chromevox_arc_support_(
           base::CommandLine::ForCurrentProcess()->HasSwitch(
-              chromeos::switches::kEnableChromeVoxArcSupport)) {
+              chromeos::switches::kEnableChromeVoxArcSupport)),
+      keyboard_observer_(this) {
+  Shell::Get()->AddShellObserver(this);
   Shell::Get()->system_tray_notifier()->AddAccessibilityObserver(this);
   Shell::Get()->activation_client()->AddObserver(this);
   display::Screen::GetScreen()->AddObserver(this);
@@ -42,6 +46,7 @@
     system_tray_notifier->RemoveAccessibilityObserver(this);
   Shell::Get()->activation_client()->RemoveObserver(this);
   display::Screen::GetScreen()->RemoveObserver(this);
+  Shell::Get()->RemoveShellObserver(this);
 }
 
 void AshTouchExplorationManager::OnAccessibilityModeChanged(
@@ -142,6 +147,24 @@
   }
 }
 
+void AshTouchExplorationManager::OnKeyboardBoundsChanging(
+    const gfx::Rect& new_bounds) {
+  UpdateTouchExplorationState();
+}
+
+void AshTouchExplorationManager::OnKeyboardClosed() {
+  keyboard_observer_.RemoveAll();
+  UpdateTouchExplorationState();
+}
+
+void AshTouchExplorationManager::OnVirtualKeyboardStateChanged(
+    bool activated,
+    aura::Window* root_window) {
+  UpdateKeyboardObserverFromStateChanged(
+      activated, root_window, root_window_controller_->GetRootWindow(),
+      &keyboard_observer_);
+}
+
 void AshTouchExplorationManager::UpdateTouchExplorationState() {
   // See crbug.com/603745 for more details.
   const bool pass_through_surface =
@@ -176,6 +199,14 @@
     } else {
       touch_exploration_controller_->SetExcludeBounds(gfx::Rect());
     }
+
+    // Virtual keyboard.
+    keyboard::KeyboardController* keyboard_controller =
+        keyboard::KeyboardController::GetInstance();
+    if (keyboard_controller) {
+      touch_exploration_controller_->SetLiftActivationBounds(
+          keyboard_controller->current_keyboard_bounds());
+    }
   } else {
     touch_exploration_controller_.reset();
   }
diff --git a/ash/ash_touch_exploration_manager_chromeos.h b/ash/ash_touch_exploration_manager_chromeos.h
index 736d4516..9a66a264 100644
--- a/ash/ash_touch_exploration_manager_chromeos.h
+++ b/ash/ash_touch_exploration_manager_chromeos.h
@@ -8,17 +8,24 @@
 #include <memory>
 
 #include "ash/ash_export.h"
+#include "ash/shell_observer.h"
 #include "ash/system/accessibility_observer.h"
 #include "base/macros.h"
+#include "base/scoped_observer.h"
 #include "ui/chromeos/touch_accessibility_enabler.h"
 #include "ui/chromeos/touch_exploration_controller.h"
 #include "ui/display/display_observer.h"
+#include "ui/keyboard/keyboard_controller_observer.h"
 #include "ui/wm/public/activation_change_observer.h"
 
 namespace chromeos {
 class CrasAudioHandler;
 }
 
+namespace keyboard {
+class KeyboardController;
+}
+
 namespace ash {
 class RootWindowController;
 
@@ -31,7 +38,9 @@
       public ui::TouchExplorationControllerDelegate,
       public ui::TouchAccessibilityEnablerDelegate,
       public display::DisplayObserver,
-      public aura::client::ActivationChangeObserver {
+      public aura::client::ActivationChangeObserver,
+      public keyboard::KeyboardControllerObserver,
+      public ShellObserver {
  public:
   explicit AshTouchExplorationManager(
       RootWindowController* root_window_controller);
@@ -71,6 +80,14 @@
   void SetTouchAccessibilityAnchorPoint(const gfx::Point& anchor_point);
 
  private:
+  // keyboard::KeyboardControllerObserver overrides:
+  void OnKeyboardBoundsChanging(const gfx::Rect& new_bounds) override;
+  void OnKeyboardClosed() override;
+
+  // ShellObserver overrides:
+  void OnVirtualKeyboardStateChanged(bool activated,
+                                     aura::Window* root_window) override;
+
   void UpdateTouchExplorationState();
   bool VolumeAdjustSoundEnabled();
 
@@ -79,6 +96,9 @@
   RootWindowController* root_window_controller_;
   chromeos::CrasAudioHandler* audio_handler_;
   const bool enable_chromevox_arc_support_;
+  ScopedObserver<keyboard::KeyboardController,
+                 keyboard::KeyboardControllerObserver>
+      keyboard_observer_;
 
   DISALLOW_COPY_AND_ASSIGN(AshTouchExplorationManager);
 };
diff --git a/ash/root_window_controller.cc b/ash/root_window_controller.cc
index f99da864..b1dc346 100644
--- a/ash/root_window_controller.cc
+++ b/ash/root_window_controller.cc
@@ -560,8 +560,7 @@
     panel_layout_manager_ = nullptr;
   }
 
-  Shelf* shelf = GetShelf();
-  shelf->ShutdownShelfWidget();
+  shelf_->ShutdownShelfWidget();
 
   workspace_controller_.reset();
 
@@ -593,7 +592,7 @@
       root->RemoveChild(child);
   }
 
-  shelf->DestroyShelfWidget();
+  shelf_->DestroyShelfWidget();
 
   aura::client::SetDragDropClient(GetRootWindow(), nullptr);
   aura::client::SetTooltipClient(GetRootWindow(), nullptr);
@@ -776,7 +775,7 @@
   // Create the shelf and status area widgets.
   DCHECK(!shelf_->shelf_widget());
   aura::Window* root = GetRootWindow();
-  GetShelf()->CreateShelfWidget(root);
+  shelf_->CreateShelfWidget(root);
 
   root_window_layout_manager_ = new wm::RootWindowLayoutManager(root);
   root->SetLayoutManager(root_window_layout_manager_);
diff --git a/ash/root_window_controller.h b/ash/root_window_controller.h
index 1971f4b..904d6689 100644
--- a/ash/root_window_controller.h
+++ b/ash/root_window_controller.h
@@ -139,8 +139,6 @@
   wm::WorkspaceWindowState GetWorkspaceWindowState();
 
   Shelf* shelf() const { return shelf_.get(); }
-  // TODO(jamescook): Eliminate in favor of shelf().
-  Shelf* GetShelf() const { return shelf_.get(); }
 
   // Initializes the shelf for this root window and notifies observers.
   void InitializeShelf();
diff --git a/ash/shelf/shelf.cc b/ash/shelf/shelf.cc
index 4209ba0..3119297 100644
--- a/ash/shelf/shelf.cc
+++ b/ash/shelf/shelf.cc
@@ -74,7 +74,7 @@
 
 // static
 Shelf* Shelf::ForWindow(aura::Window* window) {
-  return GetRootWindowController(window->GetRootWindow())->GetShelf();
+  return GetRootWindowController(window->GetRootWindow())->shelf();
 }
 
 // static
diff --git a/ash/shelf/shelf_controller.cc b/ash/shelf/shelf_controller.cc
index 876c5d0..2bc855b 100644
--- a/ash/shelf/shelf_controller.cc
+++ b/ash/shelf/shelf_controller.cc
@@ -25,7 +25,7 @@
   // The controller may be null for invalid ids or for displays being removed.
   RootWindowController* root_window_controller =
       Shell::GetRootWindowControllerWithDisplayId(display_id);
-  return root_window_controller ? root_window_controller->GetShelf() : nullptr;
+  return root_window_controller ? root_window_controller->shelf() : nullptr;
 }
 
 }  // namespace
diff --git a/ash/shelf/shelf_layout_manager.cc b/ash/shelf/shelf_layout_manager.cc
index 429fd15..229e4c2 100644
--- a/ash/shelf/shelf_layout_manager.cc
+++ b/ash/shelf/shelf_layout_manager.cc
@@ -632,9 +632,8 @@
 
     // For crbug.com/622431, when the shelf alignment is BOTTOM_LOCKED, we
     // don't set display work area, as it is not real user-set alignment.
-    if (!state_.IsScreenLocked() &&
-        shelf_->alignment() != SHELF_ALIGNMENT_BOTTOM_LOCKED &&
-        change_work_area) {
+    if (!state_.IsScreenLocked() && change_work_area &&
+        shelf_->alignment() != SHELF_ALIGNMENT_BOTTOM_LOCKED) {
       gfx::Insets insets;
       // If user session is blocked (login to new user session or add user to
       // the existing session - multi-profile) then give 100% of work area only
diff --git a/ash/shelf/shelf_widget_unittest.cc b/ash/shelf/shelf_widget_unittest.cc
index 4a7f7e8..e55d689 100644
--- a/ash/shelf/shelf_widget_unittest.cc
+++ b/ash/shelf/shelf_widget_unittest.cc
@@ -38,7 +38,7 @@
 void TestLauncherAlignment(aura::Window* root,
                            ShelfAlignment alignment,
                            const gfx::Rect& expected) {
-  GetRootWindowController(root)->GetShelf()->SetAlignment(alignment);
+  GetRootWindowController(root)->shelf()->SetAlignment(alignment);
   EXPECT_EQ(expected.ToString(), display::Screen::GetScreen()
                                      ->GetDisplayNearestWindow(root)
                                      .work_area()
diff --git a/ash/shell.cc b/ash/shell.cc
index 92616f6d..6d2fa4f8 100644
--- a/ash/shell.cc
+++ b/ash/shell.cc
@@ -388,7 +388,7 @@
 
 void Shell::UpdateShelfVisibility() {
   for (WmWindow* root : shell_port_->GetAllRootWindows())
-    root->GetRootWindowController()->GetShelf()->UpdateVisibilityState();
+    root->GetRootWindowController()->shelf()->UpdateVisibilityState();
 }
 
 PrefService* Shell::GetActiveUserPrefService() const {
@@ -665,7 +665,7 @@
   // Destroy SystemTrayDelegate before destroying the status area(s). Make sure
   // to deinitialize the shelf first, as it is initialized after the delegate.
   for (WmWindow* root : shell_port_->GetAllRootWindows())
-    root->GetRootWindowController()->GetShelf()->ShutdownShelfWidget();
+    root->GetRootWindowController()->shelf()->ShutdownShelfWidget();
   tray_bluetooth_helper_.reset();
   DeleteSystemTrayDelegate();
 
diff --git a/ash/strings/ash_strings_am.xtb b/ash/strings/ash_strings_am.xtb
index 0a8d5104..e745652 100644
--- a/ash/strings/ash_strings_am.xtb
+++ b/ash/strings/ash_strings_am.xtb
@@ -206,8 +206,6 @@
 <translation id="7052914147756339792">ልጣፍ አዘጋጅ...</translation>
 <translation id="7066646422045619941">ይህ አውታረ መረብ በአስተዳዳሪዎ ነው የተሰናከለው።</translation>
 <translation id="7067196344162293536">በራስ-አሽከርክር</translation>
-<translation id="7097613348211027502">ChromeVox (የቃል ግብረመልስ) ነቅቷል። 
-ለማሰናከል Ctrl+Alt+Z ይጫኑ።</translation>
 <translation id="7098389117866926363">USB-C መሣሪያ (የግራ ወደብ ከኋላ በኩል)</translation>
 <translation id="7129360219436193655">የሌዘር ጨረር ጠቋሚ ሁነታ</translation>
 <translation id="714034171374937760">Chromebase</translation>
diff --git a/ash/strings/ash_strings_ar.xtb b/ash/strings/ash_strings_ar.xtb
index f92aa43..fd7c7c65 100644
--- a/ash/strings/ash_strings_ar.xtb
+++ b/ash/strings/ash_strings_ar.xtb
@@ -205,7 +205,6 @@
 <translation id="7052914147756339792">تعيين خلفية...</translation>
 <translation id="7066646422045619941">تم تعطيل هذه الشبكة من قِبل مشرفك.</translation>
 <translation id="7067196344162293536">تدوير تلقائي</translation>
-<translation id="7097613348211027502">‏تم تمكين ChromeVox (التعليقات المنطوقة). يمكنك الضغط على Ctrl+Alt+Z لتعطيلها.</translation>
 <translation id="7098389117866926363">‏جهاز USB-C (المنفذ الأيسر في الخلف)</translation>
 <translation id="7129360219436193655">وضع مؤشر الليزر</translation>
 <translation id="714034171374937760">Chromebase</translation>
diff --git a/ash/strings/ash_strings_bg.xtb b/ash/strings/ash_strings_bg.xtb
index da7195fc..fe3af1b 100644
--- a/ash/strings/ash_strings_bg.xtb
+++ b/ash/strings/ash_strings_bg.xtb
@@ -206,8 +206,6 @@
 <translation id="7052914147756339792">Задаване на тапет...</translation>
 <translation id="7066646422045619941">Тази мрежа е деактивирана от администратора ви.</translation>
 <translation id="7067196344162293536">Автоматично завъртане</translation>
-<translation id="7097613348211027502">Функцията ChromeVox (обратна връзка с говор) е активирана.
-Натиснете „Ctrl+Alt+Z“, за да я деактивирате.</translation>
 <translation id="7098389117866926363">Устройство с USB-C (левият порт на гърба)</translation>
 <translation id="7129360219436193655">Режим на лазерна показалка</translation>
 <translation id="714034171374937760">Chromebase</translation>
diff --git a/ash/strings/ash_strings_bn.xtb b/ash/strings/ash_strings_bn.xtb
index c63e2022..d9855bb 100644
--- a/ash/strings/ash_strings_bn.xtb
+++ b/ash/strings/ash_strings_bn.xtb
@@ -53,6 +53,7 @@
 <translation id="2391579633712104609">১৮০°</translation>
 <translation id="2429753432712299108">ব্লুটুথ ডিভাইস "<ph name="DEVICE_NAME" />" যুক্ত করার অনুমতি চাইছে। স্বীকার করার আগে, দয়া করে এই পাস কীটি যে ডিভাইসে প্রদর্শিত হয়েছে তা নিশ্চিত করুন: <ph name="PASSKEY" /></translation>
 <translation id="2475982808118771221">একটি ত্রুটি ঘটেছে</translation>
+<translation id="2501920221385095727">স্টিকি কীজ</translation>
 <translation id="2509468283778169019">CAPS LOCK চালু</translation>
 <translation id="2532589005999780174">উচ্চ কনট্রাস্ট মোড</translation>
 <translation id="2700058918926273959"><ph name="SESSION_TIME_REMAINING" /> এর মধ্যে সেশন শেষ হয়ে যাবে৷ আপনাকে প্রস্থান করুন করা হবে৷</translation>
@@ -152,6 +153,7 @@
 <translation id="5571066253365925590">ব্লুটুথ সক্ষমিত</translation>
 <translation id="5597451508971090205"><ph name="SHORT_WEEKDAY" />, <ph name="DATE" /></translation>
 <translation id="5648021990716966815">মাইক জ্যাক</translation>
+<translation id="5744083938413354016">ট্যাপ করে টেনে আনা</translation>
 <translation id="5777841717266010279">স্ক্রীন শেয়ার করা থামাবেন?</translation>
 <translation id="57838592816432529">নিঃশব্দ করুন</translation>
 <translation id="5895138241574237353">পুনর্সূচনা</translation>
@@ -204,7 +206,6 @@
 <translation id="7052914147756339792">ওয়ালপেপার সেট করুন...</translation>
 <translation id="7066646422045619941">এই নেটওয়ার্কটি আপনার প্রশাসকের দ্বারা অক্ষম করা হয়েছে৷</translation>
 <translation id="7067196344162293536">স্বতঃ ঘূর্ণন</translation>
-<translation id="7097613348211027502">ChromeVox (কথ্য প্রতিক্রিয়া) সক্ষম রয়েছে৷ অক্ষম করার জন্য Ctrl+Alt+Z টিপুন৷</translation>
 <translation id="7098389117866926363">USB-C ডিভাইস (পিছনের বাঁ পোর্ট)</translation>
 <translation id="7129360219436193655">লেজার পয়েন্টার মোড</translation>
 <translation id="714034171374937760">Chromebase</translation>
diff --git a/ash/strings/ash_strings_ca.xtb b/ash/strings/ash_strings_ca.xtb
index 9b5a39a..3831b828 100644
--- a/ash/strings/ash_strings_ca.xtb
+++ b/ash/strings/ash_strings_ca.xtb
@@ -206,8 +206,6 @@
 <translation id="7052914147756339792">Estableix fons de pantalla...</translation>
 <translation id="7066646422045619941">L'administrador ha desactivat aquesta xarxa.</translation>
 <translation id="7067196344162293536">Rotació automàtica</translation>
-<translation id="7097613348211027502">ChromeVox (comentaris de veu) està activat.
-Premeu Ctrl + Alt + Z per desactivar-lo.</translation>
 <translation id="7098389117866926363">Dispositiu USB-C (port posterior esquerre)</translation>
 <translation id="7129360219436193655">Mode de punter làser</translation>
 <translation id="714034171374937760">Chromebase</translation>
diff --git a/ash/strings/ash_strings_cs.xtb b/ash/strings/ash_strings_cs.xtb
index 1094e18c..c4e1b84 100644
--- a/ash/strings/ash_strings_cs.xtb
+++ b/ash/strings/ash_strings_cs.xtb
@@ -205,8 +205,6 @@
 <translation id="7052914147756339792">Nastavení tapety...</translation>
 <translation id="7066646422045619941">Tato síť je zakázána vaším administrátorem.</translation>
 <translation id="7067196344162293536">Automatické otáčení</translation>
-<translation id="7097613348211027502">Funkce ChromeVox (hlasová odezva) je aktivní.
-Deaktivujete ji stisknutím kláves Ctrl+Alt+Z.</translation>
 <translation id="7098389117866926363">Zařízení USB Type-C (levý zadní port)</translation>
 <translation id="7129360219436193655">Režim laserového ukazovátka</translation>
 <translation id="714034171374937760">Chromebase</translation>
diff --git a/ash/strings/ash_strings_da.xtb b/ash/strings/ash_strings_da.xtb
index d116a9b..313e685a 100644
--- a/ash/strings/ash_strings_da.xtb
+++ b/ash/strings/ash_strings_da.xtb
@@ -206,8 +206,6 @@
 <translation id="7052914147756339792">Vælg baggrund...</translation>
 <translation id="7066646422045619941">Din administrator har deaktiveret dette netværk.</translation>
 <translation id="7067196344162293536">Automatisk rotering</translation>
-<translation id="7097613348211027502">ChromeVox (talefeedback) er aktiveret.
-Tryk på Ctrl+Alt+Z for at deaktivere dette.</translation>
 <translation id="7098389117866926363">USB-C-enhed (porten bagpå i venstre side)</translation>
 <translation id="7129360219436193655">Laserpentilstand</translation>
 <translation id="714034171374937760">Chromebase</translation>
diff --git a/ash/strings/ash_strings_de.xtb b/ash/strings/ash_strings_de.xtb
index 770757c..3e8da2b 100644
--- a/ash/strings/ash_strings_de.xtb
+++ b/ash/strings/ash_strings_de.xtb
@@ -206,8 +206,6 @@
 <translation id="7052914147756339792">Hintergrund ändern</translation>
 <translation id="7066646422045619941">Dieses Netzwerk wurde von Ihrem Administrator deaktiviert.</translation>
 <translation id="7067196344162293536">Automatisch drehen</translation>
-<translation id="7097613348211027502">ChromeVox (gesprochenes Feedback) ist aktiviert.
-Zum Deaktivieren drücken Sie Strg + Alt + Z.</translation>
 <translation id="7098389117866926363">USB-C-Gerät (linker Port hinten)</translation>
 <translation id="7129360219436193655">Laserpointer-Modus</translation>
 <translation id="714034171374937760">Chromebase</translation>
diff --git a/ash/strings/ash_strings_el.xtb b/ash/strings/ash_strings_el.xtb
index 7600e00..ad0680b 100644
--- a/ash/strings/ash_strings_el.xtb
+++ b/ash/strings/ash_strings_el.xtb
@@ -206,8 +206,6 @@
 <translation id="7052914147756339792">Ορισμός ταπετσαρίας...</translation>
 <translation id="7066646422045619941">Το δίκτυο αυτό έχει απενεργοποιηθεί από το διαχειριστή σας.</translation>
 <translation id="7067196344162293536">Αυτόματη περιστροφή</translation>
-<translation id="7097613348211027502">Το ChromeVox (προφορικά σχόλια) έχει ενεργοποιηθεί.
-Πατήστε Ctrl+Alt+Z για απενεργοποίηση.</translation>
 <translation id="7098389117866926363">Συσκευή USB-C (πίσω αριστερή θύρα)</translation>
 <translation id="7129360219436193655">Λειτουργία δείκτη λέιζερ</translation>
 <translation id="714034171374937760">Chromebase</translation>
diff --git a/ash/strings/ash_strings_en-GB.xtb b/ash/strings/ash_strings_en-GB.xtb
index 8d1c447c..7617a499 100644
--- a/ash/strings/ash_strings_en-GB.xtb
+++ b/ash/strings/ash_strings_en-GB.xtb
@@ -206,8 +206,6 @@
 <translation id="7052914147756339792">Set wallpaper...</translation>
 <translation id="7066646422045619941">This network is disabled by your administrator.</translation>
 <translation id="7067196344162293536">Auto rotate</translation>
-<translation id="7097613348211027502">ChromeVox (spoken feedback) is enabled.
-Press Ctrl+Alt+Z to disable.</translation>
 <translation id="7098389117866926363">USB-C device (left port in the back)</translation>
 <translation id="7129360219436193655">Laser pointer mode</translation>
 <translation id="714034171374937760">Chromebase</translation>
diff --git a/ash/strings/ash_strings_es-419.xtb b/ash/strings/ash_strings_es-419.xtb
index 9f03bf0..757dd23 100644
--- a/ash/strings/ash_strings_es-419.xtb
+++ b/ash/strings/ash_strings_es-419.xtb
@@ -206,7 +206,6 @@
 <translation id="7052914147756339792">Establecer fondo de pantalla...</translation>
 <translation id="7066646422045619941">El administrador inhabilitó esta red.</translation>
 <translation id="7067196344162293536">Rotación automática</translation>
-<translation id="7097613348211027502">ChromeVox (comentarios por voz) está habilitado. Presiona Ctrl + Alt + Z para inhabilitarlo.</translation>
 <translation id="7098389117866926363">Dispositivo USB-C (puerto izquierdo en la parte posterior)</translation>
 <translation id="7129360219436193655">Modo de puntero láser</translation>
 <translation id="714034171374937760">Chromebase</translation>
diff --git a/ash/strings/ash_strings_es.xtb b/ash/strings/ash_strings_es.xtb
index db6e876..23438dc 100644
--- a/ash/strings/ash_strings_es.xtb
+++ b/ash/strings/ash_strings_es.xtb
@@ -23,7 +23,7 @@
 <translation id="1550523713251050646">Haz clic aquí para obtener más opciones</translation>
 <translation id="1621499497873603021">Tiempo restante hasta que se agote la batería: <ph name="TIME_LEFT" /></translation>
 <translation id="164969095109328410">Dispositivo Chrome</translation>
-<translation id="1677472565718498478">Tiempo restante: <ph name="TIME" /></translation>
+<translation id="1677472565718498478">Queda: <ph name="TIME" /></translation>
 <translation id="1698760176351776263">Dirección IPv6: <ph name="ADDRESS" /></translation>
 <translation id="1734367976349034509">Este es un dispositivo administrado por la empresa</translation>
 <translation id="1747827819627189109">Teclado en pantalla habilitado</translation>
@@ -41,7 +41,7 @@
 <translation id="2050339315714019657">Vertical</translation>
 <translation id="207439088875642105">Esta es una cuenta infantil administrada por <ph name="FIRST_PARENT_EMAIL" /> y <ph name="SECOND_PARENT_EMAIL" /></translation>
 <translation id="2122028596993374965">Dejar de enviar el contenido de la pestaña <ph name="TAB_NAME" /> a <ph name="RECEIVER_NAME" /></translation>
-<translation id="2127372758936585790">Cargador de baja potencia</translation>
+<translation id="2127372758936585790">Carga lenta</translation>
 <translation id="2144487987174258011">Reinicia para actualizar Adobe Flash Player</translation>
 <translation id="2208323208084708176">Modo de escritorio unificado</translation>
 <translation id="225680501294068881">Buscando dispositivos...</translation>
@@ -206,8 +206,6 @@
 <translation id="7052914147756339792">Establecer fondo de pantalla...</translation>
 <translation id="7066646422045619941">El administrador ha inhabilitado esta red.</translation>
 <translation id="7067196344162293536">Rotación automática</translation>
-<translation id="7097613348211027502">ChromeVox (mensajes de voz) está habilitado.
-Pulsa Ctrl+Alt+Z para inhabilitarlo.</translation>
 <translation id="7098389117866926363">Dispositivo USB tipo C (puerto izquierdo situado en la parte trasera)</translation>
 <translation id="7129360219436193655">Modo de puntero láser</translation>
 <translation id="714034171374937760">Chromebase</translation>
diff --git a/ash/strings/ash_strings_et.xtb b/ash/strings/ash_strings_et.xtb
index 2a492943..a990abb 100644
--- a/ash/strings/ash_strings_et.xtb
+++ b/ash/strings/ash_strings_et.xtb
@@ -206,8 +206,6 @@
 <translation id="7052914147756339792">Määra taustapilt ...</translation>
 <translation id="7066646422045619941">Teie administraator on selle võrgu keelanud.</translation>
 <translation id="7067196344162293536">Automaatne pööramine</translation>
-<translation id="7097613348211027502">ChromeVox (kõnena esitatud tagasiside) on lubatud.
-Keelamiseks vajutage klahvikombinatsiooni Ctrl + Alt + Z.</translation>
 <translation id="7098389117866926363">C-tüüpi USB-seade (vasakpoolne port taga)</translation>
 <translation id="7129360219436193655">Laserkursorirežiim</translation>
 <translation id="714034171374937760">Chromebase</translation>
diff --git a/ash/strings/ash_strings_fa.xtb b/ash/strings/ash_strings_fa.xtb
index 769c1e17c..9ef12c9 100644
--- a/ash/strings/ash_strings_fa.xtb
+++ b/ash/strings/ash_strings_fa.xtb
@@ -206,8 +206,6 @@
 <translation id="7052914147756339792">تنظیم کاغذدیواری...</translation>
 <translation id="7066646422045619941">این شبکه توسط سرپرست شما غیرفعال شده است.</translation>
 <translation id="7067196344162293536">چرخش خودکار</translation>
-<translation id="7097613348211027502">‏ChromeVox (بازخورد گفتاری) فعال است.
-برای غیرفعال کردن آن Ctrl+Alt+Z را فشار دهید.</translation>
 <translation id="7098389117866926363">‏دستگاه USB-C (درگاه عقب سمت چپ)</translation>
 <translation id="7129360219436193655">حالت اشاره‌گر لیزری</translation>
 <translation id="714034171374937760">Chromebase</translation>
diff --git a/ash/strings/ash_strings_fi.xtb b/ash/strings/ash_strings_fi.xtb
index 5465022d..bc2023a 100644
--- a/ash/strings/ash_strings_fi.xtb
+++ b/ash/strings/ash_strings_fi.xtb
@@ -205,7 +205,6 @@
 <translation id="7052914147756339792">Aseta taustakuva...</translation>
 <translation id="7066646422045619941">Järjestelmänvalvoja on poistanut tämän verkon käytöstä.</translation>
 <translation id="7067196344162293536">Automaattinen kierto</translation>
-<translation id="7097613348211027502">ChromeVox (äänipalaute) on käytössä. Poista se käytöstä painamalla Ctrl+Alt+Z.</translation>
 <translation id="7098389117866926363">C-tyypin USB-laite (vasemmanpuoleinen takaportti)</translation>
 <translation id="7129360219436193655">Laserosoitintila</translation>
 <translation id="714034171374937760">Chromebase</translation>
diff --git a/ash/strings/ash_strings_fil.xtb b/ash/strings/ash_strings_fil.xtb
index de616eb..0548d98e 100644
--- a/ash/strings/ash_strings_fil.xtb
+++ b/ash/strings/ash_strings_fil.xtb
@@ -206,8 +206,6 @@
 <translation id="7052914147756339792">Magtakda ng wallpaper...</translation>
 <translation id="7066646422045619941">Na-disable ng iyong administrator ang network na ito.</translation>
 <translation id="7067196344162293536">Awtomatikong pag-rotate</translation>
-<translation id="7097613348211027502">Naka-enable ang ChromeVox (pasalitang feedback).
-Pindutin ang Ctrl+Alt+Z upang i-disable.</translation>
 <translation id="7098389117866926363">USB-C device (kaliwang port sa likod)</translation>
 <translation id="7129360219436193655">Laser pointer mode</translation>
 <translation id="714034171374937760">Chromebase</translation>
diff --git a/ash/strings/ash_strings_fr.xtb b/ash/strings/ash_strings_fr.xtb
index 417eed0..2593687 100644
--- a/ash/strings/ash_strings_fr.xtb
+++ b/ash/strings/ash_strings_fr.xtb
@@ -206,8 +206,6 @@
 <translation id="7052914147756339792">Définir un fond d'écran…</translation>
 <translation id="7066646422045619941">Votre administrateur a désactivé ce réseau.</translation>
 <translation id="7067196344162293536">Rotation automatique</translation>
-<translation id="7097613348211027502">ChromeVox (commentaires audio) est activé.
-Appuyez sur les touches Ctrl + Alt + Z pour le désactiver.</translation>
 <translation id="7098389117866926363">Appareil USB de type C (port situé sur l'arrière de l'appareil, à gauche)</translation>
 <translation id="7129360219436193655">Mode pointeur laser</translation>
 <translation id="714034171374937760">Chromebase</translation>
diff --git a/ash/strings/ash_strings_gu.xtb b/ash/strings/ash_strings_gu.xtb
index b45dbae..7f26aba 100644
--- a/ash/strings/ash_strings_gu.xtb
+++ b/ash/strings/ash_strings_gu.xtb
@@ -53,6 +53,7 @@
 <translation id="2391579633712104609">180°</translation>
 <translation id="2429753432712299108">Bluetooth ઉપકરણ "<ph name="DEVICE_NAME" />" ને જોડી બનાવવા માટે પરવાનગી જોઈએ છે. સ્વીકારતાં પહેલાં, કૃપા કરીને તે ઉપકરણ પર બતાવેલ આ પાસકીની પુષ્ટિ કરો: <ph name="PASSKEY" /></translation>
 <translation id="2475982808118771221">કોઈ ભૂલ આવી છે</translation>
+<translation id="2501920221385095727">સ્ટિકી કી</translation>
 <translation id="2509468283778169019">CAPS LOCK ચાલુ છે</translation>
 <translation id="2532589005999780174">ઉચ્ચ કોન્ટ્રાસ્ટ મોડ</translation>
 <translation id="2700058918926273959"><ph name="SESSION_TIME_REMAINING" /> માં સત્ર સમાપ્ત થાય છે. તમને સાઇન આઉટ કરવામાં આવશે.</translation>
@@ -152,6 +153,7 @@
 <translation id="5571066253365925590">Bluetooth સક્ષમ છે</translation>
 <translation id="5597451508971090205"><ph name="SHORT_WEEKDAY" />, <ph name="DATE" /></translation>
 <translation id="5648021990716966815">માઇક જેક</translation>
+<translation id="5744083938413354016">ખેંચવાને ટૅપ કરો</translation>
 <translation id="5777841717266010279">સ્ક્રીન શેરિંગ રોકીએ?</translation>
 <translation id="57838592816432529">અવાજ બંધ કરો</translation>
 <translation id="5895138241574237353">પુનઃપ્રારંભ કરો</translation>
@@ -204,7 +206,6 @@
 <translation id="7052914147756339792">વૉલપેપર સેટ કરો...</translation>
 <translation id="7066646422045619941">આ નેટવર્ક તમારા વ્યવસ્થાપક દ્વારા અક્ષમ કરેલ છે.</translation>
 <translation id="7067196344162293536">સ્વતઃ ફેરવો</translation>
-<translation id="7097613348211027502">ChromeVox (બોલાયેલ પ્રતિસાદ) સક્ષમ છે. અક્ષમ કરવા માટે Ctrl+Alt+Z દબાવો.</translation>
 <translation id="7098389117866926363">USB-C ઉપકરણ (પાછળની બાજુએ ડાબું પોર્ટ)</translation>
 <translation id="7129360219436193655">લેઝર પૉઇન્ટર મોડ</translation>
 <translation id="714034171374937760">Chromebase</translation>
diff --git a/ash/strings/ash_strings_hi.xtb b/ash/strings/ash_strings_hi.xtb
index 9f1ee12a..7f6b1ca 100644
--- a/ash/strings/ash_strings_hi.xtb
+++ b/ash/strings/ash_strings_hi.xtb
@@ -206,7 +206,6 @@
 <translation id="7052914147756339792">वॉलपेपर सेट करें...</translation>
 <translation id="7066646422045619941">यह नेटवर्क आपके व्यवस्थापक द्वारा अक्षम किया गया है.</translation>
 <translation id="7067196344162293536">स्वत: घुमाएं</translation>
-<translation id="7097613348211027502">ChromeVox (बोला गया फ़ीडबैक) सक्षम है. अक्षम करने के लिए Ctrl+Alt+Z दबाएं.</translation>
 <translation id="7098389117866926363">USB-C डिवाइस (पीछे बायां पोर्ट)</translation>
 <translation id="7129360219436193655">लेज़र पॉइंटर मोड</translation>
 <translation id="714034171374937760">Chromebase</translation>
diff --git a/ash/strings/ash_strings_hr.xtb b/ash/strings/ash_strings_hr.xtb
index 7c0586e..28800498 100644
--- a/ash/strings/ash_strings_hr.xtb
+++ b/ash/strings/ash_strings_hr.xtb
@@ -206,8 +206,6 @@
 <translation id="7052914147756339792">Postavljanje pozadinske slike...</translation>
 <translation id="7066646422045619941">Tu mrežu onemogućio je vaš administrator.</translation>
 <translation id="7067196344162293536">Automatski izmjenjuj</translation>
-<translation id="7097613348211027502">Omogućen je ChromeVox (govorne povratne informacije).
-Pritisnite Ctrl+Alt+Z da biste ga onemogućili.</translation>
 <translation id="7098389117866926363">USB-C uređaj (lijevi priključak sa stražnje strane)</translation>
 <translation id="7129360219436193655">Način laserskog pokazivača</translation>
 <translation id="714034171374937760">Chromebase</translation>
diff --git a/ash/strings/ash_strings_hu.xtb b/ash/strings/ash_strings_hu.xtb
index d59f88c..2cd262b 100644
--- a/ash/strings/ash_strings_hu.xtb
+++ b/ash/strings/ash_strings_hu.xtb
@@ -206,8 +206,6 @@
 <translation id="7052914147756339792">Háttérkép beállítása...</translation>
 <translation id="7066646422045619941">Ezt a hálózatot letiltotta a rendszergazda.</translation>
 <translation id="7067196344162293536">Automatikus forgatás</translation>
-<translation id="7097613348211027502">A ChromeVox (hangos visszajelzés) engedélyezett. A
-letiltásához nyomja le a Ctrl+Alt+Z billentyűkombinációt.</translation>
 <translation id="7098389117866926363">C típusú USB-vel kompatibilis eszköz (bal hátsó port)</translation>
 <translation id="7129360219436193655">Lézermutató mód</translation>
 <translation id="714034171374937760">Chromebase</translation>
diff --git a/ash/strings/ash_strings_id.xtb b/ash/strings/ash_strings_id.xtb
index dcdc2d3..84242182 100644
--- a/ash/strings/ash_strings_id.xtb
+++ b/ash/strings/ash_strings_id.xtb
@@ -206,8 +206,6 @@
 <translation id="7052914147756339792">Setel wallpaper...</translation>
 <translation id="7066646422045619941">Jaringan ini dinonaktifkan oleh administrator Anda.</translation>
 <translation id="7067196344162293536">Putar otomatis</translation>
-<translation id="7097613348211027502">ChromeVox (masukan lisan) diaktifkan.
-Tekan Ctrl+Alt+Z untuk menonaktifkan.</translation>
 <translation id="7098389117866926363">Perangkat USB-C (port belakang sebelah kiri)</translation>
 <translation id="7129360219436193655">Mode penunjuk laser</translation>
 <translation id="714034171374937760">Chromebase</translation>
diff --git a/ash/strings/ash_strings_it.xtb b/ash/strings/ash_strings_it.xtb
index 511cb38..92384a0 100644
--- a/ash/strings/ash_strings_it.xtb
+++ b/ash/strings/ash_strings_it.xtb
@@ -206,8 +206,6 @@
 <translation id="7052914147756339792">Imposta sfondo...</translation>
 <translation id="7066646422045619941">Questa rete è stata disattivata dall'amministratore.</translation>
 <translation id="7067196344162293536">Ruota in modo automatico</translation>
-<translation id="7097613348211027502">ChromeVox (lettura vocale) attivo.
-Premi Ctrl+Alt+Z per disattivarlo.</translation>
 <translation id="7098389117866926363">Dispositivo USB-C (porta posteriore sinistra)</translation>
 <translation id="7129360219436193655">Modalità puntatore laser</translation>
 <translation id="714034171374937760">Chromebase</translation>
diff --git a/ash/strings/ash_strings_iw.xtb b/ash/strings/ash_strings_iw.xtb
index cf811f0..a1a846ec 100644
--- a/ash/strings/ash_strings_iw.xtb
+++ b/ash/strings/ash_strings_iw.xtb
@@ -206,7 +206,6 @@
 <translation id="7052914147756339792">הגדר טפט...</translation>
 <translation id="7066646422045619941">מנהל המערכת השבית את הרשת הזו.</translation>
 <translation id="7067196344162293536">סיבוב אוטומטי</translation>
-<translation id="7097613348211027502">‏ChromeVox (משוב קולי) מופעל. הקש על Ctrl+Alt+Z כדי להשבית אותו.</translation>
 <translation id="7098389117866926363">‏מכשיר עם יציאת USB-C (יציאה שמאלית מאחור)</translation>
 <translation id="7129360219436193655">מצב סמן לייזר</translation>
 <translation id="714034171374937760">Chromebase</translation>
diff --git a/ash/strings/ash_strings_ja.xtb b/ash/strings/ash_strings_ja.xtb
index fbdcb083..0ede4dab 100644
--- a/ash/strings/ash_strings_ja.xtb
+++ b/ash/strings/ash_strings_ja.xtb
@@ -206,8 +206,6 @@
 <translation id="7052914147756339792">壁紙を設定...</translation>
 <translation id="7066646422045619941">このネットワークは管理者によって無効にされています。</translation>
 <translation id="7067196344162293536">自動回転</translation>
-<translation id="7097613348211027502">ChromeVox(音声フィードバック)が有効です。
-無効にするには Ctrl+Alt+Z を押してください。</translation>
 <translation id="7098389117866926363">USB-C デバイス(背面左のポート)</translation>
 <translation id="7129360219436193655">レーザー ポインタ モード</translation>
 <translation id="714034171374937760">Chromebase</translation>
diff --git a/ash/strings/ash_strings_kn.xtb b/ash/strings/ash_strings_kn.xtb
index 5ecbb2d..27f717d 100644
--- a/ash/strings/ash_strings_kn.xtb
+++ b/ash/strings/ash_strings_kn.xtb
@@ -53,6 +53,7 @@
 <translation id="2391579633712104609">180°</translation>
 <translation id="2429753432712299108">ಬ್ಲೂಟೂತ್‌‌ ಸಾಧನವು "<ph name="DEVICE_NAME" />" ಜೋಡಣೆಗಾಗಿ ಅನುಮತಿಯನ್ನು ಬಯಸುತ್ತದೆ. ಸಮ್ಮತಿಸುವುದಕ್ಕೂ ಮೊದಲು, ದಯವಿಟ್ಟು ಆ ಸಾಧನದಲ್ಲಿ ಈ ಪಾಸ್‌ಕೀಲಿಯನ್ನು ತೋರಿಸಲಾಗಿದೆಯೇ ಎಂಬುದನ್ನು ಖಾತರಿಪಡಿಸಿಕೊಳ್ಳಿ: <ph name="PASSKEY" /></translation>
 <translation id="2475982808118771221">ದೋಷವೊಂದು ಕಾಣಿಸಿಕೊಂಡಿದೆ</translation>
+<translation id="2501920221385095727">ಸ್ಟಿಕಿ ಕೀಗಳು</translation>
 <translation id="2509468283778169019">CAPS LOCK ಆನ್ ಆಗಿದೆ</translation>
 <translation id="2532589005999780174">ಹೆಚ್ಚಿನ ಕಾಂಟ್ರಾಸ್ಟ್ ಮೋಡ್</translation>
 <translation id="2700058918926273959">ಸೆಷನ್ <ph name="SESSION_TIME_REMAINING" /> ರಲ್ಲಿ ಕೊನೆಗೊಳ್ಳಲಿದೆ. ನೀವು ಸೈನ್ ಔಟ್ ಆಗಲಿರುವಿರಿ.</translation>
@@ -152,6 +153,7 @@
 <translation id="5571066253365925590">ಬ್ಲೂಟೂತ್‌ ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ</translation>
 <translation id="5597451508971090205"><ph name="SHORT_WEEKDAY" />, <ph name="DATE" /></translation>
 <translation id="5648021990716966815">ಮೈಕ್ ಜ್ಯಾಕ್</translation>
+<translation id="5744083938413354016">ಟ್ಯಾಪ್ ಎಳೆಯುವಿಕೆ</translation>
 <translation id="5777841717266010279">ಸ್ಕ್ರೀನ್ ಹಂಚಿಕೆ ನಿಲ್ಲಿಸುವುದೇ?</translation>
 <translation id="57838592816432529">ಮ್ಯೂಟ್</translation>
 <translation id="5895138241574237353">ಮರುಪ್ರಾರಂಭಿಸಿ</translation>
@@ -204,7 +206,6 @@
 <translation id="7052914147756339792">ವಾಲ್‌ಪೇಪರ್ ಅನ್ನು ಹೊಂದಿಸಿ...</translation>
 <translation id="7066646422045619941">ಈ ನೆಟ್‌ವರ್ಕ್ ಅನ್ನು ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿದ್ದಾರೆ.</translation>
 <translation id="7067196344162293536">ಸ್ವಯಂ ತಿರುಗಿಸು</translation>
-<translation id="7097613348211027502">ChromeVox (ಮಾತಿನ ಪ್ರತಿಕ್ರಿಯೆ) ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ. ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲು Ctrl+Alt+Z ಒತ್ತಿರಿ.</translation>
 <translation id="7098389117866926363">USB-C ಸಾಧನ (ಹಿಂಭಾಗದಲ್ಲಿ ಎಡ ಪೋರ್ಟ್‌)</translation>
 <translation id="7129360219436193655">ಲೇಸರ್ ಪಾಯಿಂಟರ್ ಮೋಡ್</translation>
 <translation id="714034171374937760">Chromebase</translation>
diff --git a/ash/strings/ash_strings_ko.xtb b/ash/strings/ash_strings_ko.xtb
index 8659667e..750a513 100644
--- a/ash/strings/ash_strings_ko.xtb
+++ b/ash/strings/ash_strings_ko.xtb
@@ -206,8 +206,6 @@
 <translation id="7052914147756339792">배경화면 설정...</translation>
 <translation id="7066646422045619941">관리자가 사용 중지한 네트워크입니다.</translation>
 <translation id="7067196344162293536">자동 회전</translation>
-<translation id="7097613348211027502">ChromeVox(음성 피드백)를 사용하도록 설정했습니다.
-사용 중지하려면 Ctrl+Alt+Z를 누르세요.</translation>
 <translation id="7098389117866926363">USB-C 기기(좌측 후면 포트)</translation>
 <translation id="7129360219436193655">레이저 포인터 모드</translation>
 <translation id="714034171374937760">Chromebase</translation>
diff --git a/ash/strings/ash_strings_lt.xtb b/ash/strings/ash_strings_lt.xtb
index 480f488a..7b14bab 100644
--- a/ash/strings/ash_strings_lt.xtb
+++ b/ash/strings/ash_strings_lt.xtb
@@ -206,8 +206,6 @@
 <translation id="7052914147756339792">Nustatyti darbalaukio foną...</translation>
 <translation id="7066646422045619941">Šį tinklą išjungė jūsų administratorius.</translation>
 <translation id="7067196344162293536">Automatinis kaitaliojimas</translation>
-<translation id="7097613348211027502">„ChromeVox“ (ekrano skaitymas balsu) įgalinta.
-Jei norite išjungti, paspauskite „Ctrl“ + „Alt“ + Z.</translation>
 <translation id="7098389117866926363">USB-C įrenginys (prievadas kairėje, užpakalinėje dalyje)</translation>
 <translation id="7129360219436193655">Lazerinio žymeklio režimas</translation>
 <translation id="714034171374937760">Chromebase</translation>
diff --git a/ash/strings/ash_strings_lv.xtb b/ash/strings/ash_strings_lv.xtb
index 66c07b82..96cfbe7 100644
--- a/ash/strings/ash_strings_lv.xtb
+++ b/ash/strings/ash_strings_lv.xtb
@@ -206,8 +206,6 @@
 <translation id="7052914147756339792">Iestatīt fona tapeti...</translation>
 <translation id="7066646422045619941">Jūsu administrators atspējoja šo tīklu.</translation>
 <translation id="7067196344162293536">Pagriezt automātiski</translation>
-<translation id="7097613348211027502">Lasītājs ChromeVox (balss komentāri) ir iespējots.
-Nospiediet īsinājumtaustiņu kombināciju Ctrl+Alt+Z, lai to atspējotu.</translation>
 <translation id="7098389117866926363">USB-C ierīce (pieslēgvieta aizmugurē pa kreisi)</translation>
 <translation id="7129360219436193655">Lāzera rādītāja režīms</translation>
 <translation id="714034171374937760">Chromebase</translation>
diff --git a/ash/strings/ash_strings_ml.xtb b/ash/strings/ash_strings_ml.xtb
index 8967e18..5fd3f6d 100644
--- a/ash/strings/ash_strings_ml.xtb
+++ b/ash/strings/ash_strings_ml.xtb
@@ -53,6 +53,7 @@
 <translation id="2391579633712104609">180°</translation>
 <translation id="2429753432712299108">"<ph name="DEVICE_NAME" />" എന്ന Bluetooth ഉപകരണം ജോടിയാക്കുന്നതിനുള്ള അനുമതി ആവശ്യപ്പെടുന്നു. അനുമതി നൽകുന്നതിനുമുമ്പ്, ആ ഉപകരണത്തിൽ ഈ പാസ്‌കീ കാണിച്ചിരിക്കുന്നുവെന്ന് സ്ഥിരീകരിക്കുക: <ph name="PASSKEY" /></translation>
 <translation id="2475982808118771221">ഒരു പിശക് സംഭവിച്ചു</translation>
+<translation id="2501920221385095727">സ്‌റ്റിക്കി കീകൾ</translation>
 <translation id="2509468283778169019">CAPS LOCK ഓൺ ആണ്</translation>
 <translation id="2532589005999780174">ഉയർന്ന ദൃശ്യതീവ്രത മോഡ്</translation>
 <translation id="2700058918926273959"><ph name="SESSION_TIME_REMAINING" />-നുള്ളിൽ സെഷൻ അവസാനിക്കുന്നു. നിങ്ങൾ സൈൻ ഔട്ടാകും.</translation>
@@ -152,6 +153,7 @@
 <translation id="5571066253365925590">Bluetooth പ്രാപ്‌തമാക്കി</translation>
 <translation id="5597451508971090205"><ph name="SHORT_WEEKDAY" />, <ph name="DATE" /></translation>
 <translation id="5648021990716966815">Mic jack</translation>
+<translation id="5744083938413354016">ടാപ്പുചെയ്‌ത് വലിച്ചിടൽ</translation>
 <translation id="5777841717266010279">സ്‌ക്രീൻ പങ്കിടൽ നിർത്തണോ?</translation>
 <translation id="57838592816432529">മ്യൂട്ടുചെയ്യുക</translation>
 <translation id="5895138241574237353">പുനരാരംഭിക്കുക</translation>
@@ -204,7 +206,6 @@
 <translation id="7052914147756339792">വാൾപേപ്പർ സജ്ജമാക്കുക...</translation>
 <translation id="7066646422045619941">നിങ്ങളുടെ അഡ്‌മിനിസ്‌ട്രേറ്റർ ഈ നെറ്റ്‌വർക്ക് പ്രവർത്തനരഹിതമാക്കി.</translation>
 <translation id="7067196344162293536">സ്വയമേവ തിരിക്കുക</translation>
-<translation id="7097613348211027502">ChromeVox (സ്‌പോക്കൺ ഫീഡ്‌ബാക്ക്) പ്രവർത്തനക്ഷമമാണ്. പ്രവർത്തനരഹിതമാക്കാൻ Ctrl+Alt+Z അമർത്തുക.</translation>
 <translation id="7098389117866926363">USB-C ഉപകരണം (പുറകിൽ ഇടതുവശത്തെ പോർട്ട്)</translation>
 <translation id="7129360219436193655">ലേസർ പോയിന്റർ മോഡ്</translation>
 <translation id="714034171374937760">Chromebase</translation>
diff --git a/ash/strings/ash_strings_mr.xtb b/ash/strings/ash_strings_mr.xtb
index 77a8180..eaf41ee 100644
--- a/ash/strings/ash_strings_mr.xtb
+++ b/ash/strings/ash_strings_mr.xtb
@@ -53,6 +53,7 @@
 <translation id="2391579633712104609">180°</translation>
 <translation id="2429753432712299108">"<ph name="DEVICE_NAME" />" Bluetooth डिव्हाइस जोडण्यासाठी परवानगी घेऊ इच्छिते. स्वीकार करण्यापूर्वी, कृपया त्या डिव्हाइसवर ही पासकी दर्शविली असल्याची पुष्टी करा: <ph name="PASSKEY" /></translation>
 <translation id="2475982808118771221">एक त्रुटी आली आहे</translation>
+<translation id="2501920221385095727">स्टिकी की</translation>
 <translation id="2509468283778169019">CAPS LOCK सुरु आहे</translation>
 <translation id="2532589005999780174">उच्च तीव्रता मोड</translation>
 <translation id="2700058918926273959"><ph name="SESSION_TIME_REMAINING" /> मध्ये सत्र समाप्त होते. आपल्याला साइन आउट केले जाईल.</translation>
@@ -152,6 +153,7 @@
 <translation id="5571066253365925590">Bluetooth सक्षम</translation>
 <translation id="5597451508971090205"><ph name="SHORT_WEEKDAY" />, <ph name="DATE" /></translation>
 <translation id="5648021990716966815">माइक जॅक</translation>
+<translation id="5744083938413354016">टॅप ड्रॅगिंग</translation>
 <translation id="5777841717266010279">स्क्रीन सामायिकरण थांबवायचे?</translation>
 <translation id="57838592816432529">निःशब्द करा</translation>
 <translation id="5895138241574237353">रीस्टार्ट करा</translation>
@@ -204,7 +206,6 @@
 <translation id="7052914147756339792">वॉलपेपर सेट करा...</translation>
 <translation id="7066646422045619941">हे नेटवर्क आपल्या प्रशासकाने अक्षम केले आहे.</translation>
 <translation id="7067196344162293536">स्वयं फिरवा</translation>
-<translation id="7097613348211027502">ChromeVox (बोललेला अभिप्राय) सक्षम केलेला आहे. अक्षम करण्यासाठी Ctrl+Alt+Z दाबा.</translation>
 <translation id="7098389117866926363">USB-C डिव्‍हाइस (मागील बाजूचे डावे पोर्ट)</translation>
 <translation id="7129360219436193655">लेजर पॉईंटर मोड</translation>
 <translation id="714034171374937760">Chromebase</translation>
diff --git a/ash/strings/ash_strings_ms.xtb b/ash/strings/ash_strings_ms.xtb
index 7978d14..0be528ff 100644
--- a/ash/strings/ash_strings_ms.xtb
+++ b/ash/strings/ash_strings_ms.xtb
@@ -205,8 +205,6 @@
 <translation id="7052914147756339792">Tetapkan kertas dinding...</translation>
 <translation id="7066646422045619941">Rangkaian ini dilumpuhkan oleh pentadbir anda.</translation>
 <translation id="7067196344162293536">Auto putar</translation>
-<translation id="7097613348211027502">ChromeVox (maklum balas pertuturan) didayakan.
-Tekan Ctrl+Alt+Z untuk melumpuhkan.</translation>
 <translation id="7098389117866926363">Peranti USB-C (port kiri di belakang)</translation>
 <translation id="7129360219436193655">Mod penunjuk laser</translation>
 <translation id="714034171374937760">Chromebase</translation>
diff --git a/ash/strings/ash_strings_nl.xtb b/ash/strings/ash_strings_nl.xtb
index 1a03f5c..0b482db 100644
--- a/ash/strings/ash_strings_nl.xtb
+++ b/ash/strings/ash_strings_nl.xtb
@@ -206,8 +206,6 @@
 <translation id="7052914147756339792">Achtergrond instellen...</translation>
 <translation id="7066646422045619941">Dit netwerk is uitgeschakeld door je beheerder.</translation>
 <translation id="7067196344162293536">Automatisch draaien</translation>
-<translation id="7097613348211027502">ChromeVox (gesproken feedback) is ingeschakeld.
-Druk op Ctrl+Alt+Z om uit te schakelen.</translation>
 <translation id="7098389117866926363">USB-C-apparaat (poort links aan de achterkant)</translation>
 <translation id="7129360219436193655">Laserpenmodus</translation>
 <translation id="714034171374937760">Chromebase</translation>
diff --git a/ash/strings/ash_strings_no.xtb b/ash/strings/ash_strings_no.xtb
index 938865c..95bd075 100644
--- a/ash/strings/ash_strings_no.xtb
+++ b/ash/strings/ash_strings_no.xtb
@@ -206,7 +206,6 @@
 <translation id="7052914147756339792">Angi bakgrunn</translation>
 <translation id="7066646422045619941">Administratoren din har slått av dette nettverket.</translation>
 <translation id="7067196344162293536">Automatisk retning</translation>
-<translation id="7097613348211027502">ChromeVox (muntlig tilbakemelding) er aktivert. Trykk på Ctrl+Alt+Z for å deaktivere.</translation>
 <translation id="7098389117866926363">USB-C-enhet (venstre port på baksiden)</translation>
 <translation id="7129360219436193655">Laserpekermodus</translation>
 <translation id="714034171374937760">Chromebase</translation>
diff --git a/ash/strings/ash_strings_pl.xtb b/ash/strings/ash_strings_pl.xtb
index 8897e2bf4..5d4f333 100644
--- a/ash/strings/ash_strings_pl.xtb
+++ b/ash/strings/ash_strings_pl.xtb
@@ -206,8 +206,6 @@
 <translation id="7052914147756339792">Ustaw tapetę...</translation>
 <translation id="7066646422045619941">Ta sieć została wyłączona przez administratora.</translation>
 <translation id="7067196344162293536">Obracanie automatyczne</translation>
-<translation id="7097613348211027502">ChromeVox (potwierdzenia głosowe) jest włączony.
-Aby wyłączyć, naciśnij Ctrl+Alt+Z.</translation>
 <translation id="7098389117866926363">Urządzenie USB-C (lewy port z tyłu)</translation>
 <translation id="7129360219436193655">Tryb wskaźnika laserowego</translation>
 <translation id="714034171374937760">Chromebase</translation>
diff --git a/ash/strings/ash_strings_pt-BR.xtb b/ash/strings/ash_strings_pt-BR.xtb
index b073851..616cd9d 100644
--- a/ash/strings/ash_strings_pt-BR.xtb
+++ b/ash/strings/ash_strings_pt-BR.xtb
@@ -205,9 +205,6 @@
 <translation id="7052914147756339792">Definir plano de fundo...</translation>
 <translation id="7066646422045619941">Esta rede foi desativada pelo seu administrador.</translation>
 <translation id="7067196344162293536">Rotação automática</translation>
-<translation id="7097613348211027502">O ChromeVox (feedback falado) está ativado.
-
-Pressione Ctrl+Alt+Z para desativar.</translation>
 <translation id="7098389117866926363">Dispositivo USB-C (porta traseira da esquerda)</translation>
 <translation id="7129360219436193655">Modo de caneta laser</translation>
 <translation id="714034171374937760">Chromebase</translation>
diff --git a/ash/strings/ash_strings_pt-PT.xtb b/ash/strings/ash_strings_pt-PT.xtb
index 7131079..fd269d5 100644
--- a/ash/strings/ash_strings_pt-PT.xtb
+++ b/ash/strings/ash_strings_pt-PT.xtb
@@ -206,8 +206,6 @@
 <translation id="7052914147756339792">Definir imagem de fundo...</translation>
 <translation id="7066646422045619941">Esta rede foi desativada pelo administrador.</translation>
 <translation id="7067196344162293536">Rotação automática</translation>
-<translation id="7097613348211027502">O ChromeVox (respostas faladas) está ativado.
-Prima Ctrl+Alt+Z para desativar.</translation>
 <translation id="7098389117866926363">Dispositivo USB-C (porta traseira esquerda)</translation>
 <translation id="7129360219436193655">Modo de ponteiro de laser</translation>
 <translation id="714034171374937760">Chromebase</translation>
diff --git a/ash/strings/ash_strings_ro.xtb b/ash/strings/ash_strings_ro.xtb
index b8334294..cd61bdb 100644
--- a/ash/strings/ash_strings_ro.xtb
+++ b/ash/strings/ash_strings_ro.xtb
@@ -206,8 +206,6 @@
 <translation id="7052914147756339792">Setați o imagine de fundal...</translation>
 <translation id="7066646422045619941">Această rețea este dezactivată de administrator.</translation>
 <translation id="7067196344162293536">Rotire automată</translation>
-<translation id="7097613348211027502">ChromeVox (feedbackul rostit) este activat.
-Apăsați pe Ctrl+Alt+Z pentru dezactivare.</translation>
 <translation id="7098389117866926363">Dispozitiv USB-C (portul din stânga în spate)</translation>
 <translation id="7129360219436193655">Modul cursor laser</translation>
 <translation id="714034171374937760">Chromebase</translation>
diff --git a/ash/strings/ash_strings_ru.xtb b/ash/strings/ash_strings_ru.xtb
index 16becc04..22e1368 100644
--- a/ash/strings/ash_strings_ru.xtb
+++ b/ash/strings/ash_strings_ru.xtb
@@ -206,7 +206,6 @@
 <translation id="7052914147756339792">Выбрать обои</translation>
 <translation id="7066646422045619941">Эта сеть отключена администратором.</translation>
 <translation id="7067196344162293536">Автоповорот</translation>
-<translation id="7097613348211027502">Голосовое сопровождение ChromeVox включено. Чтобы отключить его, нажмите CTRL+ALT+Z.</translation>
 <translation id="7098389117866926363">Устройство USB-C (порт слева на задней панели)</translation>
 <translation id="7129360219436193655">Режим лазерной указки</translation>
 <translation id="714034171374937760">Chromebase</translation>
diff --git a/ash/strings/ash_strings_sk.xtb b/ash/strings/ash_strings_sk.xtb
index 1bcc88a..bfae852 100644
--- a/ash/strings/ash_strings_sk.xtb
+++ b/ash/strings/ash_strings_sk.xtb
@@ -206,8 +206,6 @@
 <translation id="7052914147756339792">Nastavenie tapety...</translation>
 <translation id="7066646422045619941">Táto sieť je zakázaná správcom.</translation>
 <translation id="7067196344162293536">Automatické otáčanie</translation>
-<translation id="7097613348211027502">Hlasová odozva ChromeVox je aktívna.
-Deaktivujete ju stlačením kombinácie klávesov Ctrl+Alt+Z.</translation>
 <translation id="7098389117866926363">Zariadenie USB-C (ľavý port vzadu)</translation>
 <translation id="7129360219436193655">Režim laserového ukazovateľa</translation>
 <translation id="714034171374937760">Chromebase</translation>
diff --git a/ash/strings/ash_strings_sl.xtb b/ash/strings/ash_strings_sl.xtb
index 9dec2f4e..b2732349 100644
--- a/ash/strings/ash_strings_sl.xtb
+++ b/ash/strings/ash_strings_sl.xtb
@@ -206,8 +206,6 @@
 <translation id="7052914147756339792">Nastavi sliko za ozadje ...</translation>
 <translation id="7066646422045619941">To omrežje je onemogočil skrbnik.</translation>
 <translation id="7067196344162293536">Samodejno sukanje</translation>
-<translation id="7097613348211027502">ChromeVox (izgovorjava povratnih informacij) je omogočen.
-Če ga želite onemogočiti, pritisnite Ctrl + Alt + Z.</translation>
 <translation id="7098389117866926363">Naprava USB-C (vrata levo zadaj)</translation>
 <translation id="7129360219436193655">Način laserskega kazalnika</translation>
 <translation id="714034171374937760">Chromebase</translation>
diff --git a/ash/strings/ash_strings_sr.xtb b/ash/strings/ash_strings_sr.xtb
index ae48535..711f7e4a 100644
--- a/ash/strings/ash_strings_sr.xtb
+++ b/ash/strings/ash_strings_sr.xtb
@@ -206,7 +206,6 @@
 <translation id="7052914147756339792">Подеси позадину...</translation>
 <translation id="7066646422045619941">Ову мрежу је онемогућио администратор.</translation>
 <translation id="7067196344162293536">Аутоматски ротирај</translation>
-<translation id="7097613348211027502">ChromeVox (говорне повратне информације) је омогућен. Притисните Ctrl+Alt+Z да бисте га онемогућили.</translation>
 <translation id="7098389117866926363">Уређај са USB прикључком типа C (леви задњи порт)</translation>
 <translation id="7129360219436193655">Режим ласерског показивача</translation>
 <translation id="714034171374937760">Chromebase</translation>
diff --git a/ash/strings/ash_strings_sv.xtb b/ash/strings/ash_strings_sv.xtb
index 14057d539..c72c635 100644
--- a/ash/strings/ash_strings_sv.xtb
+++ b/ash/strings/ash_strings_sv.xtb
@@ -205,8 +205,6 @@
 <translation id="7052914147756339792">Ange bakgrund ...</translation>
 <translation id="7066646422045619941">Det här nätverket har inaktiverats av administratören.</translation>
 <translation id="7067196344162293536">Rotera automatiskt</translation>
-<translation id="7097613348211027502">ChromeVox (talad feedback) har aktiverats.
-Inaktivera funktionen genom att trycka på Ctrl+Alt+Z.</translation>
 <translation id="7098389117866926363">USB-C-enhet (vänstra porten på baksidan)</translation>
 <translation id="7129360219436193655">Laserpekarläge</translation>
 <translation id="714034171374937760">Chromebase</translation>
diff --git a/ash/strings/ash_strings_sw.xtb b/ash/strings/ash_strings_sw.xtb
index 450fd1d..95d180f 100644
--- a/ash/strings/ash_strings_sw.xtb
+++ b/ash/strings/ash_strings_sw.xtb
@@ -206,7 +206,6 @@
 <translation id="7052914147756339792">Weka Mandhari...</translation>
 <translation id="7066646422045619941">Mtandao huu umezimwa na msimamizi wako.</translation>
 <translation id="7067196344162293536">Zungusha kiotomatiki</translation>
-<translation id="7097613348211027502">ChromeVox (maoni yaliyotamkwa) yamewashwa. Bonyeza Ctrl+Alt+Z ili uzime.</translation>
 <translation id="7098389117866926363">Kifaa cha USB-C (mlango wa kushoto nyuma)</translation>
 <translation id="7129360219436193655">Hali ya kiashiria leza</translation>
 <translation id="714034171374937760">Chromebase</translation>
diff --git a/ash/strings/ash_strings_ta.xtb b/ash/strings/ash_strings_ta.xtb
index 449118c..4c14a46 100644
--- a/ash/strings/ash_strings_ta.xtb
+++ b/ash/strings/ash_strings_ta.xtb
@@ -206,8 +206,6 @@
 <translation id="7052914147756339792">வால்பேப்பரை அமை...</translation>
 <translation id="7066646422045619941">இந்த நெட்வொர்க் உங்கள் நிர்வாகியால் முடக்கப்பட்டுள்ளது.</translation>
 <translation id="7067196344162293536">தானியங்கு சுழற்றல்</translation>
-<translation id="7097613348211027502">ChromeVox (பேச்சுவடிவ கருத்து) இயக்கப்பட்டது.
-முடக்குவதற்கு, Ctrl+Alt+Z ஐ அழுத்தவும்.</translation>
 <translation id="7098389117866926363">USB-C சாதனம் (பின்பக்கம் உள்ள இடது போர்ட்)</translation>
 <translation id="7129360219436193655">லேசர் பாயின்டர் பயன்முறை</translation>
 <translation id="714034171374937760">Chromebase</translation>
diff --git a/ash/strings/ash_strings_te.xtb b/ash/strings/ash_strings_te.xtb
index 3129dfb..fb7e1edd 100644
--- a/ash/strings/ash_strings_te.xtb
+++ b/ash/strings/ash_strings_te.xtb
@@ -53,6 +53,7 @@
 <translation id="2391579633712104609">180°</translation>
 <translation id="2429753432712299108">బ్లూటూత్ పరికరం "<ph name="DEVICE_NAME" />" జత కావడానికి అనుమతి కోరుతోంది. ఆమోదించడానికి ముందు, దయచేసి ఆ పరికరంలో ఈ పాస్‌కీ చూపబడుతోందని నిర్ధారించుకోండి: <ph name="PASSKEY" /></translation>
 <translation id="2475982808118771221">ఒక లోపం సంభవించింది</translation>
+<translation id="2501920221385095727">స్టిక్కీ కీలు</translation>
 <translation id="2509468283778169019">CAPS LOCK ఆన్‌లో ఉంది</translation>
 <translation id="2532589005999780174">అధిక కాంట్రాస్ట్ మోడ్</translation>
 <translation id="2700058918926273959">సెషన్ <ph name="SESSION_TIME_REMAINING" />లో ముగుస్తుంది. మీరు సైన్ అవుట్ చేయబడతారు.</translation>
@@ -152,6 +153,7 @@
 <translation id="5571066253365925590">Bluetooth ప్రారంభించబడింది</translation>
 <translation id="5597451508971090205"><ph name="SHORT_WEEKDAY" />, <ph name="DATE" /></translation>
 <translation id="5648021990716966815">మైక్ జాక్</translation>
+<translation id="5744083938413354016">నొక్కి లాగండి</translation>
 <translation id="5777841717266010279">స్క్రీన్ భాగస్వామ్యాన్ని ఆపివేయాలా?</translation>
 <translation id="57838592816432529">మ్యూట్ చేయి</translation>
 <translation id="5895138241574237353">మళ్ళీ ప్రారంభించు</translation>
@@ -204,8 +206,6 @@
 <translation id="7052914147756339792">వాల్‌పేపర్‌ను సెట్ చేయి...</translation>
 <translation id="7066646422045619941">ఈ నెట్‌వర్క్‌ను మీ నిర్వాహకులు నిలిపివేసారు.</translation>
 <translation id="7067196344162293536">స్వయంచాలకంగా తిప్పు</translation>
-<translation id="7097613348211027502">ChromeVox (చదవబడే అభిప్రాయం) ప్రారంభించబడింది.
-నిలిపివేయడానికి Ctrl+Alt+Z నొక్కండి.</translation>
 <translation id="7098389117866926363">USB-C పరికరం (వెనుక భాగంలో ఎడమ పోర్ట్)</translation>
 <translation id="7129360219436193655">లేజర్ పాయింటర్ మోడ్</translation>
 <translation id="714034171374937760">Chromebase</translation>
diff --git a/ash/strings/ash_strings_th.xtb b/ash/strings/ash_strings_th.xtb
index f94e8cc..5e0187e 100644
--- a/ash/strings/ash_strings_th.xtb
+++ b/ash/strings/ash_strings_th.xtb
@@ -64,7 +64,7 @@
 <translation id="2819276065543622893">คุณจะออกจากระบบในตอนนี้</translation>
 <translation id="2825619548187458965">ชั้นวาง</translation>
 <translation id="2844169650293029770">อุปกรณ์ USB-C (พอร์ตด้านหน้าซ้าย)</translation>
-<translation id="2857608528410806398">เนื้อหาการแจ้งเตือนด้วยคุณลักษณะ QU อยู่ที่นี่ เนื้อหาการแจ้งเตือนด้วยคุณลักษณะ QU อยู่ที่นี่ เนื้อหาการแจ้งเตือนด้วยคุณลักษณะ QU อยู่ที่นี่ เนื้อหาการแจ้งเตือนด้วยคุณลักษณะ QU อยู่ที่นี่ เนื้อหาการแจ้งเตือนด้วยคุณลักษณะ QU อยู่ที่นี่</translation>
+<translation id="2857608528410806398">เนื้อหาการแจ้งเตือนด้วยฟีเจอร์ QU อยู่ที่นี่ เนื้อหาการแจ้งเตือนด้วยฟีเจอร์ QU อยู่ที่นี่ เนื้อหาการแจ้งเตือนด้วยฟีเจอร์ QU อยู่ที่นี่ เนื้อหาการแจ้งเตือนด้วยฟีเจอร์ QU อยู่ที่นี่ เนื้อหาการแจ้งเตือนด้วยฟีเจอร์ QU อยู่ที่นี่</translation>
 <translation id="2865888419503095837">ข้อมูลเครือข่าย</translation>
 <translation id="2872961005593481000">ปิด</translation>
 <translation id="2942516765047364088">ตำแหน่งของชั้นวาง</translation>
@@ -206,8 +206,6 @@
 <translation id="7052914147756339792">ตั้งค่าวอลเปเปอร์...</translation>
 <translation id="7066646422045619941">ผู้ดูแลระบบปิดใช้เครือข่ายนี้</translation>
 <translation id="7067196344162293536">หมุนอัตโนมัติ</translation>
-<translation id="7097613348211027502">เปิดใช้ ChromeVox (การตอบสนองด้วยเสียง) อยู่
-กด Ctrl+Alt+Z เพื่อปิด</translation>
 <translation id="7098389117866926363">อุปกรณ์ USB-C (พอร์ตด้านหลังซ้าย)</translation>
 <translation id="7129360219436193655">โหมดตัวชี้เลเซอร์</translation>
 <translation id="714034171374937760">Chromebase</translation>
@@ -236,7 +234,7 @@
 <translation id="7982789257301363584">เครือข่าย</translation>
 <translation id="8000066093800657092">ไม่มีเครือข่าย</translation>
 <translation id="8054466585765276473">กำลังคำนวณเวลาใช้งานแบตเตอรี่</translation>
-<translation id="8077816382010018681">ชื่อการแจ้งเตือนด้วยคุณลักษณะ QU อยู่ที่นี่</translation>
+<translation id="8077816382010018681">ชื่อการแจ้งเตือนด้วยฟีเจอร์ QU อยู่ที่นี่</translation>
 <translation id="8098591350844501178">หยุดแคสต์หน้าจอไปยัง <ph name="RECEIVER_NAME" /></translation>
 <translation id="8132793192354020517">เชื่อมต่อกับ <ph name="NAME" /></translation>
 <translation id="813913629614996137">กำลังเริ่มดำเนินการ...</translation>
diff --git a/ash/strings/ash_strings_tr.xtb b/ash/strings/ash_strings_tr.xtb
index 449a76f..2af81fe 100644
--- a/ash/strings/ash_strings_tr.xtb
+++ b/ash/strings/ash_strings_tr.xtb
@@ -207,8 +207,6 @@
 <translation id="7052914147756339792">Duvar kağıdını ayarla...</translation>
 <translation id="7066646422045619941">Bu ağ, yöneticiniz tarafından devre dışı bırakıldı.</translation>
 <translation id="7067196344162293536">Otomatik döndür</translation>
-<translation id="7097613348211027502">ChromeVox (sesli geri bildirim) etkin.
-Devre dışı bırakmak için Ctrl+Alt+Z tuşlarına basın.</translation>
 <translation id="7098389117866926363">USB-C cihaz (arkadaki sol bağlantı noktası)</translation>
 <translation id="7129360219436193655">Lazer işaretçi modu</translation>
 <translation id="714034171374937760">Chromebase</translation>
diff --git a/ash/strings/ash_strings_uk.xtb b/ash/strings/ash_strings_uk.xtb
index 11ffd2f..29362be 100644
--- a/ash/strings/ash_strings_uk.xtb
+++ b/ash/strings/ash_strings_uk.xtb
@@ -206,8 +206,6 @@
 <translation id="7052914147756339792">Установити фоновий малюнок...</translation>
 <translation id="7066646422045619941">Ваш адміністратор вимкнув цю мережу.</translation>
 <translation id="7067196344162293536">Автоматичне обертання</translation>
-<translation id="7097613348211027502">ChromeVox (голосові підказки) увімкнено.
-Натисніть Ctrl+Alt+Z, щоб вимкнути.</translation>
 <translation id="7098389117866926363">Пристрій, під’єднаний до порту USB-C (ліворуч на задній панелі)</translation>
 <translation id="7129360219436193655">Режим лазерного вказівника</translation>
 <translation id="714034171374937760">Chromebase</translation>
diff --git a/ash/strings/ash_strings_vi.xtb b/ash/strings/ash_strings_vi.xtb
index 1d4d652..ea58329 100644
--- a/ash/strings/ash_strings_vi.xtb
+++ b/ash/strings/ash_strings_vi.xtb
@@ -206,8 +206,6 @@
 <translation id="7052914147756339792">Đặt hình nền...</translation>
 <translation id="7066646422045619941">Mạng này bị quản trị viên của bạn tắt.</translation>
 <translation id="7067196344162293536">Tự động xoay</translation>
-<translation id="7097613348211027502">Đã bật ChromeVox (phản hồi bằng giọng nói).
-Nhấn Ctrl+Alt+Z để tắt.</translation>
 <translation id="7098389117866926363">Thiết bị USB-C (cổng bên trái ở phía sau)</translation>
 <translation id="7129360219436193655">Chế độ con trỏ laser</translation>
 <translation id="714034171374937760">Chromebase</translation>
diff --git a/ash/strings/ash_strings_zh-CN.xtb b/ash/strings/ash_strings_zh-CN.xtb
index 9ff5e971..427d902 100644
--- a/ash/strings/ash_strings_zh-CN.xtb
+++ b/ash/strings/ash_strings_zh-CN.xtb
@@ -206,8 +206,6 @@
 <translation id="7052914147756339792">设置壁纸...</translation>
 <translation id="7066646422045619941">您的管理员已禁用此网络。</translation>
 <translation id="7067196344162293536">自动旋转</translation>
-<translation id="7097613348211027502">已启用ChromeVox(语音反馈)。
-如要停用,请按Ctrl+Alt+Z。</translation>
 <translation id="7098389117866926363">USB-C 设备(背面左侧端口)</translation>
 <translation id="7129360219436193655">激光笔模式</translation>
 <translation id="714034171374937760">Chromebase</translation>
diff --git a/ash/strings/ash_strings_zh-TW.xtb b/ash/strings/ash_strings_zh-TW.xtb
index bcdec9dd..aedd778 100644
--- a/ash/strings/ash_strings_zh-TW.xtb
+++ b/ash/strings/ash_strings_zh-TW.xtb
@@ -206,8 +206,6 @@
 <translation id="7052914147756339792">設定桌布...</translation>
 <translation id="7066646422045619941">您的管理員已停用這個網路。</translation>
 <translation id="7067196344162293536">自動旋轉</translation>
-<translation id="7097613348211027502">ChromeVox (互動朗讀) 已啟用。
-可按 Ctrl+Alt+Z 鍵停用。</translation>
 <translation id="7098389117866926363">USB-C 裝置 (背面左側連接埠)</translation>
 <translation id="7129360219436193655">雷射筆模式</translation>
 <translation id="714034171374937760">Chromebase</translation>
diff --git a/ash/system/ime_menu/ime_menu_tray.cc b/ash/system/ime_menu/ime_menu_tray.cc
index d2f07f42..8ce57888 100644
--- a/ash/system/ime_menu/ime_menu_tray.cc
+++ b/ash/system/ime_menu/ime_menu_tray.cc
@@ -6,7 +6,6 @@
 
 #include "ash/accessibility_delegate.h"
 #include "ash/ash_constants.h"
-#include "ash/public/cpp/shell_window_ids.h"
 #include "ash/resources/grit/ash_resources.h"
 #include "ash/root_window_controller.h"
 #include "ash/session/session_controller.h"
@@ -323,13 +322,17 @@
 }
 
 void ImeMenuTray::ShowImeMenuBubbleInternal() {
-  views::TrayBubbleView::InitParams init_params(
-      GetAnchorAlignment(), kTrayMenuMinimumWidth, kTrayMenuMinimumWidth);
+  views::TrayBubbleView::InitParams init_params;
+  init_params.delegate = this;
+  init_params.parent_window = GetBubbleWindowContainer();
+  init_params.anchor_view = GetBubbleAnchor();
+  init_params.anchor_alignment = GetAnchorAlignment();
+  init_params.min_width = kTrayMenuMinimumWidth;
+  init_params.max_width = kTrayMenuMinimumWidth;
   init_params.can_activate = true;
   init_params.close_on_deactivate = true;
 
-  views::TrayBubbleView* bubble_view =
-      views::TrayBubbleView::Create(GetBubbleAnchor(), this, &init_params);
+  views::TrayBubbleView* bubble_view = new views::TrayBubbleView(init_params);
   bubble_view->set_anchor_view_insets(GetBubbleAnchorInsets());
 
   // Add a title item with a separator on the top of the IME menu.
@@ -471,16 +474,6 @@
   return l10n_util::GetStringUTF16(IDS_ASH_IME_MENU_ACCESSIBLE_NAME);
 }
 
-void ImeMenuTray::OnBeforeBubbleWidgetInit(
-    views::Widget* anchor_widget,
-    views::Widget* bubble_widget,
-    views::Widget::InitParams* params) const {
-  // Place the bubble in the same root window as |anchor_widget|.
-  RootWindowController::ForWindow(anchor_widget->GetNativeWindow())
-      ->ConfigureWidgetInitParamsForContainer(
-          bubble_widget, kShellWindowId_SettingBubbleContainer, params);
-}
-
 void ImeMenuTray::HideBubble(const views::TrayBubbleView* bubble_view) {
   HideBubbleWithView(bubble_view);
 }
diff --git a/ash/system/ime_menu/ime_menu_tray.h b/ash/system/ime_menu/ime_menu_tray.h
index 19ab11e..3019158ca 100644
--- a/ash/system/ime_menu/ime_menu_tray.h
+++ b/ash/system/ime_menu/ime_menu_tray.h
@@ -72,10 +72,6 @@
   void OnMouseEnteredView() override;
   void OnMouseExitedView() override;
   base::string16 GetAccessibleNameForBubble() override;
-  void OnBeforeBubbleWidgetInit(
-      views::Widget* anchor_widget,
-      views::Widget* bubble_widget,
-      views::Widget::InitParams* params) const override;
   void HideBubble(const views::TrayBubbleView* bubble_view) override;
 
   // keyboard::KeyboardControllerObserver:
diff --git a/ash/system/palette/palette_tray.cc b/ash/system/palette/palette_tray.cc
index fa1790d..5a6209d8 100644
--- a/ash/system/palette/palette_tray.cc
+++ b/ash/system/palette/palette_tray.cc
@@ -4,7 +4,6 @@
 
 #include "ash/system/palette/palette_tray.h"
 
-#include "ash/public/cpp/shell_window_ids.h"
 #include "ash/resources/grit/ash_resources.h"
 #include "ash/resources/vector_icons/vector_icons.h"
 #include "ash/root_window_controller.h"
@@ -180,20 +179,22 @@
 
   DCHECK(tray_container());
 
-  views::TrayBubbleView::InitParams init_params(GetAnchorAlignment(),
-                                                kPaletteWidth, kPaletteWidth);
+  views::TrayBubbleView::InitParams init_params;
+  init_params.delegate = this;
+  init_params.parent_window = GetBubbleWindowContainer();
+  init_params.anchor_view = GetBubbleAnchor();
+  init_params.anchor_alignment = GetAnchorAlignment();
+  init_params.min_width = kPaletteWidth;
+  init_params.max_width = kPaletteWidth;
   init_params.can_activate = true;
   init_params.close_on_deactivate = true;
 
-  DCHECK(tray_container());
-
   // TODO(tdanderson): Refactor into common row layout code.
   // TODO(tdanderson|jdufault): Add material design ripple effects to the menu
   // rows.
 
   // Create and customize bubble view.
-  views::TrayBubbleView* bubble_view =
-      views::TrayBubbleView::Create(GetBubbleAnchor(), this, &init_params);
+  views::TrayBubbleView* bubble_view = new views::TrayBubbleView(init_params);
   bubble_view->set_anchor_view_insets(GetBubbleAnchorInsets());
   bubble_view->set_margins(
       gfx::Insets(kPalettePaddingOnTop, 0, kPalettePaddingOnBottom, 0));
@@ -303,16 +304,6 @@
   return GetAccessibleNameForTray();
 }
 
-void PaletteTray::OnBeforeBubbleWidgetInit(
-    views::Widget* anchor_widget,
-    views::Widget* bubble_widget,
-    views::Widget::InitParams* params) const {
-  // Place the bubble in the same root window as |anchor_widget|.
-  RootWindowController::ForWindow(anchor_widget->GetNativeWindow())
-      ->ConfigureWidgetInitParamsForContainer(
-          bubble_widget, kShellWindowId_SettingBubbleContainer, params);
-}
-
 void PaletteTray::HideBubble(const views::TrayBubbleView* bubble_view) {
   HideBubbleWithView(bubble_view);
 }
diff --git a/ash/system/palette/palette_tray.h b/ash/system/palette/palette_tray.h
index b700936f..f5aad0c 100644
--- a/ash/system/palette/palette_tray.h
+++ b/ash/system/palette/palette_tray.h
@@ -23,7 +23,6 @@
 
 namespace views {
 class ImageView;
-class Widget;
 }
 
 namespace ash {
@@ -85,10 +84,6 @@
   void OnMouseEnteredView() override;
   void OnMouseExitedView() override;
   base::string16 GetAccessibleNameForBubble() override;
-  void OnBeforeBubbleWidgetInit(
-      views::Widget* anchor_widget,
-      views::Widget* bubble_widget,
-      views::Widget::InitParams* params) const override;
   void HideBubble(const views::TrayBubbleView* bubble_view) override;
 
   // PaletteToolManager::Delegate:
diff --git a/ash/system/tray/system_tray.cc b/ash/system/tray/system_tray.cc
index ff269434..b952d76a 100644
--- a/ash/system/tray/system_tray.cc
+++ b/ash/system/tray/system_tray.cc
@@ -451,8 +451,10 @@
     // (like network) replaces most of the menu.
     full_system_tray_menu_ = items.size() > 1;
 
-    TrayBubbleView::InitParams init_params(
-        GetAnchorAlignment(), kTrayMenuMinimumWidth, kTrayPopupMaxWidth);
+    TrayBubbleView::InitParams init_params;
+    init_params.anchor_alignment = GetAnchorAlignment();
+    init_params.min_width = kTrayMenuMinimumWidth;
+    init_params.max_width = kTrayPopupMaxWidth;
     // TODO(oshima): Change TrayBubbleView itself.
     init_params.can_activate = false;
     // The bubble is not initially activatable, but will become activatable if
@@ -581,16 +583,6 @@
   return GetAccessibleNameForTray();
 }
 
-void SystemTray::OnBeforeBubbleWidgetInit(
-    views::Widget* anchor_widget,
-    views::Widget* bubble_widget,
-    views::Widget::InitParams* params) const {
-  // Place the bubble in the same root window as |anchor_widget|.
-  RootWindowController::ForWindow(anchor_widget->GetNativeWindow())
-      ->ConfigureWidgetInitParamsForContainer(
-          bubble_widget, kShellWindowId_SettingBubbleContainer, params);
-}
-
 void SystemTray::HideBubble(const TrayBubbleView* bubble_view) {
   HideBubbleWithView(bubble_view);
 }
diff --git a/ash/system/tray/system_tray.h b/ash/system/tray/system_tray.h
index 411f40d..ebc7afc7 100644
--- a/ash/system/tray/system_tray.h
+++ b/ash/system/tray/system_tray.h
@@ -133,10 +133,6 @@
   void OnMouseEnteredView() override;
   void OnMouseExitedView() override;
   base::string16 GetAccessibleNameForBubble() override;
-  void OnBeforeBubbleWidgetInit(
-      views::Widget* anchor_widget,
-      views::Widget* bubble_widget,
-      views::Widget::InitParams* params) const override;
   void HideBubble(const views::TrayBubbleView* bubble_view) override;
 
   ScreenTrayItem* GetScreenShareItem() { return screen_share_tray_item_; }
diff --git a/ash/system/tray/system_tray_bubble.cc b/ash/system/tray/system_tray_bubble.cc
index d712b25..e740202 100644
--- a/ash/system/tray/system_tray_bubble.cc
+++ b/ash/system/tray/system_tray_bubble.cc
@@ -196,7 +196,11 @@
     init_params->max_height = GetDetailedBubbleMaxHeight();
   }
 
-  bubble_view_ = TrayBubbleView::Create(anchor, tray_, init_params);
+  init_params->delegate = tray_;
+  // Place the bubble on same display as this system tray.
+  init_params->parent_window = tray_->GetBubbleWindowContainer();
+  init_params->anchor_view = anchor;
+  bubble_view_ = new TrayBubbleView(*init_params);
   UpdateBottomPadding();
   bubble_view_->set_adjust_if_offscreen(false);
   CreateItemViews(login_status);
diff --git a/ash/system/tray/tray_background_view.cc b/ash/system/tray/tray_background_view.cc
index 4a20f8ee..c16c335 100644
--- a/ash/system/tray/tray_background_view.cc
+++ b/ash/system/tray/tray_background_view.cc
@@ -7,6 +7,7 @@
 #include <algorithm>
 
 #include "ash/ash_constants.h"
+#include "ash/public/cpp/shell_window_ids.h"
 #include "ash/shelf/shelf.h"
 #include "ash/shelf/shelf_constants.h"
 #include "ash/shell.h"
@@ -353,6 +354,12 @@
   }
 }
 
+aura::Window* TrayBackgroundView::GetBubbleWindowContainer() const {
+  return Shell::GetContainer(
+      tray_container()->GetWidget()->GetNativeWindow()->GetRootWindow(),
+      kShellWindowId_SettingBubbleContainer);
+}
+
 std::unique_ptr<views::InkDropMask> TrayBackgroundView::CreateInkDropMask()
     const {
   return base::MakeUnique<views::RoundRectInkDropMask>(
diff --git a/ash/system/tray/tray_background_view.h b/ash/system/tray/tray_background_view.h
index 08ace17f..8a3b1f3 100644
--- a/ash/system/tray/tray_background_view.h
+++ b/ash/system/tray/tray_background_view.h
@@ -99,6 +99,9 @@
   // tray_container().
   gfx::Insets GetBubbleAnchorInsets() const;
 
+  // Returns the container window for the bubble (on the proper display).
+  aura::Window* GetBubbleWindowContainer() const;
+
  protected:
   // ActionableView:
   std::unique_ptr<views::InkDropMask> CreateInkDropMask() const override;
diff --git a/ash/system/web_notification/ash_popup_alignment_delegate_unittest.cc b/ash/system/web_notification/ash_popup_alignment_delegate_unittest.cc
index 3e8af6f..a0ffec2 100644
--- a/ash/system/web_notification/ash_popup_alignment_delegate_unittest.cc
+++ b/ash/system/web_notification/ash_popup_alignment_delegate_unittest.cc
@@ -211,8 +211,7 @@
 
   display::Display second_display = GetSecondaryDisplay();
   Shelf* second_shelf =
-      Shell::GetRootWindowControllerWithDisplayId(second_display.id())
-          ->GetShelf();
+      Shell::GetRootWindowControllerWithDisplayId(second_display.id())->shelf();
   AshPopupAlignmentDelegate for_2nd_display(second_shelf);
   UpdateWorkArea(&for_2nd_display, second_display);
   // Make sure that the toast position on the secondary display is
diff --git a/ash/system/web_notification/web_notification_tray.cc b/ash/system/web_notification/web_notification_tray.cc
index d2af3fb..a0d0251f2 100644
--- a/ash/system/web_notification/web_notification_tray.cc
+++ b/ash/system/web_notification/web_notification_tray.cc
@@ -4,7 +4,6 @@
 
 #include "ash/system/web_notification/web_notification_tray.h"
 
-#include "ash/public/cpp/shell_window_ids.h"
 #include "ash/resources/vector_icons/vector_icons.h"
 #include "ash/root_window_controller.h"
 #include "ash/session/session_controller.h"
@@ -84,12 +83,20 @@
                                TrayBackgroundView* anchor_tray,
                                message_center::MessageBubbleBase* bubble) {
     bubble_.reset(bubble);
-    views::TrayBubbleView::AnchorAlignment anchor_alignment =
-        tray->GetAnchorAlignment();
-    views::TrayBubbleView::InitParams init_params =
-        bubble->GetInitParams(anchor_alignment);
-    views::TrayBubbleView* bubble_view = views::TrayBubbleView::Create(
-        anchor_tray->GetBubbleAnchor(), tray, &init_params);
+    views::TrayBubbleView::InitParams init_params;
+    init_params.delegate = tray;
+    init_params.parent_window = anchor_tray->GetBubbleWindowContainer();
+    init_params.anchor_view = anchor_tray->GetBubbleAnchor();
+    init_params.anchor_alignment = tray->GetAnchorAlignment();
+    const int width = message_center::kNotificationWidth +
+                      message_center::kMarginBetweenItems * 2;
+    init_params.min_width = width;
+    init_params.max_width = width;
+    init_params.max_height = bubble->max_height();
+    init_params.can_activate = true;
+    init_params.bg_color = message_center::kBackgroundDarkColor;
+
+    views::TrayBubbleView* bubble_view = new views::TrayBubbleView(init_params);
     bubble_view->set_anchor_view_insets(anchor_tray->GetBubbleAnchorInsets());
     bubble_wrapper_.reset(new TrayBubbleWrapper(tray, bubble_view));
     bubble->InitializeContents(bubble_view);
@@ -453,16 +460,6 @@
   return GetAccessibleNameForTray();
 }
 
-void WebNotificationTray::OnBeforeBubbleWidgetInit(
-    views::Widget* anchor_widget,
-    views::Widget* bubble_widget,
-    views::Widget::InitParams* params) const {
-  // Place the bubble in the same root window as |anchor_widget|.
-  RootWindowController::ForWindow(anchor_widget->GetNativeWindow())
-      ->ConfigureWidgetInitParamsForContainer(
-          bubble_widget, kShellWindowId_SettingBubbleContainer, params);
-}
-
 void WebNotificationTray::HideBubble(const views::TrayBubbleView* bubble_view) {
   HideBubbleWithView(bubble_view);
 }
diff --git a/ash/system/web_notification/web_notification_tray.h b/ash/system/web_notification/web_notification_tray.h
index 54a90785..0ea81be7 100644
--- a/ash/system/web_notification/web_notification_tray.h
+++ b/ash/system/web_notification/web_notification_tray.h
@@ -92,10 +92,6 @@
   void OnMouseEnteredView() override;
   void OnMouseExitedView() override;
   base::string16 GetAccessibleNameForBubble() override;
-  void OnBeforeBubbleWidgetInit(
-      views::Widget* anchor_widget,
-      views::Widget* bubble_widget,
-      views::Widget::InitParams* params) const override;
   void HideBubble(const views::TrayBubbleView* bubble_view) override;
 
   // Overridden from MessageCenterTrayDelegate.
diff --git a/ash/test/ash_test_base.cc b/ash/test/ash_test_base.cc
index c52a8b9..d179027 100644
--- a/ash/test/ash_test_base.cc
+++ b/ash/test/ash_test_base.cc
@@ -212,7 +212,7 @@
 
 // static
 Shelf* AshTestBase::GetPrimaryShelf() {
-  return Shell::GetPrimaryRootWindowController()->GetShelf();
+  return Shell::GetPrimaryRootWindowController()->shelf();
 }
 
 // static
diff --git a/ash/test/ash_test_suite.cc b/ash/test/ash_test_suite.cc
index dc8dba8..a14aed95 100644
--- a/ash/test/ash_test_suite.cc
+++ b/ash/test/ash_test_suite.cc
@@ -61,13 +61,16 @@
   }
 
   const bool is_mus = base::CommandLine::ForCurrentProcess()->HasSwitch("mus");
-  ash::test::AshTestHelper::config_ = is_mus ? Config::MUS : Config::CLASSIC;
+  const bool is_mash =
+      base::CommandLine::ForCurrentProcess()->HasSwitch("mash");
+  ash::test::AshTestHelper::config_ =
+      is_mus ? Config::MUS : is_mash ? Config::MASH : Config::CLASSIC;
 
   base::DiscardableMemoryAllocator::SetInstance(&discardable_memory_allocator_);
-  env_ = aura::Env::CreateInstance(is_mus ? aura::Env::Mode::MUS
-                                          : aura::Env::Mode::LOCAL);
+  env_ = aura::Env::CreateInstance(is_mus || is_mash ? aura::Env::Mode::MUS
+                                                     : aura::Env::Mode::LOCAL);
 
-  if (is_mus) {
+  if (is_mus || is_mash) {
     context_factory_ = base::MakeUnique<ui::FakeContextFactory>();
     env_->set_context_factory(context_factory_.get());
     env_->set_context_factory_private(nullptr);
diff --git a/ash/test/test_shell_delegate.cc b/ash/test/test_shell_delegate.cc
index 329897d4..235267c5 100644
--- a/ash/test/test_shell_delegate.cc
+++ b/ash/test/test_shell_delegate.cc
@@ -40,7 +40,7 @@
 
   // ShellObserver:
   void OnShelfCreatedForRootWindow(aura::Window* root_window) override {
-    Shelf* shelf = RootWindowController::ForWindow(root_window)->GetShelf();
+    Shelf* shelf = RootWindowController::ForWindow(root_window)->shelf();
     // Do not override the custom initialization performed by some unit tests.
     if (shelf->alignment() == SHELF_ALIGNMENT_BOTTOM_LOCKED &&
         shelf->auto_hide_behavior() == SHELF_AUTO_HIDE_ALWAYS_HIDDEN) {
diff --git a/base/allocator/partition_allocator/partition_alloc.cc b/base/allocator/partition_allocator/partition_alloc.cc
index b13f36b..1aa321f 100644
--- a/base/allocator/partition_allocator/partition_alloc.cc
+++ b/base/allocator/partition_allocator/partition_alloc.cc
@@ -950,7 +950,7 @@
   }
 }
 
-bool partitionReallocDirectMappedInPlace(PartitionRootGeneric* root,
+bool PartitionReallocDirectMappedInPlace(PartitionRootGeneric* root,
                                          PartitionPage* page,
                                          size_t raw_size) {
   DCHECK(PartitionBucketIsDirectMapped(page->bucket));
@@ -1028,16 +1028,16 @@
   if (new_size > kGenericMaxDirectMapped)
     PartitionExcessiveAllocationSize();
 
-  DCHECK(PartitionPointerIsValid(PartitionCookieFreePointerAdjust(ptr)));
-
   PartitionPage* page =
       PartitionPointerToPage(PartitionCookieFreePointerAdjust(ptr));
+  // TODO(palmer): See if we can afford to make this a CHECK.
+  DCHECK(PartitionPagePointerIsValid(page));
 
   if (UNLIKELY(PartitionBucketIsDirectMapped(page->bucket))) {
     // We may be able to perform the realloc in place by changing the
     // accessibility of memory pages and, if reducing the size, decommitting
     // them.
-    if (partitionReallocDirectMappedInPlace(root, page, new_size)) {
+    if (PartitionReallocDirectMappedInPlace(root, page, new_size)) {
       PartitionAllocHooks::ReallocHookIfEnabled(ptr, ptr, new_size, type_name);
       return ptr;
     }
diff --git a/base/allocator/partition_allocator/partition_alloc.h b/base/allocator/partition_allocator/partition_alloc.h
index f9c1df6..686e7a19 100644
--- a/base/allocator/partition_allocator/partition_alloc.h
+++ b/base/allocator/partition_allocator/partition_alloc.h
@@ -646,8 +646,7 @@
   return extent_entry->root;
 }
 
-ALWAYS_INLINE bool PartitionPointerIsValid(void* ptr) {
-  PartitionPage* page = PartitionPointerToPage(ptr);
+ALWAYS_INLINE bool PartitionPagePointerIsValid(PartitionPage* page) {
   PartitionRootBase* root = PartitionPageToRoot(page);
   return root->inverted_self == ~reinterpret_cast<uintptr_t>(root);
 }
@@ -661,8 +660,9 @@
   DCHECK(page->num_allocated_slots >= 0);
   void* ret = page->freelist_head;
   if (LIKELY(ret != 0)) {
-    // If these asserts fire, you probably corrupted memory.
-    DCHECK(PartitionPointerIsValid(ret));
+    // If these DCHECKs fire, you probably corrupted memory.
+    // TODO(palmer): See if we can afford to make this a CHECK.
+    DCHECK(PartitionPagePointerIsValid(page));
     // All large allocations must go through the slow path to correctly
     // update the size metadata.
     DCHECK(PartitionPageGetRawSize(page) == 0);
@@ -672,7 +672,8 @@
     page->num_allocated_slots++;
   } else {
     ret = PartitionAllocSlowPath(root, flags, size, bucket);
-    DCHECK(!ret || PartitionPointerIsValid(ret));
+    // TODO(palmer): See if we can afford to make this a CHECK.
+    DCHECK(!ret || PartitionPagePointerIsValid(PartitionPointerToPage(ret)));
   }
 #if DCHECK_IS_ON()
   if (!ret)
@@ -732,7 +733,9 @@
 #endif
   DCHECK(page->num_allocated_slots);
   PartitionFreelistEntry* freelist_head = page->freelist_head;
-  DCHECK(!freelist_head || PartitionPointerIsValid(freelist_head));
+  // TODO(palmer): See if we can afford to make this a CHECK.
+  DCHECK(!freelist_head ||
+         PartitionPagePointerIsValid(PartitionPointerToPage(freelist_head)));
   CHECK(ptr != freelist_head);  // Catches an immediate double free.
   // Look for double free one level deeper in debug.
   DCHECK(!freelist_head || ptr != PartitionFreelistMask(freelist_head->next));
@@ -753,10 +756,13 @@
 #if defined(MEMORY_TOOL_REPLACES_ALLOCATOR)
   free(ptr);
 #else
+  // TODO(palmer): Check ptr alignment before continuing. Shall we do the check
+  // inside PartitionCookieFreePointerAdjust?
   PartitionAllocHooks::FreeHookIfEnabled(ptr);
   ptr = PartitionCookieFreePointerAdjust(ptr);
-  DCHECK(PartitionPointerIsValid(ptr));
   PartitionPage* page = PartitionPointerToPage(ptr);
+  // TODO(palmer): See if we can afford to make this a CHECK.
+  DCHECK(PartitionPagePointerIsValid(page));
   PartitionFreeWithPage(ptr, page);
 #endif
 }
@@ -818,8 +824,9 @@
 
   PartitionAllocHooks::FreeHookIfEnabled(ptr);
   ptr = PartitionCookieFreePointerAdjust(ptr);
-  DCHECK(PartitionPointerIsValid(ptr));
   PartitionPage* page = PartitionPointerToPage(ptr);
+  // TODO(palmer): See if we can afford to make this a CHECK.
+  DCHECK(PartitionPagePointerIsValid(page));
   {
     subtle::SpinLock::Guard guard(root->lock);
     PartitionFreeWithPage(ptr, page);
@@ -868,8 +875,9 @@
   // cause trouble, and the caller is responsible for that not happening.
   DCHECK(PartitionAllocSupportsGetSize());
   ptr = PartitionCookieFreePointerAdjust(ptr);
-  DCHECK(PartitionPointerIsValid(ptr));
   PartitionPage* page = PartitionPointerToPage(ptr);
+  // TODO(palmer): See if we can afford to make this a CHECK.
+  DCHECK(PartitionPagePointerIsValid(page));
   size_t size = page->bucket->slot_size;
   return PartitionCookieSizeAdjustSubtract(size);
 }
diff --git a/base/message_loop/message_pump_fuchsia.cc b/base/message_loop/message_pump_fuchsia.cc
index 755c220..6f96564d 100644
--- a/base/message_loop/message_pump_fuchsia.cc
+++ b/base/message_loop/message_pump_fuchsia.cc
@@ -21,7 +21,10 @@
   return false;
 }
 
-MessagePumpFuchsia::MessagePumpFuchsia() {}
+MessagePumpFuchsia::MessagePumpFuchsia()
+    : keep_running_(true),
+      event_(WaitableEvent::ResetPolicy::AUTOMATIC,
+             WaitableEvent::InitialState::NOT_SIGNALED) {}
 
 MessagePumpFuchsia::~MessagePumpFuchsia() {}
 
@@ -35,20 +38,59 @@
 }
 
 void MessagePumpFuchsia::Run(Delegate* delegate) {
-  NOTIMPLEMENTED();
+  DCHECK(keep_running_);
+
+  for (;;) {
+    bool did_work = delegate->DoWork();
+    if (!keep_running_)
+      break;
+
+    did_work |= delegate->DoDelayedWork(&delayed_work_time_);
+    if (!keep_running_)
+      break;
+
+    if (did_work)
+      continue;
+
+    did_work = delegate->DoIdleWork();
+    if (!keep_running_)
+      break;
+
+    if (did_work)
+      continue;
+
+    if (delayed_work_time_.is_null()) {
+      event_.Wait();
+    } else {
+      // No need to handle already expired |delayed_work_time_| in any special
+      // way. When |delayed_work_time_| is in the past TimeWaitUntil returns
+      // promptly and |delayed_work_time_| will re-initialized on a next
+      // DoDelayedWork call which has to be called in order to get here again.
+      event_.TimedWaitUntil(delayed_work_time_);
+    }
+
+    // TODO(fuchsia): Handle file descriptor watching here. (maybe?)
+  }
+
+  keep_running_ = true;
 }
 
 void MessagePumpFuchsia::Quit() {
-  NOTIMPLEMENTED();
+  keep_running_ = false;
 }
 
 void MessagePumpFuchsia::ScheduleWork() {
-  NOTIMPLEMENTED();
+  // Since this can be called on any thread, we need to ensure that our Run
+  // loop wakes up.
+  event_.Signal();
 }
 
 void MessagePumpFuchsia::ScheduleDelayedWork(
     const TimeTicks& delayed_work_time) {
-  NOTIMPLEMENTED();
+  // We know that we can't be blocked on Wait right now since this method can
+  // only be called on the same thread as Run, so we only need to update our
+  // record of how long to sleep when we do sleep.
+  delayed_work_time_ = delayed_work_time;
 }
 
 }  // namespace base
diff --git a/base/message_loop/message_pump_fuchsia.h b/base/message_loop/message_pump_fuchsia.h
index c1790751..479c2c3b 100644
--- a/base/message_loop/message_pump_fuchsia.h
+++ b/base/message_loop/message_pump_fuchsia.h
@@ -8,6 +8,7 @@
 #include "base/location.h"
 #include "base/macros.h"
 #include "base/message_loop/message_pump.h"
+#include "base/synchronization/waitable_event.h"
 
 namespace base {
 
@@ -65,6 +66,16 @@
   void ScheduleWork() override;
   void ScheduleDelayedWork(const TimeTicks& delayed_work_time) override;
 
+ private:
+  // This flag is set to false when Run should return.
+  bool keep_running_;
+
+  // Used to sleep until there is more work to do.
+  WaitableEvent event_;
+
+  // The time at which we should call DoDelayedWork.
+  TimeTicks delayed_work_time_;
+
   DISALLOW_COPY_AND_ASSIGN(MessagePumpFuchsia);
 };
 
diff --git a/build/android/pylib/local/device/local_device_gtest_run.py b/build/android/pylib/local/device/local_device_gtest_run.py
index 84a37fc1..e4c6aef 100644
--- a/build/android/pylib/local/device/local_device_gtest_run.py
+++ b/build/android/pylib/local/device/local_device_gtest_run.py
@@ -177,6 +177,10 @@
       except Exception:
         device.ForceStop(self._package)
         raise
+      # TODO(jbudorick): Remove this after resolving crbug.com/726880
+      logging.info(
+          '%s size on device: %s',
+          stdout_file.name, device.StatPath(stdout_file.name).get('st_size', 0))
       return device.ReadFile(stdout_file.name).splitlines()
 
   def PullAppFiles(self, device, files, directory):
diff --git a/build/install-build-deps.sh b/build/install-build-deps.sh
index c965a9b..fcb62a05 100755
--- a/build/install-build-deps.sh
+++ b/build/install-build-deps.sh
@@ -307,7 +307,7 @@
 fi
 
 # 32-bit libraries needed e.g. to compile V8 snapshot for Android or armhf
-lib32_list="linux-libc-dev:i386"
+lib32_list="linux-libc-dev:i386 libpci3:i386"
 
 # arm cross toolchain packages needed to build chrome on armhf
 EM_REPO="deb http://emdebian.org/tools/debian/ jessie main"
diff --git a/cc/ipc/mojo_compositor_frame_sink.mojom b/cc/ipc/mojo_compositor_frame_sink.mojom
index e4c0ae3..cc547e7 100644
--- a/cc/ipc/mojo_compositor_frame_sink.mojom
+++ b/cc/ipc/mojo_compositor_frame_sink.mojom
@@ -38,10 +38,6 @@
   // Notifies the frame sink that a BeginFrame was completed, but that no
   // CompositorFrame was produced as a result of it.
   DidNotProduceFrame(cc.mojom.BeginFrameAck ack);
-
-  // Notify that the surface is no longer in use (and is okay to be evicted) so
-  // that its resources gets returned in time.
-  EvictCurrentSurface();
 };
 
 interface MojoCompositorFrameSinkClient {
diff --git a/cc/paint/paint_op_buffer.h b/cc/paint/paint_op_buffer.h
index bcc0c80..1fbcc6b 100644
--- a/cc/paint/paint_op_buffer.h
+++ b/cc/paint/paint_op_buffer.h
@@ -834,7 +834,6 @@
                   "T is not a PaintOpWithData");
     static_assert(!std::is_convertible<T, PaintOpWithArrayBase>::value,
                   "Type needs to use push_with_array");
-    DCHECK_GE(bytes, 0u);
     T* op = push_internal<T>(bytes, bytes, std::forward<Args>(args)...);
     memcpy(op->GetData(), data, bytes);
 
@@ -859,8 +858,6 @@
                        Args&&... args) {
     static_assert(std::is_convertible<T, PaintOpWithArray<M>>::value,
                   "T is not a PaintOpWithArray");
-    DCHECK_GE(bytes, 0u);
-    DCHECK_GE(count, 0u);
     size_t array_size = sizeof(M) * count;
     size_t total_size = bytes + array_size;
     T* op =
diff --git a/cc/surfaces/surface.cc b/cc/surfaces/surface.cc
index 10f946ff..b214f806 100644
--- a/cc/surfaces/surface.cc
+++ b/cc/surfaces/surface.cc
@@ -68,11 +68,9 @@
   }
 
   if (closed_) {
-    if (compositor_frame_sink_support_) {
-      ReturnedResourceArray resources;
-      TransferableResource::ReturnResources(frame.resource_list, &resources);
-      compositor_frame_sink_support_->ReturnResources(resources);
-    }
+    ReturnedResourceArray resources;
+    TransferableResource::ReturnResources(frame.resource_list, &resources);
+    compositor_frame_sink_support_->ReturnResources(resources);
     callback.Run();
     return true;
   }
@@ -234,21 +232,14 @@
 
 void Surface::UpdateBlockingSurfaces(bool has_previous_pending_frame,
                                      const CompositorFrame& current_frame) {
-  // If there is no SurfaceDependencyTracker installed then the |current_frame|
-  // does not block on anything.
-  if (!surface_manager_->dependency_tracker()) {
-    blocking_surfaces_.clear();
-    return;
-  }
-
   base::flat_set<SurfaceId> new_blocking_surfaces;
 
   for (const SurfaceId& surface_id :
        current_frame.metadata.activation_dependencies) {
-    Surface* surface = surface_manager_->GetSurfaceForId(surface_id);
-    // If a referenced surface does not have a corresponding active frame in the
-    // display compositor, then it blocks this frame.
-    if (!surface || !surface->HasActiveFrame())
+    Surface* dependency = surface_manager_->GetSurfaceForId(surface_id);
+    // If a activation dependency does not have a corresponding active frame in
+    // the display compositor, then it blocks this frame.
+    if (!dependency || !dependency->HasActiveFrame())
       new_blocking_surfaces.insert(surface_id);
   }
 
diff --git a/cc/surfaces/surface_dependency_tracker.cc b/cc/surfaces/surface_dependency_tracker.cc
index 8540aab..7199c90 100644
--- a/cc/surfaces/surface_dependency_tracker.cc
+++ b/cc/surfaces/surface_dependency_tracker.cc
@@ -36,12 +36,12 @@
     return;
   }
 
-  // Referenced surface IDs that aren't currently known to the surface manager
+  // Activation dependencies that aren't currently known to the surface manager
   // or do not have an active CompsotiorFrame block this frame.
   for (const SurfaceId& surface_id :
        pending_frame.metadata.activation_dependencies) {
-    Surface* surface_dependency = surface_manager_->GetSurfaceForId(surface_id);
-    if (!surface_dependency || !surface_dependency->HasActiveFrame())
+    Surface* dependency = surface_manager_->GetSurfaceForId(surface_id);
+    if (!dependency || !dependency->HasActiveFrame())
       blocked_surfaces_from_dependency_[surface_id].insert(
           surface->surface_id());
   }
diff --git a/chrome/BUILD.gn b/chrome/BUILD.gn
index 6279c3d..b26084b3 100644
--- a/chrome/BUILD.gn
+++ b/chrome/BUILD.gn
@@ -746,6 +746,7 @@
     deps = [
       "//build/config:exe_and_shlib_deps",
       "//chrome/common:version_header",
+      "//sandbox/mac:seatbelt",
     ]
 
     ldflags = []
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/locale/DefaultSearchEnginePromoDialog.java b/chrome/android/java/src/org/chromium/chrome/browser/locale/DefaultSearchEnginePromoDialog.java
index f49b82d..34120dc 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/locale/DefaultSearchEnginePromoDialog.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/locale/DefaultSearchEnginePromoDialog.java
@@ -4,12 +4,15 @@
 
 package org.chromium.chrome.browser.locale;
 
+import android.app.Activity;
 import android.content.Context;
 import android.content.DialogInterface;
 import android.os.Bundle;
 import android.support.annotation.Nullable;
 import android.widget.Button;
 
+import org.chromium.base.ActivityState;
+import org.chromium.base.ApplicationStatus;
 import org.chromium.base.Callback;
 import org.chromium.base.VisibleForTesting;
 import org.chromium.base.library_loader.LibraryLoader;
@@ -19,6 +22,7 @@
 import org.chromium.chrome.browser.search_engines.TemplateUrlService;
 import org.chromium.chrome.browser.widget.PromoDialog;
 import org.chromium.chrome.browser.widget.RadioButtonLayout;
+import org.chromium.ui.base.WindowAndroid;
 
 /** A dialog that forces the user to choose a default search engine. */
 public class DefaultSearchEnginePromoDialog extends PromoDialog {
@@ -56,6 +60,13 @@
             @Override
             public void onTemplateUrlServiceLoaded() {
                 instance.unregisterLoadListener(this);
+
+                Activity activity = WindowAndroid.activityFromContext(context);
+                if (ApplicationStatus.getStateForActivity(activity) == ActivityState.DESTROYED) {
+                    if (onDismissed != null) onDismissed.onResult(false);
+                    return;
+                }
+
                 new DefaultSearchEnginePromoDialog(context, dialogType, onDismissed).show();
             }
         });
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_am.xtb b/chrome/android/java/strings/translations/android_chrome_strings_am.xtb
index b64db45..750a9d3 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_am.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_am.xtb
@@ -116,7 +116,6 @@
 <translation id="2139186145475833000">ወደ መነሻ ማያ ገጽ አክል</translation>
 <translation id="2146738493024040262">ቅጽበታዊ መተግበሪያን ክፈት</translation>
 <translation id="2148716181193084225">ዛሬ</translation>
-<translation id="2154710561487035718">URL ቅዳ</translation>
 <translation id="2156074688469523661">ቀሪ ጣቢያዎች (<ph name="NUMBER_OF_SITES" />)</translation>
 <translation id="219985413780390209">እርስዎን እና መሣሪያዎን ከአደገኛ ጣቢያዎች ይጠብቃል</translation>
 <translation id="2206488550163399966"><ph name="APP_NAME" />፣ የድር መተግበሪያ። <ph name="APP_URL" /></translation>
@@ -218,7 +217,6 @@
 <translation id="3387650086002190359">በስርዓተ-ፋይል ስህተቶች ምክንያት <ph name="FILE_NAME" />ን ማውረድ አልተሳካም።</translation>
 <translation id="3398320232533725830">የዕልባቶች አስተዳዳሪን ክፈት</translation>
 <translation id="3414952576877147120">መጠን፦</translation>
-<translation id="3435896845095436175">አንቃ</translation>
 <translation id="3443221991560634068">የአሁኑን ገጽ ዳግም ጫን</translation>
 <translation id="3452612588551937789">የእርስዎን ዕልባቶች፣ የይለፍ ቃላት፣ ታሪክ እና ሌሎች ቅንብሮችን በሁሉም መሣሪያዎችዎ ላይ ለማግኘት በGoogle መለያዎ ይግቡ።</translation>
 <translation id="3487093336331957349">የፍለጋ እና የጣቢያ አስተያየት ጥቆማዎች</translation>
@@ -319,7 +317,6 @@
 <translation id="4522570452068850558">ዝርዝሮች</translation>
 <translation id="4526249700380860531"><ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /> ላይ የተቀመጡ የይለፍ ቃሎችን ይመልከቱ እና ያስተዳድሩ</translation>
 <translation id="4532845899244822526">አቃፊ ይምረጡ</translation>
-<translation id="4535858793016067060">«የተሻሻለ የወደ መነሻ ገጽ አክል» ሙከራውን ለመሞከር በAndroid ቅንብሮች ውስጥ «ያልታወቁ ምንጮች»ን ያብሩት። ሞክረው ሲጨርሱ ይህን ቅንብር ማሰናከልዎን ያረጋግጡ።</translation>
 <translation id="4558311620361989323">የድረ-ገጽ አቋራጮች</translation>
 <translation id="4572422548854449519">ወደ የሚተዳደር መለያ ይግቡ</translation>
 <translation id="4581964774250883625">ወደ ማንነት የማያሳውቅ ሁነታ ሄደዋል።</translation>
@@ -362,7 +359,6 @@
 <translation id="497421865427891073">ወደ ፊት ሂድ</translation>
 <translation id="4988526792673242964">ገፆች</translation>
 <translation id="4996978546172906250">ያጋሩ በ</translation>
-<translation id="5000922062037820727">ታግዷል (የሚመከር)</translation>
 <translation id="5004339818306944878">እስከ 60% ያነሰ ውሂብ ይጠቀሙና ድሩን ያፍጥኑት። Google አገልጋዮች እርስዎ የሚጎበኟቸውን ገጾች ያተባሉ።</translation>
 <translation id="5005498671520578047">የይለፍ ቃል ቅዳ</translation>
 <translation id="5011311129201317034"><ph name="SITE" /> መገናኘት ይፈልጋል</translation>
@@ -403,7 +399,6 @@
 <translation id="5335288049665977812">ጣቢያዎች ጃቫስክሪፕትን እንዲያሄዱ ፍቀድላቸው (የሚመከር)</translation>
 <translation id="5345040418939504969"><ph name="BOOKMARK_TITLE" /> ተሰርዟል</translation>
 <translation id="5345083863238459644">የአካባቢ መዳረሻ እንዲሁም <ph name="BEGIN_LINK" />ለዚህ መሣሪያ ጠፍቷል<ph name="END_LINK" />።</translation>
-<translation id="5349103022427743704">የተሻሻለ ወደ መነሻ ገጽ ሙከራ አክል</translation>
 <translation id="5372829067651257087">ዩአርኤል ተቀድቷል።</translation>
 <translation id="5384883051496921101">ይህ ጣቢያ ማንነት ከማያሳውቅ ሁነታ ውጭ ላለ መተግበሪያ መረጃ ሊያጋራ ነው።</translation>
 <translation id="5400569084694353794">ይህን መተግበሪያ በመጠቀምዎ በChrome <ph name="BEGIN_LINK1" />አገልግሎት ውል<ph name="END_LINK1" /> እና <ph name="BEGIN_LINK2" />የግላዊነት ማስታወቂያ<ph name="END_LINK2" /> ተስማምተዋል።</translation>
@@ -654,7 +649,6 @@
 <translation id="7929962904089429003">ምናሌውን ክፈት</translation>
 <translation id="7942131818088350342"><ph name="PRODUCT_NAME" /> ጊዜው ያለፈበት ነው።</translation>
 <translation id="7947953824732555851">ተቀበል እና ግባ</translation>
-<translation id="7949961459945740081">የቅርብ ጊዜዎቹን ባሕሪዎች ያግኙ</translation>
 <translation id="7963646190083259054">አቅራቢ፦</translation>
 <translation id="7987073022710626672">የChrome አገልግሎት ውል</translation>
 <translation id="7998918019931843664">የተዘጋውን ትር ዳግም ይክፈቱ</translation>
@@ -665,7 +659,6 @@
 <translation id="8015452622527143194">በገጹ ላይ ያለውን ሁሉንም ነገር ወደ ነባሪ መጠን መልስ</translation>
 <translation id="802154636333426148">ማውረድ አልተሳካም</translation>
 <translation id="8026334261755873520">የአሰሳ ውሂብ አጽዳ</translation>
-<translation id="8033827949643255796">ተመርጧል</translation>
 <translation id="8035133914807600019">አዲስ አቃፊ…</translation>
 <translation id="8037750541064988519"><ph name="DAYS" /> ቀኖች ይቀራሉ</translation>
 <translation id="8051695050440594747"><ph name="MEGABYTES" /> ሜባ አለ</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ar.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ar.xtb
index 72d3eb6..f8f484fb7 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ar.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ar.xtb
@@ -116,7 +116,6 @@
 <translation id="2139186145475833000">إضافة إلى الشاشة الرئيسية</translation>
 <translation id="2146738493024040262">فتح تطبيق فوري</translation>
 <translation id="2148716181193084225">اليوم</translation>
-<translation id="2154710561487035718">‏نسخ عنوان URL</translation>
 <translation id="2156074688469523661">المواقع المتبقية (<ph name="NUMBER_OF_SITES" />)</translation>
 <translation id="219985413780390209">حمايتك وحماية جهازك من المواقع الخطرة</translation>
 <translation id="2206488550163399966"><ph name="APP_NAME" />، تطبيق ويب. <ph name="APP_URL" /></translation>
@@ -218,7 +217,6 @@
 <translation id="3387650086002190359">تعذّر تنزيل الملف <ph name="FILE_NAME" /> بسبب أخطاء في نظام الملف.</translation>
 <translation id="3398320232533725830">فتح مدير الإشارات المرجعية</translation>
 <translation id="3414952576877147120">الحجم:</translation>
-<translation id="3435896845095436175">تمكين الإضافات</translation>
 <translation id="3443221991560634068">إعادة تحميل الصفحة الحالية</translation>
 <translation id="3452612588551937789">‏سجّل الدخول إلى حسابك في Google للحصول على الإشارات المرجعية، والسجل، وكلمات المرور، والإعدادات الأخرى على جميع أجهزتك.</translation>
 <translation id="3487093336331957349">اقتراحات البحث والمواقع</translation>
@@ -320,7 +318,6 @@
 <translation id="4522570452068850558">التفاصيل</translation>
 <translation id="4526249700380860531">‏عرض كلمات المرور المحفوظة وإدارتها في <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation>
 <translation id="4532845899244822526">اختيار مجلد</translation>
-<translation id="4535858793016067060">‏يمكنك تشغيل "مصادر غير معروفة" في إعدادات الأمان في Android لتجربة "الإضافة المحسنة إلى الشاشة الرئيسية". وتأكد من تعطيل هذا الإعداد عند الانتهاء من المحاولة.</translation>
 <translation id="4558311620361989323">اختصارات صفحة الويب</translation>
 <translation id="4572422548854449519">تسجيل الدخول إلى الحساب المدار</translation>
 <translation id="4581964774250883625">لقد انتقلت إلى التصفح المتخفي.</translation>
@@ -363,7 +360,6 @@
 <translation id="497421865427891073">انتقال للأمام</translation>
 <translation id="4988526792673242964">صفحات</translation>
 <translation id="4996978546172906250">مشاركة عن طريق</translation>
-<translation id="5000922062037820727">محظور (موصى به)</translation>
 <translation id="5004339818306944878">‏يمكنك خفض استخدام البيانات بنسبة تصل إلى 60%، إلى جانب تسريع الويب. كما ستعمل خوادم Google على تحسين الصفحات التي تزورها.</translation>
 <translation id="5005498671520578047">نسخ كلمة المرور</translation>
 <translation id="5011311129201317034">يريد <ph name="SITE" /> الاتصال</translation>
@@ -404,7 +400,6 @@
 <translation id="5335288049665977812">السماح للمواقع بتشغيل جافا سكريبت (موصى به)</translation>
 <translation id="5345040418939504969">تم حذف <ph name="BOOKMARK_TITLE" /></translation>
 <translation id="5345083863238459644">الوصول إلى الموقع أيضًا <ph name="BEGIN_LINK" />معطل لهذا الجهاز<ph name="END_LINK" />.</translation>
-<translation id="5349103022427743704">التجربة "إضافة محسنة إلى الشاشة الرئيسية"</translation>
 <translation id="5372829067651257087">‏تمّ نسح عنوان URL.</translation>
 <translation id="5384883051496921101">موقع الويب هذا على وشك مشاركة معلومات مع أحد التطبيقات خارج وضع التصفح المتخفي.</translation>
 <translation id="5400569084694353794">باستخدام هذا التطبيق، فإنك توافق على <ph name="BEGIN_LINK1" />شروط الخدمة<ph name="END_LINK1" /> و<ph name="BEGIN_LINK2" />إشعار الخصوصية<ph name="END_LINK2" />.</translation>
@@ -655,7 +650,6 @@
 <translation id="7929962904089429003">فتح القائمة</translation>
 <translation id="7942131818088350342"><ph name="PRODUCT_NAME" /> قديم.</translation>
 <translation id="7947953824732555851">قبول وتسجيل الدخول</translation>
-<translation id="7949961459945740081">الحصول على أحدث الميزات</translation>
 <translation id="7963646190083259054">المورّد:</translation>
 <translation id="7987073022710626672">‏بنود خدمة Chrome</translation>
 <translation id="7998918019931843664">إعادة فتح علامة التبويب المغلقة</translation>
@@ -666,7 +660,6 @@
 <translation id="8015452622527143194">إعادة كل محتويات الصفحة إلى الحجم الافتراضي</translation>
 <translation id="802154636333426148">تعذّر التنزيل</translation>
 <translation id="8026334261755873520">محو بيانات التصفُّح</translation>
-<translation id="8033827949643255796">تم التحديد</translation>
 <translation id="8035133914807600019">مجلد جديد...</translation>
 <translation id="8037750541064988519">عدد الأيام المتبقية: <ph name="DAYS" /></translation>
 <translation id="8051695050440594747">هناك <ph name="MEGABYTES" /> ميغابايت متوفرة</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb b/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb
index 53573157..bff5a1d1 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb
@@ -116,7 +116,6 @@
 <translation id="2139186145475833000">Добавяне към началния екран</translation>
 <translation id="2146738493024040262">Отваряне на мигновеното приложение</translation>
 <translation id="2148716181193084225">Днес</translation>
-<translation id="2154710561487035718">Копиране на URL адреса</translation>
 <translation id="2156074688469523661">Останали сайтове (<ph name="NUMBER_OF_SITES" />)</translation>
 <translation id="219985413780390209">Защита от опасни сайтове за вас и устройството ви</translation>
 <translation id="2206488550163399966"><ph name="APP_NAME" />, уеб приложение. <ph name="APP_URL" /></translation>
@@ -218,7 +217,6 @@
 <translation id="3387650086002190359">Изтеглянето на „<ph name="FILE_NAME" />“ не бе успешно поради грешки във файловата система.</translation>
 <translation id="3398320232533725830">Отваряне на диспечера на отметките</translation>
 <translation id="3414952576877147120">Размер:</translation>
-<translation id="3435896845095436175">Активиране</translation>
 <translation id="3443221991560634068">Презареждане на текущата страница</translation>
 <translation id="3452612588551937789">Влезте с профила си в Google, за да получите своите отметки, история, пароли и други настройки на всичките си устройства.</translation>
 <translation id="3487093336331957349">Предложения за търсене и сайтове</translation>
@@ -319,7 +317,6 @@
 <translation id="4522570452068850558">Подробности</translation>
 <translation id="4526249700380860531">Преглед и управление на запазените пароли на адрес <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation>
 <translation id="4532845899244822526">Избиране на папка</translation>
-<translation id="4535858793016067060">Включете „Неизвестни източници“ в настройките за сигурност на Android, за да изпробвате експеримента за подобрено добавяне към началния екран. Непременно деактивирайте тази настройка, когато приключите с тестването.</translation>
 <translation id="4558311620361989323">Комбинации за уеб страници</translation>
 <translation id="4572422548854449519">Вход в управляван профил</translation>
 <translation id="4581964774250883625">Преминахте в режим „инкогнито“.</translation>
@@ -362,7 +359,6 @@
 <translation id="497421865427891073">Преминаване напред</translation>
 <translation id="4988526792673242964">Страници</translation>
 <translation id="4996978546172906250">Споделяне чрез</translation>
-<translation id="5000922062037820727">Блокирано (препоръчително)</translation>
 <translation id="5004339818306944878">Използвайте до 60% по-малко данни и сърфирайте по-бързо в мрежата. Сървърите на Google ще оптимизират посещаваните от вас страници.</translation>
 <translation id="5005498671520578047">Копиране на паролата</translation>
 <translation id="5011311129201317034"><ph name="SITE" /> иска да се свърже</translation>
@@ -403,7 +399,6 @@
 <translation id="5335288049665977812">Разрешаване на сайтовете да изпълняват JavaScript (препоръчително)</translation>
 <translation id="5345040418939504969">Изтрихте „<ph name="BOOKMARK_TITLE" />“</translation>
 <translation id="5345083863238459644">Достъпът до местоположението също е <ph name="BEGIN_LINK" />изключен за това устройство<ph name="END_LINK" />.</translation>
-<translation id="5349103022427743704">Експеримент за подобрено добавяне към началния екран</translation>
 <translation id="5372829067651257087">URL адресът е копиран.</translation>
 <translation id="5384883051496921101">Този сайт е напът да сподели информация с приложение, което не е в режим „инкогнито“.</translation>
 <translation id="5400569084694353794">С използването на това приложение приемате <ph name="BEGIN_LINK1" />Общите условия<ph name="END_LINK1" /> и <ph name="BEGIN_LINK2" />Съобщението за поверителност<ph name="END_LINK2" /> на Chrome.</translation>
@@ -654,7 +649,6 @@
 <translation id="7929962904089429003">Отваряне на менюто</translation>
 <translation id="7942131818088350342"><ph name="PRODUCT_NAME" /> не е актуален.</translation>
 <translation id="7947953824732555851">Приемам и влизам</translation>
-<translation id="7949961459945740081">Получете най-новите функции</translation>
 <translation id="7963646190083259054">Доставчик:</translation>
 <translation id="7987073022710626672">Общи условия на Chrome</translation>
 <translation id="7998918019931843664">Повторно отваряне на затворения раздел</translation>
@@ -665,7 +659,6 @@
 <translation id="8015452622527143194">Стандартен размер на всички елементи на страницата</translation>
 <translation id="802154636333426148">Изтеглянето не бе успешно</translation>
 <translation id="8026334261755873520">Изчистване на данните за сърфирането</translation>
-<translation id="8033827949643255796">откроени</translation>
 <translation id="8035133914807600019">Нова папка…</translation>
 <translation id="8037750541064988519">Остават <ph name="DAYS" /> дни</translation>
 <translation id="8051695050440594747">Налице: <ph name="MEGABYTES" /> МБ</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb
index 595415e..5006757 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb
@@ -116,7 +116,6 @@
 <translation id="2139186145475833000">Afegeix a pantalla d'inici</translation>
 <translation id="2146738493024040262">Obre l'aplicació instantània</translation>
 <translation id="2148716181193084225">Avui</translation>
-<translation id="2154710561487035718">Copia l'URL</translation>
 <translation id="2156074688469523661">Llocs restants (<ph name="NUMBER_OF_SITES" />)</translation>
 <translation id="219985413780390209">Protegeix-me a mi i al meu dispositiu de llocs perillosos</translation>
 <translation id="2206488550163399966"><ph name="APP_NAME" />, aplicació web. <ph name="APP_URL" /></translation>
@@ -218,7 +217,6 @@
 <translation id="3387650086002190359">No s'ha pogut baixar <ph name="FILE_NAME" /> a causa d'errors amb el sistema de fitxers.</translation>
 <translation id="3398320232533725830">Obre el gestor d'adreces d'interès</translation>
 <translation id="3414952576877147120">Mida:</translation>
-<translation id="3435896845095436175">Activa</translation>
 <translation id="3443221991560634068">Torna a carregar la pàgina actual</translation>
 <translation id="3452612588551937789">Inicieu la sessió amb el compte de Google per tenir les adreces d'interès, l'historial, les contrasenyes i altres opcions de configuració en tots els dispositius.</translation>
 <translation id="3487093336331957349">Suggeriments de cerques i llocs</translation>
@@ -319,7 +317,6 @@
 <translation id="4522570452068850558">Detalls</translation>
 <translation id="4526249700380860531">Consulta i gestiona les contrasenyes desades a <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation>
 <translation id="4532845899244822526">Trieu la carpeta</translation>
-<translation id="4535858793016067060">Per provar l'experiment millorat Afegeix a la pantalla d'inici, activa Fonts desconegudes a la configuració de seguretat d'Android. Quan acabis de provar-lo, no oblidis desactivar aquesta opció de configuració.</translation>
 <translation id="4558311620361989323">Dreceres per a pàgines web</translation>
 <translation id="4572422548854449519">Inicia la sessió al compte gestionat</translation>
 <translation id="4581964774250883625">Has passat al mode d'incògnit.</translation>
@@ -362,7 +359,6 @@
 <translation id="497421865427891073">Vés endavant</translation>
 <translation id="4988526792673242964">Pàgines</translation>
 <translation id="4996978546172906250">Compartir mitjançant</translation>
-<translation id="5000922062037820727">Bloquejat (recomanat)</translation>
 <translation id="5004339818306944878">Utilitza fins a un 60% menys de dades i navega més de pressa. Els servidors de Google optimitzaran les pàgines que visitis.</translation>
 <translation id="5005498671520578047">Copia la contrasenya</translation>
 <translation id="5011311129201317034"><ph name="SITE" /> es vol connectar</translation>
@@ -403,7 +399,6 @@
 <translation id="5335288049665977812">Permet que els llocs executin JavaScript (opció recomanada)</translation>
 <translation id="5345040418939504969"><ph name="BOOKMARK_TITLE" /> s'ha suprimit</translation>
 <translation id="5345083863238459644">L'accés a la ubicació <ph name="BEGIN_LINK" />està desactivat també per a aquest dispositiu<ph name="END_LINK" />.</translation>
-<translation id="5349103022427743704">Experiment millorat Afegeix a la pantalla d'inici</translation>
 <translation id="5372829067651257087">S'ha copiat l'URL.</translation>
 <translation id="5384883051496921101">Aquest lloc està a punt de compartir informació amb una aplicació fora del mode d'incògnit.</translation>
 <translation id="5400569084694353794">En fer servir aquesta aplicació, accepteu les <ph name="BEGIN_LINK1" />Condicions del servei<ph name="END_LINK1" /> i l'<ph name="BEGIN_LINK2" />Avís de privadesa<ph name="END_LINK2" /> de Chrome.</translation>
@@ -654,7 +649,6 @@
 <translation id="7929962904089429003">Obre el menú</translation>
 <translation id="7942131818088350342"><ph name="PRODUCT_NAME" /> no està actualitzat.</translation>
 <translation id="7947953824732555851">Acc. i inicia sessió</translation>
-<translation id="7949961459945740081">Baixa les funcions més recents</translation>
 <translation id="7963646190083259054">Proveïdor:</translation>
 <translation id="7987073022710626672">Condicions del servei de Chrome</translation>
 <translation id="7998918019931843664">Torna a obrir la pestanya tancada</translation>
@@ -665,7 +659,6 @@
 <translation id="8015452622527143194">Restableix la mida de tots els elements de la pàgina</translation>
 <translation id="802154636333426148">Error de baixada</translation>
 <translation id="8026334261755873520">Esborra les dades de navegació</translation>
-<translation id="8033827949643255796">seleccionats</translation>
 <translation id="8035133914807600019">Carpeta nova…</translation>
 <translation id="8037750541064988519">Queden <ph name="DAYS" /> dies</translation>
 <translation id="8051695050440594747"><ph name="MEGABYTES" /> MB disponibles</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_cs.xtb b/chrome/android/java/strings/translations/android_chrome_strings_cs.xtb
index 23692122..f0888cb 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_cs.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_cs.xtb
@@ -116,7 +116,6 @@
 <translation id="2139186145475833000">Přidat na plochu</translation>
 <translation id="2146738493024040262">Otevřít okamžitou aplikaci</translation>
 <translation id="2148716181193084225">Dnes</translation>
-<translation id="2154710561487035718">Kopírovat adresu URL</translation>
 <translation id="2156074688469523661">Zbývající weby (<ph name="NUMBER_OF_SITES" />)</translation>
 <translation id="219985413780390209">Chránit mě i mé zařízení před nebezpečnými weby</translation>
 <translation id="2206488550163399966"><ph name="APP_NAME" />, webová aplikace <ph name="APP_URL" /></translation>
@@ -218,7 +217,6 @@
 <translation id="3387650086002190359">Stažení souboru <ph name="FILE_NAME" /> se nezdařilo z důvodu chyb systému souborů.</translation>
 <translation id="3398320232533725830">Otevřít správce záložek</translation>
 <translation id="3414952576877147120">Velikost:</translation>
-<translation id="3435896845095436175">Aktivovat</translation>
 <translation id="3443221991560634068">Znovu načíst aktuální stránku</translation>
 <translation id="3452612588551937789">Přihlaste se pomocí účtu Google a získejte záložky, historii, hesla a další nastavení do všech svých zařízení.</translation>
 <translation id="3487093336331957349">Návrhy vyhledávacích dotazů a webů</translation>
@@ -319,7 +317,6 @@
 <translation id="4522570452068850558">Podrobnosti</translation>
 <translation id="4526249700380860531">Uložená hesla můžete zobrazit a upravit na adrese <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation>
 <translation id="4532845899244822526">Výběr složky</translation>
-<translation id="4535858793016067060">Chcete-li vyzkoušet experimentální vylepšenou funkci Přidat na plochu, zapněte v nastavení zabezpečení systému Android možnost Neznámé zdroje. Až si tuto funkci vyzkoušíte, nezapomeňte toto nastavení znovu vypnout.</translation>
 <translation id="4558311620361989323">Zkratky webových stránek</translation>
 <translation id="4572422548854449519">Přihlaste se ke spravovanému účtu</translation>
 <translation id="4581964774250883625">Jste v anonymním režimu.</translation>
@@ -362,7 +359,6 @@
 <translation id="497421865427891073">Vpřed</translation>
 <translation id="4988526792673242964">Stránky</translation>
 <translation id="4996978546172906250">Sdílet prostřednictvím</translation>
-<translation id="5000922062037820727">Blokováno (doporučeno)</translation>
 <translation id="5004339818306944878">Uspořte až 60 % dat a načítejte weby rychleji. Servery Google budou navštěvované stránky optimalizovat.</translation>
 <translation id="5005498671520578047">Kopírování hesla</translation>
 <translation id="5011311129201317034">Web <ph name="SITE" /> žádá o připojení</translation>
@@ -403,7 +399,6 @@
 <translation id="5335288049665977812">Povolit webům spouštět JavaScript (doporučeno)</translation>
 <translation id="5345040418939504969">Záložka <ph name="BOOKMARK_TITLE" /> byla smazána</translation>
 <translation id="5345083863238459644">Přístup k poloze je <ph name="BEGIN_LINK" />vypnut také v tomto zařízení<ph name="END_LINK" />.</translation>
-<translation id="5349103022427743704">Experimentální vylepšená funkce Přidat na plochu</translation>
 <translation id="5372829067651257087">Adresa byla zkopírována.</translation>
 <translation id="5384883051496921101">Tento web chce sdílet informace s aplikací mimo anonymní režim.</translation>
 <translation id="5400569084694353794">Používáním této aplikace vyjadřujete souhlas se <ph name="BEGIN_LINK1" />smluvními podmínkami<ph name="END_LINK1" /> a <ph name="BEGIN_LINK2" />zásadami ochrany soukromí<ph name="END_LINK2" /> prohlížeče Chrome.</translation>
@@ -654,7 +649,6 @@
 <translation id="7929962904089429003">Otevřít nabídku</translation>
 <translation id="7942131818088350342">Aplikace <ph name="PRODUCT_NAME" /> je zastaralá.</translation>
 <translation id="7947953824732555851">Přijmout a přihlásit</translation>
-<translation id="7949961459945740081">Získejte nejnovější funkce</translation>
 <translation id="7963646190083259054">Dodavatel:</translation>
 <translation id="7987073022710626672">Smluvní podmínky Chrome</translation>
 <translation id="7998918019931843664">Znovu otevřít zavřenou kartu</translation>
@@ -665,7 +659,6 @@
 <translation id="8015452622527143194">Vrátit veškerý obsah stránky na původní velikost</translation>
 <translation id="802154636333426148">Stažení se nezdařilo</translation>
 <translation id="8026334261755873520">Vymazat údaje o prohlížení</translation>
-<translation id="8033827949643255796">vybráno</translation>
 <translation id="8035133914807600019">Nová složka…</translation>
 <translation id="8037750541064988519">Zbývá: <ph name="DAYS" /> d</translation>
 <translation id="8051695050440594747">K dispozici: <ph name="MEGABYTES" /> MB</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_da.xtb b/chrome/android/java/strings/translations/android_chrome_strings_da.xtb
index 902fed58..5338c916 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_da.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_da.xtb
@@ -116,7 +116,6 @@
 <translation id="2139186145475833000">Føj til startskærm</translation>
 <translation id="2146738493024040262">Åbn instant app</translation>
 <translation id="2148716181193084225">I dag</translation>
-<translation id="2154710561487035718">Kopier webadresse</translation>
 <translation id="2156074688469523661">Tilbageværende websites (<ph name="NUMBER_OF_SITES" />)</translation>
 <translation id="219985413780390209">Beskyt dig selv og din enhed mod farlige websites</translation>
 <translation id="2206488550163399966"><ph name="APP_NAME" />, webapp. <ph name="APP_URL" /></translation>
@@ -218,7 +217,6 @@
 <translation id="3387650086002190359">Download af <ph name="FILE_NAME" /> mislykkedes på grund af fejl i filsystemet.</translation>
 <translation id="3398320232533725830">Åbn bogmærkeadministratoren</translation>
 <translation id="3414952576877147120">Størrelse:</translation>
-<translation id="3435896845095436175">Aktivér</translation>
 <translation id="3443221991560634068">Genindlæs den aktuelle side</translation>
 <translation id="3452612588551937789">Log ind med din Google-konto for at få adgang til dine bogmærker, dine adgangskoder, din historik og andre indstillinger på alle dine enheder.</translation>
 <translation id="3487093336331957349">Søge- og websiteforslag</translation>
@@ -319,7 +317,6 @@
 <translation id="4522570452068850558">Detaljer</translation>
 <translation id="4526249700380860531">Se og administrer gemte adgangskoder på <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation>
 <translation id="4532845899244822526">Vælg mappe</translation>
-<translation id="4535858793016067060">Slå "Ukendte kilder" til i sikkerhedsindstillingerne i Android for at afprøve eksperimentet "Forbedring af funktionen Føj til startskærm". Sørg for at deaktivere denne indstilling, når du er færdig med at teste den.</translation>
 <translation id="4558311620361989323">Genveje på websider</translation>
 <translation id="4572422548854449519">Log ind på administreret konto</translation>
 <translation id="4581964774250883625">Du er nu i inkognito.</translation>
@@ -362,7 +359,6 @@
 <translation id="497421865427891073">Gå fremad</translation>
 <translation id="4988526792673242964">Sider</translation>
 <translation id="4996978546172906250">Del via</translation>
-<translation id="5000922062037820727">Blokeret (anbefales)</translation>
 <translation id="5004339818306944878">Brug op til 60 % færre data, og gør nettet hurtigere. Google-servere optimerer de sider, du besøger.</translation>
 <translation id="5005498671520578047">Kopiér adgangskode</translation>
 <translation id="5011311129201317034"><ph name="SITE" /> vil gerne oprette forbindelse</translation>
@@ -403,7 +399,6 @@
 <translation id="5335288049665977812">Tillad, at websites kører JavaScript (anbefales)</translation>
 <translation id="5345040418939504969">Slettede <ph name="BOOKMARK_TITLE" /></translation>
 <translation id="5345083863238459644">Placeringsadgang er også <ph name="BEGIN_LINK" />slået fra for denne enhed<ph name="END_LINK" />.</translation>
-<translation id="5349103022427743704">Eksperimentet Forbedring af funktionen Føj til startskærm</translation>
 <translation id="5372829067651257087">Webadressen blev kopieret.</translation>
 <translation id="5384883051496921101">Dette website skal til at dele oplysninger med en app uden for inkognitotilstand.</translation>
 <translation id="5400569084694353794">Ved at bruge denne applikation accepterer du Chromes <ph name="BEGIN_LINK1" />servicevilkår<ph name="END_LINK1" /> og <ph name="BEGIN_LINK2" />erklæring om privatliv<ph name="END_LINK2" />.</translation>
@@ -654,7 +649,6 @@
 <translation id="7929962904089429003">Åbn menuen</translation>
 <translation id="7942131818088350342"><ph name="PRODUCT_NAME" /> er forældet.</translation>
 <translation id="7947953824732555851">Acceptér og log ind</translation>
-<translation id="7949961459945740081">Hent de nyeste funktioner</translation>
 <translation id="7963646190083259054">Leverandør:</translation>
 <translation id="7987073022710626672">Chromes servicevilkår</translation>
 <translation id="7998918019931843664">Åbn lukket fane igen</translation>
@@ -665,7 +659,6 @@
 <translation id="8015452622527143194">Nulstil alt på siden til standardstørrelsen</translation>
 <translation id="802154636333426148">Download mislykkedes</translation>
 <translation id="8026334261755873520">Ryd browserdata</translation>
-<translation id="8033827949643255796">valgt</translation>
 <translation id="8035133914807600019">Ny mappe…</translation>
 <translation id="8037750541064988519"><ph name="DAYS" /> dage tilbage</translation>
 <translation id="8051695050440594747"><ph name="MEGABYTES" /> MB er ledig</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_de.xtb b/chrome/android/java/strings/translations/android_chrome_strings_de.xtb
index 3d49d9f..09f54c0 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_de.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_de.xtb
@@ -116,7 +116,6 @@
 <translation id="2139186145475833000">Zum Startbildschirm hinzu</translation>
 <translation id="2146738493024040262">Instant-App öffnen</translation>
 <translation id="2148716181193084225">Heute</translation>
-<translation id="2154710561487035718">URL kopieren</translation>
 <translation id="2156074688469523661">Verbleibende Websites (<ph name="NUMBER_OF_SITES" />)</translation>
 <translation id="219985413780390209">Mich und mein Gerät vor schädlichen Websites schützen</translation>
 <translation id="2206488550163399966"><ph name="APP_NAME" />, Web-App. <ph name="APP_URL" /></translation>
@@ -218,7 +217,6 @@
 <translation id="3387650086002190359"><ph name="FILE_NAME" /> konnte aufgrund von Dateisystemfehlern nicht heruntergeladen werden.</translation>
 <translation id="3398320232533725830">Lesezeichen-Manager öffnen</translation>
 <translation id="3414952576877147120">Größe:</translation>
-<translation id="3435896845095436175">Aktivieren</translation>
 <translation id="3443221991560634068">Aktuelle Seite neu laden</translation>
 <translation id="3452612588551937789">Melden Sie sich mit Ihrem Google-Konto an, um Ihre Lesezeichen, Ihren Verlauf, Ihre Passwörter und Ihre anderen Einstellungen auf allen Geräten abrufen zu können.</translation>
 <translation id="3487093336331957349">Vorschläge für Suchbegriffe und für Websites</translation>
@@ -319,7 +317,6 @@
 <translation id="4522570452068850558">Details</translation>
 <translation id="4526249700380860531">Unter <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /> gespeicherte Passwörter aufrufen und verwalten</translation>
 <translation id="4532845899244822526">Ordner auswählen</translation>
-<translation id="4535858793016067060">Aktivieren Sie in den Sicherheitseinstellungen von Android die Option "Unbekannte Quellen", um den Test für die verbesserte Option "Zum Startbildschirm hinzufügen" auszuprobieren. Sie sollten diese Einstellung jedoch wieder deaktivieren, wenn Sie den Test beenden.</translation>
 <translation id="4558311620361989323">Tastenkombinationen für Webseiten</translation>
 <translation id="4572422548854449519">In verwaltetem Konto anmelden</translation>
 <translation id="4581964774250883625">Sie befinden sich jetzt im Inkognitomodus.</translation>
@@ -362,7 +359,6 @@
 <translation id="497421865427891073">Weiter</translation>
 <translation id="4988526792673242964">Seiten</translation>
 <translation id="4996978546172906250">Teilen über</translation>
-<translation id="5000922062037820727">Blockiert (empfohlen)</translation>
 <translation id="5004339818306944878">Bis zu 60 % weniger Datenverbrauch und schnelleres Internet. Google-Server optimieren die Seiten, die Sie besuchen.</translation>
 <translation id="5005498671520578047">Passwort kopieren</translation>
 <translation id="5011311129201317034"><ph name="SITE" /> möchte eine Verbindung herstellen</translation>
@@ -403,7 +399,6 @@
 <translation id="5335288049665977812">Ausführung von JavaScript durch Websites zulassen (empfohlen)</translation>
 <translation id="5345040418939504969"><ph name="BOOKMARK_TITLE" /> gelöscht</translation>
 <translation id="5345083863238459644">Der Standortzugriff ist auch <ph name="BEGIN_LINK" />für dieses Gerät deaktiviert<ph name="END_LINK" />.</translation>
-<translation id="5349103022427743704">Test für verbesserte Option "Zum Startbildschirm hinzufügen"</translation>
 <translation id="5372829067651257087">URL kopiert.</translation>
 <translation id="5384883051496921101">Diese Website ist im Begriff, Informationen mit einer App außerhalb des Inkognitomodus zu teilen.</translation>
 <translation id="5400569084694353794">Durch die Verwendung dieser App stimmen Sie den <ph name="BEGIN_LINK1" />Nutzungsbedingungen<ph name="END_LINK1" /> und <ph name="BEGIN_LINK2" />Datenschutzhinweisen<ph name="END_LINK2" /> von Chrome zu.</translation>
@@ -654,7 +649,6 @@
 <translation id="7929962904089429003">Menü öffnen</translation>
 <translation id="7942131818088350342"><ph name="PRODUCT_NAME" /> ist veraltet.</translation>
 <translation id="7947953824732555851">Akzeptieren und anmelden</translation>
-<translation id="7949961459945740081">Neue Funktionen herunterladen</translation>
 <translation id="7963646190083259054">Anbieter:</translation>
 <translation id="7987073022710626672">Chrome-Nutzungsbedingungen</translation>
 <translation id="7998918019931843664">Geschlossenen Tab wieder öffnen</translation>
@@ -665,7 +659,6 @@
 <translation id="8015452622527143194">Gesamten Seiteninhalt auf Standardgröße zurücksetzen</translation>
 <translation id="802154636333426148">Downloadfehler</translation>
 <translation id="8026334261755873520">Browserdaten löschen</translation>
-<translation id="8033827949643255796">Ausgewählt</translation>
 <translation id="8035133914807600019">Neuer Ordner…</translation>
 <translation id="8037750541064988519"><ph name="DAYS" /> Tage übrig</translation>
 <translation id="8051695050440594747"><ph name="MEGABYTES" /> MB verfügbar</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_el.xtb b/chrome/android/java/strings/translations/android_chrome_strings_el.xtb
index 84b0fa0..010c697 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_el.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_el.xtb
@@ -116,7 +116,6 @@
 <translation id="2139186145475833000">Προσθήκη στην αρχική οθόνη</translation>
 <translation id="2146738493024040262">Άνοιγμα Instant Εφαρμογής</translation>
 <translation id="2148716181193084225">Σήμερα</translation>
-<translation id="2154710561487035718">Αντιγραφή διεύθυνσης URL</translation>
 <translation id="2156074688469523661">Ιστότοποι που απομένουν (<ph name="NUMBER_OF_SITES" />)</translation>
 <translation id="219985413780390209">Προστατεύει εσάς και τη συσκευή σας από επικίνδυνους ιστότοπους</translation>
 <translation id="2206488550163399966"><ph name="APP_NAME" />, εφαρμογή ιστού. <ph name="APP_URL" /></translation>
@@ -218,7 +217,6 @@
 <translation id="3387650086002190359">Η λήψη του αρχείου <ph name="FILE_NAME" /> απέτυχε λόγω σφαλμάτων του συστήματος αρχείων.</translation>
 <translation id="3398320232533725830">Άνοιγμα του διαχειριστή σελιδοδεικτών</translation>
 <translation id="3414952576877147120">Μέγεθος:</translation>
-<translation id="3435896845095436175">Ενεργοποίηση</translation>
 <translation id="3443221991560634068">Επαναφόρτωση της τρέχουσας σελίδας</translation>
 <translation id="3452612588551937789">Συνδεθείτε στον Λογαριασμό σας Google για να λάβετε τους σελιδοδείκτες, το ιστορικό, τους κωδικούς πρόσβασης, και άλλες ρυθμίσεις σε όλες τις συσκευές σας</translation>
 <translation id="3487093336331957349">Προτάσεις αναζήτησης και ιστοτόπων</translation>
@@ -319,7 +317,6 @@
 <translation id="4522570452068850558">Λεπτομέρειες</translation>
 <translation id="4526249700380860531">Προβολή και διαχείριση των αποθηκευμένων κωδικών πρόσβασης στη διεύθυνση <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation>
 <translation id="4532845899244822526">Επιλογή φακέλου</translation>
-<translation id="4535858793016067060">Ενεργοποιήστε τις "Άγνωστες πηγές" στις ρυθμίσεις ασφαλείας Android για να δοκιμάσετε το πείραμα "Βελτιωμένη προσθήκη στην Αρχική οθόνη". Βεβαιωθείτε ότι έχετε απενεργοποιήσει αυτήν τη ρύθμιση όταν ολοκληρώσετε τη δοκιμή της.</translation>
 <translation id="4558311620361989323">Συντομεύσεις ιστοσελίδας</translation>
 <translation id="4572422548854449519">Συνδεθείτε στον διαχειριζόμενο λογαριασμό</translation>
 <translation id="4581964774250883625">Πραγματοποιείτε ανώνυμη περιήγηση</translation>
@@ -362,7 +359,6 @@
 <translation id="497421865427891073">Μετάβαση προς τα εμπρός</translation>
 <translation id="4988526792673242964">Σελίδες</translation>
 <translation id="4996978546172906250">Μοιραστείτε μέσω</translation>
-<translation id="5000922062037820727">Αποκλείεται (συνιστάται)</translation>
 <translation id="5004339818306944878">Χρησιμοποιήστε έως 60% λιγότερα δεδομένα και αυξήστε την ταχύτητα του ιστού. Οι διακομιστές της Google θα βελτιστοποιήσουν τις σελίδες που επισκέπτεστε.</translation>
 <translation id="5005498671520578047">Αντιγραφή κωδικού πρόσβασης</translation>
 <translation id="5011311129201317034">Ο ιστότοπος <ph name="SITE" /> επιθυμεί σύνδεση</translation>
@@ -403,7 +399,6 @@
 <translation id="5335288049665977812">Να επιτρέπεται στους ιστότοπους να εκτελούν JavaScript (συνιστάται)</translation>
 <translation id="5345040418939504969">Ο σελιδοδείκτης <ph name="BOOKMARK_TITLE" /> διαγράφηκε</translation>
 <translation id="5345083863238459644">Η πρόσβαση τοποθεσίας είναι επίσης <ph name="BEGIN_LINK" />απενεργοποιημένη για αυτήν τη συσκευή<ph name="END_LINK" />.</translation>
-<translation id="5349103022427743704">Πείραμα "Βελτιωμένη προσθήκη στην Αρχική οθόνη"</translation>
 <translation id="5372829067651257087">Έγινε αντιγραφή του URL.</translation>
 <translation id="5384883051496921101">Αυτός ο ιστότοπος πρόκειται να κοινοποιήσει πληροφορίες με μια εφαρμογή εκτός της κατάστασης ανώνυμης περιήγησης.</translation>
 <translation id="5400569084694353794">Χρησιμοποιώντας αυτήν την εφαρμογή, αποδέχεστε τους <ph name="BEGIN_LINK1" />Όρους Παροχής Υπηρεσιών<ph name="END_LINK1" /> και τη <ph name="BEGIN_LINK2" />Σημείωση Απορρήτου<ph name="END_LINK2" /> του Chrome.</translation>
@@ -654,7 +649,6 @@
 <translation id="7929962904089429003">Άνοιγμα μενού</translation>
 <translation id="7942131818088350342">Το <ph name="PRODUCT_NAME" /> δεν είναι ενημερωμένο.</translation>
 <translation id="7947953824732555851">Αποδοχή και σύνδεση</translation>
-<translation id="7949961459945740081">Λήψη τελευταίων λειτουργιών</translation>
 <translation id="7963646190083259054">Προμηθευτής:</translation>
 <translation id="7987073022710626672">Όροι Παροχής Υπηρεσιών Chrome</translation>
 <translation id="7998918019931843664">Εκ νέου άνοιγμα κλειστής καρτέλας</translation>
@@ -665,7 +659,6 @@
 <translation id="8015452622527143194">Επαναφορά στοιχείων σελίδας σε κανονικό μέγεθος</translation>
 <translation id="802154636333426148">Η λήψη απέτυχε</translation>
 <translation id="8026334261755873520">Διαγραφή δεδομένων περιήγησης</translation>
-<translation id="8033827949643255796">επιλεγμένο</translation>
 <translation id="8035133914807600019">Νέος φάκελος…</translation>
 <translation id="8037750541064988519">Απομένουν <ph name="DAYS" /> ημέρες</translation>
 <translation id="8051695050440594747"><ph name="MEGABYTES" /> MB διαθέσιμα</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_en-GB.xtb b/chrome/android/java/strings/translations/android_chrome_strings_en-GB.xtb
index 5e92e76..5ee0573 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_en-GB.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_en-GB.xtb
@@ -116,7 +116,6 @@
 <translation id="2139186145475833000">Add to Home screen</translation>
 <translation id="2146738493024040262">Open Instant App</translation>
 <translation id="2148716181193084225">Today</translation>
-<translation id="2154710561487035718">Copy URL</translation>
 <translation id="2156074688469523661">Remaining sites (<ph name="NUMBER_OF_SITES" />)</translation>
 <translation id="219985413780390209">Protect you and your device from dangerous sites</translation>
 <translation id="2206488550163399966"><ph name="APP_NAME" />, web app. <ph name="APP_URL" /></translation>
@@ -218,7 +217,6 @@
 <translation id="3387650086002190359"><ph name="FILE_NAME" /> download failed due to file system errors.</translation>
 <translation id="3398320232533725830">Open the bookmarks manager</translation>
 <translation id="3414952576877147120">Size:</translation>
-<translation id="3435896845095436175">Enable</translation>
 <translation id="3443221991560634068">Reload the current page</translation>
 <translation id="3452612588551937789">Sign in with your Google Account to get your bookmarks, history, passwords and other settings on all your devices.</translation>
 <translation id="3487093336331957349">Search and site suggestions</translation>
@@ -319,7 +317,6 @@
 <translation id="4522570452068850558">Details</translation>
 <translation id="4526249700380860531">View and manage saved passwords at <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation>
 <translation id="4532845899244822526">Choose folder</translation>
-<translation id="4535858793016067060">Turn on “Unknown sources” in Android security settings to try "Improved Add to Home screen" experiment. Make sure to disable this setting when you’ve finished trying it out.</translation>
 <translation id="4558311620361989323">Web page shortcuts</translation>
 <translation id="4572422548854449519">Sign in to managed account</translation>
 <translation id="4581964774250883625">You’ve gone incognito.</translation>
@@ -362,7 +359,6 @@
 <translation id="497421865427891073">go forward</translation>
 <translation id="4988526792673242964">Pages</translation>
 <translation id="4996978546172906250">Share via</translation>
-<translation id="5000922062037820727">Blocked (recommended)</translation>
 <translation id="5004339818306944878">Use up to 60% less data and speed up the web. Google servers will optimise the pages you visit.</translation>
 <translation id="5005498671520578047">Copy password</translation>
 <translation id="5011311129201317034"><ph name="SITE" /> wants to connect</translation>
@@ -403,7 +399,6 @@
 <translation id="5335288049665977812">Allow sites to run JavaScript (recommended)</translation>
 <translation id="5345040418939504969">Deleted <ph name="BOOKMARK_TITLE" /></translation>
 <translation id="5345083863238459644">Location access is also <ph name="BEGIN_LINK" />turned off for this device<ph name="END_LINK" />.</translation>
-<translation id="5349103022427743704">Improved Add to Home screen Experiment</translation>
 <translation id="5372829067651257087">URL copied.</translation>
 <translation id="5384883051496921101">This site is about to share information with an app outside of incognito mode.</translation>
 <translation id="5400569084694353794">By using this application, you agree to Chrome’s <ph name="BEGIN_LINK1" />Terms of Service<ph name="END_LINK1" /> and <ph name="BEGIN_LINK2" />Privacy Notice<ph name="END_LINK2" />.</translation>
@@ -654,7 +649,6 @@
 <translation id="7929962904089429003">Opening the menu</translation>
 <translation id="7942131818088350342"><ph name="PRODUCT_NAME" /> is out of date.</translation>
 <translation id="7947953824732555851">Accept and sign in</translation>
-<translation id="7949961459945740081">Get the latest features</translation>
 <translation id="7963646190083259054">Vendor:</translation>
 <translation id="7987073022710626672">Chrome Terms of Service</translation>
 <translation id="7998918019931843664">Re-open closed tab</translation>
@@ -665,7 +659,6 @@
 <translation id="8015452622527143194">Return everything on the page to default size</translation>
 <translation id="802154636333426148">Download failed</translation>
 <translation id="8026334261755873520">Clear browsing data</translation>
-<translation id="8033827949643255796">selected</translation>
 <translation id="8035133914807600019">New folder…</translation>
 <translation id="8037750541064988519"><ph name="DAYS" /> days left</translation>
 <translation id="8051695050440594747"><ph name="MEGABYTES" /> MB available</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_es-419.xtb b/chrome/android/java/strings/translations/android_chrome_strings_es-419.xtb
index 360349f..b6993e1 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_es-419.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_es-419.xtb
@@ -116,7 +116,6 @@
 <translation id="2139186145475833000">Agregar a la pantalla principal</translation>
 <translation id="2146738493024040262">Abrir app instantánea</translation>
 <translation id="2148716181193084225">Hoy</translation>
-<translation id="2154710561487035718">Copiar URL</translation>
 <translation id="2156074688469523661">Sitios restantes (<ph name="NUMBER_OF_SITES" />)</translation>
 <translation id="219985413780390209">Protegerte a ti y a tu dispositivo contra sitios peligrosos</translation>
 <translation id="2206488550163399966"><ph name="APP_NAME" /> (aplicación web), <ph name="APP_URL" /></translation>
@@ -218,7 +217,6 @@
 <translation id="3387650086002190359"><ph name="FILE_NAME" /> no se pudo descargar debido a errores del sistema de archivos.</translation>
 <translation id="3398320232533725830">Abrir el administrador de favoritos</translation>
 <translation id="3414952576877147120">Tamaño:</translation>
-<translation id="3435896845095436175">Habilitar</translation>
 <translation id="3443221991560634068">Volver a cargar la página actual</translation>
 <translation id="3452612588551937789">Accede con tu cuenta de Google para obtener tus favoritos, contraseñas, historial y otras opciones de configuración en todos tus dispositivos.</translation>
 <translation id="3487093336331957349">Sugerencias de sitios y de búsqueda</translation>
@@ -319,7 +317,6 @@
 <translation id="4522570452068850558">Detalles</translation>
 <translation id="4526249700380860531">Consulta y administra las contraseñas que guardaste en <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" />.</translation>
 <translation id="4532845899244822526">Seleccionar carpeta</translation>
-<translation id="4535858793016067060">Activa la opción "Fuentes desconocidas" en la configuración de seguridad de Android y prueba el experimento para agregar a la pantalla principal de forma mejorada. Asegúrate de inhabilitar esta configuración cuando hayas terminado de probarlo.</translation>
 <translation id="4558311620361989323">Accesos directos a páginas web</translation>
 <translation id="4572422548854449519">Acceder a una cuenta administrada</translation>
 <translation id="4581964774250883625">Estás en modo incógnito.</translation>
@@ -362,7 +359,6 @@
 <translation id="497421865427891073">Avanzar</translation>
 <translation id="4988526792673242964">Páginas</translation>
 <translation id="4996978546172906250">Compartir mediante</translation>
-<translation id="5000922062037820727">Bloqueado (recomendado)</translation>
 <translation id="5004339818306944878">Usa hasta un 60% menos de datos y acelera la navegación en la Web. Los servidores de Google optimizarán las páginas que visites.</translation>
 <translation id="5005498671520578047">Copiar contraseña</translation>
 <translation id="5011311129201317034"><ph name="SITE" /> desea conectarse</translation>
@@ -403,7 +399,6 @@
 <translation id="5335288049665977812">Permitir que los sitios ejecuten JavaScript (recomendado)</translation>
 <translation id="5345040418939504969"><ph name="BOOKMARK_TITLE" /> borrado</translation>
 <translation id="5345083863238459644">El acceso a la ubicación también se <ph name="BEGIN_LINK" />desactivó para este dispositivo<ph name="END_LINK" />.</translation>
-<translation id="5349103022427743704">Experimento para agregar a la pantalla principal de forma mejorada</translation>
 <translation id="5372829067651257087">Se copió la URL.</translation>
 <translation id="5384883051496921101">Este sitio está a punto de compartir información con una app fuera del modo de navegación incógnito.</translation>
 <translation id="5400569084694353794">Al utilizar esta aplicación, aceptas las <ph name="BEGIN_LINK1" />Condiciones del servicio<ph name="END_LINK1" /> y el <ph name="BEGIN_LINK2" />Aviso de privacidad<ph name="END_LINK2" /> de Chrome.</translation>
@@ -654,7 +649,6 @@
 <translation id="7929962904089429003">Abrir el menú</translation>
 <translation id="7942131818088350342"><ph name="PRODUCT_NAME" /> no está actualizado.</translation>
 <translation id="7947953824732555851">Aceptar y acceder</translation>
-<translation id="7949961459945740081">Obtén últimas características</translation>
 <translation id="7963646190083259054">Proveedor:</translation>
 <translation id="7987073022710626672">Condiciones del servicio de Chrome</translation>
 <translation id="7998918019931843664">Volver a abrir la pestaña cerrada</translation>
@@ -665,7 +659,6 @@
 <translation id="8015452622527143194">Restablecer tamaño de los elementos de la página</translation>
 <translation id="802154636333426148">Error en la descarga</translation>
 <translation id="8026334261755873520">Eliminar datos de navegación</translation>
-<translation id="8033827949643255796">seleccionados</translation>
 <translation id="8035133914807600019">Nueva carpeta…</translation>
 <translation id="8037750541064988519"><ph name="DAYS" /> días restantes</translation>
 <translation id="8051695050440594747"><ph name="MEGABYTES" /> MB disponibles</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_es.xtb b/chrome/android/java/strings/translations/android_chrome_strings_es.xtb
index 0fa4df14..c5de317 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_es.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_es.xtb
@@ -4,7 +4,7 @@
 <translation id="1006017844123154345">Abrir versión online</translation>
 <translation id="1049743911850919806">Incógnito</translation>
 <translation id="10614374240317010">Contraseñas que nunca se guardan</translation>
-<translation id="1080790410959514870">Vas a salir de una cuenta administrada por <ph name="DOMAIN_NAME" />. Se eliminarán los datos de Chrome almacenados en este dispositivo, pero los datos permanecerán en tu cuenta de Google.</translation>
+<translation id="1080790410959514870">Vas a salir de una cuenta gestionada por <ph name="DOMAIN_NAME" />. Se eliminarán los datos de Chrome almacenados en este dispositivo, pero los datos permanecerán en tu cuenta de Google.</translation>
 <translation id="1111673857033749125">Aquí aparecen los marcadores que hayas guardado en otros dispositivos.</translation>
 <translation id="1121094540300013208">Informes de uso y sobre fallos</translation>
 <translation id="1137305377394488060">última hora</translation>
@@ -116,7 +116,6 @@
 <translation id="2139186145475833000">Añadir a pantalla de inicio</translation>
 <translation id="2146738493024040262">Abrir aplicación instantánea</translation>
 <translation id="2148716181193084225">Hoy</translation>
-<translation id="2154710561487035718">Copiar URL</translation>
 <translation id="2156074688469523661">Sitios web restantes (<ph name="NUMBER_OF_SITES" />)</translation>
 <translation id="219985413780390209">Obtener protección para ti y para tu dispositivo frente a sitios web peligrosos</translation>
 <translation id="2206488550163399966"><ph name="APP_NAME" />, una aplicación web disponible en <ph name="APP_URL" /></translation>
@@ -218,7 +217,6 @@
 <translation id="3387650086002190359">No se ha podido descargar <ph name="FILE_NAME" /> debido a problemas con el sistema de archivos.</translation>
 <translation id="3398320232533725830">Abre el administrador de marcadores</translation>
 <translation id="3414952576877147120">Tamaño:</translation>
-<translation id="3435896845095436175">Habilitar</translation>
 <translation id="3443221991560634068">Vuelve a cargar la página actual</translation>
 <translation id="3452612588551937789">Inicia sesión con tu cuenta de Google para acceder a tus marcadores, contraseñas, historial y otros ajustes desde todos tus dispositivos.</translation>
 <translation id="3487093336331957349">Sugerencias de búsqueda y sitios web</translation>
@@ -319,9 +317,8 @@
 <translation id="4522570452068850558">Detalles</translation>
 <translation id="4526249700380860531">Consulta y administra contraseñas guardadas en la página <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation>
 <translation id="4532845899244822526">Seleccionar carpeta</translation>
-<translation id="4535858793016067060">Activa Orígenes desconocidos en los ajustes de seguridad de Android para probar el experimento mejorado Añadir a la pantalla de inicio. No olvides inhabilitar esta opción cuando hayas finalizado.</translation>
 <translation id="4558311620361989323">Combinaciones de teclas en páginas web</translation>
-<translation id="4572422548854449519">Inicia sesión en la cuenta administrada</translation>
+<translation id="4572422548854449519">Inicia sesión en la cuenta gestionada</translation>
 <translation id="4581964774250883625">Has iniciado una sesión de incógnito.</translation>
 <translation id="4583164079174244168">{MINUTES,plural, =1{Hace # minuto}other{Hace # minutos}}</translation>
 <translation id="4587589328781138893">Sitios web</translation>
@@ -358,11 +355,10 @@
 <translation id="4915549754973153784"><ph name="BEGIN_LINK" />Obtener ayuda<ph name="END_LINK" /> mientras se buscan dispositivos…</translation>
 <translation id="4943872375798546930">Sin resultados</translation>
 <translation id="4958708863221495346">Estás compartiendo tu pantalla a través de <ph name="URL_OF_THE_CURRENT_TAB" /></translation>
-<translation id="4961700429721424617">Estás cerrando sesión en una cuenta administrada por <ph name="MANAGED_DOMAIN" />. Tus datos de Chrome se eliminarán de este dispositivo, pero permanecerán en tu cuenta de Google.</translation>
+<translation id="4961700429721424617">Estás cerrando sesión en una cuenta gestionada por <ph name="MANAGED_DOMAIN" />. Tus datos de Chrome se eliminarán de este dispositivo, pero permanecerán en tu cuenta de Google.</translation>
 <translation id="497421865427891073">Avanzar</translation>
 <translation id="4988526792673242964">Páginas</translation>
 <translation id="4996978546172906250">Compartir a través de</translation>
-<translation id="5000922062037820727">Bloqueado (recomendado)</translation>
 <translation id="5004339818306944878">Reduce el uso de datos hasta en un 60% y mejora la velocidad de la Web. Los servidores de Google optimizarán las páginas que visites.</translation>
 <translation id="5005498671520578047">Copiar contraseña</translation>
 <translation id="5011311129201317034"><ph name="SITE" /> quiere conectarse</translation>
@@ -403,7 +399,6 @@
 <translation id="5335288049665977812">Permitir que los sitios web utilicen JavaScript (recomendado)</translation>
 <translation id="5345040418939504969">Se ha eliminado <ph name="BOOKMARK_TITLE" /></translation>
 <translation id="5345083863238459644">El acceso a la ubicación también está <ph name="BEGIN_LINK" />desactivado en este dispositivo<ph name="END_LINK" />.</translation>
-<translation id="5349103022427743704">Experimento mejorado Añadir a la pantalla de inicio</translation>
 <translation id="5372829067651257087">Se ha copiado la URL.</translation>
 <translation id="5384883051496921101">Este sitio web va a compartir información con una aplicación con la que no se utilizará el modo incógnito.</translation>
 <translation id="5400569084694353794">Al utilizar esta aplicación, aceptas las <ph name="BEGIN_LINK1" />Condiciones de Servicio<ph name="END_LINK1" /> y el <ph name="BEGIN_LINK2" />Aviso de Privacidad<ph name="END_LINK2" /> de Chrome.</translation>
@@ -654,7 +649,6 @@
 <translation id="7929962904089429003">Abre el menú</translation>
 <translation id="7942131818088350342"><ph name="PRODUCT_NAME" /> está obsoleto.</translation>
 <translation id="7947953824732555851">Aceptar y acceder</translation>
-<translation id="7949961459945740081">Obtener las últimas funciones</translation>
 <translation id="7963646190083259054">Proveedor:</translation>
 <translation id="7987073022710626672">Condiciones de Servicio de Chrome</translation>
 <translation id="7998918019931843664">Volver a abrir pestaña cerrada</translation>
@@ -665,7 +659,6 @@
 <translation id="8015452622527143194">Restaura el tamaño predeterminado del contenido</translation>
 <translation id="802154636333426148">No se ha podido descargar el archivo</translation>
 <translation id="8026334261755873520">Borrar datos de navegación</translation>
-<translation id="8033827949643255796">seleccionados</translation>
 <translation id="8035133914807600019">Nueva carpeta…</translation>
 <translation id="8037750541064988519">Quedan <ph name="DAYS" /> días</translation>
 <translation id="8051695050440594747"><ph name="MEGABYTES" /> MB disponible(s)</translation>
@@ -753,7 +746,7 @@
 <translation id="8981454092730389528">Controles de la actividad de tu cuenta de Google</translation>
 <translation id="8986494364107987395">Enviar automáticamente estadísticas de uso e informes sobre fallos a Google</translation>
 <translation id="8993760627012879038">Abre una nueva pestaña en modo incógnito</translation>
-<translation id="8998729206196772491">Estás iniciando sesión con una cuenta administrada por <ph name="MANAGED_DOMAIN" />, lo que significa que vas a proporcionar a su administrador el control sobre tus datos de Chrome. Los datos se vincularán de forma permanente a esta cuenta. Si cierras sesión en Chrome, se eliminarán los datos de este dispositivo, pero permanecerán almacenados en tu cuenta de Google.</translation>
+<translation id="8998729206196772491">Estás iniciando sesión con una cuenta gestionada por <ph name="MANAGED_DOMAIN" />, lo que significa que vas a proporcionar a su administrador el control sobre tus datos de Chrome. Los datos se vincularán de forma permanente a esta cuenta. Si cierras sesión en Chrome, se eliminarán los datos de este dispositivo, pero permanecerán almacenados en tu cuenta de Google.</translation>
 <translation id="9019902583201351841">Administrado por tus padres</translation>
 <translation id="9038649477754266430">Utilizar un servicio de predicciones para que las páginas se carguen más rápido</translation>
 <translation id="9050666287014529139">Frase de contraseña</translation>
@@ -771,7 +764,7 @@
 <translation id="9137013805542155359">Mostrar original</translation>
 <translation id="9139068048179869749">Preguntar antes de permitir que los sitios web envíen notificaciones (recomendado)</translation>
 <translation id="9187199695613236444">Vista optimizada para móviles</translation>
-<translation id="9188680907066685419">Cierra sesión en la cuenta administrada</translation>
+<translation id="9188680907066685419">Cierra sesión en la cuenta gestionada</translation>
 <translation id="9206873250291191720">A</translation>
 <translation id="9216841883364897953">Desglose del uso de datos</translation>
 <translation id="9219103736887031265">Imágenes</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_fa.xtb b/chrome/android/java/strings/translations/android_chrome_strings_fa.xtb
index 99d9d0f..2b5759a 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_fa.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_fa.xtb
@@ -116,7 +116,6 @@
 <translation id="2139186145475833000">افزودن به صفحه اصلی</translation>
 <translation id="2146738493024040262">برنامه فوری را باز کنید</translation>
 <translation id="2148716181193084225">امروز</translation>
-<translation id="2154710561487035718">کپی نشانی وب</translation>
 <translation id="2156074688469523661">سایت‌های باقی‌مانده (<ph name="NUMBER_OF_SITES" />)</translation>
 <translation id="219985413780390209">محافظت از شما و دستگاهتان دربرابر سایت‌های خطرناک</translation>
 <translation id="2206488550163399966"><ph name="APP_NAME" />، برنامه وب. <ph name="APP_URL" /></translation>
@@ -218,7 +217,6 @@
 <translation id="3387650086002190359">به‌دلیل خطاهای سیستم فایل، بارگیری <ph name="FILE_NAME" /> انجام نشد.</translation>
 <translation id="3398320232533725830">باز کردن مدیر نشانک‌ها</translation>
 <translation id="3414952576877147120">اندازه:</translation>
-<translation id="3435896845095436175">فعال کردن</translation>
 <translation id="3443221991560634068">تازه‌سازی صفحه کنونی</translation>
 <translation id="3452612588551937789">‏برای دسترسی به نشانک‌ها، گذرواژه‌ها، سابقه و تنظیمات دیگر در همه دستگاه‌هایتان، به سیستم حساب Google خود وارد شوید.</translation>
 <translation id="3487093336331957349">پیشنهادهای جستجو و سایت</translation>
@@ -319,7 +317,6 @@
 <translation id="4522570452068850558">جزئیات</translation>
 <translation id="4526249700380860531">‏مشاهده و مدیریت گذرواژه‌های ذخیره شده در <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation>
 <translation id="4532845899244822526">انتخاب پوشه</translation>
-<translation id="4535858793016067060">‏با روشن کردن «منابع ناشناخته» در تنظیمات امنیت Android، آزمایش «افزودن بهبودیافته به صفحه اصلی» را امتحان کنید. حتماً بعد از امتحان آن، این تنظیم را غیرفعال کنید.</translation>
 <translation id="4558311620361989323">میان‌برهای صفحه وب</translation>
 <translation id="4572422548854449519">به حساب مدیریت‌شده وارد شوید</translation>
 <translation id="4581964774250883625">اکنون در حالت ناشناس هستید.</translation>
@@ -362,7 +359,6 @@
 <translation id="497421865427891073">جلو رفتن</translation>
 <translation id="4988526792673242964">صفحات</translation>
 <translation id="4996978546172906250">اشتراک‌گذاری از طریق</translation>
-<translation id="5000922062037820727">مسدود (توصیه می‌شود)</translation>
 <translation id="5004339818306944878">‏تا ۶۰٪ کمتر داده مصرف کنید و به وب سرعت ببخشید. سرورهای Google صفحاتی را که بازدید می‌کنید بهینه‌سازی می‌کند.</translation>
 <translation id="5005498671520578047">کپی گذرواژه</translation>
 <translation id="5011311129201317034"><ph name="SITE" /> می‌خواهد مرتبط شود</translation>
@@ -403,7 +399,6 @@
 <translation id="5335288049665977812">مجاز کردن همه سایت‌ها برای اجرای جاوااسکریپت (توصیه‌ می‌شود)</translation>
 <translation id="5345040418939504969"><ph name="BOOKMARK_TITLE" /> حذف شد</translation>
 <translation id="5345083863238459644">دسترسی به موقعیت مکانی نیز <ph name="BEGIN_LINK" />برای این دستگاه خاموش است<ph name="END_LINK" />.</translation>
-<translation id="5349103022427743704">آزمایش «افزودن بهبودیافته به صفحه اصلی»</translation>
 <translation id="5372829067651257087">نشانی وب کپی شد.</translation>
 <translation id="5384883051496921101">این سایت می‌خواهد خارج از حالت ناشناس، اطلاعاتی را با برنامه‌ای به اشتراک بگذارد.</translation>
 <translation id="5400569084694353794">‏استفاده از این برنامه به معنای اعلام موافقت شما با <ph name="BEGIN_LINK1" />شرایط خدمات<ph name="END_LINK1" /> و <ph name="BEGIN_LINK2" />اعلامیه حریم خصوصی<ph name="END_LINK2" /> Chrome است.</translation>
@@ -653,7 +648,6 @@
 <translation id="7929962904089429003">باز کردن منو</translation>
 <translation id="7942131818088350342"><ph name="PRODUCT_NAME" /> قدیمی است.</translation>
 <translation id="7947953824732555851">پذیرش و ورود به سیستم</translation>
-<translation id="7949961459945740081">دریافت جدیدترین قابلیت‌ها</translation>
 <translation id="7963646190083259054">ارائه‌دهنده:</translation>
 <translation id="7987073022710626672">‏شرایط خدمات Chrome</translation>
 <translation id="7998918019931843664">بازکردن مجدد برگه‌های بسته شده</translation>
@@ -664,7 +658,6 @@
 <translation id="8015452622527143194">برگرداندن همه‌چیز در صفحه به‌اندازه پیش‌فرض</translation>
 <translation id="802154636333426148">بارگیری نشد</translation>
 <translation id="8026334261755873520">پاک کردن داده‌های مرور</translation>
-<translation id="8033827949643255796">انتخاب شد</translation>
 <translation id="8035133914807600019">پوشه جدید…</translation>
 <translation id="8037750541064988519"><ph name="DAYS" /> روز باقی‌مانده است</translation>
 <translation id="8051695050440594747"><ph name="MEGABYTES" /> مگابایت موجود است</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb b/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb
index 7da6f57..a8ae297e 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb
@@ -65,7 +65,7 @@
 <translation id="1569387923882100876">Yhdistetty laite</translation>
 <translation id="1571304935088121812">Kopioi käyttäjänimi</translation>
 <translation id="1612196535745283361">Chrome tarvitsee sijaintitietoja hakeakseen laitteita. Sijaintitiedot on <ph name="BEGIN_LINK" />poistettu käytöstä tällä laitteella<ph name="END_LINK" />.</translation>
-<translation id="1620510694547887537">kameraasi</translation>
+<translation id="1620510694547887537">Kamera</translation>
 <translation id="1623104350909869708">Estä tätä sivua luomasta muita viestejä</translation>
 <translation id="1628019612362412531">{NUM_SELECTED,plural, =1{Poista 1 valittu kohde}other{Poista # valittua kohdetta}}</translation>
 <translation id="1641113438599504367">Selaussuoja</translation>
@@ -116,7 +116,6 @@
 <translation id="2139186145475833000">Lisää aloitusnäyttöön</translation>
 <translation id="2146738493024040262">Avaa Instant-sovellus</translation>
 <translation id="2148716181193084225">Tänään</translation>
-<translation id="2154710561487035718">Kopioi URL-osoite</translation>
 <translation id="2156074688469523661">Jäljellä olevat sivustot (<ph name="NUMBER_OF_SITES" />)</translation>
 <translation id="219985413780390209">Suojaa itseäsi ja laitettasi vaarallisilta sivustoilta</translation>
 <translation id="2206488550163399966"><ph name="APP_NAME" />, verkkosovellus. <ph name="APP_URL" /></translation>
@@ -198,7 +197,7 @@
 <translation id="3198916472715691905"><ph name="STORAGE_AMOUNT" /> tallennettua tietoa</translation>
 <translation id="3207960819495026254">Kirjanmerkeissä</translation>
 <translation id="321773570071367578">Jos unohdat tunnuslauseesi tai haluat muokata tätä asetusta, <ph name="BEGIN_LINK" />nollaa synkronointi<ph name="END_LINK" />.</translation>
-<translation id="3227137524299004712">mikrofoniasi</translation>
+<translation id="3227137524299004712">Mikrofoni</translation>
 <translation id="3232754137068452469">Verkkosovellus</translation>
 <translation id="3236059992281584593">1 minuutti jäljellä</translation>
 <translation id="3244271242291266297">KK</translation>
@@ -218,7 +217,6 @@
 <translation id="3387650086002190359">Tiedoston <ph name="FILE_NAME" /> lataus epäonnistui tiedostojärjestelmävirheen vuoksi.</translation>
 <translation id="3398320232533725830">Avaa kirjanmerkkien hallinta</translation>
 <translation id="3414952576877147120">Koko:</translation>
-<translation id="3435896845095436175">Ota käyttöön</translation>
 <translation id="3443221991560634068">Päivitä nykyinen sivu</translation>
 <translation id="3452612588551937789">Kirjaudu Google-tilillesi, niin voit käyttää kirjanmerkkejäsi, historiaasi, salasanojasi ja muita asetuksiasi kaikilla laitteillasi.</translation>
 <translation id="3487093336331957349">Haku- ja sivustoehdotukset</translation>
@@ -319,7 +317,6 @@
 <translation id="4522570452068850558">Tiedot</translation>
 <translation id="4526249700380860531">Tarkastele ja hallinnoi tallennettuja salasanoja osoitteessa <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation>
 <translation id="4532845899244822526">Valitse kansio</translation>
-<translation id="4535858793016067060">Ota käyttöön ”Tuntemattomat lähteet” Androidin suojausasetuksissa, jos haluat kokeilla Parannettu aloitusnäyttöön lisääminen ‑ominaisuutta. Muista poistaa tämä asetus käytöstä, kun olet kokeillut sitä tarpeeksi.</translation>
 <translation id="4558311620361989323">Verkkosivun pikanäppäimet</translation>
 <translation id="4572422548854449519">Kirjaudu hallinnoidulle tilille</translation>
 <translation id="4581964774250883625">Olet siirtynyt incognito-tilaan.</translation>
@@ -362,7 +359,6 @@
 <translation id="497421865427891073">Siirry eteenpäin</translation>
 <translation id="4988526792673242964">Sivut</translation>
 <translation id="4996978546172906250">Jaa tällä palvelulla:</translation>
-<translation id="5000922062037820727">Estetty (suositus)</translation>
 <translation id="5004339818306944878">Vähennä datankäyttöä 60 % ja selaa verkkoa nopeammin. Googlen palvelimet optimoivat sivut, joilla käyt.</translation>
 <translation id="5005498671520578047">Kopioi salasana</translation>
 <translation id="5011311129201317034"><ph name="SITE" /> haluaa muodostaa yhteyden</translation>
@@ -403,7 +399,6 @@
 <translation id="5335288049665977812">Anna kaikkien sivustojen käyttää JavaScriptiä (suositus).</translation>
 <translation id="5345040418939504969"><ph name="BOOKMARK_TITLE" /> poistettiin.</translation>
 <translation id="5345083863238459644">Sijaintitiedot on <ph name="BEGIN_LINK" />poistettu käytöstä myös tässä laitteessa<ph name="END_LINK" />.</translation>
-<translation id="5349103022427743704">Parannettu aloitusnäyttöön lisääminen ‑kokeilu</translation>
 <translation id="5372829067651257087">URL-osoite kopioitu</translation>
 <translation id="5384883051496921101">Tämä sivusto aikoo jakaa tietoja sovellukselle incognito-tilan ulkopuolella.</translation>
 <translation id="5400569084694353794">Käyttämällä sovellusta hyväksyt Chromen <ph name="BEGIN_LINK1" />käyttöehdot<ph name="END_LINK1" /> ja <ph name="BEGIN_LINK2" />tietosuojailmoituksen<ph name="END_LINK2" />.</translation>
@@ -654,7 +649,6 @@
 <translation id="7929962904089429003">Avaa valikko</translation>
 <translation id="7942131818088350342"><ph name="PRODUCT_NAME" /> on vanhentunut.</translation>
 <translation id="7947953824732555851">Hyväksy ja kirjaudu sisään</translation>
-<translation id="7949961459945740081">Lataa uusimmat ominaisuudet</translation>
 <translation id="7963646190083259054">Toimittaja:</translation>
 <translation id="7987073022710626672">Chromen käyttöehdot</translation>
 <translation id="7998918019931843664">Avaa suljettu välilehti uudelleen</translation>
@@ -665,7 +659,6 @@
 <translation id="8015452622527143194">Palauta sivun kaiken sisällön oletuskoko</translation>
 <translation id="802154636333426148">Lataus epäonnistui.</translation>
 <translation id="8026334261755873520">Poista selaustiedot</translation>
-<translation id="8033827949643255796">valittu</translation>
 <translation id="8035133914807600019">Uusi kansio…</translation>
 <translation id="8037750541064988519"><ph name="DAYS" /> päivää jäljellä</translation>
 <translation id="8051695050440594747"><ph name="MEGABYTES" /> Mt käytettävissä</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb b/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb
index 8bb224da..80a6023 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb
@@ -116,7 +116,6 @@
 <translation id="2139186145475833000">Magdagdag sa Home screen</translation>
 <translation id="2146738493024040262">Buksan ang Instant App</translation>
 <translation id="2148716181193084225">Ngayon</translation>
-<translation id="2154710561487035718">Kopyahin ang URL</translation>
 <translation id="2156074688469523661">Mga natitirang site (<ph name="NUMBER_OF_SITES" />)</translation>
 <translation id="219985413780390209">Protektahan ang iyong sarili at ang iyong device mula sa mga mapanganib na site</translation>
 <translation id="2206488550163399966"><ph name="APP_NAME" />, web app. <ph name="APP_URL" /></translation>
@@ -218,7 +217,6 @@
 <translation id="3387650086002190359">Hindi na-download ang <ph name="FILE_NAME" /> dahil sa mga error sa file system.</translation>
 <translation id="3398320232533725830">Buksan ang bookmarks manager</translation>
 <translation id="3414952576877147120">Laki:</translation>
-<translation id="3435896845095436175">I-enable</translation>
 <translation id="3443221991560634068">I-reload ang kasalukuyang page</translation>
 <translation id="3452612588551937789">Mag-sign in sa iyong Google Account upang makuha ang iyong mga bookmark, history, password at iba pang mga setting sa lahat ng iyong device.</translation>
 <translation id="3487093336331957349">Mga mungkahi sa paghahanap at site</translation>
@@ -319,7 +317,6 @@
 <translation id="4522570452068850558">Mga Detalye</translation>
 <translation id="4526249700380860531">Tingnan at pamahalaan ang mga naka-save na password sa <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation>
 <translation id="4532845899244822526">Pumili ng folder</translation>
-<translation id="4535858793016067060">I-on ang “Mga hindi kilalang pinagmulan” sa Mga setting ng seguridad ng Android upang masubukan ang eksperimentong "Pinahusay na Idagdag sa Home screen." Tiyaking idi-disable mo ang setting na ito kapag tapos mo na itong subukan.</translation>
 <translation id="4558311620361989323">Mga shortcut ng webpage</translation>
 <translation id="4572422548854449519">Mag-sign in sa pinamamahalaang account</translation>
 <translation id="4581964774250883625">Naging incognito ka.</translation>
@@ -362,7 +359,6 @@
 <translation id="497421865427891073">Sumulong</translation>
 <translation id="4988526792673242964">Mga Page</translation>
 <translation id="4996978546172906250">Ibahagi gamit ang</translation>
-<translation id="5000922062037820727">Naka-block (inirerekomenda)</translation>
 <translation id="5004339818306944878">Makatipid ng hanggang 60% ng data at pabilisin ang web. Io-optimize ng mga server ng Google ang mga page na binibisita mo.</translation>
 <translation id="5005498671520578047">Kopyahin password</translation>
 <translation id="5011311129201317034">Gustong kumonekta ng <ph name="SITE" /></translation>
@@ -403,7 +399,6 @@
 <translation id="5335288049665977812">Payagan ang mga site na magpatakbo ng JavaScript (inirerekomenda)</translation>
 <translation id="5345040418939504969">Na-delete ang <ph name="BOOKMARK_TITLE" /></translation>
 <translation id="5345083863238459644">Ang access sa lokasyon ay <ph name="BEGIN_LINK" />naka-off din para sa device na ito<ph name="END_LINK" />.</translation>
-<translation id="5349103022427743704">Eksperimentong Pinahusay na Idagdag sa Home screen</translation>
 <translation id="5372829067651257087">Kinopya ang URL.</translation>
 <translation id="5384883051496921101">Magbabahagi ang site na ito ng impormasyon sa isang app sa labas ng incognito mode.</translation>
 <translation id="5400569084694353794">Kapag ginamit mo ang application na ito, ang ibig sabihin, sumasang-ayon ka sa <ph name="BEGIN_LINK1" />Mga Tuntunin ng Serbisyo<ph name="END_LINK1" /> at <ph name="BEGIN_LINK2" />Patakaran sa Privacy<ph name="END_LINK2" /> ng Chrome.</translation>
@@ -654,7 +649,6 @@
 <translation id="7929962904089429003">Buksan ang menu</translation>
 <translation id="7942131818088350342">Luma na ang <ph name="PRODUCT_NAME" />.</translation>
 <translation id="7947953824732555851">I-accept, mag-sign in</translation>
-<translation id="7949961459945740081">Kunin ang pinakabagong feature</translation>
 <translation id="7963646190083259054">Vendor:</translation>
 <translation id="7987073022710626672">Mga Tuntunin ng Serbisyo ng Chrome</translation>
 <translation id="7998918019931843664">Muling buksan ang isinarang tab</translation>
@@ -665,7 +659,6 @@
 <translation id="8015452622527143194">Ibalik ang lahat ng nasa page sa default na sukat</translation>
 <translation id="802154636333426148">Hindi na-download</translation>
 <translation id="8026334261755873520">I-clear ang data ng pagba-browse</translation>
-<translation id="8033827949643255796">pinili</translation>
 <translation id="8035133914807600019">Bagong folder…</translation>
 <translation id="8037750541064988519"><ph name="DAYS" /> (na) araw na lang ang natitira</translation>
 <translation id="8051695050440594747">Available ang <ph name="MEGABYTES" /> MB</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb b/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb
index d314a709..c236ba5 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb
@@ -116,7 +116,6 @@
 <translation id="2139186145475833000">Ajouter à l'écran d'accueil</translation>
 <translation id="2146738493024040262">Ouvrir l'appli instantanée</translation>
 <translation id="2148716181193084225">Aujourd'hui</translation>
-<translation id="2154710561487035718">Copier l'URL</translation>
 <translation id="2156074688469523661">Sites restants (<ph name="NUMBER_OF_SITES" />)</translation>
 <translation id="219985413780390209">Assurer votre protection et celle de votre appareil contre les sites dangereux</translation>
 <translation id="2206488550163399966"><ph name="APP_NAME" />, application Web : <ph name="APP_URL" /></translation>
@@ -218,7 +217,6 @@
 <translation id="3387650086002190359">Échec du téléchargement du fichier "<ph name="FILE_NAME" />" en raison d'erreurs liées au système de fichiers.</translation>
 <translation id="3398320232533725830">Ouvrir le gestionnaire de favoris</translation>
 <translation id="3414952576877147120">Taille :</translation>
-<translation id="3435896845095436175">Activer</translation>
 <translation id="3443221991560634068">Actualiser la page active</translation>
 <translation id="3452612588551937789">Connectez-vous à votre compte Google pour synchroniser vos favoris, vos mots de passe, votre historique et d'autres paramètres sur tous vos appareils.</translation>
 <translation id="3487093336331957349">Suggestions de recherches et de sites</translation>
@@ -319,7 +317,6 @@
 <translation id="4522570452068850558">Détails</translation>
 <translation id="4526249700380860531">Afficher et gérer les mots de passe enregistrés sur <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation>
 <translation id="4532845899244822526">Sélectionner un dossier</translation>
-<translation id="4535858793016067060">Activez l'option "Sources inconnues" dans les paramètres de sécurité d'Android pour tester l'écran "Ajouter sur la page d'accueil" amélioré. N'oubliez pas de désactiver ce paramètre lorsque vous avez terminé le test.</translation>
 <translation id="4558311620361989323">Raccourcis de pages Web</translation>
 <translation id="4572422548854449519">Se connecter à un compte géré</translation>
 <translation id="4581964774250883625">Vous êtes passé en mode navigation privée</translation>
@@ -362,7 +359,6 @@
 <translation id="497421865427891073">Avancer</translation>
 <translation id="4988526792673242964">Pages</translation>
 <translation id="4996978546172906250">Partager via</translation>
-<translation id="5000922062037820727">Bloquée (recommandé)</translation>
 <translation id="5004339818306944878">Utilisez jusqu'à 60 % de données en moins et naviguez plus rapidement sur le Web. Grâce aux serveurs Google, les pages que vous consultez sont optimisées.</translation>
 <translation id="5005498671520578047">Copier mot de passe</translation>
 <translation id="5011311129201317034"><ph name="SITE" /> tente de se connecter</translation>
@@ -403,7 +399,6 @@
 <translation id="5335288049665977812">Autoriser les sites à exécuter JavaScript (recommandé)</translation>
 <translation id="5345040418939504969">Le favori "<ph name="BOOKMARK_TITLE" />" a été supprimé.</translation>
 <translation id="5345083863238459644">L'accès aux données de localisation est également <ph name="BEGIN_LINK" />désactivé pour cet appareil<ph name="END_LINK" />.</translation>
-<translation id="5349103022427743704">Écran "Ajouter à la page d'accueil" amélioré</translation>
 <translation id="5372829067651257087">L'URL a bien été copiée.</translation>
 <translation id="5384883051496921101">Ce site s'apprête à partager des informations avec une application en dehors du mode navigation privée.</translation>
 <translation id="5400569084694353794">En utilisant cette application, vous acceptez les <ph name="BEGIN_LINK1" />Conditions d'utilisation<ph name="END_LINK1" /> et l'<ph name="BEGIN_LINK2" />Avis de confidentialité<ph name="END_LINK2" /> de Chrome.</translation>
@@ -654,7 +649,6 @@
 <translation id="7929962904089429003">Ouvrir le menu</translation>
 <translation id="7942131818088350342"><ph name="PRODUCT_NAME" /> est obsolète.</translation>
 <translation id="7947953824732555851">Accepter/Se connecter</translation>
-<translation id="7949961459945740081">Obtenir dernières fonctionnalités</translation>
 <translation id="7963646190083259054">Fournisseur :</translation>
 <translation id="7987073022710626672">Conditions d'utilisation de Chrome</translation>
 <translation id="7998918019931843664">Rouvrir un onglet fermé</translation>
@@ -665,7 +659,6 @@
 <translation id="8015452622527143194">Rétablir taille par défaut des éléments de la page</translation>
 <translation id="802154636333426148">Échec du téléchargement</translation>
 <translation id="8026334261755873520">Effacer les données de navigation</translation>
-<translation id="8033827949643255796">sélectionné</translation>
 <translation id="8035133914807600019">Nouveau dossier…</translation>
 <translation id="8037750541064988519"><ph name="DAYS" /> jours restants</translation>
 <translation id="8051695050440594747"><ph name="MEGABYTES" /> Mo disponibles</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb b/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb
index 73dbcc3..f25d0a0 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb
@@ -116,7 +116,6 @@
 <translation id="2139186145475833000">होम स्क्रीन में जोड़ें</translation>
 <translation id="2146738493024040262">झटपट ऐप्लिकेशन खोलें</translation>
 <translation id="2148716181193084225">आज</translation>
-<translation id="2154710561487035718">URL की प्रतिलिपि बनाएं</translation>
 <translation id="2156074688469523661">बाकी साइटें (<ph name="NUMBER_OF_SITES" />)</translation>
 <translation id="219985413780390209">खतरनाक साइटों से आपकी और आपके डिवाइस की सुरक्षा करता है</translation>
 <translation id="2206488550163399966"><ph name="APP_NAME" />, वेब ऐप. <ph name="APP_URL" /></translation>
@@ -218,7 +217,6 @@
 <translation id="3387650086002190359">सिस्‍टम त्रुटियों के कारण <ph name="FILE_NAME" /> डाउनलोड विफल रहा.</translation>
 <translation id="3398320232533725830">बुकमार्क प्रबंधक खोलें</translation>
 <translation id="3414952576877147120">आकार:</translation>
-<translation id="3435896845095436175">सक्षम करें</translation>
 <translation id="3443221991560634068">वर्तमान पेज फिर से लोड करें</translation>
 <translation id="3452612588551937789">अपने सभी डिवाइस पर अपने बुकमार्क, इतिहास, पासवर्ड और अन्य सेटिंग प्राप्त करने के लिए अपने Google खाते से प्रवेश करें.</translation>
 <translation id="3487093336331957349">खोज और साइट सुझाव</translation>
@@ -319,7 +317,6 @@
 <translation id="4522570452068850558">विवरण</translation>
 <translation id="4526249700380860531">सहेजे गए पासवर्ड <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /> पर देखें और प्रबंधित करें</translation>
 <translation id="4532845899244822526">फ़ोल्डर चुनें</translation>
-<translation id="4535858793016067060">"बेहतर होम स्‍क्रीन में जोड़ें" प्रयोग आज़माने के लिए Android सुरक्षा सेटिंग में “अज्ञात स्रोत” चालू करें. इसे आज़मा लेने के बाद यह सेटिंग अक्षम करना सुनिश्चित करें.</translation>
 <translation id="4558311620361989323">वेबपेज शॉर्टकट</translation>
 <translation id="4572422548854449519">प्रबंधित खाते में प्रवेश करें</translation>
 <translation id="4581964774250883625">आप गुप्त मोड में चले गए हैं.</translation>
@@ -362,7 +359,6 @@
 <translation id="497421865427891073">आगे जाएं</translation>
 <translation id="4988526792673242964">पेज</translation>
 <translation id="4996978546172906250">इसके द्वारा साझा करें</translation>
-<translation id="5000922062037820727">अवरोधित (सुझाया गया)</translation>
 <translation id="5004339818306944878">60% कम डेटा का उपयोग करके वेब में तेज़ी लाएं. Google सर्वर उन पेज को अनुकूलित करेंगे जिन पर आप विज़िट करते हैं.</translation>
 <translation id="5005498671520578047">पासवर्ड कॉपी करें</translation>
 <translation id="5011311129201317034"><ph name="SITE" /> कनेक्ट करना चाहती है</translation>
@@ -403,7 +399,6 @@
 <translation id="5335288049665977812">साइट को JavaScript चलाने की अनुमति दें (अनुशंसित)</translation>
 <translation id="5345040418939504969"><ph name="BOOKMARK_TITLE" /> हटाया गया</translation>
 <translation id="5345083863238459644">स्थान ऐक्सेस को भी <ph name="BEGIN_LINK" />इस डिवाइस के लिए बंद कर दिया गया है<ph name="END_LINK" />.</translation>
-<translation id="5349103022427743704">बेहतर होम स्‍क्रीन में जोड़ें प्रयोग</translation>
 <translation id="5372829067651257087">URL की कॉपी की गई.</translation>
 <translation id="5384883051496921101">यह साइट गुप्त मोड से बाहर के ऐप्लिकेशन के साथ जानकारी साझा करने वाली है.</translation>
 <translation id="5400569084694353794">इस ऐप्‍लिकेशन का उपयाेग करके, आप Chrome की <ph name="BEGIN_LINK1" />सेवा की शर्तों<ph name="END_LINK1" /> और <ph name="BEGIN_LINK2" />निजता नोटिस<ph name="END_LINK2" /> से सहमत होते हैं.</translation>
@@ -654,7 +649,6 @@
 <translation id="7929962904089429003">मेनू खोलें</translation>
 <translation id="7942131818088350342"><ph name="PRODUCT_NAME" /> पुराना है.</translation>
 <translation id="7947953824732555851">स्वीकार करें और प्रवेश करें</translation>
-<translation id="7949961459945740081">नवीनतम सुविधाएं प्राप्त करें</translation>
 <translation id="7963646190083259054">विक्रेता:</translation>
 <translation id="7987073022710626672">Chrome सेवा की शर्तें</translation>
 <translation id="7998918019931843664">बंद टैब फिर से खोलें</translation>
@@ -665,7 +659,6 @@
 <translation id="8015452622527143194">पेज पर सब कुछ वापस डिफ़ॉल्ट आकार में लाएं</translation>
 <translation id="802154636333426148">डाउनलोड विफल रहा</translation>
 <translation id="8026334261755873520">ब्राउज़िंग डेटा साफ़ करें</translation>
-<translation id="8033827949643255796">चयनित</translation>
 <translation id="8035133914807600019">नया फ़ोल्‍डर…</translation>
 <translation id="8037750541064988519"><ph name="DAYS" /> दिन शेष</translation>
 <translation id="8051695050440594747"><ph name="MEGABYTES" /> MB उपलब्ध</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_hr.xtb b/chrome/android/java/strings/translations/android_chrome_strings_hr.xtb
index a5d2d90..d778287 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_hr.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_hr.xtb
@@ -116,7 +116,6 @@
 <translation id="2139186145475833000">Dodaj na početni zaslon</translation>
 <translation id="2146738493024040262">Otvori instant aplikaciju</translation>
 <translation id="2148716181193084225">Danas</translation>
-<translation id="2154710561487035718">Kopiraj URL</translation>
 <translation id="2156074688469523661">Preostale web-lokacije (<ph name="NUMBER_OF_SITES" />)</translation>
 <translation id="219985413780390209">Zaštitite sebe i svoj uređaj od opasnih web-lokacija</translation>
 <translation id="2206488550163399966"><ph name="APP_NAME" />, web-aplikacija. <ph name="APP_URL" /></translation>
@@ -218,7 +217,6 @@
 <translation id="3387650086002190359">Preuzimanje datoteke <ph name="FILE_NAME" /> nije uspjelo zbog nepoznate pogreške sustava datoteka.</translation>
 <translation id="3398320232533725830">Otvaranje upravitelja oznaka</translation>
 <translation id="3414952576877147120">Veličina:</translation>
-<translation id="3435896845095436175">Omogući</translation>
 <translation id="3443221991560634068">Ponovno učitavanje trenutačne stranice</translation>
 <translation id="3452612588551937789">Prijavite se Google računom da biste pristupali svojim oznakama, zaporkama, povijesti i ostalim postavkama na svim svojim uređajima.</translation>
 <translation id="3487093336331957349">Prijedlozi pretraživanja i web-lokacija</translation>
@@ -319,7 +317,6 @@
 <translation id="4522570452068850558">Detalji</translation>
 <translation id="4526249700380860531">Prikaz spremljenih zaporki i upravljanje njima na <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation>
 <translation id="4532845899244822526">Odabir mape</translation>
-<translation id="4535858793016067060">Uključite opciju "Nepoznati izvori" u sigurnosnim postavkama Androida da biste isprobali eksperiment "Poboljšano dodavanje na početni zaslon". Obavezno onemogućite tu postavku nakon što je isprobate.</translation>
 <translation id="4558311620361989323">Prečaci web-stranice</translation>
 <translation id="4572422548854449519">Prijava na upravljani račun</translation>
 <translation id="4581964774250883625">Sada ste u anonimnom načinu.</translation>
@@ -362,7 +359,6 @@
 <translation id="497421865427891073">Idi naprijed</translation>
 <translation id="4988526792673242964">Stranice</translation>
 <translation id="4996978546172906250">Dijeli putem</translation>
-<translation id="5000922062037820727">Blokirano (preporučeno)</translation>
 <translation id="5004339818306944878">Trošite do 60% manje podataka i ubrzajte web. Googleovi poslužitelji optimizirat će stranice koje posjećujete.</translation>
 <translation id="5005498671520578047">Kopiranje zaporke</translation>
 <translation id="5011311129201317034">Web-lokacija <ph name="SITE" /> želi se povezati</translation>
@@ -403,7 +399,6 @@
 <translation id="5335288049665977812">Web-lokacije mogu pokretati JavaScript (preporučeno)</translation>
 <translation id="5345040418939504969">Izbrisana je oznaka <ph name="BOOKMARK_TITLE" /></translation>
 <translation id="5345083863238459644">Pristup lokaciji <ph name="BEGIN_LINK" />isključen je i za ovaj uređaj<ph name="END_LINK" />.</translation>
-<translation id="5349103022427743704">Eksperiment Poboljšano dodavanje na početni zaslon</translation>
 <translation id="5372829067651257087">URL je kopiran.</translation>
 <translation id="5384883051496921101">Ova će web-lokacija dijeliti podatke s aplikacijom izvan anonimnog načina.</translation>
 <translation id="5400569084694353794">Upotrebom te aplikacije prihvaćate Chromeove <ph name="BEGIN_LINK1" />Uvjete pružanja usluge<ph name="END_LINK1" /> i <ph name="BEGIN_LINK2" />Obavijest o privatnosti<ph name="END_LINK2" />.</translation>
@@ -654,7 +649,6 @@
 <translation id="7929962904089429003">Otvaranje izbornika</translation>
 <translation id="7942131818088350342">Proizvod <ph name="PRODUCT_NAME" /> zastario je.</translation>
 <translation id="7947953824732555851">Prihv. i prijavi se</translation>
-<translation id="7949961459945740081">Nabavite najnovije značajke</translation>
 <translation id="7963646190083259054">Dobavljač:</translation>
 <translation id="7987073022710626672">Chromeovi uvjeti pružanja usluge</translation>
 <translation id="7998918019931843664">Ponovno otvaranje zatvorene kartice</translation>
@@ -665,7 +659,6 @@
 <translation id="8015452622527143194">Vraćanje svega na stranici na zadanu veličinu</translation>
 <translation id="802154636333426148">Preuzimanje nije uspjelo</translation>
 <translation id="8026334261755873520">Brisanje podataka o pregledavanju</translation>
-<translation id="8033827949643255796">odabrano</translation>
 <translation id="8035133914807600019">Nova mapa…</translation>
 <translation id="8037750541064988519">Preostalo dana: <ph name="DAYS" /></translation>
 <translation id="8051695050440594747"><ph name="MEGABYTES" /> MB dostupno</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_hu.xtb b/chrome/android/java/strings/translations/android_chrome_strings_hu.xtb
index 6c79165d..c1dee65 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_hu.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_hu.xtb
@@ -116,7 +116,6 @@
 <translation id="2139186145475833000">Hozzáadás kezdőképernyőhöz</translation>
 <translation id="2146738493024040262">Azonnali alkalmazás megnyitása</translation>
 <translation id="2148716181193084225">Ma</translation>
-<translation id="2154710561487035718">URL másolása</translation>
 <translation id="2156074688469523661">A többi webhely (<ph name="NUMBER_OF_SITES" />)</translation>
 <translation id="219985413780390209">Védje meg magát és eszközét a veszélyes webhelyektől</translation>
 <translation id="2206488550163399966"><ph name="APP_NAME" />, internetes alkalmazás. <ph name="APP_URL" /></translation>
@@ -218,7 +217,6 @@
 <translation id="3387650086002190359">A következő fájl letöltése a fájlrendszer hibái miatt nem sikerült: <ph name="FILE_NAME" />.</translation>
 <translation id="3398320232533725830">A Könyvjelzőkezelő megnyitása</translation>
 <translation id="3414952576877147120">Méret:</translation>
-<translation id="3435896845095436175">Engedélyezés</translation>
 <translation id="3443221991560634068">Az aktuális oldal újratöltése</translation>
 <translation id="3452612588551937789">Jelentkezzen be Google-fiókjába, hogy könyvjelzőit, előzményeit, jelszavait és más beállításait az összes eszközén elérhesse.</translation>
 <translation id="3487093336331957349">Keresési és webhelyjavaslatok</translation>
@@ -319,7 +317,6 @@
 <translation id="4522570452068850558">Részletek</translation>
 <translation id="4526249700380860531">A mentett jelszavak megtekintése és kezelése a <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /> címen</translation>
 <translation id="4532845899244822526">Mappa kiválasztása</translation>
-<translation id="4535858793016067060">A „Továbbfejlesztett Hozzáadás a főoldalhoz” kísérlet kipróbálásához engedélyezze az „Ismeretlen források” lehetőséget az Android biztonsági beállításokban. Ne felejtse el kikapcsolni ezt a beállítást, miután végzett a kipróbálással.</translation>
 <translation id="4558311620361989323">Weboldalakkal kapcsolatos billentyűparancsok</translation>
 <translation id="4572422548854449519">Bejelentkezés a kezelt fiókba</translation>
 <translation id="4581964774250883625">Ön inkognitómódra váltott.</translation>
@@ -362,7 +359,6 @@
 <translation id="497421865427891073">Előrelépés</translation>
 <translation id="4988526792673242964">Oldal</translation>
 <translation id="4996978546172906250">Megosztás itt:</translation>
-<translation id="5000922062037820727">Letiltva (ajánlott)</translation>
 <translation id="5004339818306944878">Akár 60%-kal kevesebb adatot használhat, és ezzel gyorsabbá válik az internet. A Google szerverei optimalizálni fogják az Ön által felkeresett oldalakat.</translation>
 <translation id="5005498671520578047">Jelszó másolása</translation>
 <translation id="5011311129201317034">A(z) <ph name="SITE" /> csatlakozni szeretne</translation>
@@ -403,7 +399,6 @@
 <translation id="5335288049665977812">Engedélyezze a webhelyek számára a JavaScript futtatását (ajánlott)</translation>
 <translation id="5345040418939504969"><ph name="BOOKMARK_TITLE" /> törölve</translation>
 <translation id="5345083863238459644">A helyadatokhoz való hozzáférés is <ph name="BEGIN_LINK" />ki van kapcsolva ezen az eszközön<ph name="END_LINK" />.</translation>
-<translation id="5349103022427743704">„Továbbfejlesztett Hozzáadás a főoldalhoz” kísérlet</translation>
 <translation id="5372829067651257087">URL kimásolva.</translation>
 <translation id="5384883051496921101">A webhely adatokat kíván megosztani az inkognitómódon kívüli alkalmazással.</translation>
 <translation id="5400569084694353794">Az alkalmazás használatával Ön elfogadja a Chrome <ph name="BEGIN_LINK1" />Általános Szerződési Feltételeit<ph name="END_LINK1" /> és az <ph name="BEGIN_LINK2" />Adatvédelmi közleményt<ph name="END_LINK2" />.</translation>
@@ -654,7 +649,6 @@
 <translation id="7929962904089429003">A menü megnyitása</translation>
 <translation id="7942131818088350342">A(z) <ph name="PRODUCT_NAME" /> elavult.</translation>
 <translation id="7947953824732555851">Elfogadás és bejelentkezés</translation>
-<translation id="7949961459945740081">A legújabb funkciók megszerzése</translation>
 <translation id="7963646190083259054">Szolgáltató:</translation>
 <translation id="7987073022710626672">Chrome – Általános Szerződési Feltételek</translation>
 <translation id="7998918019931843664">Bezárt lap megnyitása</translation>
@@ -665,7 +659,6 @@
 <translation id="8015452622527143194">Minden visszaállítása alapértelmezett méretűre</translation>
 <translation id="802154636333426148">Nem sikerült a letöltés</translation>
 <translation id="8026334261755873520">Böngészési adatok törlése</translation>
-<translation id="8033827949643255796">kijelölve</translation>
 <translation id="8035133914807600019">Új mappa…</translation>
 <translation id="8037750541064988519"><ph name="DAYS" /> nap van hátra</translation>
 <translation id="8051695050440594747"><ph name="MEGABYTES" /> MB áll rendelkezésre</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_id.xtb b/chrome/android/java/strings/translations/android_chrome_strings_id.xtb
index 08a01493..478129e 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_id.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_id.xtb
@@ -116,7 +116,6 @@
 <translation id="2139186145475833000">Tambahkan ke Layar Utama</translation>
 <translation id="2146738493024040262">Buka Aplikasi Instan</translation>
 <translation id="2148716181193084225">Hari ini</translation>
-<translation id="2154710561487035718">Salin URL</translation>
 <translation id="2156074688469523661">Situs yang tersisa (<ph name="NUMBER_OF_SITES" />)</translation>
 <translation id="219985413780390209">Lindungi perangkat dan diri Anda dari situs berbahaya</translation>
 <translation id="2206488550163399966"><ph name="APP_NAME" />, aplikasi web. <ph name="APP_URL" /></translation>
@@ -218,7 +217,6 @@
 <translation id="3387650086002190359">Download <ph name="FILE_NAME" /> gagal karena kesalahan sistem file.</translation>
 <translation id="3398320232533725830">Membuka pengelola bookmark</translation>
 <translation id="3414952576877147120">Ukuran:</translation>
-<translation id="3435896845095436175">Aktifkan</translation>
 <translation id="3443221991560634068">Memuat ulang halaman saat ini</translation>
 <translation id="3452612588551937789">Masuk dengan Akun Google untuk mendapatkan bookmark, sandi, riwayat, dan setelan lainnya di semua perangkat Anda.</translation>
 <translation id="3487093336331957349">Saran situs dan penelusuran</translation>
@@ -319,7 +317,6 @@
 <translation id="4522570452068850558">Detail</translation>
 <translation id="4526249700380860531">Melihat dan mengelola sandi yang tersimpan di <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation>
 <translation id="4532845899244822526">Pilih folder</translation>
-<translation id="4535858793016067060">Aktifkan “Sumber tidak dikenal” di setelan keamanan Android untuk mencoba eksperimen "Tambah ke layar Utama yang Disempurnakan". Pastikan untuk menonaktifkan setelan ini setelah Anda mencobanya.</translation>
 <translation id="4558311620361989323">Pintasan halaman web</translation>
 <translation id="4572422548854449519">Masuk ke akun yang dikelola</translation>
 <translation id="4581964774250883625">Anda masuk mode penyamaran.</translation>
@@ -362,7 +359,6 @@
 <translation id="497421865427891073">Maju</translation>
 <translation id="4988526792673242964">Laman</translation>
 <translation id="4996978546172906250">Bagikan dengan</translation>
-<translation id="5000922062037820727">Diblokir (disarankan)</translation>
 <translation id="5004339818306944878">Hemat data hingga 60% dan waktu loading lebih cepat. Server Google akan mengoptimalkan halaman yang Anda kunjungi.</translation>
 <translation id="5005498671520578047">Salin sandi</translation>
 <translation id="5011311129201317034"><ph name="SITE" /> ingin terhubung</translation>
@@ -403,7 +399,6 @@
 <translation id="5335288049665977812">Izinkan situs menjalankan JavaScript (disarankan)</translation>
 <translation id="5345040418939504969">Menghapus <ph name="BOOKMARK_TITLE" /></translation>
 <translation id="5345083863238459644">Akses lokasi juga <ph name="BEGIN_LINK" />dinonaktifkan untuk perangkat ini<ph name="END_LINK" />.</translation>
-<translation id="5349103022427743704">Eksperimen Tambah ke layar Utama yang Disempurnakan</translation>
 <translation id="5372829067651257087">URL disalin.</translation>
 <translation id="5384883051496921101">Situs ini akan membagikan informasi dengan aplikasi di luar mode penyamaran.</translation>
 <translation id="5400569084694353794">Dengan menggunakan aplikasi ini, Anda menyetujui <ph name="BEGIN_LINK1" />Persyaratan Layanan<ph name="END_LINK1" /> dan <ph name="BEGIN_LINK2" />Pemberitahuan Privasi<ph name="END_LINK2" /> Chrome.</translation>
@@ -566,7 +561,7 @@
 <translation id="6963766334940102469">Hapus bookmark</translation>
 <translation id="6965382102122355670">Oke</translation>
 <translation id="6978479750597523876">Setel ulang setelan terjemahan</translation>
-<translation id="6979737339423435258">Sepanjang waktu</translation>
+<translation id="6979737339423435258">Semua</translation>
 <translation id="6981982820502123353">Aksesibilitas</translation>
 <translation id="6985347914332179298">Tidak ada download di sini</translation>
 <translation id="6990079615885386641">Dapatkan aplikasi dari Google Play Store: <ph name="APP_ACTION" /></translation>
@@ -654,7 +649,6 @@
 <translation id="7929962904089429003">Membuka menu</translation>
 <translation id="7942131818088350342"><ph name="PRODUCT_NAME" /> sudah usang.</translation>
 <translation id="7947953824732555851">Terima dan masuk</translation>
-<translation id="7949961459945740081">Dapatkan fitur terbaru</translation>
 <translation id="7963646190083259054">Vendor:</translation>
 <translation id="7987073022710626672">Persyaratan Layanan Chrome</translation>
 <translation id="7998918019931843664">Buka kembali tab yang ditutup</translation>
@@ -665,7 +659,6 @@
 <translation id="8015452622527143194">Mengembalikan semua di halaman ke ukuran default</translation>
 <translation id="802154636333426148">Download gagal</translation>
 <translation id="8026334261755873520">Hapus data browsing</translation>
-<translation id="8033827949643255796">dipilih</translation>
 <translation id="8035133914807600019">Folder baru…</translation>
 <translation id="8037750541064988519"><ph name="DAYS" /> hari lagi</translation>
 <translation id="8051695050440594747"><ph name="MEGABYTES" /> MB tersedia</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_it.xtb b/chrome/android/java/strings/translations/android_chrome_strings_it.xtb
index 7216920..ef2a8dd 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_it.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_it.xtb
@@ -116,7 +116,6 @@
 <translation id="2139186145475833000">Aggiungi a schermata Home</translation>
 <translation id="2146738493024040262">Apri l'app istantanea</translation>
 <translation id="2148716181193084225">Oggi</translation>
-<translation id="2154710561487035718">Copia URL</translation>
 <translation id="2156074688469523661">Siti rimanenti (<ph name="NUMBER_OF_SITES" />)</translation>
 <translation id="219985413780390209">Proteggi te stesso e il tuo dispositivo da siti pericolosi</translation>
 <translation id="2206488550163399966"><ph name="APP_NAME" />, app web. <ph name="APP_URL" /></translation>
@@ -218,7 +217,6 @@
 <translation id="3387650086002190359">Download di <ph name="FILE_NAME" /> non riuscito a causa di errori del file system.</translation>
 <translation id="3398320232533725830">Apri Gestione Preferiti</translation>
 <translation id="3414952576877147120">Dimensioni:</translation>
-<translation id="3435896845095436175">Abilita</translation>
 <translation id="3443221991560634068">Ricarica la pagina corrente</translation>
 <translation id="3452612588551937789">Accedi con il tuo account Google per avere preferiti, cronologia, password e altre impostazioni su tutti i tuoi dispositivi.</translation>
 <translation id="3487093336331957349">Suggerimenti di termini di ricerca e siti</translation>
@@ -319,7 +317,6 @@
 <translation id="4522570452068850558">Dettagli</translation>
 <translation id="4526249700380860531">Controlla e gestisci le password salvate all'indirizzo <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation>
 <translation id="4532845899244822526">Scegli cartella</translation>
-<translation id="4535858793016067060">Attiva l'opzione "Origini sconosciute" nelle impostazioni Sicurezza di Android per provare l'esperimento "Funzione Aggiungi a schermata Home migliorata". Assicurati di disattivare questa opzione quando hai finito la prova.</translation>
 <translation id="4558311620361989323">Scorciatoie delle pagine web</translation>
 <translation id="4572422548854449519">Accedi all'account gestito</translation>
 <translation id="4581964774250883625">Sei passato alla navigazione in incognito.</translation>
@@ -362,7 +359,6 @@
 <translation id="497421865427891073">Avanti</translation>
 <translation id="4988526792673242964">Pagine</translation>
 <translation id="4996978546172906250">Condividi tramite</translation>
-<translation id="5000922062037820727">Bloccata (opzione consigliata)</translation>
 <translation id="5004339818306944878">Utilizza fino al 60% di dati in meno e velocizza il Web. I server Google ottimizzeranno le pagine che visiti.</translation>
 <translation id="5005498671520578047">Copia password</translation>
 <translation id="5011311129201317034">Il sito <ph name="SITE" /> desidera collegarsi</translation>
@@ -403,7 +399,6 @@
 <translation id="5335288049665977812">Consenti l'esecuzione di JavaScript nei siti (opzione consigliata)</translation>
 <translation id="5345040418939504969"><ph name="BOOKMARK_TITLE" /> eliminato</translation>
 <translation id="5345083863238459644">L'accesso alla posizione è stato <ph name="BEGIN_LINK" />disattivato anche per il dispositivo<ph name="END_LINK" />.</translation>
-<translation id="5349103022427743704">Esperimento Funzione Aggiungi a schermata Home migliorata</translation>
 <translation id="5372829067651257087">URL copiato.</translation>
 <translation id="5384883051496921101">Questo sito sta per condividere informazioni con un'app esterna alla modalità di navigazione in incognito.</translation>
 <translation id="5400569084694353794">Se utilizzi questa applicazione, accetti i <ph name="BEGIN_LINK1" />Termini di servizio<ph name="END_LINK1" /> e l'<ph name="BEGIN_LINK2" />Informativa sulla privacy<ph name="END_LINK2" /> di Chrome.</translation>
@@ -654,7 +649,6 @@
 <translation id="7929962904089429003">Apri il menu</translation>
 <translation id="7942131818088350342"><ph name="PRODUCT_NAME" /> è obsoleto.</translation>
 <translation id="7947953824732555851">Accetta e accedi</translation>
-<translation id="7949961459945740081">Scopri le nuove funzioni</translation>
 <translation id="7963646190083259054">Fornitore:</translation>
 <translation id="7987073022710626672">Termini di servizio di Chrome</translation>
 <translation id="7998918019931843664">Riapri la scheda chiusa</translation>
@@ -665,7 +659,6 @@
 <translation id="8015452622527143194">Ripristina le dimensioni predefinite della pagina</translation>
 <translation id="802154636333426148">Download non riuscito</translation>
 <translation id="8026334261755873520">Cancella dati di navigazione</translation>
-<translation id="8033827949643255796">selezionati</translation>
 <translation id="8035133914807600019">Nuova cartella…</translation>
 <translation id="8037750541064988519"><ph name="DAYS" /> giorni rimanenti</translation>
 <translation id="8051695050440594747"><ph name="MEGABYTES" /> MB disponibili</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb b/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb
index aa1cc6bd..81b2188 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb
@@ -116,7 +116,6 @@
 <translation id="2139186145475833000">הוסף למסך דף הבית</translation>
 <translation id="2146738493024040262">פתח אפליקציית אינסטנט</translation>
 <translation id="2148716181193084225">היום</translation>
-<translation id="2154710561487035718">העתק כתובת אתר</translation>
 <translation id="2156074688469523661">אתרים שנותרו (<ph name="NUMBER_OF_SITES" />)</translation>
 <translation id="219985413780390209">הגן על עצמך ועל המכשיר מפני אתרים מסוכנים</translation>
 <translation id="2206488550163399966"><ph name="APP_NAME" />, אפליקציית אינטרנט. <ph name="APP_URL" /></translation>
@@ -218,7 +217,6 @@
 <translation id="3387650086002190359">הורדת <ph name="FILE_NAME" /> נכשלה עקב שגיאות במערכת הקבצים.</translation>
 <translation id="3398320232533725830">פתח את מנהל הסימניות</translation>
 <translation id="3414952576877147120">גודל:</translation>
-<translation id="3435896845095436175">הפעל</translation>
 <translation id="3443221991560634068">טען מחדש את הדף הנוכחי</translation>
 <translation id="3452612588551937789">‏היכנס באמצעות חשבון Google כדי לקבל גישה אל הסימניות, הסיסמאות, ההיסטוריה והגדרות נוספות בכל המכשירים שלך.</translation>
 <translation id="3487093336331957349">הצעות למונחי חיפוש ולאתרים</translation>
@@ -319,7 +317,6 @@
 <translation id="4522570452068850558">פרטים</translation>
 <translation id="4526249700380860531">‏הצג ונהל סיסמאות שמורות ב-<ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation>
 <translation id="4532845899244822526">בחר תיקייה</translation>
-<translation id="4535858793016067060">‏הפעל את האפשרות 'מקורות לא ידועים' בהגדרות האבטחה של Android כדי להשתתף בניסוי 'הוספה משופרת לדף הבית'. הקפד להשבית את ההגדרה הזו לאחר שתסיים להתנסות.</translation>
 <translation id="4558311620361989323">קיצורי דרך בדפי אינטרנט</translation>
 <translation id="4572422548854449519">כניסה אל חשבון מנוהל</translation>
 <translation id="4581964774250883625">עברת למצב גלישה בסתר</translation>
@@ -362,7 +359,6 @@
 <translation id="497421865427891073">המשך קדימה</translation>
 <translation id="4988526792673242964">דפים</translation>
 <translation id="4996978546172906250">שתף באמצעות</translation>
-<translation id="5000922062037820727">חסומה (מומלץ)</translation>
 <translation id="5004339818306944878">‏צמצום של צריכת הנתונים בשיעור של עד 60% והאצת הגלישה. השרתים של Google ימטבו את הדפים שאליהם אתה נכנס.</translation>
 <translation id="5005498671520578047">העתק סיסמה</translation>
 <translation id="5011311129201317034"><ph name="SITE" /> מבקש להתחבר אל</translation>
@@ -403,7 +399,6 @@
 <translation id="5335288049665977812">‏אפשר לאתרים להריץ JavaScript (מומלץ)</translation>
 <translation id="5345040418939504969"><ph name="BOOKMARK_TITLE" /> נמחק</translation>
 <translation id="5345083863238459644">הגישה למיקום <ph name="BEGIN_LINK" />כבויה גם בשביל המכשיר הזה<ph name="END_LINK" />.</translation>
-<translation id="5349103022427743704">ניסוי בשיפור ההוספה למסך דף הבית</translation>
 <translation id="5372829067651257087">כתובת האתר הועתקה.</translation>
 <translation id="5384883051496921101">אתר זה עומד לשתף מידע עם אפליקציה מחוץ למצב גלישה בסתר.</translation>
 <translation id="5400569084694353794">‏בעצם השימוש באפליקציה זו, אתה מסכים ל<ph name="BEGIN_LINK1" />תנאים ולהגבלות<ph name="END_LINK1" /> ול<ph name="BEGIN_LINK2" />הודעת הפרטיות<ph name="END_LINK2" /> של Chrome.</translation>
@@ -654,7 +649,6 @@
 <translation id="7929962904089429003">פתח את התפריט</translation>
 <translation id="7942131818088350342"><ph name="PRODUCT_NAME" /> אינו מעודכן.</translation>
 <translation id="7947953824732555851">קבל והיכנס</translation>
-<translation id="7949961459945740081">קבלת התכונות האחרונות</translation>
 <translation id="7963646190083259054">ספק:</translation>
 <translation id="7987073022710626672">‏התנאים וההגבלות של Chrome</translation>
 <translation id="7998918019931843664">פתח מחדש כרטיסייה שנסגרה</translation>
@@ -665,7 +659,6 @@
 <translation id="8015452622527143194">החזר את כל מה שמופיע בדף לגודל ברירת המחדל</translation>
 <translation id="802154636333426148">ההורדה נכשלה</translation>
 <translation id="8026334261755873520">נקה נתוני גלישה</translation>
-<translation id="8033827949643255796">מסומן</translation>
 <translation id="8035133914807600019">תיקייה חדשה…</translation>
 <translation id="8037750541064988519">נותרו <ph name="DAYS" /> ימים</translation>
 <translation id="8051695050440594747">‏‎<ph name="MEGABYTES" /> MB זמינים</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ja.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ja.xtb
index 4235bcf..b38b118 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ja.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ja.xtb
@@ -116,7 +116,6 @@
 <translation id="2139186145475833000">ホーム画面に追加</translation>
 <translation id="2146738493024040262">プレビュー アプリを開く</translation>
 <translation id="2148716181193084225">今日</translation>
-<translation id="2154710561487035718">URL をコピー</translation>
 <translation id="2156074688469523661">その他のサイト(<ph name="NUMBER_OF_SITES" /> 件)</translation>
 <translation id="219985413780390209">危険なサイトからユーザーとデバイスを保護する</translation>
 <translation id="2206488550163399966"><ph name="APP_NAME" /> はウェブアプリです(<ph name="APP_URL" />)。</translation>
@@ -218,7 +217,6 @@
 <translation id="3387650086002190359">ファイル システムでエラーが発生したため、<ph name="FILE_NAME" /> をダウンロードできませんでした。</translation>
 <translation id="3398320232533725830">ブックマーク マネージャを開く</translation>
 <translation id="3414952576877147120">サイズ:</translation>
-<translation id="3435896845095436175">有効にする</translation>
 <translation id="3443221991560634068">現在のページを再読み込みする</translation>
 <translation id="3452612588551937789">Google アカウントでログインすると、どの端末からでも同じブックマーク、履歴、パスワードなどの設定を利用できるようになります。</translation>
 <translation id="3487093336331957349">検索とサイトの候補を表示</translation>
@@ -319,7 +317,6 @@
 <translation id="4522570452068850558">詳細</translation>
 <translation id="4526249700380860531"><ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /> での保存パスワードの表示と管理</translation>
 <translation id="4532845899244822526">フォルダの選択</translation>
-<translation id="4535858793016067060">「ホーム画面に追加(改訂版)」試験運用機能を使用するには、Android のセキュリティ設定で [提供元不明のアプリ] を有効にしてください。機能の確認が終わったら、設定を無効に戻してください。</translation>
 <translation id="4558311620361989323">ウェブページのショートカット</translation>
 <translation id="4572422548854449519">管理対象アカウントにログイン</translation>
 <translation id="4581964774250883625">シークレット モードです。</translation>
@@ -362,7 +359,6 @@
 <translation id="497421865427891073">次に進む</translation>
 <translation id="4988526792673242964">ページ</translation>
 <translation id="4996978546172906250">共有方法</translation>
-<translation id="5000922062037820727">ブロック(推奨)</translation>
 <translation id="5004339818306944878">データセーバーを使用すると、データ使用量を最大 60% 節約でき、ウェブを高速にブラウジングできます。Google のサーバーにより、アクセスするページが最適化されます。</translation>
 <translation id="5005498671520578047">パスワードのコピー</translation>
 <translation id="5011311129201317034"><ph name="SITE" /> が接続を要求しています</translation>
@@ -403,7 +399,6 @@
 <translation id="5335288049665977812">サイトに Javascript の実行を許可する(推奨)</translation>
 <translation id="5345040418939504969"><ph name="BOOKMARK_TITLE" /> を削除しました</translation>
 <translation id="5345083863238459644">現在地情報へのアクセスは<ph name="BEGIN_LINK" />この端末でもオフになっています<ph name="END_LINK" />。</translation>
-<translation id="5349103022427743704">「ホーム画面に追加(改訂版)」試験運用機能</translation>
 <translation id="5372829067651257087">URL をコピーしました。</translation>
 <translation id="5384883051496921101">このサイトの情報がシークレット モードの外部のアプリに共有されようとしています。</translation>
 <translation id="5400569084694353794">このアプリケーションを使用すると、Chrome の<ph name="BEGIN_LINK1" />利用規約<ph name="END_LINK1" />と<ph name="BEGIN_LINK2" />プライバシーに関するお知らせ<ph name="END_LINK2" />に同意したことになります。</translation>
@@ -654,7 +649,6 @@
 <translation id="7929962904089429003">メニューを開く</translation>
 <translation id="7942131818088350342"><ph name="PRODUCT_NAME" /> は最新ではありません。</translation>
 <translation id="7947953824732555851">同意してログイン</translation>
-<translation id="7949961459945740081">最新機能を取得</translation>
 <translation id="7963646190083259054">ベンダー:</translation>
 <translation id="7987073022710626672">Chrome 利用規約</translation>
 <translation id="7998918019931843664">閉じたタブを開く</translation>
@@ -665,7 +659,6 @@
 <translation id="8015452622527143194">ページ上のすべての要素をデフォルトのサイズに戻す</translation>
 <translation id="802154636333426148">ダウンロード エラー</translation>
 <translation id="8026334261755873520">閲覧履歴データを消去する</translation>
-<translation id="8033827949643255796">選択しました</translation>
 <translation id="8035133914807600019">新しいフォルダ...</translation>
 <translation id="8037750541064988519">残り <ph name="DAYS" /> 日</translation>
 <translation id="8051695050440594747"><ph name="MEGABYTES" /> MB 利用可</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb
index 43efcd8..41c39457 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb
@@ -114,9 +114,8 @@
 <translation id="2131665479022868825"><ph name="DATA" /> 절약됨</translation>
 <translation id="213279576345780926"><ph name="TAB_TITLE" /> 닫음</translation>
 <translation id="2139186145475833000">홈 화면에 추가</translation>
-<translation id="2146738493024040262">빠른 실행 앱 열기</translation>
+<translation id="2146738493024040262">인스턴트 앱 열기</translation>
 <translation id="2148716181193084225">오늘</translation>
-<translation id="2154710561487035718">URL 복사</translation>
 <translation id="2156074688469523661">남은 사이트(<ph name="NUMBER_OF_SITES" />개)</translation>
 <translation id="219985413780390209">위험 사이트로부터 사용자와 기기를 보호합니다.</translation>
 <translation id="2206488550163399966"><ph name="APP_NAME" />, 웹 앱. <ph name="APP_URL" /></translation>
@@ -218,7 +217,6 @@
 <translation id="3387650086002190359">파일 시스템에 오류가 발생하여 <ph name="FILE_NAME" />을(를) 다운로드할 수 없습니다.</translation>
 <translation id="3398320232533725830">북마크 관리자 열기</translation>
 <translation id="3414952576877147120">크기:</translation>
-<translation id="3435896845095436175">사용</translation>
 <translation id="3443221991560634068">현재 페이지 새로고침</translation>
 <translation id="3452612588551937789">Google 계정으로 로그인하면 모든 기기에서 북마크, 방문 기록, 비밀번호 및 기타 설정을 사용할 수 있습니다.</translation>
 <translation id="3487093336331957349">검색 및 사이트 제안</translation>
@@ -319,7 +317,6 @@
 <translation id="4522570452068850558">세부정보</translation>
 <translation id="4526249700380860531"><ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" />에서 저장된 비밀번호 보기 및 관리</translation>
 <translation id="4532845899244822526">폴더 선택</translation>
-<translation id="4535858793016067060">Android 보안 설정에서 '알 수 없는 출처'를 사용 설정하여 '홈 화면에 향상된 기능 추가' 실험실 기능을 사용해 보세요. 사용해 본 후에는 이 설정을 사용 중지하시기 바랍니다.</translation>
 <translation id="4558311620361989323">웹페이지 단축키</translation>
 <translation id="4572422548854449519">관리 계정에 로그인</translation>
 <translation id="4581964774250883625">시크릿 모드로 전환됨</translation>
@@ -362,7 +359,6 @@
 <translation id="497421865427891073">앞으로 이동</translation>
 <translation id="4988526792673242964">페이지</translation>
 <translation id="4996978546172906250">공유 방법</translation>
-<translation id="5000922062037820727">차단(권장)</translation>
 <translation id="5004339818306944878">데이터 사용량을 최대 60%까지 절약하고 웹 속도를 높이세요. Google 서버에서 내가 방문하는 페이지를 최적화합니다.</translation>
 <translation id="5005498671520578047">비밀번호 복사</translation>
 <translation id="5011311129201317034"><ph name="SITE" />에서 연결하려고 함</translation>
@@ -403,7 +399,6 @@
 <translation id="5335288049665977812">사이트에서 자바스크립트 실행 허용(권장)</translation>
 <translation id="5345040418939504969"><ph name="BOOKMARK_TITLE" /> 삭제됨</translation>
 <translation id="5345083863238459644">위치 정보 액세스 또한 <ph name="BEGIN_LINK" />이 기기에서 사용 중지되었습니다<ph name="END_LINK" />.</translation>
-<translation id="5349103022427743704">홈 화면에 향상된 기능 추가 실험실 기능</translation>
 <translation id="5372829067651257087">URL이 복사되었습니다.</translation>
 <translation id="5384883051496921101">이 사이트에서 시크릿 모드 외부의 앱을 사용하여 정보를 공유하려고 합니다.</translation>
 <translation id="5400569084694353794">이 애플리케이션을 사용하면 Chrome의 <ph name="BEGIN_LINK1" />서비스 약관<ph name="END_LINK1" />과 <ph name="BEGIN_LINK2" />개인정보 보호정책<ph name="END_LINK2" />에 동의하게 됩니다.</translation>
@@ -654,7 +649,6 @@
 <translation id="7929962904089429003">메뉴 열기</translation>
 <translation id="7942131818088350342"><ph name="PRODUCT_NAME" />이(가) 이전 버전입니다.</translation>
 <translation id="7947953824732555851">수락 및 로그인</translation>
-<translation id="7949961459945740081">최신 기능 다운로드</translation>
 <translation id="7963646190083259054">공급업체:</translation>
 <translation id="7987073022710626672">Chrome 서비스 약관</translation>
 <translation id="7998918019931843664">닫은 탭 다시 열기</translation>
@@ -665,7 +659,6 @@
 <translation id="8015452622527143194">페이지의 모든 항목을 기본 크기로 되돌리기</translation>
 <translation id="802154636333426148">다운로드 실패</translation>
 <translation id="8026334261755873520">인터넷 사용 기록 삭제</translation>
-<translation id="8033827949643255796">선택됨</translation>
 <translation id="8035133914807600019">새 폴더…</translation>
 <translation id="8037750541064988519"><ph name="DAYS" />일 남음</translation>
 <translation id="8051695050440594747"><ph name="MEGABYTES" />MB 사용 가능</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_lt.xtb b/chrome/android/java/strings/translations/android_chrome_strings_lt.xtb
index f6a42e0..79a0344d 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_lt.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_lt.xtb
@@ -116,7 +116,6 @@
 <translation id="2139186145475833000">Pridėti prie pagr. ekrano</translation>
 <translation id="2146738493024040262">Atidaryti akimirksniu įkeliamą programėlę</translation>
 <translation id="2148716181193084225">Šiandien</translation>
-<translation id="2154710561487035718">Kopijuoti URL adresą</translation>
 <translation id="2156074688469523661">Likusios svetainės (<ph name="NUMBER_OF_SITES" />)</translation>
 <translation id="219985413780390209">Apsaugokite save ir įrenginį nuo pavojingų svetainių</translation>
 <translation id="2206488550163399966">„<ph name="APP_NAME" />“, žiniatinklio programa. <ph name="APP_URL" /></translation>
@@ -218,7 +217,6 @@
 <translation id="3387650086002190359">Nepavyko atsisiųsti „<ph name="FILE_NAME" />“ dėl failų sistemos klaidų.</translation>
 <translation id="3398320232533725830">Atidaryti žymių tvarkytuvę</translation>
 <translation id="3414952576877147120">Dydis:</translation>
-<translation id="3435896845095436175">Įgalinti</translation>
 <translation id="3443221991560634068">Iš naujo įkelti dabartinį puslapį</translation>
 <translation id="3452612588551937789">Prisijunkite naudodami „Google“ paskyrą, kad gautumėte žymes, slaptažodžius, istoriją ir kitus nustatymus visuose įrenginiuose.</translation>
 <translation id="3487093336331957349">Paieškos ir svetainės pasiūlymai</translation>
@@ -319,7 +317,6 @@
 <translation id="4522570452068850558">Išsami informacija</translation>
 <translation id="4526249700380860531">Peržiūrėkite ir tvarkykite išsaugotus slaptažodžius apsilankę adresu <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation>
 <translation id="4532845899244822526">Pasirinkti aplanką</translation>
-<translation id="4535858793016067060">„Android“ saugos nustatymuose įjunkite funkciją „Nežinomi šaltiniai“, kad išbandytumėte eksperimentą „Patobulinta funkcija „Pridėti prie pagrindinio ekrano“. Būtinai išjunkite šią funkciją, kai jį išbandysite.</translation>
 <translation id="4558311620361989323">Tinklalapių spartieji klavišai</translation>
 <translation id="4572422548854449519">Prisijungimas prie tvarkomos paskyros</translation>
 <translation id="4581964774250883625">Veikia inkognito režimas.</translation>
@@ -362,7 +359,6 @@
 <translation id="497421865427891073">Eiti pirmyn</translation>
 <translation id="4988526792673242964">Psl.</translation>
 <translation id="4996978546172906250">Bendrinti per</translation>
-<translation id="5000922062037820727">Užblokuota (rekomenduojama)</translation>
 <translation id="5004339818306944878">Naudokite iki 60 % mažiau duomenų ir paspartinkite žiniatinklį. „Google“ serveriai optimizuos jūsų lankomus puslapius.</translation>
 <translation id="5005498671520578047">Kopijuoti slaptažodį</translation>
 <translation id="5011311129201317034"><ph name="SITE" /> nori prisijungti</translation>
@@ -403,7 +399,6 @@
 <translation id="5335288049665977812">Leisti svetainėms paleisti „JavaScript“ (rekomenduojama)</translation>
 <translation id="5345040418939504969">Ištrinta „<ph name="BOOKMARK_TITLE" />“</translation>
 <translation id="5345083863238459644">Galimybė pasiekti vietovę taip pat <ph name="BEGIN_LINK" />išjungta šiame įrenginyje<ph name="END_LINK" />.</translation>
-<translation id="5349103022427743704">Patobulintas eksperimentas „Pridėti prie pagrindinio ekrano“</translation>
 <translation id="5372829067651257087">URL nukopijuotas.</translation>
 <translation id="5384883051496921101">Šioje svetainėje ketinama bendrinti informaciją su programa ne inkognito režimu.</translation>
 <translation id="5400569084694353794">Naudodami šią programą sutinkate su „Chrome“ <ph name="BEGIN_LINK1" />paslaugų teikimo sąlygomis<ph name="END_LINK1" /> ir <ph name="BEGIN_LINK2" />privatumo pranešimo<ph name="END_LINK2" /> sąlygomis.</translation>
@@ -654,7 +649,6 @@
 <translation id="7929962904089429003">Atidaryti meniu</translation>
 <translation id="7942131818088350342">„<ph name="PRODUCT_NAME" />“ pasenęs.</translation>
 <translation id="7947953824732555851">Sutikti ir prisij.</translation>
-<translation id="7949961459945740081">Gauti naujausias funkcijas</translation>
 <translation id="7963646190083259054">Paslaugos teikėjas:</translation>
 <translation id="7987073022710626672">„Chrome“ paslaugų teikimo sąlygos</translation>
 <translation id="7998918019931843664">Iš naujo atidarykite uždarytą skirtuko lapą</translation>
@@ -665,7 +659,6 @@
 <translation id="8015452622527143194">Grąžinti numatytąjį puslapio turinio dydį</translation>
 <translation id="802154636333426148">Įvyko atsisiuntimo klaida</translation>
 <translation id="8026334261755873520">Išvalyti naršymo duomenis</translation>
-<translation id="8033827949643255796">pasirinkta</translation>
 <translation id="8035133914807600019">Naujas aplankas…</translation>
 <translation id="8037750541064988519">Liko <ph name="DAYS" /> d.</translation>
 <translation id="8051695050440594747">Galima <ph name="MEGABYTES" /> MB</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_lv.xtb b/chrome/android/java/strings/translations/android_chrome_strings_lv.xtb
index 5514bb3..737e36b 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_lv.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_lv.xtb
@@ -116,7 +116,6 @@
 <translation id="2139186145475833000">Pievienot sākuma ekrānam</translation>
 <translation id="2146738493024040262">Atvērt tūlītējo lietotni</translation>
 <translation id="2148716181193084225">Šodien</translation>
-<translation id="2154710561487035718">Kopēt URL</translation>
 <translation id="2156074688469523661">Pārējās vietnes (<ph name="NUMBER_OF_SITES" />)</translation>
 <translation id="219985413780390209">Aizsargāt jūs un ierīci pret bīstamām vietnēm</translation>
 <translation id="2206488550163399966">Tīmekļa lietotne <ph name="APP_NAME" />. <ph name="APP_URL" /></translation>
@@ -218,7 +217,6 @@
 <translation id="3387650086002190359">Neizdevās lejupielādēt failu <ph name="FILE_NAME" />, jo radās failu sistēmas kļūdas.</translation>
 <translation id="3398320232533725830">Atvērt grāmatzīmju pārvaldnieku</translation>
 <translation id="3414952576877147120">Lielums:</translation>
-<translation id="3435896845095436175">Iespējot</translation>
 <translation id="3443221991560634068">Atkārtoti ielādēt pašreizējo lapu</translation>
 <translation id="3452612588551937789">Pierakstieties Google kontā, lai izmantotu savas grāmatzīmes, paroles, vēsturi un citus Chrome datus visās jūsu ierīcēs.</translation>
 <translation id="3487093336331957349">Meklēšanas un vietņu ieteikumi</translation>
@@ -319,7 +317,6 @@
 <translation id="4522570452068850558">Informācija</translation>
 <translation id="4526249700380860531">Skatīt un pārvaldīt saglabātās paroles vietnē <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation>
 <translation id="4532845899244822526">Mapes izvēlēšanās</translation>
-<translation id="4535858793016067060">Android drošības iestatījumos ieslēdziet opciju “Nezināmi avoti”, lai izmēģinātu eksperimentālu uzlabotu Pievienošanas sākuma ekrānam funkciju. Noteikti atspējojiet šo iestatījumu, kad būsit to izmēģinājis.</translation>
 <translation id="4558311620361989323">Tīmekļa lapu īsinājumtaustiņi</translation>
 <translation id="4572422548854449519">Pierakstīšanās pārvaldītā kontā</translation>
 <translation id="4581964774250883625">Jūs esat atvēris inkognito režīmu.</translation>
@@ -362,7 +359,6 @@
 <translation id="497421865427891073">Doties uz priekšu</translation>
 <translation id="4988526792673242964">Lapas</translation>
 <translation id="4996978546172906250">Kopīgošanas veids:</translation>
-<translation id="5000922062037820727">Bloķēta (ieteicams)</translation>
 <translation id="5004339818306944878">Izmantojiet pat par 60% mazāk datu un paātriniet tīmekļa pārlūkošanu. Google serveri optimizēs jūsu apmeklētās lapas.</translation>
 <translation id="5005498671520578047">Paroles kopēšana</translation>
 <translation id="5011311129201317034"><ph name="SITE" /> vēlas izveidot savienojumu</translation>
@@ -403,7 +399,6 @@
 <translation id="5335288049665977812">Atļaut vietnēm izmantot JavaScript (ieteicams)</translation>
 <translation id="5345040418939504969">Grāmatzīme <ph name="BOOKMARK_TITLE" /> tika dzēsta</translation>
 <translation id="5345083863238459644">Piekļuve atrašanās vietas datiem ir arī <ph name="BEGIN_LINK" />izslēgta šai ierīcei<ph name="END_LINK" />.</translation>
-<translation id="5349103022427743704">Uzlabota eksperimentāla funkcija “Pievienot sākuma ekrānam”</translation>
 <translation id="5372829067651257087">Vietrādis URL nokopēts</translation>
 <translation id="5384883051496921101">Šī vietne kopīgos informāciju ar lietotni, kas nav inkognito režīmā.</translation>
 <translation id="5400569084694353794">Izmantojot šo lietojumprogrammu, jūs piekrītat Chrome <ph name="BEGIN_LINK1" />pakalpojumu sniegšanas noteikumiem<ph name="END_LINK1" /> un <ph name="BEGIN_LINK2" />konfidencialitātes paziņojumam<ph name="END_LINK2" />.</translation>
@@ -654,7 +649,6 @@
 <translation id="7929962904089429003">Atvērt izvēlni</translation>
 <translation id="7942131818088350342">Spraudnis <ph name="PRODUCT_NAME" /> ir novecojis.</translation>
 <translation id="7947953824732555851">Pieņemt un pierakst.</translation>
-<translation id="7949961459945740081">Saņemiet jaunākās funkcijas</translation>
 <translation id="7963646190083259054">Nodrošina:</translation>
 <translation id="7987073022710626672">Lietošanas noteikumi</translation>
 <translation id="7998918019931843664">Vēlreiz atvērt aizvērto cilni</translation>
@@ -665,7 +659,6 @@
 <translation id="8015452622527143194">Atjaunot visam lapas saturam noklusējuma lielumu</translation>
 <translation id="802154636333426148">Lejupielāde neizdevās</translation>
 <translation id="8026334261755873520">Notīrīt pārlūkošanas datus</translation>
-<translation id="8033827949643255796">atlasīti</translation>
 <translation id="8035133914807600019">Jauna mape…</translation>
 <translation id="8037750541064988519">Atlikušas <ph name="DAYS" /> dienas</translation>
 <translation id="8051695050440594747">Ir pieejami <ph name="MEGABYTES" /> MB</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb b/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb
index 503d0c3..459452a9 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb
@@ -116,7 +116,6 @@
 <translation id="2139186145475833000">Toevoegen aan startscherm</translation>
 <translation id="2146738493024040262">Instant-app openen</translation>
 <translation id="2148716181193084225">Vandaag</translation>
-<translation id="2154710561487035718">URL kopiëren</translation>
 <translation id="2156074688469523661">Resterende sites (<ph name="NUMBER_OF_SITES" />)</translation>
 <translation id="219985413780390209">Jou en je apparaat beschermen tegen gevaar</translation>
 <translation id="2206488550163399966"><ph name="APP_NAME" />, webapp. <ph name="APP_URL" /></translation>
@@ -218,7 +217,6 @@
 <translation id="3387650086002190359">Downloaden van <ph name="FILE_NAME" /> is mislukt door fouten in het bestandssysteem.</translation>
 <translation id="3398320232533725830">Bladwijzerbeheer openen</translation>
 <translation id="3414952576877147120">Grootte:</translation>
-<translation id="3435896845095436175">Inschakelen</translation>
 <translation id="3443221991560634068">De huidige pagina opnieuw laden</translation>
 <translation id="3452612588551937789">Log in met je Google-account om je bladwijzers, geschiedenis, wachtwoorden en andere instellingen op al je apparaten te gebruiken.</translation>
 <translation id="3487093336331957349">Zoek- en sitesuggesties</translation>
@@ -319,7 +317,6 @@
 <translation id="4522570452068850558">Details</translation>
 <translation id="4526249700380860531">Opgeslagen wachtwoorden bekijken en beheren via <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation>
 <translation id="4532845899244822526">Map kiezen</translation>
-<translation id="4535858793016067060">Schakel de optie 'Onbekende bronnen' in de beveiligingsinstellingen van Android in om het experiment 'Verbeterde functie voor toevoegen aan startscherm' uit te voeren. Vergeet niet de instelling uit te schakelen wanneer je klaar bent met uitproberen.</translation>
 <translation id="4558311620361989323">Sneltoetsen voor webpagina's</translation>
 <translation id="4572422548854449519">Inloggen bij een beheerd account</translation>
 <translation id="4581964774250883625">Je bent incognito.</translation>
@@ -362,7 +359,6 @@
 <translation id="497421865427891073">Naar voren gaan</translation>
 <translation id="4988526792673242964">Pagina's</translation>
 <translation id="4996978546172906250">Delen via</translation>
-<translation id="5000922062037820727">Geblokkeerd (aanbevolen)</translation>
 <translation id="5004339818306944878">Gebruik tot 60% minder data en maak internet sneller. De servers van Google optimaliseren de pagina's die je bezoekt.</translation>
 <translation id="5005498671520578047">Wachtwoord kopiëren</translation>
 <translation id="5011311129201317034"><ph name="SITE" /> wil verbinding maken</translation>
@@ -403,7 +399,6 @@
 <translation id="5335288049665977812">Sites toestaan JavaScript uit te voeren (aanbevolen)</translation>
 <translation id="5345040418939504969"><ph name="BOOKMARK_TITLE" /> is verwijderd</translation>
 <translation id="5345083863238459644">Locatietoegang is ook <ph name="BEGIN_LINK" />uitgeschakeld voor dit apparaat<ph name="END_LINK" />.</translation>
-<translation id="5349103022427743704">Experiment 'Verbeterde functie voor toevoegen aan startscherm'</translation>
 <translation id="5372829067651257087">URL gekopieerd.</translation>
 <translation id="5384883051496921101">Deze site staat op het punt buiten de incognitomodus informatie met een app te delen.</translation>
 <translation id="5400569084694353794">Als je deze app gebruikt, ga je akkoord met de <ph name="BEGIN_LINK1" />Servicevoorwaarden<ph name="END_LINK1" /> en het <ph name="BEGIN_LINK2" />Privacybeleid<ph name="END_LINK2" /> van Chrome.</translation>
@@ -654,7 +649,6 @@
 <translation id="7929962904089429003">Het menu openen</translation>
 <translation id="7942131818088350342"><ph name="PRODUCT_NAME" /> is verouderd.</translation>
 <translation id="7947953824732555851">Accepteren en inloggen</translation>
-<translation id="7949961459945740081">Ontvang de nieuwste functies</translation>
 <translation id="7963646190083259054">Leverancier:</translation>
 <translation id="7987073022710626672">Servicevoorwaarden van Chrome</translation>
 <translation id="7998918019931843664">Gesloten tabblad opnieuw openen</translation>
@@ -665,7 +659,6 @@
 <translation id="8015452622527143194">Standaardgrootte van alles op de pagina herstellen</translation>
 <translation id="802154636333426148">Downloaden mislukt</translation>
 <translation id="8026334261755873520">Browsegegevens wissen</translation>
-<translation id="8033827949643255796">geselecteerd</translation>
 <translation id="8035133914807600019">Nieuwe map…</translation>
 <translation id="8037750541064988519"><ph name="DAYS" /> dagen resterend</translation>
 <translation id="8051695050440594747"><ph name="MEGABYTES" /> MB beschikbaar</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_no.xtb b/chrome/android/java/strings/translations/android_chrome_strings_no.xtb
index 9ecf036..90f1e44 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_no.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_no.xtb
@@ -116,7 +116,6 @@
 <translation id="2139186145475833000">Legg til på startsiden</translation>
 <translation id="2146738493024040262">Åpne instant-appen</translation>
 <translation id="2148716181193084225">I dag</translation>
-<translation id="2154710561487035718">Kopier nettadresse</translation>
 <translation id="2156074688469523661">Andre nettsteder (<ph name="NUMBER_OF_SITES" />)</translation>
 <translation id="219985413780390209">Beskytt deg selv og enheten din mot farlige nettsteder</translation>
 <translation id="2206488550163399966"><ph name="APP_NAME" />, nettprogram. <ph name="APP_URL" /></translation>
@@ -218,7 +217,6 @@
 <translation id="3387650086002190359">Nedlastingen av <ph name="FILE_NAME" /> ble avbrutt på grunn av filsystemfeil.</translation>
 <translation id="3398320232533725830">Åpne bokmerkebehandlingen</translation>
 <translation id="3414952576877147120">Størrelse:</translation>
-<translation id="3435896845095436175">Slå på</translation>
 <translation id="3443221991560634068">Last inn den aktive siden på nytt</translation>
 <translation id="3452612588551937789">Logg på med Google-kontoen din for å få bokmerkene, passordene, loggoppføringene og de andre innstillingene dine på alle enhetene du bruker.</translation>
 <translation id="3487093336331957349">Nettsteds- og søkeforslag</translation>
@@ -319,7 +317,6 @@
 <translation id="4522570452068850558">Detaljer</translation>
 <translation id="4526249700380860531">Se på og administrer lagrede passord på <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation>
 <translation id="4532845899244822526">Velg en mappe</translation>
-<translation id="4535858793016067060">Slå på «Ukjente kilder» i sikkerhetsinnstillingene for Android for å prøve «Forbedret Legg til på startsiden»-eksperimentet. Husk å slå av denne innstillingen når du er ferdig med å prøve det.</translation>
 <translation id="4558311620361989323">Hurtigtaster for nettsider</translation>
 <translation id="4572422548854449519">Logg på en administrert konto</translation>
 <translation id="4581964774250883625">Du er nå i inkognitomodus.</translation>
@@ -362,7 +359,6 @@
 <translation id="497421865427891073">Gå til neste</translation>
 <translation id="4988526792673242964">Sider</translation>
 <translation id="4996978546172906250">Del via</translation>
-<translation id="5000922062037820727">Blokkert (anbefales)</translation>
 <translation id="5004339818306944878">Bruk opptil 60 % mindre data, og surf raskere – Google-tjenerne optimaliserer sidene du besøker.</translation>
 <translation id="5005498671520578047">Kopiér passordet</translation>
 <translation id="5011311129201317034"><ph name="SITE" /> vil koble til</translation>
@@ -403,7 +399,6 @@
 <translation id="5335288049665977812">Tillat nettsteder å kjøre JavaScript (anbefales)</translation>
 <translation id="5345040418939504969">Slettet <ph name="BOOKMARK_TITLE" /></translation>
 <translation id="5345083863238459644">Posisjonstilgang er også <ph name="BEGIN_LINK" />slått av for denne enheten<ph name="END_LINK" />.</translation>
-<translation id="5349103022427743704">Forbedret Legg til på startsiden-eksperiment</translation>
 <translation id="5372829067651257087">Nettadressen er kopiert.</translation>
 <translation id="5384883051496921101">Dette nettstedet er i ferd med å dele informasjon med en app utenfor inkognitomodus.</translation>
 <translation id="5400569084694353794">Ved å bruke dette programmet samtykker du i Chromes <ph name="BEGIN_LINK1" />vilkår for bruk<ph name="END_LINK1" /> og <ph name="BEGIN_LINK2" />merknad om personvern<ph name="END_LINK2" />.</translation>
@@ -654,7 +649,6 @@
 <translation id="7929962904089429003">Åpne menyen</translation>
 <translation id="7942131818088350342"><ph name="PRODUCT_NAME" /> er utdatert.</translation>
 <translation id="7947953824732555851">Godta og logg på</translation>
-<translation id="7949961459945740081">Få de nyeste funksjonene</translation>
 <translation id="7963646190083259054">Leverandør:</translation>
 <translation id="7987073022710626672">Vilkår for bruk av Chrome</translation>
 <translation id="7998918019931843664">Åpne lukkede faner igjen</translation>
@@ -665,7 +659,6 @@
 <translation id="8015452622527143194">Tilbakestill alt på siden til standardstørrelsen</translation>
 <translation id="802154636333426148">Nedlastingen mislyktes</translation>
 <translation id="8026334261755873520">Slett nettlesingsdata</translation>
-<translation id="8033827949643255796">valgt</translation>
 <translation id="8035133914807600019">Ny mappe</translation>
 <translation id="8037750541064988519"><ph name="DAYS" /> dager igjen</translation>
 <translation id="8051695050440594747"><ph name="MEGABYTES" /> MB tilgjengelig</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb b/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb
index 45f3ecc..2ec5255 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb
@@ -116,7 +116,6 @@
 <translation id="2139186145475833000">Dodaj do ekranu głównego</translation>
 <translation id="2146738493024040262">Otwórz aplikację błyskawiczną</translation>
 <translation id="2148716181193084225">Dzisiaj</translation>
-<translation id="2154710561487035718">Kopiuj adres URL</translation>
 <translation id="2156074688469523661">Pozostałe strony (<ph name="NUMBER_OF_SITES" />)</translation>
 <translation id="219985413780390209">Chroń siebie i swoje urządzenie przed niebezpiecznymi witrynami</translation>
 <translation id="2206488550163399966"><ph name="APP_NAME" /> – aplikacja internetowa. <ph name="APP_URL" /></translation>
@@ -218,7 +217,6 @@
 <translation id="3387650086002190359">Nie udało się pobrać pliku <ph name="FILE_NAME" /> z powodu błędów systemu plików.</translation>
 <translation id="3398320232533725830">Otwórz menedżera zakładek</translation>
 <translation id="3414952576877147120">Rozmiar:</translation>
-<translation id="3435896845095436175">Włącz</translation>
 <translation id="3443221991560634068">Ponownie załaduj bieżącą stronę</translation>
 <translation id="3452612588551937789">Zaloguj się na konto Google, by korzystać z zakładek, haseł, historii i innych ustawień na wszystkich urządzeniach.</translation>
 <translation id="3487093336331957349">Podpowiadanie stron internetowych i wyszukiwanych słów</translation>
@@ -319,7 +317,6 @@
 <translation id="4522570452068850558">Szczegóły</translation>
 <translation id="4526249700380860531">Wyświetlaj zapisane hasła i zarządzaj nimi na <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation>
 <translation id="4532845899244822526">Wybierz folder</translation>
-<translation id="4535858793016067060">Włącz „Nieznane źródła” w ustawieniach zabezpieczeń Androida, by wypróbować eksperyment „Ulepszone dodawanie do ekranu głównego”. Koniecznie wyłącz to ustawienie, gdy przestaniesz używać tego eksperymentu.</translation>
 <translation id="4558311620361989323">Skróty stron internetowych</translation>
 <translation id="4572422548854449519">Zaloguj się na konto zarządzane</translation>
 <translation id="4581964774250883625">Jesteś w trybie incognito.</translation>
@@ -362,7 +359,6 @@
 <translation id="497421865427891073">Dalej</translation>
 <translation id="4988526792673242964">Strony</translation>
 <translation id="4996978546172906250">Udostępnij przez</translation>
-<translation id="5000922062037820727">Zablokowane (zalecane)</translation>
 <translation id="5004339818306944878">Przesyłaj nawet o 60% mniej danych i przyspiesz działanie sieci: serwery Google optymalizują strony, które odwiedzasz.</translation>
 <translation id="5005498671520578047">Skopiuj hasło</translation>
 <translation id="5011311129201317034"><ph name="SITE" /> chce się połączyć</translation>
@@ -403,7 +399,6 @@
 <translation id="5335288049665977812">Zezwalaj na wykonywanie kodu JavaScript w witrynach (zalecane)</translation>
 <translation id="5345040418939504969">Usunięto: <ph name="BOOKMARK_TITLE" /></translation>
 <translation id="5345083863238459644">Dostęp do lokalizacji jest też <ph name="BEGIN_LINK" />wyłączony na tym urządzeniu<ph name="END_LINK" />.</translation>
-<translation id="5349103022427743704">Eksperyment Ulepszone dodawanie do ekranu głównego</translation>
 <translation id="5372829067651257087">URL został skopiowany.</translation>
 <translation id="5384883051496921101">Ta strona zamierza udostępnić informacje aplikacji poza trybem incognito.</translation>
 <translation id="5400569084694353794">Korzystając z tej aplikacji, akceptujesz <ph name="BEGIN_LINK1" />Warunki korzystania z Chrome<ph name="END_LINK1" /> oraz <ph name="BEGIN_LINK2" />Informacje na temat ochrony prywatności w Chrome<ph name="END_LINK2" />.</translation>
@@ -654,7 +649,6 @@
 <translation id="7929962904089429003">Otwórz menu</translation>
 <translation id="7942131818088350342">Przeglądarka <ph name="PRODUCT_NAME" /> jest nieaktualna.</translation>
 <translation id="7947953824732555851">Zaakceptuj i zaloguj się</translation>
-<translation id="7949961459945740081">Używaj najnowszych funkcji</translation>
 <translation id="7963646190083259054">Dostawca:</translation>
 <translation id="7987073022710626672">Warunki korzystania z Chrome</translation>
 <translation id="7998918019931843664">Otwórz ponownie zamkniętą kartę</translation>
@@ -665,7 +659,6 @@
 <translation id="8015452622527143194">Powróć do normalnego rozmiaru całej treści strony</translation>
 <translation id="802154636333426148">Nie udało się pobrać</translation>
 <translation id="8026334261755873520">Wyczyść dane przeglądania</translation>
-<translation id="8033827949643255796">wybrano</translation>
 <translation id="8035133914807600019">Nowy folder…</translation>
 <translation id="8037750541064988519">Pozostało: <ph name="DAYS" /> dni</translation>
 <translation id="8051695050440594747">Dostępne: <ph name="MEGABYTES" /> MB</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_pt-BR.xtb b/chrome/android/java/strings/translations/android_chrome_strings_pt-BR.xtb
index 4b253fb3..d49ae16 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_pt-BR.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_pt-BR.xtb
@@ -116,7 +116,6 @@
 <translation id="2139186145475833000">Adicionar à tela inicial</translation>
 <translation id="2146738493024040262">Abrir Instant App</translation>
 <translation id="2148716181193084225">Hoje</translation>
-<translation id="2154710561487035718">Copiar URL</translation>
 <translation id="2156074688469523661">Sites restantes (<ph name="NUMBER_OF_SITES" />)</translation>
 <translation id="219985413780390209">Proteger você e seu dispositivo de sites perigosos</translation>
 <translation id="2206488550163399966"><ph name="APP_NAME" />, aplicativo da Web. <ph name="APP_URL" /></translation>
@@ -218,7 +217,6 @@
 <translation id="3387650086002190359">Falha no download de <ph name="FILE_NAME" /> devido a erros do sistema de arquivos.</translation>
 <translation id="3398320232533725830">Abrir o gerenciador de favoritos</translation>
 <translation id="3414952576877147120">Tamanho:</translation>
-<translation id="3435896845095436175">Ativar</translation>
 <translation id="3443221991560634068">Atualizar a página atual</translation>
 <translation id="3452612588551937789">Faça login com sua Conta do Google para ter seus favoritos, histórico, senhas e outras configurações em todos os seus dispositivos.</translation>
 <translation id="3487093336331957349">Sugestões de pesquisa e sites</translation>
@@ -318,7 +316,6 @@
 <translation id="4522570452068850558">Detalhes</translation>
 <translation id="4526249700380860531">Ver e gerenciar as senhas salvas em <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation>
 <translation id="4532845899244822526">Escolher pasta</translation>
-<translation id="4535858793016067060">Ative a opção “Fontes desconhecidas” nas configurações de segurança do Android para testar o experimento "Adição aprimorada à tela inicial". Desative essa configuração quando terminar de testá-la.</translation>
 <translation id="4558311620361989323">Atalhos de páginas da Web</translation>
 <translation id="4572422548854449519">Fazer login em conta gerenciada</translation>
 <translation id="4581964774250883625">Você está navegando sem deixar rastros.</translation>
@@ -361,7 +358,6 @@
 <translation id="497421865427891073">Avançar</translation>
 <translation id="4988526792673242964">Páginas</translation>
 <translation id="4996978546172906250">Compartilhar via</translation>
-<translation id="5000922062037820727">Bloqueada (recomendado)</translation>
 <translation id="5004339818306944878">Use até 60% a menos de dados e deixe a Web mais rápida. Os servidores do Google otimizarão as páginas que você visitar.</translation>
 <translation id="5005498671520578047">Copiar senha</translation>
 <translation id="5011311129201317034"><ph name="SITE" /> deseja se conectar</translation>
@@ -402,7 +398,6 @@
 <translation id="5335288049665977812">Permitir que sites executem o JavaScript (recomendado)</translation>
 <translation id="5345040418939504969"><ph name="BOOKMARK_TITLE" /> excluído</translation>
 <translation id="5345083863238459644">O acesso a locais também está <ph name="BEGIN_LINK" />desativado para este dispositivo<ph name="END_LINK" />.</translation>
-<translation id="5349103022427743704">Experimento Adição aprimorada à tela inicial</translation>
 <translation id="5372829067651257087">URL copiado.</translation>
 <translation id="5384883051496921101">Este site está prestes a compartilhar informações com um app fora do modo de navegação anônima.</translation>
 <translation id="5400569084694353794">Ao usar este aplicativo, você concorda com os <ph name="BEGIN_LINK1" />Termos de Serviço<ph name="END_LINK1" /> e com o <ph name="BEGIN_LINK2" />Aviso de Privacidade<ph name="END_LINK2" />.</translation>
@@ -652,7 +647,6 @@
 <translation id="7929962904089429003">Abrir o menu</translation>
 <translation id="7942131818088350342"><ph name="PRODUCT_NAME" /> está desatualizado.</translation>
 <translation id="7947953824732555851">Aceitar/fazer login</translation>
-<translation id="7949961459945740081">Atualizar recursos</translation>
 <translation id="7963646190083259054">Fornecedor:</translation>
 <translation id="7987073022710626672">Termos de Serviço do Chrome</translation>
 <translation id="7998918019931843664">Reabrir guia fechada</translation>
@@ -663,7 +657,6 @@
 <translation id="8015452622527143194">Retornar tudo na página para o tamanho padrão</translation>
 <translation id="802154636333426148">Falha no download</translation>
 <translation id="8026334261755873520">Limpar dados de navegação</translation>
-<translation id="8033827949643255796">selecionado</translation>
 <translation id="8035133914807600019">Nova pasta...</translation>
 <translation id="8037750541064988519"><ph name="DAYS" /> dias restantes</translation>
 <translation id="8051695050440594747"><ph name="MEGABYTES" /> MB disponíveis</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_pt-PT.xtb b/chrome/android/java/strings/translations/android_chrome_strings_pt-PT.xtb
index a952eae..ff2b5e3 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_pt-PT.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_pt-PT.xtb
@@ -116,7 +116,6 @@
 <translation id="2139186145475833000">Adicionar ao ecrã principal</translation>
 <translation id="2146738493024040262">Abrir aplicação instantânea</translation>
 <translation id="2148716181193084225">Hoje</translation>
-<translation id="2154710561487035718">Copiar URL</translation>
 <translation id="2156074688469523661">Sites restantes (<ph name="NUMBER_OF_SITES" />)</translation>
 <translation id="219985413780390209">Proteja-se e ao seu dispositivo contra sites perigosos</translation>
 <translation id="2206488550163399966"><ph name="APP_NAME" />, aplicação Web. <ph name="APP_URL" /></translation>
@@ -218,7 +217,6 @@
 <translation id="3387650086002190359">A transferência de <ph name="FILE_NAME" /> falhou devido a erros do sistema de ficheiros.</translation>
 <translation id="3398320232533725830">Abrir o gestor de marcadores</translation>
 <translation id="3414952576877147120">Tamanho:</translation>
-<translation id="3435896845095436175">Ativar</translation>
 <translation id="3443221991560634068">Atualizar a página atual</translation>
 <translation id="3452612588551937789">Inicie sessão com a sua Conta Google para aceder aos marcadores, ao histórico, às palavras-passe e a outras definições em todos os dispositivos.</translation>
 <translation id="3487093336331957349">Sugestões de pesquisa e de sites</translation>
@@ -234,14 +232,14 @@
 <translation id="3583454905526475291">Impossív. iniciar aplicação</translation>
 <translation id="3587482841069643663">Tudo</translation>
 <translation id="3590487821116122040">Armazenamento do site que o Chrome não considera importante (por exemplo, sites sem definições guardadas ou aos quais não acede com frequência)</translation>
-<translation id="360480449234699036">Saiba mais acerca dos tópicos nos Websites sem sair da página. A funcionalidade Tocar para pesquisar envia uma palavra e o respetivo contexto circundante para a Pesquisa Google, que devolve definições, imagens, resultados da pesquisa e outros detalhes.
+<translation id="360480449234699036">Saiba mais acerca dos tópicos nos Sites sem sair da página. A funcionalidade Tocar para pesquisar envia uma palavra e o respetivo contexto circundante para a Pesquisa Google, que devolve definições, imagens, resultados da pesquisa e outros detalhes.
 
 Para ajustar o termo de pesquisa, prima continuamente para selecionar. Para refinar a sua pesquisa, deslize lentamente o painel totalmente para cima e toque na caixa de pesquisa.</translation>
 <translation id="3616113530831147358">Áudio</translation>
 <translation id="3632295766818638029">Desmascarar palavra-passe</translation>
-<translation id="363596933471559332">Inicie automaticamente sessão em Websites com as credenciais armazenadas. Quando a funcionalidade está desativada, é-lhe sempre pedida validação antes de iniciar sessão num Website.</translation>
+<translation id="363596933471559332">Inicie automaticamente sessão em Sites com as credenciais armazenadas. Quando a funcionalidade está desativada, é-lhe sempre pedida validação antes de iniciar sessão num Website.</translation>
 <translation id="3656115297268584622">Ative a localização nas <ph name="BEGIN_LINK" />Definições do Android<ph name="END_LINK" />.</translation>
-<translation id="3661699943263275414">Os Websites de terceiros podem guardar e ler dados de cookies</translation>
+<translation id="3661699943263275414">Os Sites de terceiros podem guardar e ler dados de cookies</translation>
 <translation id="3662546969139119822">Sem histórico</translation>
 <translation id="3672452749423051839">Sugestões de erros de navegação</translation>
 <translation id="3714981814255182093">Abrir a barra Localizar</translation>
@@ -308,7 +306,7 @@
 <translation id="4378154925671717803">Telefone</translation>
 <translation id="4384468725000734951">A utilizar o Sogou para pesquisa</translation>
 <translation id="4412992751769744546">Permitir cookies de terceiros</translation>
-<translation id="4445444302979002552">Utilizar os serviços de previsão para a sugestão de termos de pesquisa e de Websites</translation>
+<translation id="4445444302979002552">Utilizar os serviços de previsão para a sugestão de termos de pesquisa e de Sites</translation>
 <translation id="4452548195519783679">Adicionado aos marcadores em <ph name="FOLDER_NAME" /></translation>
 <translation id="4453340223357552416"><ph name="FILE_NAME" /> transferido no <ph name="PRODUCT_NAME" /></translation>
 <translation id="4479647676395637221">Perguntar antes de permitir que os sites utilizem a câmara (recomendado)</translation>
@@ -319,7 +317,6 @@
 <translation id="4522570452068850558">Detalhes</translation>
 <translation id="4526249700380860531">Ver e gerir as palavras-passe guardadas em <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation>
 <translation id="4532845899244822526">Escolher pasta</translation>
-<translation id="4535858793016067060">Ative "Fontes desconhecidas" nas definições de segurança do Android para testar a experiência "Adicionar ao ecrã principal" melhorada. Certifique-se de que desativa esta definição quando terminar de a experimentar.</translation>
 <translation id="4558311620361989323">Atalhos da página Web</translation>
 <translation id="4572422548854449519">Iniciar sessão na conta gerida</translation>
 <translation id="4581964774250883625">Entrou no modo de navegação anónima.</translation>
@@ -362,7 +359,6 @@
 <translation id="497421865427891073">Avançar</translation>
 <translation id="4988526792673242964">Páginas </translation>
 <translation id="4996978546172906250">Partilhar através de</translation>
-<translation id="5000922062037820727">Bloqueado (recomendado)</translation>
 <translation id="5004339818306944878">Utilize até menos 60% de dados e acelere a Web. Os servidores da Google otimizam as páginas que visita.</translation>
 <translation id="5005498671520578047">Copiar palavra-passe</translation>
 <translation id="5011311129201317034"><ph name="SITE" /> pretende estabelecer ligação</translation>
@@ -403,7 +399,6 @@
 <translation id="5335288049665977812">Permitir que os sites executem JavaScript (recomendado)</translation>
 <translation id="5345040418939504969"><ph name="BOOKMARK_TITLE" /> eliminado</translation>
 <translation id="5345083863238459644">O acesso à localização também está <ph name="BEGIN_LINK" />desativado neste dispositivo<ph name="END_LINK" />.</translation>
-<translation id="5349103022427743704">Experiência "Adicionar ao ecrã principal" melhorada</translation>
 <translation id="5372829067651257087">URL copiado.</translation>
 <translation id="5384883051496921101">Este site está prestes a partilhar informações com uma aplicação fora do modo de navegação anónima.</translation>
 <translation id="5400569084694353794">Ao utilizar esta aplicação, concorda com os <ph name="BEGIN_LINK1" />Termos de Utilização<ph name="END_LINK1" /> e o <ph name="BEGIN_LINK2" />Aviso de Privacidade<ph name="END_LINK2" /> do Chrome.</translation>
@@ -441,7 +436,7 @@
 <translation id="5684874026226664614">Ups! Não foi possível traduzir esta página.</translation>
 <translation id="5719837394786370183">As páginas que visualizar em separadores de navegação anónima não serão guardadas no histórico do navegador, no armazenamento de cookies ou no histórico de pesquisas depois de fechar todos os separadores de navegação anónima. Os ficheiros que transferir ou os marcadores que criar manter-se-ão.
 
-No entanto, a navegação não é invisível. Passar para o modo de navegação anónima não oculta a navegação do empregador ou do prestador de serviços de Internet, nem os Websites que visitar.</translation>
+No entanto, a navegação não é invisível. Passar para o modo de navegação anónima não oculta a navegação do empregador ou do prestador de serviços de Internet, nem os Sites que visitar.</translation>
 <translation id="572328651809341494">Separadores recentes</translation>
 <translation id="572392919096807438">Memorizar a minha decisão</translation>
 <translation id="5726692708398506830">Aumentar o tamanho de todos os itens na página</translation>
@@ -491,7 +486,7 @@
 <translation id="6192792657125177640">Excepções</translation>
 <translation id="6232535412751077445">A ativação da funcionalidade "Não Monitorizar" significa que é incluído um pedido no seu tráfego de navegação. Qualquer efeito depende de um Website responder ou não ao pedido e do modo como o pedido é interpretado.
 
-Por exemplo, alguns Websites podem responder a este pedido ao mostrar-lhe anúncios que não são baseados noutros Websites que tenha visitado. Ainda assim, muitos Websites continuam a recolher e a utilizar os seus dados de navegação para, por exemplo, melhorar a segurança, fornecer conteúdo, anúncios e recomendações, e gerar estatísticas de relatórios.</translation>
+Por exemplo, alguns Sites podem responder a este pedido ao mostrar-lhe anúncios que não são baseados noutros Sites que tenha visitado. Ainda assim, muitos Sites continuam a recolher e a utilizar os seus dados de navegação para, por exemplo, melhorar a segurança, fornecer conteúdo, anúncios e recomendações, e gerar estatísticas de relatórios.</translation>
 <translation id="6277522088822131679">Ocorreu um problema ao imprimir a página. Tente novamente.</translation>
 <translation id="6295158916970320988">Todos os sites</translation>
 <translation id="6320088164292336938">Vibrar</translation>
@@ -538,7 +533,7 @@
 <translation id="6656545060687952787">O Chrome necessita de acesso à localização para procurar dispositivos. <ph name="BEGIN_LINK" />Atualizar autorizações<ph name="END_LINK" /></translation>
 <translation id="6657585470893396449">Palavra-passe</translation>
 <translation id="6659594942844771486">Tab</translation>
-<translation id="666268767214822976">Utilizar um serviço de previsão para mostrar consultas relacionadas e Websites populares à medida que escreve na barra de endereço</translation>
+<translation id="666268767214822976">Utilizar um serviço de previsão para mostrar consultas relacionadas e Sites populares à medida que escreve na barra de endereço</translation>
 <translation id="666731172850799929">Abrir no <ph name="APP_NAME" /></translation>
 <translation id="666981079809192359">Aviso de privacidade do Chrome</translation>
 <translation id="6698801883190606802">Gerir dados sincronizados</translation>
@@ -550,7 +545,7 @@
 <translation id="6770414673596662518">O sistema de Navegação segura do Chrome também será utilizado para detetar páginas maliciosas e para o proteger contra phishing, programas maliciosos e transferências prejudiciais.</translation>
 <translation id="6790428901817661496">Reproduzir</translation>
 <translation id="679325081238418596">Obter os marcadores, histórico, palavras-passe e outras definições em todos os dispositivos</translation>
-<translation id="6820607729870073286">Não tem definições de Websites guardadas.</translation>
+<translation id="6820607729870073286">Não tem definições de Sites guardadas.</translation>
 <translation id="6820686453637990663">Código de segurança</translation>
 <translation id="6831043979455480757">Traduzir</translation>
 <translation id="6846298663435243399">A carregar…</translation>
@@ -654,7 +649,6 @@
 <translation id="7929962904089429003">Abrir o menu</translation>
 <translation id="7942131818088350342">O <ph name="PRODUCT_NAME" /> está desatualizado.</translation>
 <translation id="7947953824732555851">Aceitar e in. sessão</translation>
-<translation id="7949961459945740081">Obter funcionalidades recentes</translation>
 <translation id="7963646190083259054">Fornecedor:</translation>
 <translation id="7987073022710626672">Termos de Utilização do Chrome</translation>
 <translation id="7998918019931843664">Reabrir separador fechado</translation>
@@ -665,7 +659,6 @@
 <translation id="8015452622527143194">Repor tamanho predefinido dos itens na página</translation>
 <translation id="802154636333426148">Falha ao transferir</translation>
 <translation id="8026334261755873520">Limpar dados de navegação</translation>
-<translation id="8033827949643255796">selecionado</translation>
 <translation id="8035133914807600019">Nova pasta…</translation>
 <translation id="8037750541064988519">Faltam <ph name="DAYS" /> dias</translation>
 <translation id="8051695050440594747"><ph name="MEGABYTES" /> MB disponíveis</translation>
@@ -700,7 +693,7 @@
 <translation id="8393700583063109961">Enviar mensagem</translation>
 <translation id="8413126021676339697">Mostrar histórico completo</translation>
 <translation id="8428213095426709021">Definições</translation>
-<translation id="8433057134996913067">Esta opção termina a sessão na maioria dos Websites.</translation>
+<translation id="8433057134996913067">Esta opção termina a sessão na maioria dos Sites.</translation>
 <translation id="8441146129660941386">Procurar para trás</translation>
 <translation id="8447861592752582886">Revogar autorização do dispositivo</translation>
 <translation id="8487700953926739672">Disponível offline</translation>
@@ -734,7 +727,7 @@
 <translation id="8741995161408053644">A sua Conta Google pode ter outras formas do histórico de navegação em <ph name="BEGIN_LINK" />history.google.com<ph name="END_LINK" />.</translation>
 <translation id="8748850008226585750">Conteúdo ocultado</translation>
 <translation id="8788968922598763114">Reabrir o último separador fechado</translation>
-<translation id="8812260976093120287">Nalguns Websites, é possível pagar com as aplicações de pagamento compatíveis acima no dispositivo.</translation>
+<translation id="8812260976093120287">Nalguns Sites, é possível pagar com as aplicações de pagamento compatíveis acima no dispositivo.</translation>
 <translation id="8820817407110198400">Marcadores</translation>
 <translation id="883635517171802338">Impedir a apresentação de pop-ups por parte dos sites (recomendado)</translation>
 <translation id="8847988622838149491">USB</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb
index cda8c671..8f988e5 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb
@@ -116,7 +116,6 @@
 <translation id="2139186145475833000">Adaugă pe ecran pornire</translation>
 <translation id="2146738493024040262">Deschide aplicația instantanee</translation>
 <translation id="2148716181193084225">Astăzi</translation>
-<translation id="2154710561487035718">Copiați adresa URL</translation>
 <translation id="2156074688469523661">Site-uri rămase (<ph name="NUMBER_OF_SITES" />)</translation>
 <translation id="219985413780390209">Protecție împotriva site-urilor periculoase</translation>
 <translation id="2206488550163399966"><ph name="APP_NAME" />, aplicație web. <ph name="APP_URL" /></translation>
@@ -218,7 +217,6 @@
 <translation id="3387650086002190359">Descărcarea fișierului <ph name="FILE_NAME" /> nu a reușit din cauza unor erori privind sistemul de fișiere.</translation>
 <translation id="3398320232533725830">Deschide managerul de marcaje</translation>
 <translation id="3414952576877147120">Dimensiune:</translation>
-<translation id="3435896845095436175">Activează</translation>
 <translation id="3443221991560634068">Reîncarcă pagina curentă</translation>
 <translation id="3452612588551937789">Conectează-te folosind Contul Google pentru a accesa marcajele, istoricul, parolele și alte setări pe toate dispozitivele.</translation>
 <translation id="3487093336331957349">Sugestii de căutare și de site-uri</translation>
@@ -319,7 +317,6 @@
 <translation id="4522570452068850558">Detalii</translation>
 <translation id="4526249700380860531">Vezi și gestionează parolele salvate la <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation>
 <translation id="4532845899244822526">Alege dosarul</translation>
-<translation id="4535858793016067060">Activează opțiunea „Surse necunoscute” din setările de securitate Android ca să încerci experimentul „Funcția îmbunătățită Adaugă pe ecranul de pornire”. Asigură-te că dezactivezi această setare după ce ai încercat-o.</translation>
 <translation id="4558311620361989323">Comenzi rapide pentru pagini web</translation>
 <translation id="4572422548854449519">Conectează-te la contul gestionat</translation>
 <translation id="4581964774250883625">Ai trecut în modul incognito.</translation>
@@ -362,7 +359,6 @@
 <translation id="497421865427891073">Înainte</translation>
 <translation id="4988526792673242964">Pagini</translation>
 <translation id="4996978546172906250">Trimiteți prin</translation>
-<translation id="5000922062037820727">Blocată (recomandat)</translation>
 <translation id="5004339818306944878">Folosește cu până la 60% mai puține date și navighează mai rapid pe web. Serverele Google vor optimiza paginile pe care le accesezi.</translation>
 <translation id="5005498671520578047">Copiază parola</translation>
 <translation id="5011311129201317034"><ph name="SITE" /> dorește să se conecteze</translation>
@@ -403,7 +399,6 @@
 <translation id="5335288049665977812">Permite site-urilor să ruleze JavaScript (recomandat)</translation>
 <translation id="5345040418939504969"><ph name="BOOKMARK_TITLE" /> a fost șters</translation>
 <translation id="5345083863238459644">Accesul la locație este <ph name="BEGIN_LINK" />dezactivat și pe acest dispozitiv<ph name="END_LINK" />.</translation>
-<translation id="5349103022427743704">Experimentul „Funcția îmbunătățită Adaugă pe ecranul de pornire”</translation>
 <translation id="5372829067651257087">Adresa URL a fost copiată.</translation>
 <translation id="5384883051496921101">Site-ul este pe cale să permită accesul la informații unei aplicații în afara modului incognito.</translation>
 <translation id="5400569084694353794">Folosind această aplicație, accepți <ph name="BEGIN_LINK1" />Termenii și condițiile<ph name="END_LINK1" /> și <ph name="BEGIN_LINK2" />Notificarea privind confidențialitatea<ph name="END_LINK2" /> Chrome.</translation>
@@ -654,7 +649,6 @@
 <translation id="7929962904089429003">Deschide meniul</translation>
 <translation id="7942131818088350342"><ph name="PRODUCT_NAME" /> este învechit.</translation>
 <translation id="7947953824732555851">Accept și conectare</translation>
-<translation id="7949961459945740081">Obține ultimele funcții</translation>
 <translation id="7963646190083259054">Producător:</translation>
 <translation id="7987073022710626672">Termenii și condițiile Chrome</translation>
 <translation id="7998918019931843664">Redeschideți fila închisă</translation>
@@ -665,7 +659,6 @@
 <translation id="8015452622527143194">Readuce pagina la dimensiunea prestabilită</translation>
 <translation id="802154636333426148">Descărcarea nu a reușit</translation>
 <translation id="8026334261755873520">Șterge datele de navigare</translation>
-<translation id="8033827949643255796">selectate</translation>
 <translation id="8035133914807600019">Dosar nou…</translation>
 <translation id="8037750541064988519"><ph name="DAYS" /> zile rămase</translation>
 <translation id="8051695050440594747"><ph name="MEGABYTES" /> MO disponibili</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb
index 3b8cf58..014716ef 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb
@@ -116,7 +116,6 @@
 <translation id="2139186145475833000">Добавить на главный экран</translation>
 <translation id="2146738493024040262">Открыть приложение с мгновенным запуском</translation>
 <translation id="2148716181193084225">Сегодня</translation>
-<translation id="2154710561487035718">Копировать URL</translation>
 <translation id="2156074688469523661">Прочие сайты (<ph name="NUMBER_OF_SITES" />)</translation>
 <translation id="219985413780390209">Защитить устройство от опасных сайтов</translation>
 <translation id="2206488550163399966">Приложение "<ph name="APP_NAME" />" (<ph name="APP_URL" />)</translation>
@@ -218,7 +217,6 @@
 <translation id="3387650086002190359">Не удалось скачать файл <ph name="FILE_NAME" /> из-за ошибок файловой системы.</translation>
 <translation id="3398320232533725830">Открыть диспетчер закладок</translation>
 <translation id="3414952576877147120">Размер:</translation>
-<translation id="3435896845095436175">Включить</translation>
 <translation id="3443221991560634068">Обновить страницу</translation>
 <translation id="3452612588551937789">Войдите в аккаунт Google, чтобы пользоваться закладками, паролями, историей и другими вашими настройками на любом устройстве.</translation>
 <translation id="3487093336331957349">Подсказки запросов и сайтов</translation>
@@ -319,7 +317,6 @@
 <translation id="4522570452068850558">Подробнее</translation>
 <translation id="4526249700380860531">Просматривайте сохраненные пароли и управляйте ими на странице <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation>
 <translation id="4532845899244822526">Выбор папки</translation>
-<translation id="4535858793016067060">Хотите опробовать экспериментальную улучшенную функцию добавления на главный экран? Разрешите установку приложений из неизвестных источников в настройках безопасности устройства Android. Позже этот параметр можно будет отключить.</translation>
 <translation id="4558311620361989323">Работа с веб-страницами</translation>
 <translation id="4572422548854449519">Войдите в управляемый аккаунт</translation>
 <translation id="4581964774250883625">Вы перешли в режим инкогнито</translation>
@@ -362,7 +359,6 @@
 <translation id="497421865427891073">Вперед</translation>
 <translation id="4988526792673242964">Страницы</translation>
 <translation id="4996978546172906250">Способ отправки</translation>
-<translation id="5000922062037820727">Заблокировано (рекомендуется)</translation>
 <translation id="5004339818306944878">Экономьте до 60% трафика и сделайте интернет-соединение быстрее. Сервера Google будут оптимизировать загружаемые страницы.</translation>
 <translation id="5005498671520578047">Для копирования пароля</translation>
 <translation id="5011311129201317034">Сайт <ph name="SITE" /> запрашивает подключение</translation>
@@ -403,7 +399,6 @@
 <translation id="5335288049665977812">Разрешить сайтам использовать JavaScript (рекомендуется)</translation>
 <translation id="5345040418939504969">Закладка "<ph name="BOOKMARK_TITLE" />" удалена</translation>
 <translation id="5345083863238459644">На этом устройстве также <ph name="BEGIN_LINK" />открыт<ph name="END_LINK" /> доступ к местоположению.</translation>
-<translation id="5349103022427743704">Улучшенная экспериментальная функция "Добавить на главный экран"</translation>
 <translation id="5372829067651257087">URL скопирован.</translation>
 <translation id="5384883051496921101">Этот сайт передает информацию стороннему приложению, пока вы в режиме инкогнито.</translation>
 <translation id="5400569084694353794">Работая с приложением, вы принимаете <ph name="BEGIN_LINK1" />Условия использования<ph name="END_LINK1" /> и <ph name="BEGIN_LINK2" />Примечание о конфиденциальности<ph name="END_LINK2" /> Chrome.</translation>
@@ -654,7 +649,6 @@
 <translation id="7929962904089429003">Открыть меню</translation>
 <translation id="7942131818088350342">Версия <ph name="PRODUCT_NAME" /> устарела.</translation>
 <translation id="7947953824732555851">Принять и войти</translation>
-<translation id="7949961459945740081">C новыми функциями</translation>
 <translation id="7963646190083259054">Поставщик:</translation>
 <translation id="7987073022710626672">Условия использования Chrome</translation>
 <translation id="7998918019931843664">Восстановить закрытую вкладку</translation>
@@ -665,7 +659,6 @@
 <translation id="8015452622527143194">Восстановить масштаб страницы по умолчанию</translation>
 <translation id="802154636333426148">Ошибка скачивания</translation>
 <translation id="8026334261755873520">Очистить историю</translation>
-<translation id="8033827949643255796">Выделено.</translation>
 <translation id="8035133914807600019">Создать папку…</translation>
 <translation id="8037750541064988519">Осталось <ph name="DAYS" /> дн.</translation>
 <translation id="8051695050440594747">Доступно <ph name="MEGABYTES" /> МБ</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sk.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sk.xtb
index e37c747..59d18d06 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_sk.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_sk.xtb
@@ -116,7 +116,6 @@
 <translation id="2139186145475833000">Pridať na domovskú stránku</translation>
 <translation id="2146738493024040262">Otvoriť okamžitú aplikáciu</translation>
 <translation id="2148716181193084225">Dnes</translation>
-<translation id="2154710561487035718">Kopírovať webovú adresu</translation>
 <translation id="2156074688469523661">Zostávajúce weby (<ph name="NUMBER_OF_SITES" />)</translation>
 <translation id="219985413780390209">Ochráňte seba aj svoje zariadenie pred nebezpečnými stránkami</translation>
 <translation id="2206488550163399966"><ph name="APP_NAME" />, webová aplikácia: <ph name="APP_URL" /></translation>
@@ -218,7 +217,6 @@
 <translation id="3387650086002190359">Súbor <ph name="FILE_NAME" /> sa nepodarilo stiahnuť z dôvodu chýb systému súborov.</translation>
 <translation id="3398320232533725830">Otvorenie správcu záložiek</translation>
 <translation id="3414952576877147120">Veľkosť:</translation>
-<translation id="3435896845095436175">Aktivovať</translation>
 <translation id="3443221991560634068">Opätovné načítanie aktuálnej stránky</translation>
 <translation id="3452612588551937789">Prihláste sa pomocou účtu Google a získajte záložky, históriu, heslá a ďalšie nastavenia na všetkých svojich zariadeniach.</translation>
 <translation id="3487093336331957349">Návrhy vyhľadávania a webov</translation>
@@ -319,7 +317,6 @@
 <translation id="4522570452068850558">Podrobnosti</translation>
 <translation id="4526249700380860531">Zobrazte si a spravujte uložené heslá na stránke <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation>
 <translation id="4532845899244822526">Výber priečinka</translation>
-<translation id="4535858793016067060">Ak chcete vyskúšať experimentálnu funkciu „Zlepšené pridávanie na plochu“, zapnite v nastaveniach zabezpečenia Androidu položku „Neznáme zdroje“. Po dokončení skúšania nezabudnite toto nastavenie opäť deaktivovať.</translation>
 <translation id="4558311620361989323">Skratky pre webové stránky</translation>
 <translation id="4572422548854449519">Prihlásenie do spravovaného účtu</translation>
 <translation id="4581964774250883625">Ste v režime inkognito.</translation>
@@ -362,7 +359,6 @@
 <translation id="497421865427891073">Ďalej</translation>
 <translation id="4988526792673242964">Stránky</translation>
 <translation id="4996978546172906250">Zdieľať prostredníctvom</translation>
-<translation id="5000922062037820727">Blokované (odporúčané)</translation>
 <translation id="5004339818306944878">Ušetrite až 60 % dát a načítajte weby rýchlejšie. Servery Google budú optimalizovať stránky, ktoré navštívite.</translation>
 <translation id="5005498671520578047">Kopírovanie hesla</translation>
 <translation id="5011311129201317034"><ph name="SITE" /> žiada o pripojenie</translation>
@@ -403,7 +399,6 @@
 <translation id="5335288049665977812">Povoliť webom spúšťať JavaScript (odporúča sa)</translation>
 <translation id="5345040418939504969">Záložka <ph name="BOOKMARK_TITLE" /> bola odstránená</translation>
 <translation id="5345083863238459644">Prístup k polohe je <ph name="BEGIN_LINK" />vypnutý aj v tomto zariadení<ph name="END_LINK" />.</translation>
-<translation id="5349103022427743704">Experimentálna funkcia Zlepšené pridávanie na plochu</translation>
 <translation id="5372829067651257087">Webová adresa bola skopírovaná.</translation>
 <translation id="5384883051496921101">Tento web chce zdieľať informácie s aplikáciou mimo režimu inkognito.</translation>
 <translation id="5400569084694353794">Používaním tejto aplikácie vyjadrujete súhlas so <ph name="BEGIN_LINK1" />zmluvnými podmienkami<ph name="END_LINK1" /> a <ph name="BEGIN_LINK2" />upozornením o ochrane osobných údajov<ph name="END_LINK2" /> prehliadača Chrome.</translation>
@@ -654,7 +649,6 @@
 <translation id="7929962904089429003">Otvorenie ponuky</translation>
 <translation id="7942131818088350342">Aplikácia <ph name="PRODUCT_NAME" /> je zastaraná.</translation>
 <translation id="7947953824732555851">Prijať a prihl. sa</translation>
-<translation id="7949961459945740081">Získať najnovšie funkcie</translation>
 <translation id="7963646190083259054">Dodávateľ:</translation>
 <translation id="7987073022710626672">Zmluvné podmienky prehliadača Chrome</translation>
 <translation id="7998918019931843664">Znova otvoriť zavretú kartu</translation>
@@ -665,7 +659,6 @@
 <translation id="8015452622527143194">Vrátenie obsahu stránky na predvolenú veľkosť</translation>
 <translation id="802154636333426148">Stiahnutie zlyhalo</translation>
 <translation id="8026334261755873520">Vymazať dáta prehliadania</translation>
-<translation id="8033827949643255796">vybrané</translation>
 <translation id="8035133914807600019">Nový priečinok…</translation>
 <translation id="8037750541064988519">Zostáva: <ph name="DAYS" /> d</translation>
 <translation id="8051695050440594747"><ph name="MEGABYTES" /> MB k dispozícii</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb
index 1fc0d1d4..4caabc4d 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb
@@ -116,7 +116,6 @@
 <translation id="2139186145475833000">Dodajanje na začetni zaslon</translation>
 <translation id="2146738493024040262">Odpri nenamestljivo aplikacijo</translation>
 <translation id="2148716181193084225">Danes</translation>
-<translation id="2154710561487035718">Kopiraj URL</translation>
 <translation id="2156074688469523661">Preostala spletna mesta (<ph name="NUMBER_OF_SITES" />)</translation>
 <translation id="219985413780390209">Zaščitite sebe in napravo pred nevarnimi spletnimi mesti</translation>
 <translation id="2206488550163399966"><ph name="APP_NAME" />, spletna aplikacija. <ph name="APP_URL" /></translation>
@@ -218,7 +217,6 @@
 <translation id="3387650086002190359">Prenos datoteke <ph name="FILE_NAME" /> ni uspel zaradi napak v datotečnem sistemu.</translation>
 <translation id="3398320232533725830">Odpiranje upravitelja zaznamkov</translation>
 <translation id="3414952576877147120">Velikost:</translation>
-<translation id="3435896845095436175">Omogoči</translation>
 <translation id="3443221991560634068">Vnovično nalaganje trenutne strani</translation>
 <translation id="3452612588551937789">Prijavite se z Google Računom, da boste zaznamke, zgodovino, gesla in druge nastavitve imeli na voljo v vseh napravah.</translation>
 <translation id="3487093336331957349">Predlogi za iskanje in spletna mesta</translation>
@@ -319,7 +317,6 @@
 <translation id="4522570452068850558">Podrobnosti</translation>
 <translation id="4526249700380860531">Ogled in upravljanje shranjenih gesel na <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation>
 <translation id="4532845899244822526">Izbira mape</translation>
-<translation id="4535858793016067060">V varnostnih nastavitvah Androida vklopite »Neznani viri«, če želite zagnati preizkus »Izboljšano dodajanje na začetni zaslon«. Ko končate preizkus, to nastavitev onemogočite.</translation>
 <translation id="4558311620361989323">Bližnjice za spletne strani</translation>
 <translation id="4572422548854449519">Prijava v upravljani račun</translation>
 <translation id="4581964774250883625">Zdaj se vaše brskanje ne shranjuje v zgodovino.</translation>
@@ -362,7 +359,6 @@
 <translation id="497421865427891073">Pojdi naprej</translation>
 <translation id="4988526792673242964">Strani</translation>
 <translation id="4996978546172906250">Skupna raba prek</translation>
-<translation id="5000922062037820727">Blokirano (priporočeno)</translation>
 <translation id="5004339818306944878">Prenesite do 60 % manj podatkov in zagotovite hitrejše delovanje spleta. Googlovi strežniki optimizirajo strani, ki jih obiščete.</translation>
 <translation id="5005498671520578047">Kopiranje gesla</translation>
 <translation id="5011311129201317034"><ph name="SITE" /> se želite povezati</translation>
@@ -403,7 +399,6 @@
 <translation id="5335288049665977812">Spletnim mestom dovoli izvajanje JavaScripta (priporočeno)</translation>
 <translation id="5345040418939504969">Izbrisano: <ph name="BOOKMARK_TITLE" /></translation>
 <translation id="5345083863238459644">Dostop do lokacije je prav tako <ph name="BEGIN_LINK" />izklopljen za to napravo<ph name="END_LINK" />.</translation>
-<translation id="5349103022427743704">Preizkus »Izboljšano dodajanje na začetni zaslon«</translation>
 <translation id="5372829067651257087">URL je kopiran.</translation>
 <translation id="5384883051496921101">To spletno mesto bo delilo podatke z aplikacijo zunaj načina brez beleženja zgodovine.</translation>
 <translation id="5400569084694353794">Če uporabljate to aplikacijo, se strinjate s <ph name="BEGIN_LINK1" />pogoji storitve<ph name="END_LINK1" /> in <ph name="BEGIN_LINK2" />pravilnikom o zasebnosti<ph name="END_LINK2" /> za Chrome.</translation>
@@ -654,7 +649,6 @@
 <translation id="7929962904089429003">Odpiranje menija</translation>
 <translation id="7942131818088350342">Izdelek <ph name="PRODUCT_NAME" /> je zastarel.</translation>
 <translation id="7947953824732555851">Sprejem in prijava</translation>
-<translation id="7949961459945740081">Prejmite najnovejše funkcije</translation>
 <translation id="7963646190083259054">Ponudnik:</translation>
 <translation id="7987073022710626672">Pogoji storitve za Chrome</translation>
 <translation id="7998918019931843664">Vnovično odpiranje zaprtega zavihka</translation>
@@ -665,7 +659,6 @@
 <translation id="8015452622527143194">Vrnitev vsebine strani na privzeto velikost</translation>
 <translation id="802154636333426148">Prenos ni uspel</translation>
 <translation id="8026334261755873520">Izbriši podatke brskanja</translation>
-<translation id="8033827949643255796">izbrani</translation>
 <translation id="8035133914807600019">Nova mapa …</translation>
 <translation id="8037750541064988519">Še <ph name="DAYS" /> dni</translation>
 <translation id="8051695050440594747"><ph name="MEGABYTES" /> MB na voljo</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb
index 03b2d83..2e98990 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb
@@ -116,7 +116,6 @@
 <translation id="2139186145475833000">Додај на почетни екран</translation>
 <translation id="2146738493024040262">Отвори инстант апликацију</translation>
 <translation id="2148716181193084225">Данас</translation>
-<translation id="2154710561487035718">Копирање URL адресе</translation>
 <translation id="2156074688469523661">Преостали сајтови (<ph name="NUMBER_OF_SITES" />)</translation>
 <translation id="219985413780390209">Заштите себе и уређај од опасних сајтова</translation>
 <translation id="2206488550163399966"><ph name="APP_NAME" />, веб-апликација. <ph name="APP_URL" /></translation>
@@ -218,7 +217,6 @@
 <translation id="3387650086002190359">Преузимање датотеке <ph name="FILE_NAME" /> није успело због грешака система датотека.</translation>
 <translation id="3398320232533725830">Отварање Менаџера обележивача</translation>
 <translation id="3414952576877147120">Величина:</translation>
-<translation id="3435896845095436175">Омогући</translation>
 <translation id="3443221991560634068">Поновно учитавање актуелне странице</translation>
 <translation id="3452612588551937789">Пријавите се на Google налог да би вам обележивачи, историја, лозинке и друга подешавања били доступни на свим уређајима.</translation>
 <translation id="3487093336331957349">Предлози за претрагу и сајтове</translation>
@@ -319,7 +317,6 @@
 <translation id="4522570452068850558">Детаљи</translation>
 <translation id="4526249700380860531">Прегледајте сачуване лозинке и управљајте њима на <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation>
 <translation id="4532845899244822526">Изаберите директоријум</translation>
-<translation id="4535858793016067060">Укључите подешавање „Непознати извори“ у Android безбедносним подешавањима да бисте испробали експеримент „Побољшано додавање на почетни екран“. Обавезно онемогућите ово подешавање када будете завршили са испробавањем.</translation>
 <translation id="4558311620361989323">Пречице за веб-странице</translation>
 <translation id="4572422548854449519">Пријавите се на налог којим се управља</translation>
 <translation id="4581964774250883625">Прешли сте у режим без архивирања.</translation>
@@ -362,7 +359,6 @@
 <translation id="497421865427891073">Кретање унапред</translation>
 <translation id="4988526792673242964">Странице</translation>
 <translation id="4996978546172906250">Дељење преко</translation>
-<translation id="5000922062037820727">Блокирано (препоручено)</translation>
 <translation id="5004339818306944878">Користите и до 60% мање података и убрзајте веб. Google сервери оптимизују странице које посећујете.</translation>
 <translation id="5005498671520578047">Копирање лозинке</translation>
 <translation id="5011311129201317034"><ph name="SITE" /> жели да се повеже</translation>
@@ -403,7 +399,6 @@
 <translation id="5335288049665977812">Дозволи сајтовима да покрећу JavaScript (препоручено)</translation>
 <translation id="5345040418939504969">Обележивач <ph name="BOOKMARK_TITLE" /> је избрисан</translation>
 <translation id="5345083863238459644">Приступ локацији је <ph name="BEGIN_LINK" />искључен и за овај уређај<ph name="END_LINK" />.</translation>
-<translation id="5349103022427743704">Експеримент Побољшано додавање на почетни екран</translation>
 <translation id="5372829067651257087">URL је копиран.</translation>
 <translation id="5384883051496921101">Овај сајт ће делити информације са апликацијом изван режима без архивирања.</translation>
 <translation id="5400569084694353794">Коришћењем ове апликације прихватате <ph name="BEGIN_LINK1" />Услове коришћења услуге<ph name="END_LINK1" /> и <ph name="BEGIN_LINK2" />Обавештење о приватности<ph name="END_LINK2" /> за Chrome.</translation>
@@ -654,7 +649,6 @@
 <translation id="7929962904089429003">Отворите мени</translation>
 <translation id="7942131818088350342">Производ <ph name="PRODUCT_NAME" /> је застарео.</translation>
 <translation id="7947953824732555851">Прихвати и пријави ме</translation>
-<translation id="7949961459945740081">Набавите најновије функције</translation>
 <translation id="7963646190083259054">Продавац:</translation>
 <translation id="7987073022710626672">Chrome услови коришћења услуге</translation>
 <translation id="7998918019931843664">Поново отворите затворену картицу</translation>
@@ -665,7 +659,6 @@
 <translation id="8015452622527143194">Враћање целокупног приказа странице на подразумевану величину</translation>
 <translation id="802154636333426148">Преузимање није успело</translation>
 <translation id="8026334261755873520">Обришите податке прегледања</translation>
-<translation id="8033827949643255796">изабрано</translation>
 <translation id="8035133914807600019">Нови директоријум...</translation>
 <translation id="8037750541064988519">Још <ph name="DAYS" /> дана</translation>
 <translation id="8051695050440594747">Доступно је <ph name="MEGABYTES" /> MB</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb
index 215f05e..835ed3f1 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb
@@ -116,7 +116,6 @@
 <translation id="2139186145475833000">Lägg till på startskärmen</translation>
 <translation id="2146738493024040262">Öppna snabbappen</translation>
 <translation id="2148716181193084225">Idag</translation>
-<translation id="2154710561487035718">Kopiera webbadress</translation>
 <translation id="2156074688469523661">Återstående webbplatser (<ph name="NUMBER_OF_SITES" />)</translation>
 <translation id="219985413780390209">Skydda dig själv och enheten från farliga webbplatser</translation>
 <translation id="2206488550163399966"><ph name="APP_NAME" />, webbapp. <ph name="APP_URL" /></translation>
@@ -218,7 +217,6 @@
 <translation id="3387650086002190359">Det gick inte att ladda ned <ph name="FILE_NAME" /> på grund av filsystemfel.</translation>
 <translation id="3398320232533725830">Öppna bokmärkeshanteraren</translation>
 <translation id="3414952576877147120">Storlek:</translation>
-<translation id="3435896845095436175">Aktivera</translation>
 <translation id="3443221991560634068">Läs in den aktuella sidan igen</translation>
 <translation id="3452612588551937789">Logga in med ditt Google-konto så att du kan använda bokmärken, lösenord, historik med mera på alla dina enheter.</translation>
 <translation id="3487093336331957349">Sök- och webbplatsförslag</translation>
@@ -319,7 +317,6 @@
 <translation id="4522570452068850558">Info</translation>
 <translation id="4526249700380860531">Visa och hantera sparade lösenord på <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation>
 <translation id="4532845899244822526">Välj mapp</translation>
-<translation id="4535858793016067060">Aktivera Okända källor i säkerhetsinställningarna för Android när du vill testa Förbättrad experimentversion av Lägg till på startskärmen. Kom ihåg att inaktivera inställningen när du har testat klart.</translation>
 <translation id="4558311620361989323">Kortkommandon på webbsidor</translation>
 <translation id="4572422548854449519">Logga in på hanterat konto</translation>
 <translation id="4581964774250883625">Du surfar inkognito.</translation>
@@ -362,7 +359,6 @@
 <translation id="497421865427891073">Fortsätt</translation>
 <translation id="4988526792673242964">Sidor</translation>
 <translation id="4996978546172906250">Dela via</translation>
-<translation id="5000922062037820727">Blockerad (rekommenderas)</translation>
 <translation id="5004339818306944878">Använd upp till 60 procent mindre data och gör webben snabbare. Googles servrar optimerar de sidor du besöker.</translation>
 <translation id="5005498671520578047">Kopiera lösenord</translation>
 <translation id="5011311129201317034"><ph name="SITE" /> vill ansluta</translation>
@@ -403,7 +399,6 @@
 <translation id="5335288049665977812">Tillåt att Javascript körs på webbplatser (rekommenderas)</translation>
 <translation id="5345040418939504969"><ph name="BOOKMARK_TITLE" /> raderades</translation>
 <translation id="5345083863238459644">Platsåtkomst har också <ph name="BEGIN_LINK" />inaktiverats för enheten<ph name="END_LINK" />.</translation>
-<translation id="5349103022427743704">Förbättrad experimentversion av Lägg till på startskärmen</translation>
 <translation id="5372829067651257087">Webbadress kopierad.</translation>
 <translation id="5384883051496921101">Data på den här webbplatsen delas med en app utanför inkognitoläget.</translation>
 <translation id="5400569084694353794">Genom att använda det här programmet godkänner du Chromes <ph name="BEGIN_LINK1" />användarvillkor<ph name="END_LINK1" /> och <ph name="BEGIN_LINK2" />sekretessmeddelande<ph name="END_LINK2" />.</translation>
@@ -654,7 +649,6 @@
 <translation id="7929962904089429003">Öppna menyn</translation>
 <translation id="7942131818088350342"><ph name="PRODUCT_NAME" /> är inaktuell.</translation>
 <translation id="7947953824732555851">Godkänn och logga in</translation>
-<translation id="7949961459945740081">Få de senaste funktionerna</translation>
 <translation id="7963646190083259054">Leverantör:</translation>
 <translation id="7987073022710626672">Chromes användarvillkor</translation>
 <translation id="7998918019931843664">Öppna en stängd flik på nytt</translation>
@@ -665,7 +659,6 @@
 <translation id="8015452622527143194">Återställ allt på sidan till standardstorlek</translation>
 <translation id="802154636333426148">Nedladdningen misslyckades</translation>
 <translation id="8026334261755873520">Rensa webbinformation</translation>
-<translation id="8033827949643255796">markerat</translation>
 <translation id="8035133914807600019">Ny mapp …</translation>
 <translation id="8037750541064988519"><ph name="DAYS" /> dagar kvar</translation>
 <translation id="8051695050440594747"><ph name="MEGABYTES" /> MB tillgängliga</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb
index 909878a9b..4a0f1b0 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb
@@ -116,7 +116,6 @@
 <translation id="2139186145475833000">Ongeza kwenye skrini ya kwanza</translation>
 <translation id="2146738493024040262">Fungua Programu Inayofunguka Papo Hapo</translation>
 <translation id="2148716181193084225">Leo</translation>
-<translation id="2154710561487035718">Nakili UR:</translation>
 <translation id="2156074688469523661">Tovuti zilizosalia (<ph name="NUMBER_OF_SITES" />)</translation>
 <translation id="219985413780390209">Jilinde na ulinde vifaa vyako dhidi ya tovuti hatari</translation>
 <translation id="2206488550163399966"><ph name="APP_NAME" />, programu ya wavuti. <ph name="APP_URL" /></translation>
@@ -218,7 +217,6 @@
 <translation id="3387650086002190359">Kipakuliwa cha <ph name="FILE_NAME" /> hakijafaulu kwa sababu ya hitilafu za mfumo wa faili.</translation>
 <translation id="3398320232533725830">Fungua kidhibiti cha alamisho</translation>
 <translation id="3414952576877147120">Ukubwa:</translation>
-<translation id="3435896845095436175">Washa</translation>
 <translation id="3443221991560634068">Pakia upya ukurasa wa sasa</translation>
 <translation id="3452612588551937789">Ingia kwa kutumia Akaunti yako ya Google ili upate alamisho, historia, manenosiri na mipangilio mingine kwenye vifaa vyako vyote.</translation>
 <translation id="3487093336331957349">Mapendekezo ya utafutaji na tovuti</translation>
@@ -319,7 +317,6 @@
 <translation id="4522570452068850558">Maelezo</translation>
 <translation id="4526249700380860531">Angalia na udhibiti manenosiri yaliyohifadhiwa kwenye <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation>
 <translation id="4532845899244822526">Chagua folda</translation>
-<translation id="4535858793016067060">Washa kipengele cha “Vyanzo visivyojulikana” katika mipangilio ya usalama wa Android ili ujaribu hali ya utumiaji wa "Ongeza kwenye Skrini ya kwanza Iliyoimarishwa". Hakikisha kuwa umezima mipangilio hii ukimaliza kuijaribu.</translation>
 <translation id="4558311620361989323">Njia za mikato za ukurasa wa wavuti</translation>
 <translation id="4572422548854449519">Ingia katika akaunti zinazodhibitiwa</translation>
 <translation id="4581964774250883625">Unavinjari katika hali fiche.</translation>
@@ -362,7 +359,6 @@
 <translation id="497421865427891073">Nenda mbele</translation>
 <translation id="4988526792673242964">Kurasa</translation>
 <translation id="4996978546172906250">Shiriki kupitia</translation>
-<translation id="5000922062037820727">Imezuiwa (imependekezwa)</translation>
 <translation id="5004339818306944878">Tumia data chache zaidi kwa hadi asilimia 60 na uongeze kasi ya wavuti. Seva za Google zitaboresha kurasa unazotembelea.</translation>
 <translation id="5005498671520578047">Nakili nenosiri</translation>
 <translation id="5011311129201317034"><ph name="SITE" /> inataka kuunganisha</translation>
@@ -403,7 +399,6 @@
 <translation id="5335288049665977812">Ruhusu tovuti zitumie JavaScript (inapendekezwa)</translation>
 <translation id="5345040418939504969">Umefuta <ph name="BOOKMARK_TITLE" /></translation>
 <translation id="5345083863238459644">Ufikiaji wa mahali pia <ph name="BEGIN_LINK" /> umezimwa kwa kifaa hiki<ph name="END_LINK" />.</translation>
-<translation id="5349103022427743704">Hali ya Utumiaji Ulioboreshwa wa Ongeza kwenye Skrini ya kwanza</translation>
 <translation id="5372829067651257087">URL imenakiliwa.</translation>
 <translation id="5384883051496921101">Tovuti hii inakaribia kushiriki maelezo na programu nyingine isiyo katika hali fiche.</translation>
 <translation id="5400569084694353794">Kwa kutumia programu hii, unakubali <ph name="BEGIN_LINK1" />Sheria na Masharti<ph name="END_LINK1" /> na <ph name="BEGIN_LINK2" />Ilani ya Faragha<ph name="END_LINK2" /> ya Chrome.</translation>
@@ -654,7 +649,6 @@
 <translation id="7929962904089429003">Fungua menyu</translation>
 <translation id="7942131818088350342"><ph name="PRODUCT_NAME" /> imepitwa na wakati.</translation>
 <translation id="7947953824732555851">Kubali na uingie</translation>
-<translation id="7949961459945740081">Jipatie vipengele vipya</translation>
 <translation id="7963646190083259054">Mchuuzi:</translation>
 <translation id="7987073022710626672">Sheria na Masharti ya Chrome</translation>
 <translation id="7998918019931843664">Fungua tena kichupo kilichofungwa</translation>
@@ -665,7 +659,6 @@
 <translation id="8015452622527143194">Rejesha kila kitu katika ukubwa wa kawaida</translation>
 <translation id="802154636333426148">Haikuweza kupakua</translation>
 <translation id="8026334261755873520">Futa data ya kuvinjari</translation>
-<translation id="8033827949643255796">kimechaguliwa</translation>
 <translation id="8035133914807600019">Folda mpya…</translation>
 <translation id="8037750541064988519">Zimesalia siku <ph name="DAYS" /></translation>
 <translation id="8051695050440594747">MB <ph name="MEGABYTES" /> zinapatikana</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_th.xtb b/chrome/android/java/strings/translations/android_chrome_strings_th.xtb
index b7a3c51..7e9c15eb 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_th.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_th.xtb
@@ -33,7 +33,7 @@
 <translation id="129553762522093515">เพิ่งปิด</translation>
 <translation id="1303671224831497365">ไม่พบอุปกรณ์บลูทูธ</translation>
 <translation id="1326317727527857210">ลงชื่อเข้าใช้ Chrome เพื่อรับแท็บจากอุปกรณ์เครื่องอื่นๆ ของคุณ</translation>
-<translation id="1332501820983677155">แป้นพิมพ์ลัดสำหรับคุณลักษณะของ Google Chrome</translation>
+<translation id="1332501820983677155">แป้นพิมพ์ลัดสำหรับฟีเจอร์ของ Google Chrome</translation>
 <translation id="1339917386316755344">นำคุณออกจากระบบของเว็บไซต์ส่วนใหญ่ แต่คุณจะไม่ออกจากระบบบัญชี Google</translation>
 <translation id="1369915414381695676">เพิ่มเว็บไซต์ <ph name="SITE_NAME" /> แล้ว</translation>
 <translation id="1373696734384179344">หน่วยความจำไม่เพียงพอที่จะดาวน์โหลดเนื้อหาที่เลือก</translation>
@@ -106,7 +106,7 @@
 <translation id="2073732792864401646">รีเซ็ตสถิติ</translation>
 <translation id="2079545284768500474">เลิกทำ</translation>
 <translation id="2082238445998314030">ผลลัพธ์ <ph name="RESULT_NUMBER" /> จาก <ph name="TOTAL_RESULTS" /> รายการ</translation>
-<translation id="2095887075102408547">เมื่อเปิดคุณลักษณะนี้ Chrome จะใช้เซิร์ฟเวอร์ของ Google ในการบีบอัดหน้าเว็บที่คุณเข้าชมก่อนที่จะดาวน์โหลดหน้าเหล่านั้น Google จะมองไม่เห็นและไม่เพิ่มประสิทธิภาพหน้าที่เข้าถึงโดยใช้การเชื่อมต่อส่วนตัว (HTTPS) หรือแท็บไม่ระบุตัวตน</translation>
+<translation id="2095887075102408547">เมื่อเปิดฟีเจอร์นี้ Chrome จะใช้เซิร์ฟเวอร์ของ Google ในการบีบอัดหน้าเว็บที่คุณเข้าชมก่อนที่จะดาวน์โหลดหน้าเหล่านั้น Google จะมองไม่เห็นและไม่เพิ่มประสิทธิภาพหน้าที่เข้าถึงโดยใช้การเชื่อมต่อส่วนตัว (HTTPS) หรือแท็บไม่ระบุตัวตน</translation>
 <translation id="2096396629993765042">คุณจะไม่ออกจากระบบบัญชี Google บัญชี Google ของคุณอาจมีประวัติการท่องเว็บในรูปแบบอื่นๆ ที่ <ph name="BEGIN_LINK" />history.google.com<ph name="END_LINK" /></translation>
 <translation id="2100273922101894616">ลงชื่อเข้าใช้อัตโนมัติ</translation>
 <translation id="2111511281910874386">ไปที่หน้า</translation>
@@ -116,7 +116,6 @@
 <translation id="2139186145475833000">เพิ่มไปยังหน้าจอหลัก</translation>
 <translation id="2146738493024040262">เปิด Instant App</translation>
 <translation id="2148716181193084225">วันนี้</translation>
-<translation id="2154710561487035718">คัดลอก URL</translation>
 <translation id="2156074688469523661">เว็บไซต์ที่เหลือ (<ph name="NUMBER_OF_SITES" />)</translation>
 <translation id="219985413780390209">ปกป้องคุณและอุปกรณ์ของคุณจากเว็บไซต์อันตราย</translation>
 <translation id="2206488550163399966">เว็บแอป <ph name="APP_NAME" />, <ph name="APP_URL" /></translation>
@@ -218,7 +217,6 @@
 <translation id="3387650086002190359">การดาวน์โหลด <ph name="FILE_NAME" /> ล้มเหลวเพราะเกิดข้อผิดพลาดกับระบบไฟล์</translation>
 <translation id="3398320232533725830">เปิดตัวจัดการบุ๊กมาร์ก</translation>
 <translation id="3414952576877147120">ขนาด:</translation>
-<translation id="3435896845095436175">เปิดการใช้งาน</translation>
 <translation id="3443221991560634068">โหลดหน้าปัจจุบันอีกครั้ง</translation>
 <translation id="3452612588551937789">ลงชื่อเข้าใช้บัญชี Google เพื่อรับบุ๊กมาร์ก ประวัติการเข้าชม รหัสผ่าน และการตั้งค่าอื่นๆ บนอุปกรณ์ทั้งหมดของคุณ</translation>
 <translation id="3487093336331957349">คำแนะนำการค้นหาและเว็บไซต์</translation>
@@ -239,7 +237,7 @@
 หากต้องการแก้ไขข้อความค้นหา ให้กดค้างไว้เพื่อเลือก หากต้องการปรับการค้นหา ให้เลื่อนแผงขึ้นและแตะช่องค้นหา</translation>
 <translation id="3616113530831147358">เสียง</translation>
 <translation id="3632295766818638029">เปิดเผยรหัสผ่าน</translation>
-<translation id="363596933471559332">ลงชื่อเข้าใช้เว็บไซต์โดยอัตโนมัติโดยใช้ข้อมูลรับรองที่เก็บไว้ เมื่อคุณลักษณะนี้ปิดอยู่ ระบบจะขอให้คุณยืนยันทุกครั้งก่อนที่จะลงชื่อเข้าใช้เว็บไซต์</translation>
+<translation id="363596933471559332">ลงชื่อเข้าใช้เว็บไซต์โดยอัตโนมัติโดยใช้ข้อมูลรับรองที่เก็บไว้ เมื่อฟีเจอร์นี้ปิดอยู่ ระบบจะขอให้คุณยืนยันทุกครั้งก่อนที่จะลงชื่อเข้าใช้เว็บไซต์</translation>
 <translation id="3656115297268584622">เปิดตำแหน่งใน<ph name="BEGIN_LINK" />การตั้งค่า Android<ph name="END_LINK" /></translation>
 <translation id="3661699943263275414">เว็บไซต์ของบุคคลที่สามสามารถบันทึกและอ่านข้อมูลคุกกี้ได้</translation>
 <translation id="3662546969139119822">ไม่มีประวัติการเข้าชมที่นี่</translation>
@@ -283,7 +281,7 @@
 <translation id="4062305924942672200">ข้อมูลทางกฎหมาย</translation>
 <translation id="4084682180776658562">บุ๊กมาร์ก</translation>
 <translation id="4084836577264234537">พื้นที่ที่ใช้ไปสำหรับการดาวน์โหลด <ph name="MEGABYTES" /> MB</translation>
-<translation id="4089831646916293264">คุณลักษณะนี้อาจรบกวนการเข้าถึงบริการข้อมูลพรีเมียมที่ผู้ให้บริการของคุณจัดหาให้</translation>
+<translation id="4089831646916293264">ฟีเจอร์นี้อาจรบกวนการเข้าถึงบริการข้อมูลพรีเมียมที่ผู้ให้บริการของคุณจัดหาให้</translation>
 <translation id="4095146165863963773">ลบข้อมูลแอปไหม</translation>
 <translation id="4099578267706723511">ช่วยให้ Chrome ทำงานได้ดีขึ้นโดยส่งสถิติการใช้งานและรายงานข้อขัดข้องให้กับ Google</translation>
 <translation id="410351446219883937">เล่นอัตโนมัติ</translation>
@@ -319,7 +317,6 @@
 <translation id="4522570452068850558">รายละเอียด</translation>
 <translation id="4526249700380860531">ดูและจัดการรหัสผ่านที่บันทึกไว้ที่ <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation>
 <translation id="4532845899244822526">เลือกโฟลเดอร์</translation>
-<translation id="4535858793016067060">เปิด “แหล่งที่มาที่ไม่รู้จัก” ในการตั้งค่าความปลอดภัยของ Android เพื่อทดลองประสบการณ์ "การเพิ่มหน้าจอหลักที่ปรับปรุงใหม่" อย่าลืมปิดใช้การตั้งค่าหลังจากที่คุณลองใช้เสร็จแล้ว</translation>
 <translation id="4558311620361989323">แป้นพิมพ์ลัดสำหรับหน้าเว็บ</translation>
 <translation id="4572422548854449519">ลงชื่อเข้าใช้บัญชีที่มีการจัดการ</translation>
 <translation id="4581964774250883625">คุณเข้าสู่โหมดไม่ระบุตัวตนแล้ว</translation>
@@ -362,7 +359,6 @@
 <translation id="497421865427891073">ไปข้างหน้า</translation>
 <translation id="4988526792673242964">หน้า</translation>
 <translation id="4996978546172906250">แชร์ผ่าน</translation>
-<translation id="5000922062037820727">ถูกบล็อก (แนะนำ)</translation>
 <translation id="5004339818306944878">ใช้เน็ตมือถือน้อยลงถึง 60% และท่องเว็บได้เร็วขึ้น เซิร์ฟเวอร์ Google จะเพิ่มประสิทธิภาพหน้าที่คุณเข้าชม</translation>
 <translation id="5005498671520578047">คัดลอกรหัสผ่าน</translation>
 <translation id="5011311129201317034"><ph name="SITE" /> ต้องการเชื่อมต่อ</translation>
@@ -395,7 +391,7 @@
 <translation id="5301954838959518834">ตกลง เข้าใจแล้ว</translation>
 <translation id="5304593522240415983">ต้องกรอกข้อมูลในช่องนี้</translation>
 <translation id="5308380583665731573">เชื่อมต่อ</translation>
-<translation id="5308603654685598744">เมื่อเปิดคุณลักษณะนี้ Chrome จะเสนอที่จะแปลหน้าเว็บที่เขียนในภาษาอื่นๆ โดยใช้ Google แปลภาษา</translation>
+<translation id="5308603654685598744">เมื่อเปิดฟีเจอร์นี้ Chrome จะเสนอที่จะแปลหน้าเว็บที่เขียนในภาษาอื่นๆ โดยใช้ Google แปลภาษา</translation>
 <translation id="5313967007315987356">เพิ่มเว็บไซต์</translation>
 <translation id="5317780077021120954">บันทึก</translation>
 <translation id="5324858694974489420">การตั้งค่าของผู้ปกครอง</translation>
@@ -403,7 +399,6 @@
 <translation id="5335288049665977812">อนุญาตให้เว็บไซต์เรียกใช้ JavaScript (แนะนำ)</translation>
 <translation id="5345040418939504969">ลบ <ph name="BOOKMARK_TITLE" /> แล้ว</translation>
 <translation id="5345083863238459644">การเข้าถึงตำแหน่งถูก<ph name="BEGIN_LINK" />ปิดสำหรับอุปกรณ์นี้<ph name="END_LINK" />ด้วย</translation>
-<translation id="5349103022427743704">ประสบการณ์การเพิ่มหน้าจอหลักที่ปรับปรุงใหม่</translation>
 <translation id="5372829067651257087">คัดลอก URL แล้ว</translation>
 <translation id="5384883051496921101">ไซต์นี้กำลังจะแชร์ข้อมูลกับแอปนอกโหมดไม่ระบุตัวตน</translation>
 <translation id="5400569084694353794">การใช้แอปพลิเคชันนี้แสดงว่า คุณยอมรับ<ph name="BEGIN_LINK1" />ข้อกำหนดในการให้บริการ<ph name="END_LINK1" />และ<ph name="BEGIN_LINK2" />ประกาศเกี่ยวกับนโยบายความเป็นส่วนตัว<ph name="END_LINK2" />ของ Chrome</translation>
@@ -654,7 +649,6 @@
 <translation id="7929962904089429003">เปิดเมนู</translation>
 <translation id="7942131818088350342"><ph name="PRODUCT_NAME" /> ล้าสมัย</translation>
 <translation id="7947953824732555851">ยอมรับและลงชื่อเข้าใช้</translation>
-<translation id="7949961459945740081">รับคุณลักษณะล่าสุด</translation>
 <translation id="7963646190083259054">ผู้ขาย:</translation>
 <translation id="7987073022710626672">ข้อกำหนดในการให้บริการของ Chrome</translation>
 <translation id="7998918019931843664">เปิดแท็บที่ปิดไปแล้วขึ้นใหม่</translation>
@@ -665,7 +659,6 @@
 <translation id="8015452622527143194">เปลี่ยนทุกอย่างบนหน้ากลับไปเป็นขนาดเริ่มต้น</translation>
 <translation id="802154636333426148">การดาวน์โหลดล้มเหลว</translation>
 <translation id="8026334261755873520">ล้างข้อมูลการท่องเว็บ</translation>
-<translation id="8033827949643255796">เลือกแล้ว</translation>
 <translation id="8035133914807600019">โฟลเดอร์ใหม่…</translation>
 <translation id="8037750541064988519">เหลือ <ph name="DAYS" /> วัน</translation>
 <translation id="8051695050440594747">สามารถใช้งานได้ <ph name="MEGABYTES" /> MB</translation>
@@ -680,7 +673,7 @@
 <translation id="8103578431304235997">แท็บที่ไม่ระบุตัวตน</translation>
 <translation id="8106211421800660735">หมายเลขบัตรเครดิต</translation>
 <translation id="813082847718468539">ดูข้อมูลเว็บไซต์</translation>
-<translation id="8137558756159375272">แตะเพื่อค้นหาจะส่งคำที่เลือกและหน้าปัจจุบันเป็นบริบทไปยัง Google Search คุณสามารถปิดคุณลักษณะนี้ใน<ph name="BEGIN_LINK" />การตั้งค่า<ph name="END_LINK" /></translation>
+<translation id="8137558756159375272">แตะเพื่อค้นหาจะส่งคำที่เลือกและหน้าปัจจุบันเป็นบริบทไปยัง Google Search คุณสามารถปิดฟีเจอร์นี้ใน<ph name="BEGIN_LINK" />การตั้งค่า<ph name="END_LINK" /></translation>
 <translation id="8168435359814927499">เนื้อหา</translation>
 <translation id="8173098127580644436">ตั้งแต่เริ่มต้น</translation>
 <translation id="8190358571722158785">เหลือ 1 วัน</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb b/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb
index 1d68a7b5..b4adb2d 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb
@@ -116,7 +116,6 @@
 <translation id="2139186145475833000">Ana ekrana ekle</translation>
 <translation id="2146738493024040262">Hazır Uygulamayı aç</translation>
 <translation id="2148716181193084225">Bugün</translation>
-<translation id="2154710561487035718">URL'yi Kopyala</translation>
 <translation id="2156074688469523661">Kalan site sayısı (<ph name="NUMBER_OF_SITES" />)</translation>
 <translation id="219985413780390209">Kendinizi ve cihazınızı tehlikeli sitelerden koruyun</translation>
 <translation id="2206488550163399966"><ph name="APP_NAME" />, web uygulaması. <ph name="APP_URL" /></translation>
@@ -218,7 +217,6 @@
 <translation id="3387650086002190359">Dosya sistemi hataları nedeniyle <ph name="FILE_NAME" /> dosyası indirilemedi.</translation>
 <translation id="3398320232533725830">Yer işareti yöneticisini açar</translation>
 <translation id="3414952576877147120">Boyut:</translation>
-<translation id="3435896845095436175">Etkinleştir</translation>
 <translation id="3443221991560634068">Geçerli sayfayı yeniden yükler</translation>
 <translation id="3452612588551937789">Yer işaretleri, geçmiş, şifreler ve diğer ayarlarınıza tüm cihazlarınızdan erişmek için Google Hesabınızla oturum açın.</translation>
 <translation id="3487093336331957349">Arama ve site önerileri</translation>
@@ -319,7 +317,6 @@
 <translation id="4522570452068850558">Ayrıntılar</translation>
 <translation id="4526249700380860531">Kaydedilmiş şifreleri <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /> adresinden görüntüleyin ve yönetin</translation>
 <translation id="4532845899244822526">Klasör seçin</translation>
-<translation id="4535858793016067060">"İyileştirilmiş Ana Ekrana Ekle" özelliğini denemek için Android güvenlik ayarlarından "Bilinmeyen Kaynaklar'ı" açın. Denemeyi bitirdikten sonra bu ayarı tekrar devre dışı bırakmayı unutmayın.</translation>
 <translation id="4558311620361989323">Web sayfası kısayolları</translation>
 <translation id="4572422548854449519">Yönetilen hesapta oturum açın</translation>
 <translation id="4581964774250883625">Gizli moda geçtiniz.</translation>
@@ -362,7 +359,6 @@
 <translation id="497421865427891073">İlerle</translation>
 <translation id="4988526792673242964">Sayfalar</translation>
 <translation id="4996978546172906250">Paylaşım yöntemi:</translation>
-<translation id="5000922062037820727">Engellendi (önerilir)</translation>
 <translation id="5004339818306944878">%60'a kadar daha az veri kullanın ve web'i hızlandırın. Google sunucuları, ziyaret ettiğiniz sayfaları optimize eder.</translation>
 <translation id="5005498671520578047">Şifreyi kopyalayın</translation>
 <translation id="5011311129201317034"><ph name="SITE" /> bağlanmak istiyor</translation>
@@ -403,7 +399,6 @@
 <translation id="5335288049665977812">Sitelerin JavaScript çalıştırmasına izin ver (önerilir)</translation>
 <translation id="5345040418939504969"><ph name="BOOKMARK_TITLE" /> silindi</translation>
 <translation id="5345083863238459644">Konum erişimi de <ph name="BEGIN_LINK" />bu cihaz için kapatıldı<ph name="END_LINK" />.</translation>
-<translation id="5349103022427743704">İyileştirilmiş "Ana ekrana ekle" Denemesi</translation>
 <translation id="5372829067651257087">URL kopyalandı.</translation>
 <translation id="5384883051496921101">Bu site, gizli mod dışında bir uygulama ile bilgi paylaşımında bulunmak üzere.</translation>
 <translation id="5400569084694353794">Bu uygulamayı kullanarak <ph name="BEGIN_LINK1" />Chrome'un Gizlilik Şartları<ph name="END_LINK1" />'nı ve <ph name="BEGIN_LINK2" />Gizlilik Uyarısı<ph name="END_LINK2" />'nı kabul etmiş olursunuz.</translation>
@@ -654,7 +649,6 @@
 <translation id="7929962904089429003">Menüyü açar</translation>
 <translation id="7942131818088350342"><ph name="PRODUCT_NAME" /> güncel değil.</translation>
 <translation id="7947953824732555851">Kabul et ve oturum aç</translation>
-<translation id="7949961459945740081">En yeni özellikleri al</translation>
 <translation id="7963646190083259054">Firma:</translation>
 <translation id="7987073022710626672">Chrome Hizmet Şartları</translation>
 <translation id="7998918019931843664">Kapatılan sekmeyi yeniden aç</translation>
@@ -665,7 +659,6 @@
 <translation id="8015452622527143194">Sayfadaki her şeyi varsayılan boyutuna döndürür</translation>
 <translation id="802154636333426148">İndirilemedi</translation>
 <translation id="8026334261755873520">Tarama verilerini temizle</translation>
-<translation id="8033827949643255796">seçildi</translation>
 <translation id="8035133914807600019">Yeni klasör…</translation>
 <translation id="8037750541064988519"><ph name="DAYS" /> gün kaldı</translation>
 <translation id="8051695050440594747"><ph name="MEGABYTES" /> MB kullanılabilir</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb b/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb
index ce032f02..22161bf 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb
@@ -116,7 +116,6 @@
 <translation id="2139186145475833000">Додати на головний екран</translation>
 <translation id="2146738493024040262">Відкрити додаток із миттєвим запуском</translation>
 <translation id="2148716181193084225">Сьогодні</translation>
-<translation id="2154710561487035718">Копіювати URL-адресу</translation>
 <translation id="2156074688469523661">Інші сайти (<ph name="NUMBER_OF_SITES" />)</translation>
 <translation id="219985413780390209">Захистіть себе та свій пристрій від небезпечних сайтів</translation>
 <translation id="2206488550163399966">Веб-додаток <ph name="APP_NAME" />: <ph name="APP_URL" /></translation>
@@ -218,7 +217,6 @@
 <translation id="3387650086002190359">Файл <ph name="FILE_NAME" /> не завантажено через помилки файлової системи.</translation>
 <translation id="3398320232533725830">Відкрити Диспетчер закладок</translation>
 <translation id="3414952576877147120">Розмір:</translation>
-<translation id="3435896845095436175">Увімкнути</translation>
 <translation id="3443221991560634068">Оновити поточну сторінку</translation>
 <translation id="3452612588551937789">Увійдіть в обліковий запис Google, щоб мати доступ до закладок, паролів, історії й інших налаштувань на всіх своїх пристроях.</translation>
 <translation id="3487093336331957349">Пропозиції пошукових термінів і сайтів</translation>
@@ -319,7 +317,6 @@
 <translation id="4522570452068850558">Деталі</translation>
 <translation id="4526249700380860531">Переглядайте збережені паролі та керуйте ними на сторінці <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation>
 <translation id="4532845899244822526">Вибрати папку</translation>
-<translation id="4535858793016067060">Увімкніть у налаштуваннях безпеки Android параметр "Невідомі джерела", щоб провести експеримент "Покращене додавання на головний екран". Переконайтеся, що ви вимкнули цей параметр після завершення експерименту.</translation>
 <translation id="4558311620361989323">Комбінації клавіш для роботи з веб-сторінками</translation>
 <translation id="4572422548854449519">Увійдіть у керований обліковий запис</translation>
 <translation id="4581964774250883625">Ви перейшли в режим анонімного перегляду.</translation>
@@ -362,7 +359,6 @@
 <translation id="497421865427891073">Перейти вперед</translation>
 <translation id="4988526792673242964">Сторінки</translation>
 <translation id="4996978546172906250">Надіслати через</translation>
-<translation id="5000922062037820727">Заблоковано (рекомендується)</translation>
 <translation id="5004339818306944878">Заощаджуйте до 60% трафіку та пришвидшіть завантаження веб-сторінок. Сервери Google оптимізують сторінки, які ви відвідуєте.</translation>
 <translation id="5005498671520578047">Копіювати пароль</translation>
 <translation id="5011311129201317034">Сайт <ph name="SITE" /> хоче підключитися</translation>
@@ -403,7 +399,6 @@
 <translation id="5335288049665977812">Дозволити сайтам запускати Javascript (рекомендується)</translation>
 <translation id="5345040418939504969">Закладку "<ph name="BOOKMARK_TITLE" />" видалено</translation>
 <translation id="5345083863238459644">Доступ до геоданих також <ph name="BEGIN_LINK" />вимкнено на цьому пристрої<ph name="END_LINK" />.</translation>
-<translation id="5349103022427743704">Експеримент "Покращене додавання на головний екран"</translation>
 <translation id="5372829067651257087">URL-адресу скопійовано.</translation>
 <translation id="5384883051496921101">Цей сайт збирається надіслати інформацію в додаток, у якому вимкнено режим анонімного перегляду.</translation>
 <translation id="5400569084694353794">Користуючись цим додатком, ви приймаєте <ph name="BEGIN_LINK1" />Умови використання<ph name="END_LINK1" /> та <ph name="BEGIN_LINK2" />Примітку про конфіденційність<ph name="END_LINK2" /> Chrome.</translation>
@@ -654,7 +649,6 @@
 <translation id="7929962904089429003">Відкрити меню</translation>
 <translation id="7942131818088350342">Застаріла версія <ph name="PRODUCT_NAME" />.</translation>
 <translation id="7947953824732555851">Прийняти й увійти</translation>
-<translation id="7949961459945740081">Завантажити найновіші функції</translation>
 <translation id="7963646190083259054">Постачальник:</translation>
 <translation id="7987073022710626672">Умови використання Google Chrome</translation>
 <translation id="7998918019931843664">Знову відкрити закриту вкладку</translation>
@@ -665,7 +659,6 @@
 <translation id="8015452622527143194">Відновити розміри всіх елементів за умовчанням</translation>
 <translation id="802154636333426148">Не вдалося завантажити</translation>
 <translation id="8026334261755873520">Очистити дані веб-перегляду</translation>
-<translation id="8033827949643255796">виділено</translation>
 <translation id="8035133914807600019">Нова папка…</translation>
 <translation id="8037750541064988519">Залишилося <ph name="DAYS" /> дн.</translation>
 <translation id="8051695050440594747"><ph name="MEGABYTES" /> Мб доступно</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb b/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb
index 370b27ec..8b7bd53 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb
@@ -116,7 +116,6 @@
 <translation id="2139186145475833000">Thêm vào Màn hình chính</translation>
 <translation id="2146738493024040262">Mở ứng dụng tức thì</translation>
 <translation id="2148716181193084225">Hôm nay</translation>
-<translation id="2154710561487035718">Sao chép URL</translation>
 <translation id="2156074688469523661">Số trang web còn lại (<ph name="NUMBER_OF_SITES" />)</translation>
 <translation id="219985413780390209">Bảo vệ bạn và thiết bị của bạn khỏi các trang web nguy hiểm</translation>
 <translation id="2206488550163399966"><ph name="APP_NAME" />, ứng dụng web. <ph name="APP_URL" /></translation>
@@ -218,7 +217,6 @@
 <translation id="3387650086002190359">Tải xuống <ph name="FILE_NAME" /> không thành công do lỗi hệ thống tệp.</translation>
 <translation id="3398320232533725830">Mở trình quản lý dấu trang</translation>
 <translation id="3414952576877147120">Kích thước:</translation>
-<translation id="3435896845095436175">Bật</translation>
 <translation id="3443221991560634068">Tải lại trang hiện tại</translation>
 <translation id="3452612588551937789">Đăng nhập bằng Tài khoản Google để nhận dấu trang, lịch sử, mật khẩu và các cài đặt khác trên tất cả thiết bị của bạn.</translation>
 <translation id="3487093336331957349">Đề xuất về tìm kiếm và trang web</translation>
@@ -319,7 +317,6 @@
 <translation id="4522570452068850558">Chi tiết</translation>
 <translation id="4526249700380860531">Xem và quản lý mật khẩu đã lưu tại <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation>
 <translation id="4532845899244822526">Chọn thư mục</translation>
-<translation id="4535858793016067060">Bật “Nguồn không xác định” trong cài đặt bảo mật Android để dùng thử thử nghiệm "Thêm vào Màn hình chính được cải thiện". Hãy nhớ tắt cài đặt này khi bạn hoàn tất dùng thử.</translation>
 <translation id="4558311620361989323">Phím tắt cho trang web</translation>
 <translation id="4572422548854449519">Đăng nhập vào tài khoản được quản lý</translation>
 <translation id="4581964774250883625">Bạn đã chuyển sang chế độ ẩn danh.</translation>
@@ -362,7 +359,6 @@
 <translation id="497421865427891073">Đi về phía trước</translation>
 <translation id="4988526792673242964">Trang</translation>
 <translation id="4996978546172906250">Chia sẻ qua</translation>
-<translation id="5000922062037820727">Bị chặn (được đề xuất)</translation>
 <translation id="5004339818306944878">Sử dụng ít dữ liệu hơn tối đa 60% và tăng tốc web. Máy chủ của Google sẽ tối ưu hóa các trang bạn truy cập.</translation>
 <translation id="5005498671520578047">Sao chép mật khẩu</translation>
 <translation id="5011311129201317034"><ph name="SITE" /> muốn kết nối</translation>
@@ -403,7 +399,6 @@
 <translation id="5335288049665977812">Cho phép các trang web chạy JavaScript (được đề xuất)</translation>
 <translation id="5345040418939504969">Đã xóa <ph name="BOOKMARK_TITLE" /></translation>
 <translation id="5345083863238459644">Truy cập vị trí cũng đã được <ph name="BEGIN_LINK" />tắt cho thiết bị này<ph name="END_LINK" />.</translation>
-<translation id="5349103022427743704">Thử nghiệm Thêm vào màn hình chính được cải thiện</translation>
 <translation id="5372829067651257087">Đã sao chép URL.</translation>
 <translation id="5384883051496921101">Trang web này sắp chia sẻ thông tin với một ứng dụng bên ngoài chế độ ẩn danh.</translation>
 <translation id="5400569084694353794">Bằng cách sử dụng ứng dụng này, bạn đồng ý với <ph name="BEGIN_LINK1" />Điều khoản dịch vụ<ph name="END_LINK1" /> và <ph name="BEGIN_LINK2" />Thông báo bảo mật<ph name="END_LINK2" /> của Chrome.</translation>
@@ -451,7 +446,7 @@
 <translation id="5763382633136178763">Tab ẩn danh</translation>
 <translation id="5765780083710877561">Mô tả:</translation>
 <translation id="5777170031995031090">Kiểm soát cách Google sử dụng lịch sử duyệt web của bạn để cá nhân hóa Tìm kiếm, quảng cáo và các dịch vụ khác của Google.</translation>
-<translation id="5804241973901381774">Giấy phép</translation>
+<translation id="5804241973901381774">Quyền</translation>
 <translation id="5809361687334836369">{HOURS,plural, =1{# giờ trước}other{# giờ trước}}</translation>
 <translation id="5817918615728894473">Ghép nối</translation>
 <translation id="583281660410589416">Không xác định</translation>
@@ -654,7 +649,6 @@
 <translation id="7929962904089429003">Mở menu</translation>
 <translation id="7942131818088350342"><ph name="PRODUCT_NAME" /> đã lỗi thời.</translation>
 <translation id="7947953824732555851">Chấp nhận &amp; đăng nhập</translation>
-<translation id="7949961459945740081">Cập nhật tính năng mới nhất</translation>
 <translation id="7963646190083259054">Nhà cung cấp:</translation>
 <translation id="7987073022710626672">Điều khoản dịch vụ của Chrome</translation>
 <translation id="7998918019931843664">Mở lại tab đã đóng</translation>
@@ -665,7 +659,6 @@
 <translation id="8015452622527143194">Trả lại mọi nội dung trên trang về kích thước mặc định</translation>
 <translation id="802154636333426148">Tải xuống không thành công</translation>
 <translation id="8026334261755873520">Xóa dữ liệu duyệt web</translation>
-<translation id="8033827949643255796">đã chọn</translation>
 <translation id="8035133914807600019">Thư mục mới...</translation>
 <translation id="8037750541064988519">Còn <ph name="DAYS" /> ngày</translation>
 <translation id="8051695050440594747">Còn <ph name="MEGABYTES" /> MB</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_zh-CN.xtb b/chrome/android/java/strings/translations/android_chrome_strings_zh-CN.xtb
index 524ceb3..8c378e78 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_zh-CN.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_zh-CN.xtb
@@ -116,7 +116,6 @@
 <translation id="2139186145475833000">添加到主屏幕</translation>
 <translation id="2146738493024040262">打开免安装应用</translation>
 <translation id="2148716181193084225">今天</translation>
-<translation id="2154710561487035718">复制网址</translation>
 <translation id="2156074688469523661">其余的网站(<ph name="NUMBER_OF_SITES" /> 个)</translation>
 <translation id="219985413780390209">保护您和您的设备不受危险网站的侵害</translation>
 <translation id="2206488550163399966"><ph name="APP_NAME" />,网络应用。<ph name="APP_URL" /></translation>
@@ -218,7 +217,6 @@
 <translation id="3387650086002190359">未能成功下载 <ph name="FILE_NAME" />,因为文件系统出现了错误。</translation>
 <translation id="3398320232533725830">打开书签管理器</translation>
 <translation id="3414952576877147120">大小:</translation>
-<translation id="3435896845095436175">启用</translation>
 <translation id="3443221991560634068">重新加载当前网页</translation>
 <translation id="3452612588551937789">在任意设备上登录 Google 帐号后,您即可获取自己的书签、历史记录、密码及其他设置。</translation>
 <translation id="3487093336331957349">搜索和网站建议</translation>
@@ -319,7 +317,6 @@
 <translation id="4522570452068850558">详细信息</translation>
 <translation id="4526249700380860531">通过 <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /> 查看和管理已保存的密码</translation>
 <translation id="4532845899244822526">选择文件夹</translation>
-<translation id="4535858793016067060">您必须在 Android 安全设置中开启“未知来源”,才能试用“经过改进的‘添加到主屏幕’功能”实验。在试用完该实验后,请务必停用此设置。</translation>
 <translation id="4558311620361989323">网页快捷键</translation>
 <translation id="4572422548854449519">请登录受管理的帐号</translation>
 <translation id="4581964774250883625">您已进入无痕模式。</translation>
@@ -362,7 +359,6 @@
 <translation id="497421865427891073">前进</translation>
 <translation id="4988526792673242964">页码</translation>
 <translation id="4996978546172906250">分享方式</translation>
-<translation id="5000922062037820727">已阻止(推荐)</translation>
 <translation id="5004339818306944878">最多可减少 60% 的数据用量,并加快网页加载速度。Google 服务器会对您访问的网页进行优化。</translation>
 <translation id="5005498671520578047">复制密码</translation>
 <translation id="5011311129201317034"><ph name="SITE" /> 希望连接到以下所选设备:</translation>
@@ -403,7 +399,6 @@
 <translation id="5335288049665977812">允许网站运行 JavaScript(推荐)</translation>
 <translation id="5345040418939504969">已删除“<ph name="BOOKMARK_TITLE" />”</translation>
 <translation id="5345083863238459644"><ph name="BEGIN_LINK" />此设备的位置信息使用权也已被停用<ph name="END_LINK" />。</translation>
-<translation id="5349103022427743704">“经过改进的‘添加到主屏幕’功能”实验</translation>
 <translation id="5372829067651257087">已复制网址。</translation>
 <translation id="5384883051496921101">该网站即将与某个并非处于隐身模式下的应用共享信息。</translation>
 <translation id="5400569084694353794">使用此应用即表示您同意遵守 Chrome 的<ph name="BEGIN_LINK1" />服务条款<ph name="END_LINK1" />和<ph name="BEGIN_LINK2" />隐私权声明<ph name="END_LINK2" />。</translation>
@@ -654,7 +649,6 @@
 <translation id="7929962904089429003">打开菜单</translation>
 <translation id="7942131818088350342"><ph name="PRODUCT_NAME" /> 不是最新版本。</translation>
 <translation id="7947953824732555851">接受并登录</translation>
-<translation id="7949961459945740081">获取最新功能</translation>
 <translation id="7963646190083259054">供应商:</translation>
 <translation id="7987073022710626672">Chrome 服务条款</translation>
 <translation id="7998918019931843664">重新打开关闭的标签页</translation>
@@ -665,7 +659,6 @@
 <translation id="8015452622527143194">将网页上的所有内容恢复到默认大小</translation>
 <translation id="802154636333426148">下载失败</translation>
 <translation id="8026334261755873520">清除浏览数据</translation>
-<translation id="8033827949643255796">已选中</translation>
 <translation id="8035133914807600019">新建文件夹…</translation>
 <translation id="8037750541064988519">还剩 <ph name="DAYS" /> 天</translation>
 <translation id="8051695050440594747"><ph name="MEGABYTES" /> MB 可用</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_zh-TW.xtb b/chrome/android/java/strings/translations/android_chrome_strings_zh-TW.xtb
index 7f7375c1..159ab32 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_zh-TW.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_zh-TW.xtb
@@ -116,7 +116,6 @@
 <translation id="2139186145475833000">加到主畫面</translation>
 <translation id="2146738493024040262">開啟免安裝應用程式</translation>
 <translation id="2148716181193084225">今天</translation>
-<translation id="2154710561487035718">複製網址</translation>
 <translation id="2156074688469523661">其餘網站 (<ph name="NUMBER_OF_SITES" />)</translation>
 <translation id="219985413780390209">保護您和您的裝置不受危險網站攻擊</translation>
 <translation id="2206488550163399966"><ph name="APP_NAME" />,網路應用程式。<ph name="APP_URL" /></translation>
@@ -218,7 +217,6 @@
 <translation id="3387650086002190359">檔案系統發生錯誤,因此無法下載 <ph name="FILE_NAME" />。</translation>
 <translation id="3398320232533725830">開啟書籤管理員</translation>
 <translation id="3414952576877147120">空間大小:</translation>
-<translation id="3435896845095436175">啟用</translation>
 <translation id="3443221991560634068">重新載入目前網頁</translation>
 <translation id="3452612588551937789">只要使用 Google 帳戶登入,您就可以在所有裝置上存取自己的書籤、密碼、歷史紀錄、密碼和其他設定。</translation>
 <translation id="3487093336331957349">搜尋與網站建議</translation>
@@ -319,7 +317,6 @@
 <translation id="4522570452068850558">詳細資訊</translation>
 <translation id="4526249700380860531">您可以前往 <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /> 查看及管理已儲存的密碼</translation>
 <translation id="4532845899244822526">選擇資料夾</translation>
-<translation id="4535858793016067060">開啟 Android 安全性設定中的「不明來源」即可體驗「增強型新增至主畫面」實驗功能。體驗結束後請務必停用這項設定。</translation>
 <translation id="4558311620361989323">網頁快速鍵</translation>
 <translation id="4572422548854449519">登入受管理的帳戶</translation>
 <translation id="4581964774250883625">你已啟用無痕模式。</translation>
@@ -362,7 +359,6 @@
 <translation id="497421865427891073">往前</translation>
 <translation id="4988526792673242964">頁數</translation>
 <translation id="4996978546172906250">分享方式:</translation>
-<translation id="5000922062037820727">已封鎖 (建議)</translation>
 <translation id="5004339818306944878">Google 伺服器會對你造訪的網頁進行最佳化處理,最多可減少 60% 的數據用量,並加快網頁載入速度。</translation>
 <translation id="5005498671520578047">複製密碼</translation>
 <translation id="5011311129201317034"><ph name="SITE" /> 要求連線</translation>
@@ -403,7 +399,6 @@
 <translation id="5335288049665977812">允許網站執行 JavaScript (建議)</translation>
 <translation id="5345040418939504969">已刪除的「<ph name="BOOKMARK_TITLE" />」</translation>
 <translation id="5345083863238459644">這個裝置的<ph name="BEGIN_LINK" />位置資訊存取功能已一併關閉<ph name="END_LINK" />。</translation>
-<translation id="5349103022427743704">增強型新增至主畫面實驗功能</translation>
 <translation id="5372829067651257087">已複製網址。</translation>
 <translation id="5384883051496921101">這個網站即將與外部應用程式分享資訊,分享時會自動退出無痕模式。</translation>
 <translation id="5400569084694353794">使用這個應用程式即表示您同意接受 Chrome 的《<ph name="BEGIN_LINK1" />服務條款<ph name="END_LINK1" />》和《<ph name="BEGIN_LINK2" />隱私權聲明<ph name="END_LINK2" />》。</translation>
@@ -654,7 +649,6 @@
 <translation id="7929962904089429003">開啟選單</translation>
 <translation id="7942131818088350342"><ph name="PRODUCT_NAME" /> 版本過舊。</translation>
 <translation id="7947953824732555851">接受並登入</translation>
-<translation id="7949961459945740081">取得最新功能</translation>
 <translation id="7963646190083259054">供應商:</translation>
 <translation id="7987073022710626672">Chrome 服務條款</translation>
 <translation id="7998918019931843664">重新開啟先前關閉的分頁</translation>
@@ -665,7 +659,6 @@
 <translation id="8015452622527143194">將網頁上的所有內容都回復為預設大小</translation>
 <translation id="802154636333426148">下載失敗</translation>
 <translation id="8026334261755873520">清除瀏覽資料</translation>
-<translation id="8033827949643255796">已選取</translation>
 <translation id="8035133914807600019">新資料夾…</translation>
 <translation id="8037750541064988519">還剩 <ph name="DAYS" /> 天</translation>
 <translation id="8051695050440594747"><ph name="MEGABYTES" /> MB 可用空間</translation>
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/firstrun/FirstRunIntegrationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/firstrun/FirstRunIntegrationTest.java
index 9add290d4d..ffbdd52e 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/firstrun/FirstRunIntegrationTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/firstrun/FirstRunIntegrationTest.java
@@ -26,7 +26,6 @@
 
 import org.chromium.base.ThreadUtils;
 import org.chromium.base.annotations.SuppressFBWarnings;
-import org.chromium.base.test.util.DisabledTest;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeTabbedActivity;
 import org.chromium.chrome.browser.customtabs.CustomTabActivity;
@@ -241,7 +240,6 @@
 
     @Test
     @MediumTest
-    @DisabledTest(message = "crbug.com/718461")
     public void testDefaultSearchEngine_ShowExisting() throws Exception {
         runSearchEnginePromptTest(LocaleManager.SEARCH_ENGINE_PROMO_SHOW_EXISTING);
     }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/vr_shell/VrFeedbackInfoBarTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/vr_shell/VrFeedbackInfoBarTest.java
index 2b3e056..929c65f 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/vr_shell/VrFeedbackInfoBarTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/vr_shell/VrFeedbackInfoBarTest.java
@@ -24,11 +24,8 @@
 import org.chromium.chrome.browser.infobar.InfoBar;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
-import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
 import org.chromium.chrome.test.util.ChromeTabUtils;
 import org.chromium.chrome.test.util.InfoBarUtil;
-import org.chromium.content.browser.ContentViewCore;
-import org.chromium.content_public.browser.WebContents;
 
 import java.util.List;
 import java.util.concurrent.TimeoutException;
@@ -44,8 +41,6 @@
 
 public class VrFeedbackInfoBarTest {
     @Rule
-    public ChromeTabbedActivityTestRule mActivityTestRule = new ChromeTabbedActivityTestRule();
-    @Rule
     public VrTestRule mVrTestRule = new VrTestRule();
 
     private static final String TEST_PAGE_2D_URL =
@@ -53,27 +48,13 @@
     private static final String TEST_PAGE_WEBVR_URL =
             VrTestRule.getHtmlTestFile("test_requestPresent_enters_vr");
 
-    private ContentViewCore mFirstTabCvc;
-    private WebContents mFirstTabWebContents;
-
-    public int loadUrlAndWait(String url, long secondsToWait)
-            throws IllegalArgumentException, InterruptedException {
-        int result = mActivityTestRule.loadUrl(url, secondsToWait);
-        mVrTestRule.waitOnJavaScriptStep(
-                mActivityTestRule.getActivity().getActivityTab().getWebContents());
-        return result;
-    }
-
     @Before
     public void setUp() throws Exception {
-        mActivityTestRule.startMainActivityOnBlankPage();
-        mFirstTabWebContents = mActivityTestRule.getActivity().getActivityTab().getWebContents();
-        mFirstTabCvc = mActivityTestRule.getActivity().getActivityTab().getContentViewCore();
         Assert.assertFalse(VrFeedbackStatus.getFeedbackOptOut());
     }
 
     private void clickInfoBarButton(final boolean primary) {
-        final List<InfoBar> infoBars = mActivityTestRule.getInfoBars();
+        final List<InfoBar> infoBars = mVrTestRule.getInfoBars();
         ThreadUtils.runOnUiThreadBlocking(new Runnable() {
             @Override
             public void run() {
@@ -84,25 +65,24 @@
                 }
             }
         });
-        InfoBarUtil.waitUntilNoInfoBarsExist(mActivityTestRule.getInfoBars());
+        InfoBarUtil.waitUntilNoInfoBarsExist(mVrTestRule.getInfoBars());
     }
 
     private void clickInfobarCloseButton() {
-        final List<InfoBar> infoBars = mActivityTestRule.getInfoBars();
+        final List<InfoBar> infoBars = mVrTestRule.getInfoBars();
         ThreadUtils.runOnUiThreadBlocking(new Runnable() {
             @Override
             public void run() {
                 InfoBarUtil.clickCloseButton(infoBars.get(0));
             }
         });
-        InfoBarUtil.waitUntilNoInfoBarsExist(mActivityTestRule.getInfoBars());
+        InfoBarUtil.waitUntilNoInfoBarsExist(mVrTestRule.getInfoBars());
     }
 
     private void assertState(boolean isInVr, boolean isInfobarVisible) {
         Assert.assertEquals("Browser is in VR", isInVr, VrShellDelegate.isInVr());
         Assert.assertEquals("Infobar is visible", isInfobarVisible,
-                VrUtils.isInfoBarPresent(
-                        mActivityTestRule.getActivity().getWindow().getDecorView()));
+                VrUtils.isInfoBarPresent(mVrTestRule.getActivity().getWindow().getDecorView()));
     }
 
     private void enterThenExitVr() {
@@ -118,7 +98,7 @@
     @Test
     @MediumTest
     public void testFeedbackFrequency() throws InterruptedException, TimeoutException {
-        loadUrlAndWait(TEST_PAGE_2D_URL, PAGE_LOAD_TIMEOUT_S);
+        mVrTestRule.loadUrlAndAwaitInitialization(TEST_PAGE_2D_URL, PAGE_LOAD_TIMEOUT_S);
 
         // Set frequency of infobar to every 2nd time.
         VrUtils.getVrShellDelegateInstance().setFeedbackFrequencyForTesting(2);
@@ -144,7 +124,7 @@
     @Test
     @MediumTest
     public void testFeedbackOptOut() throws InterruptedException, TimeoutException {
-        loadUrlAndWait(TEST_PAGE_2D_URL, PAGE_LOAD_TIMEOUT_S);
+        mVrTestRule.loadUrlAndAwaitInitialization(TEST_PAGE_2D_URL, PAGE_LOAD_TIMEOUT_S);
 
         // Show infobar every time.
         VrUtils.getVrShellDelegateInstance().setFeedbackFrequencyForTesting(1);
@@ -169,9 +149,11 @@
     @MediumTest
     public void testFeedbackOnlyOnVrBrowsing() throws InterruptedException, TimeoutException {
         // Enter VR presentation mode.
-        mActivityTestRule.loadUrl(TEST_PAGE_WEBVR_URL, PAGE_LOAD_TIMEOUT_S);
-        Assert.assertTrue("VRDisplay found", mVrTestRule.vrDisplayFound(mFirstTabWebContents));
-        mVrTestRule.enterPresentationAndWait(mFirstTabCvc, mFirstTabWebContents);
+        mVrTestRule.loadUrlAndAwaitInitialization(TEST_PAGE_WEBVR_URL, PAGE_LOAD_TIMEOUT_S);
+        Assert.assertTrue("VRDisplay found",
+                mVrTestRule.vrDisplayFound(mVrTestRule.getFirstTabWebContents()));
+        mVrTestRule.enterPresentationAndWait(
+                mVrTestRule.getFirstTabCvc(), mVrTestRule.getFirstTabWebContents());
         assertState(true /* isInVr */, false /* isInfobarVisible  */);
         Assert.assertTrue(VrShellDelegate.getVrShellForTesting().getWebVrModeEnabled());
 
@@ -187,20 +169,22 @@
     @MediumTest
     public void testExitPresentationInVr() throws InterruptedException, TimeoutException {
         // Enter VR presentation mode.
-        mActivityTestRule.loadUrl(TEST_PAGE_WEBVR_URL, PAGE_LOAD_TIMEOUT_S);
-        Assert.assertTrue("VRDisplay found", mVrTestRule.vrDisplayFound(mFirstTabWebContents));
-        mVrTestRule.enterPresentationAndWait(mFirstTabCvc, mFirstTabWebContents);
+        mVrTestRule.loadUrlAndAwaitInitialization(TEST_PAGE_WEBVR_URL, PAGE_LOAD_TIMEOUT_S);
+        Assert.assertTrue("VRDisplay found",
+                mVrTestRule.vrDisplayFound(mVrTestRule.getFirstTabWebContents()));
+        mVrTestRule.enterPresentationAndWait(
+                mVrTestRule.getFirstTabCvc(), mVrTestRule.getFirstTabWebContents());
         assertState(true /* isInVr */, false /* isInfobarVisible  */);
         Assert.assertTrue(VrShellDelegate.getVrShellForTesting().getWebVrModeEnabled());
 
         // Exit presentation mode by navigating to a different url.
         ChromeTabUtils.waitForTabPageLoaded(
-                mActivityTestRule.getActivity().getActivityTab(), new Runnable() {
+                mVrTestRule.getActivity().getActivityTab(), new Runnable() {
                     @Override
                     public void run() {
                         mVrTestRule.runJavaScriptOrFail(
                                 "window.location.href = '" + TEST_PAGE_2D_URL + "';",
-                                POLL_TIMEOUT_SHORT_MS, mFirstTabWebContents);
+                                POLL_TIMEOUT_SHORT_MS, mVrTestRule.getFirstTabWebContents());
                     }
                 }, POLL_TIMEOUT_LONG_MS);
 
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/vr_shell/VrShellNavigationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/vr_shell/VrShellNavigationTest.java
index e067d4a3..d6e9154e 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/vr_shell/VrShellNavigationTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/vr_shell/VrShellNavigationTest.java
@@ -23,7 +23,6 @@
 import org.chromium.chrome.test.ChromeActivityTestCaseBase;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
-import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
 import org.chromium.chrome.test.util.ChromeTabUtils;
 import org.chromium.content.browser.ContentViewCore;
 import org.chromium.content.browser.test.util.DOMUtils;
@@ -41,8 +40,6 @@
 @Restriction(RESTRICTION_TYPE_VIEWER_DAYDREAM)
 public class VrShellNavigationTest {
     @Rule
-    public ChromeTabbedActivityTestRule mActivityTestRule = new ChromeTabbedActivityTestRule();
-    @Rule
     public VrTestRule mVrTestRule = new VrTestRule();
 
     private static final String TEST_PAGE_2D_URL =
@@ -50,18 +47,12 @@
     private static final String TEST_PAGE_WEBVR_URL =
             VrTestRule.getHtmlTestFile("test_navigation_webvr_page");
 
-    private ContentViewCore mFirstTabCvc;
-    private WebContents mFirstTabWebContents;
-
     private enum Page { PAGE_2D, PAGE_WEBVR }
     private enum PresentationMode { NON_PRESENTING, PRESENTING }
     private enum FullscreenMode { NON_FULLSCREENED, FULLSCREENED }
 
     @Before
     public void setUp() throws Exception {
-        mActivityTestRule.startMainActivityOnBlankPage();
-        mFirstTabWebContents = mActivityTestRule.getActivity().getActivityTab().getWebContents();
-        mFirstTabCvc = mActivityTestRule.getActivity().getActivityTab().getContentViewCore();
         VrUtils.forceEnterVr();
         VrUtils.waitForVrSupported(POLL_TIMEOUT_LONG_MS);
     }
@@ -84,12 +75,12 @@
      */
     private void navigateTo(final Page to) throws InterruptedException {
         ChromeTabUtils.waitForTabPageLoaded(
-                mActivityTestRule.getActivity().getActivityTab(), new Runnable() {
+                mVrTestRule.getActivity().getActivityTab(), new Runnable() {
                     @Override
                     public void run() {
                         mVrTestRule.runJavaScriptOrFail(
                                 "window.location.href = '" + getUrl(to) + "';",
-                                POLL_TIMEOUT_SHORT_MS, mFirstTabWebContents);
+                                POLL_TIMEOUT_SHORT_MS, mVrTestRule.getFirstTabWebContents());
                     }
                 }, POLL_TIMEOUT_LONG_MS);
     }
@@ -103,7 +94,9 @@
 
     private void enterPresentationOrFail(ContentViewCore cvc)
             throws InterruptedException, TimeoutException {
-        mVrTestRule.enterPresentationAndWait(cvc, mFirstTabWebContents);
+        mVrTestRule.enterPresentation(cvc);
+        mVrTestRule.pollJavaScriptBoolean("vrDisplay.isPresenting", POLL_TIMEOUT_SHORT_MS,
+                mVrTestRule.getFirstTabWebContents());
         Assert.assertTrue(VrShellDelegate.getVrShellForTesting().getWebVrModeEnabled());
     }
 
@@ -117,16 +110,8 @@
         Assert.assertEquals("Browser is in fullscreen",
                 fullscreenMode == FullscreenMode.FULLSCREENED, DOMUtils.isFullscreen(wc));
         // Feedback infobar should never show up during navigations.
-        Assert.assertFalse(VrUtils.isInfoBarPresent(
-                mActivityTestRule.getActivity().getWindow().getDecorView()));
-    }
-
-    public int loadUrl(String url, long secondsToWait)
-            throws IllegalArgumentException, InterruptedException {
-        int result = mActivityTestRule.loadUrl(url, secondsToWait);
-        mVrTestRule.waitOnJavaScriptStep(
-                mActivityTestRule.getActivity().getActivityTab().getWebContents());
-        return result;
+        Assert.assertFalse(
+                VrUtils.isInfoBarPresent(mVrTestRule.getActivity().getWindow().getDecorView()));
     }
 
     /**
@@ -135,12 +120,12 @@
     @Test
     @MediumTest
     public void test2dTo2d() throws InterruptedException, TimeoutException {
-        loadUrl(TEST_PAGE_2D_URL, PAGE_LOAD_TIMEOUT_S);
+        mVrTestRule.loadUrlAndAwaitInitialization(TEST_PAGE_2D_URL, PAGE_LOAD_TIMEOUT_S);
 
         navigateTo(Page.PAGE_2D);
 
-        assertState(mFirstTabWebContents, Page.PAGE_2D, PresentationMode.NON_PRESENTING,
-                FullscreenMode.NON_FULLSCREENED);
+        assertState(mVrTestRule.getFirstTabWebContents(), Page.PAGE_2D,
+                PresentationMode.NON_PRESENTING, FullscreenMode.NON_FULLSCREENED);
     }
 
     /**
@@ -151,12 +136,12 @@
     @MediumTest
     public void test2dToWebVr()
             throws IllegalArgumentException, InterruptedException, TimeoutException {
-        loadUrl(TEST_PAGE_2D_URL, PAGE_LOAD_TIMEOUT_S);
+        mVrTestRule.loadUrlAndAwaitInitialization(TEST_PAGE_2D_URL, PAGE_LOAD_TIMEOUT_S);
 
         navigateTo(Page.PAGE_WEBVR);
 
-        assertState(mFirstTabWebContents, Page.PAGE_WEBVR, PresentationMode.NON_PRESENTING,
-                FullscreenMode.NON_FULLSCREENED);
+        assertState(mVrTestRule.getFirstTabWebContents(), Page.PAGE_WEBVR,
+                PresentationMode.NON_PRESENTING, FullscreenMode.NON_FULLSCREENED);
     }
 
     /**
@@ -167,13 +152,13 @@
     @MediumTest
     public void test2dFullscreenToWebVr()
             throws IllegalArgumentException, InterruptedException, TimeoutException {
-        loadUrl(TEST_PAGE_2D_URL, PAGE_LOAD_TIMEOUT_S);
-        enterFullscreenOrFail(mFirstTabCvc);
+        mVrTestRule.loadUrlAndAwaitInitialization(TEST_PAGE_2D_URL, PAGE_LOAD_TIMEOUT_S);
+        enterFullscreenOrFail(mVrTestRule.getFirstTabCvc());
 
         navigateTo(Page.PAGE_WEBVR);
 
-        assertState(mFirstTabWebContents, Page.PAGE_WEBVR, PresentationMode.NON_PRESENTING,
-                FullscreenMode.NON_FULLSCREENED);
+        assertState(mVrTestRule.getFirstTabWebContents(), Page.PAGE_WEBVR,
+                PresentationMode.NON_PRESENTING, FullscreenMode.NON_FULLSCREENED);
     }
 
     /**
@@ -184,12 +169,12 @@
     @MediumTest
     public void testWebVrTo2d()
             throws IllegalArgumentException, InterruptedException, TimeoutException {
-        loadUrl(TEST_PAGE_WEBVR_URL, PAGE_LOAD_TIMEOUT_S);
+        mVrTestRule.loadUrlAndAwaitInitialization(TEST_PAGE_WEBVR_URL, PAGE_LOAD_TIMEOUT_S);
 
         navigateTo(Page.PAGE_2D);
 
-        assertState(mFirstTabWebContents, Page.PAGE_2D, PresentationMode.NON_PRESENTING,
-                FullscreenMode.NON_FULLSCREENED);
+        assertState(mVrTestRule.getFirstTabWebContents(), Page.PAGE_2D,
+                PresentationMode.NON_PRESENTING, FullscreenMode.NON_FULLSCREENED);
     }
 
     /**
@@ -200,12 +185,12 @@
     @MediumTest
     public void testWebVrToWebVr()
             throws IllegalArgumentException, InterruptedException, TimeoutException {
-        loadUrl(TEST_PAGE_WEBVR_URL, PAGE_LOAD_TIMEOUT_S);
+        mVrTestRule.loadUrlAndAwaitInitialization(TEST_PAGE_WEBVR_URL, PAGE_LOAD_TIMEOUT_S);
 
         navigateTo(Page.PAGE_WEBVR);
 
-        assertState(mFirstTabWebContents, Page.PAGE_WEBVR, PresentationMode.NON_PRESENTING,
-                FullscreenMode.NON_FULLSCREENED);
+        assertState(mVrTestRule.getFirstTabWebContents(), Page.PAGE_WEBVR,
+                PresentationMode.NON_PRESENTING, FullscreenMode.NON_FULLSCREENED);
     }
 
     /**
@@ -216,13 +201,13 @@
     @MediumTest
     public void testWebVrPresentingTo2d()
             throws IllegalArgumentException, InterruptedException, TimeoutException {
-        loadUrl(TEST_PAGE_WEBVR_URL, PAGE_LOAD_TIMEOUT_S);
-        enterPresentationOrFail(mFirstTabCvc);
+        mVrTestRule.loadUrlAndAwaitInitialization(TEST_PAGE_WEBVR_URL, PAGE_LOAD_TIMEOUT_S);
+        enterPresentationOrFail(mVrTestRule.getFirstTabCvc());
 
         navigateTo(Page.PAGE_2D);
 
-        assertState(mFirstTabWebContents, Page.PAGE_2D, PresentationMode.NON_PRESENTING,
-                FullscreenMode.NON_FULLSCREENED);
+        assertState(mVrTestRule.getFirstTabWebContents(), Page.PAGE_2D,
+                PresentationMode.NON_PRESENTING, FullscreenMode.NON_FULLSCREENED);
     }
 
     /**
@@ -233,13 +218,13 @@
     @MediumTest
     public void testWebVrPresentingToWebVr()
             throws IllegalArgumentException, InterruptedException, TimeoutException {
-        loadUrl(TEST_PAGE_WEBVR_URL, PAGE_LOAD_TIMEOUT_S);
-        enterPresentationOrFail(mFirstTabCvc);
+        mVrTestRule.loadUrlAndAwaitInitialization(TEST_PAGE_WEBVR_URL, PAGE_LOAD_TIMEOUT_S);
+        enterPresentationOrFail(mVrTestRule.getFirstTabCvc());
 
         navigateTo(Page.PAGE_WEBVR);
 
-        assertState(mFirstTabWebContents, Page.PAGE_WEBVR, PresentationMode.NON_PRESENTING,
-                FullscreenMode.NON_FULLSCREENED);
+        assertState(mVrTestRule.getFirstTabWebContents(), Page.PAGE_WEBVR,
+                PresentationMode.NON_PRESENTING, FullscreenMode.NON_FULLSCREENED);
     }
 
     /**
@@ -250,13 +235,13 @@
     @MediumTest
     public void testWebVrFullscreenTo2d()
             throws IllegalArgumentException, InterruptedException, TimeoutException {
-        loadUrl(TEST_PAGE_WEBVR_URL, PAGE_LOAD_TIMEOUT_S);
-        enterFullscreenOrFail(mFirstTabCvc);
+        mVrTestRule.loadUrlAndAwaitInitialization(TEST_PAGE_WEBVR_URL, PAGE_LOAD_TIMEOUT_S);
+        enterFullscreenOrFail(mVrTestRule.getFirstTabCvc());
 
         navigateTo(Page.PAGE_2D);
 
-        assertState(mFirstTabWebContents, Page.PAGE_2D, PresentationMode.NON_PRESENTING,
-                FullscreenMode.NON_FULLSCREENED);
+        assertState(mVrTestRule.getFirstTabWebContents(), Page.PAGE_2D,
+                PresentationMode.NON_PRESENTING, FullscreenMode.NON_FULLSCREENED);
     }
 
     /**
@@ -267,12 +252,12 @@
     @MediumTest
     public void testWebVrFullscreenToWebVr()
             throws IllegalArgumentException, InterruptedException, TimeoutException {
-        loadUrl(TEST_PAGE_WEBVR_URL, PAGE_LOAD_TIMEOUT_S);
-        enterFullscreenOrFail(mFirstTabCvc);
+        mVrTestRule.loadUrlAndAwaitInitialization(TEST_PAGE_WEBVR_URL, PAGE_LOAD_TIMEOUT_S);
+        enterFullscreenOrFail(mVrTestRule.getFirstTabCvc());
 
         navigateTo(Page.PAGE_WEBVR);
 
-        assertState(mFirstTabWebContents, Page.PAGE_WEBVR, PresentationMode.NON_PRESENTING,
-                FullscreenMode.NON_FULLSCREENED);
+        assertState(mVrTestRule.getFirstTabWebContents(), Page.PAGE_WEBVR,
+                PresentationMode.NON_PRESENTING, FullscreenMode.NON_FULLSCREENED);
     }
 }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/vr_shell/VrTestRule.java b/chrome/android/javatests/src/org/chromium/chrome/browser/vr_shell/VrTestRule.java
index a99fdf7..ebb14b97 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/vr_shell/VrTestRule.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/vr_shell/VrTestRule.java
@@ -13,13 +13,13 @@
 import android.support.test.InstrumentationRegistry;
 
 import org.junit.Assert;
-import org.junit.rules.TestRule;
 import org.junit.runner.Description;
 import org.junit.runners.model.Statement;
 
 import org.chromium.base.Log;
 import org.chromium.base.test.util.UrlUtils;
 import org.chromium.chrome.browser.ChromeTabbedActivity;
+import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
 import org.chromium.content.browser.ContentViewCore;
 import org.chromium.content.browser.test.util.ClickUtils;
 import org.chromium.content.browser.test.util.Criteria;
@@ -52,14 +52,33 @@
  * are processed, the JavaScript code will automatically signal the Java code,
  * which can then grab the results and pass/fail the instrumentation test.
  */
-public class VrTestRule implements TestRule {
+public class VrTestRule extends ChromeTabbedActivityTestRule {
     private static final String TAG = "VrTestRule";
     static final String TEST_DIR = "chrome/test/data/android/webvr_instrumentation";
     static final int PAGE_LOAD_TIMEOUT_S = 10;
 
+    private WebContents mFirstTabWebContents;
+    private ContentViewCore mFirstTabCvc;
+
     @Override
     public Statement apply(final Statement base, Description desc) {
-        return base;
+        return super.apply(new Statement() {
+            @Override
+            public void evaluate() throws Throwable {
+                startMainActivityOnBlankPage();
+                mFirstTabWebContents = getActivity().getActivityTab().getWebContents();
+                mFirstTabCvc = getActivity().getActivityTab().getContentViewCore();
+                base.evaluate();
+            }
+        }, desc);
+    }
+
+    public WebContents getFirstTabWebContents() {
+        return mFirstTabWebContents;
+    }
+
+    public ContentViewCore getFirstTabCvc() {
+        return mFirstTabCvc;
     }
 
     /**
@@ -73,13 +92,27 @@
     }
 
     /**
-     * Blocks until the promise returned by nagivator.getVRDisplays() resolves,
-     * then checks whether a VRDisplay was actually found.
+     * Loads the given URL with the given timeout then waits for JavaScript to
+     * signal that it's ready for testing.
+     * @param url The URL of the page to load.
+     * @param timeoutSec The timeout of the page load in seconds.
+     * @param rule The ChromeTabbedActivityTestRule to use for page loading.
+     * @return The return value of ChromeActivityTestRule.loadUrl()
+     */
+    public int loadUrlAndAwaitInitialization(String url, int timeoutSec)
+            throws InterruptedException {
+        int result = loadUrl(url, timeoutSec);
+        pollJavaScriptBoolean("isInitializationComplete()", POLL_TIMEOUT_SHORT_MS,
+                getActivity().getActivityTab().getWebContents());
+        return result;
+    }
+
+    /**
+     * Checks whether a VRDisplay was actually found.
      * @param webContents The WebContents to run the JavaScript through.
      * @return Whether a VRDisplay was found.
      */
     public boolean vrDisplayFound(WebContents webContents) {
-        pollJavaScriptBoolean("vrDisplayPromiseDone", POLL_TIMEOUT_SHORT_MS, webContents);
         return !runJavaScriptOrFail("vrDisplay", POLL_TIMEOUT_SHORT_MS, webContents).equals("null");
     }
 
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/vr_shell/WebVrTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/vr_shell/WebVrTest.java
index ec1a437..2d8da549 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/vr_shell/WebVrTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/vr_shell/WebVrTest.java
@@ -30,9 +30,6 @@
 import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
-import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
-import org.chromium.content.browser.ContentViewCore;
-import org.chromium.content_public.browser.WebContents;
 
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
@@ -46,18 +43,10 @@
 @MinAndroidSdkLevel(Build.VERSION_CODES.KITKAT) // WebVR is only supported on K+
 public class WebVrTest {
     @Rule
-    public ChromeTabbedActivityTestRule mActivityTestRule = new ChromeTabbedActivityTestRule();
-    @Rule
     public VrTestRule mVrTestRule = new VrTestRule();
 
-    private ContentViewCore mFirstTabCvc;
-    private WebContents mFirstTabWebContents;
-
     @Before
     public void setUp() throws InterruptedException {
-        mActivityTestRule.startMainActivityOnBlankPage();
-        mFirstTabCvc = mActivityTestRule.getActivity().getActivityTab().getContentViewCore();
-        mFirstTabWebContents = mActivityTestRule.getActivity().getActivityTab().getWebContents();
         Assert.assertFalse("VrShellDelegate is in VR", VrShellDelegate.isInVr());
     }
 
@@ -67,12 +56,12 @@
     @Test
     @SmallTest
     public void testRequestPresentEntersVr() throws InterruptedException {
-        mActivityTestRule.loadUrl(
+        mVrTestRule.loadUrlAndAwaitInitialization(
                 VrTestRule.getHtmlTestFile("test_requestPresent_enters_vr"), PAGE_LOAD_TIMEOUT_S);
-        Assert.assertTrue("VRDisplay found", mVrTestRule.vrDisplayFound(mFirstTabWebContents));
-        mVrTestRule.enterPresentationAndWait(mFirstTabCvc, mFirstTabWebContents);
+        mVrTestRule.enterPresentationAndWait(
+                mVrTestRule.getFirstTabCvc(), mVrTestRule.getFirstTabWebContents());
         Assert.assertTrue("VrShellDelegate is in VR", VrShellDelegate.isInVr());
-        mVrTestRule.endTest(mFirstTabWebContents);
+        mVrTestRule.endTest(mVrTestRule.getFirstTabWebContents());
     }
 
     /**
@@ -83,10 +72,12 @@
     @SmallTest
     @Restriction(RESTRICTION_TYPE_VIEWER_DAYDREAM)
     public void testNfcFiresVrdisplayactivate() throws InterruptedException {
-        mActivityTestRule.loadUrl(VrTestRule.getHtmlTestFile("test_nfc_fires_vrdisplayactivate"),
+        mVrTestRule.loadUrlAndAwaitInitialization(
+                VrTestRule.getHtmlTestFile("test_nfc_fires_vrdisplayactivate"),
                 PAGE_LOAD_TIMEOUT_S);
-        mVrTestRule.simNfcScanAndWait(mActivityTestRule.getActivity(), mFirstTabWebContents);
-        mVrTestRule.endTest(mFirstTabWebContents);
+        mVrTestRule.simNfcScanAndWait(
+                mVrTestRule.getActivity(), mVrTestRule.getFirstTabWebContents());
+        mVrTestRule.endTest(mVrTestRule.getFirstTabWebContents());
     }
 
     /**
@@ -96,12 +87,13 @@
     @LargeTest
     @Restriction(RESTRICTION_TYPE_VIEWER_DAYDREAM)
     public void testScreenTapsNotRegisteredOnDaydream() throws InterruptedException {
-        mActivityTestRule.loadUrl(
+        mVrTestRule.loadUrlAndAwaitInitialization(
                 VrTestRule.getHtmlTestFile("test_screen_taps_not_registered_on_daydream"),
                 PAGE_LOAD_TIMEOUT_S);
-        Assert.assertTrue("VRDisplay found", mVrTestRule.vrDisplayFound(mFirstTabWebContents));
-        mVrTestRule.executeStepAndWait("stepVerifyNoInitialTaps()", mFirstTabWebContents);
-        mVrTestRule.enterPresentationAndWait(mFirstTabCvc, mFirstTabWebContents);
+        mVrTestRule.executeStepAndWait(
+                "stepVerifyNoInitialTaps()", mVrTestRule.getFirstTabWebContents());
+        mVrTestRule.enterPresentationAndWait(
+                mVrTestRule.getFirstTabCvc(), mVrTestRule.getFirstTabWebContents());
         // Wait on VrShellImpl to say that its parent consumed the touch event
         // Set to 2 because there's an ACTION_DOWN followed by ACTION_UP
         final CountDownLatch touchRegisteredLatch = new CountDownLatch(2);
@@ -113,11 +105,12 @@
                         touchRegisteredLatch.countDown();
                     }
                 });
-        mVrTestRule.sendCardboardClick(mActivityTestRule.getActivity());
+        mVrTestRule.sendCardboardClick(mVrTestRule.getActivity());
         Assert.assertTrue("VrShellImpl dispatched touches",
                 touchRegisteredLatch.await(POLL_TIMEOUT_SHORT_MS, TimeUnit.MILLISECONDS));
-        mVrTestRule.executeStepAndWait("stepVerifyNoAdditionalTaps()", mFirstTabWebContents);
-        mVrTestRule.endTest(mFirstTabWebContents);
+        mVrTestRule.executeStepAndWait(
+                "stepVerifyNoAdditionalTaps()", mVrTestRule.getFirstTabWebContents());
+        mVrTestRule.endTest(mVrTestRule.getFirstTabWebContents());
     }
 
     /**
@@ -128,17 +121,18 @@
     @LargeTest
     @Restriction(RESTRICTION_TYPE_VIEWER_DAYDREAM)
     public void testControllerClicksRegisteredAsTapsOnDaydream() throws InterruptedException {
-        EmulatedVrController controller = new EmulatedVrController(mActivityTestRule.getActivity());
-        mActivityTestRule.loadUrl(
+        EmulatedVrController controller = new EmulatedVrController(mVrTestRule.getActivity());
+        mVrTestRule.loadUrlAndAwaitInitialization(
                 VrTestRule.getHtmlTestFile("test_screen_taps_registered"), PAGE_LOAD_TIMEOUT_S);
-        Assert.assertTrue("VRDisplay found", mVrTestRule.vrDisplayFound(mFirstTabWebContents));
-        mVrTestRule.executeStepAndWait("stepVerifyNoInitialTaps()", mFirstTabWebContents);
+        mVrTestRule.executeStepAndWait(
+                "stepVerifyNoInitialTaps()", mVrTestRule.getFirstTabWebContents());
         // Wait to enter VR
-        mVrTestRule.enterPresentationAndWait(mFirstTabCvc, mFirstTabWebContents);
+        mVrTestRule.enterPresentationAndWait(
+                mVrTestRule.getFirstTabCvc(), mVrTestRule.getFirstTabWebContents());
         // Send a controller click and wait for JavaScript to receive it
         controller.pressReleaseTouchpadButton();
-        mVrTestRule.waitOnJavaScriptStep(mFirstTabWebContents);
-        mVrTestRule.endTest(mFirstTabWebContents);
+        mVrTestRule.waitOnJavaScriptStep(mVrTestRule.getFirstTabWebContents());
+        mVrTestRule.endTest(mVrTestRule.getFirstTabWebContents());
     }
 
     /**
@@ -149,16 +143,17 @@
     @Restriction(RESTRICTION_TYPE_VIEWER_NON_DAYDREAM)
     @RetryOnFailure(message = "Flaky on L crbug.com/713781")
     public void testScreenTapsRegisteredOnCardboard() throws InterruptedException {
-        mActivityTestRule.loadUrl(
+        mVrTestRule.loadUrlAndAwaitInitialization(
                 VrTestRule.getHtmlTestFile("test_screen_taps_registered"), PAGE_LOAD_TIMEOUT_S);
-        Assert.assertTrue("VRDisplay found", mVrTestRule.vrDisplayFound(mFirstTabWebContents));
-        mVrTestRule.executeStepAndWait("stepVerifyNoInitialTaps()", mFirstTabWebContents);
+        mVrTestRule.executeStepAndWait(
+                "stepVerifyNoInitialTaps()", mVrTestRule.getFirstTabWebContents());
         // Wait to enter VR
-        mVrTestRule.enterPresentationAndWait(mFirstTabCvc, mFirstTabWebContents);
+        mVrTestRule.enterPresentationAndWait(
+                mVrTestRule.getFirstTabCvc(), mVrTestRule.getFirstTabWebContents());
         // Tap and wait for JavaScript to receive it
         mVrTestRule.sendCardboardClickAndWait(
-                mActivityTestRule.getActivity(), mFirstTabWebContents);
-        mVrTestRule.endTest(mFirstTabWebContents);
+                mVrTestRule.getActivity(), mVrTestRule.getFirstTabWebContents());
+        mVrTestRule.endTest(mVrTestRule.getFirstTabWebContents());
     }
 
     /**
@@ -168,16 +163,16 @@
     // @SmallTest
     @DisabledTest(message = "Flaky. http://crbug.com/726986")
     public void testPoseDataUnfocusedTab() throws InterruptedException {
-        mActivityTestRule.loadUrl(
+        mVrTestRule.loadUrlAndAwaitInitialization(
                 VrTestRule.getHtmlTestFile("test_pose_data_unfocused_tab"), PAGE_LOAD_TIMEOUT_S);
-        Assert.assertTrue("VRDisplay found", mVrTestRule.vrDisplayFound(mFirstTabWebContents));
-        mVrTestRule.executeStepAndWait("stepCheckFrameDataWhileFocusedTab()", mFirstTabWebContents);
+        mVrTestRule.executeStepAndWait(
+                "stepCheckFrameDataWhileFocusedTab()", mVrTestRule.getFirstTabWebContents());
 
-        mActivityTestRule.loadUrlInNewTab("about:blank");
+        mVrTestRule.loadUrlInNewTab("about:blank");
 
         mVrTestRule.executeStepAndWait(
-                "stepCheckFrameDataWhileNonFocusedTab()", mFirstTabWebContents);
-        mVrTestRule.endTest(mFirstTabWebContents);
+                "stepCheckFrameDataWhileNonFocusedTab()", mVrTestRule.getFirstTabWebContents());
+        mVrTestRule.endTest(mVrTestRule.getFirstTabWebContents());
     }
 
     /**
@@ -190,49 +185,46 @@
         MockVrCoreVersionCheckerImpl mockChecker = new MockVrCoreVersionCheckerImpl();
         mockChecker.setMockReturnValue(checkerReturnValue);
         VrUtils.getVrShellDelegateInstance().overrideVrCoreVersionCheckerForTesting(mockChecker);
-        mActivityTestRule.loadUrl(
+        mVrTestRule.loadUrlAndAwaitInitialization(
                 VrTestRule.getHtmlTestFile("generic_webvr_page"), PAGE_LOAD_TIMEOUT_S);
         String displayFound = "VRDisplay Found";
         String barPresent = "InfoBar present";
         if (checkerReturnValue == VrCoreVersionChecker.VR_READY) {
-            Assert.assertTrue(displayFound, mVrTestRule.vrDisplayFound(mFirstTabWebContents));
+            Assert.assertTrue(
+                    displayFound, mVrTestRule.vrDisplayFound(mVrTestRule.getFirstTabWebContents()));
             Assert.assertFalse(barPresent,
-                    VrUtils.isInfoBarPresent(
-                            mActivityTestRule.getActivity().getWindow().getDecorView()));
+                    VrUtils.isInfoBarPresent(mVrTestRule.getActivity().getWindow().getDecorView()));
         } else if (checkerReturnValue == VrCoreVersionChecker.VR_OUT_OF_DATE
                 || checkerReturnValue == VrCoreVersionChecker.VR_NOT_AVAILABLE) {
             // Out of date and missing cases are the same, but with different text
             String expectedMessage, expectedButton;
             if (checkerReturnValue == VrCoreVersionChecker.VR_OUT_OF_DATE) {
-                expectedMessage = mActivityTestRule.getActivity().getString(
+                expectedMessage = mVrTestRule.getActivity().getString(
                         R.string.vr_services_check_infobar_update_text);
-                expectedButton = mActivityTestRule.getActivity().getString(
+                expectedButton = mVrTestRule.getActivity().getString(
                         R.string.vr_services_check_infobar_update_button);
             } else {
-                expectedMessage = mActivityTestRule.getActivity().getString(
+                expectedMessage = mVrTestRule.getActivity().getString(
                         R.string.vr_services_check_infobar_install_text);
-                expectedButton = mActivityTestRule.getActivity().getString(
+                expectedButton = mVrTestRule.getActivity().getString(
                         R.string.vr_services_check_infobar_install_button);
             }
-            Assert.assertFalse(displayFound, mVrTestRule.vrDisplayFound(mFirstTabWebContents));
+            Assert.assertFalse(
+                    displayFound, mVrTestRule.vrDisplayFound(mVrTestRule.getFirstTabWebContents()));
             Assert.assertTrue(barPresent,
-                    VrUtils.isInfoBarPresent(
-                            mActivityTestRule.getActivity().getWindow().getDecorView()));
-            TextView tempView = (TextView) mActivityTestRule.getActivity()
-                                        .getWindow()
-                                        .getDecorView()
-                                        .findViewById(R.id.infobar_message);
+                    VrUtils.isInfoBarPresent(mVrTestRule.getActivity().getWindow().getDecorView()));
+            TextView tempView =
+                    (TextView) mVrTestRule.getActivity().getWindow().getDecorView().findViewById(
+                            R.id.infobar_message);
             Assert.assertEquals(expectedMessage, tempView.getText().toString());
-            tempView = (TextView) mActivityTestRule.getActivity()
-                               .getWindow()
-                               .getDecorView()
-                               .findViewById(R.id.button_primary);
+            tempView = (TextView) mVrTestRule.getActivity().getWindow().getDecorView().findViewById(
+                    R.id.button_primary);
             Assert.assertEquals(expectedButton, tempView.getText().toString());
         } else if (checkerReturnValue == VrCoreVersionChecker.VR_NOT_SUPPORTED) {
-            Assert.assertFalse(displayFound, mVrTestRule.vrDisplayFound(mFirstTabWebContents));
+            Assert.assertFalse(
+                    displayFound, mVrTestRule.vrDisplayFound(mVrTestRule.getFirstTabWebContents()));
             Assert.assertFalse(barPresent,
-                    VrUtils.isInfoBarPresent(
-                            mActivityTestRule.getActivity().getWindow().getDecorView()));
+                    VrUtils.isInfoBarPresent(mVrTestRule.getActivity().getWindow().getDecorView()));
         } else {
             Assert.fail(
                     "Invalid VrCoreVersionChecker value: " + String.valueOf(checkerReturnValue));
@@ -285,13 +277,12 @@
     @Test
     @MediumTest
     public void testDeviceCapabilitiesMatchExpectations() throws InterruptedException {
-        mActivityTestRule.loadUrl(
+        mVrTestRule.loadUrlAndAwaitInitialization(
                 VrTestRule.getHtmlTestFile("test_device_capabilities_match_expectations"),
                 PAGE_LOAD_TIMEOUT_S);
-        Assert.assertTrue("VRDisplayFound", mVrTestRule.vrDisplayFound(mFirstTabWebContents));
-        mVrTestRule.executeStepAndWait(
-                "stepCheckDeviceCapabilities('" + Build.DEVICE + "')", mFirstTabWebContents);
-        mVrTestRule.endTest(mFirstTabWebContents);
+        mVrTestRule.executeStepAndWait("stepCheckDeviceCapabilities('" + Build.DEVICE + "')",
+                mVrTestRule.getFirstTabWebContents());
+        mVrTestRule.endTest(mVrTestRule.getFirstTabWebContents());
     }
 
     /**
@@ -301,9 +292,10 @@
     @MediumTest
     @RetryOnFailure(message = "Flaky on L crbug.com/713781")
     public void testPresentationLocksFocus() throws InterruptedException {
-        mActivityTestRule.loadUrl(
+        mVrTestRule.loadUrlAndAwaitInitialization(
                 VrTestRule.getHtmlTestFile("test_presentation_locks_focus"), PAGE_LOAD_TIMEOUT_S);
-        mVrTestRule.enterPresentationAndWait(mFirstTabCvc, mFirstTabWebContents);
-        mVrTestRule.endTest(mFirstTabWebContents);
+        mVrTestRule.enterPresentationAndWait(
+                mVrTestRule.getFirstTabCvc(), mVrTestRule.getFirstTabWebContents());
+        mVrTestRule.endTest(mVrTestRule.getFirstTabWebContents());
     }
 }
diff --git a/chrome/app/app-Info.plist b/chrome/app/app-Info.plist
index c5939d4d..f7dd4ec 100644
--- a/chrome/app/app-Info.plist
+++ b/chrome/app/app-Info.plist
@@ -350,5 +350,7 @@
 	</array>
         <key>NSUserNotificationAlertStyle</key>
         <string>banner</string>
+	<key>NSSupportsAppNap</key>
+	<true/>
 </dict>
 </plist>
diff --git a/chrome/app/chrome_exe_main_mac.cc b/chrome/app/chrome_exe_main_mac.cc
index b8595246..f446f445 100644
--- a/chrome/app/chrome_exe_main_mac.cc
+++ b/chrome/app/chrome_exe_main_mac.cc
@@ -16,21 +16,73 @@
 #include <string.h>
 #include <unistd.h>
 
+#include <string>
+#include <vector>
+
 #include "chrome/common/chrome_version.h"
 
+#if defined(HELPER_EXECUTABLE)
+#include "sandbox/mac/seatbelt_exec.h"
+#endif  // defined(HELPER_EXECUTABLE)
+
+namespace {
+
 typedef int (*ChromeMainPtr)(int, char**);
 
-__attribute__((visibility("default"))) int main(int argc, char* argv[]) {
 #if defined(HELPER_EXECUTABLE)
-  const char* const rel_path =
-      "../../../" PRODUCT_FULLNAME_STRING
-      " Framework.framework/" PRODUCT_FULLNAME_STRING " Framework";
-#else
-  const char* const rel_path =
-      "../Versions/" CHROME_VERSION_STRING "/" PRODUCT_FULLNAME_STRING
-      " Framework.framework/" PRODUCT_FULLNAME_STRING " Framework";
+// The command line parameter to engage the v2 sandbox.
+constexpr char v2_sandbox_arg[] = "--v2-sandbox";
+// The command line parameter for the file descriptor used to receive the
+// sandbox policy.
+constexpr char fd_mapping_arg[] = "--fd_mapping=";
+
+__attribute__((noreturn)) void SandboxExec(const char* exec_path,
+                                           int argc,
+                                           char* argv[],
+                                           int fd_mapping) {
+  char rp[MAXPATHLEN];
+  if (realpath(exec_path, rp) == NULL) {
+    perror("realpath");
+    abort();
+  }
+
+  sandbox::SeatbeltExecServer server(fd_mapping);
+
+  // The name of the parameter containing the executable path.
+  const std::string exec_param = "EXECUTABLE_PATH";
+  // The name of the parameter containing the PID of Chrome.
+  const std::string pid_param = "CHROMIUM_PID";
+
+  if (!server.SetParameter(exec_param, rp) ||
+      !server.SetParameter(pid_param, std::to_string(getpid()))) {
+    fprintf(stderr, "Failed to set up parameters for sandbox.\n");
+    abort();
+  }
+
+  if (server.InitializeSandbox() != 0) {
+    fprintf(stderr, "Failed to initialize sandbox.\n");
+    abort();
+  }
+
+  std::vector<char*> new_argv;
+  for (int i = 1; i < argc; ++i) {
+    if (strcmp(argv[i], v2_sandbox_arg) != 0 &&
+        strncmp(argv[i], fd_mapping_arg, strlen(fd_mapping_arg)) != 0) {
+      new_argv.push_back(argv[i]);
+    }
+  }
+  new_argv.push_back(nullptr);
+
+  // The helper executable re-executes itself under the sandbox.
+  execv(exec_path, new_argv.data());
+  perror("execve");
+  abort();
+}
 #endif  // defined(HELPER_EXECUTABLE)
 
+}  // namespace
+
+__attribute__((visibility("default"))) int main(int argc, char* argv[]) {
   uint32_t exec_path_size = 0;
   int rv = _NSGetExecutablePath(NULL, &exec_path_size);
   if (rv != -1) {
@@ -39,17 +91,43 @@
   }
 
   char* exec_path = new char[exec_path_size];
-  if (!exec_path) {
-    fprintf(stderr, "malloc %u: %s\n", exec_path_size, strerror(errno));
-    abort();
-  }
-
   rv = _NSGetExecutablePath(exec_path, &exec_path_size);
   if (rv != 0) {
     fprintf(stderr, "_NSGetExecutablePath: get path failed\n");
     abort();
   }
 
+#if defined(HELPER_EXECUTABLE)
+  bool enable_v2_sandbox = false;
+  int fd_mapping = -1;
+  for (int i = 1; i < argc; i++) {
+    if (strcmp(argv[i], v2_sandbox_arg) == 0) {
+      enable_v2_sandbox = true;
+    } else if (strncmp(argv[i], fd_mapping_arg, strlen(fd_mapping_arg)) == 0) {
+      // Parse --fd_mapping=X to get the file descriptor X.
+      std::string arg(argv[i]);
+      std::string fd_str = arg.substr(strlen(fd_mapping_arg), arg.length());
+      fd_mapping = std::stoi(fd_str);
+    }
+  }
+  if (enable_v2_sandbox && fd_mapping == -1) {
+    fprintf(stderr, "Must pass a valid file descriptor to --fd_mapping.\n");
+    abort();
+  }
+
+  // SandboxExec either aborts or execs, but there is no return.
+  if (enable_v2_sandbox)
+    SandboxExec(exec_path, argc, argv, fd_mapping);
+
+  const char* const rel_path =
+      "../../../" PRODUCT_FULLNAME_STRING
+      " Framework.framework/" PRODUCT_FULLNAME_STRING " Framework";
+#else
+  const char* const rel_path =
+      "../Versions/" CHROME_VERSION_STRING "/" PRODUCT_FULLNAME_STRING
+      " Framework.framework/" PRODUCT_FULLNAME_STRING " Framework";
+#endif  // defined(HELPER_EXECUTABLE)
+
   // Slice off the last part of the main executable path, and append the
   // version framework information.
   const char* parent_dir = dirname(exec_path);
@@ -59,15 +137,11 @@
   }
   delete[] exec_path;
 
-  const size_t parent_path_len = strlen(parent_dir);
+  const size_t parent_dir_len = strlen(parent_dir);
   const size_t rel_path_len = strlen(rel_path);
   // 2 accounts for a trailing NUL byte and the '/' in the middle of the paths.
-  const size_t framework_path_size = parent_path_len + rel_path_len + 2;
+  const size_t framework_path_size = parent_dir_len + rel_path_len + 2;
   char* framework_path = new char[framework_path_size];
-  if (!framework_path) {
-    fprintf(stderr, "malloc %zu: %s\n", framework_path_size, strerror(errno));
-    abort();
-  }
   snprintf(framework_path, framework_path_size, "%s/%s", parent_dir, rel_path);
 
   void* library = dlopen(framework_path, RTLD_LAZY | RTLD_LOCAL | RTLD_FIRST);
diff --git a/chrome/app/media_router_strings.grdp b/chrome/app/media_router_strings.grdp
index ffeff9742..97bc13c 100644
--- a/chrome/app/media_router_strings.grdp
+++ b/chrome/app/media_router_strings.grdp
@@ -136,6 +136,24 @@
   <message name="IDS_MEDIA_ROUTER_STOP_CASTING_BUTTON" desc="Stop casting button, which, on click, will stop the current route.">
     Stop
   </message>
+  <message name="IDS_MEDIA_ROUTER_ROUTE_DETAILS_PLAY_TITLE" desc="The title label for a button to play media contents.">
+    Play
+  </message>
+  <message name="IDS_MEDIA_ROUTER_ROUTE_DETAILS_PAUSE_TITLE" desc="The title label for a button to pause media contents.">
+    Pause
+  </message>
+  <message name="IDS_MEDIA_ROUTER_ROUTE_DETAILS_MUTE_TITLE" desc="The title label for a button to mute media contents.">
+    Mute
+  </message>
+  <message name="IDS_MEDIA_ROUTER_ROUTE_DETAILS_UNMUTE_TITLE" desc="The title label for a button to unmute media contents.">
+    Unmute
+  </message>
+  <message name="IDS_MEDIA_ROUTER_ROUTE_DETAILS_SEEK_TITLE" desc="The title label for a seek bar for media contents.">
+    Seek
+  </message>
+  <message name="IDS_MEDIA_ROUTER_ROUTE_DETAILS_VOLUME_TITLE" desc="The title label for a volume control bar for media contents.">
+    Volume
+  </message>
 
   <!-- Sink List -->
   <message name="IDS_MEDIA_ROUTER_DESTINATION_MISSING" desc="Link to display when no Cast destinations are found which, on click, opens a page to the Chromecast help center explaining possible reasons why none are detected.">
diff --git a/chrome/app/resources/chromium_strings_es.xtb b/chrome/app/resources/chromium_strings_es.xtb
index 2461e645..583cc0fe 100644
--- a/chrome/app/resources/chromium_strings_es.xtb
+++ b/chrome/app/resources/chromium_strings_es.xtb
@@ -27,7 +27,7 @@
 <translation id="1779356040007214683">Para aumentar la seguridad de Chromium, hemos inhabilitado algunas extensiones que no figuran en <ph name="IDS_EXTENSION_WEB_STORE_TITLE" /> y que se podrían haber añadido sin tu conocimiento.</translation>
 <translation id="1808667845054772817">Reinstalar Chromium</translation>
 <translation id="1869480248812203386">Puedes ayudar a que Chromium sea más seguro y más fácil de utilizar enviando a Google automáticamente información sobre posibles incidentes de seguridad.</translation>
-<translation id="1881322772814446296">Vas a iniciar sesión con una cuenta administrada, lo que significa que proporcionarás a su administrador control sobre tu perfil de Chromium. Tus datos de Chromium como, por ejemplo, tus aplicaciones, tus marcadores, tu historial, tus contraseñas y otras opciones se vincularán de forma permanente a la cuenta <ph name="USER_NAME" />. Podrás eliminar estos datos a través del Panel de control de cuentas de Google, pero no podrás asociarlos a otra cuenta. De forma opcional, puedes crear un nuevo perfil para mantener separados tus datos de Chromium. <ph name="LEARN_MORE" /></translation>
+<translation id="1881322772814446296">Vas a iniciar sesión con una cuenta gestionada, lo que significa que proporcionarás a su administrador control sobre tu perfil de Chromium. Tus datos de Chromium como, por ejemplo, tus aplicaciones, tus marcadores, tu historial, tus contraseñas y otras opciones se vincularán de forma permanente a la cuenta <ph name="USER_NAME" />. Podrás eliminar estos datos a través del Panel de control de cuentas de Google, pero no podrás asociarlos a otra cuenta. De forma opcional, puedes crear un nuevo perfil para mantener separados tus datos de Chromium. <ph name="LEARN_MORE" /></translation>
 <translation id="1929939181775079593">Chromium no responde. ¿Quieres reiniciarlo ahora?</translation>
 <translation id="1966382378801805537">Chromium no puede determinar ni establecer el navegador predeterminado</translation>
 <translation id="1967743265616885482">Se ha detectado que un módulo con el mismo nombre provoca un conflicto con Chromium.</translation>
@@ -125,7 +125,7 @@
 <translation id="5045248521775609809">Llévate Chromium a todas partes</translation>
 <translation id="5116586539350239523">Chromium almacenará de forma segura tu información personal, de modo que no tendrás que volver a introducirla.</translation>
 <translation id="5231355151045086930">Cerrar sesión en Chromium</translation>
-<translation id="5358375970380395591">Vas a iniciar sesión con una cuenta administrada, lo que significa que proporcionarás a su administrador control sobre tu perfil de Chromium. Tus datos de Chromium como, por ejemplo, tus aplicaciones, tus marcadores, tu historial, tus contraseñas y otras opciones se vincularán de forma permanente a la cuenta <ph name="USER_NAME" />. Podrás eliminar estos datos a través del Panel de control de cuentas de Google, pero no podrás asociarlos a otra cuenta. <ph name="LEARN_MORE" /></translation>
+<translation id="5358375970380395591">Vas a iniciar sesión con una cuenta gestionada, lo que significa que proporcionarás a su administrador control sobre tu perfil de Chromium. Tus datos de Chromium como, por ejemplo, tus aplicaciones, tus marcadores, tu historial, tus contraseñas y otras opciones se vincularán de forma permanente a la cuenta <ph name="USER_NAME" />. Podrás eliminar estos datos a través del Panel de control de cuentas de Google, pero no podrás asociarlos a otra cuenta. <ph name="LEARN_MORE" /></translation>
 <translation id="5386450000063123300">Actualizando Chromium (<ph name="PROGRESS_PERCENT" />)</translation>
 <translation id="5398878173008909840">Hay una nueva versión de Chromium disponible.</translation>
 <translation id="5427571867875391349">Establecer Chromium como navegador predeterminado</translation>
diff --git a/chrome/app/resources/chromium_strings_pt-PT.xtb b/chrome/app/resources/chromium_strings_pt-PT.xtb
index 0b8179f..d03c9bb 100644
--- a/chrome/app/resources/chromium_strings_pt-PT.xtb
+++ b/chrome/app/resources/chromium_strings_pt-PT.xtb
@@ -131,7 +131,7 @@
 <translation id="5479196819031988440">O SO Chromium não consegue abrir esta página.</translation>
 <translation id="549669000822060376">Aguarde até que o Chromium instale as atualizações do sistema mais recentes.</translation>
 <translation id="5563479599352954471">Pesquisar com um toque</translation>
-<translation id="5620765574781326016">Saiba mais acerca de tópicos em Websites sem sair da página.</translation>
+<translation id="5620765574781326016">Saiba mais acerca de tópicos em Sites sem sair da página.</translation>
 <translation id="5634636535844844681">O Chromium requer o Windows 7 ou superior.</translation>
 <translation id="5680901439334282664">inicie sessão no Chromium</translation>
 <translation id="5698481217667032250">Apresentar o Chromium neste idioma</translation>
@@ -202,7 +202,7 @@
 <translation id="7337881442233988129">Chromium</translation>
 <translation id="7339898014177206373">Nova janela</translation>
 <translation id="734373864078049451">A sua Web, os seus marcadores e os seus outros itens do Chromium estão aqui.</translation>
-<translation id="7344413941077984497">Para definir que Websites <ph name="NEW_PROFILE_NAME" /> pode ver, pode configurar restrições e definições ao aceder a <ph name="BEGIN_LINK_1" /><ph name="DISPLAY_LINK" /><ph name="END_LINK_1" />. Se não alterar as predefinições, <ph name="NEW_PROFILE_NAME" /> pode procurar tudo na Web.
+<translation id="7344413941077984497">Para definir que Sites <ph name="NEW_PROFILE_NAME" /> pode ver, pode configurar restrições e definições ao aceder a <ph name="BEGIN_LINK_1" /><ph name="DISPLAY_LINK" /><ph name="END_LINK_1" />. Se não alterar as predefinições, <ph name="NEW_PROFILE_NAME" /> pode procurar tudo na Web.
 
 Para evitar que <ph name="NEW_PROFILE_NAME" /> aceda à sua conta, certifique-se de que bloqueia o seu perfil quando não estiver a utilizar o Chromium. Para o fazer, clique no seu nome de perfil no canto superior direito do navegador e selecione "Sair e bloqueio para criança".
 <ph name="BEGIN_LINK_2" />Saber mais<ph name="END_LINK_2" />
diff --git a/chrome/app/resources/chromium_strings_th.xtb b/chrome/app/resources/chromium_strings_th.xtb
index d13a70b..15ee5db 100644
--- a/chrome/app/resources/chromium_strings_th.xtb
+++ b/chrome/app/resources/chromium_strings_th.xtb
@@ -1,7 +1,7 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="th">
-<translation id="1065672644894730302">ค่ากำหนดของคุณไม่สามารถอ่านได้ คุณลักษณะบางอย่างอาจใช้ไม่ได้และการเปลี่ยนแปลงค่ากำหนดจะไม่ได้รับการบันทึก</translation>
+<translation id="1065672644894730302">ค่ากำหนดของคุณไม่สามารถอ่านได้ ฟีเจอร์บางอย่างอาจใช้ไม่ได้และการเปลี่ยนแปลงค่ากำหนดจะไม่ได้รับการบันทึก</translation>
 <translation id="1115445892567829615">Chromium ไม่สามารถซิงค์ข้อมูลของคุณ โปรดอัปเดตข้อความรหัสผ่านการซิงค์</translation>
 <translation id="113122355610423240">Chromium เป็นเบราว์เซอร์เริ่มต้นของคุณ</translation>
 <translation id="1170115874949214249">ติดตั้ง Chromium ในโทรศัพท์ เราจะส่ง SMS ไปยังหมายเลขโทรศัพท์สำหรับการกู้คืนบัญชีของคุณ</translation>
@@ -18,7 +18,7 @@
 <translation id="1559451348202814456">Chromium อาจทำงานไม่ถูกต้องเพราะไม่รองรับ Mac OS X 10.6, 10.7 หรือ 10.8 อีกต่อไป</translation>
 <translation id="1653828314016431939">ตกลง - รีสตาร์ทเลย</translation>
 <translation id="1668054258064581266">เมื่อลบบัญชีของคุณออกจาก Chromium แล้ว คุณต้องโหลดแท็บที่เปิดอยู่ซ้ำเพื่อให้มีผล</translation>
-<translation id="1688750314291223739">ตั้งค่าการซิงค์เพื่อบัน​​ทึกคุณลักษณะเบราว์เซอร์ในแบบของคุณไปยังเว็บและเข้าถึงได้จาก Chromium บนคอมพิวเตอร์เครื่องใดก็ได้</translation>
+<translation id="1688750314291223739">ตั้งค่าการซิงค์เพื่อบัน​​ทึกฟีเจอร์เบราว์เซอร์ในแบบของคุณไปยังเว็บและเข้าถึงได้จาก Chromium บนคอมพิวเตอร์เครื่องใดก็ได้</translation>
 <translation id="1699664235656412242">โปรดปิดหน้าต่าง Chromium ทั้งหมด (รวมทั้งในโหมด Windows 8 ด้วย) และลองอีกครั้ง</translation>
 <translation id="1708666629004767631">Chromium รุ่นใหม่ที่ปลอดภัยกว่าเดิมพร้อมให้ใช้งานแล้ว</translation>
 <translation id="1774152462503052664">ให้ Chromium ทำงานในพื้นหลัง</translation>
@@ -90,7 +90,7 @@
 <translation id="3889543394854987837">คลิกชื่อของคุณเพื่อเปิด Chromium และเริ่มท่องเว็บ</translation>
 <translation id="390894725198123737">สำหรับ Mac ระบบจะบันทึกรหัสผ่านไว้ใน Keychain และผู้ใช้ Chromium คนอื่นๆ ที่แชร์บัญชี OS X นี้อาจสามารถเข้าถึงหรือซิงค์รหัสผ่านนี้ได้</translation>
 <translation id="4036079820698952681">ช่วยให้ Chromium ดียิ่งขึ้นด้วยการรายงาน<ph name="BEGIN_LINK" />การตั้งค่าปัจจุบัน<ph name="END_LINK" /></translation>
-<translation id="4050175100176540509">การปรับปรุงด้านความปลอดภัยที่สำคัญและคุณลักษณะใหม่ๆ พร้อมให้บริการในเวอร์ชันล่าสุด</translation>
+<translation id="4050175100176540509">การปรับปรุงด้านความปลอดภัยที่สำคัญและฟีเจอร์ใหม่ๆ พร้อมให้บริการในเวอร์ชันล่าสุด</translation>
 <translation id="407254336480250557">เลือก <ph name="SMALL_PRODUCT_LOGO" /> <ph name="BEGIN_BOLD" />Chromium<ph name="END_BOLD" /></translation>
 <translation id="4077262827416206768">โปรดปิดหน้าต่าง Chromium ทั้งหมดและเปิด Chromium อีกครั้งเพื่อให้การเปลี่ยนแปลงนี้มีผล</translation>
 <translation id="4207043877577553402"><ph name="BEGIN_BOLD" />คำเตือน:<ph name="END_BOLD" /> Chromium ไม่สามารถป้องกันส่วนขยายจาการบันทึกประวัติการเรียกดูได้ หากคุณต้องการปิดใช้งานส่วนขยายนี้ในโหมดไม่ระบุตัวตน ให้ยกเลิกการเลือกตัวเลือกนี้</translation>
@@ -140,7 +140,7 @@
 <translation id="5772805321386874569">(จำเป็นต้อง <ph name="BEGIN_BUTTON" />รีสตาร์ท<ph name="END_BUTTON" /> Chromium)</translation>
 <translation id="5796460469508169315">Chromium เกือบจะพร้อมใช้งานแล้ว</translation>
 <translation id="5820394555380036790">Chromium OS</translation>
-<translation id="5823381412099532241">Chromium ไม่สามารถอัปเดตตัวเองเป็นเวอร์ชันล่าสุดได้ คุณกำลังพลาดคุณลักษณะเจ๋งๆ และการปรับปรุงความปลอดภัย คุณจำเป็นต้องอัปเดต Chromium</translation>
+<translation id="5823381412099532241">Chromium ไม่สามารถอัปเดตตัวเองเป็นเวอร์ชันล่าสุดได้ คุณกำลังพลาดฟีเจอร์เจ๋งๆ และการปรับปรุงความปลอดภัย คุณจำเป็นต้องอัปเดต Chromium</translation>
 <translation id="5859963531214966875">Chromium เวอร์ชันต่อไปจะไม่รองรับระบบ Linux อีกต่อไป</translation>
 <translation id="5862307444128926510">ยินดีต้อนรับสู่ Chromium</translation>
 <translation id="5877064549588274448">เปลี่ยนช่องแล้ว รีสตาร์ทอุปกรณ์เพื่อใช้การเปลี่ยนแปลง</translation>
@@ -172,7 +172,7 @@
 <translation id="6676384891291319759">เข้าถึงอินเทอร์เน็ต</translation>
 <translation id="6717134281241384636">โปรไฟล์ของคุณไม่สามารถใช้ได้เนื่องจากมาจาก Chromium รุ่นใหม่
 
-คุณลักษณะบางประการอาจไม่มี โปรดระบุไดเรกทอรีโปรไฟล์อื่น หรือใช้ Chromium รุ่นใหม่</translation>
+ฟีเจอร์บางประการอาจไม่มี โปรดระบุไดเรกทอรีโปรไฟล์อื่น หรือใช้ Chromium รุ่นใหม่</translation>
 <translation id="6734080038664603509">อัปเดต &amp;Chromium</translation>
 <translation id="6734291798041940871">มีการติดตั้ง Chromium สำหรับผู้ใช้ทุกคนบนคอมพิวเตอร์ของคุณแล้ว</translation>
 <translation id="6757767188268205357">อย่ากวนใจฉัน</translation>
@@ -182,7 +182,7 @@
 <translation id="6893813176749746474">Chromium ได้รับการอัปเดตแล้ว แต่คุณไม่ได้ใช้งานมาไม่ต่ำกว่า 30 วันแล้ว</translation>
 <translation id="6944967875980567883">โมดูลที่โหลดเข้าไปใน Chromium</translation>
 <translation id="6970811910055250180">กำลังอัปเดตอุปกรณ์ของคุณ...</translation>
-<translation id="7027298027173928763">Chromium ไม่สามารถอัปเดตตัวเองเป็นเวอร์ชันล่าสุดได้ คุณกำลังพลาดคุณลักษณะเจ๋งๆ และการปรับปรุงความปลอดภัย คุณจำเป็นต้องติดตั้ง Chromium ใหม่ด้วยตนเอง</translation>
+<translation id="7027298027173928763">Chromium ไม่สามารถอัปเดตตัวเองเป็นเวอร์ชันล่าสุดได้ คุณกำลังพลาดฟีเจอร์เจ๋งๆ และการปรับปรุงความปลอดภัย คุณจำเป็นต้องติดตั้ง Chromium ใหม่ด้วยตนเอง</translation>
 <translation id="705851970750939768">อัปเดต Chromium</translation>
 <translation id="7066436765290594559">Chromium OS ไม่สามารถซิงค์ข้อมูลของคุณ โปรดอัปเดตข้อความรหัสผ่านสำหรับการซิงค์</translation>
 <translation id="707471633328071618">Google Payments (คัดลอกลงใน Chromium แล้ว)</translation>
@@ -208,7 +208,7 @@
 <ph name="BEGIN_LINK_2" />เรียนรู้เพิ่มเติม<ph name="END_LINK_2" />
 
 โปรดตรวจสอบอีเมลของคุณที่ <ph name="ACCOUNT_EMAIL" /> สำหรับคำแนะนำเพิ่มเติม</translation>
-<translation id="7421823331379285070">Chromium จำเป็นต้องใช้ Windows XP หรือรุ่นที่ใหม่กว่า คุณลักษณะบางอย่างอาจไม่ทำงาน</translation>
+<translation id="7421823331379285070">Chromium จำเป็นต้องใช้ Windows XP หรือรุ่นที่ใหม่กว่า ฟีเจอร์บางอย่างอาจไม่ทำงาน</translation>
 <translation id="7473891865547856676">ไม่ ขอบคุณ</translation>
 <translation id="7483335560992089831">ไม่สามารถติดตั้ง Chromium รุ่นเดียวกับที่กำลังใช้งานอยู่ในขณะนี้ โปรดปิด Chromium และลองอีกครั้ง</translation>
 <translation id="7549178288319965365">เกี่ยวกับ Chromium OS</translation>
diff --git a/chrome/app/resources/generated_resources_am.xtb b/chrome/app/resources/generated_resources_am.xtb
index 2db190ae..20cfb117 100644
--- a/chrome/app/resources/generated_resources_am.xtb
+++ b/chrome/app/resources/generated_resources_am.xtb
@@ -836,7 +836,6 @@
 <translation id="2224551243087462610">የአቃፊ ስም አርትዕ</translation>
 <translation id="2226449515541314767">ይህ ጣቢያ የMIDI መሳሪያዎች ሙሉ ቁጥጥር እንዳይኖረው ታግዷል።</translation>
 <translation id="2226720438730111184">ምን እየተከሰተ እንዳለ ይንገሩን</translation>
-<translation id="222903405933288376">Google አካባቢያዊ ይዘት እንዲያቀርብልዎ አካባቢዎን ይጠቀማል። ይህን በ<ph name="SETTINGS_LINK" /> ውስጥ መቀየር ይችላሉ።</translation>
 <translation id="2229161054156947610">ከ1 ሰዓት በላይ ይቀራል</translation>
 <translation id="222931766245975952">ፋይል ተቋርጧል</translation>
 <translation id="222949136907494149"><ph name="URL" /> የኮምፒውተርዎን አካባቢ ለመጠቀም ይፈልጋል።</translation>
@@ -1088,7 +1087,6 @@
 <translation id="2575247648642144396">ቅጥያው በአሁኑ ገጽ ላይ መስራት ሲችል ይህ አዶ የሚታይ ይሆናል። አዶውን ጠቅ በማድረግ ወይም <ph name="EXTENSION_SHORTCUT" />ን በመጫን ይህንን ቅጥያ ይጠቀሙበት።</translation>
 <translation id="2576842806987913196">ይህን ስም የያዘ የCRX ፋይል አስቀድሞ ነበር።</translation>
 <translation id="2579575372772932244">መገለጫውን ዳግም በመፍጠር ላይ፣ እባክዎ ይጠብቁ...</translation>
-<translation id="2580168606262715640">የእርስዎን ስልክ ማግኘት አልተቻለም። በቅርብ ርቀት መኖሩን ያረጋግጡ።</translation>
 <translation id="2580889980133367162">ሁልጊዜም <ph name="HOST" /> ከአንድ በላይ ፋይሎችን እንዲያወርድ ይፍቀዱ</translation>
 <translation id="2580924999637585241">አጠቃላይ፦ <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">ረጅም</translation>
@@ -2171,7 +2169,6 @@
 <translation id="4130207949184424187">አንድ ቅጥያ ከኦምኒቦክሱ ሆነው ሲፈልጉ የሚታየውን ገጽ ቀይሮታል።</translation>
 <translation id="413121957363593859">አካላት</translation>
 <translation id="4131410914670010031">ጥቁር እና ነጭ</translation>
-<translation id="4135054690906486073">ይህ አውታረ መረብ ለሌሎች ተጠቃሚዎች የተጋራ ነው</translation>
 <translation id="4135450933899346655">ሰርቲፊኬቶችዎ</translation>
 <translation id="4138267921960073861">በመግቢያ ገጹ ላይ የተጠቃሚ ስሞች እና ፎቶዎችን አሳይ</translation>
 <translation id="4140559601186535628">የግፋ መልዕክቶች</translation>
@@ -2575,9 +2572,6 @@
 <translation id="4813345808229079766">ማገናኘት</translation>
 <translation id="4813512666221746211">የአውታረ መረብ ስህተት</translation>
 <translation id="4816492930507672669">ገጹን አመጣጥን</translation>
-<translation id="4816617200045929931">የመገለጫ ስህተት መልእክቱን ከማግኘትዎ በፊት በትክክል ምን እንደተፈጠረ ይንገሩን፦
-
-****ከዚህ መስመር በታች ምንም ዓይነት ለውጥ አያድርጉ****</translation>
 <translation id="4820334425169212497">አይ፣ አይታየኝም</translation>
 <translation id="4821086771593057290">የይለፍ ቃልዎ ተቀይሯል። እባክዎ በአዲሱ የይለፍ ቃልዎ እንደገና ይሞክሩ።</translation>
 <translation id="4821935166599369261">&amp;መገለጫ መስራት ነቅቷል</translation>
@@ -2943,7 +2937,6 @@
 <translation id="5340217413897845242">የመደርደሪያ ንጥል 6</translation>
 <translation id="5341390997810576190">የተንቀሳቃሽ ስልክ ውሂብ ተጠቀም</translation>
 <translation id="5342091991439452114">ፒን ቢያንስ <ph name="MINIMUM" /> አኃዞች መሆን አለበት</translation>
-<translation id="5342344590724511265">የስንክል ግብረመልስ ትር።</translation>
 <translation id="5342451237681332106"><ph name="PHONE_NAME" />ን ተጠቀም</translation>
 <translation id="534916491091036097">ግራ ቅንፍ</translation>
 <translation id="5350965906220856151">ኧረ ወዮው!</translation>
@@ -3215,6 +3208,7 @@
 <translation id="5764483294734785780">ተሰሚ/ኦዲዮ አስ&amp;ቀምጥ እንደ…</translation>
 <translation id="57646104491463491">የተቀየረበት ቀን</translation>
 <translation id="5764797882307050727">እባክዎ በመሣሪያዎ ላይ የተወሰነ ቦታ ያስለቅቁ።</translation>
+<translation id="5765425701854290211">ይቅርታ፣ አንዳንድ ፋይሎች የተበላሹ ሲሆኑ ዝማኔው አልተሳካም። የተሰመሩ ፋይሎችዎ በጥንቃቄ ተይዘዋል።</translation>
 <translation id="5765491088802881382">ምንም አውታረ መረብ የለም</translation>
 <translation id="5765780083710877561">መግለጫ</translation>
 <translation id="5771585441665576801">በቋንቋ ፊደል መጻፍ (geia → γεια)</translation>
@@ -4430,6 +4424,7 @@
 <translation id="7615910377284548269">በማጣሪያ ያልተቀመጠ ተሰኪን ማገድን ያስተዳድሩ...</translation>
 <translation id="7617366389578322136">ከ«<ph name="DEVICE_NAME" />» ጋር በመገናኘት ላይ</translation>
 <translation id="761779991806306006">ምንም የይለፍ ቃሎች አልተቀመጡም።</translation>
+<translation id="7622114377921274169">ኃይል በመሙላት ላይ።</translation>
 <translation id="7624154074265342755">የገመድ አልባ አውታረ መረቦች</translation>
 <translation id="7624337243375417909">አቢያት ማድረጊያ ጠፍቷል</translation>
 <translation id="7627790789328695202">ውይ፣ <ph name="FILE_NAME" /> አስቀድሞ አለ። ዳግም ይሰይሙትና እንደገና ይሞክሩ።</translation>
@@ -4875,6 +4870,7 @@
 <translation id="8270242299912238708">የፒዲኤፍ ሰነዶች</translation>
 <translation id="827097179112817503">መነሻ አዝራር አሳይ</translation>
 <translation id="8272443605911821513">በ«ተጨማሪ መሣሪያዎች» ምናሌው ውስጥ ቅጥያዎች የሚለውን ጠቅ በማድረግ ቅጥያዎችዎን ያቀናብሩ።</translation>
+<translation id="8274924778568117936">ዝማኔው እስኪጨርስ ድረስ የእርስዎን <ph name="DEVICE_TYPE" /> አያጥፉት ወይም አይዝጉት። መጫኑ ከተጠናቀቀ በኋላ የእርስዎ <ph name="DEVICE_TYPE" /> ዳግም ይነሳል።</translation>
 <translation id="8275038454117074363">ከውጭ አስመጣ</translation>
 <translation id="8276560076771292512">ባዶ መሸጎጫ እና ደረቅ ዳግም መጫን</translation>
 <translation id="8279388322240498158">የሶራኒ ኩርድኛ በእንግሊዝኛ ላይ የተመሠረተ ቁልፍ ሰሌዳ</translation>
@@ -5316,7 +5312,6 @@
 <translation id="8963572037665351978">ከዝግጅት አቀራረብ ውጣ</translation>
 <translation id="8965037249707889821">የድሮ ይለፍ ቃል ያስገቡ</translation>
 <translation id="8965697826696209160">በቂ ቦታ የለም።</translation>
-<translation id="8968527460726243404">ChromeOS ስርዓት ምስል ጸሐፊ</translation>
 <translation id="8970203673128054105">የcast ሁነታ ዝርዝር ይመልከቱ</translation>
 <translation id="89720367119469899">አምልጥ</translation>
 <translation id="8972513834460200407">ኬላው ከGoogle አገልጋዩች የሚመጡ ውርዶችን እያገደ አለመሆኑን ለማረጋገጥ እባክዎ የአውታረ መረብ አስተዳዳሪዎን ያግኙ።</translation>
@@ -5492,6 +5487,7 @@
 <translation id="93766956588638423">ቅጥያ ይጠግኑ</translation>
 <translation id="938470336146445890">እባክዎ የተጠቃሚ እውቅና ማረጋገጫ ይጫኑ።</translation>
 <translation id="938582441709398163">የቁልፍ ሰሌዳ ተደራቢ</translation>
+<translation id="939519157834106403">SSID</translation>
 <translation id="939598580284253335">የይለፍ ሐረግ ያስገቡ</translation>
 <translation id="939736085109172342">አዲስ ዓቃፊ</translation>
 <translation id="940425055435005472">የቅርጸ-ቁምፊ መጠን፦</translation>
diff --git a/chrome/app/resources/generated_resources_ar.xtb b/chrome/app/resources/generated_resources_ar.xtb
index f447d91f..4156552 100644
--- a/chrome/app/resources/generated_resources_ar.xtb
+++ b/chrome/app/resources/generated_resources_ar.xtb
@@ -836,7 +836,6 @@
 <translation id="2224551243087462610">تعديل اسم المجلد</translation>
 <translation id="2226449515541314767">‏تم حظر هذا الموقع من التحكم تحكمًا كاملاً في أجهزة MIDI.</translation>
 <translation id="2226720438730111184">أخبرنا بما يحدث</translation>
-<translation id="222903405933288376">‏تستخدم Google موقعك لتقديم محتوى محلّي لك. يمكنك تغيير ذلك في <ph name="SETTINGS_LINK" />.</translation>
 <translation id="2229161054156947610">يتبقى أكثر من ساعة واحدة</translation>
 <translation id="222931766245975952">تم اقتطاع الملف</translation>
 <translation id="222949136907494149">يريد <ph name="URL" /> استخدام موقع جهاز الكمبيوتر.</translation>
@@ -1088,7 +1087,6 @@
 <translation id="2575247648642144396">سيكون هذا الرمز مرئيًا عندما تتمكن الإضافة من تنفيذ الإجراءات على الصفحة الحالية. يمكنك استخدام هذه الإضافة بالنقر على الرمز أو بالضغط على <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="2576842806987913196">‏هناك ملف CRX بهذا الاسم فعلاً.</translation>
 <translation id="2579575372772932244">إعادة إنشاء الملف الشخصي، يُرجى الانتظار...</translation>
-<translation id="2580168606262715640">لا يمكن العثور على هاتفك. تأكد من أنه على بعد ذراع.</translation>
 <translation id="2580889980133367162">السماح دائمًا لـ <ph name="HOST" /> بتنزيل عدة ملفات</translation>
 <translation id="2580924999637585241">الإجمالي: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">طويل</translation>
@@ -2167,7 +2165,6 @@
 <translation id="4130207949184424187">غيّرت هذه الإضافة الصفحة التي تظهر عند البحث في المربع متعدد الاستخدامات.</translation>
 <translation id="413121957363593859">المكونات</translation>
 <translation id="4131410914670010031">أبيض وأسود</translation>
-<translation id="4135054690906486073">هذه الشبكة مشتركة مع مستخدمين آخرين</translation>
 <translation id="4135450933899346655">الشهادات</translation>
 <translation id="4138267921960073861">عرض أسماء المستخدمين والصور على شاشة تسجيل الدخول</translation>
 <translation id="4140559601186535628">رسائل الدفع</translation>
@@ -2571,9 +2568,6 @@
 <translation id="4813345808229079766">اتصال</translation>
 <translation id="4813512666221746211">حدث خطأ في الشبكة</translation>
 <translation id="4816492930507672669">احتواء ضمن الصفحة</translation>
-<translation id="4816617200045929931">أخبرنا بما حدث بالضبط قبل ظهور رسالة خطأ الملف الشخصي:
-
-****لا تغيّر ما تحت هذا السطر****</translation>
 <translation id="4820334425169212497">لا، أنا لا أراه.</translation>
 <translation id="4821086771593057290">تم تغيير كلمة المرور. الرجاء المحاولة مرة أخرى باستخدام كلمة مرورك الجديدة.</translation>
 <translation id="4821935166599369261">&amp;التوصيف مفعّل</translation>
@@ -2938,7 +2932,6 @@
 <translation id="5340217413897845242">عنصر الرف 6</translation>
 <translation id="5341390997810576190">استخدام بيانات شبكة الجوّال</translation>
 <translation id="5342091991439452114">يجب أن يتكوَّن رقم التعريف الشخصي من <ph name="MINIMUM" /> من الأرقام على الأقل</translation>
-<translation id="5342344590724511265">التعليقات المرتبطة بعلامة التبويب المعطلة.</translation>
 <translation id="5342451237681332106">استخدام <ph name="PHONE_NAME" /></translation>
 <translation id="534916491091036097">قوس أيسر</translation>
 <translation id="5350965906220856151">عذرًا!</translation>
@@ -3210,6 +3203,7 @@
 <translation id="5764483294734785780">حف&amp;ظ ملف الصوت باسم...</translation>
 <translation id="57646104491463491">تاريخ التعديل</translation>
 <translation id="5764797882307050727">يُرجى إخلاء بعض المساحة على جهازك.</translation>
+<translation id="5765425701854290211">عذرًا، حدث تلف لبعض الملفات ولم يتم التحديث بنجاح. غير أن ملفاتك المتزامنة آمنة.</translation>
 <translation id="5765491088802881382">لا تتوفر أية شبكات</translation>
 <translation id="5765780083710877561">الوصف:</translation>
 <translation id="5771585441665576801">‏التحويل الصوتي (جيا ← γεια)</translation>
@@ -4427,6 +4421,7 @@
 <translation id="7615910377284548269">جارٍ إدارة حظر المكوّن الإضافي غير المحمي...</translation>
 <translation id="7617366389578322136">جارٍ الاتصال بـ "<ph name="DEVICE_NAME" />"</translation>
 <translation id="761779991806306006">لم يتم حفظ أي كلمات مرور.</translation>
+<translation id="7622114377921274169">جارٍ الشحن.</translation>
 <translation id="7624154074265342755">الشبكات اللاسلكية</translation>
 <translation id="7624337243375417909">‏مفتاح caps lock متوقف</translation>
 <translation id="7627790789328695202">عذرًا، <ph name="FILE_NAME" /> موجود من قبل. يمكنك إعادة تسميته وإعادة المحاولة.</translation>
@@ -4867,6 +4862,7 @@
 <translation id="8270242299912238708">‏مستندات PDF</translation>
 <translation id="827097179112817503">عرض زر الصفحة الرئيسية</translation>
 <translation id="8272443605911821513">يمكنك إدارة الإضافات من خلال النقر على "الإضافات" في قائمة "المزيد من الأدوات".</translation>
+<translation id="8274924778568117936">لا توقف تشغيل جهاز <ph name="DEVICE_TYPE" /> أو تُغلقه لحين الانتهاء من التحديث. ستتم إعادة تشغيل جهاز <ph name="DEVICE_TYPE" /> بعد اكتمال التثبيت.</translation>
 <translation id="8275038454117074363">الاستيراد</translation>
 <translation id="8276560076771292512">إفراغ ذاكرة التخزين المؤقت وإعادة التحميل بشكل كامل</translation>
 <translation id="8279388322240498158">لوحة مفاتيح اللغة السورانية الكردية المدعمة بالإنجليزية</translation>
@@ -5307,7 +5303,6 @@
 <translation id="8963572037665351978">الخروج من العرض</translation>
 <translation id="8965037249707889821">إدخال كلمة المرور القديمة</translation>
 <translation id="8965697826696209160">ليست هناك مساحة كافية.</translation>
-<translation id="8968527460726243404">‏كاتب الصور لنظام ChromeOS</translation>
 <translation id="8970203673128054105">عرض قائمة وضع الإرسال</translation>
 <translation id="89720367119469899">خروج</translation>
 <translation id="8972513834460200407">‏الرجاء التحقق مع مشرف الشبكة للتأكد من عدم حظر الجدار الناري للتنزيلات من خوادم Google.</translation>
@@ -5483,6 +5478,7 @@
 <translation id="93766956588638423">إصلاح الإضافة</translation>
 <translation id="938470336146445890">الرجاء تثبيت شهادة مستخدم.</translation>
 <translation id="938582441709398163">تراكب لوحة المفاتيح</translation>
+<translation id="939519157834106403">SSID</translation>
 <translation id="939598580284253335">إدخال عبارة المرور</translation>
 <translation id="939736085109172342">مجلد جديد</translation>
 <translation id="940425055435005472">حجم الخط:</translation>
diff --git a/chrome/app/resources/generated_resources_bg.xtb b/chrome/app/resources/generated_resources_bg.xtb
index 46ac6023..37b9a390 100644
--- a/chrome/app/resources/generated_resources_bg.xtb
+++ b/chrome/app/resources/generated_resources_bg.xtb
@@ -832,7 +832,6 @@
 <translation id="2224551243087462610">Редактиране на името на папката</translation>
 <translation id="2226449515541314767">Пълният контрол над MIDI устройствата е блокиран за този сайт.</translation>
 <translation id="2226720438730111184">Кажете ни какво се случва</translation>
-<translation id="222903405933288376">Google използва местоположението ви, за да ви предоставя местно съдържание. Можете да промените това от <ph name="SETTINGS_LINK" />.</translation>
 <translation id="2229161054156947610">Остава повече от 1 час</translation>
 <translation id="222931766245975952">Файлът е скъсен</translation>
 <translation id="222949136907494149"><ph name="URL" /> иска да използва местоположението на компютъра ви.</translation>
@@ -1084,7 +1083,6 @@
 <translation id="2575247648642144396">Тази икона ще бъде видима, когато разширението може да изпълнява действия върху текущата страница. Използвайте го, като кликнете върху иконата или натиснете „<ph name="EXTENSION_SHORTCUT" />“.</translation>
 <translation id="2576842806987913196">Вече присъства CRX файл с това име.</translation>
 <translation id="2579575372772932244">Потребителският профил се създава отново. Моля, изчакайте...</translation>
-<translation id="2580168606262715640">Телефонът ви не може да бъде намерен. Уверете се, че е наблизо.</translation>
 <translation id="2580889980133367162">Винаги да е разрешено на <ph name="HOST" /> да изтегля няколко файла</translation>
 <translation id="2580924999637585241">Общо: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">Дълго</translation>
@@ -2169,7 +2167,6 @@
 <translation id="4130207949184424187">Това разширение промени страницата, която се показва при търсене от полето за всичко.</translation>
 <translation id="413121957363593859">Компоненти</translation>
 <translation id="4131410914670010031">Черно-бяло</translation>
-<translation id="4135054690906486073">Тази мрежа се споделя с други потребители</translation>
 <translation id="4135450933899346655">Вашите сертификати</translation>
 <translation id="4138267921960073861">Потребителските имена и снимките да се показват на екрана за вход</translation>
 <translation id="4140559601186535628">Насочени съобщения</translation>
@@ -2573,9 +2570,6 @@
 <translation id="4813345808229079766">Връзка</translation>
 <translation id="4813512666221746211">Грешка в мрежата</translation>
 <translation id="4816492930507672669">Да се побере в страницата</translation>
-<translation id="4816617200045929931">Кажете ни какво точно се случи, преди да получите съобщението за грешка в потребителския профил:
-
-****НЕ ПРАВЕТЕ ПРОМЕНИ ПОД ТОЗИ РЕД****</translation>
 <translation id="4820334425169212497">Не, не го виждам</translation>
 <translation id="4821086771593057290">Паролата ви е променена. Моля, опитайте отново с новата си парола.</translation>
 <translation id="4821935166599369261">&amp;Профилирането е активирано</translation>
@@ -2941,7 +2935,6 @@
 <translation id="5340217413897845242">Елемент 6 в лавицата</translation>
 <translation id="5341390997810576190">използва мобилни данни</translation>
 <translation id="5342091991439452114">ПИН кодът трябва да съдържа поне <ph name="MINIMUM" /> цифри</translation>
-<translation id="5342344590724511265">Отзиви за раздел, претърпял срив.</translation>
 <translation id="5342451237681332106">Използване на <ph name="PHONE_NAME" /></translation>
 <translation id="534916491091036097">Лява скоба</translation>
 <translation id="5350965906220856151">Ами сега!</translation>
@@ -3214,6 +3207,7 @@
 <translation id="5764483294734785780">&amp;Запазване на аудиоклипа като...</translation>
 <translation id="57646104491463491">Дата на промяна</translation>
 <translation id="5764797882307050727">Моля, освободете място на устройството си.</translation>
+<translation id="5765425701854290211">За съжаление, някой файлове бяха повредени и актуализирането не бе успешно. Синхронизираните ви данни са в безопасност.</translation>
 <translation id="5765491088802881382">Няма налични мрежи</translation>
 <translation id="5765780083710877561">Описание:</translation>
 <translation id="5771585441665576801">Транслитерация (geia → γεια)</translation>
@@ -4429,6 +4423,7 @@
 <translation id="7615910377284548269">Управление на блокирането на приставки извън тестова среда...</translation>
 <translation id="7617366389578322136">Свързване със: <ph name="DEVICE_NAME" /></translation>
 <translation id="761779991806306006">Няма запазени пароли.</translation>
+<translation id="7622114377921274169">Зарежда се.</translation>
 <translation id="7624154074265342755">Безжични мрежи</translation>
 <translation id="7624337243375417909">caps lock е изключен</translation>
 <translation id="7627790789328695202">Ами сега! Файлът „<ph name="FILE_NAME" />“ вече съществува. Преименувайте го и опитайте отново.</translation>
@@ -4868,6 +4863,7 @@
 <translation id="8270242299912238708">PDF документи</translation>
 <translation id="827097179112817503">Показване на бутона за начална страница</translation>
 <translation id="8272443605911821513">Управлявайте разширенията си, като кликнете върху „Разширения“ в менюто „Още инструменти“.</translation>
+<translation id="8274924778568117936">Не изключвайте, нито затваряйте устройството си <ph name="DEVICE_TYPE" />, докато актуализирането не завърши. <ph name="DEVICE_TYPE" /> ще се рестартира след завършване на инсталирането.</translation>
 <translation id="8275038454117074363">Импортиране</translation>
 <translation id="8276560076771292512">Изпразване на кеша и твърдо презареждане</translation>
 <translation id="8279388322240498158">Кюрдски (сорани), базирана на английски клавиатура</translation>
@@ -5309,7 +5305,6 @@
 <translation id="8963572037665351978">Изход от презентацията</translation>
 <translation id="8965037249707889821">Въведете старата парола</translation>
 <translation id="8965697826696209160">Няма достатъчно място.</translation>
-<translation id="8968527460726243404">Запис на системни образи на ChromeOS</translation>
 <translation id="8970203673128054105">Преглед на списъка с режими за предаване</translation>
 <translation id="89720367119469899">Escape</translation>
 <translation id="8972513834460200407">Моля, обърнете се към системния си администратор, за да се уверите, че защитната стена не блокира изтеглянията от сървърите на Google.</translation>
@@ -5485,6 +5480,7 @@
 <translation id="93766956588638423">Поправяне на разширението</translation>
 <translation id="938470336146445890">Моля, инсталирайте потребителски сертификат.</translation>
 <translation id="938582441709398163">Наслагване върху клавиатурата</translation>
+<translation id="939519157834106403">SSID</translation>
 <translation id="939598580284253335">Въведете пропуск</translation>
 <translation id="939736085109172342">Нова папка</translation>
 <translation id="940425055435005472">Размер на шрифта:</translation>
diff --git a/chrome/app/resources/generated_resources_bn.xtb b/chrome/app/resources/generated_resources_bn.xtb
index 043aec9f..cc34a8f5 100644
--- a/chrome/app/resources/generated_resources_bn.xtb
+++ b/chrome/app/resources/generated_resources_bn.xtb
@@ -623,6 +623,7 @@
 <translation id="1882130480443819387">শিরোনাম অনুসারে সাজান</translation>
 <translation id="1886996562706621347">সাইটগুলিকে প্রোটোকলের জন্য ডিফল্ট পরিচালক হতে জিজ্ঞাসা করার অনুমতি দেয় (প্রস্তাবিত)</translation>
 <translation id="1887850431809612466">হার্ডওয়্যার পুনর্বিবেচনাগুলি</translation>
+<translation id="1889984860246851556">প্রক্সি সেটিংস খুলুন</translation>
 <translation id="1891668193654680795">সফ্টওয়্যার প্রস্তুতকারকদের সনাক্তকরণের জন্য এই শংসাপত্রটিকে বিশ্বাস করুন৷</translation>
 <translation id="189210018541388520">পূর্ণ স্ক্রিন খুলুন</translation>
 <translation id="1893406696975231168">ক্লাউড প্রভিসন প্রবাহ ব্যর্থ হয়েছে</translation>
@@ -834,7 +835,6 @@
 <translation id="2224551243087462610">ফোল্ডার নাম সম্পাদনা করুন</translation>
 <translation id="2226449515541314767">MIDI ডিভাইসগুলির সম্পূর্ণ নিয়ন্ত্রণ থেকে এই সাইটিকে অবরুদ্ধ করা হয়েছে৷</translation>
 <translation id="2226720438730111184">কী ঘটছে তা আমাদের বলুন</translation>
-<translation id="222903405933288376">Google আপনাকে স্থানীয় সামগ্রী দেওয়ার জন্য আপনার অবস্থান ব্যবহার করে। আপনি <ph name="SETTINGS_LINK" /> থেকে এটি পরিবর্তন করতে পারেন।</translation>
 <translation id="2229161054156947610">1 ঘন্টার বেশী বাকি</translation>
 <translation id="222931766245975952">ফাইল অবচ্ছেদন করা হয়েছে</translation>
 <translation id="222949136907494149"><ph name="URL" /> আপনার কম্পিউটারের অবস্থান ব্যবহার করতে চায়৷</translation>
@@ -850,6 +850,7 @@
 <translation id="2241634353105152135">শুধুমাত্র একবার</translation>
 <translation id="2242603986093373032">কোনো ডিভাইস নেই</translation>
 <translation id="2242687258748107519">ফাইল তথ্য</translation>
+<translation id="2245240762616536227">আপনার ব্রাউজিং এর ইতিহাস অনুযায়ী অনুসন্ধান, বিজ্ঞাপন এবং অন্যান্য Google পরিষেবা কিভাবে আপনার জন্য ব্যক্তিগতকৃত করা হয় তা নিয়ন্ত্রণ করুন</translation>
 <translation id="2246340272688122454">পুনরুদ্ধারের চিত্রটি ডাউনলোড হচ্ছে...</translation>
 <translation id="2249499294612408921">একটি তত্ত্বাবধানে থাকা ব্যবহারকারী আপনার নির্দেশনায় ওয়েব ঘুরে দেখতে পারবেন। Chrome এ একজন তত্ত্বাবধানে থাকা ব্যবহারকারীর পরিচালক হিসাবে, আপনি
 
@@ -1085,7 +1086,6 @@
 <translation id="2575247648642144396">এই আইকনটি দৃশ্যমান হবে যখন এক্সটেনশন বর্তমান পৃষ্ঠার উপর কাজ করতে পারবে৷ আইকনে ক্লিক করে বা <ph name="EXTENSION_SHORTCUT" /> টিপে এই এক্সটেনশন ব্যবহার করুন৷</translation>
 <translation id="2576842806987913196">এই নামের একটি CRX ফাইল ইতিমধ্যে বিদ্যমান আছে৷</translation>
 <translation id="2579575372772932244">প্রোফাইল পুনরায় তৈরি করা হচ্ছে, দয়া করে অপেক্ষা করুন...</translation>
-<translation id="2580168606262715640">আপনার ফোন খুঁজে পাওয়া যায়নি৷ এটি এক হাত দূরত্বের মধ্যে রয়েছে কিনা নিশ্চিত করুন৷</translation>
 <translation id="2580889980133367162">একাধিক ফাইল ডাউনলোড করতে <ph name="HOST" /> কে সর্বদা অনুমতি দিন</translation>
 <translation id="2580924999637585241">মোট: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">দীর্ঘ সময়</translation>
@@ -1377,6 +1377,7 @@
 <translation id="2966449113954629791">আপনি হয়তো আপনার মোবাইল ডেটার প্রদত্ত পরিমান ব্যবহার করে ফেলেছেন৷ আরো ডেটা কিনতে <ph name="NAME" /> সক্রিয়করণ পোর্টালে যান৷</translation>
 <translation id="2966459079597787514">সুইডিশ কীবোর্ড</translation>
 <translation id="2966598748518102999">"Ok Google" শব্দটি পাঠিয়ে কন্ঠ অনুসন্ধানকে উন্নত করুন এবং কয়েক সেকেন্ড আগে তা Google এ পাঠান।</translation>
+<translation id="2966937470348689686">Android ডিভাইসে পছন্দের সেটিংগুলি পরিচালনা করুন</translation>
 <translation id="2967544384642772068">বন্ধ করুন</translation>
 <translation id="2971033837577180453">&lt;span&gt;আইডি:&lt;/span&gt;<ph name="EXTENSION_ID" /></translation>
 <translation id="2971213274238188218">অনুজ্জ্বল করুন</translation>
@@ -2130,6 +2131,7 @@
 <translation id="4087089424473531098">এই এক্সটেনশনটি তৈরি হয়েছে:
 
 <ph name="EXTENSION_FILE" /></translation>
+<translation id="4087470595660267445">আপনার Chromebook এ Google Play থেকে অ্যাপ এবং গেম ইনস্টল করুন। &lt;a target="_blank" href="<ph name="URL" />"&gt;আরও জানুন&lt;/a&gt;</translation>
 <translation id="4088095054444612037">গোষ্ঠীর জন্য স্বীকার করুন</translation>
 <translation id="4089521618207933045">উপমেনু রয়েছে</translation>
 <translation id="4090103403438682346">যাচাইকৃত অ্যাক্সেস সক্ষম করুন</translation>
@@ -2163,7 +2165,6 @@
 <translation id="4130207949184424187">আপনি বহুউপযোগী ক্ষেত্র থেকে অনুসন্ধান করলে কোন পৃষ্ঠাটি দেখানো হবে তা এই এক্সটেনশানটি পরিবর্তন করেছে।</translation>
 <translation id="413121957363593859">উপাদানগুলি</translation>
 <translation id="4131410914670010031">সাদা ও কালো</translation>
-<translation id="4135054690906486073">নেটওয়ার্কটি অন্যান্য ব্যবহারকারীদের সাথে শেয়ার করা হয়েছে</translation>
 <translation id="4135450933899346655">আপনার সংশাপত্রসমূহ</translation>
 <translation id="4138267921960073861">সাইন-ইন স্ক্রিনে ব্যবহারকারীর নামগুলি এবং ফটো দেখান</translation>
 <translation id="4140559601186535628">পুশ বার্তা</translation>
@@ -2565,9 +2566,6 @@
 <translation id="4813345808229079766">কানেকশন</translation>
 <translation id="4813512666221746211">নেটওয়ার্ক  ত্রুটি</translation>
 <translation id="4816492930507672669">পৃষ্ঠাতে মানানসই</translation>
-<translation id="4816617200045929931">আপনি প্রোফাইল ত্রুটি বার্তাটি পাওয়ার ঠিক আগে কি ঘটেছিল তা আমাদের বলুন:
-
-****এই রেখার নিচে পরিবর্তন করবেন না****</translation>
 <translation id="4820334425169212497">না, আমি এটা দেখিনি</translation>
 <translation id="4821086771593057290">আপনার পাসওয়ার্ডটি পরিবর্তিত হয়েছে৷ আপনার নতুন পাসওয়ার্ডটি দিয়ে দয়া করে আবার চেষ্টা করুন৷</translation>
 <translation id="4821935166599369261">&amp;প্রোফাইলিং সক্ষমিত</translation>
@@ -2920,6 +2918,7 @@
 <translation id="5329858601952122676">&amp;মুছুন</translation>
 <translation id="5330145655348521461">এই ফাইলগুলি একটি আলাদা ডেস্কটপে খোলা রয়েছে৷ এটিকে দেখতে <ph name="USER_NAME" /> (<ph name="MAIL_ADDRESS" />) এ সরান৷</translation>
 <translation id="5330512191124428349">তথ্য পান</translation>
+<translation id="5331069282670671859">এই বিভাগে আপনার কোনও শংসাপত্র নেই</translation>
 <translation id="5331425616433531170">"<ph name="CHROME_EXTENSION_NAME" />" এদের সাথে যুক্ত হতে চায়</translation>
 <translation id="5332624210073556029">সময় অঞ্চল:</translation>
 <translation id="5334142896108694079">স্ক্রিপ্ট ক্যাশে</translation>
@@ -2930,7 +2929,6 @@
 <translation id="5340217413897845242">তাকের আইটেম নম্বর ৬</translation>
 <translation id="5341390997810576190">সেলুলার ডেটা ব্যবহার করুন</translation>
 <translation id="5342091991439452114">পিন অবশ্যই কমপক্ষে <ph name="MINIMUM" /> সংখ্যার হতে হবে</translation>
-<translation id="5342344590724511265">ট্যাব ক্র্যাশ হওয়ার প্রতিক্রিয়া।</translation>
 <translation id="5342451237681332106"><ph name="PHONE_NAME" /> ব্যবহার করুন</translation>
 <translation id="534916491091036097">বাঁ বন্ধ</translation>
 <translation id="5350965906220856151">উহ-ওহ!</translation>
@@ -2968,6 +2966,7 @@
 <translation id="5399158067281117682">PINগুলি মেলে না!</translation>
 <translation id="5400640815024374115">ট্রাস্টেড প্ল্যাটফর্ম মডিউল (TPM) চিপটি অক্ষম বা অনুপস্থিত আছে৷</translation>
 <translation id="5402367795255837559">ব্রেইল</translation>
+<translation id="5402815541704507626">মোবাইল ডেটা ব্যবহার করে আপডেটটি ডাউনলোড করুন</translation>
 <translation id="540296380408672091"><ph name="HOST" /> এ সর্বদা কুকিজ অবরুদ্ধ করুন</translation>
 <translation id="5408750356094797285">জুম করুন: <ph name="PERCENT" /></translation>
 <translation id="5409029099497331039">আমাকে অবাক করুন</translation>
@@ -3105,6 +3104,7 @@
 <translation id="558918721941304263">অ্যাপ্লিকেশানগুলি লোড হচ্ছে...</translation>
 <translation id="5592595402373377407">এখনও যথেষ্ট ডেটা উপলব্ধ নেই৷</translation>
 <translation id="5595485650161345191">ঠিকানা সম্পাদনা করুন</translation>
+<translation id="5600706100022181951">আপডেটটি ডাউনলোড করতে <ph name="UPDATE_SIZE_MB" /> MB মোবাইল ডেটা খরচ হবে। ডাউনলোড করতে চান?</translation>
 <translation id="5601503069213153581">পিন</translation>
 <translation id="5604324414379907186">সর্বদা বুকমার্কস দণ্ড দেখান</translation>
 <translation id="5605623530403479164">অন্যান্য সার্চ ইঞ্জিন</translation>
@@ -3201,6 +3201,7 @@
 <translation id="5764483294734785780">এইরূপে অডিও সংর&amp;ক্ষণ করুন...</translation>
 <translation id="57646104491463491">পরিবর্তনের তারিখ</translation>
 <translation id="5764797882307050727">অনুগ্রহ করে আপনার ডিভাইসে জায়গা খালি করুন।</translation>
+<translation id="5765425701854290211">কয়েকটি ফাইল ক্ষতিগ্রস্ত ছিল বলে আপডেটটি করা যায়নি, এর জন্য আমরা দুঃখিত। আপনার সিঙ্ক করা ফাইলগুলি নিরাপদ আছে।</translation>
 <translation id="5765491088802881382">কোন নেটওয়ার্ক উপলব্ধ নয়</translation>
 <translation id="5765780083710877561">বর্ণনা:</translation>
 <translation id="5771585441665576801">লিপ্যন্তরকরণ (geia → γεια)</translation>
@@ -3214,6 +3215,7 @@
 <translation id="5778747455497889540">আপনার কম্পিউটারের জন্য র‍্যান্ডম ভাবে জেনারেট করা নিরাপদ মডিউল পাসওয়ার্ডটি নিচে দেওয়া হল:</translation>
 <translation id="5780066559993805332">(সেরা)</translation>
 <translation id="5780973441651030252">প্রক্রিয়ার অগ্রাধিকার</translation>
+<translation id="5781865261247219930"><ph name="EXTENSION_NAME" /> এ কম্যান্ড পাঠান</translation>
 <translation id="5783221160790377646">একটি ত্রুটির কারণে, তত্ত্বাবধানে থাকা ব্যবহারকারী তৈরি করা হয়নি৷ দয়া করে পরে আবার চেষ্টা করুন৷</translation>
 <translation id="5783602409389152506">ডিভাইসগুলির জন্য যখন স্ক্যান করা হচ্ছে...</translation>
 <translation id="57838592816432529">নিঃশব্দ করুন</translation>
@@ -3256,6 +3258,7 @@
 <translation id="5838825566232597749">মার্কিন ওয়ার্কম্যান আন্তর্জাতিক</translation>
 <translation id="5842497610951477805">ব্লুটুথ সক্ষম</translation>
 <translation id="5846929185714966548">ট্যাব ৪</translation>
+<translation id="5848924408752252705">ফিরে যেতে টাচ করুন।</translation>
 <translation id="5848934677402291689">PDF-এ সংরক্ষণ  	প্রক্রিয়ায় আছে</translation>
 <translation id="5849570051105887917">হোম পরিষেবা প্রদানকারী কোড</translation>
 <translation id="5849869942539715694">প্যাক এক্সটেনশান...</translation>
@@ -3274,6 +3277,7 @@
 <translation id="5859272821192576954">আপনি Hangouts ব্যবহার করার জন্য একদম তৈরি</translation>
 <translation id="5860033963881614850">বন্ধ করুন</translation>
 <translation id="5860209693144823476">ট্যাব ৩</translation>
+<translation id="5860491529813859533">চালু করুন</translation>
 <translation id="5860494867054883682">আপনার ডিভাইস <ph name="CHANNEL_NAME" /> চ্যানেলে আপডেট করা হচ্ছে (<ph name="PROGRESS_PERCENT" />)</translation>
 <translation id="5862109781435984885">শেল্ফে লেখনী সরঞ্জামগুলি দেখান</translation>
 <translation id="58625595078799656"><ph name="PRODUCT_NAME" />-এর Google পাসওয়ার্ড বা আপনার নিজস্ব পাসফ্রেজ ব্যবহার করে আপনার ডেটা এনক্রিপ্ট করার দরকার হয়৷</translation>
@@ -3606,6 +3610,7 @@
 <translation id="6395423953133416962"><ph name="BEGIN_LINK1" />সিস্টেমের তথ্য<ph name="END_LINK1" /> এবং <ph name="BEGIN_LINK2" />মেট্রিক্স<ph name="END_LINK2" /> পাঠান</translation>
 <translation id="6397363302884558537">কথা বলা বন্ধ করুন</translation>
 <translation id="6397592254427394018">ছ্দ্মবেশী উইন্ডোতে &amp;সকল বুকমার্ক খুলুন</translation>
+<translation id="6398715114293939307">Google Play স্টোর সরান</translation>
 <translation id="6398765197997659313">পূর্ণ স্ক্রীণ বন্ধ করুন</translation>
 <translation id="6399774419735315745">গুপ্তচর</translation>
 <translation id="6401445054534215853">তাকের আইটেম নম্বর ১</translation>
@@ -4414,6 +4419,7 @@
 <translation id="7615910377284548269">আনস্যান্ডবক্সড প্লাগ ইনগুলি অবরুদ্ধ করা পরিচালনা করুন...</translation>
 <translation id="7617366389578322136">"<ph name="DEVICE_NAME" />" এ সংযুক্ত হচ্ছে</translation>
 <translation id="761779991806306006">কোনো পাসওয়ার্ড সংরক্ষিত হয়নি৷</translation>
+<translation id="7622114377921274169">চার্জ হচ্ছে।</translation>
 <translation id="7624154074265342755">ওয়্যারলেস নেটওয়ার্ক</translation>
 <translation id="7624337243375417909">caps lock বন্ধ আছে</translation>
 <translation id="7627790789328695202">ওহো, <ph name="FILE_NAME" /> ইতিমধ্যেই বিদ্যমান রয়েছে৷ এটির পুনঃনামকরণ করুন এবং আবার চেষ্টা করুন৷</translation>
@@ -4853,6 +4859,7 @@
 <translation id="8270242299912238708">PDF দস্তাবেজগুলি</translation>
 <translation id="827097179112817503">হোম বোতাম দেখান</translation>
 <translation id="8272443605911821513">"আরো সরঞ্জামগুলির মেনুতে" এক্সটেনশানগুলিতে ক্লিক করে আপনার এক্সটেনশানগুলি পরিচালনা করুন৷</translation>
+<translation id="8274924778568117936">আপডেটটি সম্পূর্ণ না হওয়া পর্যন্ত <ph name="DEVICE_TYPE" />টি বন্ধ করবেন না। ইনস্টলেশন হয়ে গেলে <ph name="DEVICE_TYPE" />টি নিজে থেকেই রিস্টার্ট হবে।</translation>
 <translation id="8275038454117074363">আমদানি</translation>
 <translation id="8276560076771292512">ক্যাশে খালি করুন ও কষ্টসাধ্য পুনঃলোড</translation>
 <translation id="8279388322240498158">সোরানি কুর্দিশ ইংরাজি-নির্ভর কীবোর্ড</translation>
@@ -5291,9 +5298,9 @@
 <translation id="8960999352790021682">বাংলা কীবোর্ড (ফোনেটিক)</translation>
 <translation id="8962083179518285172">বিবরণ লুকান</translation>
 <translation id="8962198349065195967">এই নেটওয়ার্কটি আপনার প্রশাসকের দ্বারা কনফিগার করা হয়েছে৷</translation>
+<translation id="8963572037665351978">উপস্থাপনা ছেড়ে বেরিয়ে আসুন</translation>
 <translation id="8965037249707889821">পুরানো পাসওয়ার্ড লিখুন</translation>
 <translation id="8965697826696209160">সেখানে যথেষ্ট স্থান নেই৷</translation>
-<translation id="8968527460726243404">ChromeOS সিস্টেম চিত্র রচয়িতা</translation>
 <translation id="8970203673128054105">কাস্ট মোড তালিকা দেখুন</translation>
 <translation id="89720367119469899">অব্যাহতি</translation>
 <translation id="8972513834460200407">Google সার্ভারগুলি থেকে ডাউনলোডগুলিকে ফায়ারওয়াল অবরুদ্ধ করছে না তা নিশ্চিত করতে দয়া করে আপনার নেটওয়ার্ক প্রশাসকের মাধ্যমে পরীক্ষা করুন৷</translation>
@@ -5446,6 +5453,7 @@
 <translation id="9188441292293901223">এই <ph name="DEVICE_TYPE" /> আনলক করতে দয়া করে আপনার ফোনকে একটি আরো নতুন সংস্করণের Android এ আপডেট করুন৷</translation>
 <translation id="9189690067274055051">আপনার ফোন আনলক করুন এবং প্রবেশ করতে আপনার <ph name="DEVICE_TYPE" />-এর কাছাকাছি আনুন।</translation>
 <translation id="9190063653747922532">L2TP/IPসেকে + পূর্বে-শেয়ার করা কী</translation>
+<translation id="920045321358709304"><ph name="SEARCH_ENGINE" /> এ অনুসন্ধান করুন</translation>
 <translation id="9201305942933582053">Chrome এর জন্য Google Now!</translation>
 <translation id="9203398526606335860">&amp;প্রোফাইলিং সক্ষমিত</translation>
 <translation id="9203478404496196495">ট্যাব সশব্দ করুন</translation>
@@ -5468,6 +5476,7 @@
 <translation id="93766956588638423">এক্সটেনশান মেরামত করুন</translation>
 <translation id="938470336146445890">দয়া করে একটি ব্যবহারকারী শংসাপত্র ইনস্টল করুন৷</translation>
 <translation id="938582441709398163">কীবোর্ড ওভারলে</translation>
+<translation id="939519157834106403">SSID</translation>
 <translation id="939598580284253335">পাসফ্রেজ প্রবেশ করান</translation>
 <translation id="939736085109172342">নতুন ফোল্ডার</translation>
 <translation id="940425055435005472">হরফের মাপ:</translation>
@@ -5478,6 +5487,7 @@
 <translation id="946810925362320585">সুপারিশ অনুসরণ করুন</translation>
 <translation id="951981865514037445"><ph name="URL" /> আপনার ডিভাইসের অবস্থান ব্যবহার করতে চায়৷</translation>
 <translation id="952992212772159698">সক্রিয় নেই</translation>
+<translation id="958515377357646513">এগিয়ে যেতে টাচ করুন।</translation>
 <translation id="960719561871045870">অপারেটরের কোড</translation>
 <translation id="960987915827980018">প্রায় 1 ঘণ্টা বাকি</translation>
 <translation id="96421021576709873">ওয়াই-ফাই নেটওয়ার্ক</translation>
diff --git a/chrome/app/resources/generated_resources_ca.xtb b/chrome/app/resources/generated_resources_ca.xtb
index bbc0eda7..6e8b0a3 100644
--- a/chrome/app/resources/generated_resources_ca.xtb
+++ b/chrome/app/resources/generated_resources_ca.xtb
@@ -835,7 +835,6 @@
 <translation id="2224551243087462610">Edita el nom de la carpeta</translation>
 <translation id="2226449515541314767">S'ha impedit que aquest lloc tingui control total dels dispositius MIDI.</translation>
 <translation id="2226720438730111184">Indica'ns el problema</translation>
-<translation id="222903405933288376">Google utilitza la teva ubicació per oferir-te contingut local. Per canviar-ho, vés a <ph name="SETTINGS_LINK" />.</translation>
 <translation id="2229161054156947610">Queda més d'una hora</translation>
 <translation id="222931766245975952">Fitxer truncat</translation>
 <translation id="222949136907494149"><ph name="URL" /> vol fer servir la ubicació de l'ordinador.</translation>
@@ -1087,7 +1086,6 @@
 <translation id="2575247648642144396">Aquesta icona serà visible quan les extensions puguin actuar a la pàgina actual. Per fer servir aquesta extensió, feu clic a la icona o premeu <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="2576842806987913196">Ja hi ha un fitxer CRX amb aquest nom.</translation>
 <translation id="2579575372772932244">S'està tornant a crear el perfil. Espereu…</translation>
-<translation id="2580168606262715640">No trobem el telèfon. Comproveu que el tingueu a mà</translation>
 <translation id="2580889980133367162">Permet sempre que <ph name="HOST" /> baixi diversos fitxers</translation>
 <translation id="2580924999637585241">Total: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">Llarg</translation>
@@ -2169,7 +2167,6 @@
 <translation id="4130207949184424187">Aquesta extensió ha canviat la pàgina que es mostra quan feu una cerca des de l'omnibox.</translation>
 <translation id="413121957363593859">Components</translation>
 <translation id="4131410914670010031">Blanc i negre</translation>
-<translation id="4135054690906486073">Aquesta xarxa està compartida amb altres usuaris</translation>
 <translation id="4135450933899346655">Els meus certificats</translation>
 <translation id="4138267921960073861">Mostra els noms d'usuari i les fotos a la pantalla d'inici de sessió</translation>
 <translation id="4140559601186535628">Missatges de tramesa automàtica</translation>
@@ -2571,9 +2568,6 @@
 <translation id="4813345808229079766">Connexió</translation>
 <translation id="4813512666221746211">Error de xarxa</translation>
 <translation id="4816492930507672669">Ajusta a la mida de la pàgina</translation>
-<translation id="4816617200045929931">Explica'ns què ha passat exactament abans de rebre el missatge d'error del perfil:
-
-****NO FACIS CAP CANVI PER SOTA D'AQUESTA LÍNIA****</translation>
 <translation id="4820334425169212497">No, no el veig</translation>
 <translation id="4821086771593057290">La contrasenya ha canviat. Torneu-ho a provar amb la contrasenya nova.</translation>
 <translation id="4821935166599369261">Creació de &amp;perfils activada</translation>
@@ -2938,7 +2932,6 @@
 <translation id="5340217413897845242">Objecte de prestatge 6</translation>
 <translation id="5341390997810576190">Utilitzarà dades mòbils</translation>
 <translation id="5342091991439452114">El PIN ha de tenir com a mínim <ph name="MINIMUM" /> dígits</translation>
-<translation id="5342344590724511265">Suggeriments sobre el bloqueig de la pestanya</translation>
 <translation id="5342451237681332106">Utilitza <ph name="PHONE_NAME" /></translation>
 <translation id="534916491091036097">Parènt. esquerre</translation>
 <translation id="5350965906220856151">Oh, oh...</translation>
@@ -3211,6 +3204,7 @@
 <translation id="5764483294734785780">De&amp;sa l'àudio com a...</translation>
 <translation id="57646104491463491">Data de modificació</translation>
 <translation id="5764797882307050727">Allibera espai al dispositiu.</translation>
+<translation id="5765425701854290211">Alguns fitxers estan malmesos i no s'ha pogut fer l'actualització. Els fitxers sincronitzats estan segurs.</translation>
 <translation id="5765491088802881382">No hi ha cap xarxa disponible</translation>
 <translation id="5765780083710877561">Descripció:</translation>
 <translation id="5771585441665576801">Transliteració (geia → γεια)</translation>
@@ -4418,6 +4412,7 @@
 <translation id="7615910377284548269">Gestiona el bloqueig dels connectors de fora de la zona de proves...</translation>
 <translation id="7617366389578322136">S'està connectant al dispositiu <ph name="DEVICE_NAME" /></translation>
 <translation id="761779991806306006">No s'ha desat cap contrasenya.</translation>
+<translation id="7622114377921274169">S'està carregant.</translation>
 <translation id="7624154074265342755">Xarxes sense fils</translation>
 <translation id="7624337243375417909">bloqueig de majúscules desactivat</translation>
 <translation id="7627790789328695202"><ph name="FILE_NAME" /> ja existeix. Canvieu-ne el nom i torneu-ho a provar.</translation>
@@ -4857,6 +4852,7 @@
 <translation id="8270242299912238708">Documents PDF</translation>
 <translation id="827097179112817503">Mostra el botó Pàgina d'inici</translation>
 <translation id="8272443605911821513">Per gestionar les extensions, feu clic a Extensions al menú Més eines.</translation>
+<translation id="8274924778568117936">No apaguis ni tanquis el dispositiu <ph name="DEVICE_TYPE" /> fins que l'actualització no hagi finalitzat. <ph name="DEVICE_TYPE" /> es reiniciarà un cop finalitzi la instal·lació.</translation>
 <translation id="8275038454117074363">Importa</translation>
 <translation id="8276560076771292512">Buida la memòria cau i torna a carregar de manera forçada</translation>
 <translation id="8279388322240498158">Teclat de kurd sorani basat en l'anglès</translation>
@@ -5297,7 +5293,6 @@
 <translation id="8963572037665351978">Surt de la presentació</translation>
 <translation id="8965037249707889821">Introduïu la contrasenya antiga</translation>
 <translation id="8965697826696209160">No hi ha prou espai.</translation>
-<translation id="8968527460726243404">Escriptor d'imatges del sistema ChromeOS</translation>
 <translation id="8970203673128054105">Mostra la llista de modes d'emissió</translation>
 <translation id="89720367119469899">Escape</translation>
 <translation id="8972513834460200407">Consulteu amb l'administrador de xarxa per assegurar-vos que el tallafoc no estigui bloquejant les baixades dels servidors de Google.</translation>
@@ -5472,6 +5467,7 @@
 <translation id="93766956588638423">Repara l'extensió</translation>
 <translation id="938470336146445890">Instal·leu un certificat d'usuari.</translation>
 <translation id="938582441709398163">Superposició de teclat</translation>
+<translation id="939519157834106403">SSID</translation>
 <translation id="939598580284253335">Introduïu la frase de contrasenya</translation>
 <translation id="939736085109172342">Carpeta nova</translation>
 <translation id="940425055435005472">Mida de la lletra:</translation>
diff --git a/chrome/app/resources/generated_resources_cs.xtb b/chrome/app/resources/generated_resources_cs.xtb
index 495baffa..749954f9 100644
--- a/chrome/app/resources/generated_resources_cs.xtb
+++ b/chrome/app/resources/generated_resources_cs.xtb
@@ -837,7 +837,6 @@
 <translation id="2224551243087462610">Upravit název složky</translation>
 <translation id="2226449515541314767">U tohoto webu byla zablokována úplná kontrola zařízení MIDI.</translation>
 <translation id="2226720438730111184">Sdělte nám, co se děje</translation>
-<translation id="222903405933288376">Google vám poskytuje místní obsah na základě vaší polohy. Toto nastavení můžete změnit na stránce <ph name="SETTINGS_LINK" />.</translation>
 <translation id="2229161054156947610">Zbývá více než hodina</translation>
 <translation id="222931766245975952">Soubor byl zkrácen</translation>
 <translation id="222949136907494149">Web <ph name="URL" /> chce použít polohu vašeho počítače.</translation>
@@ -1088,7 +1087,6 @@
 <translation id="2575247648642144396">Ikona se zobrazí, když bude možné rozšíření použít na aktuální stránce. Rozšíření aktivujete kliknutím na ikonu nebo klávesovou zkratkou <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="2576842806987913196">Soubor CRX s tímto názvem již existuje.</translation>
 <translation id="2579575372772932244">Opětovné vytváření profilu, prosím čekejte...</translation>
-<translation id="2580168606262715640">Telefon nebyl nalezen. Zkontrolujte, zda je na dosah.</translation>
 <translation id="2580889980133367162">Vždy povolit hostiteli <ph name="HOST" /> stahování několika souborů</translation>
 <translation id="2580924999637585241">Celkem: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">Dlouhé</translation>
@@ -2170,7 +2168,6 @@
 <translation id="4130207949184424187">Toto rozšíření změnilo stránku, která se zobrazí při vyhledávání z omniboxu.</translation>
 <translation id="413121957363593859">Komponenty</translation>
 <translation id="4131410914670010031">Černobíle</translation>
-<translation id="4135054690906486073">Tato síť je sdílena s dalšími uživateli</translation>
 <translation id="4135450933899346655">Vaše certifikáty</translation>
 <translation id="4138267921960073861">Zobrazit na přihlašovací obrazovce uživatelská jména a fotografie</translation>
 <translation id="4140559601186535628">Nabízené zprávy</translation>
@@ -2573,9 +2570,6 @@
 <translation id="4813345808229079766">Spojení</translation>
 <translation id="4813512666221746211">Chyba sítě</translation>
 <translation id="4816492930507672669">Přizpůsobit na stránku</translation>
-<translation id="4816617200045929931">Sdělte nám, co se přesně stalo před zobrazením zprávy o chybě profilu:
-
-****TEXT POD TÍMTO ŘÁDKEM NEMĚNIT****</translation>
 <translation id="4820334425169212497">Ne, nevidím jej</translation>
 <translation id="4821086771593057290">Vaše heslo se změnilo. Zkuste to prosím znovu s novým heslem.</translation>
 <translation id="4821935166599369261">&amp;Profilování povoleno</translation>
@@ -2938,7 +2932,6 @@
 <translation id="5340217413897845242">Položka č. 6 v poličce</translation>
 <translation id="5341390997810576190">Bude používat mobilní data</translation>
 <translation id="5342091991439452114">Minimální počet číslic v kódu PIN: <ph name="MINIMUM" /></translation>
-<translation id="5342344590724511265">Zpětná vazba k selhání karty</translation>
 <translation id="5342451237681332106">Použít telefon <ph name="PHONE_NAME" /></translation>
 <translation id="534916491091036097">Levá závorka</translation>
 <translation id="5350965906220856151">A jéje...</translation>
@@ -3210,6 +3203,7 @@
 <translation id="5764483294734785780">Uložit &amp;zvuk jako...</translation>
 <translation id="57646104491463491">Datum úpravy</translation>
 <translation id="5764797882307050727">Uvolněte v zařízení místo.</translation>
+<translation id="5765425701854290211">Je nám líto, ale některé soubory byly poškozeny a aktualizace se nezdařila. Synchronizované soubory jsou v bezpečí.</translation>
 <translation id="5765491088802881382">K dispozici nejsou žádné sítě</translation>
 <translation id="5765780083710877561">Popis:</translation>
 <translation id="5771585441665576801">Přepis (geia → γεια)</translation>
@@ -4422,6 +4416,7 @@
 <translation id="7615910377284548269">Spravovat blokování pluginů mimo izolovaný prostor...</translation>
 <translation id="7617366389578322136">Připojování k zařízení <ph name="DEVICE_NAME" /></translation>
 <translation id="761779991806306006">Nebyla uložena žádná hesla.</translation>
+<translation id="7622114377921274169">Nabíjení.</translation>
 <translation id="7624154074265342755">Bezdrátové sítě</translation>
 <translation id="7624337243375417909">caps lock je vypnut</translation>
 <translation id="7627790789328695202">Jejda, soubor <ph name="FILE_NAME" /> již existuje. Přejmenujte jej a zkuste to znovu.</translation>
@@ -4862,6 +4857,7 @@
 <translation id="8270242299912238708">Dokumenty PDF</translation>
 <translation id="827097179112817503">Zobrazit tlačítko Domovská stránka</translation>
 <translation id="8272443605911821513">Chcete-li spravovat rozšíření, klikněte v nabídce Nástroje na příkaz Rozšíření.</translation>
+<translation id="8274924778568117936">V průběhu aktualizace <ph name="DEVICE_TYPE" /> nevypínejte ani nezavírejte. Po dokončení instalace se <ph name="DEVICE_TYPE" /> restartuje.</translation>
 <translation id="8275038454117074363">Importovat</translation>
 <translation id="8276560076771292512">Vymazání mezipaměti a úplné opětovné načtení</translation>
 <translation id="8279388322240498158">Kurdská klávesnice (sorání) s anglickým rozložením</translation>
@@ -5303,7 +5299,6 @@
 <translation id="8963572037665351978">Ukončit prezentaci</translation>
 <translation id="8965037249707889821">Zadat staré heslo</translation>
 <translation id="8965697826696209160">Nedostatek místa.</translation>
-<translation id="8968527460726243404">Zapisovač obrazu systému Chrome OS</translation>
 <translation id="8970203673128054105">Zobrazit seznam režimů odesílání</translation>
 <translation id="89720367119469899">Escapovat</translation>
 <translation id="8972513834460200407">Obraťte se na svého správce sítě a ověřte, že stahování ze serverů Google neblokuje firewall.</translation>
@@ -5479,6 +5474,7 @@
 <translation id="93766956588638423">Opravit rozšíření</translation>
 <translation id="938470336146445890">Nainstalujte prosím uživatelský certifikát.</translation>
 <translation id="938582441709398163">Překryvná klávesnice</translation>
+<translation id="939519157834106403">Identifikátor SSID</translation>
 <translation id="939598580284253335">Zadat heslovou frázi</translation>
 <translation id="939736085109172342">Nová složka</translation>
 <translation id="940425055435005472">Velikost písma:</translation>
diff --git a/chrome/app/resources/generated_resources_da.xtb b/chrome/app/resources/generated_resources_da.xtb
index a1965916..236043f4 100644
--- a/chrome/app/resources/generated_resources_da.xtb
+++ b/chrome/app/resources/generated_resources_da.xtb
@@ -832,7 +832,6 @@
 <translation id="2224551243087462610">Rediger mappenavn</translation>
 <translation id="2226449515541314767">Dette website er blevet blokeret fra at have fuld kontrol over MIDI-enheder.</translation>
 <translation id="2226720438730111184">Fortæl os, hvad der sker</translation>
-<translation id="222903405933288376">Google bruger din placering til at give dig lokalt indhold. Du kan ændre dette i <ph name="SETTINGS_LINK" />.</translation>
 <translation id="2229161054156947610">Mere end én time tilbage</translation>
 <translation id="222931766245975952">Fil forkortet</translation>
 <translation id="222949136907494149"><ph name="URL" /> vil gerne anvende computerens placering.</translation>
@@ -1084,7 +1083,6 @@
 <translation id="2575247648642144396">Dette ikon vil være synligt, når udvidelsen fungerer på den aktuelle side. Brug denne udvidelse ved at klikke på ikonet eller ved at trykke på <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="2576842806987913196">Der findes allerede en CRX-fil med dette navn.</translation>
 <translation id="2579575372772932244">Genskaber profilen. Vent et øjeblik...</translation>
-<translation id="2580168606262715640">Kan du ikke finde din telefon. Sørg for, at den er lige ved hånden.</translation>
 <translation id="2580889980133367162">Tillad altid, at <ph name="HOST" /> downloader flere forskellige filer</translation>
 <translation id="2580924999637585241">I alt: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">Lang</translation>
@@ -1508,7 +1506,7 @@
 <translation id="3144135466825225871">Crx-filen kunne ikke erstattes. Tjek, om filen er i brug.</translation>
 <translation id="3144647712221361880">Åbn linket som</translation>
 <translation id="3149510190863420837">Chrome-apps</translation>
-<translation id="3150927491400159470">Intensiv genindlæsning</translation>
+<translation id="3150927491400159470">Genindlæs fuldstændig</translation>
 <translation id="315116470104423982">Mobildata</translation>
 <translation id="3151539355209957474">Starttidspunkt</translation>
 <translation id="3151562827395986343">Ryd historik, cookies, cache m.m.</translation>
@@ -2171,7 +2169,6 @@
 <translation id="4130207949184424187">Denne udvidelse har ændret, hvilken side der vises, når du søger via omnifeltet.</translation>
 <translation id="413121957363593859">Komponenter</translation>
 <translation id="4131410914670010031">Sort/hvid</translation>
-<translation id="4135054690906486073">Dette netværk deles med andre brugere</translation>
 <translation id="4135450933899346655">Dine certifikater</translation>
 <translation id="4138267921960073861">Vis brugernavne og billeder på loginskærmen</translation>
 <translation id="4140559601186535628">Push-meddelelser</translation>
@@ -2575,9 +2572,6 @@
 <translation id="4813345808229079766">Forbindelse</translation>
 <translation id="4813512666221746211">Netværksfejl</translation>
 <translation id="4816492930507672669">Tilpas til siden</translation>
-<translation id="4816617200045929931">Fortæl os, hvad der helt præcist skete, inden du fik fejlmeddelelsen for profilen:
-
-****UNDLAD AT REDIGERE UNDER DENNE LINJE****</translation>
 <translation id="4820334425169212497">Nej, jeg kan ikke se den</translation>
 <translation id="4821086771593057290">Din adgangskode er ændret. Prøv igen med din nye adgangskode.</translation>
 <translation id="4821935166599369261">&amp;Profilering aktiveret</translation>
@@ -2942,7 +2936,6 @@
 <translation id="5340217413897845242">Hyldeelement 6</translation>
 <translation id="5341390997810576190">Brug mobildata</translation>
 <translation id="5342091991439452114">Pinkoden skal være på mindst <ph name="MINIMUM" /> cifre</translation>
-<translation id="5342344590724511265">Feedback i tilfælde, hvor fanen er gået ned.</translation>
 <translation id="5342451237681332106">Brug <ph name="PHONE_NAME" /></translation>
 <translation id="534916491091036097">Venstre parantes</translation>
 <translation id="5350965906220856151">Åh nej!</translation>
@@ -3214,6 +3207,7 @@
 <translation id="5764483294734785780">&amp;Gem lyd som...</translation>
 <translation id="57646104491463491">Dato for ændring</translation>
 <translation id="5764797882307050727">Frigør plads på din enhed.</translation>
+<translation id="5765425701854290211">Nogle filer var desværre beskadiget, og opdateringen lykkedes ikke. Dine synkroniserede filer er sikre.</translation>
 <translation id="5765491088802881382">Der er ingen tilgængelige netværk</translation>
 <translation id="5765780083710877561">Beskrivelse:</translation>
 <translation id="5771585441665576801">Translitteration (geia → γεια)</translation>
@@ -3406,7 +3400,7 @@
 <translation id="6054173164583630569">Fransk tastatur</translation>
 <translation id="6055171183283175969">Den indtastede adgangskode er forkert.</translation>
 <translation id="6055392876709372977">PKCS #1 SHA-256 med RSA-kryptering</translation>
-<translation id="6056710589053485679">Almindelig genindlæsning</translation>
+<translation id="6056710589053485679">Genindlæs som normalt</translation>
 <translation id="6059232451013891645">Mappe:</translation>
 <translation id="6059652578941944813">Certifikathierarki</translation>
 <translation id="6059925163896151826">USB-enheder</translation>
@@ -4430,6 +4424,7 @@
 <translation id="7615910377284548269">Administrer blokering af plugins uden for sandbox...</translation>
 <translation id="7617366389578322136">Opretter forbindelse til "<ph name="DEVICE_NAME" />"</translation>
 <translation id="761779991806306006">Der er ikke gemt nogen adgangskoder.</translation>
+<translation id="7622114377921274169">Oplader.</translation>
 <translation id="7624154074265342755">Trådløst netværk</translation>
 <translation id="7624337243375417909">capslock er slået fra</translation>
 <translation id="7627790789328695202"><ph name="FILE_NAME" /> findes allerede. Giv filen et nyt navn, og prøv igen.</translation>
@@ -4869,8 +4864,9 @@
 <translation id="8270242299912238708">PDF-dokumenter</translation>
 <translation id="827097179112817503">Vis knappen Startside</translation>
 <translation id="8272443605911821513">Administrer dine udvidelser ved at klikke på Udvidelser i menuen "Flere værktøjer".</translation>
+<translation id="8274924778568117936">Undgå at slukke eller lukke din <ph name="DEVICE_TYPE" />, før opdateringen er færdig. Din <ph name="DEVICE_TYPE" /> genstarter, når installationen er gennemført.</translation>
 <translation id="8275038454117074363">Importer</translation>
-<translation id="8276560076771292512">Tom cache og intensiv genindlæsning</translation>
+<translation id="8276560076771292512">Tøm cache og genindlæs fuldstændig</translation>
 <translation id="8279388322240498158">Sorani-kurdisk tastatur (engelskbaseret)</translation>
 <translation id="8280151743281770066">Armensk (fonetisk)</translation>
 <translation id="8281886186245836920">Spring over</translation>
@@ -5310,7 +5306,6 @@
 <translation id="8963572037665351978">Afslut præsentation</translation>
 <translation id="8965037249707889821">Indtast den gamle adgangskode</translation>
 <translation id="8965697826696209160">Der er ikke nok plads.</translation>
-<translation id="8968527460726243404">Værktøj til skrivning af systembillede i Chrome OS</translation>
 <translation id="8970203673128054105">Se listen over cast-tilstande</translation>
 <translation id="89720367119469899">Escape</translation>
 <translation id="8972513834460200407">Kontakt din netværksadministrator for at sikre, at firewallen ikke blokerer downloads fra Google-servere.</translation>
@@ -5486,6 +5481,7 @@
 <translation id="93766956588638423">Reparer udvidelsen</translation>
 <translation id="938470336146445890">Installer et brugercertifikat.</translation>
 <translation id="938582441709398163">Tastaturoverlejring</translation>
+<translation id="939519157834106403">SSID</translation>
 <translation id="939598580284253335">Angiv adgangssætning</translation>
 <translation id="939736085109172342">Ny mappe</translation>
 <translation id="940425055435005472">Skriftstørrelse:</translation>
diff --git a/chrome/app/resources/generated_resources_de.xtb b/chrome/app/resources/generated_resources_de.xtb
index a42ee370..60785ad 100644
--- a/chrome/app/resources/generated_resources_de.xtb
+++ b/chrome/app/resources/generated_resources_de.xtb
@@ -832,7 +832,6 @@
 <translation id="2224551243087462610">Ordnername bearbeiten</translation>
 <translation id="2226449515541314767">Dieser Website wurde keine vollständige Kontrolle über MIDI-Geräte gewährt.</translation>
 <translation id="2226720438730111184">Sagen Sie uns, was los ist</translation>
-<translation id="222903405933288376">Google nutzt Ihren Standort, um Ihnen lokale Inhalte anzuzeigen. Sie können diese Einstellung unter <ph name="SETTINGS_LINK" /> ändern.</translation>
 <translation id="2229161054156947610">Noch mehr als 1 Stunde</translation>
 <translation id="222931766245975952">Datei gekürzt</translation>
 <translation id="222949136907494149"><ph name="URL" /> möchte den Standort Ihres Computers nutzen.</translation>
@@ -1084,7 +1083,6 @@
 <translation id="2575247648642144396">Dieses Symbol wird eingeblendet, wenn die Erweiterung auf die aktuelle Seite angewendet werden kann. Klicken Sie auf das Symbol oder drücken Sie <ph name="EXTENSION_SHORTCUT" />, um diese Erweiterung zu verwenden.</translation>
 <translation id="2576842806987913196">Es ist bereits eine CRX-Datei mit diesem Namen vorhanden.</translation>
 <translation id="2579575372772932244">Profil wird neu erstellt. Bitte warten…</translation>
-<translation id="2580168606262715640">Ihr Smartphone wurde nicht gefunden. Achten Sie darauf, dass es sich in Reichweite befindet.</translation>
 <translation id="2580889980133367162"><ph name="HOST" /> immer das Herunterladen mehrerer Dateien gestatten</translation>
 <translation id="2580924999637585241">Gesamt: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">Lang</translation>
@@ -2168,7 +2166,6 @@
 <translation id="4130207949184424187">Diese Erweiterung hat die Seite geändert, die bei der Suche über die Omnibox angezeigt wird.</translation>
 <translation id="413121957363593859">Komponenten</translation>
 <translation id="4131410914670010031">Schwarz-Weiß</translation>
-<translation id="4135054690906486073">Dieses Netzwerk wird gemeinsam mit anderen Nutzern verwendet</translation>
 <translation id="4135450933899346655">Ihre Zertifikate</translation>
 <translation id="4138267921960073861">Nutzernamen und Fotos auf der Anmeldeseite anzeigen</translation>
 <translation id="4140559601186535628">Push-Nachrichten</translation>
@@ -2569,9 +2566,6 @@
 <translation id="4813345808229079766">Verbindung</translation>
 <translation id="4813512666221746211">Netzwerkfehler</translation>
 <translation id="4816492930507672669">An Seite anpassen</translation>
-<translation id="4816617200045929931">Beschreiben Sie uns genau, was passiert ist, bevor Sie die Profilfehlermeldung erhalten haben:
-
-****UNTER DIESER ZEILE NICHT ÄNDERN****</translation>
 <translation id="4820334425169212497">Nein, dieser Code wird nicht angezeigt.</translation>
 <translation id="4821086771593057290">Ihr Passwort wurde geändert. Wiederholen Sie den Vorgang mit Ihrem neuen Passwort.</translation>
 <translation id="4821935166599369261">&amp;Profilerstellung aktiviert</translation>
@@ -2935,7 +2929,6 @@
 <translation id="5340217413897845242">Ablageartikel 6</translation>
 <translation id="5341390997810576190">Mobile Daten nutzen</translation>
 <translation id="5342091991439452114">PIN muss mindestens <ph name="MINIMUM" /> Ziffern umfassen</translation>
-<translation id="5342344590724511265">Feedback zum Tab-Absturz</translation>
 <translation id="5342451237681332106"><ph name="PHONE_NAME" /> verwenden</translation>
 <translation id="534916491091036097">Linke Klammer</translation>
 <translation id="5350965906220856151">Hoppla!</translation>
@@ -3207,6 +3200,7 @@
 <translation id="5764483294734785780">Audio &amp;speichern unter...</translation>
 <translation id="57646104491463491">Änderungsdatum</translation>
 <translation id="5764797882307050727">Bitte geben Sie Speicherplatz auf Ihrem Gerät frei.</translation>
+<translation id="5765425701854290211">Einige Dateien wurden beschädigt und das Update konnte nicht abgeschlossen werden. Ihre synchronisierten Dateien sind jedoch sicher.</translation>
 <translation id="5765491088802881382">Keine Netzwerke verfügbar</translation>
 <translation id="5765780083710877561">Beschreibung:</translation>
 <translation id="5771585441665576801">Transliteration (geia → γεια)</translation>
@@ -3846,7 +3840,7 @@
 <translation id="671928215901716392">Bildschirm sperren</translation>
 <translation id="6721972322305477112">&amp;Ablage</translation>
 <translation id="672213144943476270">Bitte entsperren Sie Ihr Profil, bevor Sie als Gast surfen.</translation>
-<translation id="6723354935081862304">Drücken Sie über Google Docs und andere Cloud-Ziele. <ph name="BEGIN_LINK" />Melden Sie sich an<ph name="END_LINK" />, um über Google Cloud Print zu drucken.</translation>
+<translation id="6723354935081862304">Drucken Sie über Google Docs und andere Cloud-Ziele. <ph name="BEGIN_LINK" />Melden Sie sich an<ph name="END_LINK" />, um über Google Cloud Print zu drucken.</translation>
 <translation id="6723661294526996303">Lesezeichen und Einstellungen importieren...</translation>
 <translation id="6723839937902243910">Akkuleistung</translation>
 <translation id="6725206449694821596">Internet Printing Protocol (IPP)</translation>
@@ -4425,6 +4419,7 @@
 <translation id="7615910377284548269">Blockierung von Plug-ins ohne Sandbox verwalten...</translation>
 <translation id="7617366389578322136">Verbindung zu "<ph name="DEVICE_NAME" />" wird hergestellt</translation>
 <translation id="761779991806306006">Es wurden keine Passwörter gespeichert.</translation>
+<translation id="7622114377921274169">Wird aufgeladen.</translation>
 <translation id="7624154074265342755">Drahtlosnetzwerke</translation>
 <translation id="7624337243375417909">Feststelltaste aus</translation>
 <translation id="7627790789328695202">Hoppla, <ph name="FILE_NAME" /> existiert bereits. Geben Sie einen anderen Namen ein und versuchen Sie es erneut.</translation>
@@ -4864,6 +4859,7 @@
 <translation id="8270242299912238708">PDF-Dokumente</translation>
 <translation id="827097179112817503">Schaltfläche "Startseite" anzeigen</translation>
 <translation id="8272443605911821513">Zum Verwalten Ihrer Erweiterungen klicken Sie im Menü "Mehr Tools" auf "Erweiterungen".</translation>
+<translation id="8274924778568117936">Schalten Sie Ihr <ph name="DEVICE_TYPE" /> nicht aus bzw. schließen Sie es nicht, bis das Update abgeschlossen ist. Nach Abschluss der Installation wird Ihr <ph name="DEVICE_TYPE" /> neu gestartet.</translation>
 <translation id="8275038454117074363">Importieren</translation>
 <translation id="8276560076771292512">Cache leeren und vollständig aktualisieren</translation>
 <translation id="8279388322240498158">Sorani-Tastatur nach englischem Layout</translation>
@@ -5304,7 +5300,6 @@
 <translation id="8963572037665351978">Präsentation beenden</translation>
 <translation id="8965037249707889821">Altes Passwort eingeben</translation>
 <translation id="8965697826696209160">Nicht genügend Speicherplatz.</translation>
-<translation id="8968527460726243404">ChromeOS-Systemabbild-Writer</translation>
 <translation id="8970203673128054105">Übertragungsmodusliste aufrufen</translation>
 <translation id="89720367119469899">Esc-Taste</translation>
 <translation id="8972513834460200407">Bitten Sie Ihren Netzwerkadministrator, zu überprüfen, ob Downloads von Google-Servern von der Firewall blockiert werden.</translation>
@@ -5479,6 +5474,7 @@
 <translation id="93766956588638423">Erweiterung reparieren</translation>
 <translation id="938470336146445890">Installieren Sie ein Nutzerzertifikat.</translation>
 <translation id="938582441709398163">Tastatur-Overlay</translation>
+<translation id="939519157834106403">SSID</translation>
 <translation id="939598580284253335">Passphrase eingeben</translation>
 <translation id="939736085109172342">Neuer Ordner</translation>
 <translation id="940425055435005472">Schriftgröße:</translation>
diff --git a/chrome/app/resources/generated_resources_el.xtb b/chrome/app/resources/generated_resources_el.xtb
index 8547fb8..e0ad5fa 100644
--- a/chrome/app/resources/generated_resources_el.xtb
+++ b/chrome/app/resources/generated_resources_el.xtb
@@ -839,7 +839,6 @@
 <translation id="2224551243087462610">Επεξεργασία ονόματος φακέλου</translation>
 <translation id="2226449515541314767">Αυτός ο ιστότοπος έχει αποκλειστεί από τον πλήρη έλεγχο των συσκευών MIDI.</translation>
 <translation id="2226720438730111184">Πείτε μας τι συμβαίνει</translation>
-<translation id="222903405933288376">Η Google χρησιμοποιεί την τοποθεσία σας για να σας παρέχει τοπικό περιεχόμενο. Μπορείτε να αλλάξετε αυτήν τη ρύθμιση στο <ph name="SETTINGS_LINK" />.</translation>
 <translation id="2229161054156947610">Απομένει περισσότερο από 1 ώρα</translation>
 <translation id="222931766245975952">Περικομμένο αρχείο</translation>
 <translation id="222949136907494149">Το <ph name="URL" /> ζητά να χρησιμοποιήσει την τοποθεσία του υπολογιστή σας.</translation>
@@ -1091,7 +1090,6 @@
 <translation id="2575247648642144396">Αυτό το εικονίδιο θα είναι ορατό όταν η επέκταση μπορεί να λειτουργήσει στην τρέχουσα σελίδα. Χρησιμοποιήστε αυτήν την επέκταση κάνοντας κλικ στο εικονίδιο ή πατώντας <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="2576842806987913196">Υπάρχει ήδη ένα αρχείο CRX με αυτό το όνομα.</translation>
 <translation id="2579575372772932244">Εκ νέου δημιουργία προφίλ, περιμένετε…</translation>
-<translation id="2580168606262715640">Δεν είναι δυνατή η εύρεση του τηλεφώνου σας. Βεβαιωθείτε ότι το έχετε κοντά σας.</translation>
 <translation id="2580889980133367162">Να επιτρέπεται πάντα στον κεντρικό υπολογιστή <ph name="HOST" /> η λήψη πολλών αρχείων</translation>
 <translation id="2580924999637585241">Σύνολο: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">Μακρά</translation>
@@ -2182,7 +2180,6 @@
 <translation id="4130207949184424187">Αυτή η επέκταση άλλαξε τη σελίδα που εμφανίζεται όταν κάνετε αναζήτηση από το κύριο πλαίσιο.</translation>
 <translation id="413121957363593859">Στοιχεία</translation>
 <translation id="4131410914670010031">Ασπρόμαυρο</translation>
-<translation id="4135054690906486073">Γίνεται κοινή χρήση αυτού του δικτύου με άλλους χρήστες</translation>
 <translation id="4135450933899346655">Τα πιστοποιητικά σας</translation>
 <translation id="4138267921960073861">Εμφάνιση ονομάτων χρηστών και φωτογραφιών στην οθόνη σύνδεσης</translation>
 <translation id="4140559601186535628">Μηνύματα push</translation>
@@ -2587,9 +2584,6 @@
 <translation id="4813345808229079766">Σύνδεση</translation>
 <translation id="4813512666221746211">Σφάλμα δικτύου</translation>
 <translation id="4816492930507672669">Προσαρμογή στη σελίδα</translation>
-<translation id="4816617200045929931">Πείτε μας τι συνέβη ακριβώς πριν τη λήψη του μηνύματος σφάλματος προφίλ:
-
-****ΝΑ ΜΗΝ ΠΡΑΓΜΑΤΟΠΟΙΟΥΝΤΑΙ ΑΛΛΑΓΕΣ ΚΑΤΩ ΑΠΟ ΑΥΤΗΝ ΤΗ ΓΡΑΜΜΗ****</translation>
 <translation id="4820334425169212497">Όχι, δεν το βλέπω</translation>
 <translation id="4821086771593057290">Ο κωδικός πρόσβασης έχει αλλάξει. Δοκιμάστε ξανά με τον νέο κωδικό πρόσβασης.</translation>
 <translation id="4821935166599369261">Ενεργοποιημένη &amp;δυνατότητα δημιουργίας προφίλ</translation>
@@ -2958,7 +2952,6 @@
 <translation id="5340217413897845242">Στοιχείο ραφιού 6</translation>
 <translation id="5341390997810576190">Χρήση δεδομένων κινητής τηλεφωνίας</translation>
 <translation id="5342091991439452114">Ο αριθμός PIN πρέπει να αποτελείται από τουλάχιστον <ph name="MINIMUM" /> ψηφία</translation>
-<translation id="5342344590724511265">Σχόλια για τη διακοπή λειτουργίας καρτέλας.</translation>
 <translation id="5342451237681332106">Χρήση <ph name="PHONE_NAME" /></translation>
 <translation id="534916491091036097">Αρ. παρένθ.</translation>
 <translation id="5350965906220856151">Ώχ!</translation>
@@ -3232,6 +3225,7 @@
 <translation id="5764483294734785780">Αποθή&amp;κευση ήχου ως...</translation>
 <translation id="57646104491463491">Ημερομηνία τροποποίησης</translation>
 <translation id="5764797882307050727">Απελευθερώστε χώρο στη συσκευή σας.</translation>
+<translation id="5765425701854290211">Δυστυχώς, ορισμένα αρχεία καταστράφηκαν και η ενημέρωση δεν ήταν επιτυχής. Τα συγχρονισμένα αρχεία σας είναι ασφαλή.</translation>
 <translation id="5765491088802881382">Δεν υπάρχουν διαθέσιμα δίκτυα</translation>
 <translation id="5765780083710877561">Περιγραφή:</translation>
 <translation id="5771585441665576801">Μεταγραφή (geia → γεια)</translation>
@@ -4452,6 +4446,7 @@
 <translation id="7615910377284548269">Διαχείριση αποκλεισμού προσθηκών εκτός περιβάλλοντος δοκιμών…</translation>
 <translation id="7617366389578322136">Σύνδεση σε "<ph name="DEVICE_NAME" />"</translation>
 <translation id="761779991806306006">Δεν έχουν αποθηκευτεί κωδικοί πρόσβασης.</translation>
+<translation id="7622114377921274169">Φόρτιση σε εξέλιξη.</translation>
 <translation id="7624154074265342755">Ασύρματα δίκτυα</translation>
 <translation id="7624337243375417909">η λειτουργία Caps Lock ενεργοποιήθηκε</translation>
 <translation id="7627790789328695202">Ωχ! Το αρχείο <ph name="FILE_NAME" /> υπάρχει ήδη. Μετονομάστε το και δοκιμάστε ξανά.</translation>
@@ -4893,6 +4888,7 @@
 <translation id="8270242299912238708">Έγγραφα PDF</translation>
 <translation id="827097179112817503">Εμφάνιση κουμπιού Αρχικής σελίδας</translation>
 <translation id="8272443605911821513">Διαχειριστείτε τις επεκτάσεις σας κάνοντας κλικ στο στοιχείο "Επεκτάσεις" στο μενού "Περισσότερα εργαλεία".</translation>
+<translation id="8274924778568117936">Μην απενεργοποιήσετε ή κλείσετε τη συσκευή <ph name="DEVICE_TYPE" /> μέχρι να ολοκληρωθεί η ενημέρωση. Θα γίνει επανεκκίνηση της συσκευής <ph name="DEVICE_TYPE" /> μόλις ολοκληρωθεί η εγκατάσταση.</translation>
 <translation id="8275038454117074363">Εισαγωγή</translation>
 <translation id="8276560076771292512">Άδειασμα προσωρινής μνήμης και υποχρεωτική επανάληψη φόρτωσης</translation>
 <translation id="8279388322240498158">Πληκτρολόγιο Σορανί Κουρδικών βασισμένο στα Αγγλικά</translation>
@@ -5337,7 +5333,6 @@
 <translation id="8963572037665351978">Έξοδος από την παρουσίαση</translation>
 <translation id="8965037249707889821">Εισαγάγετε τον προηγούμενο κωδικό πρόσβασης</translation>
 <translation id="8965697826696209160">Δεν υπάρχει αρκετός χώρος.</translation>
-<translation id="8968527460726243404">Εργαλείο εγγραφής εικόνων συστήματος ChromeOS</translation>
 <translation id="8970203673128054105">Προβολή λίστας λειτουργιών μετάδοσης</translation>
 <translation id="89720367119469899">Escape</translation>
 <translation id="8972513834460200407">Πραγματοποιήστε έλεγχο με το διαχειριστή του δικτύου σας, για να βεβαιωθείτε ότι το τείχος προστασίας δεν αποκλείει λήψεις από τους διακομιστές της Google.</translation>
@@ -5512,6 +5507,7 @@
 <translation id="93766956588638423">Επισκευή επέκτασης</translation>
 <translation id="938470336146445890">Εγκαταστήστε ένα πιστοποιητικό χρήστη.</translation>
 <translation id="938582441709398163">Επικάλυψη πληκτρολογίου</translation>
+<translation id="939519157834106403">SSID</translation>
 <translation id="939598580284253335">Εισαγωγή φράσης πρόσβασης</translation>
 <translation id="939736085109172342">Νέος φάκελος</translation>
 <translation id="940425055435005472">Μέγεθος γραμματοσειράς:</translation>
diff --git a/chrome/app/resources/generated_resources_en-GB.xtb b/chrome/app/resources/generated_resources_en-GB.xtb
index cc5fc57..eb63756 100644
--- a/chrome/app/resources/generated_resources_en-GB.xtb
+++ b/chrome/app/resources/generated_resources_en-GB.xtb
@@ -837,7 +837,6 @@
 <translation id="2224551243087462610">Edit folder name</translation>
 <translation id="2226449515541314767">This site has been blocked from having full control of MIDI devices.</translation>
 <translation id="2226720438730111184">Tell us what's happening</translation>
-<translation id="222903405933288376">Google uses your location to give you local content. You can change this in <ph name="SETTINGS_LINK" />.</translation>
 <translation id="2229161054156947610">More than 1 hour left</translation>
 <translation id="222931766245975952">File truncated</translation>
 <translation id="222949136907494149"><ph name="URL" /> wants to use your computer's location.</translation>
@@ -1089,7 +1088,6 @@
 <translation id="2575247648642144396">This icon will be visible when the extension can act on the current page. Use this extension by clicking on the icon or by pressing <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="2576842806987913196">There is already a CRX file present with this name.</translation>
 <translation id="2579575372772932244">Re-creating profile, please wait...</translation>
-<translation id="2580168606262715640">Can’t find your phone. Make sure that it’s within arm’s reach.</translation>
 <translation id="2580889980133367162">Always allow <ph name="HOST" /> to download multiple files</translation>
 <translation id="2580924999637585241">Total: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">Long</translation>
@@ -2173,7 +2171,6 @@
 <translation id="4130207949184424187">This extension has changed the page that is shown when you search from the Omnibox.</translation>
 <translation id="413121957363593859">Components</translation>
 <translation id="4131410914670010031">Black and white</translation>
-<translation id="4135054690906486073">This network is shared with other users</translation>
 <translation id="4135450933899346655">Your Certificates</translation>
 <translation id="4138267921960073861">Show usernames and photos on the sign-in screen</translation>
 <translation id="4140559601186535628">Push Messages</translation>
@@ -2577,9 +2574,6 @@
 <translation id="4813345808229079766">Connection</translation>
 <translation id="4813512666221746211">Network error</translation>
 <translation id="4816492930507672669">Fit to page</translation>
-<translation id="4816617200045929931">Tell us what happened exactly before you got the profile error message:
-
-****DO NOT CHANGE BELOW THIS LINE****</translation>
 <translation id="4820334425169212497">No, I don't see it</translation>
 <translation id="4821086771593057290">Your password has changed. Please try again with your new password.</translation>
 <translation id="4821935166599369261">&amp;Profiling Enabled</translation>
@@ -2945,7 +2939,6 @@
 <translation id="5340217413897845242">Shelf item 6</translation>
 <translation id="5341390997810576190">Use mobile data</translation>
 <translation id="5342091991439452114">PIN must be at least <ph name="MINIMUM" /> digits</translation>
-<translation id="5342344590724511265">Tab crashed feedback.</translation>
 <translation id="5342451237681332106">Use <ph name="PHONE_NAME" /></translation>
 <translation id="534916491091036097">Left paren</translation>
 <translation id="5350965906220856151">Uh-oh!</translation>
@@ -3217,6 +3210,7 @@
 <translation id="5764483294734785780">Sa&amp;ve audio as...</translation>
 <translation id="57646104491463491">Date Modified</translation>
 <translation id="5764797882307050727">Please free up some space on your device.</translation>
+<translation id="5765425701854290211">Sorry, some files were damaged and the update wasn’t successful. Your synced files are safe.</translation>
 <translation id="5765491088802881382">No networks are available</translation>
 <translation id="5765780083710877561">Description:</translation>
 <translation id="5771585441665576801">Transliteration (geia → γεια)</translation>
@@ -4433,6 +4427,7 @@
 <translation id="7615910377284548269">Manage unsandboxed plug-in blocking...</translation>
 <translation id="7617366389578322136">Connecting to '<ph name="DEVICE_NAME" />'</translation>
 <translation id="761779991806306006">No passwords saved.</translation>
+<translation id="7622114377921274169">Charging.</translation>
 <translation id="7624154074265342755">Wireless networks</translation>
 <translation id="7624337243375417909">caps lock off</translation>
 <translation id="7627790789328695202">Whoops, <ph name="FILE_NAME" /> already exists. Rename it and try again.</translation>
@@ -4873,6 +4868,7 @@
 <translation id="8270242299912238708">PDF documents</translation>
 <translation id="827097179112817503">Show Home button</translation>
 <translation id="8272443605911821513">Manage your extensions by clicking Extensions in the "More tools" menu.</translation>
+<translation id="8274924778568117936">Don’t turn off or close your <ph name="DEVICE_TYPE" /> until the update finishes. Your <ph name="DEVICE_TYPE" /> will restart after installation completes.</translation>
 <translation id="8275038454117074363">Import</translation>
 <translation id="8276560076771292512">Empty Cache and Hard Reload</translation>
 <translation id="8279388322240498158">Sorani Kurdish English-based keyboard</translation>
@@ -5314,7 +5310,6 @@
 <translation id="8963572037665351978">Exit Presentation</translation>
 <translation id="8965037249707889821">Enter old password</translation>
 <translation id="8965697826696209160">There is not enough space.</translation>
-<translation id="8968527460726243404">ChromeOS System Image Writer</translation>
 <translation id="8970203673128054105">View cast mode list</translation>
 <translation id="89720367119469899">Escape</translation>
 <translation id="8972513834460200407">Please check with your network administrator to make sure that the firewall is not blocking downloads from Google servers.</translation>
@@ -5490,6 +5485,7 @@
 <translation id="93766956588638423">Repair extension</translation>
 <translation id="938470336146445890">Please install a user certificate.</translation>
 <translation id="938582441709398163">Keyboard Overlay</translation>
+<translation id="939519157834106403">SSID</translation>
 <translation id="939598580284253335">Enter passphrase</translation>
 <translation id="939736085109172342">New folder</translation>
 <translation id="940425055435005472">Font size:</translation>
diff --git a/chrome/app/resources/generated_resources_es-419.xtb b/chrome/app/resources/generated_resources_es-419.xtb
index 72dd16f..f36eb011 100644
--- a/chrome/app/resources/generated_resources_es-419.xtb
+++ b/chrome/app/resources/generated_resources_es-419.xtb
@@ -832,7 +832,6 @@
 <translation id="2224551243087462610">Editar nombre de carpeta</translation>
 <translation id="2226449515541314767">Se bloqueó este sitio para que no tenga el control total de los dispositivos MIDI</translation>
 <translation id="2226720438730111184">Cuéntanos cuál es el problema</translation>
-<translation id="222903405933288376">Google usa tu ubicación para proporcionarte contenido local. Puedes cambiar esta configuración en <ph name="SETTINGS_LINK" />.</translation>
 <translation id="2229161054156947610">Falta más de una hora.</translation>
 <translation id="222931766245975952">Archivo truncado</translation>
 <translation id="222949136907494149"><ph name="URL" /> quiere utilizar la ubicación de tu computadora.</translation>
@@ -1084,7 +1083,6 @@
 <translation id="2575247648642144396">Este ícono estará visible cuando la extensión se pueda utilizar en la página actual. Para usar esta extensión, haz clic en el ícono o presiona <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="2576842806987913196">Ya existe una archivo CRX con este nombre.</translation>
 <translation id="2579575372772932244">Recreando el perfil; espera un momento…</translation>
-<translation id="2580168606262715640">No se encuentra el teléfono. Asegúrate de que esté al alcance de tu mano.</translation>
 <translation id="2580889980133367162">Siempre permitir que <ph name="HOST" /> descargue varios archivos</translation>
 <translation id="2580924999637585241">Total: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">Larga</translation>
@@ -2169,7 +2167,6 @@
 <translation id="4130207949184424187">Esta extensión cambió la página que se muestra al realizar búsquedas desde el cuadro multifunción.</translation>
 <translation id="413121957363593859">Componentes</translation>
 <translation id="4131410914670010031">Blanco y negro</translation>
-<translation id="4135054690906486073">Esta red se comparte con otros usuarios</translation>
 <translation id="4135450933899346655">Tus certificados</translation>
 <translation id="4138267921960073861">Mostrar nombres de usuarios y fotos en la pantalla de inicio</translation>
 <translation id="4140559601186535628">Mensajes de inserción</translation>
@@ -2573,9 +2570,6 @@
 <translation id="4813345808229079766">Conexión</translation>
 <translation id="4813512666221746211">Error de red</translation>
 <translation id="4816492930507672669">Ajustar a la página</translation>
-<translation id="4816617200045929931">Cuéntanos lo que pasó justo antes de recibir el mensaje de error de perfil:
-
-****NO MODIFICAR A PARTIR DE ESTA LÍNEA****</translation>
 <translation id="4820334425169212497">No lo veo</translation>
 <translation id="4821086771593057290">Tu contraseña cambió. Inténtalo nuevamente con tu nueva contraseña.</translation>
 <translation id="4821935166599369261">&amp;Perfiles activados</translation>
@@ -2941,7 +2935,6 @@
 <translation id="5340217413897845242">Elemento 6 de la biblioteca</translation>
 <translation id="5341390997810576190">Usa los datos móviles.</translation>
 <translation id="5342091991439452114">El PIN debe tener al menos <ph name="MINIMUM" /> dígitos</translation>
-<translation id="5342344590724511265">La pestaña bloqueó los comentarios.</translation>
 <translation id="5342451237681332106">Usar <ph name="PHONE_NAME" /></translation>
 <translation id="534916491091036097">Paréntesis izquierdo</translation>
 <translation id="5350965906220856151">¡Uy!</translation>
@@ -3213,6 +3206,7 @@
 <translation id="5764483294734785780">Guardar audio como...</translation>
 <translation id="57646104491463491">Fecha de modificación</translation>
 <translation id="5764797882307050727">Libera espacio en tu dispositivo.</translation>
+<translation id="5765425701854290211">Algunos archivos estaban dañaron y la actualización no pudo completarse. Tus archivos sincronizados están a salvo.</translation>
 <translation id="5765491088802881382">No hay redes disponibles</translation>
 <translation id="5765780083710877561">Descripción:</translation>
 <translation id="5771585441665576801">Transliteración (geia → γεια)</translation>
@@ -4428,6 +4422,7 @@
 <translation id="7615910377284548269">Administrar el bloqueo de complementos no incluidos en la zona de pruebas…</translation>
 <translation id="7617366389578322136">Conectando a "<ph name="DEVICE_NAME" />"</translation>
 <translation id="761779991806306006">No hay contraseñas guardadas.</translation>
+<translation id="7622114377921274169">Cargando</translation>
 <translation id="7624154074265342755">Redes inalámbricas</translation>
 <translation id="7624337243375417909">bloqueo de mayúscula desactivado</translation>
 <translation id="7627790789328695202">El archivo <ph name="FILE_NAME" /> ya existe. Cambia el nombre y vuelve a intentarlo.</translation>
@@ -4867,6 +4862,7 @@
 <translation id="8270242299912238708">Documentos PDF</translation>
 <translation id="827097179112817503">Mostrar el botón de la Página principal</translation>
 <translation id="8272443605911821513">Para administrar tus extensiones, haz clic en Extensiones en el menú "Más herramientas".</translation>
+<translation id="8274924778568117936">No apagues ni cierres el dispositivo <ph name="DEVICE_TYPE" /> hasta que finalice la actualización. Cuando el proceso termine, el dispositivo <ph name="DEVICE_TYPE" /> se reiniciará.</translation>
 <translation id="8275038454117074363">Importar</translation>
 <translation id="8276560076771292512">Vaciar caché y volver a cargar de manera forzada</translation>
 <translation id="8279388322240498158">Teclado kurdo sorani basado en el inglés</translation>
@@ -5307,7 +5303,6 @@
 <translation id="8963572037665351978">Salir del modo Presentación</translation>
 <translation id="8965037249707889821">Ingresa la contraseña anterior.</translation>
 <translation id="8965697826696209160">No hay suficiente espacio.</translation>
-<translation id="8968527460726243404">Herramienta de escritura de imagen del SO de Chrome</translation>
 <translation id="8970203673128054105">Ver la lista de modos de transmisión</translation>
 <translation id="89720367119469899">Esc</translation>
 <translation id="8972513834460200407">Consulta con tu administrador de red para asegurarte de que el firewall no esté bloqueando las descargas de los servidores de Google.</translation>
@@ -5482,6 +5477,7 @@
 <translation id="93766956588638423">Reparar extensión</translation>
 <translation id="938470336146445890">Instala un certificado de usuario.</translation>
 <translation id="938582441709398163">Superposición del teclado</translation>
+<translation id="939519157834106403">SSID</translation>
 <translation id="939598580284253335">Ingresar frase de contraseña</translation>
 <translation id="939736085109172342">Nueva carpeta</translation>
 <translation id="940425055435005472">Tamaño de la fuente:</translation>
diff --git a/chrome/app/resources/generated_resources_es.xtb b/chrome/app/resources/generated_resources_es.xtb
index a7f2934e..44f3f57 100644
--- a/chrome/app/resources/generated_resources_es.xtb
+++ b/chrome/app/resources/generated_resources_es.xtb
@@ -758,7 +758,7 @@
 <translation id="2121825465123208577">Modificar tamaño</translation>
 <translation id="2126167708562367080">El administrador ha inhabilitado la sincronización.</translation>
 <translation id="2127166530420714525">Error al cambiar el estado de alimentación del adaptador Bluetooth</translation>
-<translation id="2127372758936585790">Cargador de baja potencia</translation>
+<translation id="2127372758936585790">Carga lenta</translation>
 <translation id="212862741129535676">Porcentaje de ocupación de estado de frecuencia</translation>
 <translation id="2128691215891724419">Error de sincronización: actualiza la frase de contraseña de sincronización</translation>
 <translation id="2129825002735785149">Actualizar complemento</translation>
@@ -836,7 +836,6 @@
 <translation id="2224551243087462610">Editar nombre de carpeta</translation>
 <translation id="2226449515541314767">Se ha bloqueado este sitio para que no tenga un control absoluto de los dispositivos MIDI.</translation>
 <translation id="2226720438730111184">Indícanos el problema</translation>
-<translation id="222903405933288376">Google utiliza tu ubicación para ofrecerte contenido local. Puedes cambiar esta opción en <ph name="SETTINGS_LINK" />.</translation>
 <translation id="2229161054156947610">Más de 1 hora</translation>
 <translation id="222931766245975952">Archivo truncado</translation>
 <translation id="222949136907494149"><ph name="URL" /> quiere utilizar la ubicación de tu ordenador.</translation>
@@ -1088,7 +1087,6 @@
 <translation id="2575247648642144396">Este icono estará visible cuando la extensión se pueda utilizar en la página actual. Para utilizar la extensión, haz clic en el icono o pulsa <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="2576842806987913196">Ya existe un archivo CRX con este nombre.</translation>
 <translation id="2579575372772932244">Se está volviendo a crear el perfil, espera…</translation>
-<translation id="2580168606262715640">No se encuentra tu teléfono. Asegúrate de que esté al alcance de la mano.</translation>
 <translation id="2580889980133367162">Permitir siempre a <ph name="HOST" /> descargar varios archivos</translation>
 <translation id="2580924999637585241">Total: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">Largo</translation>
@@ -2172,7 +2170,6 @@
 <translation id="4130207949184424187">Esta extensión ha cambiado la página que se muestra al buscar en el omnibox.</translation>
 <translation id="413121957363593859">Componentes</translation>
 <translation id="4131410914670010031">Blanco y negro</translation>
-<translation id="4135054690906486073">Esta red se comparte con otros usuarios</translation>
 <translation id="4135450933899346655">Tus certificados</translation>
 <translation id="4138267921960073861">Mostrar nombres de usuario y fotos en la pantalla de inicio de sesión</translation>
 <translation id="4140559601186535628">Mensajes push</translation>
@@ -2576,9 +2573,6 @@
 <translation id="4813345808229079766">Conexión</translation>
 <translation id="4813512666221746211">Error de red</translation>
 <translation id="4816492930507672669">Ajustar a página</translation>
-<translation id="4816617200045929931">Indícanos exactamente lo que ha ocurrido antes de que apareciera el mensaje de error del perfil:
-
-****NO CAMBIAR NADA DESPUÉS DE ESTA LÍNEA****</translation>
 <translation id="4820334425169212497">No, no lo veo</translation>
 <translation id="4821086771593057290">Se ha modificado tu contraseña. Intenta acceder de nuevo con la nueva contraseña.</translation>
 <translation id="4821935166599369261">Perfiles &amp;habilitados</translation>
@@ -2881,7 +2875,7 @@
     Pase lo que pase con el dispositivo, los archivos estarán almacenados de forma segura en Google Drive.<ph name="MARKUP_6" />
     <ph name="MARKUP_7" />Comparte y crea archivos<ph name="MARKUP_8" />
     y colabora en archivos con otros usuarios desde un único lugar.<ph name="MARKUP_9" /></translation>
-<translation id="5264252276333215551">Conéctate a Internet para iniciar tu aplicación en modo de kiosk.</translation>
+<translation id="5264252276333215551">Conéctate a Internet para iniciar tu aplicación en modo de kiosco.</translation>
 <translation id="5265562206369321422">Sin conexión durante más de una semana</translation>
 <translation id="5266113311903163739">Error de importación de la entidad emisora de certificados</translation>
 <translation id="5269977353971873915">Error de impresión</translation>
@@ -2941,7 +2935,6 @@
 <translation id="5340217413897845242">Elemento 6 de la estantería</translation>
 <translation id="5341390997810576190">Utilizará datos móviles</translation>
 <translation id="5342091991439452114">El PIN debe tener al menos <ph name="MINIMUM" /> dígitos</translation>
-<translation id="5342344590724511265">Comentarios sobre una pestaña que ha fallado.</translation>
 <translation id="5342451237681332106">Utilizar <ph name="PHONE_NAME" /></translation>
 <translation id="534916491091036097">Paréntesis de apertura</translation>
 <translation id="5350965906220856151">Oh, oh...</translation>
@@ -3213,6 +3206,7 @@
 <translation id="5764483294734785780">G&amp;uardar audio como...</translation>
 <translation id="57646104491463491">Fecha de modificación</translation>
 <translation id="5764797882307050727">Libera espacio en el dispositivo.</translation>
+<translation id="5765425701854290211">Algunos archivos estaban dañados y no se ha podido instalar la actualización correctamente. Los archivos sincronizados están protegidos.</translation>
 <translation id="5765491088802881382">No hay redes disponibles</translation>
 <translation id="5765780083710877561">Descripción:</translation>
 <translation id="5771585441665576801">Transliteración (geia → γεια)</translation>
@@ -4426,6 +4420,7 @@
 <translation id="7615910377284548269">Administrar bloqueo de complementos no incluidos en la zona de pruebas...</translation>
 <translation id="7617366389578322136">Se está estableciendo conexión con "<ph name="DEVICE_NAME" />"</translation>
 <translation id="761779991806306006">No hay ninguna contraseña guardada.</translation>
+<translation id="7622114377921274169">Cargando.</translation>
 <translation id="7624154074265342755">Redes inalámbricas</translation>
 <translation id="7624337243375417909">bloqueo de mayúsculas desactivado</translation>
 <translation id="7627790789328695202">¡Vaya! <ph name="FILE_NAME" /> ya existe. Elige otro nombre y vuelve a intentarlo.</translation>
@@ -4866,6 +4861,7 @@
 <translation id="8270242299912238708">Documentos PDF</translation>
 <translation id="827097179112817503">Mostrar el botón de página principal</translation>
 <translation id="8272443605911821513">Para administrar tus extensiones, haz clic en la opción Extensiones del menú Más herramientas.</translation>
+<translation id="8274924778568117936">No apagues ni cierres tu <ph name="DEVICE_TYPE" /> hasta que termine de actualizarse. Tu <ph name="DEVICE_TYPE" /> se reiniciará cuando se complete la instalación.</translation>
 <translation id="8275038454117074363">Importar</translation>
 <translation id="8276560076771292512">Vaciar la caché y volver a cargar de manera forzada</translation>
 <translation id="8279388322240498158">Teclado kurdo sorani basado en el inglés</translation>
@@ -5307,7 +5303,6 @@
 <translation id="8963572037665351978">Salir de la presentación</translation>
 <translation id="8965037249707889821">Introducir contraseña anterior</translation>
 <translation id="8965697826696209160">No hay suficiente espacio.</translation>
-<translation id="8968527460726243404">Escritor de imágenes del sistema de Chrome OS</translation>
 <translation id="8970203673128054105">Ver la lista del modo de envío</translation>
 <translation id="89720367119469899">Esc</translation>
 <translation id="8972513834460200407">Consulta al administrador de tu red para asegurarte de que el cortafuegos no está bloqueando las descargas procedentes de los servidores de Google.</translation>
@@ -5483,6 +5478,7 @@
 <translation id="93766956588638423">Reparar extensión</translation>
 <translation id="938470336146445890">Instala un certificado de usuario.</translation>
 <translation id="938582441709398163">Superposición de teclado</translation>
+<translation id="939519157834106403">SSID</translation>
 <translation id="939598580284253335">Introducir frase de contraseña</translation>
 <translation id="939736085109172342">Nueva carpeta</translation>
 <translation id="940425055435005472">Tamaño de fuente:</translation>
diff --git a/chrome/app/resources/generated_resources_et.xtb b/chrome/app/resources/generated_resources_et.xtb
index e5cc136..ee5fa3f 100644
--- a/chrome/app/resources/generated_resources_et.xtb
+++ b/chrome/app/resources/generated_resources_et.xtb
@@ -836,7 +836,6 @@
 <translation id="2224551243087462610">Muuda kausta nime</translation>
 <translation id="2226449515541314767">Saidil pole lubatud MIDI-seadmeid täielikult juhtida.</translation>
 <translation id="2226720438730111184">Andke meile teada, mis toimub</translation>
-<translation id="222903405933288376">Google kasutab teile kohaliku sisu pakkumiseks teie asukohta. Seda saate muuta menüüs <ph name="SETTINGS_LINK" />.</translation>
 <translation id="2229161054156947610">Jäänud on rohkem kui 1 tund</translation>
 <translation id="222931766245975952">Fail on kärbitud</translation>
 <translation id="222949136907494149"><ph name="URL" /> soovib kasutada teie seadme asukohta.</translation>
@@ -1088,7 +1087,6 @@
 <translation id="2575247648642144396">Ikoon on nähtav, kui laiendus saab praegusel lehel toimida. Laienduse kasutamiseks klõpsake ikoonil või vajutage klahvikombinatsiooni <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="2576842806987913196">Selle nimega CRX-fail on juba olemas.</translation>
 <translation id="2579575372772932244">Profiili uuesti loomine, oodake …</translation>
-<translation id="2580168606262715640">Telefoni ei õnnestu leida. Veenduge, et see oleks käeulatuses.</translation>
 <translation id="2580889980133367162">Luba alati hostil <ph name="HOST" /> laadida alla mitu faili</translation>
 <translation id="2580924999637585241">Kokku: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">Pikk</translation>
@@ -2173,7 +2171,6 @@
 <translation id="4130207949184424187">See laiendus muutis seda, milline leht kuvatakse omnikastikeses otsingu tegemisel.</translation>
 <translation id="413121957363593859">Komponendid</translation>
 <translation id="4131410914670010031">Mustvalge</translation>
-<translation id="4135054690906486073">Võrku jagatakse teiste kasutajatega</translation>
 <translation id="4135450933899346655">Teie sertifikaadid</translation>
 <translation id="4138267921960073861">Kuva sisselogimisekraanil kasutajanimed ja fotod</translation>
 <translation id="4140559601186535628">Tõukesõnumid</translation>
@@ -2576,9 +2573,6 @@
 <translation id="4813345808229079766">Ühendus</translation>
 <translation id="4813512666221746211">Võrgu viga</translation>
 <translation id="4816492930507672669">Sobita lehele</translation>
-<translation id="4816617200045929931">Öelge meile, mis toimus täpselt enne seda, kui nägite profiili veateadet:
-
-****ÄRGE MUUTKE MIDAGI SELLE REA ALL****</translation>
 <translation id="4820334425169212497">Ei, ma ei näe seda</translation>
 <translation id="4821086771593057290">Teie parool on muutunud. Proovige uuesti uue parooliga.</translation>
 <translation id="4821935166599369261">&amp;Profileerimine lubatud</translation>
@@ -2944,7 +2938,6 @@
 <translation id="5340217413897845242">Riiuliüksus 6</translation>
 <translation id="5341390997810576190">Mobiilse andmeside kasutamine</translation>
 <translation id="5342091991439452114">PIN-kood peab olema vähemalt <ph name="MINIMUM" /> numbrit</translation>
-<translation id="5342344590724511265">Tagasiside vahelehe kokkujooksmise kohta.</translation>
 <translation id="5342451237681332106">Kasuta telefoni <ph name="PHONE_NAME" /></translation>
 <translation id="534916491091036097">Vasaksulg</translation>
 <translation id="5350965906220856151">Vabandust!</translation>
@@ -3216,6 +3209,7 @@
 <translation id="5764483294734785780">Sa&amp;lvesta heli nimega ...</translation>
 <translation id="57646104491463491">Muutmise kuupäev</translation>
 <translation id="5764797882307050727">Vabastage seadmes ruumi.</translation>
+<translation id="5765425701854290211">Kahjuks on mõned failid kahjustatud ja värskendus ei õnnestunud. Teie sünkroonitud failid on ohutus kohas.</translation>
 <translation id="5765491088802881382">Ühtki võrku pole saadaval</translation>
 <translation id="5765780083710877561">Kirjeldus:</translation>
 <translation id="5771585441665576801">Transliteratsioon (geia → γεια)</translation>
@@ -4431,6 +4425,7 @@
 <translation id="7615910377284548269">Liivakastist eemaldatud pistikprogrammide blokeerimise haldamine ...</translation>
 <translation id="7617366389578322136">Seadmega „<ph name="DEVICE_NAME" />” ühenduse loomine</translation>
 <translation id="761779991806306006">Ühtegi parooli pole salvestatud.</translation>
+<translation id="7622114377921274169">Laadimine.</translation>
 <translation id="7624154074265342755">Raadiovõrgud</translation>
 <translation id="7624337243375417909">suurtähelukk on välja lülitatud</translation>
 <translation id="7627790789328695202"><ph name="FILE_NAME" /> on juba olemas. Nimetage see ümber ja proovige uuesti.</translation>
@@ -4870,6 +4865,7 @@
 <translation id="8270242299912238708">PDF-dokumendid</translation>
 <translation id="827097179112817503">Kuva nupp Avaleht</translation>
 <translation id="8272443605911821513">Hallake oma laiendusi, klõpsates menüüs „Rohkem tööriistu” valikul Laiendused.</translation>
+<translation id="8274924778568117936">Ärge lülitage välja ega sulgege oma seadet <ph name="DEVICE_TYPE" />, kuni värskendus lõpule viiakse. Seade <ph name="DEVICE_TYPE" /> taaskäivitatakse pärast installimise lõpetamist.</translation>
 <translation id="8275038454117074363">Impordi</translation>
 <translation id="8276560076771292512">Tühjenda vahemälu ja tee põhjalik uuestilaadimine</translation>
 <translation id="8279388322240498158">Sorani kurdi inglise keele põhine klaviatuur</translation>
@@ -5311,7 +5307,6 @@
 <translation id="8963572037665351978">Välju esitlusest</translation>
 <translation id="8965037249707889821">Sisestage vana parool</translation>
 <translation id="8965697826696209160">Ruumi ei ole piisavalt.</translation>
-<translation id="8968527460726243404">ChromeOS-i süsteemi pildikirjutaja</translation>
 <translation id="8970203673128054105">Kuva ülekandmise režiimi loend</translation>
 <translation id="89720367119469899">Klahv Escape</translation>
 <translation id="8972513834460200407">Paluge oma võrguadministraatoril tagada, et tulemüür ei blokeeriks allalaaditavaid faile Google'i serveritest.</translation>
@@ -5487,6 +5482,7 @@
 <translation id="93766956588638423">Laiendi parandamine</translation>
 <translation id="938470336146445890">Installige kasutaja sertifikaat.</translation>
 <translation id="938582441709398163">Klaviatuuri ülekate</translation>
+<translation id="939519157834106403">SSID</translation>
 <translation id="939598580284253335">Sisesta parool</translation>
 <translation id="939736085109172342">Uus kaust</translation>
 <translation id="940425055435005472">Fondi suurus:</translation>
diff --git a/chrome/app/resources/generated_resources_fa.xtb b/chrome/app/resources/generated_resources_fa.xtb
index e0b9106..c44d61ed 100644
--- a/chrome/app/resources/generated_resources_fa.xtb
+++ b/chrome/app/resources/generated_resources_fa.xtb
@@ -833,7 +833,6 @@
 <translation id="2224551243087462610">ویرایش نام پوشه</translation>
 <translation id="2226449515541314767">‏این سایت از داشتن کنترل کامل دستگاه‌های MIDI ممانعت شده است.</translation>
 <translation id="2226720438730111184">به ما بگویید چه اتفاقی افتاده است</translation>
-<translation id="222903405933288376">‏Google از مکانتان برای ارائه محتوای محلی به شما استفاده می‌کند. می‌توانید این تنظیم را در <ph name="SETTINGS_LINK" /> تغییر دهید.</translation>
 <translation id="2229161054156947610">بیش از ۱ ساعت مانده است</translation>
 <translation id="222931766245975952">فایل ناقص</translation>
 <translation id="222949136907494149"><ph name="URL" /> می‌خواهد از موقعیت مکانی رایانه شما استفاده کند.</translation>
@@ -1085,7 +1084,6 @@
 <translation id="2575247648642144396">وقتی برنامه افزودنی بتواند در صفحه کنونی کار کند این نماد قابل مشاهده خواهد بود. با کلیک کردن روی نماد یا با فشار دادن <ph name="EXTENSION_SHORTCUT" /> از این برنامه افزودنی استفاده کنید.</translation>
 <translation id="2576842806987913196">‏یک فایل CRX در حال حاضر با این نام وجود دارد.</translation>
 <translation id="2579575372772932244">درحال ایجاد مجدد نمایه، لطفاً صبر کنید…</translation>
-<translation id="2580168606262715640">تلفنتان پیدا نمی‌شود. مطمئن شوید در فاصله حدود ۴۰ سانتی‌متری قرار دارد.</translation>
 <translation id="2580889980133367162">همیشه به <ph name="HOST" /> اجازه داده شود چند فایل را بارگیری کند</translation>
 <translation id="2580924999637585241">مجموع: <ph name="SHEETS_LABEL" /><ph name="NUMBER_OF_SHEETS" /></translation>
 <translation id="258095186877893873">طولانی</translation>
@@ -2169,7 +2167,6 @@
 <translation id="4130207949184424187">‏این افزونه، صفحه‌ای را تغییر داده است که هنگام جستجو از Omnibox نشان داده می‌شود.</translation>
 <translation id="413121957363593859">مؤلفه‌ها</translation>
 <translation id="4131410914670010031">سیاه و سفید</translation>
-<translation id="4135054690906486073">این شبکه با دیگر کاربران به اشتراک گذاشته شده است</translation>
 <translation id="4135450933899346655">گواهی‌های شما</translation>
 <translation id="4138267921960073861">نمایش نام‌های کاربری و عکس‌ها در صفحه ورود به سیستم</translation>
 <translation id="4140559601186535628">پیام‌های فشاری</translation>
@@ -2571,9 +2568,6 @@
 <translation id="4813345808229079766">اتصال</translation>
 <translation id="4813512666221746211">خطای شبکه</translation>
 <translation id="4816492930507672669">متناسب با صفحه</translation>
-<translation id="4816617200045929931">به ما بگویید قبل از دریافت پیام خطای نمایه دقیقاً چه اتفاقی افتاده است:
-
-****زیر این خط تغییری ایجاد نکنید****</translation>
 <translation id="4820334425169212497">نه، آن را نمی‌بینم</translation>
 <translation id="4821086771593057290">گذرواژه شما تغییر کرده است. لطفاً یک بار دیگر با گذرواژه جدید خود را امتحان کنید.</translation>
 <translation id="4821935166599369261">&amp;ایجاد نمایه فعال شد</translation>
@@ -2940,7 +2934,6 @@
 <translation id="5340217413897845242">مورد ۶ قفسه</translation>
 <translation id="5341390997810576190">استفاده از داده شبکه تلفن همراه</translation>
 <translation id="5342091991439452114">پین باید حداقل <ph name="MINIMUM" /> رقم باشد</translation>
-<translation id="5342344590724511265">بازخورد برگه خراب.</translation>
 <translation id="5342451237681332106">استفاده از <ph name="PHONE_NAME" /></translation>
 <translation id="534916491091036097">پرانتز چپ</translation>
 <translation id="5350965906220856151">اوه!</translation>
@@ -3212,6 +3205,7 @@
 <translation id="5764483294734785780">ذ&amp;خیره فایل صوتی به‌عنوان...</translation>
 <translation id="57646104491463491">تاریخ تغییر</translation>
 <translation id="5764797882307050727">لطفاً کمی از فضای دستگاهتان را آزاد کنید.</translation>
+<translation id="5765425701854290211">متأسفیم، بعضی از فایل‌ها آسیب دیده بودند و به‌روزرسانی موفق نبود. فایل‌های همگام‌سازی شده‌تان امن هستند.</translation>
 <translation id="5765491088802881382">شبکه‌ای در دسترس نیست</translation>
 <translation id="5765780083710877561">توضیح:</translation>
 <translation id="5771585441665576801">‏نویسه‌گردانی (geia ← ‏γεια)</translation>
@@ -4429,6 +4423,7 @@
 <translation id="7615910377284548269">مدیریت مسدودکننده افزایه آزمایشی نشده…</translation>
 <translation id="7617366389578322136">اتصال به «<ph name="DEVICE_NAME" />»</translation>
 <translation id="761779991806306006">گذرواژه ذخیره شده‌ای وجود ندارد.</translation>
+<translation id="7622114377921274169">درحال شارژ شدن.</translation>
 <translation id="7624154074265342755">شبکه‌های بی سیم</translation>
 <translation id="7624337243375417909">‏caps lock غیرفعال</translation>
 <translation id="7627790789328695202">اوه، <ph name="FILE_NAME" /> از قبل وجود دارد. نام آن را تغییر دهید و دوباره امتحان کنید.</translation>
@@ -4867,6 +4862,7 @@
 <translation id="8270242299912238708">‏سندهای PDF</translation>
 <translation id="827097179112817503">نمایش دکمه صفحه اصلی</translation>
 <translation id="8272443605911821513">با کلیک کردن روی افزونه‌ها در منوی «ابزارهای بیشتر»، برنامه‌های افزودنی خود را مدیریت کنید.</translation>
+<translation id="8274924778568117936">تا وقتی به‌روزرسانی به پایان نرسیده است، <ph name="DEVICE_TYPE" /> را خاموش نکنید یا نبندید. بعد از کامل شدن نصب، <ph name="DEVICE_TYPE" /> راه‌اندازی مجدد می‌شود.</translation>
 <translation id="8275038454117074363">وارد کردن</translation>
 <translation id="8276560076771292512">خالی کردن حافظه پنهان و تازه‌سازی سخت</translation>
 <translation id="8279388322240498158">صفحه‌کلید کردی سورانی مبتنی بر انگلیسی</translation>
@@ -5307,7 +5303,6 @@
 <translation id="8963572037665351978">خروج از ارائه</translation>
 <translation id="8965037249707889821">گذرواژه قدیمی را وارد کنید</translation>
 <translation id="8965697826696209160">فضای کافی وجود ندارد.</translation>
-<translation id="8968527460726243404">‏ایجادکننده تصویر سیستمی ChromeOS</translation>
 <translation id="8970203673128054105">مشاهده فهرست حالت ارسال محتوا</translation>
 <translation id="89720367119469899">فرار</translation>
 <translation id="8972513834460200407">‏لطفاً با سرپرست شبکه خود بررسی کنید تا مطمئن شوید فایروال از بارگیری از سرورهای Google جلوگیری نمی‌کند.</translation>
@@ -5483,6 +5478,7 @@
 <translation id="93766956588638423">تعمیر افزونه</translation>
 <translation id="938470336146445890">لطفاً یک مجوز کاربر نصب کنید.</translation>
 <translation id="938582441709398163">هم پوشانی صفحه‌کلید</translation>
+<translation id="939519157834106403">SSID</translation>
 <translation id="939598580284253335">عبارت ورود را وارد کنید</translation>
 <translation id="939736085109172342">پوشهٔ جدید</translation>
 <translation id="940425055435005472">اندازه قلم:</translation>
diff --git a/chrome/app/resources/generated_resources_fi.xtb b/chrome/app/resources/generated_resources_fi.xtb
index e63f18b..15e1ee9f 100644
--- a/chrome/app/resources/generated_resources_fi.xtb
+++ b/chrome/app/resources/generated_resources_fi.xtb
@@ -440,7 +440,7 @@
 <translation id="161707228174452095">Sormenjälki lisättiin!</translation>
 <translation id="1617097702943948177">Väliaikainen tallennustila:</translation>
 <translation id="1618268899808219593">Ohj&amp;ekeskus</translation>
-<translation id="1620510694547887537">kameraasi</translation>
+<translation id="1620510694547887537">Kamera</translation>
 <translation id="1624026626836496796">Tämä tehdään vain kerran, eikä kirjautumistietoja tallenneta.</translation>
 <translation id="1627276047960621195">Tiedostokuvaajat</translation>
 <translation id="1628736721748648976">Koodaus</translation>
@@ -835,7 +835,6 @@
 <translation id="2224551243087462610">Muokkaa kansion nimeä</translation>
 <translation id="2226449515541314767">Tältä sivustolta on estetty MIDI-laitteiden täysi käyttöoikeus.</translation>
 <translation id="2226720438730111184">Kerro, mitä tapahtuu</translation>
-<translation id="222903405933288376">Google tarjoaa paikallista sisältöä sijaintisi avulla. Voit muuttaa asetusta täällä: <ph name="SETTINGS_LINK" />.</translation>
 <translation id="2229161054156947610">Yli tunti jäljellä</translation>
 <translation id="222931766245975952">Tiedosto katkaistu</translation>
 <translation id="222949136907494149"><ph name="URL" /> haluaa käyttää tietokoneesi sijaintia.</translation>
@@ -1087,7 +1086,6 @@
 <translation id="2575247648642144396">Tämä kuvake näkyy, kun laajennus voi toimia nykyisellä sivulla. Ota laajennus käyttöön klikkaamalla kuvaketta tai painamalla <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="2576842806987913196">Tämän niminen CRX-tiedosto on jo olemassa.</translation>
 <translation id="2579575372772932244">Profiilia luodaan uudelleen…</translation>
-<translation id="2580168606262715640">Puhelinta ei löydy. Varmista, että se on käden ulottuvilla.</translation>
 <translation id="2580889980133367162">Anna aina isännän <ph name="HOST" /> ladata useita tiedostoja</translation>
 <translation id="2580924999637585241">Yhteensä: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">Pitkä</translation>
@@ -1558,7 +1556,7 @@
 <translation id="3224239078034945833">Kanada, monikielinen</translation>
 <translation id="3225084153129302039">Violetti oletusavatar</translation>
 <translation id="3225319735946384299">Koodin allekirjoitus</translation>
-<translation id="3227137524299004712">mikrofoniasi</translation>
+<translation id="3227137524299004712">Mikrofoni</translation>
 <translation id="32279126412636473">Lataa uudelleen (⌘R)</translation>
 <translation id="3228679360002431295">Muodostetaan yhteys ja tarkistetaan<ph name="ANIMATED_ELLIPSIS" /></translation>
 <translation id="3232318083971127729">Arvo:</translation>
@@ -2170,7 +2168,6 @@
 <translation id="4130207949184424187">Tämä laajennus on vaihtanut omnibox-hakujen aloitussivun.</translation>
 <translation id="413121957363593859">Osat</translation>
 <translation id="4131410914670010031">Mustavalkoinen</translation>
-<translation id="4135054690906486073">Tämä verkko on jaettu muiden käyttäjien kanssa.</translation>
 <translation id="4135450933899346655">Omat varmenteet</translation>
 <translation id="4138267921960073861">Näytä käyttäjänimet ja valokuvat kirjautumisruudulla</translation>
 <translation id="4140559601186535628">Push-viestit</translation>
@@ -2402,7 +2399,7 @@
 <translation id="4545759655004063573">Ei voi tallentaa, sillä käyttöluvat eivät riitä. Tallenna muuhun sijaintiin.</translation>
 <translation id="4547659257713117923">Ei välilehtiä muista laitteista</translation>
 <translation id="4547992677060857254">Valitsemasi kansio sisältää arkaluonteisia tiedostoja. Haluatko varmasti myöntää käyttäjälle "$1" pysyvän kirjoitusoikeuden tähän kansioon?</translation>
-<translation id="4552089082226364758">Salama</translation>
+<translation id="4552089082226364758">Flash</translation>
 <translation id="4552495056028768700">Sivun käyttöoikeus</translation>
 <translation id="4552678318981539154">Osta lisää tallennustilaa</translation>
 <translation id="4554591392113183336">Ulkoinen laajennus on sama tai aiempi versio kuin nykyinen.</translation>
@@ -2569,9 +2566,6 @@
 <translation id="4813345808229079766">Yhteys</translation>
 <translation id="4813512666221746211">Verkkovirhe</translation>
 <translation id="4816492930507672669">Sovita sivulle</translation>
-<translation id="4816617200045929931">Kerro meille, mitä tapahtui juuri ennen profiilivirheviestiä:
-
-****ÄLÄ MUUTA MITÄÄN TÄMÄN VIIVAN ALAPUOLELLA****</translation>
 <translation id="4820334425169212497">Ei, en näe sitä</translation>
 <translation id="4821086771593057290">Salasanasi on muuttunut. Yritä uudelleen uudella salasanalla.</translation>
 <translation id="4821935166599369261">&amp;Profilointi on käytössä</translation>
@@ -2935,7 +2929,6 @@
 <translation id="5340217413897845242">Hyllyn kohde 6</translation>
 <translation id="5341390997810576190">Käytä mobiilidataa</translation>
 <translation id="5342091991439452114">PIN-koodissa on oltava vähintään <ph name="MINIMUM" /> numeroa.</translation>
-<translation id="5342344590724511265">Välilehti kaatoi palautesivun.</translation>
 <translation id="5342451237681332106">Käytä puhelinta <ph name="PHONE_NAME" /></translation>
 <translation id="534916491091036097">Vasen sulje</translation>
 <translation id="5350965906220856151">Voi ei!</translation>
@@ -3207,6 +3200,7 @@
 <translation id="5764483294734785780">T&amp;allenna audiotiedosto nimellä...</translation>
 <translation id="57646104491463491">Muokkauspäivämäärä</translation>
 <translation id="5764797882307050727">Vapauta lisää tilaa laitteeltasi.</translation>
+<translation id="5765425701854290211">Jotkin tiedostot vahingoittuivat, joten päivitys epäonnistui. Synkronoidut tiedostosi ovat turvassa.</translation>
 <translation id="5765491088802881382">Ei verkkoja saatavilla</translation>
 <translation id="5765780083710877561">Kuvaus:</translation>
 <translation id="5771585441665576801">Translitterointi (geia → γεια)</translation>
@@ -4423,6 +4417,7 @@
 <translation id="7615910377284548269">Hallinnoi hiekkalaatikossa toimimattomien laajennuksien estoa…</translation>
 <translation id="7617366389578322136">Yhdistetään laitteeseen <ph name="DEVICE_NAME" />.</translation>
 <translation id="761779991806306006">Ei tallennettuja salasanoja.</translation>
+<translation id="7622114377921274169">Ladataan</translation>
 <translation id="7624154074265342755">Langattomat verkot</translation>
 <translation id="7624337243375417909">caps lock pois päältä</translation>
 <translation id="7627790789328695202">Hups, <ph name="FILE_NAME" /> on jo olemassa. Anna kohteelle toinen nimi ja yritä uudelleen.</translation>
@@ -4861,6 +4856,7 @@
 <translation id="8270242299912238708">PDF-dokumentit</translation>
 <translation id="827097179112817503">Näytä Etusivu-painike</translation>
 <translation id="8272443605911821513">Hallinnoi laajennuksiasi valitsemalla Lisätyökalut-valikossa Laajennukset.</translation>
+<translation id="8274924778568117936">Pidä <ph name="DEVICE_TYPE" /> päällä, kunnes päivitys on valmis. <ph name="DEVICE_TYPE" /> käynnistyy uudelleen, kun asennus on valmis.</translation>
 <translation id="8275038454117074363">Tuo</translation>
 <translation id="8276560076771292512">Tyhjennä välimuisti ja pakota päivitys</translation>
 <translation id="8279388322240498158">Soranîn englantiin perustuva näppäimistö</translation>
@@ -5301,7 +5297,6 @@
 <translation id="8963572037665351978">Poistu esityksestä</translation>
 <translation id="8965037249707889821">Syötä vanha salasana</translation>
 <translation id="8965697826696209160">Tallennustila ei riitä.</translation>
-<translation id="8968527460726243404">Chrome-käyttöjärjestelmän näköistiedoston kirjoittaja</translation>
 <translation id="8970203673128054105">Näytä Cast-tilaluettelo</translation>
 <translation id="89720367119469899">Escape</translation>
 <translation id="8972513834460200407">Ota yhteyttä verkon järjestelmänvalvojaan ja varmista, ettei palomuuri estä latauksia Googlen palvelimilta.</translation>
@@ -5476,6 +5471,7 @@
 <translation id="93766956588638423">Korjaa laajennus</translation>
 <translation id="938470336146445890">Asenna käyttäjävarmenne.</translation>
 <translation id="938582441709398163">Näppäimistön peitto</translation>
+<translation id="939519157834106403">SSID</translation>
 <translation id="939598580284253335">Anna tunnuslause</translation>
 <translation id="939736085109172342">Uusi kansio</translation>
 <translation id="940425055435005472">Kirjasimen koko:</translation>
diff --git a/chrome/app/resources/generated_resources_fil.xtb b/chrome/app/resources/generated_resources_fil.xtb
index 55568d5..c33724e 100644
--- a/chrome/app/resources/generated_resources_fil.xtb
+++ b/chrome/app/resources/generated_resources_fil.xtb
@@ -837,7 +837,6 @@
 <translation id="2224551243087462610">I-edit ang pangalan ng folder</translation>
 <translation id="2226449515541314767">Na-block ang site na ito mula sa pagkakaroon ng buong kontrol sa mga MIDI device.</translation>
 <translation id="2226720438730111184">Sabihin sa Amin Kung Ano ang Nangyayari</translation>
-<translation id="222903405933288376">Ginagamit ng Google ang iyong lokasyon upang mabigyan ka ng lokal na content. Maaari mo itong baguhin sa <ph name="SETTINGS_LINK" />.</translation>
 <translation id="2229161054156947610">Mahigit sa 1 oras ang natitira</translation>
 <translation id="222931766245975952">Naputol ang file</translation>
 <translation id="222949136907494149">Nais gamitin ng <ph name="URL" /> ang lokasyon ng iyong computer.</translation>
@@ -1089,7 +1088,6 @@
 <translation id="2575247648642144396">Makikita ang icon na ito kapag makakakilos ang extension sa kasalukuyang pahina. Gamitin ang extension na ito sa pamamagitan ng pag-click sa icon o sa pamamagitan ng pagpindot sa <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="2576842806987913196">Mayroon nang isang CRX file na may ganitong pangalan.</translation>
 <translation id="2579575372772932244">Muling ginagawa ang profile, mangyaring maghintay...</translation>
-<translation id="2580168606262715640">Hindi mahanap ang iyong telepono. Tiyaking nasa malapit ito.</translation>
 <translation id="2580889980133367162">Palaging payagan ang <ph name="HOST" /> na mag-download ng maraming file</translation>
 <translation id="2580924999637585241">Kabuuan: <ph name="NUMBER_OF_SHEETS" /><ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">Matagal</translation>
@@ -2175,7 +2173,6 @@
 <translation id="4130207949184424187">Binago ng extension na ito ang ipinapakitang page kapag naghahanap ka sa Omnibox.</translation>
 <translation id="413121957363593859">Mga Bahagi</translation>
 <translation id="4131410914670010031">Itim at puti</translation>
-<translation id="4135054690906486073">Ibinabahagi sa iba pang user ang network na ito</translation>
 <translation id="4135450933899346655">Iyong Mga Certificate</translation>
 <translation id="4138267921960073861">Ipakita ang mga username at larawan sa screen sa pag-sign-in</translation>
 <translation id="4140559601186535628">Mga Push Message</translation>
@@ -2579,9 +2576,6 @@
 <translation id="4813345808229079766">Pagkonekta</translation>
 <translation id="4813512666221746211">Error sa network</translation>
 <translation id="4816492930507672669">Pagkasyahin sa pahina</translation>
-<translation id="4816617200045929931">Sabihin sa amin kung ano ang eksaktong nangyari bago mo nakuha ang mensahe ng error sa profile:
-
-****HUWAG GUMAWA NG PAGBABAGO SA IBABA NG LINYANG ITO****</translation>
 <translation id="4820334425169212497">Hindi, hindi ko ito nakikita</translation>
 <translation id="4821086771593057290">Nabago ang iyong password. Pakisubukang muli gamit ang iyong bagong password.</translation>
 <translation id="4821935166599369261">&amp;Pinagana ang Pag-profile</translation>
@@ -2947,7 +2941,6 @@
 <translation id="5340217413897845242">Item 6 sa shelf</translation>
 <translation id="5341390997810576190">Gagamit ng cellular data</translation>
 <translation id="5342091991439452114">Hindi dapat bababa sa <ph name="MINIMUM" /> (na) digit ang PIN</translation>
-<translation id="5342344590724511265">Feedback na nag-crash ang tab</translation>
 <translation id="5342451237681332106">Gamitin ang <ph name="PHONE_NAME" /></translation>
 <translation id="534916491091036097">Kaliwang paren</translation>
 <translation id="5350965906220856151">Naku!</translation>
@@ -3219,6 +3212,7 @@
 <translation id="5764483294734785780">I-sa&amp;ve ang audio bilang...</translation>
 <translation id="57646104491463491">Binagong Petsa</translation>
 <translation id="5764797882307050727">Magbakante ng ilang espasyo sa iyong device.</translation>
+<translation id="5765425701854290211">Paumanhin, nasira ang ilang file at hindi nagtagumpay ang pag-update. Ligtas ang iyong mga naka-sync na file.</translation>
 <translation id="5765491088802881382">Walang magagamit na network</translation>
 <translation id="5765780083710877561">Paglalarawan:</translation>
 <translation id="5771585441665576801">Transliteration (geia → γεια)</translation>
@@ -4436,6 +4430,7 @@
 <translation id="7615910377284548269">Pamahalaan ang pag-block ng hindi naka-sandbox na plugin</translation>
 <translation id="7617366389578322136">Kumokonekta sa "<ph name="DEVICE_NAME" />"</translation>
 <translation id="761779991806306006">Walang na-save na mga password.</translation>
+<translation id="7622114377921274169">Nagcha-charge.</translation>
 <translation id="7624154074265342755">Mga wireless na network</translation>
 <translation id="7624337243375417909">naka-off ang caps lock</translation>
 <translation id="7627790789328695202">Whoops, umiiral na ang <ph name="FILE_NAME" />. Palitan ang pangalan nito at subukang muli.</translation>
@@ -4876,6 +4871,7 @@
 <translation id="8270242299912238708">Mga dokumentong PDF</translation>
 <translation id="827097179112817503">Ipakita ang button ng home</translation>
 <translation id="8272443605911821513">Pamahalaan ang iyong mga extension sa pamamagitan ng pag-click sa Mga Extension sa menu ng "Higit pang mga tool."</translation>
+<translation id="8274924778568117936">Huwag i-off o isara ang iyong <ph name="DEVICE_TYPE" /> hanggang sa matapos ang pag-update. Magre-restart ang <ph name="DEVICE_TYPE" /> mo pagkatapos ng pag-install.</translation>
 <translation id="8275038454117074363">I-import</translation>
 <translation id="8276560076771292512">Alisan ng Laman ang Cache at I-hard reload</translation>
 <translation id="8279388322240498158">Keyboard na batay sa Sorani Kurdish English</translation>
@@ -5095,7 +5091,7 @@
 <translation id="8642171459927087831">Token ng Access</translation>
 <translation id="8642267168767642381">Masyadong mabagal ang paggalaw ng daliri</translation>
 <translation id="8642947597466641025">Gawing Mas Malaki Ang Teksto</translation>
-<translation id="8647834505253004544">Hindi wastong email address</translation>
+<translation id="8647834505253004544">Di-wastong email address</translation>
 <translation id="8648252583955599667"><ph name="GET_HELP_LINK" /> o <ph name="RE_SCAN_LINK" /></translation>
 <translation id="8651585100578802546">Sapilitang I-reload ang Pahinang Ito</translation>
 <translation id="8652139471850419555">Mga Gustong Network</translation>
@@ -5320,7 +5316,6 @@
 <translation id="8963572037665351978">Lumabas sa Presentation</translation>
 <translation id="8965037249707889821">Ilagay ang lumang password</translation>
 <translation id="8965697826696209160">Walang sapat na espasyo.</translation>
-<translation id="8968527460726243404">Pangsulat ng Larawan ng ChromeOS na System</translation>
 <translation id="8970203673128054105">Tingnan ang listahan ng cast mode</translation>
 <translation id="89720367119469899">Escape</translation>
 <translation id="8972513834460200407">Pakisuri sa administrator ng iyong network upang matiyak na hindi bina-block ng firewall ang mga pag-download mula sa mga server ng Google.</translation>
@@ -5496,6 +5491,7 @@
 <translation id="93766956588638423">Ayusin ang extension</translation>
 <translation id="938470336146445890">Mangyaring mag-install ng certificate ng user.</translation>
 <translation id="938582441709398163">Overlay ng Keyboard</translation>
+<translation id="939519157834106403">SSID</translation>
 <translation id="939598580284253335">Ilagay ang passphrase</translation>
 <translation id="939736085109172342">Bagong folder</translation>
 <translation id="940425055435005472">Laki ng Font:</translation>
diff --git a/chrome/app/resources/generated_resources_fr.xtb b/chrome/app/resources/generated_resources_fr.xtb
index dd88571..db0dfe4 100644
--- a/chrome/app/resources/generated_resources_fr.xtb
+++ b/chrome/app/resources/generated_resources_fr.xtb
@@ -835,7 +835,6 @@
 <translation id="2224551243087462610">Modifier le nom du dossier</translation>
 <translation id="2226449515541314767">Le contrôle total des appareils MIDI a été bloqué pour ce site.</translation>
 <translation id="2226720438730111184">Décrivez-nous le problème rencontré</translation>
-<translation id="222903405933288376">Google utilise votre position pour vous proposer du contenu local. Pour modifier ce paramètre, accédez à la page <ph name="SETTINGS_LINK" />.</translation>
 <translation id="2229161054156947610">Plus d'1 heure restante</translation>
 <translation id="222931766245975952">Fichier tronqué.</translation>
 <translation id="222949136907494149"><ph name="URL" /> souhaite avoir accès à la position de votre ordinateur.</translation>
@@ -1087,7 +1086,6 @@
 <translation id="2575247648642144396">Cette icône s'affiche lorsque l'extension peut être utilisée au sein de la page qui s'affiche actuellement. Pour utiliser cette extension, cliquez sur l'icône ou appuyez sur <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="2576842806987913196">Un autre fichier CRX portant le même nom existe déjà.</translation>
 <translation id="2579575372772932244">Veuillez patienter pendant la nouvelle création du profil…</translation>
-<translation id="2580168606262715640">Votre téléphone est introuvable. Assurez-vous qu'il se trouve à portée de main.</translation>
 <translation id="2580889980133367162">Toujours autoriser <ph name="HOST" /> à télécharger plusieurs fichiers</translation>
 <translation id="2580924999637585241">Total : <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">Longue</translation>
@@ -2172,7 +2170,6 @@
 <translation id="4130207949184424187">Cette extension a modifié la page qui s'affiche lorsque vous effectuez une recherche dans l'omnibox.</translation>
 <translation id="413121957363593859">Composants</translation>
 <translation id="4131410914670010031">Noir et blanc</translation>
-<translation id="4135054690906486073">Ce réseau est partagé avec d'autres utilisateurs</translation>
 <translation id="4135450933899346655">Vos certificats</translation>
 <translation id="4138267921960073861">Afficher les noms d'utilisateurs et leur photo sur la page de connexion</translation>
 <translation id="4140559601186535628">Messages Push</translation>
@@ -2575,9 +2572,6 @@
 <translation id="4813345808229079766">Connexion</translation>
 <translation id="4813512666221746211">Erreur réseau.</translation>
 <translation id="4816492930507672669">Ajuster à la page</translation>
-<translation id="4816617200045929931">Indiquez-nous ce qui s'est passé exactement lorsque vous avez reçu le message d'erreur concernant le profil :
-
-****NE PAS APPORTER DE MODIFICATION SOUS CETTE LIGNE****</translation>
 <translation id="4820334425169212497">Non, je ne le vois pas</translation>
 <translation id="4821086771593057290">Votre mot de passe a changé. Veuillez réessayer avec votre nouveau mot de passe.</translation>
 <translation id="4821935166599369261">&amp;Profilage activé</translation>
@@ -2943,7 +2937,6 @@
 <translation id="5340217413897845242">Élément d'étagère 6</translation>
 <translation id="5341390997810576190">Utilisera les données mobiles</translation>
 <translation id="5342091991439452114">Le code doit comprendre au moins <ph name="MINIMUM" /> chiffres</translation>
-<translation id="5342344590724511265">Commentaires relatifs au plantage de l'onglet</translation>
 <translation id="5342451237681332106">Utiliser <ph name="PHONE_NAME" /></translation>
 <translation id="534916491091036097">Parenthèse gche</translation>
 <translation id="5350965906220856151">Petit problème</translation>
@@ -3216,6 +3209,7 @@
 <translation id="5764483294734785780">En&amp;registrer le fichier audio sous...</translation>
 <translation id="57646104491463491">Date de modification</translation>
 <translation id="5764797882307050727">Veuillez libérer de l'espace sur votre appareil.</translation>
+<translation id="5765425701854290211">Désolé, certains fichiers ont été endommagés et la mise à jour n'a pas abouti. Vos fichiers synchronisés sont en sécurité.</translation>
 <translation id="5765491088802881382">Aucun réseau disponible</translation>
 <translation id="5765780083710877561">Description :</translation>
 <translation id="5771585441665576801">Translittération (geia → γεια)</translation>
@@ -4432,6 +4426,7 @@
 <translation id="7615910377284548269">Configurer le blocage de l'exécution hors bac à sable des plug-ins</translation>
 <translation id="7617366389578322136">Connexion à "<ph name="DEVICE_NAME" />"…</translation>
 <translation id="761779991806306006">Aucun mot de passe enregistré.</translation>
+<translation id="7622114377921274169">En charge.</translation>
 <translation id="7624154074265342755">Réseaux sans fil</translation>
 <translation id="7624337243375417909">touche de verrouillage des majuscules désactivée</translation>
 <translation id="7627790789328695202">Le fichier <ph name="FILE_NAME" /> existe déjà. Veuillez le renommer, puis réessayer.</translation>
@@ -4872,6 +4867,7 @@
 <translation id="8270242299912238708">Documents PDF</translation>
 <translation id="827097179112817503">Afficher le bouton Accueil</translation>
 <translation id="8272443605911821513">Cliquer sur "Extensions" dans le menu "Autres outils" pour gérer les extensions</translation>
+<translation id="8274924778568117936">N'éteignez pas et ne fermez pas votre <ph name="DEVICE_TYPE" /> avant la fin de la mise à jour. Votre <ph name="DEVICE_TYPE" /> redémarrera une fois l'installation terminée.</translation>
 <translation id="8275038454117074363">Importer</translation>
 <translation id="8276560076771292512">Vider le cache et effectuer une actualisation forcée</translation>
 <translation id="8279388322240498158">Clavier kurde sorani (anglais)</translation>
@@ -5312,7 +5308,6 @@
 <translation id="8963572037665351978">Quitter la présentation</translation>
 <translation id="8965037249707889821">Saisir l'ancien mot de passe</translation>
 <translation id="8965697826696209160">Espace disponible insuffisant.</translation>
-<translation id="8968527460726243404">Écriture des images système Chrome OS</translation>
 <translation id="8970203673128054105">Afficher la liste des modes de diffusion</translation>
 <translation id="89720367119469899">Échap</translation>
 <translation id="8972513834460200407">Vérifiez auprès de votre administrateur réseau que le pare-feu ne bloque pas les téléchargements effectués depuis les serveurs Google.</translation>
@@ -5488,6 +5483,7 @@
 <translation id="93766956588638423">Réparer l'extension</translation>
 <translation id="938470336146445890">Veuillez installer un certificat utilisateur.</translation>
 <translation id="938582441709398163">Clavier en superposition</translation>
+<translation id="939519157834106403">SSID</translation>
 <translation id="939598580284253335">Saisir la phrase secrète</translation>
 <translation id="939736085109172342">Nouveau dossier</translation>
 <translation id="940425055435005472">Taille de police :</translation>
diff --git a/chrome/app/resources/generated_resources_gu.xtb b/chrome/app/resources/generated_resources_gu.xtb
index 64faefc..c5ccdb9 100644
--- a/chrome/app/resources/generated_resources_gu.xtb
+++ b/chrome/app/resources/generated_resources_gu.xtb
@@ -619,6 +619,7 @@
 <translation id="1882130480443819387">શીર્ષક દ્વારા સૉર્ટ કરો</translation>
 <translation id="1886996562706621347">પ્રોટોકૉલ્સ માટે ડિફૉલ્ટ હેન્ડલર્સ બનવા માટે સાઇટને પૂછવાની મંજૂરી આપો (ભલામણ કરેલ)</translation>
 <translation id="1887850431809612466">હાર્ડવેર પુનરાવર્તન</translation>
+<translation id="1889984860246851556">પ્રોક્સી સેટિંગ્સ ખોલો</translation>
 <translation id="1891668193654680795">સૉફ્ટવેર માર્કર્સને ઓળખવા માટે આ પ્રમાણપત્ર પર વિશ્વાસ કરો.</translation>
 <translation id="189210018541388520">પૂર્ણ સ્ક્રીન ખોલો</translation>
 <translation id="1893406696975231168">મેઘ જોગવાઈ પ્રવાહ નિષ્ફળ થયો</translation>
@@ -831,7 +832,6 @@
 <translation id="2224551243087462610">ફોલ્ડરનું નામ સંપાદિત કરો</translation>
 <translation id="2226449515541314767">આ સાઇટને MIDI ઉપકરણોના સંપૂર્ણ નિયંત્રણ કરવાથી અવરોધિત કરવામાં આવી છે.</translation>
 <translation id="2226720438730111184">શું થઈ રહ્યું છે તે અમને કહો</translation>
-<translation id="222903405933288376">Google, તમને સ્થાનિક સંમતિ આપવા માટે તમારા સ્થાનનો ઉપયોગ કરે છે. તમે આને <ph name="SETTINGS_LINK" /> માં બદલી શકો છો.</translation>
 <translation id="2229161054156947610">1 કલાક કરતા વધુ બાકી</translation>
 <translation id="222931766245975952">ફાઇલ કપાયેલ છે</translation>
 <translation id="222949136907494149"><ph name="URL" /> તમારા કમ્પ્યુટરનાં સ્થાનનો ઉપયોગ કરવા માંગે છે.</translation>
@@ -847,6 +847,7 @@
 <translation id="2241634353105152135">માત્ર એક વખત</translation>
 <translation id="2242603986093373032">કોઈ ઉપકરણો નથી</translation>
 <translation id="2242687258748107519">ફાઇલ માહિતી</translation>
+<translation id="2245240762616536227">તમારો બ્રાઉઝિંગ ઇતિહાસ શોધ, જાહેરાતો અને અન્ય Google સેવાઓને કેવી રીતે વ્યક્તિગત કરે તેનું નિયંત્રણ કરો</translation>
 <translation id="2246340272688122454">પુનર્પ્રાપ્તિ છબી ડાઉનલોડ કરી રહ્યું છે...</translation>
 <translation id="2249499294612408921">નિરીક્ષિત વપરાશકર્તા, તમારા માર્ગદર્શન સાથે વેબનું અન્વેષણ કરી શકે છે. Chrome માં નિરીક્ષિત વપરાશકર્તાના સંચાલક તરીકે, તમે
 
@@ -1082,7 +1083,6 @@
 <translation id="2575247648642144396">જ્યારે એક્સ્ટેંશન વર્તમાન પૃષ્ઠ પર કાર્ય કરી શકે ત્યારે આ આયકન દૃશ્યક્ષમ હશે. આયકન પર ક્લિક કરીને અથવા <ph name="EXTENSION_SHORTCUT" /> દબાવીને આ એક્સ્ટેંશનનો ઉપયોગ કરો.</translation>
 <translation id="2576842806987913196">આ નામવાળી એક CRX ફાઇલ પહેલાથી જ અસ્તિત્વમાં છે.</translation>
 <translation id="2579575372772932244">પ્રોફાઇલ ફરીથી બનાવી રહ્યાં છીએ, કૃપા કરીને રાહ જુઓ…</translation>
-<translation id="2580168606262715640">તમારો ફોન શોધી શકાતો નથી. ખાતરી કરો કે તે હાથની પહોંચમાં છે.</translation>
 <translation id="2580889980133367162">બહુવિધ ફાઇલો ડાઉનલોડ કરવા માટે હંમેશા <ph name="HOST" /> ને મંજૂરી આપો</translation>
 <translation id="2580924999637585241">કુલ: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">લાંબો</translation>
@@ -1373,6 +1373,7 @@
 <translation id="2966449113954629791">તમે તમારા મોબાઇલ ડેટા ભથ્થાનો ઉપયોગ કર્યો હોઈ શકે છે. વધુ ડેટા ખરીદવા માટે <ph name="NAME" /> સક્રિયતા પોર્ટલની મુલાકાત લો.</translation>
 <translation id="2966459079597787514">સ્વીડિશ કીબોર્ડ</translation>
 <translation id="2966598748518102999">"Ok Google" અને થોડીવાર પહેલાંનો અવાજ Google ને મોકલીને વૉઇસ શોધને સુધારો.</translation>
+<translation id="2966937470348689686">Android પસંદગીઓનું સંચાલન કરો</translation>
 <translation id="2967544384642772068">નષ્ટ કરો</translation>
 <translation id="2971033837577180453">&lt;span&gt;ID:&lt;/span&gt;<ph name="EXTENSION_ID" /></translation>
 <translation id="2971213274238188218">તેજસ્વીતા ઘટાડો</translation>
@@ -2132,6 +2133,7 @@
 <translation id="4087089424473531098">એક્સ્ટેંશન બનાવ્યું:
 
 <ph name="EXTENSION_FILE" /></translation>
+<translation id="4087470595660267445">Google Play પરથી તમારી Chromebookમાં ઍપ્લિકેશનો અને રમતો ઇન્સ્ટૉલ કરો. &lt;a target="_blank" href="<ph name="URL" />"&gt;વધુ જાણો&lt;/a&gt;</translation>
 <translation id="4088095054444612037">જૂથ માટે સ્વીકારો</translation>
 <translation id="4089521618207933045">તેમાં સબમેનૂ છે</translation>
 <translation id="4090103403438682346">ચકાસાયેલ ઍક્સેસ સક્ષમ કરો</translation>
@@ -2165,7 +2167,6 @@
 <translation id="4130207949184424187">જ્યારે તમે ઑમ્નિબૉક્સથી શોધ કરો છો ત્યારે જે પૃષ્ઠ દર્શાવવામાં આવે છે તે આ એક્સટેન્શને બદલ્યું છે.</translation>
 <translation id="413121957363593859">ઘટકો</translation>
 <translation id="4131410914670010031">કાળો અને સફેદ</translation>
-<translation id="4135054690906486073">આ નેટવર્ક, અન્ય વપરાશકર્તાઓ સાથે શેર કરવામાં આવેલ છે</translation>
 <translation id="4135450933899346655">તમારા પ્રમાણપત્રો</translation>
 <translation id="4138267921960073861">સાઇન-ઇન સ્ક્રીન પર વપરાશકર્તા નામ અને ફોટા બતાવો</translation>
 <translation id="4140559601186535628">પુશ સંદેશાઓ</translation>
@@ -2569,9 +2570,6 @@
 <translation id="4813345808229079766">કનેક્શન</translation>
 <translation id="4813512666221746211">નેટવર્ક ભૂલ</translation>
 <translation id="4816492930507672669">પૃષ્ઠ પર ફિટ</translation>
-<translation id="4816617200045929931">તમને પ્રોફાઇલ ભૂલ સંદેશ મળ્યો તે પહેલાં ચોક્કસરૂપે શું થયેલું તે અમને જણાવો:
-
-****આ રેખાની નીચે ફેરફાર કરવા નહીં****</translation>
 <translation id="4820334425169212497">નહીં, મને તે દેખાતો નથી</translation>
 <translation id="4821086771593057290">તમારો પાસવર્ડ બદલાઈ ગયો છે. કૃપા કરીને તમારા નવા પાસવર્ડથી ફરીથી પ્રયત્ન કરો.</translation>
 <translation id="4821935166599369261">&amp;પ્રોફાઇલિંગ સક્ષમ</translation>
@@ -2924,6 +2922,7 @@
 <translation id="5329858601952122676">&amp;કાઢી નાખો</translation>
 <translation id="5330145655348521461">આ ફાઇલોને બીજા ડેસ્કટૉપ પર ખોલેલી. તેને જોવા માટે <ph name="USER_NAME" /> (<ph name="MAIL_ADDRESS" />) પર જાઓ.</translation>
 <translation id="5330512191124428349">માહિતી મેળવો</translation>
+<translation id="5331069282670671859">તમારી પાસે આ કૅટેગરીમાં કોઈ પ્રમાણપત્ર નથી</translation>
 <translation id="5331425616433531170">"<ph name="CHROME_EXTENSION_NAME" />", આની સાથે જોડી કરવા માગે છે</translation>
 <translation id="5332624210073556029">ટાઇમ ઝોન:</translation>
 <translation id="5334142896108694079">સ્ક્રિપ્ટ કેશ</translation>
@@ -2934,7 +2933,6 @@
 <translation id="5340217413897845242">શેલ્ફ આઇટમ 6</translation>
 <translation id="5341390997810576190">સેલ્યુલર ડેટાનો ઉપયોગ કરો</translation>
 <translation id="5342091991439452114">PIN, ઓછામાં ઓછો <ph name="MINIMUM" /> અંકનો હોવો આવશ્યક છે</translation>
-<translation id="5342344590724511265">ટેબ ક્રેશ થયાનો પ્રતિસાદ.</translation>
 <translation id="5342451237681332106"><ph name="PHONE_NAME" /> નો ઉપયોગ કરો</translation>
 <translation id="534916491091036097">ડાબો કૌંસ</translation>
 <translation id="5350965906220856151">ઉહ-ઓહ!</translation>
@@ -2972,6 +2970,7 @@
 <translation id="5399158067281117682">PIN મેળ ખાતો નથી!</translation>
 <translation id="5400640815024374115">ટ્રસ્ટેડ પ્લેટફોર્મ મૉડ્યૂલ (TPM) ચિપ અક્ષમ અથવા ગેરહાજર છે.</translation>
 <translation id="5402367795255837559">બ્રેઇલ</translation>
+<translation id="5402815541704507626">મોબાઇલ ડેટાનો ઉપયોગ કરીને અપડેટ ડાઉનલોડ કરો</translation>
 <translation id="540296380408672091"><ph name="HOST" /> પર કુકીઝને હંમેશાં અવરોધિત કરો</translation>
 <translation id="5408750356094797285">ઝૂમ કરો: <ph name="PERCENT" /></translation>
 <translation id="5409029099497331039">મને આશ્ચર્યચકિત કરો</translation>
@@ -3109,6 +3108,7 @@
 <translation id="558918721941304263">ઍપ્લિકેશનો લોડ કરી રહ્યું છે...</translation>
 <translation id="5592595402373377407">હજુ સુધી પર્યાપ્ત ડેટા ઉપલબ્ધ નથી.</translation>
 <translation id="5595485650161345191">સરનામું સંપાદિત કરો</translation>
+<translation id="5600706100022181951">અપડેટ ડાઉનલોડ કરવામાં <ph name="UPDATE_SIZE_MB" /> MB મોબાઇલ ડેટા વપરાશે. શું તમે ચાલુ રાખવા માગો છો?</translation>
 <translation id="5601503069213153581">PIN</translation>
 <translation id="5604324414379907186">બુકમાર્ક્સ બાર હંમેશા બતાવો</translation>
 <translation id="5605623530403479164">અન્ય શોધ એંજીન્સ</translation>
@@ -3205,6 +3205,7 @@
 <translation id="5764483294734785780">ઑડિયો આ રૂપે સા&amp;ચવો...</translation>
 <translation id="57646104491463491">ફેરફાર કર્યાની તારીખ</translation>
 <translation id="5764797882307050727">કૃપા કરીને તમારા ઉપકરણમાં થોડી જગ્યા ખાલી કરો.</translation>
+<translation id="5765425701854290211">માફ કરજો, અમુક ફાઇલોને નુકસાન થયું હતું અને અપડેટ સફળ રહ્યું ન હતું. તમારી સમન્વયિત થયેલી ફાઇલો સુરક્ષિત છે.</translation>
 <translation id="5765491088802881382">નેટવર્ક્સ ઉપલબ્ધ નથી</translation>
 <translation id="5765780083710877561">વર્ણન:</translation>
 <translation id="5771585441665576801">લિવ્યંતરણ (geia → γεια)</translation>
@@ -3218,6 +3219,7 @@
 <translation id="5778747455497889540">નીચે રૅન્ડમલી બનાવવામાં આવેલ સુરક્ષિત મોડ્યુલ પાસવર્ડ છે, જે તમારા કમ્પ્યુટરને આપવામાં આવ્યો છે:</translation>
 <translation id="5780066559993805332">(શ્રેષ્ઠ)</translation>
 <translation id="5780973441651030252">પ્રાધાન્યતા પર પ્રક્રિયા કરો</translation>
+<translation id="5781865261247219930"><ph name="EXTENSION_NAME" />ને આદેશો મોકલો</translation>
 <translation id="5783221160790377646">કોઈ ભૂલને લીધે, નિરીક્ષણ કરેલ વપરાશકર્તા બનાવી શકાયો નહોતો. કૃપા કરીને પછીથી ફરી પ્રયાસ કરો.</translation>
 <translation id="5783602409389152506">ઉપકરણો માટે સ્કેન કરતી વખતે...</translation>
 <translation id="57838592816432529">અવાજ બંધ કરો</translation>
@@ -3260,6 +3262,7 @@
 <translation id="5838825566232597749">US Workman આંતરરાષ્ટ્રિય</translation>
 <translation id="5842497610951477805">Bluetooth સક્ષમ</translation>
 <translation id="5846929185714966548">ટૅબ 4</translation>
+<translation id="5848924408752252705">પાછળ જવા માટે ટચ કરો.</translation>
 <translation id="5848934677402291689">PDF પર સાચવવાનું પ્રક્રિયામાં છે</translation>
 <translation id="5849570051105887917">હોમ પ્રદાતાનો કોડ</translation>
 <translation id="5849869942539715694">એક્સટેન્શન પૅક કરો...</translation>
@@ -3278,6 +3281,7 @@
 <translation id="5859272821192576954">તમે Hangouts પર ચાલુ રાખવા માટે બધું સેટ કરી લીધું છે</translation>
 <translation id="5860033963881614850">બંધ</translation>
 <translation id="5860209693144823476">ટૅબ 3</translation>
+<translation id="5860491529813859533">ચાલુ કરો</translation>
 <translation id="5860494867054883682">તમારા ઉપકરણને <ph name="CHANNEL_NAME" /> ચેનલ પર અપડેટ કરી રહ્યાં છે (<ph name="PROGRESS_PERCENT" />)</translation>
 <translation id="5862109781435984885">શેલ્ફમાં કલમના સાધનો બતાવો</translation>
 <translation id="58625595078799656"><ph name="PRODUCT_NAME" /> ને તમે તમારા Google પાસવર્ડ અથવા તમારા પોતાના પાસફ્રેઝનો ઉપયોગ કરીને તમારા ડેટાને એન્ક્રિપ્ટ કરવાની જરૂર છે.</translation>
@@ -3609,6 +3613,7 @@
 <translation id="6395423953133416962"><ph name="BEGIN_LINK1" />સિસ્ટમ માહિતી<ph name="END_LINK1" /> અને <ph name="BEGIN_LINK2" />મેટ્રિક્સ<ph name="END_LINK2" /> મોકલો</translation>
 <translation id="6397363302884558537">બોલવાનું રોકો</translation>
 <translation id="6397592254427394018">બધા બુકમાર્ક્સને &amp;છુપી વિંડોમાં ખોલો</translation>
+<translation id="6398715114293939307">Google Play સ્ટોર દૂર કરો</translation>
 <translation id="6398765197997659313">પૂર્ણ સ્ક્રીનથી બહાર નીકળો</translation>
 <translation id="6399774419735315745">જાસૂસ</translation>
 <translation id="6401445054534215853">શેલ્ફ આઇટમ 1</translation>
@@ -4418,6 +4423,7 @@
 <translation id="7615910377284548269">અનસેન્ડબૉક્સ્ડ પ્લગિનને અવરોધિત કરવાનું સંચાલિત કરો...</translation>
 <translation id="7617366389578322136">"<ph name="DEVICE_NAME" />" થી કનેક્ટ કરી રહ્યું છે</translation>
 <translation id="761779991806306006">કોઈ પાસવર્ડ્સ સાચવ્યાં નથી.</translation>
+<translation id="7622114377921274169">ચાર્જ થઈ રહ્યું છે.</translation>
 <translation id="7624154074265342755">વાયરલેસ નેટવર્ક્સ</translation>
 <translation id="7624337243375417909">caps lock બંધ છે</translation>
 <translation id="7627790789328695202">ઉફ્ફ, <ph name="FILE_NAME" /> પહેલાંથી અસ્તિત્વમાં છે. તેનું નામ બદલો અને ફરી પ્રયાસ કરો.</translation>
@@ -4852,6 +4858,7 @@
 <translation id="8270242299912238708">PDF દસ્તાવેજો</translation>
 <translation id="827097179112817503">હોમ બટન દર્શાવો</translation>
 <translation id="8272443605911821513">"વધુ સાધનો" મેનૂમાં એક્સટેન્શન્સને ક્લિક કરીને તમારા એક્સટેન્શન્સનું સંચાલન કરો.</translation>
+<translation id="8274924778568117936">અપડેટ પૂર્ણ ન થાય ત્યાં સુધી તમારું <ph name="DEVICE_TYPE" /> બંધ કરતા નહીં. ઇન્સ્ટૉલેશન પૂર્ણ થયા બાદ તમારું <ph name="DEVICE_TYPE" /> ફરી શરૂ થશે.</translation>
 <translation id="8275038454117074363">આયાત કરો</translation>
 <translation id="8276560076771292512">કેશ ખાલી કરો અને સખત રીતે ફરીથી લોડ કરો</translation>
 <translation id="8279388322240498158">સોરાની કુર્દિશ અંગ્રેજી-આધારિત કીબોર્ડ</translation>
@@ -5290,9 +5297,9 @@
 <translation id="8960999352790021682">બંગાળી કીબોર્ડ (ધ્વન્યાત્મક)</translation>
 <translation id="8962083179518285172">વિગતો છુપાવો</translation>
 <translation id="8962198349065195967">આ નેટવર્ક તમારા વહીવટકર્તા દ્વારા ગોઠવેલું છે.</translation>
+<translation id="8963572037665351978">પ્રસ્તુતિમાંથી બહાર નીકળો</translation>
 <translation id="8965037249707889821">જૂનો પાસવર્ડ દાખલ કરો</translation>
 <translation id="8965697826696209160">પર્યાપ્ત સ્થાન નથી.</translation>
-<translation id="8968527460726243404">ChromeOS સિસ્ટમ છબી લેખક</translation>
 <translation id="8970203673128054105">કાસ્ટ મોડ સૂચિ જુઓ</translation>
 <translation id="89720367119469899">બહાર નીકળો</translation>
 <translation id="8972513834460200407">ફાયરવોલ Google સર્વર્સથી ડાઉનલોડ્સ અવરોધિત તો નથી કરતું તેની ખાતરી કરવા માટે કૃપા કરીને તમારા નેટવર્ક વ્યવસ્થાપક સાથે તપાસ કરો.</translation>
@@ -5445,6 +5452,7 @@
 <translation id="9188441292293901223">આ <ph name="DEVICE_TYPE" /> ને અનલૉક કરવા માટે, કૃપા કરીને તમારા ફોનને Android ના નવા સંસ્કરણ પર અપડેટ કરો.</translation>
 <translation id="9189690067274055051">તમારા ફોનને અનલૉક કરો અને દાખલ થવા માટે તેને તમારા <ph name="DEVICE_TYPE" /> ની નજીક લાવો.</translation>
 <translation id="9190063653747922532">L2TP/IPsec + પૂર્વ-શેર કરેલી કી</translation>
+<translation id="920045321358709304"><ph name="SEARCH_ENGINE" />માં શોધો</translation>
 <translation id="9201305942933582053">Chrome માટે Google Now!</translation>
 <translation id="9203398526606335860">&amp;પ્રોફાઇલિંગ સક્ષમ</translation>
 <translation id="9203478404496196495">ટૅબને અનમ્યૂટ કરો</translation>
@@ -5467,6 +5475,7 @@
 <translation id="93766956588638423">એક્સ્ટેન્શન સુધારો</translation>
 <translation id="938470336146445890">કૃપા કરીને એક વપરાશકર્તા  પ્રમાણપત્ર ઇન્સ્ટોલ કરો.</translation>
 <translation id="938582441709398163">કીબોર્ડ ઓવરલે</translation>
+<translation id="939519157834106403">SSID</translation>
 <translation id="939598580284253335">પાસફ્રેઝ દાખલ કરો</translation>
 <translation id="939736085109172342">નવું ફોલ્ડર</translation>
 <translation id="940425055435005472">ફોન્ટનું કદ:</translation>
@@ -5477,6 +5486,7 @@
 <translation id="946810925362320585">ભલામણ અનુસરો</translation>
 <translation id="951981865514037445"><ph name="URL" /> તમારા ઉપકરણના સ્થાનનો ઉપયોગ કરવા માંગે છે.</translation>
 <translation id="952992212772159698">સક્રિય કરેલું નથી</translation>
+<translation id="958515377357646513">આગળ જવા માટે ટચ કરો.</translation>
 <translation id="960719561871045870">ઓપરેટર કોડ</translation>
 <translation id="960987915827980018">લગભગ 1 કલાક બાકી</translation>
 <translation id="96421021576709873">Wi-Fi નેટવર્ક</translation>
diff --git a/chrome/app/resources/generated_resources_hi.xtb b/chrome/app/resources/generated_resources_hi.xtb
index ad1f90ce..b7facb4 100644
--- a/chrome/app/resources/generated_resources_hi.xtb
+++ b/chrome/app/resources/generated_resources_hi.xtb
@@ -835,7 +835,6 @@
 <translation id="2224551243087462610">फ़ोल्डर का नाम संपादित करें</translation>
 <translation id="2226449515541314767">इस साइट को MIDI डिवाइस का पूर्ण नियंत्रण रखने से अवरोधित कर दिया गया है.</translation>
 <translation id="2226720438730111184">हमें बताएं कि क्या हो रहा है</translation>
-<translation id="222903405933288376">आपको स्थानीय सामग्री देने के लिए, Google आपके स्थान का उपयोग करता है. आप इसे <ph name="SETTINGS_LINK" /> में बदल सकते हैं.</translation>
 <translation id="2229161054156947610">1 घंटा से अधिक शेष है</translation>
 <translation id="222931766245975952">फ़ाइल छोटी हो गई</translation>
 <translation id="222949136907494149"><ph name="URL" /> आपके कंप्यूटर के स्थान का उपयोग करना चाहता है.</translation>
@@ -1087,7 +1086,6 @@
 <translation id="2575247648642144396">जब एक्सटेंशन वर्तमान पेज पर कार्य कर सकेगा, तब यह आइकन दृश्यमान होगा. आइकन पर क्लिक करके या <ph name="EXTENSION_SHORTCUT" /> को दबाकर यह एक्सटेंशन सक्रिय करें.</translation>
 <translation id="2576842806987913196">इस नाम वाली CRX फ़ाइल पहले से ही मौजूद है.</translation>
 <translation id="2579575372772932244">प्रोफ़ाइल फिर से बनाई जा रही है, कृपया प्रतीक्षा करें...</translation>
-<translation id="2580168606262715640">आपका फ़ोन नहीं मिल पा रहा है. सुनिश्‍चित करें कि वह पहुंच में है.</translation>
 <translation id="2580889980133367162"><ph name="HOST" /> को एकाधिक फ़ाइलें हमेशा डाउनलोड करने दें</translation>
 <translation id="2580924999637585241">कुल: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">लंबी</translation>
@@ -2171,7 +2169,6 @@
 <translation id="4130207949184424187">इस एक्सटेंशन ने यह बदल दिया है कि जब आप खोज वाली पट्टी से खोजते हैं तब कौन सा पृष्‍ठ दिखाया जाए.</translation>
 <translation id="413121957363593859">घटक</translation>
 <translation id="4131410914670010031">श्याम और श्वेत</translation>
-<translation id="4135054690906486073">यह नेटवर्क दूसरे उपयोगकर्ताओं से साझा कि‍या गया है</translation>
 <translation id="4135450933899346655">आपके प्रमाणपत्र</translation>
 <translation id="4138267921960073861">साइन-इन स्‍क्रीन पर उपयोगकर्ता नाम और फ़ोटो दिखाएं</translation>
 <translation id="4140559601186535628">पुश संदेश</translation>
@@ -2575,9 +2572,6 @@
 <translation id="4813345808229079766">कनेक्शन</translation>
 <translation id="4813512666221746211">नेटवर्क गड़बड़ी</translation>
 <translation id="4816492930507672669">पेज में फ़िट करें</translation>
-<translation id="4816617200045929931">हमें बताएं कि आपको प्रोफ़ाइल संबंधी गड़बड़ी का संदेश मिलने से पहले वास्तव में क्या हुआ था:
-
-****इस पंक्ति के नीचे बदलाव ना करें****</translation>
 <translation id="4820334425169212497">नहीं, मुझे वह दिखाई नहीं दे रहा</translation>
 <translation id="4821086771593057290">आपका पासवर्ड बदल गया है. कृपया अपने नए पासवर्ड के साथ पुन: प्रयास करें.</translation>
 <translation id="4821935166599369261">&amp;प्रोफ़ाइलिंग सक्षम</translation>
@@ -2943,7 +2937,6 @@
 <translation id="5340217413897845242">अलमारी आइटम 6</translation>
 <translation id="5341390997810576190">सेल्युलर डेटा का उपयोग करें</translation>
 <translation id="5342091991439452114">पिन कम से कम <ph name="MINIMUM" /> अंकों का होना चाहिए</translation>
-<translation id="5342344590724511265">टैब क्रैश होने का फ़ीडबैक.</translation>
 <translation id="5342451237681332106"><ph name="PHONE_NAME" /> का उपयोग करें</translation>
 <translation id="534916491091036097">बायां कोष्टक</translation>
 <translation id="5350965906220856151">उह ओह!</translation>
@@ -3215,6 +3208,7 @@
 <translation id="5764483294734785780">इस रूप में ऑडियो स&amp;हेजें...</translation>
 <translation id="57646104491463491">संशोधन की तिथि</translation>
 <translation id="5764797882307050727">कृपया अपने डिवाइस पर कुछ जगह खाली करें.</translation>
+<translation id="5765425701854290211">माफ़ करें, कुछ फ़ाइलों को नुकसान पहुंचा है और अपडेट सफल नहीं रहा. आपकी सिंक की हुई फ़ाइलें सुरक्षित हैं.</translation>
 <translation id="5765491088802881382">कोई नेटवर्क उपलब्ध नहीं हैं</translation>
 <translation id="5765780083710877561">वर्णन:</translation>
 <translation id="5771585441665576801">लिप्यंतरण (geia → γεια)</translation>
@@ -4431,6 +4425,7 @@
 <translation id="7615910377284548269">सैंडबॉक्स नहीं किए गए प्लग इन अवरोधित करना प्रबंधित करें...</translation>
 <translation id="7617366389578322136">"<ph name="DEVICE_NAME" />" से कनेक्‍ट हो रहा है</translation>
 <translation id="761779991806306006">कोई पासवर्ड नहीं सहेजा गया.</translation>
+<translation id="7622114377921274169">चार्ज हो रहा है.</translation>
 <translation id="7624154074265342755">वायरलेस नेटवर्क</translation>
 <translation id="7624337243375417909">caps lock बंद है</translation>
 <translation id="7627790789328695202">ओह, <ph name="FILE_NAME" /> पहले से मौजूद है. उसका नाम बदलें और पुन: प्रयास करें.</translation>
@@ -4870,6 +4865,7 @@
 <translation id="8270242299912238708">PDF दस्तावेज़</translation>
 <translation id="827097179112817503">होम बटन दिखाएं</translation>
 <translation id="8272443605911821513">"अधिक टूल" मेनू में एक्सटेंशन पर क्लिक करके अपने एक्सटेंशन प्रबंधित करें.</translation>
+<translation id="8274924778568117936">अपडेट पूरा होने तक अपना <ph name="DEVICE_TYPE" /> बंद न करें. इंस्टॉलेशन पूरा हो जाने के बाद आपका <ph name="DEVICE_TYPE" /> फिर से चालू हो जाएगा.</translation>
 <translation id="8275038454117074363">आयात करें</translation>
 <translation id="8276560076771292512">संचय और कठिन पुन: लोड खाली करें</translation>
 <translation id="8279388322240498158">सोरानी कुर्दिश अंग्रेज़ी-आधारित कीबोर्ड</translation>
@@ -5310,7 +5306,6 @@
 <translation id="8963572037665351978">प्रस्तुतिकरण से बाहर निकलें</translation>
 <translation id="8965037249707889821">पुराना पासवर्ड डालें</translation>
 <translation id="8965697826696209160">पर्याप्त स्थान नहीं है.</translation>
-<translation id="8968527460726243404">ChromeOS सिस्‍टम इमेज राइटर</translation>
 <translation id="8970203673128054105">कास्ट मोड सूची देखें</translation>
 <translation id="89720367119469899">Escape</translation>
 <translation id="8972513834460200407">यह सुनिश्चित करने के लिए कृपया अपने नेटवर्क व्यवस्थापक से बात करें कि फ़ायरवॉल Google के सर्वर से होने वाले डाउनलोड अवरुद्ध नहीं कर रहा है.</translation>
@@ -5485,6 +5480,7 @@
 <translation id="93766956588638423">एक्‍सटेंशन को ठीक करें</translation>
 <translation id="938470336146445890">कृपया कोई उपयोगकर्ता प्रमाणपत्र इंस्टॉल करें.</translation>
 <translation id="938582441709398163">कीबोर्ड ओवरले</translation>
+<translation id="939519157834106403">SSID</translation>
 <translation id="939598580284253335">पासफ़्रेज़ दर्ज करें</translation>
 <translation id="939736085109172342">नया फ़ोल्डर</translation>
 <translation id="940425055435005472">अक्षरों का आकार:</translation>
diff --git a/chrome/app/resources/generated_resources_hr.xtb b/chrome/app/resources/generated_resources_hr.xtb
index 483b1016..4d5dd79 100644
--- a/chrome/app/resources/generated_resources_hr.xtb
+++ b/chrome/app/resources/generated_resources_hr.xtb
@@ -835,7 +835,6 @@
 <translation id="2224551243087462610">Uredi naziv mape</translation>
 <translation id="2226449515541314767">Za tu je web-lokaciju blokiran potpuni nadzor nad MIDI uređajima.</translation>
 <translation id="2226720438730111184">Recite nam što se događa</translation>
-<translation id="222903405933288376">Google upotrebljava vašu lokaciju da bi vam pružio lokalni sadržaj. To možete promijeniti na stranici <ph name="SETTINGS_LINK" />.</translation>
 <translation id="2229161054156947610">Preostalo više od 1 sata</translation>
 <translation id="222931766245975952">Datoteka je skraćena</translation>
 <translation id="222949136907494149"><ph name="URL" /> želi upotrijebiti lokaciju vašeg računala.</translation>
@@ -1087,7 +1086,6 @@
 <translation id="2575247648642144396">Ova će ikona biti vidljiva kada proširenje bude moglo djelovati na trenutačnoj stranici. Aktivirajte to proširenje tako što ćete kliknuti ikonu ili pritisnuti <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="2576842806987913196">Već postoji CRX datoteka s takvim nazivom.</translation>
 <translation id="2579575372772932244">Profil se ponovo izrađuje, pričekajte...</translation>
-<translation id="2580168606262715640">Telefon nije moguće pronaći. Neka vam bude nadohvat ruke.</translation>
 <translation id="2580889980133367162">Uvijek dozvoli hostu <ph name="HOST" /> preuzimanje više datoteka</translation>
 <translation id="2580924999637585241">Ukupno: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">Dugo</translation>
@@ -2172,7 +2170,6 @@
 <translation id="4130207949184424187">Ovo proširenje promijenilo je stranicu koja se prikazuje prilikom pretraživanja putem višenamjenskog okvira.</translation>
 <translation id="413121957363593859">Komponente</translation>
 <translation id="4131410914670010031">Crno-bijelo</translation>
-<translation id="4135054690906486073">Ova se mreža dijeli s drugim korisnicima</translation>
 <translation id="4135450933899346655">Vaši certifikati</translation>
 <translation id="4138267921960073861">Prikaži korisnička imena i fotografije na zaslonu za prijavu</translation>
 <translation id="4140559601186535628">Push poruke</translation>
@@ -2576,9 +2573,6 @@
 <translation id="4813345808229079766">Veza</translation>
 <translation id="4813512666221746211">Pogreška mreže</translation>
 <translation id="4816492930507672669">Prilagodi stranici</translation>
-<translation id="4816617200045929931">Opišite što se dogodilo neposredno prije nego što se prikazala poruka pogreške za profil:
-
-****NEMOJTE UNOSITI PROMJENE ISPOD OVOG RETKA****</translation>
 <translation id="4820334425169212497">Ne, ne vidim</translation>
 <translation id="4821086771593057290">Vaša je zaporka promijenjena. Pokušajte ponovno s novom.</translation>
 <translation id="4821935166599369261">&amp;Profiliranje omogućeno</translation>
@@ -2944,7 +2938,6 @@
 <translation id="5340217413897845242">Stavka police 6</translation>
 <translation id="5341390997810576190">upotrebljavati mobilne podatke</translation>
 <translation id="5342091991439452114">Broj znamenki u PIN-u mora biti najmanje <ph name="MINIMUM" /></translation>
-<translation id="5342344590724511265">Povratne informacije o srušenoj kartici.</translation>
 <translation id="5342451237681332106">Upotrijebi telefon <ph name="PHONE_NAME" /></translation>
 <translation id="534916491091036097">Lijeva zagr.</translation>
 <translation id="5350965906220856151">Uh!</translation>
@@ -3216,6 +3209,7 @@
 <translation id="5764483294734785780">Sp&amp;remi zvučni zapis kao...</translation>
 <translation id="57646104491463491">Datum izmjene</translation>
 <translation id="5764797882307050727">Oslobodite dio prostora na uređaju.</translation>
+<translation id="5765425701854290211">Neke su datoteke oštećene, pa ažuriranje nije uspjelo. Vaše su sinkronizirane datoteke sigurne.</translation>
 <translation id="5765491088802881382">Nema dostupnih mreža</translation>
 <translation id="5765780083710877561">Opis:</translation>
 <translation id="5771585441665576801">transliteracija (geia → γεια)</translation>
@@ -4430,6 +4424,7 @@
 <translation id="7615910377284548269">Upravljanje blokiranjem dodataka izvan testnog okruženja...</translation>
 <translation id="7617366389578322136">Povezivanje s uređajem "<ph name="DEVICE_NAME" />"</translation>
 <translation id="761779991806306006">Nema spremljenih zaporki.</translation>
+<translation id="7622114377921274169">Punjenje.</translation>
 <translation id="7624154074265342755">Bežične mreže</translation>
 <translation id="7624337243375417909">Caps Lock isključen</translation>
 <translation id="7627790789328695202">Ups, stavka <ph name="FILE_NAME" /> već postoji. Preimenujte je i pokušajte ponovo.</translation>
@@ -4869,6 +4864,7 @@
 <translation id="8270242299912238708">PDF dokumenti</translation>
 <translation id="827097179112817503">Prikaži gumb početne stranice</translation>
 <translation id="8272443605911821513">Upravljajte proširenjima klikom na Proširenja u izborniku "Više alata".</translation>
+<translation id="8274924778568117936">Ne isključujte i ne zatvarajte uređaj <ph name="DEVICE_TYPE" /> dok ažuriranje ne završi. Uređaj <ph name="DEVICE_TYPE" /> ponovo će se pokrenuti kada instaliranje završi.</translation>
 <translation id="8275038454117074363">Uvezi</translation>
 <translation id="8276560076771292512">Pražnjenje predmemorije i tvrdo ponovno učitavanje</translation>
 <translation id="8279388322240498158">soransko-kurdska tipkovnica temeljena na engleskom</translation>
@@ -5309,7 +5305,6 @@
 <translation id="8963572037665351978">Izlaz iz prezentacije</translation>
 <translation id="8965037249707889821">Unesite staru zaporku</translation>
 <translation id="8965697826696209160">Nema dovoljno prostora.</translation>
-<translation id="8968527460726243404">Zapisivanje slike OS-a Chrome</translation>
 <translation id="8970203673128054105">Prikaži popis načina emitiranja</translation>
 <translation id="89720367119469899">Escape</translation>
 <translation id="8972513834460200407">Obratite se administratoru mreže i provjerite blokira li vatrozid preuzimanja s Googleovih poslužitelja.</translation>
@@ -5484,6 +5479,7 @@
 <translation id="93766956588638423">Popravi proširenje</translation>
 <translation id="938470336146445890">Instalirajte korisnički certifikat.</translation>
 <translation id="938582441709398163">Preklapanje tipkovnice</translation>
+<translation id="939519157834106403">SSID</translation>
 <translation id="939598580284253335">Unesite zaporku</translation>
 <translation id="939736085109172342">Nova mapa</translation>
 <translation id="940425055435005472">Veličina fonta:</translation>
diff --git a/chrome/app/resources/generated_resources_hu.xtb b/chrome/app/resources/generated_resources_hu.xtb
index 87586dc..d1796b3 100644
--- a/chrome/app/resources/generated_resources_hu.xtb
+++ b/chrome/app/resources/generated_resources_hu.xtb
@@ -835,7 +835,6 @@
 <translation id="2224551243087462610">Mappa nevének szerkesztése</translation>
 <translation id="2226449515541314767">Ennél a webhelynél le van tiltva a MIDI-eszközökhöz való teljes hozzáférés.</translation>
 <translation id="2226720438730111184">Mondja el, mi a probléma</translation>
-<translation id="222903405933288376">A Google az Ön tartózkodási helye alapján biztosít helyi tartalmakat. Ez a következő helyen módosítható: <ph name="SETTINGS_LINK" />.</translation>
 <translation id="2229161054156947610">Több mint 1 óra van hátra</translation>
 <translation id="222931766245975952">A fájl csonkult</translation>
 <translation id="222949136907494149">A(z) <ph name="URL" /> az Ön számítógépének helyadatait akarja használni.</translation>
@@ -1087,7 +1086,6 @@
 <translation id="2575247648642144396">Ez az ikon akkor látható, ha az adott bővítmény műveletet hajthat végre az aktuális oldalon. A bővítményt az ikonra kattintva, illetve a következő billentyűkódot megnyomva használhatja: <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="2576842806987913196">Már van egy CRX-fájl ilyen névvel.</translation>
 <translation id="2579575372772932244">Profil újbóli létrehozása. Kérjük, várjon...</translation>
-<translation id="2580168606262715640">A telefonja nem található. Győződjön meg róla, hogy karnyújtásnyira van.</translation>
 <translation id="2580889980133367162">A(z) <ph name="HOST" /> mindig letölthet több fájlt</translation>
 <translation id="2580924999637585241">Összesen: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">Hosszú</translation>
@@ -2172,7 +2170,6 @@
 <translation id="4130207949184424187">Ez a bővítmény módosította, hogy melyik oldal jelenjen meg a cím- és keresősávban indított kereséskor.</translation>
 <translation id="413121957363593859">Összetevők</translation>
 <translation id="4131410914670010031">Fekete-fehér</translation>
-<translation id="4135054690906486073">A hálózat meg van osztva más felhasználókkal</translation>
 <translation id="4135450933899346655">Tanúsítványai</translation>
 <translation id="4138267921960073861">Felhasználónevek és képek megjelenítése a bejelentkezési oldalon</translation>
 <translation id="4140559601186535628">Push üzenetek</translation>
@@ -2575,9 +2572,6 @@
 <translation id="4813345808229079766">Kapcsolat</translation>
 <translation id="4813512666221746211">Hálózati hiba</translation>
 <translation id="4816492930507672669">Igazítás az oldalmérethez</translation>
-<translation id="4816617200045929931">Mondja el nekünk, hogy mi történt pontosan azelőtt, hogy a profilhiba-üzenetet kapta:
-
-****NE VÉGEZZEN MÓDOSÍTÁST E VONAL ALATT****</translation>
 <translation id="4820334425169212497">Nem látom</translation>
 <translation id="4821086771593057290">Jelszava megváltozott. Kérjük, próbálja újra új jelszavával.</translation>
 <translation id="4821935166599369261">&amp;Profilozás bekapcsolva</translation>
@@ -2944,7 +2938,6 @@
 <translation id="5340217413897845242">6. polcelem</translation>
 <translation id="5341390997810576190">Mobiladatok használata</translation>
 <translation id="5342091991439452114">A PIN-kódnak legalább <ph name="MINIMUM" /> számjegyűnek kell lennie</translation>
-<translation id="5342344590724511265">Visszajelzés összeomlott lapról.</translation>
 <translation id="5342451237681332106"><ph name="PHONE_NAME" /> használata</translation>
 <translation id="534916491091036097">Bal zárójel</translation>
 <translation id="5350965906220856151">Hűha!</translation>
@@ -3217,6 +3210,7 @@
 <translation id="5764483294734785780">Ha&amp;ng mentése másként...</translation>
 <translation id="57646104491463491">Módosítás dátuma</translation>
 <translation id="5764797882307050727">Szabadítson fel tárhelyet eszközén.</translation>
+<translation id="5765425701854290211">Sajnos egyes fájlok sérültek voltak, és nem sikerült befejezni a frissítést. A szinkronizált fájlok biztonságban vannak.</translation>
 <translation id="5765491088802881382">Nincs elérhető hálózat</translation>
 <translation id="5765780083710877561">Leírás:</translation>
 <translation id="5771585441665576801">Átírás (geia → γεια)</translation>
@@ -4432,6 +4426,7 @@
 <translation id="7615910377284548269">Nem sandboxba helyezett beépülő modulok letiltásának kezelése…</translation>
 <translation id="7617366389578322136">Csatlakozás a(z) „<ph name="DEVICE_NAME" />” eszközhöz</translation>
 <translation id="761779991806306006">Nincs mentett jelszó.</translation>
+<translation id="7622114377921274169">Töltés.</translation>
 <translation id="7624154074265342755">Vezeték nélküli hálózatok</translation>
 <translation id="7624337243375417909">caps lock kikapcsolva</translation>
 <translation id="7627790789328695202">Hoppá! <ph name="FILE_NAME" /> már létezik. Nevezze át, majd próbálja újra.</translation>
@@ -4871,6 +4866,7 @@
 <translation id="8270242299912238708">PDF-dokumentumok</translation>
 <translation id="827097179112817503">A „kezdőoldal” gomb megjelenítése</translation>
 <translation id="8272443605911821513">Bővítményeit a „További eszközök” menü Bővítmények elemére kattintva kezelheti.</translation>
+<translation id="8274924778568117936">A frissítés befejezéséig ne kapcsolja ki vagy csukja le <ph name="DEVICE_TYPE" /> eszközét. <ph name="DEVICE_TYPE" /> eszköze a telepítést követően újraindul.</translation>
 <translation id="8275038454117074363">Importálás</translation>
 <translation id="8276560076771292512">Gyorsítótár ürítése és teljes újratöltés</translation>
 <translation id="8279388322240498158">Sorani kurd angol alapú billentyűzet</translation>
@@ -5312,7 +5308,6 @@
 <translation id="8963572037665351978">Kilépés a prezentációból</translation>
 <translation id="8965037249707889821">Adja meg a régi jelszót</translation>
 <translation id="8965697826696209160">Nincs elég tárhely.</translation>
-<translation id="8968527460726243404">ChromeOS System Image Writer</translation>
 <translation id="8970203673128054105">Átküldési módok listájának megtekintése</translation>
 <translation id="89720367119469899">Vezérlő</translation>
 <translation id="8972513834460200407">Kérdezze meg a hálózati rendszergazdától, hogy a tűzfal nem tiltja-e le a Google szervereiről érkező letöltéseket.</translation>
@@ -5487,6 +5482,7 @@
 <translation id="93766956588638423">Bővítmény javítása</translation>
 <translation id="938470336146445890">Kérjük, telepítsen felhasználói tanúsítványt.</translation>
 <translation id="938582441709398163">Billentyűzetkiosztás</translation>
+<translation id="939519157834106403">SSID</translation>
 <translation id="939598580284253335">Összetett jelszó megadása</translation>
 <translation id="939736085109172342">Új mappa</translation>
 <translation id="940425055435005472">Betűméret:</translation>
diff --git a/chrome/app/resources/generated_resources_id.xtb b/chrome/app/resources/generated_resources_id.xtb
index 80adb44..080d7dd 100644
--- a/chrome/app/resources/generated_resources_id.xtb
+++ b/chrome/app/resources/generated_resources_id.xtb
@@ -835,7 +835,6 @@
 <translation id="2224551243087462610">Edit nama folder</translation>
 <translation id="2226449515541314767">Situs ini diblokir agar tidak memiliki kontrol penuh atas perangkat MIDI.</translation>
 <translation id="2226720438730111184">Beri Tahu Kami Apa Yang Terjadi</translation>
-<translation id="222903405933288376">Google menggunakan lokasi Anda untuk memberikan konten lokal. Anda dapat mengubahnya di <ph name="SETTINGS_LINK" />.</translation>
 <translation id="2229161054156947610">Lebih dari 1 jam lagi</translation>
 <translation id="222931766245975952">File terpotong</translation>
 <translation id="222949136907494149"><ph name="URL" /> ingin menggunakan lokasi komputer Anda.</translation>
@@ -1087,7 +1086,6 @@
 <translation id="2575247648642144396">Ikon ini akan terlihat saat ekstensi dapat berperan di laman aktif. Gunakan ekstensi ini dengan mengeklik ikon atau dengan menekan <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="2576842806987913196">Sudah ada file CRX dengan nama ini.</translation>
 <translation id="2579575372772932244">Membuat ulang profil, harap tunggu...</translation>
-<translation id="2580168606262715640">Ponsel tidak dapat ditemukan. Pastikan ponsel berada dalam jangkauan tangan Anda.</translation>
 <translation id="2580889980133367162">Selalu izinkan <ph name="HOST" /> untuk mendownload beberapa file</translation>
 <translation id="2580924999637585241">Total: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">Lama</translation>
@@ -2172,7 +2170,6 @@
 <translation id="4130207949184424187">Ekstensi ini telah mengubah laman apa yang ditampilkan saat Anda menelusuri dari Omnibox.</translation>
 <translation id="413121957363593859">Komponen</translation>
 <translation id="4131410914670010031">Hitam dan putih</translation>
-<translation id="4135054690906486073">Jaringan ini dibagi dengan pengguna lain</translation>
 <translation id="4135450933899346655">Sertifikat Anda</translation>
 <translation id="4138267921960073861">Tampilkan nama pengguna dan foto pada layar masuk</translation>
 <translation id="4140559601186535628">Pesan Push</translation>
@@ -2576,9 +2573,6 @@
 <translation id="4813345808229079766">Sambungan</translation>
 <translation id="4813512666221746211">Kesalahan jaringan</translation>
 <translation id="4816492930507672669">Paskan dengan halaman</translation>
-<translation id="4816617200045929931">Beri tahu kami hal yang terjadi sebelum Anda mendapatkan pesan kesalahan profil:
-
-****JANGAN MENGUBAH DI BAWAH BARIS INI****</translation>
 <translation id="4820334425169212497">Tidak, saya tidak melihatnya</translation>
 <translation id="4821086771593057290">Sandi Anda telah diubah. Coba lagi dengan sandi baru.</translation>
 <translation id="4821935166599369261">&amp;Penyidikan Diaktifkan</translation>
@@ -2944,7 +2938,6 @@
 <translation id="5340217413897845242">Item rak 6</translation>
 <translation id="5341390997810576190">Gunakan kuota internet</translation>
 <translation id="5342091991439452114">PIN minimal harus <ph name="MINIMUM" /> digit</translation>
-<translation id="5342344590724511265">Masukan tab mogok.</translation>
 <translation id="5342451237681332106">Gunakan <ph name="PHONE_NAME" /></translation>
 <translation id="534916491091036097">Kurung buka</translation>
 <translation id="5350965906220856151">Aduh!</translation>
@@ -3216,6 +3209,7 @@
 <translation id="5764483294734785780">Sim&amp;pan audio sebagai...</translation>
 <translation id="57646104491463491">Tanggal Dimodifikasi</translation>
 <translation id="5764797882307050727">Harap kosongkan sebagian ruang di perangkat.</translation>
+<translation id="5765425701854290211">Maaf, beberapa file rusak dan update tidak berhasil. File yang telah Anda sinkronkan aman.</translation>
 <translation id="5765491088802881382">Jaringan tidak tersedia</translation>
 <translation id="5765780083710877561">Deskripsi:</translation>
 <translation id="5771585441665576801">Transliterasi (geia → γεια)</translation>
@@ -3258,7 +3252,7 @@
 <translation id="5829401023154985950">Kelola...</translation>
 <translation id="5830410401012830739">Mengelola setelan lokasi...</translation>
 <translation id="5830720307094128296">Simp&amp;an Laman Sebagai...</translation>
-<translation id="5832669303303483065">Tambahkan alamat jalan yang baru...</translation>
+<translation id="5832669303303483065">Tambahkan alamat baru...</translation>
 <translation id="5832805196449965646">Tambahkan Orang</translation>
 <translation id="583281660410589416">Tidak dikenal</translation>
 <translation id="5832965267196858040">Saluran ini tidak cocok digunakan di perangkat utama dan fitur serta aplikasi tertentu dapat mengalami kerusakan.</translation>
@@ -4431,6 +4425,7 @@
 <translation id="7615910377284548269">Mengelola pemblokiran plugin yang tidak dimasukkan kotak pasir...</translation>
 <translation id="7617366389578322136">Menyambungkan ke "<ph name="DEVICE_NAME" />"</translation>
 <translation id="761779991806306006">Tidak ada sandi yang tersimpan.</translation>
+<translation id="7622114377921274169">Mengisi daya.</translation>
 <translation id="7624154074265342755">Jaringan nirkabel</translation>
 <translation id="7624337243375417909">caps lock nonaktif</translation>
 <translation id="7627790789328695202">Ups, <ph name="FILE_NAME" /> sudah ada. Ganti nama dan coba lagi.</translation>
@@ -4870,6 +4865,7 @@
 <translation id="8270242299912238708">Dokumen PDF</translation>
 <translation id="827097179112817503">Tampilkan tombol beranda</translation>
 <translation id="8272443605911821513">Kelola ekstensi Anda dengan mengeklik Ekstensi pada menu "Alat lainnya".</translation>
+<translation id="8274924778568117936">Jangan menonaktifkan atau menutup <ph name="DEVICE_TYPE" /> Anda sampai proses update selesai. <ph name="DEVICE_TYPE" /> Anda akan dimulai ulang setelah proses instal selesai.</translation>
 <translation id="8275038454117074363">Impor</translation>
 <translation id="8276560076771292512">Kosongkan Cache dan Muat Ulang Keras</translation>
 <translation id="8279388322240498158">Keyboard berbasis Inggris Kurdi Sorani</translation>
@@ -5310,7 +5306,6 @@
 <translation id="8963572037665351978">Keluar dari Presentasi</translation>
 <translation id="8965037249707889821">Masukkan sandi lama</translation>
 <translation id="8965697826696209160">Ruang tidak cukup.</translation>
-<translation id="8968527460726243404">Penulis Gambar Sistem ChromeOS</translation>
 <translation id="8970203673128054105">Lihat daftar mode transmisi</translation>
 <translation id="89720367119469899">Escape</translation>
 <translation id="8972513834460200407">Hubungi administrator jaringan Anda untuk memastikan bahwa firewall tidak memblokir download dari server Google.</translation>
@@ -5485,6 +5480,7 @@
 <translation id="93766956588638423">Perbaiki ekstensi</translation>
 <translation id="938470336146445890">Instal sertifikat pengguna.</translation>
 <translation id="938582441709398163">Hamparan Keyboard</translation>
+<translation id="939519157834106403">SSID</translation>
 <translation id="939598580284253335">Masukkan frasa sandi</translation>
 <translation id="939736085109172342">Folder baru</translation>
 <translation id="940425055435005472">Ukuran font:</translation>
diff --git a/chrome/app/resources/generated_resources_it.xtb b/chrome/app/resources/generated_resources_it.xtb
index 68dbb9da..38658912 100644
--- a/chrome/app/resources/generated_resources_it.xtb
+++ b/chrome/app/resources/generated_resources_it.xtb
@@ -835,7 +835,6 @@
 <translation id="2224551243087462610">Modifica nome cartella</translation>
 <translation id="2226449515541314767">A questo sito è stato impedito il controllo totale dei dispositivi MIDI.</translation>
 <translation id="2226720438730111184">Spiegaci cosa succede</translation>
-<translation id="222903405933288376">Google utilizza la tua posizione per fornirti contenuti locali. Puoi modificare questa impostazione in <ph name="SETTINGS_LINK" />.</translation>
 <translation id="2229161054156947610">Più di un'ora rimanente</translation>
 <translation id="222931766245975952">File troncato</translation>
 <translation id="222949136907494149">L'<ph name="URL" /> chiede di utilizzare la posizione del tuo computer.</translation>
@@ -1087,7 +1086,6 @@
 <translation id="2575247648642144396">Questa icona sarà visibile quando l'estensione potrà agire sulla pagina corrente. Utilizza questa estensione facendo clic sull'icona o premendo <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="2576842806987913196">Esiste già un file CRX con questo nome.</translation>
 <translation id="2579575372772932244">Ricreazione del profilo in corso, attendi...</translation>
-<translation id="2580168606262715640">Impossibile trovare il telefono. Assicurati che sia a portata di mano.</translation>
 <translation id="2580889980133367162">Consenti sempre a <ph name="HOST" /> di scaricare più file</translation>
 <translation id="2580924999637585241">Totale: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">Lungo</translation>
@@ -2169,7 +2167,6 @@
 <translation id="4130207949184424187">Questa estensione ha cambiato la pagina mostrata quando esegui ricerche dalla omnibox.</translation>
 <translation id="413121957363593859">Componenti</translation>
 <translation id="4131410914670010031">In bianco e nero</translation>
-<translation id="4135054690906486073">Questa rete è condivisa con altri utenti</translation>
 <translation id="4135450933899346655">I tuoi certificati</translation>
 <translation id="4138267921960073861">Visualizza nomi e foto dell'utente sulla schermata di accesso</translation>
 <translation id="4140559601186535628">Messaggi push</translation>
@@ -2570,9 +2567,6 @@
 <translation id="4813345808229079766">Connessione</translation>
 <translation id="4813512666221746211">Errore di rete</translation>
 <translation id="4816492930507672669">Adatta alla pagina</translation>
-<translation id="4816617200045929931">Descrivi che cosa è accaduto esattamente prima che apparisse il messaggio di errore del profilo:
-
-****NON MODIFICARE DOPO QUESTA RIGA****</translation>
 <translation id="4820334425169212497">No, non lo vedo</translation>
 <translation id="4821086771593057290">La tua password è stata modificata. Riprova con la nuova password.</translation>
 <translation id="4821935166599369261">&amp;Profiling attivato</translation>
@@ -2937,7 +2931,6 @@
 <translation id="5340217413897845242">Elemento 6 della shelf</translation>
 <translation id="5341390997810576190">Utilizza la rete dati</translation>
 <translation id="5342091991439452114">Il PIN deve contenere almeno <ph name="MINIMUM" /> cifre</translation>
-<translation id="5342344590724511265">Feedback relativo agli arresti anomali delle schede.</translation>
 <translation id="5342451237681332106">Utilizza <ph name="PHONE_NAME" /></translation>
 <translation id="534916491091036097">Parent. sinistra</translation>
 <translation id="5350965906220856151">Spiacenti.</translation>
@@ -3209,6 +3202,7 @@
 <translation id="5764483294734785780">Sal&amp;va audio come...</translation>
 <translation id="57646104491463491">Data ultima modifica</translation>
 <translation id="5764797882307050727">Libera spazio sul dispositivo</translation>
+<translation id="5765425701854290211">Spiacenti, alcuni file erano danneggiati, pertanto l'aggiornamento non è andato a buon fine. I file sincronizzati sono al sicuro.</translation>
 <translation id="5765491088802881382">Nessuna rete disponibile</translation>
 <translation id="5765780083710877561">Descrizione:</translation>
 <translation id="5771585441665576801">Traslitterazione (geia → γεια)</translation>
@@ -4416,6 +4410,7 @@
 <translation id="7615910377284548269">Gestisci il blocco dei plug-in senza sandbox...</translation>
 <translation id="7617366389578322136">Collegamento a "<ph name="DEVICE_NAME" />"</translation>
 <translation id="761779991806306006">Nessuna password salvata.</translation>
+<translation id="7622114377921274169">In carica.</translation>
 <translation id="7624154074265342755">Reti wireless</translation>
 <translation id="7624337243375417909">bloc maiusc non attivo</translation>
 <translation id="7627790789328695202">Spiacenti. <ph name="FILE_NAME" /> esiste già. Rinominarlo e riprovare.</translation>
@@ -4855,6 +4850,7 @@
 <translation id="8270242299912238708">Documenti PDF</translation>
 <translation id="827097179112817503">Mostra pulsante Pagina iniziale</translation>
 <translation id="8272443605911821513">Gestisci le tue estensioni facendo clic su Estensioni nel menu "Altri strumenti".</translation>
+<translation id="8274924778568117936">Non spegnere o chiudere il tuo dispositivo <ph name="DEVICE_TYPE" /> fino al termine dell'aggiornamento. Il dispositivo <ph name="DEVICE_TYPE" /> si riavvierà al termine dell'installazione.</translation>
 <translation id="8275038454117074363">Importa</translation>
 <translation id="8276560076771292512">Svuota la cache e ricarica manualmente</translation>
 <translation id="8279388322240498158">Tastiera basata su inglese curdo sorani</translation>
@@ -5295,7 +5291,6 @@
 <translation id="8963572037665351978">Esci dalla presentazione</translation>
 <translation id="8965037249707889821">Inserisci vecchia password</translation>
 <translation id="8965697826696209160">Spazio insufficiente.</translation>
-<translation id="8968527460726243404">ChromeOS System Image Writer</translation>
 <translation id="8970203673128054105">Visualizza l'elenco della modalità di trasmissione</translation>
 <translation id="89720367119469899">Esc</translation>
 <translation id="8972513834460200407">Rivolgiti al tuo amministratore di rete per verificare che il firewall non blocchi i download dai server di Google.</translation>
@@ -5470,6 +5465,7 @@
 <translation id="93766956588638423">Ripara estensione</translation>
 <translation id="938470336146445890">Installa un certificato utente.</translation>
 <translation id="938582441709398163">Overlay tastiera</translation>
+<translation id="939519157834106403">SSID</translation>
 <translation id="939598580284253335">Inserisci passphrase</translation>
 <translation id="939736085109172342">Nuova cartella</translation>
 <translation id="940425055435005472">Dimensioni dei caratteri:</translation>
diff --git a/chrome/app/resources/generated_resources_iw.xtb b/chrome/app/resources/generated_resources_iw.xtb
index 045050b..b73622a9 100644
--- a/chrome/app/resources/generated_resources_iw.xtb
+++ b/chrome/app/resources/generated_resources_iw.xtb
@@ -831,7 +831,6 @@
 <translation id="2224551243087462610">ערוך את שם התיקייה</translation>
 <translation id="2226449515541314767">‏האפשרות לשלוט שליטה מלאה על מכשירי MIDI נחסמה עבור אתר זה.</translation>
 <translation id="2226720438730111184">ספר לנו מה קורה</translation>
-<translation id="222903405933288376">‏Google משתמשת במיקום שלך כדי להציג לך תוכן מקומי. אפשר לשנות את ההגדרה כאן: <ph name="SETTINGS_LINK" />.</translation>
 <translation id="2229161054156947610">נותרה יותר משעה אחת</translation>
 <translation id="222931766245975952">הקובץ נקטע</translation>
 <translation id="222949136907494149"><ph name="URL" /> רוצה להשתמש במיקום המחשב שלך.</translation>
@@ -1083,7 +1082,6 @@
 <translation id="2575247648642144396">סמל זה יוצג כאשר התוסף יכול לפעול בדף הנוכחי. השתמש בתוסף זה על ידי לחיצה על הסמל או על ידי הקשה על <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="2576842806987913196">‏כבר קיים קובץ CRX בשם זה.</translation>
 <translation id="2579575372772932244">יוצר מחדש את הפרופיל. המתן...</translation>
-<translation id="2580168606262715640">לא ניתן למצוא את הטלפון שלך. ודא שהוא נמצא בקרבתך.</translation>
 <translation id="2580889980133367162">תמיד אפשר ל-<ph name="HOST" /> להוריד קבצים מרובים</translation>
 <translation id="2580924999637585241">סך הכל: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">ארוכה</translation>
@@ -2167,7 +2165,6 @@
 <translation id="4130207949184424187">התוסף הזה שינה את הדף שמוצג כשאתה מבצע חיפוש מסרגל הכתובות.</translation>
 <translation id="413121957363593859">רכיבים</translation>
 <translation id="4131410914670010031">שחור ולבן</translation>
-<translation id="4135054690906486073">רשת זו משותפת עם משתמשים אחרים</translation>
 <translation id="4135450933899346655">האישורים שלך</translation>
 <translation id="4138267921960073861">הצג שמות משתמשים ותמונות במסך הכניסה</translation>
 <translation id="4140559601186535628">הודעות בדחיפה</translation>
@@ -2571,9 +2568,6 @@
 <translation id="4813345808229079766">התקשרות</translation>
 <translation id="4813512666221746211">שגיאת רשת</translation>
 <translation id="4816492930507672669">התאמה לדף</translation>
-<translation id="4816617200045929931">ספר לנו בדיוק מה קרה לפני שקיבלת את הודעת השגיאה בפרופיל:
-
-****אל תשנה את מה שמופיע מתחת לקו הזה****</translation>
 <translation id="4820334425169212497">לא, אני לא רואה אותו</translation>
 <translation id="4821086771593057290">הסיסמה שלך השתנתה. נסה שוב עם הסיסמה החדשה.</translation>
 <translation id="4821935166599369261">&amp;יצירת פרופילים מופעלת</translation>
@@ -2940,7 +2934,6 @@
 <translation id="5340217413897845242">פריט מדף 6</translation>
 <translation id="5341390997810576190">השתמש בנתונים סלולריים</translation>
 <translation id="5342091991439452114">‏ה-PIN חייב להיות באורך <ph name="MINIMUM" /> ספרות לפחות</translation>
-<translation id="5342344590724511265">משוב על כרטיסייה שקרסה.</translation>
 <translation id="5342451237681332106">השתמש ב-<ph name="PHONE_NAME" /></translation>
 <translation id="534916491091036097">צד שמאל של הסוגריים</translation>
 <translation id="5350965906220856151">אוי לא!</translation>
@@ -3212,6 +3205,7 @@
 <translation id="5764483294734785780">ש&amp;מור שמע כ...</translation>
 <translation id="57646104491463491">תארך השינוי</translation>
 <translation id="5764797882307050727">פנה שטח אחסון במכשיר.</translation>
+<translation id="5765425701854290211">אנחנו מצטערים, אבל חלק מהקבצים נפגמו והעדכון לא הצליח. הקבצים המסונכרנים שלך לא נפגעו.</translation>
 <translation id="5765491088802881382">אין רשת זמינה</translation>
 <translation id="5765780083710877561">תיאור:</translation>
 <translation id="5771585441665576801">‏תעתוק (geia → γεια)</translation>
@@ -4419,6 +4413,7 @@
 <translation id="7615910377284548269">נהל חסימה של יישומי פלאגין ללא ארגז חול...</translation>
 <translation id="7617366389578322136">מתחבר אל <ph name="DEVICE_NAME" /></translation>
 <translation id="761779991806306006">לא נשמרו סיסמאות.</translation>
+<translation id="7622114377921274169">בטעינה.</translation>
 <translation id="7624154074265342755">רשתות אלחוטיות</translation>
 <translation id="7624337243375417909">‏caps lock מושבת</translation>
 <translation id="7627790789328695202">אופס, <ph name="FILE_NAME" /> כבר קיים. שנה את השם שלו ונסה שוב.</translation>
@@ -4857,6 +4852,7 @@
 <translation id="8270242299912238708">‏מסמכי PDF</translation>
 <translation id="827097179112817503">הצג את לחצן 'דף הבית'</translation>
 <translation id="8272443605911821513">נהל את התוספים שלך על ידי לחיצה על 'תוספים' בתפריט 'כלים נוספים'.</translation>
+<translation id="8274924778568117936">אל תכבה או תסגור את ה-<ph name="DEVICE_TYPE" /> לפני סיום העדכון. ה-<ph name="DEVICE_TYPE" /> יופעל מחדש באופן אוטומטי בסיום ההתקנה.</translation>
 <translation id="8275038454117074363">ייבוא</translation>
 <translation id="8276560076771292512">ריקון המטמון וטעינה מחדש קשיחה</translation>
 <translation id="8279388322240498158">מקלדת כורדית סורנית המבוססת על אנגלית</translation>
@@ -5297,7 +5293,6 @@
 <translation id="8963572037665351978">צא ממצב מצגת</translation>
 <translation id="8965037249707889821">הזן את הסיסמה הישנה</translation>
 <translation id="8965697826696209160">אין מספיק שטח.</translation>
-<translation id="8968527460726243404">‏כותב תמונת המערכת של מערכת ההפעלה של Chrome</translation>
 <translation id="8970203673128054105">הצג רשימה של מצבי העברה</translation>
 <translation id="89720367119469899">Esc</translation>
 <translation id="8972513834460200407">‏פנה אל מנהל המערכת של הרשת שלך כדי לוודא שחומת האש אינה חוסמת הורדות משרתי Google.</translation>
@@ -5472,6 +5467,7 @@
 <translation id="93766956588638423">תקן את התוסף</translation>
 <translation id="938470336146445890">התקן אישור משתמש.</translation>
 <translation id="938582441709398163">שכבת-על של מקלדת</translation>
+<translation id="939519157834106403">SSID</translation>
 <translation id="939598580284253335">הזן משפט-סיסמה</translation>
 <translation id="939736085109172342">תיקייה חדשה</translation>
 <translation id="940425055435005472">גודל גופן:</translation>
diff --git a/chrome/app/resources/generated_resources_ja.xtb b/chrome/app/resources/generated_resources_ja.xtb
index b6fbf7aa..a495258 100644
--- a/chrome/app/resources/generated_resources_ja.xtb
+++ b/chrome/app/resources/generated_resources_ja.xtb
@@ -836,7 +836,6 @@
 <translation id="2224551243087462610">フォルダ名の編集</translation>
 <translation id="2226449515541314767">このサイトには MIDI デバイスのフル コントロールは許可されていません。</translation>
 <translation id="2226720438730111184">問題の詳細をお知らせください</translation>
-<translation id="222903405933288376">Google は地域のコンテンツを提供するために現在地を使用します。この設定は<ph name="SETTINGS_LINK" />で変更できます。</translation>
 <translation id="2229161054156947610">あと 1 時間以上</translation>
 <translation id="222931766245975952">ファイルの一部が削除されました</translation>
 <translation id="222949136907494149"><ph name="URL" /> ではパソコンの現在地情報が必要となります。</translation>
@@ -1088,7 +1087,6 @@
 <translation id="2575247648642144396">このアイコンは、表示中のページで拡張機能が使用できる場合に表示されます。この拡張機能を使用するには、アイコンをクリックするか、<ph name="EXTENSION_SHORTCUT" /> を押します。</translation>
 <translation id="2576842806987913196">既にこの名前の CRX ファイルが存在しています。</translation>
 <translation id="2579575372772932244">プロフィールを再作成しています。しばらくお待ちください...</translation>
-<translation id="2580168606262715640">スマートフォンが見つかりません。スマートフォンが手の届く範囲にあることを確認してください。</translation>
 <translation id="2580889980133367162">複数のファイルをダウンロードすることを <ph name="HOST" /> に常に許可する</translation>
 <translation id="2580924999637585241">印刷総数: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">長い</translation>
@@ -2173,7 +2171,6 @@
 <translation id="4130207949184424187">この拡張機能により、アドレスバーから検索したときに表示されるページが変更されました。</translation>
 <translation id="413121957363593859">コンポーネント</translation>
 <translation id="4131410914670010031">白黒</translation>
-<translation id="4135054690906486073">他のユーザーと共有中のネットワークです</translation>
 <translation id="4135450933899346655">ユーザーの証明書</translation>
 <translation id="4138267921960073861">ログイン ページにユーザー名と写真を表示する</translation>
 <translation id="4140559601186535628">プッシュ メッセージ</translation>
@@ -2577,9 +2574,6 @@
 <translation id="4813345808229079766">接続</translation>
 <translation id="4813512666221746211">ネットワーク エラー</translation>
 <translation id="4816492930507672669">ページサイズに合わせる</translation>
-<translation id="4816617200045929931">具体的にどのような操作を行ったときにプロフィール エラーのメッセージが表示されたかをお知らせください。
-
-****これより下は変更しないでください****</translation>
 <translation id="4820334425169212497">いいえ、表示されていません</translation>
 <translation id="4821086771593057290">パスワードが変更されました。新しいパスワードでもう一度お試しください。</translation>
 <translation id="4821935166599369261">プロファイル記録の開始(&amp;P)</translation>
@@ -2945,7 +2939,6 @@
 <translation id="5340217413897845242">シェルフ アイテム 6</translation>
 <translation id="5341390997810576190">モバイルデータを使用します</translation>
 <translation id="5342091991439452114">PIN は <ph name="MINIMUM" /> 桁以上で指定してください</translation>
-<translation id="5342344590724511265">タブのクラッシュに関するフィードバック。</translation>
 <translation id="5342451237681332106"><ph name="PHONE_NAME" /> を使用</translation>
 <translation id="534916491091036097">左かっこ</translation>
 <translation id="5350965906220856151">エラー。</translation>
@@ -3217,6 +3210,7 @@
 <translation id="5764483294734785780">名前を付けてオーディオを保存(&amp;V)...</translation>
 <translation id="57646104491463491">更新日</translation>
 <translation id="5764797882307050727">端末の空き容量を確保してください。</translation>
+<translation id="5765425701854290211">一部のファイルが破損しており、正常にアップデートできませんでした。同期ファイルは安全です。</translation>
 <translation id="5765491088802881382">ネットワークが利用できません</translation>
 <translation id="5765780083710877561">説明:</translation>
 <translation id="5771585441665576801">文字変換(geia → γεια)</translation>
@@ -4435,6 +4429,7 @@
 <translation id="7615910377284548269">サンドボックスの無効化プラグインのブロックを管理する... </translation>
 <translation id="7617366389578322136">「<ph name="DEVICE_NAME" />」に接続しています</translation>
 <translation id="761779991806306006">パスワードが保存されていません。</translation>
+<translation id="7622114377921274169">充電しています。</translation>
 <translation id="7624154074265342755">無線ネットワーク</translation>
 <translation id="7624337243375417909">CapsLock オフ</translation>
 <translation id="7627790789328695202"><ph name="FILE_NAME" /> は既に存在しています。名前を変更してもう一度お試しください。</translation>
@@ -4874,6 +4869,7 @@
 <translation id="8270242299912238708">PDF ドキュメント</translation>
 <translation id="827097179112817503">ホームボタンを表示する</translation>
 <translation id="8272443605911821513">拡張機能を管理するには、[その他のツール] メニューの [拡張機能] をクリックします。</translation>
+<translation id="8274924778568117936">アップデートが完了するまでは、<ph name="DEVICE_TYPE" /> の電源を切ったり蓋を閉じたりしないでください。インストールが完了すると、<ph name="DEVICE_TYPE" /> は再起動します。</translation>
 <translation id="8275038454117074363">インポート</translation>
 <translation id="8276560076771292512">キャッシュの消去とハード再読み込み</translation>
 <translation id="8279388322240498158">ソラニークルド語キーボード(英語ベース)</translation>
@@ -5314,7 +5310,6 @@
 <translation id="8963572037665351978">プレゼンテーションを終了</translation>
 <translation id="8965037249707889821">古いパスワードを入力</translation>
 <translation id="8965697826696209160">空き容量が不足しています。</translation>
-<translation id="8968527460726243404">ChromeOS システム イメージ ライター</translation>
 <translation id="8970203673128054105">キャストモード リストを表示</translation>
 <translation id="89720367119469899">エスケープ</translation>
 <translation id="8972513834460200407">ファイアウォールが Google のサーバーからのダウンロードをブロックしていないかどうかをネットワーク管理者に確認してください。</translation>
@@ -5489,6 +5484,7 @@
 <translation id="93766956588638423">拡張機能を修復</translation>
 <translation id="938470336146445890">ユーザー証明書をインストールしてください。</translation>
 <translation id="938582441709398163">キーボード オーバーレイ</translation>
+<translation id="939519157834106403">SSID</translation>
 <translation id="939598580284253335">パスフレーズを入力</translation>
 <translation id="939736085109172342">新しいフォルダ</translation>
 <translation id="940425055435005472">フォント サイズ:</translation>
diff --git a/chrome/app/resources/generated_resources_kn.xtb b/chrome/app/resources/generated_resources_kn.xtb
index eb92ea9..457f31a 100644
--- a/chrome/app/resources/generated_resources_kn.xtb
+++ b/chrome/app/resources/generated_resources_kn.xtb
@@ -624,6 +624,7 @@
 <translation id="1882130480443819387">ಶೀರ್ಷಿಕೆಯ ಪ್ರಕಾರ ವಿಂಗಡಿಸಿ</translation>
 <translation id="1886996562706621347">ಪ್ರೊಟೋಕಾಲ್‌ಗಳಿಗಾಗಿ ಡಿಫಾಲ್ಟ್ ಹ್ಯಾಂಡ್ಲರ್‌‌ಗಳಾಗಲು ಸೈಟ್‌ಗಳನ್ನು ಅನುಮತಿಸಿ (ಶಿಫಾರಸು ಮಾಡಲಾಗಿದೆ)</translation>
 <translation id="1887850431809612466">ಹಾರ್ಡ್‌ವೇರ್ ಪರಿಷ್ಕರಣೆ</translation>
+<translation id="1889984860246851556">ಪ್ರಾಕ್ಸಿ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ತೆರೆಯಿರಿ</translation>
 <translation id="1891668193654680795">ಸಾಫ್ಟ್‌ವೇರ್ ತಯಾರಕರನ್ನು ಗುರುತಿಸುವುದಕ್ಕಾಗಿ ಈ ಪ್ರಮಾಣಪತ್ರದ ಮೇಲೆ ವಿಶ್ವಾಸವಿಡಿ.</translation>
 <translation id="189210018541388520">ಪೂರ್ಣ ಪರದೆಯನ್ನು ತೆರೆಯಿರಿ</translation>
 <translation id="1893406696975231168">ಮೇಘ ಒದಗಿಸುವಿಕೆ ಫ್ಲೋ ವಿಫಲವಾಗಿದೆ</translation>
@@ -835,7 +836,6 @@
 <translation id="2224551243087462610">ಫೋಲ್ಡರ್ ಹೆಸರು ಎಡಿಟ್ ಮಾಡಿ</translation>
 <translation id="2226449515541314767">ಈ ಸೈಟ್ ಅನ್ನು MIDI ಸಾಧನಗಳ ಮೇಲೆ ಪೂರ್ಣ ನಿಯಂತ್ರಣ ಸಾಧಿಸುವುದರಿಂದ ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ.</translation>
 <translation id="2226720438730111184">ಏನಾಗುತ್ತಿದೆ ಎಂಬುದನ್ನು ನಮಗೆ ತಿಳಿಸಿ</translation>
-<translation id="222903405933288376">ನಿಮ್ಮ ಸ್ಥಳೀಯ ವಿಷಯವನ್ನು ನೀಡಲು ನಿಮ್ಮ ಸ್ಥಳವನ್ನು Google ಬಳಸುತ್ತದೆ. ನೀವು <ph name="SETTINGS_LINK" />ನಲ್ಲಿ ಇದನ್ನು ಬದಲಾಯಿಸಬಹುದು.</translation>
 <translation id="2229161054156947610">1 ಗಂಟೆಗಿಂತಲೂ ಹೆಚ್ಚು ಬಾಕಿ ಉಳಿದಿದೆ</translation>
 <translation id="222931766245975952">ಫೈಲ್ ಅನ್ನು ಮೊಟಕುಗೊಳಿಸಲಾಗಿದೆ</translation>
 <translation id="222949136907494149">ನಿಮ್ಮ ಕಂಪ್ಯೂಟರ್ ಸ್ಥಾನವನ್ನು ಬಳಸಲು <ph name="URL" /> ಬಯಸುತ್ತದೆ.</translation>
@@ -851,6 +851,7 @@
 <translation id="2241634353105152135">ಕೇವಲ ಒಂದು ಬಾರಿ</translation>
 <translation id="2242603986093373032">ಯಾವುದೇ ಸಾಧನಗಳಿಲ್ಲ</translation>
 <translation id="2242687258748107519">ಫೈಲ್ ಮಾಹಿತಿ</translation>
+<translation id="2245240762616536227">ಹುಡುಕಾಟ, ಜಾಹೀರಾತುಗಳು ಮತ್ತು ಇತರ Google ಸೇವೆಗಳನ್ನು ನಿಮ್ಮ ಬ್ರೌಸಿಂಗ್ ಇತಿಹಾಸ ಹೇಗೆ ವೈಯಕ್ತಿಕರಿಸುತ್ತದೆ ಎನ್ನುವುದನ್ನು ನಿಯಂತ್ರಿಸಿ</translation>
 <translation id="2246340272688122454">ಪುನರ್‌ಪ್ರಾಪ್ತಿ ಚಿತ್ರವನ್ನು ಡೌನ್‌ಲೋಡ್ ಮಾಡಲಾಗುತ್ತಿದೆ...</translation>
 <translation id="2249499294612408921">ನಿಮ್ಮ ಮಾರ್ಗದರ್ಶನದ ಮೂಲಕ ಮೇಲ್ವಿಚಾರಣೆಯ ಬಳಕೆದಾರರು ವೆಬ್ ಅನ್ನು ಎಕ್ಸ್‌ಪ್ಲೋರ್ ಮಾಡಬಹುದು. Chrome ನಲ್ಲಿ ಮೇಲ್ವಿಚಾರಣೆಯ ಬಳಕೆದಾರರ ನಿರ್ವಾಹಕರಾಗಿ, ನೀವು ಕೆಳಗಿನವುಗಳನ್ನು ಮಾಡಬಹುದು
 
@@ -1086,7 +1087,6 @@
 <translation id="2575247648642144396">ಪ್ರಸ್ತುತ ಪುಟದಲ್ಲಿ ವಿಸ್ತರಣೆಯು ಕಾರ್ಯನಿರ್ವಹಿಸಿದಾಗ ಈ ಐಕಾನ್ ಗೋಚರಿಸುತ್ತದೆ. ಐಕಾನ್‌ನ ಮೇಲೆ ಕ್ಲಿಕ್ ಮಾಡುವುದರ ಮೂಲಕ ಅಥವಾ <ph name="EXTENSION_SHORTCUT" /> ಒತ್ತುವುದರ ಮೂಲಕ ಈ ವಿಸ್ತರಣೆಯನ್ನು ಬಳಸಿ.</translation>
 <translation id="2576842806987913196">ಪ್ರಸ್ತುತ ಈ ಹೆಸರಿನೊಂದಿಗೆ ಈಗಾಗಲೇ CRX ಫೈಲ್ ಅಸ್ತಿತ್ವದಲ್ಲಿದೆ.</translation>
 <translation id="2579575372772932244">ಪ್ರೊಫೈಲ್ ಮರು ರಚಿಸಲಾಗುತ್ತಿದೆ, ದಯವಿಟ್ಟು ಕಾಯಿರಿ...</translation>
-<translation id="2580168606262715640">ನಿಮ್ಮ ಫೋನ್ ಪತ್ತೆ ಮಾಡಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ. ಇದು ನಿಮ್ಮ ಸಮೀಪ ಇದೆಯೇ ಎಂಬುದನ್ನು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ.</translation>
 <translation id="2580889980133367162">ಬಹು ಫೈಲ್‌ಗಳನ್ನು ಡೌನ್‌ಲೋಡ್ ಮಾಡಲು <ph name="HOST" /> ಗೆ ಎಲ್ಲಾ ಸಮಯದಲ್ಲೂ ಅನುಮತಿ ನೀಡಿ</translation>
 <translation id="2580924999637585241">ಒಟ್ಟು:<ph name="NUMBER_OF_SHEETS" /><ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">ದೀರ್ಘ</translation>
@@ -1377,6 +1377,7 @@
 <translation id="2966449113954629791">ನಿಮ್ಮ ಮೊಬೈಲ್ ಡೇಟಾ ಭತ್ಯೆಯನ್ನು ನೀವು ಬಳಸಿರಬಹುದು. ಹೆಚ್ಚಿನ ಡೇಟಾವನ್ನು ಖರೀದಿಸಲು <ph name="NAME" /> ಸಕ್ರಿಯೀಕರಣ ಪೋರ್ಟಲ್‌ಗೆ ಭೇಟಿ ನೀಡಿ.</translation>
 <translation id="2966459079597787514">ಸ್ವೀಡಿಶ್ ಕೀಬೋರ್ಡ್</translation>
 <translation id="2966598748518102999">Google ಗೆ "Ok Google," ಎಂಬ ಶಬ್ದ ಕಳುಹಿಸಿ. ಆ ಮೂಲಕ ಕೆಲವು ನಿಮಿಷಗಳ ನಂತರ ಧ್ವನಿ ಹುಡುಕಾಟವನ್ನು ಸುಧಾರಿಸಿ.</translation>
+<translation id="2966937470348689686">Android ಪ್ರಾಶಸ್ತ್ಯಗಳನ್ನು ನಿರ್ವಹಿಸಿ</translation>
 <translation id="2967544384642772068">ಸ್ಥಗಿತಗೊಳಿಸು</translation>
 <translation id="2971033837577180453">&lt;span&gt;ID:&lt;/span&gt;<ph name="EXTENSION_ID" /></translation>
 <translation id="2971213274238188218">ಪ್ರಖರತೆ ಕಡಿಮೆ ಮಾಡಿ</translation>
@@ -2134,6 +2135,7 @@
 <translation id="4087089424473531098">ವಿಸ್ತರಣೆಯನ್ನು ರಚಿಸಲಾಗಿದೆ:
 
 <ph name="EXTENSION_FILE" /></translation>
+<translation id="4087470595660267445">ನಿಮ್ಮ Chromebook ನಲ್ಲಿ Google Playಯಿಂದ ಅಪ್ಲಿಕೇಶನ್‌ಗಳನ್ನು ಮತ್ತು ಗೇಮ್‌ಗಳನ್ನು ಸ್ಥಾಪಿಸಿ. &lt;a target="_blank" href="<ph name="URL" />"&gt;ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ&lt;/a&gt;</translation>
 <translation id="4088095054444612037">ಗುಂಪಿಗಾಗಿ ಸ್ವೀಕರಿಸು</translation>
 <translation id="4089521618207933045">ಉಪಮೆನು ಹೊಂದಿದೆ</translation>
 <translation id="4090103403438682346">ಪರಿಶೀಲಿಸಿದ ಪ್ರವೇಶವನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ</translation>
@@ -2167,7 +2169,6 @@
 <translation id="4130207949184424187">ಆಮ್ನಿಬಾಕ್ಸ್‌ನಿಂದ ನೀವು ಹುಡುಕಿದಾಗ ತೋರಿಸಬೇಕಾದ ಪುಟವನ್ನು ಈ ವಿಸ್ತರಣೆಯು ಬದಲಾಯಿಸಿದೆ.</translation>
 <translation id="413121957363593859">ಘಟಕಾಂಶಗಳು</translation>
 <translation id="4131410914670010031">ಕಪ್ಪು ಮತ್ತು ಬಿಳುಪು</translation>
-<translation id="4135054690906486073">ಈ ನೆಟ್‌ವರ್ಕ್ ಅನ್ನು ಇತರೆ ಬಳಕೆದಾರರೊಂದಿಗೆ ಹಂಚಿಕೊಳ್ಳಲಾಗಿದೆ</translation>
 <translation id="4135450933899346655">ನಿಮ್ಮ ಪ್ರಮಾಣಪತ್ರಗಳು</translation>
 <translation id="4138267921960073861">ಬಳಕೆದಾರಹೆಸರುಗಳು ಮತ್ತು ಫೋಟೋಗಳನ್ನು ಸೈನ್-ಇನ್ ಪರದೆಯಲ್ಲಿ ತೋರಿಸು</translation>
 <translation id="4140559601186535628">ಪುಶ್‌ ಸಂದೇಶಗಳು</translation>
@@ -2572,9 +2573,6 @@
 <translation id="4813345808229079766">ಸಂಪರ್ಕ</translation>
 <translation id="4813512666221746211">ನೆಟ್‌ವರ್ಕ್  ದೋಷ</translation>
 <translation id="4816492930507672669">ಪುಟಕ್ಕೆ ಹೊಂದಿಸು</translation>
-<translation id="4816617200045929931">ನಿಮಗೆ ಪ್ರೊಫೈಲ್ ದೋಷ ಸಂದೇಶ ಕಂಡುಬಂದ ಮೊದಲು ನಿಖರವಾಗಿ ಏನಾಗಿತ್ತು ಎಂಬುದನ್ನು ನಮಗೆ ತಿಳಿಸಿ:
-
-****ಈ ಸಾಲಿನ ಕೆಳಗೆ ಬದಲಾಯಿಸಬೇಡಿ****</translation>
 <translation id="4820334425169212497">ಇಲ್ಲ, ನಾನು ಅದನ್ನು ನೋಡಿಲ್ಲ</translation>
 <translation id="4821086771593057290">ನಿಮ್ಮ ಪಾಸ್‌ವರ್ಡ್ ಬದಲಾಗಿದೆ. ದಯವಿಟ್ಟು ನಿಮ್ಮ ಹೊಸ ಪಾಸ್‌ವರ್ಡ್‌ನೊಂದಿಗೆ ಪುನಃ ಪ್ರಯತ್ನಿಸಿ.</translation>
 <translation id="4821935166599369261">&amp;ಪ್ರೊಫೈಲಿಂಗ್ ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ
@@ -2934,6 +2932,7 @@
 <translation id="5329858601952122676">&amp;ಅಳಿಸು</translation>
 <translation id="5330145655348521461">ಈ ಫೈಲ್‍‍ಗಳನ್ನು ವಿವಿಧ ಡೆಸ್ಕ್‌ಟಾಪ್‍‍ಗಳಲ್ಲಿ ತೆರೆಯಲಾಗಿದೆ. ಅದನ್ನು ವೀಕ್ಷಿಸಲು <ph name="USER_NAME" /> (<ph name="MAIL_ADDRESS" />) ಗೆ ಸರಿಸಿ.</translation>
 <translation id="5330512191124428349">ಮಾಹಿತಿ ಪಡೆಯಿರಿ</translation>
+<translation id="5331069282670671859">ಈ ವಿಭಾಗದಲ್ಲಿ ನೀವು ಯಾವುದೇ ಪ್ರಮಾಣಪತ್ರಗಳನ್ನು ಹೊಂದಿಲ್ಲ</translation>
 <translation id="5331425616433531170">"<ph name="CHROME_EXTENSION_NAME" />" ಜೋಡಿಸಲು ಬಯಸುತ್ತದೆ</translation>
 <translation id="5332624210073556029">ಸಮಯ ವಲಯ:</translation>
 <translation id="5334142896108694079">ಸ್ಕ್ರಿಪ್ಟ್ ಸಂಗ್ರಹ</translation>
@@ -2944,7 +2943,6 @@
 <translation id="5340217413897845242">ಶೆಲ್ಫ್ ಐಟಂ 6</translation>
 <translation id="5341390997810576190">ಸೆಲ್ಯುಲಾರ್ ಡೇಟಾ ಬಳಸಿ</translation>
 <translation id="5342091991439452114">ಪಿನ್ ಕನಿಷ್ಟ ಪಕ್ಷ <ph name="MINIMUM" /> ಅಂಕಿಗಳಾಗಿರಬೇಕು</translation>
-<translation id="5342344590724511265">ಟ್ಯಾಬ್ ಕ್ರ್ಯಾಶ್ ಮಾಡಲಾದ ಪ್ರತಿಕ್ರಿಯೆ.</translation>
 <translation id="5342451237681332106"><ph name="PHONE_NAME" /> ಬಳಸಿ</translation>
 <translation id="534916491091036097">ಎಡ ಆವರಣ</translation>
 <translation id="5350965906220856151">ಓಹ್‌ ಹೋ!</translation>
@@ -2982,6 +2980,7 @@
 <translation id="5399158067281117682">PIN ಗಳು ಹೊಂದಿಕೆಯಾಗುವುದಿಲ್ಲ!</translation>
 <translation id="5400640815024374115">ನಂಬಲರ್ಹ ಪ್ಲ್ಯಾಟ್‌ಫಾರ್ಮ್ ಮಾಡ್ಯೂಲ್ (TPM) ಚಿಪ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ ಅಥವಾ ಅದು ಅನುಪಸ್ಥಿತವಾಗಿದೆ.</translation>
 <translation id="5402367795255837559">ಬ್ರೈಲಿ</translation>
+<translation id="5402815541704507626">ಮೊಬೈಲ್ ಡೇಟಾ ಬಳಸಿಕೊಂಡು ಅಪ್‌ಡೇಟ್ ಡೌನ್‌ಲೋಡ್ ಮಾಡಿಕೊಳ್ಳಿ</translation>
 <translation id="540296380408672091"><ph name="HOST" /> ನಲ್ಲಿ ಕುಕೀಗಳನ್ನು ಯಾವಾಗಲೂ ನಿರ್ಬಂಧಿಸಿ</translation>
 <translation id="5408750356094797285">ಝೂಮ್: <ph name="PERCENT" /></translation>
 <translation id="5409029099497331039">ನನಗೆ ಆಶ್ಚರ್ಯ</translation>
@@ -3119,6 +3118,7 @@
 <translation id="558918721941304263">ಅಪ್ಲಿಕೇಶನ್‌ಗಳನ್ನು ಲೋಡ್ ಮಾಡಲಾಗುತ್ತಿದೆ...</translation>
 <translation id="5592595402373377407">ಇನ್ನೂ ಸಾಕಷ್ಟು ಡೇಟಾ ಲಭ್ಯವಿಲ್ಲ.</translation>
 <translation id="5595485650161345191">ವಿಳಾಸ ಎಡಿಟ್ ಮಾಡಿ</translation>
+<translation id="5600706100022181951"><ph name="UPDATE_SIZE_MB" /> MB ಮೊಬೈಲ್ ಡೇಟಾ ಬಳಸಿಕೊಂಡು ಅಪ್‌ಡೇಟ್ ಅನ್ನು ಡೌನ್‌ಲೋಡ್ ಮಾಡಲಾಗುತ್ತದೆ. ಮುಂದುವರಿಸಲು ನೀವು ಬಯಸುವಿರಾ?</translation>
 <translation id="5601503069213153581">PIN</translation>
 <translation id="5604324414379907186">ಯಾವಾಗಲೂ ಬುಕ್‌ಮಾರ್ಕ್‌ ಪಟ್ಟಿ ತೋರಿಸು</translation>
 <translation id="5605623530403479164">ಇತರ ಹುಡುಕಾಟದ ಇಂಜಿನ್‌ಗಳು</translation>
@@ -3215,6 +3215,7 @@
 <translation id="5764483294734785780">ಇದರಂತೆ ಆಡಿಯೋ ಉ&amp;ಳಿಸಿ...</translation>
 <translation id="57646104491463491">ದಿನಾಂಕ ಮಾರ್ಪಡಿಸಿದೆ</translation>
 <translation id="5764797882307050727">ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಸ್ವಲ್ಪ ಸ್ಥಳಾವಕಾಶ ಮಾಡಿ.</translation>
+<translation id="5765425701854290211">ಕ್ಷಮಿಸಿ, ಕೆಲವು ಫೈಲ್‌ಗಳು ಹಾನಿಗೊಳಗಾಗಿದ್ದವು ಮತ್ತು ಅಪ್‌ಡೇಟ್ ಪ್ರಕ್ರಿಯೆ ಯಶಸ್ವಿಯಾಗಿರಲಿಲ್ಲ. ನಿಮ್ಮ ಸಿಂಕ್ ಮಾಡಿದ ಫೈಲ್‌ಗಳು ಸುರಕ್ಷಿತವಾಗಿವೆ.</translation>
 <translation id="5765491088802881382">ಯಾವುದೇ ನೆಟ್‌ವರ್ಕ್‌ಗಳು ಲಭ್ಯವಿಲ್ಲ</translation>
 <translation id="5765780083710877561">ವಿವರಣೆ:</translation>
 <translation id="5771585441665576801">ಲಿಪ್ಯಂತರಣ (geia → γεια)</translation>
@@ -3228,6 +3229,7 @@
 <translation id="5778747455497889540">ನಿಮ್ಮ ಕಂಪ್ಯೂಟರ್‌ಗೆ ನಿಯೋಜಿಸಿರುವ, ರ‍್ಯಾಂಡಮ್‌‌ ಆಗಿ ರಚಿಸಲಾದ ಸುಭದ್ರ ಮಾಡ್ಯೂಲ್ ಪಾಸ್‌ವರ್ಡ್ ಅನ್ನು ಕೆಳಗೆ ಕೊಡಲಾಗಿದೆ:</translation>
 <translation id="5780066559993805332">(ಅತ್ಯುತ್ತಮ)</translation>
 <translation id="5780973441651030252">ಪ್ರಕ್ರಿಯೆಯ ಆದ್ಯತೆ</translation>
+<translation id="5781865261247219930"><ph name="EXTENSION_NAME" /> ಗೆ ಆದೇಶಗಳನ್ನು ಕಳುಹಿಸಿ</translation>
 <translation id="5783221160790377646">ದೋಷದ ಕಾರಣದಿಂದ, ಮೇಲ್ವಿಚಾರಣೆಯ ಬಳಕೆದಾರರನ್ನು ರಚಿಸಲಾಗಿಲ್ಲ. ದಯವಿಟ್ಟು ನಂತರ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ.</translation>
 <translation id="5783602409389152506">ಸಾಧನಗಳಿಗಾಗಿ ಸ್ಕ್ಯಾನ್ ಮಾಡುತ್ತಿರುವಾಗ...</translation>
 <translation id="57838592816432529">ಮ್ಯೂಟ್</translation>
@@ -3270,6 +3272,7 @@
 <translation id="5838825566232597749">US ವರ್ಕ್‌ಮ್ಯಾನ್ ಇಂಟರ್‌ನ್ಯಾಶನಲ್</translation>
 <translation id="5842497610951477805">ಬ್ಲೂಟೂತ್ ಸಕ್ರಿಯಗೊಳಿಸಿ</translation>
 <translation id="5846929185714966548">ಟ್ಯಾಬ್ 4</translation>
+<translation id="5848924408752252705">ಹಿಂತಿರುಗಲು ಸ್ಪರ್ಶಿಸಿ.</translation>
 <translation id="5848934677402291689">ಪ್ರಗತಿಯಲ್ಲಿರುವ PDF ಗೆ ಉಳಿಸಲಾಗುತ್ತಿದೆ</translation>
 <translation id="5849570051105887917">ಹೋಮ್ ಪೂರೈಕೆದಾರರ ಕೋಡ್</translation>
 <translation id="5849869942539715694">ಪ್ಯಾಕ್ ವಿಸ್ತರಣೆ...</translation>
@@ -3288,6 +3291,7 @@
 <translation id="5859272821192576954">Hangouts ನಲ್ಲಿ ಮುಂದುವರಿಸಲು ನೀವು ಸಿದ್ಧರಾಗಿರುವಿರಿ</translation>
 <translation id="5860033963881614850">ಆಫ್</translation>
 <translation id="5860209693144823476">ಟ್ಯಾಬ್ 3</translation>
+<translation id="5860491529813859533">ಆನ್ ಮಾಡಿ</translation>
 <translation id="5860494867054883682">ನಿಮ್ಮ ಸಾಧನವನ್ನು <ph name="CHANNEL_NAME" /> ಚಾನಲ್‌ಗೆ ಅಪ್‌ಡೇಟ್ ಮಾಡಲಾಗುತ್ತಿದೆ (<ph name="PROGRESS_PERCENT" />)</translation>
 <translation id="5862109781435984885">ಶೆಲ್ಫ್‌ನಲ್ಲಿ ಸ್ಟೈಲಸ್ ಪರಿಕರಗಳನ್ನು ತೋರಿಸಿ</translation>
 <translation id="58625595078799656"><ph name="PRODUCT_NAME" /> ರಲ್ಲಿ ನಿಮ್ಮ Google ಪಾಸ್‌ವರ್ಡ್ ಅಥವಾ ನಿಮ್ಮ ಸ್ವಂತ ಪಾಸ್‌ಫ್ರೇಸ್ ಬಳಸಿ ನಿಮ್ಮ ಡೇಟಾ ಎನ್‌ಕ್ರಿಪ್ಟ್ ಮಾಡುವುದು ಅವಶ್ಯಕ. </translation>
@@ -3618,6 +3622,7 @@
 <translation id="6395423953133416962"><ph name="BEGIN_LINK1" />ಸಿಸ್ಟಂ‌ ಮಾಹಿತಿ<ph name="END_LINK1" /> ಮತ್ತು <ph name="BEGIN_LINK2" />ಮೆಟ್ರಿಕ್‌ಗಳನ್ನು<ph name="END_LINK2" /> ಕಳುಹಿಸಿ</translation>
 <translation id="6397363302884558537">ಮಾತನಾಡುವುದನ್ನು ನಿಲ್ಲಿಸಿ</translation>
 <translation id="6397592254427394018">&amp;ಅಜ್ಞಾತ ವಿಂಡೋದಲ್ಲಿ ಎಲ್ಲ ಬುಕ್‌ಮಾರ್ಕ್‌ಗಳನ್ನು ತೆರೆಯಿರಿ</translation>
+<translation id="6398715114293939307">Google Play ಸ್ಟೋರ್ ತೆಗೆದುಹಾಕಿ</translation>
 <translation id="6398765197997659313">ಪೂರ್ಣಪರದೆಯಿಂದ ನಿರ್ಗಮಿಸಿ</translation>
 <translation id="6399774419735315745">ಸ್ಪೈ</translation>
 <translation id="6401445054534215853">ಶೆಲ್ಫ್ ಐಟಂ 1</translation>
@@ -4426,6 +4431,7 @@
 <translation id="7615910377284548269">ಸ್ಯಾಂಡ್‌ಬಾಕ್ಸ್ ರದ್ದುಗೊಳಿಸಲಾಗಿರುವ ಪ್ಲಗ್ಇನ್‌ ನಿರ್ಬಂಧಿಸುವಿಕೆಯನ್ನು ನಿರ್ವಹಿಸಿ...</translation>
 <translation id="7617366389578322136">"<ph name="DEVICE_NAME" />" ಗೆ ಸಂಪರ್ಕಿಸಲಾಗುತ್ತಿದೆ</translation>
 <translation id="761779991806306006">ಯಾವುದೇ ಪಾಸ್‌ವರ್ಡ್‌ಗಳನ್ನು ಉಳಿಸಿಲ್ಲ.</translation>
+<translation id="7622114377921274169">ಚಾರ್ಜ್ ಆಗುತ್ತಿದೆ.</translation>
 <translation id="7624154074265342755">ವೈರ್‌ಲೆಸ್ ನೆಟ್‌ವರ್ಕ್‌ಗಳು</translation>
 <translation id="7624337243375417909">caps lock ಆಫ್</translation>
 <translation id="7627790789328695202">ಓಹ್, <ph name="FILE_NAME" /> ಈಗಾಗಲೇ ಅಸ್ತಿತ್ವದಲ್ಲಿದೆ. ಅದನ್ನು ಮರುಹೆಸರಿಸಿ ಹಾಗೂ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ.</translation>
@@ -4861,6 +4867,7 @@
 <translation id="8270242299912238708">PDF ಡಾಕ್ಯುಮೆಂಟ್‌‌ಗಳು</translation>
 <translation id="827097179112817503">ಮುಖಪುಟ ಬಟನ್‌ ತೋರಿಸು</translation>
 <translation id="8272443605911821513">"ಹೆಚ್ಚಿನ ಪರಿಕರಗಳು" ಮೆನುನಲ್ಲಿರುವ ‘ವಿಸ್ತರಣೆಗಳು’ಕ್ಲಿಕ್ ಮಾಡುವ ಮೂಲಕ ನಿಮ್ಮ ವಿಸ್ತರಣೆಗಳನ್ನು ನಿರ್ವಹಿಸಿ.</translation>
+<translation id="8274924778568117936">ಅಪ್‌ಡೇಟ್ ಅಪ್‌ಡೇಟ್ ಮುಕ್ತಾಯಗೊಳ್ಳುವವರೆಗೆ <ph name="DEVICE_TYPE" /> ಅನ್ನು ಆಫ್ ಮಾಡಬೇಡಿ. ಸ್ಥಾಪನಾ ಪ್ರಕ್ರಿಯೆ ಪೂರ್ಣಗೊಂಡ ನಂತರ ನಿಮ್ಮ <ph name="DEVICE_TYPE" /> ಮರುಪ್ರಾರಂಭವಾಗುತ್ತದೆ.</translation>
 <translation id="8275038454117074363">ಆಮದು</translation>
 <translation id="8276560076771292512">ಖಾಲಿ ಸಂಗ್ರಹಣೆ ಮತ್ತು ಹಾರ್ಡ್ ಮರುಲೋಡ್</translation>
 <translation id="8279388322240498158">ಸೊರಾನಿ ಕುರ್ದಿಶ್ ಇಂಗ್ಲಿಷ್-ಮೂಲದ ಕೀಬೋರ್ಡ್</translation>
@@ -5303,9 +5310,9 @@
 <translation id="8960999352790021682">ಬೆಂಗಾಲಿ ಕೀಬೋರ್ಡ್ (ಫೋನೆಟಿಕ್)</translation>
 <translation id="8962083179518285172">ವಿವರಗಳನ್ನು ಮರೆಮಾಡಿ</translation>
 <translation id="8962198349065195967">ಈ ನೆಟ್‌ವರ್ಕ್ ಅನ್ನು ನಿಮ್ಮ ನಿರ್ವಾಹಕರಿಂದ ಕಾನ್ಫಿಗರ್ ಮಾಡಲಾಗಿದೆ</translation>
+<translation id="8963572037665351978">ಪ್ರಸ್ತುತಿಯಿಂದ ನಿರ್ಗಮಿಸಿ</translation>
 <translation id="8965037249707889821">ಹಳೆಯ ಪಾಸ್‌ವರ್ಡ್ ನಮೂದಿಸಿ</translation>
 <translation id="8965697826696209160">ಸಾಕಷ್ಟು ಸ್ಥಳಾವಕಾಶವಿಲ್ಲ.</translation>
-<translation id="8968527460726243404">ChromeOS ಸಿಸ್ಟಂ ಚಿತ್ರ ಬರೆಯುವಿಕೆ</translation>
 <translation id="8970203673128054105">ಬಿತ್ತರಿಸು ಮೋಡ್ ಪಟ್ಟಿ ವೀಕ್ಷಿಸಿ</translation>
 <translation id="89720367119469899">ಎಸ್ಕೇಪ್</translation>
 <translation id="8972513834460200407">Google ಸರ್ವರ್‌ಗಳಿಂದ ಮಾಡಲಾಗುವ ಡೌನ್‌ಲೋಡ್‌ಗಳನ್ನು ಫೈರ್‌‌ವಾಲ್‌ ನಿರ್ಬಂಧಿಸುತ್ತಿಲ್ಲ ಎಂಬುದನ್ನು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಲು ದಯವಿಟ್ಟು ನೀವು ನಿಮ್ಮ ನೆಟ್‌ವರ್ಕ್ ನಿರ್ವಾಹಕರೊಂದಿಗೆ ಚರ್ಚಿಸಿ.</translation>
@@ -5458,6 +5465,7 @@
 <translation id="9188441292293901223">ದಯವಿಟ್ಟು ಈ <ph name="DEVICE_TYPE" /> ಅನ್ನು ಅನ್‌ಲಾಕ್‌ ಮಾಡಲು Android ಹೊಸ ಆವೃತ್ತಿಗೆ ನಿಮ್ಮ ಫೋನ್‌ ನವೀಕರಿಸಿ.</translation>
 <translation id="9189690067274055051">ನಮೂದಿಸಲು ನಿಮ್ಮ ಫೋನ್ ಅನ್ನು ಅನ್‌ಲಾಕ್ ಮಾಡಿ ಮತ್ತು ಅದನ್ನು ನಿಮ್ಮ <ph name="DEVICE_TYPE" /> ಸಾಧನದ ಹತ್ತಿರ ಇರಿಸಿ.</translation>
 <translation id="9190063653747922532">L2TP/IPSec + ಪೂರ್ವ ಹಂಚಿತ ಕೀಲಿ</translation>
+<translation id="920045321358709304"><ph name="SEARCH_ENGINE" /> ಹುಡುಕಿ</translation>
 <translation id="9201305942933582053">Chrome ಗಾಗಿ Google Now!</translation>
 <translation id="9203398526606335860">&amp;ಪ್ರೊಫೈಲಿಂಗ್ ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ
 </translation>
@@ -5481,6 +5489,7 @@
 <translation id="93766956588638423">ವಿಸ್ತರಣೆ ದುರಸ್ತಿಪಡಿಸಿ</translation>
 <translation id="938470336146445890">ದಯವಿಟ್ಟು ಬಳಕೆದಾರ ಪ್ರಮಾಣಪತ್ರವನ್ನು ಸ್ಥಾಪಿಸಿ.</translation>
 <translation id="938582441709398163">ಕೀಬೋರ್ಡ್ ಒವರ್‌ಲೇ</translation>
+<translation id="939519157834106403">SSID</translation>
 <translation id="939598580284253335">ಪಾಸ್‌ಫ್ರೇಸ್ ಅನ್ನು ನಮೂದಿಸಿ</translation>
 <translation id="939736085109172342">ಹೊಸ ಫೋಲ್ಡರ್</translation>
 <translation id="940425055435005472">ಫಾಂಟ್ ಗಾತ್ರ:</translation>
@@ -5491,6 +5500,7 @@
 <translation id="946810925362320585">ಶಿಫಾರಸನ್ನು ಅನುಸರಿಸಿ</translation>
 <translation id="951981865514037445">ನಿಮ್ಮ ಸಾಧನಗಳ ಸ್ಥಾನವನ್ನು ಬಳಸಲು <ph name="URL" /> ಬಯಸುತ್ತದೆ.</translation>
 <translation id="952992212772159698">ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿಲ್ಲ</translation>
+<translation id="958515377357646513">ಮುಂದಕ್ಕೆ ಹೋಗಲು ಸ್ಪರ್ಶಿಸಿ.</translation>
 <translation id="960719561871045870">ಆಪರೇಟರ್ ಕೋಡ್</translation>
 <translation id="960987915827980018">ಸುಮಾರು 1 ಗಂಟೆ ಉಳಿದಿದೆ</translation>
 <translation id="96421021576709873">ವೈ-ಫೈ ನೆಟ್‌ವರ್ಕ್‌</translation>
diff --git a/chrome/app/resources/generated_resources_ko.xtb b/chrome/app/resources/generated_resources_ko.xtb
index 3b5184c..7f030c9 100644
--- a/chrome/app/resources/generated_resources_ko.xtb
+++ b/chrome/app/resources/generated_resources_ko.xtb
@@ -837,7 +837,6 @@
 <translation id="2224551243087462610">폴더 이름 수정</translation>
 <translation id="2226449515541314767">이 사이트는 MIDI 기기를 완전히 제어할 수 없도록 차단되었습니다.</translation>
 <translation id="2226720438730111184">어떤 문제인지 알려주세요.</translation>
-<translation id="222903405933288376">Google에서는 사용자 위치를 사용하여 현지 콘텐츠를 제공합니다. <ph name="SETTINGS_LINK" />에서 이 설정을 변경할 수 있습니다.</translation>
 <translation id="2229161054156947610">1시간 이상 남음</translation>
 <translation id="222931766245975952">파일이 잘림</translation>
 <translation id="222949136907494149"><ph name="URL" />에서 내 컴퓨터의 위치에 액세스하려고 합니다.</translation>
@@ -1089,7 +1088,6 @@
 <translation id="2575247648642144396">현재 페이지에서 확장 프로그램을 실행할 수 있으면 아이콘이 표시됩니다. 아이콘을 클릭하거나 <ph name="EXTENSION_SHORTCUT" />을(를) 눌러 확장 프로그램을 사용합니다.</translation>
 <translation id="2576842806987913196">동일한 이름의 CRX 파일이 이미 있습니다.</translation>
 <translation id="2579575372772932244">프로필을 다시 만드는 중입니다. 잠시 기다려 주세요.</translation>
-<translation id="2580168606262715640">휴대전화를 찾을 수 없습니다. 휴대전화가 손에 닿는 거리에 있는지 확인하세요.</translation>
 <translation id="2580889980133367162"><ph name="HOST" />에서 여러 파일을 다운로드할 수 있도록 항상 허용</translation>
 <translation id="2580924999637585241">합계: <ph name="NUMBER_OF_SHEETS" /><ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">길게</translation>
@@ -2173,7 +2171,6 @@
 <translation id="4130207949184424187">검색주소창에서 검색하면 표시되는 페이지가 이 확장 프로그램으로 인해 변경되었습니다.</translation>
 <translation id="413121957363593859">컴포넌트</translation>
 <translation id="4131410914670010031">흑백</translation>
-<translation id="4135054690906486073">다른 사용자와 공유 중인 네트워크입니다.</translation>
 <translation id="4135450933899346655">내 인증서</translation>
 <translation id="4138267921960073861">로그인 화면에 사용자 이름과 사진 표시</translation>
 <translation id="4140559601186535628">푸시 메시지</translation>
@@ -2577,9 +2574,6 @@
 <translation id="4813345808229079766">연결</translation>
 <translation id="4813512666221746211">네트워크 오류</translation>
 <translation id="4816492930507672669">페이지 맞춤</translation>
-<translation id="4816617200045929931">프로필 오류 메시지가 표시되기 전에 정확히 무슨 일이 있었는지 알려주세요.
-
-****이 선 아래 내용을 변경하지 마세요****</translation>
 <translation id="4820334425169212497">아니요, 표시되지 않습니다.</translation>
 <translation id="4821086771593057290">비밀번호가 변경되었습니다. 새 비밀번호로 다시 시도해 주세요.</translation>
 <translation id="4821935166599369261">프로파일링 사용(&amp;P)</translation>
@@ -2945,7 +2939,6 @@
 <translation id="5340217413897845242">서가 항목 6</translation>
 <translation id="5341390997810576190">모바일 데이터 사용</translation>
 <translation id="5342091991439452114">PIN은 <ph name="MINIMUM" />자리 이상이어야 합니다.</translation>
-<translation id="5342344590724511265">탭 다운 관련 피드백</translation>
 <translation id="5342451237681332106"><ph name="PHONE_NAME" /> 사용</translation>
 <translation id="534916491091036097">왼쪽 괄호</translation>
 <translation id="5350965906220856151">오류 발생</translation>
@@ -3217,6 +3210,7 @@
 <translation id="5764483294734785780">오디오를 다른 이름으로 저장...(&amp;V)</translation>
 <translation id="57646104491463491">수정된 날짜</translation>
 <translation id="5764797882307050727">기기의 저장용량을 확보하세요.</translation>
+<translation id="5765425701854290211">죄송합니다. 일부 파일이 손상되어 업데이트에 실패했습니다. 동기화된 파일은 안전하게 유지됩니다.</translation>
 <translation id="5765491088802881382">사용할 수 있는 네트워크가 없습니다.</translation>
 <translation id="5765780083710877561">설명:</translation>
 <translation id="5771585441665576801">음역(geia → γεια)</translation>
@@ -4432,6 +4426,7 @@
 <translation id="7615910377284548269">샌드박스 처리되지 않은 플러그인 차단 관리...</translation>
 <translation id="7617366389578322136">'<ph name="DEVICE_NAME" />'에 연결 중입니다.</translation>
 <translation id="761779991806306006">저장된 비밀번호가 없습니다.</translation>
+<translation id="7622114377921274169">충전 중</translation>
 <translation id="7624154074265342755">무선 네트워크</translation>
 <translation id="7624337243375417909">Caps Lock 사용 안함</translation>
 <translation id="7627790789328695202"><ph name="FILE_NAME" />이(가) 이미 있습니다. 이름을 변경한 후 다시 시도해 주세요.</translation>
@@ -4872,6 +4867,7 @@
 <translation id="8270242299912238708">PDF 문서</translation>
 <translation id="827097179112817503">홈 버튼 표시</translation>
 <translation id="8272443605911821513">'추가 도구' 메뉴에서 확장 프로그램을 클릭하여 확장 프로그램을 관리할 수 있습니다.</translation>
+<translation id="8274924778568117936">업데이트가 완료될 때까지 <ph name="DEVICE_TYPE" />을(를) 끄거나 닫지 마세요. 설치가 완료되면 <ph name="DEVICE_TYPE" />이(가) 다시 시작됩니다.</translation>
 <translation id="8275038454117074363">가져오기</translation>
 <translation id="8276560076771292512">캐시 비우기 및 강력 새로고침</translation>
 <translation id="8279388322240498158">소라니 쿠르드어 영어 기반 키보드</translation>
@@ -5313,7 +5309,6 @@
 <translation id="8963572037665351978">프레젠테이션 종료</translation>
 <translation id="8965037249707889821">이전 비밀번호 입력</translation>
 <translation id="8965697826696209160">저장 공간이 부족합니다.</translation>
-<translation id="8968527460726243404">ChromeOS 시스템 이미지 작성기</translation>
 <translation id="8970203673128054105">전송 모드 목록 보기</translation>
 <translation id="89720367119469899">Esc</translation>
 <translation id="8972513834460200407">네트워크 관리자에게 문의하여 방화벽이 Google 서버에서 다운로드를 차단하지 않는지 확인하시기 바랍니다.</translation>
@@ -5489,6 +5484,7 @@
 <translation id="93766956588638423">확장 프로그램 복구</translation>
 <translation id="938470336146445890">사용자 인증서를 설치하세요.</translation>
 <translation id="938582441709398163">키보드 오버레이</translation>
+<translation id="939519157834106403">SSID</translation>
 <translation id="939598580284253335">암호 입력</translation>
 <translation id="939736085109172342">새 폴더</translation>
 <translation id="940425055435005472">글꼴 크기:</translation>
diff --git a/chrome/app/resources/generated_resources_lt.xtb b/chrome/app/resources/generated_resources_lt.xtb
index 704cb6c..84ceffa1 100644
--- a/chrome/app/resources/generated_resources_lt.xtb
+++ b/chrome/app/resources/generated_resources_lt.xtb
@@ -836,7 +836,6 @@
 <translation id="2224551243087462610">Redaguoti aplanko pavadinimą</translation>
 <translation id="2226449515541314767">Ši svetainė užblokuota, kad negalėtų visiškai valdyti MIDI įrenginių.</translation>
 <translation id="2226720438730111184">Aprašykite problemą</translation>
-<translation id="222903405933288376">„Google“ naudoja jūsų vietovę, kad pateiktų vietinį turinį. Tai galite pakeisti nuėję į <ph name="SETTINGS_LINK" />.</translation>
 <translation id="2229161054156947610">Liko daugiau nei 1 val.</translation>
 <translation id="222931766245975952">Failas sutrumpintas</translation>
 <translation id="222949136907494149"><ph name="URL" /> norima naudoti kompiuterio vietą.</translation>
@@ -1088,7 +1087,6 @@
 <translation id="2575247648642144396">Ši piktograma bus matoma, kai plėtinys galės veikti dabartiniame puslapyje. Naudokite šį plėtinį spustelėję piktogramą arba paspaudę <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="2576842806987913196">CRX failas tokiu pavadinimu jau yra.</translation>
 <translation id="2579575372772932244">Iš naujo kuriamas profilis, palaukite...</translation>
-<translation id="2580168606262715640">Nepavyko surasti jūsų telefono. Įsitikinkite, kad jis netoliese.</translation>
 <translation id="2580889980133367162">Visada leisti <ph name="HOST" /> atsisiųsti kelis failus</translation>
 <translation id="2580924999637585241">Iš viso: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">Ilga</translation>
@@ -2173,7 +2171,6 @@
 <translation id="4130207949184424187">Šis plėtinys pakeitė, kuris puslapis rodomas ieškant „Omnibox“.</translation>
 <translation id="413121957363593859">Komponentai</translation>
 <translation id="4131410914670010031">Nespalvotai</translation>
-<translation id="4135054690906486073">Šis tinklas bendrinamas su kitais naudotojais</translation>
 <translation id="4135450933899346655">Jūsų sertifikatai</translation>
 <translation id="4138267921960073861">Rodyti naudotojų vardus ir nuotraukas prisijungimo ekrane</translation>
 <translation id="4140559601186535628">„Push“ pranešimai</translation>
@@ -2577,9 +2574,6 @@
 <translation id="4813345808229079766">Ryšys</translation>
 <translation id="4813512666221746211">Tinklo klaida</translation>
 <translation id="4816492930507672669">Pritaikyti pagal puslapį</translation>
-<translation id="4816617200045929931">Papasakokite, kas tiksliai vyko prieš tai, kai buvo parodytas profilio klaidos pranešimas:
-
-****DO NOT CHANGE BELOW THIS LINE****</translation>
 <translation id="4820334425169212497">Ne, nematau</translation>
 <translation id="4821086771593057290">Slaptažodis pakeistas. Bandykite dar kartą nurodydami naują slaptažodį.</translation>
 <translation id="4821935166599369261">&amp;Profiliavimas įgalintas</translation>
@@ -2945,7 +2939,6 @@
 <translation id="5340217413897845242">6 lentynos elementas</translation>
 <translation id="5341390997810576190">Naudoti mobiliojo ryšio duomenis</translation>
 <translation id="5342091991439452114">PIN kodą turi sudaryti bent <ph name="MINIMUM" /> skaitm.</translation>
-<translation id="5342344590724511265">Atsiliepimai dėl užstrigusio skirtuko.</translation>
 <translation id="5342451237681332106">Naudoti „<ph name="PHONE_NAME" />“</translation>
 <translation id="534916491091036097">Kairysis skliaust.</translation>
 <translation id="5350965906220856151">Oi!</translation>
@@ -3218,6 +3211,7 @@
 <translation id="5764483294734785780">Iš&amp;saugoti garso įrašą kaip...</translation>
 <translation id="57646104491463491">Koregavimo data</translation>
 <translation id="5764797882307050727">Atlaisvinkite vietos įrenginyje.</translation>
+<translation id="5765425701854290211">Deja, kai kurie failai buvo pažeisti ir atnaujinimo procesas nebuvo sėkmingas. Sinchronizuoti failai yra saugūs.</translation>
 <translation id="5765491088802881382">Nėra pasiekiamų tinklų</translation>
 <translation id="5765780083710877561">Aprašas:</translation>
 <translation id="5771585441665576801">Transliteracija (geia → γεια)</translation>
@@ -4435,6 +4429,7 @@
 <translation id="7615910377284548269">Tvarkyti ne „smėlio dėžės“ papildinių blokavimą...</translation>
 <translation id="7617366389578322136">Prisijungiama prie „<ph name="DEVICE_NAME" />“</translation>
 <translation id="761779991806306006">Neišsaugota jokių slaptažodžių.</translation>
+<translation id="7622114377921274169">Įkraunama.</translation>
 <translation id="7624154074265342755">Belaidžiai tinklai</translation>
 <translation id="7624337243375417909">didžiųjų raidžių režimas išjungtas</translation>
 <translation id="7627790789328695202">Oi, „<ph name="FILE_NAME" />“ jau yra. Pervardykite jį ir bandykite dar kartą.</translation>
@@ -4875,6 +4870,7 @@
 <translation id="8270242299912238708">PDF dokumentai</translation>
 <translation id="827097179112817503">Rodyti mygtuką „Pagrindinis“</translation>
 <translation id="8272443605911821513">Tvarkykite plėtinius meniu „Daugiau įrankių“ spustelėję „Plėtiniai“.</translation>
+<translation id="8274924778568117936">Neišjunkite ar neuždarykite „<ph name="DEVICE_TYPE" />“, kol atnaujinimo procesas nebus baigtas. Kai diegimo procesas baigsis, „<ph name="DEVICE_TYPE" />“ bus paleistas iš naujo.</translation>
 <translation id="8275038454117074363">Importuoti</translation>
 <translation id="8276560076771292512">Tuščia talpykla ir priverstinis įkėlimas iš naujo</translation>
 <translation id="8279388322240498158">Soranių kurdų angliška klaviatūra</translation>
@@ -5316,7 +5312,6 @@
 <translation id="8963572037665351978">Išeiti iš pristatymo</translation>
 <translation id="8965037249707889821">Įveskite seną slaptažodį</translation>
 <translation id="8965697826696209160">Nepakanka vietos.</translation>
-<translation id="8968527460726243404">„ChromeOS“ sistemos turinio kopijos rašymo priemonė</translation>
 <translation id="8970203673128054105">Peržiūrėti perdavimo režimo sąrašą</translation>
 <translation id="89720367119469899">Grįžimo klavišas</translation>
 <translation id="8972513834460200407">Paklauskite tinklo administratoriaus, kad įsitikintumėte, jog užkarda neblokuoja atsisiuntimų iš „Google“ serverių.</translation>
@@ -5492,6 +5487,7 @@
 <translation id="93766956588638423">Pataisyti plėtinį</translation>
 <translation id="938470336146445890">Įdiekite naudotojo sertifikatą.</translation>
 <translation id="938582441709398163">Klaviatūros perdanga</translation>
+<translation id="939519157834106403">SSID</translation>
 <translation id="939598580284253335">Įvesti slaptafrazę</translation>
 <translation id="939736085109172342">Naujas aplankas</translation>
 <translation id="940425055435005472">Šrifto dydis:</translation>
diff --git a/chrome/app/resources/generated_resources_lv.xtb b/chrome/app/resources/generated_resources_lv.xtb
index c9e3ed9..d49f1e6 100644
--- a/chrome/app/resources/generated_resources_lv.xtb
+++ b/chrome/app/resources/generated_resources_lv.xtb
@@ -836,7 +836,6 @@
 <translation id="2224551243087462610">Rediģēt mapes nosaukumu</translation>
 <translation id="2226449515541314767">Šajā vietnē ir bloķēta MIDI ierīču pilnīga pārvaldība.</translation>
 <translation id="2226720438730111184">Aprakstiet problēmu.</translation>
-<translation id="222903405933288376">Google izmanto jūsu atrašanās vietu, lai piedāvātu vietējo saturu. Varat to mainīt šeit: <ph name="SETTINGS_LINK" />.</translation>
 <translation id="2229161054156947610">Atlikusi vairāk nekā 1 stunda</translation>
 <translation id="222931766245975952">Fails ir saīsināts</translation>
 <translation id="222949136907494149"><ph name="URL" /> vēlas izmantot jūsu datora atrašanās vietu.</translation>
@@ -1088,7 +1087,6 @@
 <translation id="2575247648642144396">Šī ikona ir redzama, ja pašlaik atvērtajā lapā var lietot paplašinājumu. Lai lietotu šo paplašinājumu, noklikšķiniet uz ikonas vai nospiediet taustiņu kombināciju <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="2576842806987913196">CRX fails ar šādu nosaukumu jau pastāv.</translation>
 <translation id="2579575372772932244">Notiek atkārtota profila izveide. Lūdzu, uzgaidiet...</translation>
-<translation id="2580168606262715640">Nevar atrast jūsu tālruni. Tam ir jāatrodas izstieptas rokas attālumā.</translation>
 <translation id="2580889980133367162">Vienmēr ļaut saimniekdatoram <ph name="HOST" /> lejupielādēt vairākus failus</translation>
 <translation id="2580924999637585241">Kopā: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">Ilgi</translation>
@@ -2174,7 +2172,6 @@
 <translation id="4130207949184424187">Šis paplašinājums mainīja iestatījumu, kura lapa tiek parādīta, kad veicat meklēšanu, izmantojot universālo lodziņu.</translation>
 <translation id="413121957363593859">Komponenti</translation>
 <translation id="4131410914670010031">Melnbaltā</translation>
-<translation id="4135054690906486073">Šo tīklu izmanto arī citi lietotāji.</translation>
 <translation id="4135450933899346655">Jūsu sertifikāti</translation>
 <translation id="4138267921960073861">Rādīt lietotājvārdus un fotoattēlus pierakstīšanās ekrānā</translation>
 <translation id="4140559601186535628">Pašpiegādes ziņojumi</translation>
@@ -2578,9 +2575,6 @@
 <translation id="4813345808229079766">Savienojums</translation>
 <translation id="4813512666221746211">Tīkla kļūda</translation>
 <translation id="4816492930507672669">Ietilpināt lapā</translation>
-<translation id="4816617200045929931">Pastāstiet, kas notika tieši pirms tam, kad tika parādīts profila kļūdas ziņojums.
-
-****NEVEICIET IZMAIŅAS ZEM ŠĪS LĪNIJAS****</translation>
 <translation id="4820334425169212497">Nē, es to neredzu</translation>
 <translation id="4821086771593057290">Jūsu parole ir mainījusies. Mēģiniet vēlreiz, izmantojot jauno paroli.</translation>
 <translation id="4821935166599369261">%Profilēšana iespējota</translation>
@@ -2946,7 +2940,6 @@
 <translation id="5340217413897845242">6. plaukta vienums</translation>
 <translation id="5341390997810576190">tiks izmantoti mobilie dati;</translation>
 <translation id="5342091991439452114">PIN kodā ir jābūt vismaz <ph name="MINIMUM" /> cipariem.</translation>
-<translation id="5342344590724511265">Atsauksme par cilnes avāriju.</translation>
 <translation id="5342451237681332106">Izmantot tālruni <ph name="PHONE_NAME" /></translation>
 <translation id="534916491091036097">Kreisā iek.</translation>
 <translation id="5350965906220856151">Kļūda!</translation>
@@ -3218,6 +3211,7 @@
 <translation id="5764483294734785780">S&amp;aglabāt audio kā...</translation>
 <translation id="57646104491463491">Modificētais datums</translation>
 <translation id="5764797882307050727">Lūdzu, atbrīvojiet vietu savā ierīcē.</translation>
+<translation id="5765425701854290211">Diemžēl daži faili bija bojāti, un atjaunināšana nebija sekmīga. Jūsu sinhronizētie faili ir drošībā.</translation>
 <translation id="5765491088802881382">Nav pieejamu tīklu</translation>
 <translation id="5765780083710877561">Apraksts:</translation>
 <translation id="5771585441665576801">Transliterācija (geia → γεια)</translation>
@@ -4434,6 +4428,7 @@
 <translation id="7615910377284548269">Pārvaldīt tādu spraudņu bloķēšanu, kas nav ievietoti smilškastē...</translation>
 <translation id="7617366389578322136">Notiek savienojuma izveide ar ierīci <ph name="DEVICE_NAME" />.</translation>
 <translation id="761779991806306006">Nav nevienas saglabātas paroles.</translation>
+<translation id="7622114377921274169">Notiek uzlāde.</translation>
 <translation id="7624154074265342755">Bezvadu tīkli</translation>
 <translation id="7624337243375417909">burtslēga taustiņš izslēgts</translation>
 <translation id="7627790789328695202">Diemžēl fails <ph name="FILE_NAME" /> jau pastāv. Pārdēvējiet to un mēģiniet vēlreiz.</translation>
@@ -4873,6 +4868,7 @@
 <translation id="8270242299912238708">PDF dokumenti</translation>
 <translation id="827097179112817503">Rādīt pogu Sākums</translation>
 <translation id="8272443605911821513">Pārvaldiet savus paplašinājumus, izvēlnē “Citi rīki” noklikšķinot uz Paplašinājumi.</translation>
+<translation id="8274924778568117936">Neizslēdziet un neaizveriet savu <ph name="DEVICE_TYPE" /> ierīci, kamēr notiek atjaunināšana. Pēc instalēšanas pabeigšanas jūsu <ph name="DEVICE_TYPE" /> ierīce tiks restartēta.</translation>
 <translation id="8275038454117074363">Importēt</translation>
 <translation id="8276560076771292512">Iztīrīt kešatmiņu un veikt stingro atkārtoto ielādi</translation>
 <translation id="8279388322240498158">Uz angļu valodu balstīta kurdu (Sorani) tastatūra</translation>
@@ -5314,7 +5310,6 @@
 <translation id="8963572037665351978">Iziet no prezentācijas</translation>
 <translation id="8965037249707889821">Ievadiet veco paroli</translation>
 <translation id="8965697826696209160">Nepietiek vietas.</translation>
-<translation id="8968527460726243404">ChromeOS sistēmas attēla rakstītājs</translation>
 <translation id="8970203673128054105">Skatīt apraides režīmu sarakstu</translation>
 <translation id="89720367119469899">Escape</translation>
 <translation id="8972513834460200407">Lūdzu, sazinieties ar savu tīkla administratoru, lai pārliecinātos, vai ugunsmūris nebloķē lejupielādes no Google serveriem.</translation>
@@ -5490,6 +5485,7 @@
 <translation id="93766956588638423">Labot paplašinājumu</translation>
 <translation id="938470336146445890">Instalējiet lietotāja sertifikātu.</translation>
 <translation id="938582441709398163">Tastatūras pārklājums</translation>
+<translation id="939519157834106403">SSID</translation>
 <translation id="939598580284253335">Ievadiet ieejas frāzi</translation>
 <translation id="939736085109172342">Jauna mape</translation>
 <translation id="940425055435005472">Fonta lielums:</translation>
diff --git a/chrome/app/resources/generated_resources_ml.xtb b/chrome/app/resources/generated_resources_ml.xtb
index e82b98a..f484266 100644
--- a/chrome/app/resources/generated_resources_ml.xtb
+++ b/chrome/app/resources/generated_resources_ml.xtb
@@ -621,6 +621,7 @@
 <translation id="1882130480443819387">പേര് അനുസരിച്ച് അടുക്കുക</translation>
 <translation id="1886996562706621347">പ്രോട്ടോകോളുകള്‍ക്കായി സ്ഥിരസ്ഥിതി ഹാന്‍ഡ്‌ലറുകള്‍ ആകുന്നത് ആവശ്യപ്പെടാൻ സൈറ്റുകളെ അനുവദിക്കുന്നു (ശുപാർശിതം)</translation>
 <translation id="1887850431809612466">ഹാർഡ്‌വെയർ അവലോകനം</translation>
+<translation id="1889984860246851556">പ്രോക്‌സി ക്രമീകരണം തുറക്കുക</translation>
 <translation id="1891668193654680795">സോഫ്റ്റ്‍വെയര്‍ നിര്‍മ്മാതാക്കളെ തിരിച്ചറിയുന്നതിന് ഈ സാക്‍ഷ്യപത്രത്തെ വിശ്വസിക്കുക.</translation>
 <translation id="189210018541388520">പൂര്‍ണ്ണ സ്ക്രീനില്‍ തുറക്കുക</translation>
 <translation id="1893406696975231168">ക്ലൗഡ് പ്രൊവിഷൻ ഫ്ലോ പരാജയപ്പെട്ടു</translation>
@@ -833,7 +834,6 @@
 <translation id="2224551243087462610">ഫോള്‍ഡര്‍ നാമം എഡിറ്റ് ചെയ്യുക</translation>
 <translation id="2226449515541314767">MIDI ഉപകരണങ്ങളിൽ പൂർണ്ണനിയന്ത്രണം നേടുന്നതിൽ നിന്ന് ഈ സൈറ്റിനെ തടഞ്ഞു.</translation>
 <translation id="2226720438730111184">എന്താണ് സംഭവിക്കുന്നതെന്ന് ഞങ്ങളെ അറിയിക്കുക</translation>
-<translation id="222903405933288376">പ്രാദേശിക ഉള്ളടക്കം നൽകാൻ Google നിങ്ങളുടെ ലൊക്കേഷൻ ഉപയോഗിക്കുന്നു. ഇത് <ph name="SETTINGS_LINK" /> എന്നതിൽ മാറ്റാനാവും.</translation>
 <translation id="2229161054156947610">1 മണിക്കൂറിൽ കൂടുതൽ ശേഷിക്കുന്നു</translation>
 <translation id="222931766245975952">ഫയലിന് ആവശ്യത്തിന് വലുപ്പമില്ല</translation>
 <translation id="222949136907494149"><ph name="URL" /> നിങ്ങളുടെ കമ്പ്യൂട്ടറിന്റെ ലൊക്കേഷൻ ഉപയോഗിക്കാൻ താൽപ്പര്യപ്പെടുന്നു.</translation>
@@ -849,6 +849,7 @@
 <translation id="2241634353105152135">ഒരിക്കൽ മാത്രം</translation>
 <translation id="2242603986093373032">ഉപകരണങ്ങളൊന്നുമില്ല</translation>
 <translation id="2242687258748107519">ഫയൽ വിവരം</translation>
+<translation id="2245240762616536227">നിങ്ങളുടെ ബ്രൗസിംഗ് ചരിത്രത്തെ തിരയലും പരസ്യങ്ങളും മറ്റ് Google സേവനങ്ങളും വ്യക്തിപരമാക്കുന്ന വിധം നിയന്ത്രിക്കുക</translation>
 <translation id="2246340272688122454">റിക്കവറി ഇമേജ് ഡൗൺലോഡ് ചെയ്യുന്നു</translation>
 <translation id="2249499294612408921">സൂപ്പർ‌വൈസുചെയ്‌ത ഒരു ഉപയോക്താവിന് നിങ്ങളുടെ മാർഗനിർദ്ദേശ പ്രകാരം വെബിൽ പര്യവേക്ഷണം ചെയ്യാം. സൂപ്പർ‌വൈസുചെയ്‌ത ഒരു ഉപയോക്താവിന്റെ മാനേജർ എന്ന നിലയിൽ, നിങ്ങൾക്ക്,
 
@@ -1084,7 +1085,6 @@
 <translation id="2575247648642144396">വിപുലീകരണത്തിന് നിലവിലെ പേജിൽ പ്രവർത്തിക്കാൻ കഴിയുമ്പോൾ ഈ ഐക്കൺ ദൃശ്യമാകും. ഐക്കണിൽ ക്ലിക്കുചെയ്‌തുകൊണ്ടോ <ph name="EXTENSION_SHORTCUT" /> അമർത്തിക്കൊണ്ടോ ഈ വിപുലീകരണം ഉപയോഗിക്കുക</translation>
 <translation id="2576842806987913196">ഇതേ പേരിൽ ഇതിനകം ഒരു CRX ഫയൽ നിലവിലുണ്ട്.</translation>
 <translation id="2579575372772932244">പ്രൊഫൈൽ വീണ്ടും സൃഷ്‌ടിക്കുന്നു, കാത്തിരിക്കുക...</translation>
-<translation id="2580168606262715640">നിങ്ങളുടെ ഫോൺ കണ്ടെത്താനാകുന്നില്ല. അത് കൈയ്യെത്തും ദൂരത്തുണ്ടെന്ന് ഉറപ്പാക്കുക.</translation>
 <translation id="2580889980133367162">എല്ലായ്‌പ്പോഴും ഒന്നിലധികം ഫയലുകൾ ഡൗൺലോഡുചെയ്യാൻ <ph name="HOST" />-നെ അനുവദിക്കുക</translation>
 <translation id="2580924999637585241">ആകെ: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">ദൈർഘ്യമേറിയ</translation>
@@ -1375,6 +1375,7 @@
 <translation id="2966449113954629791">നിങ്ങളുടെ മൊബൈൽ ഡാറ്റ അലവൻസ് പരമാവധി ഉപയോഗിച്ചിരിക്കാനിടയുണ്ട്. കൂടുതൽ ഡാറ്റ വാങ്ങാൻ <ph name="NAME" /> സജീവമാക്കൽ പോർട്ടൽ സന്ദർശിക്കുക.</translation>
 <translation id="2966459079597787514">സ്വീഡിഷ് കീബോര്‍ഡ്</translation>
 <translation id="2966598748518102999">"Ok Google" എന്നതിലേക്കും കുറച്ചുനിമിഷം മുമ്പ് Google-ലേക്കും ശബ്‌ദം അയച്ചുകൊണ്ട് ശബ്ദ തിരയൽ മെച്ചപ്പെടുത്തുക.</translation>
+<translation id="2966937470348689686">Android മുൻഗണനകൾ മാനേജുചെയ്യുക</translation>
 <translation id="2967544384642772068">ഇല്ലാതാക്കുക</translation>
 <translation id="2971033837577180453">&lt;span&gt;ഐഡി:&lt;/span&gt;<ph name="EXTENSION_ID" /></translation>
 <translation id="2971213274238188218">തെളിച്ചം കുറയ്‌ക്കുക</translation>
@@ -2133,6 +2134,7 @@
 <translation id="4087089424473531098">സൃഷ്‌ടിച്ച വിപുലീകരണം:
 
 <ph name="EXTENSION_FILE" /></translation>
+<translation id="4087470595660267445">നിങ്ങളുടെ Chromebook-ൽ Google Play-യിൽ നിന്ന് ഗെയിമുകളും ആപ്പുകളും ഇൻസ്‌റ്റാൾ ചെയ്യുക. &lt;a target="_blank" href="<ph name="URL" />"&gt;കൂടുതലറിയുക&lt;/a&gt;</translation>
 <translation id="4088095054444612037">ഗ്രൂപ്പിനായി അംഗീകരിക്കുക</translation>
 <translation id="4089521618207933045">ഉപമെനു ഉണ്ട്</translation>
 <translation id="4090103403438682346">പരിശോധിച്ചുറപ്പിച്ച ആക്‌സസ്സ് പ്രവർത്തനക്ഷമമാക്കുക</translation>
@@ -2165,7 +2167,6 @@
 <translation id="4130207949184424187">നിങ്ങൾ ഓമ്‌നിബോക്‌സിൽ നിന്ന് തിരയുമ്പോൾ ദൃശ്യമാകുന്ന പേജിനെ ഈ വിപുലീകരണം മാറ്റി.</translation>
 <translation id="413121957363593859">ഘടകങ്ങൾ</translation>
 <translation id="4131410914670010031">കറുപ്പും വെള്ളയും</translation>
-<translation id="4135054690906486073">ഈ നെറ്റ്‌വർക്ക് മറ്റ് ഉപയോക്താക്കളുമായി പങ്കിട്ടു</translation>
 <translation id="4135450933899346655">നിങ്ങളുടെ സര്‍‌ട്ടിഫിക്കറ്റുകള്‍‌‌</translation>
 <translation id="4138267921960073861">പ്രവേശന സ്ക്രീനില്‍ ഫോട്ടോകളും ഉപയോക്തൃനാമങ്ങളും  കാണിക്കുക</translation>
 <translation id="4140559601186535628">പുഷ് സന്ദേശങ്ങൾ</translation>
@@ -2569,9 +2570,6 @@
 <translation id="4813345808229079766">കണക്ഷന്‍</translation>
 <translation id="4813512666221746211">നെറ്റ്‌വര്‍ക്ക് പിശക്</translation>
 <translation id="4816492930507672669">പേജിന് യുക്തമാക്കുക</translation>
-<translation id="4816617200045929931">പ്രൊഫൈലിലെ പ്രശ്‌നത്തെക്കുറിച്ചുള്ള സന്ദേശം ലഭിക്കുന്നതിന് തൊട്ടുമുമ്പ് എന്താണ് സംഭവിച്ചതെന്ന് ഞങ്ങളോട് പറയൂ:
-
-****ഈ വരിക്ക് താഴെ മാറ്റങ്ങൾ വരുത്തരുത്****</translation>
 <translation id="4820334425169212497">ഇല്ല, ഞാനത് കണ്ടില്ല</translation>
 <translation id="4821086771593057290">നിങ്ങളുടെ പാസ്‌വേഡ് മാറ്റി. പുതിയ പാസ്‌വേഡ് ഉപയോഗിച്ച് ദയവായി വീണ്ടും ശ്രമിക്കുക.</translation>
 <translation id="4821935166599369261">&amp;പ്രൊഫൈലിംഗ് പ്രാപ്തമാക്കി</translation>
@@ -2926,6 +2924,7 @@
 <translation id="5329858601952122676">&amp;ഇല്ലാതാക്കൂ</translation>
 <translation id="5330145655348521461">ഈ ഫയലുകൾ മറ്റൊരു ഡെസ്‌ക്‌ടോപ്പിലാണ് തുറന്നിരിക്കുന്നത്. അത് കാണാൻ <ph name="USER_NAME" /> (<ph name="MAIL_ADDRESS" />) എന്നതിലേക്ക് നീക്കുക.</translation>
 <translation id="5330512191124428349">വിവരം സ്വീകരിക്കുക</translation>
+<translation id="5331069282670671859">ഈ വിഭാഗത്തിൽ നിങ്ങൾക്ക് സർട്ടിഫിക്കറ്റുകളൊന്നുമില്ല</translation>
 <translation id="5331425616433531170">"<ph name="CHROME_EXTENSION_NAME" />" ജോടിയാക്കാൻ താൽപ്പര്യപ്പെടുന്നു</translation>
 <translation id="5332624210073556029">സമയ മേഖല :</translation>
 <translation id="5334142896108694079">സ്‌ക്രിപ്റ്റ് കാഷെ</translation>
@@ -2936,7 +2935,6 @@
 <translation id="5340217413897845242">ഷെൽഫ് ഇനം 6</translation>
 <translation id="5341390997810576190">സെല്ലുലാർ ഡാറ്റ ഉപയോഗിക്കുക</translation>
 <translation id="5342091991439452114">പിൻ നമ്പറിൽ <ph name="MINIMUM" /> അക്കങ്ങളെങ്കിലും വേണം</translation>
-<translation id="5342344590724511265">ടാബ് ക്രാഷ് ആകുന്നതിനെക്കുറിച്ചുള്ള ഫീഡ്‌ബാക്ക്.</translation>
 <translation id="5342451237681332106"><ph name="PHONE_NAME" /> ഉപയോഗിക്കുക</translation>
 <translation id="534916491091036097">ഇടത് ആവരണചിഹ്നം</translation>
 <translation id="5350965906220856151">ക്ഷമിക്കണം!</translation>
@@ -2974,6 +2972,7 @@
 <translation id="5399158067281117682">PIN-കള്‍ പൊരുത്തപ്പെടുന്നില്ല!</translation>
 <translation id="5400640815024374115">ട്രസ്റ്റഡ് പ്ലാറ്റ്ഫോം മൊഡ്യൂള്‍ (TPM) ചിപ്പ് അപ്രാപ്തമാക്കി അല്ലെങ്കില്‍ ഹാജരല്ല.</translation>
 <translation id="5402367795255837559">ബ്രെയ്‌ലി</translation>
+<translation id="5402815541704507626">മൊബൈല്‍ ഡാറ്റ ഉപയോഗിച്ച് അപ്‌ഡേറ്റ് ഡൗൺലോഡുചെയ്യുക</translation>
 <translation id="540296380408672091"><ph name="HOST" /> എന്നതിൽ എല്ലായ്‌പ്പോഴും കുക്കികളെ തടയുക</translation>
 <translation id="5408750356094797285">സൂം ചെയ്യുക: <ph name="PERCENT" /></translation>
 <translation id="5409029099497331039">എന്നെ ആശ്ചര്യപ്പെടുത്തൂ</translation>
@@ -3111,6 +3110,7 @@
 <translation id="558918721941304263">ആപ്പുകൾ ലോഡുചെയ്യുന്നു...</translation>
 <translation id="5592595402373377407">ഇതുവരെയും മതിയായ ഡാറ്റ ലഭ്യമല്ല.</translation>
 <translation id="5595485650161345191">വിലാസം എഡിറ്റുചെയ്യുക</translation>
+<translation id="5600706100022181951"><ph name="UPDATE_SIZE_MB" /> MB മൊബൈല്‍ ഡാറ്റ ഉപയോഗിച്ച് അപ്‌ഡേറ്റ് ഡൗൺലോഡുചെയ്യും. തുടരാൻ താൽപ്പര്യമുണ്ടോ?</translation>
 <translation id="5601503069213153581">PIN</translation>
 <translation id="5604324414379907186">ബുക്ക്‌മാർക്ക് ബാർ എപ്പോഴും കാണിക്കുക</translation>
 <translation id="5605623530403479164">മറ്റ് സെര്‍ച് എഞ്ചിനുകള്‍</translation>
@@ -3206,6 +3206,7 @@
 <translation id="5764483294734785780">ഓഡിയോ ഇതുപോലെ സം&amp;രക്ഷിക്കുക...</translation>
 <translation id="57646104491463491">തീയതി പരിഷ്കരിച്ചു</translation>
 <translation id="5764797882307050727">നിങ്ങളുടെ ഉപകരണത്തിൽ കുറച്ച് ഇടം സൃഷ്‌ടിക്കുക.</translation>
+<translation id="5765425701854290211">ക്ഷമിക്കണം, ചില ഫയലുകൾ കേടായതിനാൽ അപ്‌ഡേറ്റ് വിജയകരമായില്ല. നിങ്ങളുടെ സമന്വയിപ്പിച്ച ഫയലുകൾ സുരക്ഷിതമാണ്.</translation>
 <translation id="5765491088802881382">നെറ്റ്‌വര്‍ക്കുകളോന്നും ലഭ്യമല്ല</translation>
 <translation id="5765780083710877561">വിവരണം:</translation>
 <translation id="5771585441665576801">ലിപ്യന്തരണം (geia → γεια)</translation>
@@ -3219,6 +3220,7 @@
 <translation id="5778747455497889540">നിങ്ങളുടെ കമ്പ്യൂട്ടറിലേക്ക് നിയോഗിച്ചിട്ടുള്ളതും, ക്രമരഹിതമായി ജനറേറ്റുചെയ്തതുമായ സുരക്ഷിത മൊഡ്യൂൾ പാസ്‍വേഡ് ചുവടെ നൽകിയിരിക്കുന്നു:</translation>
 <translation id="5780066559993805332">(മികച്ചത്)</translation>
 <translation id="5780973441651030252">പ്രോസസ്സ് മുൻഗണന</translation>
+<translation id="5781865261247219930"><ph name="EXTENSION_NAME" /> എന്ന വിപുലീകരണത്തിലേക്ക് കമാൻഡുകൾ അയയ്ക്കുക</translation>
 <translation id="5783221160790377646">ഒരു പിശകുണ്ടായതിനാൽ, സൂപ്പർവൈസുചെയ്‌ത ഉപയോക്താവ് സൃഷ്‌ടിക്കപ്പെട്ടില്ല. പിന്നീട് വീണ്ടും ശ്രമിക്കുക.</translation>
 <translation id="5783602409389152506">ഉപകരണങ്ങൾ സ്‌കാൻ ചെയ്യുമ്പോൾ...</translation>
 <translation id="57838592816432529">മ്യൂട്ടുചെയ്യുക</translation>
@@ -3261,6 +3263,7 @@
 <translation id="5838825566232597749">യുഎസ് വർക്ക്‌മാൻ ഇന്റർനാഷണൽ</translation>
 <translation id="5842497610951477805">Bluetooth പ്രവർത്തനക്ഷമമാക്കുക</translation>
 <translation id="5846929185714966548">ടാബ് 4</translation>
+<translation id="5848924408752252705">തിരികെ പോകാൻ സ്‌പർശിക്കുക.</translation>
 <translation id="5848934677402291689">PDF-ലേക്ക് സംരക്ഷിക്കുന്നത് പുരോഗമിക്കുന്നു</translation>
 <translation id="5849570051105887917">ഹോം ദാതാവിന്റെ കോഡ്</translation>
 <translation id="5849869942539715694">പായ്ക്ക് വിപുലീകരണം...</translation>
@@ -3279,6 +3282,7 @@
 <translation id="5859272821192576954">Hangouts-ൽ തുടരുന്നതിനായി നിങ്ങൾ എല്ലാം സജ്ജീകരിച്ചു</translation>
 <translation id="5860033963881614850">ഓഫാക്കുക</translation>
 <translation id="5860209693144823476">ടാബ് 3</translation>
+<translation id="5860491529813859533">ഓൺ ചെയ്യുക</translation>
 <translation id="5860494867054883682"><ph name="CHANNEL_NAME" /> ചാനലിലേയ്‌ക്ക് നിങ്ങളുടെ ഉപകരണം അപ്‌ഡേറ്റുചെയ്യുന്നു, (<ph name="PROGRESS_PERCENT" />)</translation>
 <translation id="5862109781435984885">ഷെൽഫിലെ സ്റ്റൈലസ് ടൂളുകൾ കാണിക്കുക</translation>
 <translation id="58625595078799656">Google പാസ്‌വേഡ് അല്ലെങ്കില്‍ നിങ്ങളുടെ സ്വന്തം പാസ്ഫ്രെയ്സ് ഉപയോഗിച്ച് ഡാറ്റ എന്‍‌ക്രിപ്റ്റുചെയ്യാന്‍ <ph name="PRODUCT_NAME" /> ആവശ്യപ്പെടുന്നു.</translation>
@@ -3610,6 +3614,7 @@
 <translation id="6395423953133416962"><ph name="BEGIN_LINK1" />സിസ്റ്റം വിവരങ്ങളും<ph name="END_LINK1" /> <ph name="BEGIN_LINK2" />മെട്രിക്‌സും<ph name="END_LINK2" /> അയയ്‌ക്കുക</translation>
 <translation id="6397363302884558537">സംഭാഷണം നിർത്തുക</translation>
 <translation id="6397592254427394018">&amp;വേഷ പ്രച്ഛന്ന വിന്‍ഡോയിലെ എല്ലാ ബുക്ക്മാര്‍ക്കുകളും തുറക്കുക</translation>
+<translation id="6398715114293939307">Google Play സ്‌റ്റോർ നീക്കംചെയ്യുക</translation>
 <translation id="6398765197997659313">പൂര്‍ണ്ണ സ്ക്രീനില്‍ നിന്ന് പുറത്തുകടക്കുക</translation>
 <translation id="6399774419735315745">ചാരവനിത</translation>
 <translation id="6401445054534215853">ഷെൽഫ്  ഇനം 1</translation>
@@ -4419,6 +4424,7 @@
 <translation id="7615910377284548269">അൺസാൻഡ്‌ബോക്‌സ് ചെയ്‌ത പ്ലഗിൻ തടയൽ നിയന്ത്രിക്കുക...</translation>
 <translation id="7617366389578322136">"<ph name="DEVICE_NAME" />" ഉപകരണത്തിലേക്ക് കണക്‌റ്റുചെയ്യുന്നു</translation>
 <translation id="761779991806306006">പാസ്‌വേഡുകളൊന്നും സംരക്ഷിച്ചിട്ടില്ല.</translation>
+<translation id="7622114377921274169">ചാർജ് ചെയ്യുന്നു.</translation>
 <translation id="7624154074265342755">വയര്‍ലെസ്സ് നെറ്റ്‍വര്‍ക്കുകള്‍</translation>
 <translation id="7624337243375417909">ക്യാപ്‌സ് ലോക്ക് ഓഫാണ്</translation>
 <translation id="7627790789328695202">ക്ഷമിക്കണം, <ph name="FILE_NAME" /> ഇതിനകം നിലവിലുണ്ട്. അതിന്റെ പേരുമാറ്റി വീണ്ടും ശ്രമിക്കുക.</translation>
@@ -4859,6 +4865,7 @@
 <translation id="8270242299912238708">PDF ഡോക്യുമെന്റുകൾ</translation>
 <translation id="827097179112817503">ഹോം ബട്ടൺ കാണിക്കുക</translation>
 <translation id="8272443605911821513">"കൂടുതൽ ഉപകരണങ്ങൾ" മെനുവിലെ വിപുലീകരണങ്ങളിൽ ക്ലിക്കുചെയ്യുന്നതിലൂടെ നിങ്ങളുടെ വിപുലീകരണങ്ങൾ നിയന്ത്രിക്കുക.</translation>
+<translation id="8274924778568117936">അപ്‌ഡേറ്റ് പൂർത്തിയാകുന്നതുവരെ നിങ്ങളുടെ <ph name="DEVICE_TYPE" /> ഓഫാക്കുകയോ അടയ്‌ക്കുകയോ ചെയ്യരുത്. ഇൻസ്‌റ്റാളേഷൻ പൂർത്തിയായിക്കഴിഞ്ഞാൽ <ph name="DEVICE_TYPE" /> റീസ്‌റ്റാർട്ട് ആകുന്നതാണ്.</translation>
 <translation id="8275038454117074363">ഇറക്കുമതിചെയ്യുക</translation>
 <translation id="8276560076771292512">കാഷെ ശൂന്യമാക്കി വേഗത്തിൽ വീണ്ടും ലോഡുചെയ്യുക</translation>
 <translation id="8279388322240498158">സൊറാനി കുർദ്ദിഷ് ഇംഗ്ലീഷ് അധിഷ്‌ഠിത കീബോർഡ്</translation>
@@ -5296,9 +5303,9 @@
 <translation id="8960999352790021682">ബംഗാളി കീബോർഡ് (സ്വരസൂചകം)</translation>
 <translation id="8962083179518285172">വിശദാംശങ്ങൾ മറയ്ക്കുക</translation>
 <translation id="8962198349065195967">ഈ നെറ്റ്‌വർക്ക് നിങ്ങളുടെ അഡ്‌മിനിസ്‌ട്രേറ്റർ കോൺഫിഗർ ചെയ്തു.</translation>
+<translation id="8963572037665351978">അവതരണത്തിന് പുറത്തുകടക്കുക</translation>
 <translation id="8965037249707889821">പഴയ പാസ്‌വേഡ് നൽകുക</translation>
 <translation id="8965697826696209160">പര്യാപ്‌തമായ ഇടമില്ല.</translation>
-<translation id="8968527460726243404">ChromeOS സിസ്റ്റം ഇമേജ് റൈറ്റർ</translation>
 <translation id="8970203673128054105">കാസ്‌റ്റ് മോഡ് ലിസ്‌റ്റ് കാണുക</translation>
 <translation id="89720367119469899">എസ്‌കേപ്പ്</translation>
 <translation id="8972513834460200407">ഫയർവാൾ Google സെർവറുകളിൽ നിന്ന് ഡൗൺലോഡുകൾ തടയുന്നില്ലെന്ന് ഉറപ്പുവരുത്താൻ, നിങ്ങളുടെ നെറ്റ്‌വർക്ക് അഡ്‌മിനിസ്‌ട്രേറ്ററുടെ സഹായം തേടുക.</translation>
@@ -5451,6 +5458,7 @@
 <translation id="9188441292293901223">ഈ <ph name="DEVICE_TYPE" /> അൺലോക്കുചെയ്യാൻ, നിങ്ങളുടെ ഫോൺ ഏറ്റവും പുതിയ Android പതിപ്പിലേക്ക് അപ്‌ഡേറ്റുചെയ്യുക.</translation>
 <translation id="9189690067274055051">നൽകാൻ നിങ്ങളുടെ ഫോൺ അൺലോക്കുചെയ്‌ത് <ph name="DEVICE_TYPE" /> എന്നതിന് അടുത്തേക്ക് കൊണ്ടുവരിക.</translation>
 <translation id="9190063653747922532">L2TP/IPsec + മുമ്പ് പങ്കിട്ട കീ</translation>
+<translation id="920045321358709304"><ph name="SEARCH_ENGINE" /> തിരയുക</translation>
 <translation id="9201305942933582053">Chrome-നായുള്ള 'Google നൗ'!</translation>
 <translation id="9203398526606335860">&amp;പ്രൊഫൈലിംഗ് പ്രാപ്തമാക്കി</translation>
 <translation id="9203478404496196495">ടാബ് അൺമ്യൂട്ടുചെയ്യുക</translation>
@@ -5473,6 +5481,7 @@
 <translation id="93766956588638423">വിപുലീകരണം റിപ്പയർ ചെയ്യുക</translation>
 <translation id="938470336146445890">ഒരു ഉപയോക്തൃ സര്‍ട്ടിഫിക്കേറ്റ് ദയവായി ഇന്‍സ്റ്റാള്‍ ചെയ്യുക.</translation>
 <translation id="938582441709398163">കീബോര്‍ഡ് ഓവര്‍ലേ</translation>
+<translation id="939519157834106403">SSID</translation>
 <translation id="939598580284253335">പാസ്ഫ്രെയ്സ് നല്‍കുക</translation>
 <translation id="939736085109172342">പുതിയ ഫോള്‍ഡര്‍</translation>
 <translation id="940425055435005472">ഫോണ്ട് വലുപ്പം:</translation>
@@ -5483,6 +5492,7 @@
 <translation id="946810925362320585">ശുപാർശ പാലിക്കുക</translation>
 <translation id="951981865514037445"><ph name="URL" /> നിങ്ങളുടെ ഉപകരണത്തിന്റെ ലൊക്കേഷൻ ഉപയോഗിക്കാൻ താൽപ്പര്യപ്പെടുന്നു.</translation>
 <translation id="952992212772159698">സജീവമാക്കിയില്ല</translation>
+<translation id="958515377357646513">മുന്നോട്ട് പോകാൻ സ്‌പർശിക്കുക.</translation>
 <translation id="960719561871045870">ഓപ്പറേറ്റർ കോഡ്</translation>
 <translation id="960987915827980018">ഏകദേശം 1 മണിക്കൂർ ശേഷിക്കുന്നു</translation>
 <translation id="96421021576709873">Wi-Fi നെറ്റ്‌വർക്ക്</translation>
diff --git a/chrome/app/resources/generated_resources_mr.xtb b/chrome/app/resources/generated_resources_mr.xtb
index ace041f..d98ba7d4 100644
--- a/chrome/app/resources/generated_resources_mr.xtb
+++ b/chrome/app/resources/generated_resources_mr.xtb
@@ -622,6 +622,7 @@
 <translation id="1882130480443819387">शीर्षकानुसार क्रमवारी लावा</translation>
 <translation id="1886996562706621347">प्रोटोकॉलकरिता डीफॉल्ट हँडलर होण्यासाठी साइटना विचारण्याची अनुमती द्या</translation>
 <translation id="1887850431809612466">हार्डवेअर पुनरावृत्ती</translation>
+<translation id="1889984860246851556">प्रॉक्सी सेटिंग्ज उघडा</translation>
 <translation id="1891668193654680795">सॉफ्टवेअर निर्मात्यांना ओळखण्याकरिता या प्रमाणपत्रावर विश्वास ठेवा. </translation>
 <translation id="189210018541388520">पूर्ण स्क्रीन उघडा</translation>
 <translation id="1893406696975231168">क्लाउड तरतूद प्रवाह अयशस्वी</translation>
@@ -833,7 +834,6 @@
 <translation id="2224551243087462610">फोल्डर नाव संपादित करा</translation>
 <translation id="2226449515541314767">MIDI डिव्हाइसचे पूर्ण नियंत्रण असण्यापासून ही साइट अवरोधित केली गेली आहे.</translation>
 <translation id="2226720438730111184">काय होत आहे ते आम्हाला सांगा</translation>
-<translation id="222903405933288376">Google आपल्याला स्थानिक सामग्री देण्‍यासाठी आपल्या स्थानाचा वापर करते. आपण हे <ph name="SETTINGS_LINK" /> मध्ये बदलू शकता.</translation>
 <translation id="2229161054156947610">1 तासापेक्षा जास्त बाकी</translation>
 <translation id="222931766245975952">फाईल कापली गेली</translation>
 <translation id="222949136907494149"><ph name="URL" /> आपल्या संगणकाचे स्थान वापरू इच्छिते.</translation>
@@ -849,6 +849,7 @@
 <translation id="2241634353105152135">फक्त एकदाच</translation>
 <translation id="2242603986093373032">डिव्हाइसेस नाहीत</translation>
 <translation id="2242687258748107519">फाईल माहिती</translation>
+<translation id="2245240762616536227">तुमचा ब्राउझिंग इतिहास शोध, जाहिराती आणि इतर Google सेवांना कसा पर्सनलाइझ करतो यावर नियंत्रण ठेवा</translation>
 <translation id="2246340272688122454">पुनर्प्राप्ती प्रतिमा डाउनलोड करत आहे...</translation>
 <translation id="2249499294612408921">पर्यवेक्षी वापरकर्ता आपल्‍या मार्गदर्शनाने वेब एक्सप्लोर करू शकतो. Chrome मधील पर्यवेक्षी वापरकर्त्याचे व्‍यवस्थापक म्हणून आपण हे करू शकता
 
@@ -1084,7 +1085,6 @@
 <translation id="2575247648642144396">विस्तार वर्तमान पृष्‍ठावर क्रिया करु शकत असेल तेव्हा हे चिन्ह दृश्यमान होईल. चिन्हावर क्लिक करुन किंवा <ph name="EXTENSION_SHORTCUT" /> दाबून हा विस्तार वापरा.</translation>
 <translation id="2576842806987913196">या नावाने आधीपासूनच CRX फाइल उपस्थित आहे.</translation>
 <translation id="2579575372772932244">प्रोफाईल पुन्हा-तयार करीत आहे, कृपया प्रतीक्षा करा...</translation>
-<translation id="2580168606262715640">आपला फोन शोधू शकत नाही. तो हाताच्या अंतरावर असल्‍याचे सुनिश्चित करा.</translation>
 <translation id="2580889980133367162">एकाधिक फायली डाउनलोड करण्यास <ph name="HOST" /> ला नेहमी अनुमती द्या</translation>
 <translation id="2580924999637585241">एकूण: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">दीर्घ</translation>
@@ -1375,6 +1375,7 @@
 <translation id="2966449113954629791">आपण आपली मोबाईल डेटा सूट वापरली असू शकते. अधिक डेटा विकत घेण्यासाठी <ph name="NAME" /> सक्रियकरण पोर्टलला भेट द्या.</translation>
 <translation id="2966459079597787514">स्वीडिश कीबोर्ड</translation>
 <translation id="2966598748518102999">Google ला "Ok Google" आणि त्याच्या काही सेकंदांपूर्वीचा ध्वनी पाठवून व्हॉइस शोधात सुधारणा करा.</translation>
+<translation id="2966937470348689686">Android प्राधान्ये व्यवस्थापित करा</translation>
 <translation id="2967544384642772068">नष्ट करा</translation>
 <translation id="2971033837577180453">&lt;span&gt;आयडी:&lt;/span&gt;<ph name="EXTENSION_ID" /></translation>
 <translation id="2971213274238188218">चकाकी कमी करा</translation>
@@ -2128,6 +2129,7 @@
 <translation id="4084835346725913160"><ph name="TAB_NAME" /> बंद करा</translation>
 <translation id="4085298594534903246">या पृष्ठावर JavaScript  अवरोधित केलेले होते.</translation>
 <translation id="4087089424473531098">विस्तार तयार केला: <ph name="EXTENSION_FILE" /></translation>
+<translation id="4087470595660267445">तुमच्या Chromebook वर Google Play मधून अॅप आणि गेम इंस्टॉल करा. &lt;a target="_blank" href="<ph name="URL" />"&gt;अधिक जाणून घ्या&lt;/a&gt;</translation>
 <translation id="4088095054444612037">गटासाठी स्वीकारा</translation>
 <translation id="4089521618207933045">सबमेनू आहे</translation>
 <translation id="4090103403438682346">सत्यापित केलेला प्रवेश सक्षम करा</translation>
@@ -2161,7 +2163,6 @@
 <translation id="4130207949184424187">आपण विविधोपयोगी क्षेत्रातून शोध घेता तेव्हा कोणते पृष्ठ दर्शविले जाते ते या विस्ताराने बदलले आहे.</translation>
 <translation id="413121957363593859">घटक</translation>
 <translation id="4131410914670010031">कृष्ण धवल</translation>
-<translation id="4135054690906486073">हे नेटवर्क इतर वापरकर्त्यांसह सामायिक केलेले आहे</translation>
 <translation id="4135450933899346655">आपली प्रमाणपत्रे</translation>
 <translation id="4138267921960073861">साइन-इन स्क्रीनवर वापरकर्ता नावे आणि फोटो दर्शवा</translation>
 <translation id="4140559601186535628">पुश संदेश</translation>
@@ -2564,9 +2565,6 @@
 <translation id="4813345808229079766">कनेक्शन</translation>
 <translation id="4813512666221746211">नेटवर्क त्रुटी</translation>
 <translation id="4816492930507672669">पृष्‍ठानुरुप करा</translation>
-<translation id="4816617200045929931">आपल्याला प्रोफाइल त्रुटी संदेश प्राप्त होण्यापूर्वी नेमके काय घडले ते आम्हाला सांगा:
-
-****या ओळीखाली बदल करू नका****</translation>
 <translation id="4820334425169212497">नाही, मला ते दिसत नाही</translation>
 <translation id="4821086771593057290">आपला संकेतशब्द बदलला आहे. कृपया आपल्या नवीन संकेतशब्दासह पुन्हा प्रयत्न करा.</translation>
 <translation id="4821935166599369261">&amp;प्रोफाइलिंग सक्षम</translation>
@@ -2922,6 +2920,7 @@
 <translation id="5329858601952122676">&amp;हटवा</translation>
 <translation id="5330145655348521461">या फायली एका भिन्न डेस्कटॉपवर उघडलेल्या आहेत. या पाहण्यासाठी <ph name="USER_NAME" /> (<ph name="MAIL_ADDRESS" />) वर हलवा.</translation>
 <translation id="5330512191124428349">माहिती मिळवा</translation>
+<translation id="5331069282670671859">तुमच्याकडे या श्रेणीतील कोणतीही प्रमाणपत्रे नाहीत</translation>
 <translation id="5331425616433531170">"<ph name="CHROME_EXTENSION_NAME" />" जोडू इच्छिते</translation>
 <translation id="5332624210073556029">टाइम झोन:</translation>
 <translation id="5334142896108694079">स्क्रिप्ट कॅश  </translation>
@@ -2932,7 +2931,6 @@
 <translation id="5340217413897845242">शेल्फ आयटम 6</translation>
 <translation id="5341390997810576190">सेल्युलर डेटा वापरा</translation>
 <translation id="5342091991439452114">पिन किमान <ph name="MINIMUM" /> अंकांचा असणे आवश्यक आहे</translation>
-<translation id="5342344590724511265">टॅब क्रॅश केला अभिप्राय</translation>
 <translation id="5342451237681332106"><ph name="PHONE_NAME" /> वापरा</translation>
 <translation id="534916491091036097">डावा कंस</translation>
 <translation id="5350965906220856151">ओहो!</translation>
@@ -2970,6 +2968,7 @@
 <translation id="5399158067281117682">पिन जुळत नाहीत!</translation>
 <translation id="5400640815024374115">विश्वसनीय प्लॅटफॉर्म मॉड्यूल (TPM) चिप अक्षम किंवा अनुपस्थित आहे.</translation>
 <translation id="5402367795255837559">ब्रेल</translation>
+<translation id="5402815541704507626">मोबाइल डेटा वापरून अपडेट डाउनलोड करा</translation>
 <translation id="540296380408672091">कुकीज नेहमी <ph name="HOST" /> वर अवरोधित करा</translation>
 <translation id="5408750356094797285">झूम करा: <ph name="PERCENT" /></translation>
 <translation id="5409029099497331039">मला चकित करा</translation>
@@ -3107,6 +3106,7 @@
 <translation id="558918721941304263">अॅप्स लोड करीत आहे...</translation>
 <translation id="5592595402373377407">अद्याप पुरेसा डेटा उपलब्ध नाही.</translation>
 <translation id="5595485650161345191">पत्ता संपादित करा</translation>
+<translation id="5600706100022181951">अपडेट <ph name="UPDATE_SIZE_MB" /> MB मोबाइल डेटा वापरून डाउनलोड केले जाईल. आपल्याला सुरू ठेवायचे आहे का?</translation>
 <translation id="5601503069213153581">पिन</translation>
 <translation id="5604324414379907186">नेहमी बुकमार्क बार दर्शवा</translation>
 <translation id="5605623530403479164">इतर शोध इंजिने</translation>
@@ -3202,6 +3202,7 @@
 <translation id="5764483294734785780">म्हणून ऑडिओ ज&amp;तन करा...</translation>
 <translation id="57646104491463491">सुधारणा तारीख</translation>
 <translation id="5764797882307050727">कृपया तुमच्या डिव्हाइसवर काही जागा मोकळी करा.</translation>
+<translation id="5765425701854290211">माफ करा, काही फायली खराब झाल्‍या होत्‍या आणि अपडेट होऊ शकले नाही. तुमच्‍या सिंक केलेल्‍या फायली सुरक्षित आहेत.</translation>
 <translation id="5765491088802881382">कोणतीही नेटवर्क उपलब्ध नाहीत</translation>
 <translation id="5765780083710877561">वर्णन:</translation>
 <translation id="5771585441665576801">लिप्यंतरण (geia → γεια)</translation>
@@ -3215,6 +3216,7 @@
 <translation id="5778747455497889540">खाली यादृच्छिकपणे तयार केलेला सुरक्षित मॉड्यूल पासवर्ड आहे जो तुमच्‍‍‍‍या काँप्युटरसाठी असाइन केला गेला आहे:</translation>
 <translation id="5780066559993805332">(सर्वोत्तम)</translation>
 <translation id="5780973441651030252">प्रक्रिया प्राधान्य</translation>
+<translation id="5781865261247219930"><ph name="EXTENSION_NAME" /> ला आदेश पाठवा</translation>
 <translation id="5783221160790377646">त्रुटीमुळे, पर्यवेक्षी वापरकर्ता तयार करण्यात आला नाही. कृपया नंतर पुन्हा प्रयत्न करा.</translation>
 <translation id="5783602409389152506">डिव्हाइस स्कॅन करत आहे...</translation>
 <translation id="57838592816432529">निःशब्द करा</translation>
@@ -3257,6 +3259,7 @@
 <translation id="5838825566232597749">यूएस कामगार आंतरराष्ट्रीय</translation>
 <translation id="5842497610951477805">Bluetooth सक्षम आहे</translation>
 <translation id="5846929185714966548">टॅब 4</translation>
+<translation id="5848924408752252705">परत जाण्यासाठी स्पर्श करा.</translation>
 <translation id="5848934677402291689">PDF मध्‍ये जतन करणे प्रगतीपथावर</translation>
 <translation id="5849570051105887917">मुख्यपृष्ठ प्रदाता कोड</translation>
 <translation id="5849869942539715694">विस्तार पॅक करा...</translation>
@@ -3275,6 +3278,7 @@
 <translation id="5859272821192576954">Hangouts वर सुरु ठेवण्यासाठी आपण पूर्णपणे तयार आहात</translation>
 <translation id="5860033963881614850">बंद</translation>
 <translation id="5860209693144823476">टॅब 3</translation>
+<translation id="5860491529813859533">चालू करा</translation>
 <translation id="5860494867054883682">आपले डिव्हाइस <ph name="CHANNEL_NAME" /> चॅनेलवर (<ph name="PROGRESS_PERCENT" />) अद्यतनित करीत आहे</translation>
 <translation id="5862109781435984885">शेल्फमधील लेखणी साधने दर्शवा</translation>
 <translation id="58625595078799656">आपला डेटा कूटबद्ध करण्यासाठी <ph name="PRODUCT_NAME" /> ला आपला Google संकेतशब्द किंवा आपला स्वत:चा सांकेतिक वाक्यांश वापरणे आवश्यक आहे.</translation>
@@ -3606,6 +3610,7 @@
 <translation id="6395423953133416962"><ph name="BEGIN_LINK1" />सिस्टीम माहिती<ph name="END_LINK1" /> आणि <ph name="BEGIN_LINK2" />मेट्रिक्स<ph name="END_LINK2" /> पाठवा</translation>
 <translation id="6397363302884558537">बोलणे थांबवा</translation>
 <translation id="6397592254427394018">सर्व बुकमार्क्स &amp;गुप्त विंडो मध्ये उघडा</translation>
+<translation id="6398715114293939307">Google Play स्टोअर काढा</translation>
 <translation id="6398765197997659313">पूर्ण स्क्रीनमधून निर्गमन करा</translation>
 <translation id="6399774419735315745">गुप्तचर</translation>
 <translation id="6401445054534215853">शेल्‍फ आयटम 1</translation>
@@ -4414,6 +4419,7 @@
 <translation id="7615910377284548269">सॅन्डबॉक्स न केलेले प्लगिन अवरोधित करणे व्यवस्थापित करा...</translation>
 <translation id="7617366389578322136">"<ph name="DEVICE_NAME" />" यावर कनेक्ट करीत आहे</translation>
 <translation id="761779991806306006">कोणतेही संकेतशब्द जतन केलेले नाहीत.</translation>
+<translation id="7622114377921274169">चार्ज होत आहे.</translation>
 <translation id="7624154074265342755">वायरलेस नेटवर्क</translation>
 <translation id="7624337243375417909">कॅप्सलॉक बंद आहे</translation>
 <translation id="7627790789328695202">अरेरे, <ph name="FILE_NAME" /> आधीपासून अस्तित्वात आहे. हे पुनर्नामित करा आणि पुन्हा प्रयत्न करा.</translation>
@@ -4851,6 +4857,7 @@
 <translation id="8270242299912238708">PDF दस्तऐवज</translation>
 <translation id="827097179112817503">मुख्यपृष्ठ बटण दर्शवा</translation>
 <translation id="8272443605911821513">"अधिक साधने" मेनूमधील विस्तार क्लिक करून आपले विस्तार व्यवस्थापित करा.</translation>
+<translation id="8274924778568117936">अपडेट पूर्ण होईपर्यंत तुमचे <ph name="DEVICE_TYPE" /> बंद करू नका. इंस्‍टॉलेशन पूर्ण झाल्‍यानंतर तुमचे <ph name="DEVICE_TYPE" /> पुन्‍हा सुरू हाेईल .</translation>
 <translation id="8275038454117074363">आयात</translation>
 <translation id="8276560076771292512">कॅश   आणि कठीण रीलोड रिक्त करा</translation>
 <translation id="8279388322240498158">सोरानी कुर्दिश इंग्रजी-आधारित कीबोर्ड</translation>
@@ -5289,9 +5296,9 @@
 <translation id="8960999352790021682">बंगाली कीबोर्ड (Phonetic)</translation>
 <translation id="8962083179518285172">तपशील लपवा</translation>
 <translation id="8962198349065195967">हे नेटवर्क आपल्या प्रशासकाकडून कॉन्फिगर करण्‍यात आले आहे.</translation>
+<translation id="8963572037665351978">सादरीकरणातून बाहेर या</translation>
 <translation id="8965037249707889821">जुना संकेतशब्द प्रविष्ट करा</translation>
 <translation id="8965697826696209160">पुरेशी जागा नाही.</translation>
-<translation id="8968527460726243404">ChromeOS प्रणाली प्रतिमा लेखक</translation>
 <translation id="8970203673128054105">कास्ट मोड सूची पहा</translation>
 <translation id="89720367119469899">Escape</translation>
 <translation id="8972513834460200407">कृपया फायरवॉल Google सर्व्हरवरून डाउनलोड अवरोधित करत नसल्याची खात्री करण्यासाठी आपल्या नेटवर्क प्रशासकासह तपासा.</translation>
@@ -5443,6 +5450,7 @@
 <translation id="9188441292293901223">कृपया हा <ph name="DEVICE_TYPE" /> अनलॉक करण्यासाठी Android च्या नवीनतम आवृत्तीवर आपला फोन अद्यतनित करा.</translation>
 <translation id="9189690067274055051">प्रविष्ट करण्यासाठी आपला फोन अनलॉक करा आणि तो आपल्या <ph name="DEVICE_TYPE" /> च्या अधिक जवळ आणा.</translation>
 <translation id="9190063653747922532">L2TP/IPSec + पूर्व-सामायिक की</translation>
+<translation id="920045321358709304"><ph name="SEARCH_ENGINE" /> शोध</translation>
 <translation id="9201305942933582053">Chrome साठी Google Now!</translation>
 <translation id="9203398526606335860">&amp;प्रोफाइलिंग सक्षम</translation>
 <translation id="9203478404496196495">टॅब सशब्द करा</translation>
@@ -5465,6 +5473,7 @@
 <translation id="93766956588638423">विस्तार दुरुस्त करा</translation>
 <translation id="938470336146445890">कृपया वापरकर्ता प्रमाणपत्र स्थापित करा.</translation>
 <translation id="938582441709398163">कीबोर्ड आच्छादन</translation>
+<translation id="939519157834106403">SSID</translation>
 <translation id="939598580284253335">सांकेतिक वाक्यांश प्रविष्ट करा</translation>
 <translation id="939736085109172342">नवीन फोल्‍डर</translation>
 <translation id="940425055435005472">फॉन्ट आकार:</translation>
@@ -5475,6 +5484,7 @@
 <translation id="946810925362320585">शिफारसीचे अनुसरण करा</translation>
 <translation id="951981865514037445"><ph name="URL" /> आपल्या डिव्हाइसचे स्थान वापरू इच्छिते.</translation>
 <translation id="952992212772159698">सक्रिय नाही</translation>
+<translation id="958515377357646513">पुढे जाण्यासाठी स्पर्श करा.</translation>
 <translation id="960719561871045870">ऑपरेटर कोड</translation>
 <translation id="960987915827980018">सुमारे 1 तास बाकी</translation>
 <translation id="96421021576709873">Wi-Fi नेटवर्क</translation>
diff --git a/chrome/app/resources/generated_resources_ms.xtb b/chrome/app/resources/generated_resources_ms.xtb
index 15351fc..9c54822 100644
--- a/chrome/app/resources/generated_resources_ms.xtb
+++ b/chrome/app/resources/generated_resources_ms.xtb
@@ -835,7 +835,6 @@
 <translation id="2224551243087462610">Edit nama folder</translation>
 <translation id="2226449515541314767">Tapak ini telah disekat daripada mengawal sepenuhnya peranti MIDI.</translation>
 <translation id="2226720438730111184">Beritahu Kami Perkara Yang Berlaku</translation>
-<translation id="222903405933288376">Google menggunakan lokasi anda untuk memberikan kandungan setempat. Anda boleh menukar tetapan ini di <ph name="SETTINGS_LINK" />.</translation>
 <translation id="2229161054156947610">Tinggal lebih 1 jam</translation>
 <translation id="222931766245975952">Fail dipangkas</translation>
 <translation id="222949136907494149"><ph name="URL" /> mahu menggunakan lokasi komputer anda.</translation>
@@ -1087,7 +1086,6 @@
 <translation id="2575247648642144396">Ikon ini akan dapat dilihat apabila perlanjutan boleh bertindak ke atas halaman semasa. Gunakan sambungan ini dengan mengklik pada ikon atau dengan menekan <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="2576842806987913196">Fail CRX dengan nama ini telah wujud.</translation>
 <translation id="2579575372772932244">Membuat semula profil, sila tunggu...</translation>
-<translation id="2580168606262715640">Tidak dapat mencari telefon anda. Pastikan ia dalam jangkauan lengan.</translation>
 <translation id="2580889980133367162">Sentiasa benarkan <ph name="HOST" /> memuat turun berbilang fail</translation>
 <translation id="2580924999637585241">Jumlah: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">Lama</translation>
@@ -2173,7 +2171,6 @@
 <translation id="4130207949184424187">Sambungan ini telah menukar halaman yang ditunjukkan apabila anda membuat carian daripada Kotak Omni.</translation>
 <translation id="413121957363593859">Komponen</translation>
 <translation id="4131410914670010031">Hitam putih</translation>
-<translation id="4135054690906486073">Rangkaian ini dikongsi dengan pengguna lain</translation>
 <translation id="4135450933899346655">Sijil Anda</translation>
 <translation id="4138267921960073861">Paparkan nama pengguna dan foto pada skrin log masuk</translation>
 <translation id="4140559601186535628">Mesej Tolak</translation>
@@ -2577,9 +2574,6 @@
 <translation id="4813345808229079766">Sambungan</translation>
 <translation id="4813512666221746211">Ralat rangkaian</translation>
 <translation id="4816492930507672669">Muat halaman</translation>
-<translation id="4816617200045929931">Beritahu kami perkara yang berlaku sebelum anda mendapat mesej ralat profil:
-
-****JANGAN UBAH DI BAWAH GARIS INI****</translation>
 <translation id="4820334425169212497">Tidak, saya tidak melihatnya</translation>
 <translation id="4821086771593057290">Kata laluan anda telah ditukar. Sila cuba semula dengan kata laluan baharu anda.</translation>
 <translation id="4821935166599369261">&amp;Pemprofilan Didayakan</translation>
@@ -2945,7 +2939,6 @@
 <translation id="5340217413897845242">Item rak 6</translation>
 <translation id="5341390997810576190">Gunakan data selular</translation>
 <translation id="5342091991439452114">PIN mestilah sekurang-kurangnya <ph name="MINIMUM" /> digit</translation>
-<translation id="5342344590724511265">Maklum balas tab ranap.</translation>
 <translation id="5342451237681332106">Gunakan <ph name="PHONE_NAME" /></translation>
 <translation id="534916491091036097">Tanda kurung kiri</translation>
 <translation id="5350965906220856151">Alamak!</translation>
@@ -3217,6 +3210,7 @@
 <translation id="5764483294734785780">Si&amp;mpan audio sebagai...</translation>
 <translation id="57646104491463491">Tarikh Diubah Suai</translation>
 <translation id="5764797882307050727">Sila kosongkan sedikit ruang pada peranti anda.</translation>
+<translation id="5765425701854290211">Maaf, beberapa fail telah rosak dan kemas kini tidak berjaya dilakukan. Fail yang telah disegerakkan berada dalam keadaan selamat.</translation>
 <translation id="5765491088802881382">Tiada rangkaian tersedia</translation>
 <translation id="5765780083710877561">Huraian:</translation>
 <translation id="5771585441665576801">Pengalihan huruf (geia → γεια)</translation>
@@ -4432,6 +4426,7 @@
 <translation id="7615910377284548269">Urus penyekatan pemalam tanpa kotak pasir...</translation>
 <translation id="7617366389578322136">Menyambung ke "<ph name="DEVICE_NAME" />"</translation>
 <translation id="761779991806306006">Tiada kata laluan disimpan.</translation>
+<translation id="7622114377921274169">Mengecas.</translation>
 <translation id="7624154074265342755">Rangkaian wayarles</translation>
 <translation id="7624337243375417909">kunci huruf besar dimatikan</translation>
 <translation id="7627790789328695202">Op, <ph name="FILE_NAME" /> telah pun wujud. Namakan semula dan cuba lagi.</translation>
@@ -4871,6 +4866,7 @@
 <translation id="8270242299912238708">Dokumen PDF</translation>
 <translation id="827097179112817503">Paparkan butang laman utama</translation>
 <translation id="8272443605911821513">Urus sambungan anda dengan mengklik Sambungan dalam menu "Lagi alat".</translation>
+<translation id="8274924778568117936">Jangan matikan atau menutup <ph name="DEVICE_TYPE" /> anda sehingga kemas kini selesai. <ph name="DEVICE_TYPE" /> anda akan dimulakan semula selepas pemasangan selesai.</translation>
 <translation id="8275038454117074363">Import</translation>
 <translation id="8276560076771292512">Cache kosong dan Muat Semula Keras</translation>
 <translation id="8279388322240498158">Papan kekunci berdasarkan bahasa Inggeris Kurdish Sorani</translation>
@@ -5313,7 +5309,6 @@
 <translation id="8963572037665351978">Keluar daripada Pembentangan</translation>
 <translation id="8965037249707889821">Masukkan kata laluan lama</translation>
 <translation id="8965697826696209160">Tiada ruang yang mencukupi.</translation>
-<translation id="8968527460726243404">Penulis Imej Sistem ChromeOS</translation>
 <translation id="8970203673128054105">Lihat senarai mod hantar</translation>
 <translation id="89720367119469899">Lepas</translation>
 <translation id="8972513834460200407">Sila semak dengan pentadbir rangkaian anda bagi memastikan bahawa tembok api tidak menyekat muat turun dari pelayan Google.</translation>
@@ -5488,6 +5483,7 @@
 <translation id="93766956588638423">Baiki sambungan</translation>
 <translation id="938470336146445890">Sila pasang sijil pengguna.</translation>
 <translation id="938582441709398163">Tindihan Papan Kekunci</translation>
+<translation id="939519157834106403">SSID</translation>
 <translation id="939598580284253335">Masukkan frasa laluan</translation>
 <translation id="939736085109172342">Folder baharu</translation>
 <translation id="940425055435005472">Saiz fon:</translation>
diff --git a/chrome/app/resources/generated_resources_nl.xtb b/chrome/app/resources/generated_resources_nl.xtb
index 84c45e7..01770b61 100644
--- a/chrome/app/resources/generated_resources_nl.xtb
+++ b/chrome/app/resources/generated_resources_nl.xtb
@@ -836,7 +836,6 @@
 <translation id="2224551243087462610">Mapnaam bewerken</translation>
 <translation id="2226449515541314767">Deze site is geblokkeerd voor volledig beheer van MIDI-apparaten.</translation>
 <translation id="2226720438730111184">Vertel ons wat er aan de hand is</translation>
-<translation id="222903405933288376">Google gebruikt je locatie om lokale content te leveren. Je kunt dit wijzigen in <ph name="SETTINGS_LINK" />.</translation>
 <translation id="2229161054156947610">Meer dan 1 uur resterend</translation>
 <translation id="222931766245975952">Bestand afgekapt</translation>
 <translation id="222949136907494149"><ph name="URL" /> wil de locatie van je computer gebruiken.</translation>
@@ -1088,7 +1087,6 @@
 <translation id="2575247648642144396">Dit pictogram is zichtbaar wanneer de extensie acties kan uitvoeren op de huidige pagina. Gebruik deze extensie door op het pictogram te klikken of op <ph name="EXTENSION_SHORTCUT" /> te drukken.</translation>
 <translation id="2576842806987913196">Er is al een CRX-bestand aanwezig met deze naam.</translation>
 <translation id="2579575372772932244">Profiel wordt opnieuw gemaakt. Een ogenblik geduld...</translation>
-<translation id="2580168606262715640">Kan je telefoon niet vinden. Zorg ervoor dat deze zich in de buurt bevindt.</translation>
 <translation id="2580889980133367162"><ph name="HOST" /> altijd toestaan meerdere bestanden te downloaden</translation>
 <translation id="2580924999637585241">Totaal: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">Lang</translation>
@@ -2173,7 +2171,6 @@
 <translation id="4130207949184424187">Deze extensie heeft gewijzigd welke pagina wordt weergegeven wanneer je vanuit de omnibox zoekt.</translation>
 <translation id="413121957363593859">Componenten</translation>
 <translation id="4131410914670010031">Zwart/wit</translation>
-<translation id="4135054690906486073">Dit netwerk wordt gedeeld met andere gebruikers</translation>
 <translation id="4135450933899346655">Je certificaten</translation>
 <translation id="4138267921960073861">Gebruikersnamen en foto's weergeven in het inlogscherm</translation>
 <translation id="4140559601186535628">Pushberichten</translation>
@@ -2577,9 +2574,6 @@
 <translation id="4813345808229079766">Verbinding</translation>
 <translation id="4813512666221746211">Netwerkfout</translation>
 <translation id="4816492930507672669">Aanpassen aan pagina</translation>
-<translation id="4816617200045929931">Vertel ons wat er precies gebeurde voordat je de foutmelding voor het profiel kreeg:
-
-****ONDER DEZE REGEL NIETS WIJZIGEN****</translation>
 <translation id="4820334425169212497">Nee, ik zie het niet</translation>
 <translation id="4821086771593057290">Je wachtwoord is gewijzigd. Probeer het opnieuw met je nieuwe wachtwoord.</translation>
 <translation id="4821935166599369261">&amp;Profiling ingeschakeld</translation>
@@ -2944,7 +2938,6 @@
 <translation id="5340217413897845242">Plankartikel 6</translation>
 <translation id="5341390997810576190">Mobiele data gebruiken</translation>
 <translation id="5342091991439452114">Pincode moet minimaal <ph name="MINIMUM" /> cijfers bevatten</translation>
-<translation id="5342344590724511265">Feedback over vastgelopen tabblad.</translation>
 <translation id="5342451237681332106"><ph name="PHONE_NAME" /> gebruiken</translation>
 <translation id="534916491091036097">Haakje openen</translation>
 <translation id="5350965906220856151">Oeps!</translation>
@@ -3216,6 +3209,7 @@
 <translation id="5764483294734785780">Audio op&amp;slaan als...</translation>
 <translation id="57646104491463491">Bijgewerkt op</translation>
 <translation id="5764797882307050727">Maak ruimte vrij op je apparaat.</translation>
+<translation id="5765425701854290211">Sommige bestanden zijn beschadigd en de update is mislukt. Je gesynchroniseerde bestanden zijn veilig.</translation>
 <translation id="5765491088802881382">Er zijn geen netwerken beschikbaar</translation>
 <translation id="5765780083710877561">Beschrijving:</translation>
 <translation id="5771585441665576801">Transliteratie (geia → γεια)</translation>
@@ -4432,6 +4426,7 @@
 <translation id="7615910377284548269">Blokkeren van plug-ins zonder sandbox beheren…</translation>
 <translation id="7617366389578322136">Verbinding maken met '<ph name="DEVICE_NAME" />'</translation>
 <translation id="761779991806306006">Geen wachtwoorden opgeslagen.</translation>
+<translation id="7622114377921274169">Opladen.</translation>
 <translation id="7624154074265342755">Draadloze netwerken</translation>
 <translation id="7624337243375417909">Caps Lock uit</translation>
 <translation id="7627790789328695202"><ph name="FILE_NAME" /> bestaat al. Geef een nieuwe naam op en probeer het opnieuw.</translation>
@@ -4871,6 +4866,7 @@
 <translation id="8270242299912238708">Pdf-documenten</translation>
 <translation id="827097179112817503">Knop 'Homepage' weergeven</translation>
 <translation id="8272443605911821513">Beheer je extensies door op 'Extensies' te klikken in het menu 'Meer tools'.</translation>
+<translation id="8274924778568117936">Je moet je <ph name="DEVICE_TYPE" /> niet uitschakelen of sluiten totdat de update is voltooid. Je <ph name="DEVICE_TYPE" /> wordt opnieuw opgestart nadat de installatie is voltooid.</translation>
 <translation id="8275038454117074363">Importeren</translation>
 <translation id="8276560076771292512">Cache wissen en geforceerd opnieuw laden</translation>
 <translation id="8279388322240498158">Op Engels gebaseerd toetsenbord voor Soranî</translation>
@@ -5313,7 +5309,6 @@
 <translation id="8963572037665351978">Presentatie sluiten</translation>
 <translation id="8965037249707889821">Oud wachtwoord opgeven</translation>
 <translation id="8965697826696209160">Er is onvoldoende ruimte.</translation>
-<translation id="8968527460726243404">ChromeOS System Image Writer</translation>
 <translation id="8970203673128054105">Lijst voor Cast-modus bekijken</translation>
 <translation id="89720367119469899">Escape</translation>
 <translation id="8972513834460200407">Neem contact op met je netwerkbeheerder om ervoor te zorgen dat downloads van Google-servers niet door de firewall worden geblokkeerd.</translation>
@@ -5489,6 +5484,7 @@
 <translation id="93766956588638423">Extensie repareren</translation>
 <translation id="938470336146445890">Installeer een gebruikerscertificaat.</translation>
 <translation id="938582441709398163">Overlay voor toetsenbord</translation>
+<translation id="939519157834106403">SSID</translation>
 <translation id="939598580284253335">Wachtwoordzin opgeven</translation>
 <translation id="939736085109172342">Nieuwe map</translation>
 <translation id="940425055435005472">Lettergrootte:</translation>
diff --git a/chrome/app/resources/generated_resources_no.xtb b/chrome/app/resources/generated_resources_no.xtb
index 2246c83ce..4b5ad7a 100644
--- a/chrome/app/resources/generated_resources_no.xtb
+++ b/chrome/app/resources/generated_resources_no.xtb
@@ -832,7 +832,6 @@
 <translation id="2224551243087462610">Rediger mappenavn</translation>
 <translation id="2226449515541314767">Full kontroll over MIDI-enheter er blokkert for dette nettstedet.</translation>
 <translation id="2226720438730111184">Fortell oss hva som skjer</translation>
-<translation id="222903405933288376">Google bruker posisjonen din for å gi deg lokalt innhold. Du kan endre dette i <ph name="SETTINGS_LINK" />.</translation>
 <translation id="2229161054156947610">Mer enn én time igjen</translation>
 <translation id="222931766245975952">Filen er komprimert</translation>
 <translation id="222949136907494149"><ph name="URL" /> ønsker å bruke posisjonen til enheten din.</translation>
@@ -1084,7 +1083,6 @@
 <translation id="2575247648642144396">Dette ikonet vises når utvidelsen kan brukes på den gjeldende siden. Aktivér utvidelsen ved å klikke på ikonet eller trykke på <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="2576842806987913196">Det fins allerede en .crx-fil med dette navnet.</translation>
 <translation id="2579575372772932244">Profilen opprettes på nytt. Vent litt …</translation>
-<translation id="2580168606262715640">Telefonen din ble ikke funnet. Sørg for at den er innenfor en armlengdes avstand.</translation>
 <translation id="2580889980133367162">Tillat alltid at <ph name="HOST" /> laster ned flere filer</translation>
 <translation id="2580924999637585241">Totalt: <ph name="SHEETS_LABEL" /> <ph name="NUMBER_OF_SHEETS" /></translation>
 <translation id="258095186877893873">Lang</translation>
@@ -2165,7 +2163,6 @@
 <translation id="4130207949184424187">Denne utvidelsen har endret hvilken side som vises når du søker fra multifunksjonsfeltet.</translation>
 <translation id="413121957363593859">Komponenter</translation>
 <translation id="4131410914670010031">Svarthvitt</translation>
-<translation id="4135054690906486073">Dette nettverket deles med andre brukere</translation>
 <translation id="4135450933899346655">Dine sertifikater</translation>
 <translation id="4138267921960073861">Vis brukernavn og bilder på påloggingsskjermen</translation>
 <translation id="4140559601186535628">Pushmeldinger</translation>
@@ -2569,9 +2566,6 @@
 <translation id="4813345808229079766">Tilkobling</translation>
 <translation id="4813512666221746211">Nettverksfeil</translation>
 <translation id="4816492930507672669">Tilpass til siden</translation>
-<translation id="4816617200045929931">Fortell oss nøyaktig hva som skjedde før du fikk profilfeilmeldingen:
-
-****IKKE ENDRE NOE NEDENFOR DENNE LINJEN****</translation>
 <translation id="4820334425169212497">Nei, jeg ser den ikke</translation>
 <translation id="4821086771593057290">Passordet er endret. Prøv på nytt med ditt nye passord.</translation>
 <translation id="4821935166599369261">&amp;Profilering aktivert</translation>
@@ -2934,7 +2928,6 @@
 <translation id="5340217413897845242">Hylleelement 6</translation>
 <translation id="5341390997810576190">bruke mobildata</translation>
 <translation id="5342091991439452114">PIN-koden må inneholde minst <ph name="MINIMUM" /> sifre</translation>
-<translation id="5342344590724511265">Tilbakemelding for kræsjet fane.</translation>
 <translation id="5342451237681332106">Bruk <ph name="PHONE_NAME" /></translation>
 <translation id="534916491091036097">Venstreparentes</translation>
 <translation id="5350965906220856151">Å nei!</translation>
@@ -3206,6 +3199,7 @@
 <translation id="5764483294734785780">La&amp;gre lyd som</translation>
 <translation id="57646104491463491">Dato endret</translation>
 <translation id="5764797882307050727">Du må frigjøre plass på enheten.</translation>
+<translation id="5765425701854290211">Beklager, men noen av filene var skadet, og oppdateringen kunne ikke gjennomføres. De synkroniserte filene dine er trygge.</translation>
 <translation id="5765491088802881382">Ingen nettverk er tilgjengelige</translation>
 <translation id="5765780083710877561">Beskrivelse:</translation>
 <translation id="5771585441665576801">Translitterasjon (geia → γεια)</translation>
@@ -4412,6 +4406,7 @@
 <translation id="7615910377284548269">Administrer blokkering av programtillegg uten prosessisolering</translation>
 <translation id="7617366389578322136">Kobler til «<ph name="DEVICE_NAME" />»</translation>
 <translation id="761779991806306006">Ingen passord er lagret.</translation>
+<translation id="7622114377921274169">Lader.</translation>
 <translation id="7624154074265342755">Trådløse nettverk</translation>
 <translation id="7624337243375417909">capslock er av</translation>
 <translation id="7627790789328695202">Beklager, <ph name="FILE_NAME" /> finnes allerede. Gi den et nytt navn og prøv igjen.</translation>
@@ -4851,6 +4846,7 @@
 <translation id="8270242299912238708">PDF-dokumenter</translation>
 <translation id="827097179112817503">Vis startsideknapp</translation>
 <translation id="8272443605911821513">Administrer utvidelsene dine ved å klikke på Utvidelser i Flere verktøy-menyen.</translation>
+<translation id="8274924778568117936">Du må ikke slå av eller lukke <ph name="DEVICE_TYPE" />-enheten din før oppdateringen er ferdig. <ph name="DEVICE_TYPE" />-enheten starter på nytt når installasjonen er ferdig.</translation>
 <translation id="8275038454117074363">Importer</translation>
 <translation id="8276560076771292512">Tøm bufferen og kjør en hard nyinnlasting</translation>
 <translation id="8279388322240498158">Engelsk-basert tastatur for kurdisk (sorani)</translation>
@@ -5291,7 +5287,6 @@
 <translation id="8963572037665351978">Lukk presentasjonen</translation>
 <translation id="8965037249707889821">Skriv inn det gamle passordet</translation>
 <translation id="8965697826696209160">Du har ikke nok ledig plass.</translation>
-<translation id="8968527460726243404">ChromeOS System Image Writer</translation>
 <translation id="8970203673128054105">Vis listen over castemoduser</translation>
 <translation id="89720367119469899">Escape</translation>
 <translation id="8972513834460200407">Kontakt nettverksadministratoren din for å sjekke at brannmuren ikke blokkerer nedlastinger fra Google-tjenere.</translation>
@@ -5467,6 +5462,7 @@
 <translation id="93766956588638423">Reparer utvidelsen</translation>
 <translation id="938470336146445890">Installer et brukersertifikat.</translation>
 <translation id="938582441709398163">Tastaturbelegg</translation>
+<translation id="939519157834106403">SSID</translation>
 <translation id="939598580284253335">Angi en passordfrase</translation>
 <translation id="939736085109172342">Ny mappe</translation>
 <translation id="940425055435005472">Skriftstørrelse:</translation>
diff --git a/chrome/app/resources/generated_resources_pl.xtb b/chrome/app/resources/generated_resources_pl.xtb
index 12b971e..91f7f900 100644
--- a/chrome/app/resources/generated_resources_pl.xtb
+++ b/chrome/app/resources/generated_resources_pl.xtb
@@ -835,7 +835,6 @@
 <translation id="2224551243087462610">Edytuj nazwę folderu</translation>
 <translation id="2226449515541314767">Pełny dostęp do sterowania urządzeniami MIDI został dla tej witryny zablokowany.</translation>
 <translation id="2226720438730111184">Powiedz nam, co się dzieje</translation>
-<translation id="222903405933288376">Google korzysta z informacji o Twojej lokalizacji, by zapewnić Ci lokalne wyniki. Możesz to zmienić na stronie <ph name="SETTINGS_LINK" />.</translation>
 <translation id="2229161054156947610">Została ponad 1 godzina</translation>
 <translation id="222931766245975952">Plik obcięty</translation>
 <translation id="222949136907494149"><ph name="URL" /> chce użyć lokalizacji Twojego komputera.</translation>
@@ -1087,7 +1086,6 @@
 <translation id="2575247648642144396">Ta ikona będzie widoczna, gdy rozszerzenie będzie mogło działać na bieżącej stronie. Użyj tego rozszerzenia, klikając ikonę lub naciskając <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="2576842806987913196">Plik CRX o tej nazwie już istnieje.</translation>
 <translation id="2579575372772932244">Odtwarzam profil, czekaj...</translation>
-<translation id="2580168606262715640">Nie można znaleźć telefonu. Upewnij się, że jest on w zasięgu ręki.</translation>
 <translation id="2580889980133367162">Zawsze zezwalaj <ph name="HOST" /> na pobieranie wielu plików</translation>
 <translation id="2580924999637585241">Łącznie: <ph name="SHEETS_LABEL" /> – <ph name="NUMBER_OF_SHEETS" /></translation>
 <translation id="258095186877893873">Długie</translation>
@@ -2172,7 +2170,6 @@
 <translation id="4130207949184424187">To rozszerzenie ustawiło inną stronę wyświetlaną po wyszukiwaniu w omniboksie.</translation>
 <translation id="413121957363593859">Komponenty</translation>
 <translation id="4131410914670010031">Czarno-biały</translation>
-<translation id="4135054690906486073">Ta sieć jest udostępniana innym użytkownikom</translation>
 <translation id="4135450933899346655">Twoje certyfikaty</translation>
 <translation id="4138267921960073861">Pokaż nazwy użytkowników i zdjęcia na stronie logowania</translation>
 <translation id="4140559601186535628">Wiadomości push</translation>
@@ -2573,9 +2570,6 @@
 <translation id="4813345808229079766">Połączenie</translation>
 <translation id="4813512666221746211">Błąd sieci</translation>
 <translation id="4816492930507672669">Dopasuj do strony</translation>
-<translation id="4816617200045929931">Opisz dokładnie, co działo się przed wyświetleniem komunikatu o błędzie profilu:
-
-****NIE ZMIENIAJ NIC PONIŻEJ TEJ LINII****</translation>
 <translation id="4820334425169212497">Nie, nie widzę</translation>
 <translation id="4821086771593057290">Twoje hasło zostało zmienione. Spróbuj ponownie, podając nowe hasło.</translation>
 <translation id="4821935166599369261">&amp;Profilowanie włączone</translation>
@@ -2942,7 +2936,6 @@
 <translation id="5340217413897845242">6 element na półce</translation>
 <translation id="5341390997810576190">będzie korzystać z komórkowej transmisji danych</translation>
 <translation id="5342091991439452114">Kod PIN musi się składać co najmniej z <ph name="MINIMUM" /> cyfr</translation>
-<translation id="5342344590724511265">Informacje o awarii karty.</translation>
 <translation id="5342451237681332106">Użyj: <ph name="PHONE_NAME" /></translation>
 <translation id="534916491091036097">Lewy nawias</translation>
 <translation id="5350965906220856151">Ups...</translation>
@@ -3214,6 +3207,7 @@
 <translation id="5764483294734785780">Za&amp;pisz element audio jako...</translation>
 <translation id="57646104491463491">Data modyfikacji</translation>
 <translation id="5764797882307050727">Zwolnij trochę miejsca na urządzeniu.</translation>
+<translation id="5765425701854290211">Niektóre pliki zostały uszkodzone i aktualizacja nie udała się. Synchronizowane pliki są bezpieczne.</translation>
 <translation id="5765491088802881382">Nie są dostępne żadne sieci</translation>
 <translation id="5765780083710877561">Opis:</translation>
 <translation id="5771585441665576801">Transliteracja (geia → γεια)</translation>
@@ -4422,6 +4416,7 @@
 <translation id="7615910377284548269">Zarządzaj blokowaniem wtyczek spoza piaskownicy...</translation>
 <translation id="7617366389578322136">Łączę się z urządzeniem „<ph name="DEVICE_NAME" />”</translation>
 <translation id="761779991806306006">Nie ma zapisanych haseł.</translation>
+<translation id="7622114377921274169">Ładuję.</translation>
 <translation id="7624154074265342755">Sieci bezprzewodowe</translation>
 <translation id="7624337243375417909">caps lock wyłączony</translation>
 <translation id="7627790789328695202">Ups, plik <ph name="FILE_NAME" /> już istnieje. Zmień jego nazwę i spróbuj ponownie.</translation>
@@ -4861,6 +4856,7 @@
 <translation id="8270242299912238708">Dokumenty PDF</translation>
 <translation id="827097179112817503">Pokaż przycisk strony startowej</translation>
 <translation id="8272443605911821513">Aby zarządzać zainstalowanymi rozszerzeniami, kliknij Rozszerzenia w menu Więcej narzędzi.</translation>
+<translation id="8274924778568117936">Nie wyłączaj ani nie zamykaj urządzenia <ph name="DEVICE_TYPE" /> do momentu ukończenia aktualizacji. Po zakończeniu instalacji <ph name="DEVICE_TYPE" /> uruchomi się ponownie.</translation>
 <translation id="8275038454117074363">Importuj</translation>
 <translation id="8276560076771292512">Opróżnij pamięć podręczną i wymuś ponowne załadowanie</translation>
 <translation id="8279388322240498158">Klawiatura dla języka sorani oparta na angielskiej</translation>
@@ -5301,7 +5297,6 @@
 <translation id="8963572037665351978">Zakończ prezentację</translation>
 <translation id="8965037249707889821">Wpisz stare hasło</translation>
 <translation id="8965697826696209160">Nie ma wystarczającej ilości miejsca.</translation>
-<translation id="8968527460726243404">Program do zapisu obrazu systemu Chrome OS</translation>
 <translation id="8970203673128054105">Pokaż listę trybów przesyłania</translation>
 <translation id="89720367119469899">Ucieczka</translation>
 <translation id="8972513834460200407">Skontaktuj się z administratorem sieci, by dowiedzieć się, czy zapora sieciowa nie blokuje pobrań z serwerów Google.</translation>
@@ -5476,6 +5471,7 @@
 <translation id="93766956588638423">Napraw rozszerzenie</translation>
 <translation id="938470336146445890">Zainstaluj certyfikat użytkownika.</translation>
 <translation id="938582441709398163">Nakładka klawiatury</translation>
+<translation id="939519157834106403">SSID</translation>
 <translation id="939598580284253335">Wpisz hasło</translation>
 <translation id="939736085109172342">Nowy folder</translation>
 <translation id="940425055435005472">Rozmiar czcionki:</translation>
diff --git a/chrome/app/resources/generated_resources_pt-BR.xtb b/chrome/app/resources/generated_resources_pt-BR.xtb
index 42abd11..267508b 100644
--- a/chrome/app/resources/generated_resources_pt-BR.xtb
+++ b/chrome/app/resources/generated_resources_pt-BR.xtb
@@ -835,7 +835,6 @@
 <translation id="2224551243087462610">Editar nome da pasta</translation>
 <translation id="2226449515541314767">O controle total de dispositivos MIDI foi bloqueado neste site.</translation>
 <translation id="2226720438730111184">Conte-nos o que está acontecendo</translation>
-<translation id="222903405933288376">O Google usa sua localização para fornecer conteúdo local. É possível alterar essa configuração em <ph name="SETTINGS_LINK" />.</translation>
 <translation id="2229161054156947610">Mais de 1 hora restante</translation>
 <translation id="222931766245975952">Arquivo truncado</translation>
 <translation id="222949136907494149"><ph name="URL" /> quer usar a localização de seu computador.</translation>
@@ -1087,7 +1086,6 @@
 <translation id="2575247648642144396">Este ícone ficará visível quando a extensão puder agir na página atual. Para usar essa extensão, clique no ícone ou pressione <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="2576842806987913196">Já existe um arquivo CRX com este nome.</translation>
 <translation id="2579575372772932244">Recriando perfil. Aguarde…</translation>
-<translation id="2580168606262715640">Não foi possível localizar seu smartphone. Verifique se ele está ao alcance do braço.</translation>
 <translation id="2580889980133367162">Sempre permitir que <ph name="HOST" /> faça download de vários arquivos</translation>
 <translation id="2580924999637585241">Total: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">Longo</translation>
@@ -2172,7 +2170,6 @@
 <translation id="4130207949184424187">Esta extensão alterou a página que é exibida quando você pesquisa na Omnibox.</translation>
 <translation id="413121957363593859">Componentes</translation>
 <translation id="4131410914670010031">Preto e branco</translation>
-<translation id="4135054690906486073">Esta rede é compartilhada com outros usuários</translation>
 <translation id="4135450933899346655">Seus certificados</translation>
 <translation id="4138267921960073861">Mostrar nomes de usuários e fotos na tela de login</translation>
 <translation id="4140559601186535628">Mensagens push</translation>
@@ -2574,8 +2571,6 @@
 <translation id="4813345808229079766">Conexão</translation>
 <translation id="4813512666221746211">Erro na rede</translation>
 <translation id="4816492930507672669">Ajustar à página</translation>
-<translation id="4816617200045929931">Conte o que aconteceu exatamente antes de você receber a mensagem de erro de perfil:
-****NÃO ALTERAR ABAIXO DESTA LINHA****</translation>
 <translation id="4820334425169212497">Não, não estou vendo</translation>
 <translation id="4821086771593057290">Sua senha foi alterada. Tente novamente com a nova senha.</translation>
 <translation id="4821935166599369261">&amp;Criação de perfil ativada</translation>
@@ -2941,7 +2936,6 @@
 <translation id="5340217413897845242">Item 6 da estante</translation>
 <translation id="5341390997810576190">Usar dados da rede celular</translation>
 <translation id="5342091991439452114">O PIN deve ter no mínimo <ph name="MINIMUM" /> dígitos</translation>
-<translation id="5342344590724511265">Feedback de falha de guia.</translation>
 <translation id="5342451237681332106">Usar <ph name="PHONE_NAME" /></translation>
 <translation id="534916491091036097">Parêntese esq.</translation>
 <translation id="5350965906220856151">Ah, não…</translation>
@@ -3214,6 +3208,7 @@
 <translation id="5764483294734785780">Sal&amp;var áudio como...</translation>
 <translation id="57646104491463491">Data da modificação</translation>
 <translation id="5764797882307050727">Libere espaço no seu dispositivo.</translation>
+<translation id="5765425701854290211">Alguns arquivos foram danificados, e a atualização não foi concluída. Seus arquivos sincronizados estão protegidos.</translation>
 <translation id="5765491088802881382">Não há redes disponíveis</translation>
 <translation id="5765780083710877561">Descrição:</translation>
 <translation id="5771585441665576801">Transliteração (geia → γεια)</translation>
@@ -4432,6 +4427,7 @@
 <translation id="7615910377284548269">Gerenciar o bloqueio de plug-ins sem sandbox...</translation>
 <translation id="7617366389578322136">Conectando-se a "<ph name="DEVICE_NAME" />"</translation>
 <translation id="761779991806306006">Não há senhas salvas.</translation>
+<translation id="7622114377921274169">Carregando.</translation>
 <translation id="7624154074265342755">Redes sem fio</translation>
 <translation id="7624337243375417909">tecla caps lock desativada</translation>
 <translation id="7627790789328695202">O item <ph name="FILE_NAME" /> já existe. Renomeie-o e tente novamente.</translation>
@@ -4871,6 +4867,7 @@
 <translation id="8270242299912238708">Documentos em PDF</translation>
 <translation id="827097179112817503">Mostrar botão "Página inicial"</translation>
 <translation id="8272443605911821513">Gerencie suas extensões clicando em "Extensões" no menu "Mais ferramentas".</translation>
+<translation id="8274924778568117936">Não desligue ou feche seu <ph name="DEVICE_TYPE" /> até que a atualização termine. O <ph name="DEVICE_TYPE" /> será reiniciado depois que a instalação for concluída.</translation>
 <translation id="8275038454117074363">Importar</translation>
 <translation id="8276560076771292512">Esvaziar cache e recarregamento forçado</translation>
 <translation id="8279388322240498158">Teclado curdo sorâni baseado em inglês</translation>
@@ -5311,7 +5308,6 @@
 <translation id="8963572037665351978">Sair da apresentação</translation>
 <translation id="8965037249707889821">Digite a senha antiga</translation>
 <translation id="8965697826696209160">Não há espaço suficiente.</translation>
-<translation id="8968527460726243404">Gravador de imagem do sistema Chrome OS</translation>
 <translation id="8970203673128054105">Ver lista do modo de transmissão</translation>
 <translation id="89720367119469899">Escape</translation>
 <translation id="8972513834460200407">Verifique com seu administrador de rede se o firewall não está bloqueando downloads dos servidores do Google.</translation>
@@ -5486,6 +5482,7 @@
 <translation id="93766956588638423">Reparar extensão</translation>
 <translation id="938470336146445890">Instale um certificado do usuário.</translation>
 <translation id="938582441709398163">Sobreposição do teclado</translation>
+<translation id="939519157834106403">SSID</translation>
 <translation id="939598580284253335">Inserir senha</translation>
 <translation id="939736085109172342">Nova pasta</translation>
 <translation id="940425055435005472">Tamanho da fonte:</translation>
diff --git a/chrome/app/resources/generated_resources_pt-PT.xtb b/chrome/app/resources/generated_resources_pt-PT.xtb
index 279c893..de267755 100644
--- a/chrome/app/resources/generated_resources_pt-PT.xtb
+++ b/chrome/app/resources/generated_resources_pt-PT.xtb
@@ -63,7 +63,7 @@
 <translation id="1091767800771861448">Prima ESCAPE para ignorar (apenas nas compilações não oficiais).</translation>
 <translation id="1093457606523402488">Redes visíveis</translation>
 <translation id="1094607894174825014">Foi solicitada uma operação de leitura ou de escrita com um desvio inválido em: "<ph name="DEVICE_NAME" />".</translation>
-<translation id="1097507499312291972"><ph name="BEGIN_SIGN_IN_LINK" />Inicie sessão<ph name="END_SIGN_IN_LINK" /> para controlar e visualizar os Websites que esta pessoa visita.</translation>
+<translation id="1097507499312291972"><ph name="BEGIN_SIGN_IN_LINK" />Inicie sessão<ph name="END_SIGN_IN_LINK" /> para controlar e visualizar os Sites que esta pessoa visita.</translation>
 <translation id="1097658378307015415">Antes de iniciar sessão, entre como Convidado para ativar a rede <ph name="NETWORK_ID" /></translation>
 <translation id="1108600514891325577">&amp;Parar</translation>
 <translation id="110918622319006905">VPN de terceiros</translation>
@@ -292,7 +292,7 @@
 <translation id="1427049173708736891">Mantenha o seu <ph name="DEVICE_TYPE" /> desbloqueado quando o seu telemóvel Android estiver desbloqueado e próximo. Não é necessário introduzir a palavra-passe.</translation>
 <translation id="142758023928848008">Ativar as teclas aderentes (para executar atalhos de teclado escrevendo-os sequencialmente)</translation>
 <translation id="1429740407920618615">Intensidade do Sinal:</translation>
-<translation id="143027896309062157">Ler e alterar todos os dados no computador e os Websites que visita</translation>
+<translation id="143027896309062157">Ler e alterar todos os dados no computador e os Sites que visita</translation>
 <translation id="1430915738399379752">Imprimir</translation>
 <translation id="1432581352905426595">Gerir motores de pesquisa</translation>
 <translation id="1433811987160647649">Perguntar antes de aceder</translation>
@@ -463,8 +463,8 @@
 <translation id="1646982517418478057">Introduza uma palavra-passe para encriptar este certificado</translation>
 <translation id="164729547906544836">Teclado tâmil (itrans)</translation>
 <translation id="164814987133974965">Um utilizador supervisionado pode explorar a Web com a sua orientação. Enquanto gestor de um utilizador supervisionado, pode
-    <ph name="BEGIN_BOLD" />permitir ou proibir<ph name="END_BOLD" /> determinados Websites,
-    <ph name="BEGIN_BOLD" />analisar<ph name="END_BOLD" /> os Websites que o utilizador supervisionado tenha visitado e
+    <ph name="BEGIN_BOLD" />permitir ou proibir<ph name="END_BOLD" /> determinados Sites,
+    <ph name="BEGIN_BOLD" />analisar<ph name="END_BOLD" /> os Sites que o utilizador supervisionado tenha visitado e
     <ph name="BEGIN_BOLD" />gerir<ph name="END_BOLD" /> outras definições.</translation>
 <translation id="1648797160541174252">Proxy de rede para <ph name="NETWORK_NAME" /></translation>
 <translation id="1648943974594387137">Os detalhes de início de sessão estão desatualizados</translation>
@@ -836,7 +836,6 @@
 <translation id="2224551243087462610">Editar nome da pasta</translation>
 <translation id="2226449515541314767">Este site foi impedido de ter controlo total sobre dispositivos MIDI.</translation>
 <translation id="2226720438730111184">Indique-nos o que está a acontecer</translation>
-<translation id="222903405933288376">O Google utiliza a sua localização para lhe fornecer conteúdo local. Pode alterar esta opção em <ph name="SETTINGS_LINK" />.</translation>
 <translation id="2229161054156947610">Falta mais de 1 hora</translation>
 <translation id="222931766245975952">Ficheiro truncado</translation>
 <translation id="222949136907494149"><ph name="URL" /> pretende utilizar a localização do seu computador.</translation>
@@ -848,7 +847,7 @@
 <translation id="2233502537820838181">&amp;Mais informações</translation>
 <translation id="2238379619048995541">Dados do estado de frequência</translation>
 <translation id="2239921694246509981">Adicionar pessoa supervisionada</translation>
-<translation id="2241053333139545397">Ler e alterar os seus dados em vários Websites</translation>
+<translation id="2241053333139545397">Ler e alterar os seus dados em vários Sites</translation>
 <translation id="2241634353105152135">Apenas uma vez</translation>
 <translation id="2242603986093373032">Nenhum dispositivo</translation>
 <translation id="2242687258748107519">Informação de ficheiro</translation>
@@ -856,8 +855,8 @@
 <translation id="2246340272688122454">A transferir imagem de recuperação...</translation>
 <translation id="2249499294612408921">Um utilizador supervisionado pode explorar a Web com a sua orientação. Na qualidade de gestor de um utilizador supervisionado no Chrome, pode
 
- • autorizar ou proibir determinados Websites,
- • verificar Websites que o utilizador supervisionado visitou e
+ • autorizar ou proibir determinados Sites,
+ • verificar Sites que o utilizador supervisionado visitou e
  • gerir outras definições.
 
 A criação de um utilizador supervisionado não cria uma Conta Google, pelo que os marcadores, o histórico de navegação e outras preferências de um utilizador supervisionado não o seguem para outros dispositivos com a Sincronização do Chrome.
@@ -1088,7 +1087,6 @@
 <translation id="2575247648642144396">Este ícone estará visível quando a extensão puder agir na página atual. Clique no ícone ou prima <ph name="EXTENSION_SHORTCUT" /> para utilizar esta extensão.</translation>
 <translation id="2576842806987913196">Já existe um ficheiro CRX com este nome.</translation>
 <translation id="2579575372772932244">A recriar o perfil. Aguarde…</translation>
-<translation id="2580168606262715640">Não é possível localizar o telemóvel. Certifique-se de que o mesmo está à distância de um braço.</translation>
 <translation id="2580889980133367162">Permitir sempre que o <ph name="HOST" /> transfira vários ficheiros</translation>
 <translation id="2580924999637585241">Total: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">Longo</translation>
@@ -1203,7 +1201,7 @@
 <translation id="2738771556149464852">Não posterior a</translation>
 <translation id="2739191690716947896">Depurar</translation>
 <translation id="2739240477418971307">Alterar as definições de acessibilidade</translation>
-<translation id="2740393541869613458">analisar Websites que o utilizador supervisionado visitou e</translation>
+<translation id="2740393541869613458">analisar Sites que o utilizador supervisionado visitou e</translation>
 <translation id="2743387203779672305">Copiar para a área de transferência</translation>
 <translation id="2744221223678373668">Partilhadas</translation>
 <translation id="2745080116229976798">Subordinação qualificada Microsoft</translation>
@@ -1275,7 +1273,7 @@
 <translation id="2815500128677761940">Barra de marcadores</translation>
 <translation id="2815693974042551705">Pasta de marcadores</translation>
 <translation id="2817109084437064140">Importar e vincular ao dispositivo...</translation>
-<translation id="2817861546829549432">A activação de “Do Not Track” (Não Seguir) significa que será incluído um pedido com o seu tráfego de navegação. Qualquer efeito depende de um Website responder ou não ao pedido e do modo como o pedido será interpretado. Por exemplo, alguns Websites poderão responder a este pedido mostrando-lhe anúncios que não têm por base outros Websites que visitou. Ainda assim, muitos Websites recolherão e utilizarão os seus dados de navegação para, por exemplo, melhorar a segurança, fornecer conteúdo, serviços, anúncios e recomendações sobre os seus Websites, e gerar relatórios estatísticos.</translation>
+<translation id="2817861546829549432">A activação de “Do Not Track” (Não Seguir) significa que será incluído um pedido com o seu tráfego de navegação. Qualquer efeito depende de um Website responder ou não ao pedido e do modo como o pedido será interpretado. Por exemplo, alguns Sites poderão responder a este pedido mostrando-lhe anúncios que não têm por base outros Sites que visitou. Ainda assim, muitos Sites recolherão e utilizarão os seus dados de navegação para, por exemplo, melhorar a segurança, fornecer conteúdo, serviços, anúncios e recomendações sobre os seus Sites, e gerar relatórios estatísticos.</translation>
 <translation id="2818476747334107629">Detalhes da impressora</translation>
 <translation id="2822634587701817431">Reduzir/expandir</translation>
 <translation id="2825758591930162672">Chave pública do requerente</translation>
@@ -1426,8 +1424,8 @@
 <translation id="302781076327338683">Atualizar processo para ignorar a cache</translation>
 <translation id="3030243755303701754">Um utilizador supervisionado pode explorar a Web com a sua orientação. Como gestor de um utilizador supervisionado no Chrome, pode:
 
- • permitir ou proibir determinados Websites,
- • rever os Websites visitados pelo utilizador supervisionado, e
+ • permitir ou proibir determinados Sites,
+ • rever os Sites visitados pelo utilizador supervisionado, e
  • gerir outras definições.
 
 A criação de um utilizador supervisionado não cria uma Conta Google, pelo que os marcadores, o histórico de navegação e outras preferências de um utilizador supervisionado não o seguem para outros dispositivos com a Sincronização do Chrome. Depois de criar um novo utilizador supervisionado, pode gerir as respetivas definições a qualquer momento, a partir de qualquer dispositivo, em <ph name="BEGIN_MANAGE_LINK" /><ph name="DISPLAY_LINK" /><ph name="END_MANAGE_LINK" />.
@@ -1495,7 +1493,7 @@
 <translation id="312759608736432009">Fabricante do dispositivo:</translation>
 <translation id="3127919023693423797">A autenticar...</translation>
 <translation id="3128230619496333808">Separador 6</translation>
-<translation id="3129046656563914402">Foi criado um utilizador supervisionado com o nome <ph name="NEW_PROFILE_NAME" />. Para definir que Websites este utilizador supervisionado pode ver, pode configurar restrições e definições em <ph name="BEGIN_LINK" /><ph name="DISPLAY_LINK" /><ph name="END_LINK" />. Se não alterar as predefinições, <ph name="NEW_PROFILE_NAME" /> pode navegar em todos os sites na Web.
+<translation id="3129046656563914402">Foi criado um utilizador supervisionado com o nome <ph name="NEW_PROFILE_NAME" />. Para definir que Sites este utilizador supervisionado pode ver, pode configurar restrições e definições em <ph name="BEGIN_LINK" /><ph name="DISPLAY_LINK" /><ph name="END_LINK" />. Se não alterar as predefinições, <ph name="NEW_PROFILE_NAME" /> pode navegar em todos os sites na Web.
 
 Verifique o seu email em <ph name="ACCOUNT_EMAIL" /> para obter estas e outras instruções.</translation>
 <translation id="3129140854689651517">Localizar texto</translation>
@@ -1523,7 +1521,7 @@
 <translation id="316125635462764134">Remover aplicação</translation>
 <translation id="3161522574479303604">Todos os idiomas</translation>
 <translation id="3162559335345991374">A rede Wi-Fi que está a utilizar pode exigir que visite a respetiva página de início de sessão.</translation>
-<translation id="316307797510303346">Controlar e visualizar os Websites que esta pessoa visita a partir de <ph name="CUSTODIAN_EMAIL" />.
+<translation id="316307797510303346">Controlar e visualizar os Sites que esta pessoa visita a partir de <ph name="CUSTODIAN_EMAIL" />.
   Os detalhes de início de sessão da sua conta estão desatualizados.</translation>
 <translation id="3165390001037658081">Alguns operadores podem bloquear esta funcionalidade.</translation>
 <translation id="3166571619128686629">Clique ou diga "OK Google" para iniciar uma pesquisa por voz</translation>
@@ -1623,7 +1621,7 @@
 <translation id="3313080019966590424"><ph name="DOWNLOAD_RECEIVED_AND_TOTAL" />, <ph name="SUB_STATUS_TEXT" />
 De <ph name="DOWNLOAD_DOMAIN" /></translation>
 <translation id="3313473140726597081">A sua página inicial foi alterada para <ph name="URL" />. Para desativar as extensões que alteram a sua página inicial, clique em Restaurar.</translation>
-<translation id="3313590242757056087">Para definir que Websites o utilizador supervisionado pode ver, pode configurar restrições
+<translation id="3313590242757056087">Para definir que Sites o utilizador supervisionado pode ver, pode configurar restrições
     e definições em <ph name="MANAGEMENT_URL" />.
     Se não alterar as predefinições, <ph name="USER_DISPLAY_NAME" />
     pode navegar por todos os sites na Web.</translation>
@@ -1708,7 +1706,7 @@
 <translation id="3441653493275994384">Ecrã</translation>
 <translation id="3445092916808119474">Tornar no ecrã principal</translation>
 <translation id="3445830502289589282">Autenticação da fase 2:</translation>
-<translation id="344630545793878684">Ler os seus dados em vários Websites</translation>
+<translation id="344630545793878684">Ler os seus dados em vários Sites</translation>
 <translation id="3449839693241009168">Prima <ph name="SEARCH_KEY" /> para enviar comandos para <ph name="EXTENSION_NAME" /></translation>
 <translation id="3450157232394774192">Percentagem de ocupação no estado inativo</translation>
 <translation id="3450505713373650336">A fazer cópia de segurança de <ph name="FILE_COUNT" /> fotografias</translation>
@@ -2174,7 +2172,6 @@
 <translation id="4130207949184424187">Esta extensão alterou a página apresentada quando pesquisa a partir da caixa geral.</translation>
 <translation id="413121957363593859">Componentes</translation>
 <translation id="4131410914670010031">Preto e branco</translation>
-<translation id="4135054690906486073">Esta rede é partilhada com outros utilizadores</translation>
 <translation id="4135450933899346655">Os seus certificados</translation>
 <translation id="4138267921960073861">Mostrar nomes de utilizador e fotografias no ecrã de início de sessão</translation>
 <translation id="4140559601186535628">Mensagens push</translation>
@@ -2548,7 +2545,7 @@
 <translation id="4759238208242260848">Transferências</translation>
 <translation id="4761104368405085019">Utilizar o seu microfone</translation>
 <translation id="4762718786438001384">Espaço em disco do dispositivo criticamente baixo</translation>
-<translation id="4763830802490665879">Os cookies de vários Websites serão apagados à saída.</translation>
+<translation id="4763830802490665879">Os cookies de vários Sites serão apagados à saída.</translation>
 <translation id="4768332406694066911">Tem certificados destas entidades que o identificam</translation>
 <translation id="4768698601728450387">Recortar imagem</translation>
 <translation id="4776917500594043016">Palavra-passe para <ph name="USER_EMAIL_ADDRESS" /></translation>
@@ -2578,9 +2575,6 @@
 <translation id="4813345808229079766">Ligação</translation>
 <translation id="4813512666221746211">Erro de rede</translation>
 <translation id="4816492930507672669">Ajustar à página</translation>
-<translation id="4816617200045929931">Diga-nos o que aconteceu exatamente antes de lhe ter aparecido a mensagem de erro do perfil:
-
-****NÃO ALTERAR ABAIXO DESTA LINHA****</translation>
 <translation id="4820334425169212497">Não, não estou a ver</translation>
 <translation id="4821086771593057290">A sua palavra-passe foi alterada. Tente novamente com a nova palavra-passe.</translation>
 <translation id="4821935166599369261">Criação de &amp;perfis ativada</translation>
@@ -2698,7 +2692,7 @@
 <translation id="4974733135013075877">Sair e bloqueio para crianças</translation>
 <translation id="4977942889532008999">Confirmar acesso</translation>
 <translation id="4980805016576257426">Esta extensão contém um programa malicioso.</translation>
-<translation id="498294082491145744">Altere as definições que controlam o acesso dos Websites a funcionalidades como cookies, JavaScript, plug-ins, geolocalização, microfone, câmara, etc.</translation>
+<translation id="498294082491145744">Altere as definições que controlam o acesso dos Sites a funcionalidades como cookies, JavaScript, plug-ins, geolocalização, microfone, câmara, etc.</translation>
 <translation id="4988526792673242964">Páginas </translation>
 <translation id="4988792151665380515">Falha ao exportar chave pública.</translation>
 <translation id="49896407730300355">Rodar para a &amp;esquerda</translation>
@@ -2866,7 +2860,7 @@
 <translation id="5235050375939235066">Pretende desinstalar a aplicação?</translation>
 <translation id="5238278114306905396">A aplicação "<ph name="EXTENSION_NAME" />" foi automaticamente removida.</translation>
 <translation id="5238369540257804368">Âmbitos</translation>
-<translation id="5241128660650683457">Ler todos os dados nos Websites visitados</translation>
+<translation id="5241128660650683457">Ler todos os dados nos Sites visitados</translation>
 <translation id="5241298539944515331">Teclado vietnamita (VIQR)</translation>
 <translation id="5242724311594467048">Ativar a extensão "<ph name="EXTENSION_NAME" />"?</translation>
 <translation id="5245965967288377800">Rede WiMAX</translation>
@@ -2897,7 +2891,7 @@
 <translation id="527605719918376753">Desativar som do separador</translation>
 <translation id="527605982717517565">Permitir sempre JavaScript em <ph name="HOST" /></translation>
 <translation id="52809057403474396">Os plug-ins foram bloqueados nesta página.</translation>
-<translation id="5282733140964383898">Se ativar a funcionalidade "Não Monitorizar", será incluído um pedido no seu tráfego de navegação. Os possíveis efeitos dependerão da resposta ao pedido por parte de um Website e da forma como o pedido é interpretado. Por exemplo, alguns Websites poderão mostrar anúncios que não sejam baseados noutros Websites visitados por si como resposta a este pedido. Muitos Websites continuarão a recolher e utilizar os seus dados de navegação com o objetivo de melhorar a segurança, fornecer conteúdos, serviços, anúncios e recomendações nos seus Websites e gerar estatísticas de relatórios. <ph name="BEGIN_LINK" />Saiba mais<ph name="END_LINK" /></translation>
+<translation id="5282733140964383898">Se ativar a funcionalidade "Não Monitorizar", será incluído um pedido no seu tráfego de navegação. Os possíveis efeitos dependerão da resposta ao pedido por parte de um Website e da forma como o pedido é interpretado. Por exemplo, alguns Sites poderão mostrar anúncios que não sejam baseados noutros Sites visitados por si como resposta a este pedido. Muitos Sites continuarão a recolher e utilizar os seus dados de navegação com o objetivo de melhorar a segurança, fornecer conteúdos, serviços, anúncios e recomendações nos seus Sites e gerar estatísticas de relatórios. <ph name="BEGIN_LINK" />Saiba mais<ph name="END_LINK" /></translation>
 <translation id="5283677936944177147">Ups! O sistema não conseguiu determinar o modelo ou o número de série do dispositivo.</translation>
 <translation id="528468243742722775">End</translation>
 <translation id="5287425679749926365">As suas contas</translation>
@@ -2946,7 +2940,6 @@
 <translation id="5340217413897845242">Artigo de prateleira 6</translation>
 <translation id="5341390997810576190">Utilizar dados móveis</translation>
 <translation id="5342091991439452114">O PIN deve ter pelo menos <ph name="MINIMUM" /> dígitos</translation>
-<translation id="5342344590724511265">Comentários acerca de falha do separador.</translation>
 <translation id="5342451237681332106">Utilizar o <ph name="PHONE_NAME" /></translation>
 <translation id="534916491091036097">Parêntesis esquerdo</translation>
 <translation id="5350965906220856151">Ups!</translation>
@@ -2990,7 +2983,7 @@
 <translation id="5409029099497331039">Surpreenda-me</translation>
 <translation id="5411472733320185105">Não utilize as definições de proxy para os anfitriões e domínios seguintes:</translation>
 <translation id="5412637665001827670">Teclado búlgaro</translation>
-<translation id="5414566801737831689">Ler os ícones dos Websites que visita</translation>
+<translation id="5414566801737831689">Ler os ícones dos Sites que visita</translation>
 <translation id="5417998409611691946">Agora, o <ph name="DEVICE_TYPE" /> pode:</translation>
 <translation id="5418923334382419584">Teclado birmanês</translation>
 <translation id="5419294236999569767">Hora do sistema</translation>
@@ -3219,6 +3212,7 @@
 <translation id="5764483294734785780">Gua&amp;rdar áudio como...</translation>
 <translation id="57646104491463491">Data modificada</translation>
 <translation id="5764797882307050727">Liberte algum espaço no dispositivo.</translation>
+<translation id="5765425701854290211">Infelizmente, alguns ficheiros estavam danificados, pelo que a atualização não foi concluída com êxito. Os seus ficheiros sincronizados estão seguros.</translation>
 <translation id="5765491088802881382">Não existe nenhuma rede disponível</translation>
 <translation id="5765780083710877561">Descrição:</translation>
 <translation id="5771585441665576801">Transliteração (geia → γεια)</translation>
@@ -3336,7 +3330,7 @@
 <translation id="5921745308587794300">Rodar janela</translation>
 <translation id="5924047253200400718">Obter ajuda<ph name="SCANNING_STATUS" /></translation>
 <translation id="5925147183566400388">Apontador para a declaração de práticas de certificação</translation>
-<translation id="5931146425219109062">Ler e alterar todos os dados nos Websites que visita</translation>
+<translation id="5931146425219109062">Ler e alterar todos os dados nos Sites que visita</translation>
 <translation id="5932881020239635062">Série</translation>
 <translation id="5933376509899483611">Fuso horário</translation>
 <translation id="5934281776477898549">Sem atualizações</translation>
@@ -3477,7 +3471,7 @@
 <translation id="6162157842722615167">Smart Lock para Chromebook</translation>
 <translation id="6163363155248589649">&amp;Normal</translation>
 <translation id="6163522313638838258">Expandir tudo...</translation>
-<translation id="6164005077879661055">Todos os ficheiros e dados locais associados ao utilizador supervisionado serão definitivamente eliminados depois de este utilizador supervisionado ser removido. Os Websites visitados e as definições deste utilizador supervisionado poderão continuar visíveis para o gestor em <ph name="MANAGEMENT_URL" />.</translation>
+<translation id="6164005077879661055">Todos os ficheiros e dados locais associados ao utilizador supervisionado serão definitivamente eliminados depois de este utilizador supervisionado ser removido. Os Sites visitados e as definições deste utilizador supervisionado poderão continuar visíveis para o gestor em <ph name="MANAGEMENT_URL" />.</translation>
 <translation id="6165508094623778733">Saiba mais</translation>
 <translation id="6166185671393271715">Importar palavras-passe para o Chrome</translation>
 <translation id="6169666352732958425">Não é possível transmitir o ambiente de trabalho.</translation>
@@ -3813,7 +3807,7 @@
 <translation id="6647838571840953560">Atualmente no canal <ph name="CHANNEL_NAME" /></translation>
 <translation id="6649018507441623493">Aguarde um momento...</translation>
 <translation id="665061930738760572">Abrir numa &amp;Nova Janela</translation>
-<translation id="6651237644330755633">Confiar neste certificado para identificar Websites</translation>
+<translation id="6651237644330755633">Confiar neste certificado para identificar Sites</translation>
 <translation id="6652975592920847366">Criar Suporte de Dados de Recuperação do SO</translation>
 <translation id="6653525630739667879">Não é possível guardar em $1. Todas as edições serão guardadas em $2 na pasta Transferências.</translation>
 <translation id="6655190889273724601">Modo de programador</translation>
@@ -3889,7 +3883,7 @@
 <translation id="6773575010135450071">Mais ações...</translation>
 <translation id="677965093459947883">Muito pequeno</translation>
 <translation id="6780439250949340171">gerir outras definições</translation>
-<translation id="6782111308708962316">Impedir que os Websites de terceiros guardem e leiam dados de cookies</translation>
+<translation id="6782111308708962316">Impedir que os Sites de terceiros guardem e leiam dados de cookies</translation>
 <translation id="6786747875388722282">Extensões</translation>
 <translation id="6787839852456839824">Atalhos de teclado</translation>
 <translation id="6788210894632713004">Extensão expandida</translation>
@@ -3909,7 +3903,7 @@
 <translation id="6805647936811177813">Inicie sessão no <ph name="TOKEN_NAME" /> para importar o certificado de cliente de <ph name="HOST_NAME" />.</translation>
 <translation id="680572642341004180">Ativar o controlo RLZ em <ph name="SHORT_PRODUCT_OS_NAME" />.</translation>
 <translation id="6807889908376551050">Mostrar todos...</translation>
-<translation id="6810613314571580006">Iniciar sessão automaticamente nos Websites com as credenciais armazenadas. Quando a funcionalidade está desativada, é-lhe pedida sempre uma confirmação antes de iniciar sessão num Website.</translation>
+<translation id="6810613314571580006">Iniciar sessão automaticamente nos Sites com as credenciais armazenadas. Quando a funcionalidade está desativada, é-lhe pedida sempre uma confirmação antes de iniciar sessão num Website.</translation>
 <translation id="6812349420832218321">O <ph name="PRODUCT_NAME" /> não pode ser executado como raiz.</translation>
 <translation id="6812841287760418429">Manter alterações</translation>
 <translation id="6817174620439930047">Perguntar sempre que um site pretender utilizar mensagens exclusivas do sistema para aceder a dispositivos MIDI (recomendado)</translation>
@@ -4046,7 +4040,7 @@
 <translation id="7017004637493394352">Diga "Ok Google" novamente</translation>
 <translation id="7017219178341817193">Adicionar uma nova página</translation>
 <translation id="7017354871202642555">Não é possível definir o modo uma vez definida a janela.</translation>
-<translation id="7017480957358237747">permitir ou proibir determinados Websites,</translation>
+<translation id="7017480957358237747">permitir ou proibir determinados Sites,</translation>
 <translation id="7017587484910029005">Escreva os caracteres que vê na imagem abaixo.</translation>
 <translation id="7018275672629230621">Ler e alterar o histórico de navegação</translation>
 <translation id="7019805045859631636">Rápido</translation>
@@ -4177,7 +4171,7 @@
 <translation id="7224023051066864079">Máscara de sub-rede:</translation>
 <translation id="722454870747268814">Novo separador de navegação anónima</translation>
 <translation id="7225179976675429563">Tipo de rede em falta</translation>
-<translation id="7228479291753472782">Manipular definições que especificam se os Websites podem utilizar funcionalidades como a geolocalização, o microfone, a câmara, etc.</translation>
+<translation id="7228479291753472782">Manipular definições que especificam se os Sites podem utilizar funcionalidades como a geolocalização, o microfone, a câmara, etc.</translation>
 <translation id="7229570126336867161">Requer EVDO</translation>
 <translation id="7230787553283372882">Personalizar o tamanho do texto</translation>
 <translation id="7238585580608191973">Impressão digital SHA-256</translation>
@@ -4317,7 +4311,7 @@
 <translation id="7444983668544353857">Desactivar <ph name="NETWORKDEVICE" /></translation>
 <translation id="7445786591457833608">Não é possível traduzir este idioma</translation>
 <translation id="7447657194129453603">Estado da rede:</translation>
-<translation id="744859430125590922">Controlar e visualizar os Websites que esta pessoa visita a partir de <ph name="CUSTODIAN_EMAIL" />.</translation>
+<translation id="744859430125590922">Controlar e visualizar os Sites que esta pessoa visita a partir de <ph name="CUSTODIAN_EMAIL" />.</translation>
 <translation id="7453008956351770337">Ao selecionar esta impressora, está a conceder à seguinte extensão a autorização para aceder à sua impressora:</translation>
 <translation id="7456142309650173560">programador</translation>
 <translation id="7456847797759667638">Abrir localização...</translation>
@@ -4362,7 +4356,7 @@
 <translation id="7507930499305566459">Certificado do dispositivo de resposta do estado</translation>
 <translation id="7508545000531937079">Apresentação de diapositivos</translation>
 <translation id="7511955381719512146">A rede Wi-Fi que está a utilizar pode exigir que visite <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" />.</translation>
-<translation id="7513029293694390567">Inicie sessão automaticamente nos Websites com as credenciais armazenadas. Se esta funcionalidade estiver desativada, é-lhe pedida sempre uma confirmação antes de iniciar sessão num Website.</translation>
+<translation id="7513029293694390567">Inicie sessão automaticamente nos Sites com as credenciais armazenadas. Se esta funcionalidade estiver desativada, é-lhe pedida sempre uma confirmação antes de iniciar sessão num Website.</translation>
 <translation id="751507702149411736">Bielorrusso</translation>
 <translation id="7517569744831774757">Repor as predefinições originais das definições.</translation>
 <translation id="7517786267097410259">Criar palavra-passe –</translation>
@@ -4435,6 +4429,7 @@
 <translation id="7615910377284548269">Gerir bloqueio de plug-ins sem isolamento de processos...</translation>
 <translation id="7617366389578322136">A estabelecer ligação a "<ph name="DEVICE_NAME" />"…</translation>
 <translation id="761779991806306006">Nenhuma palavra-passe guardada.</translation>
+<translation id="7622114377921274169">A carregar…</translation>
 <translation id="7624154074265342755">Redes sem fios</translation>
 <translation id="7624337243375417909">caps lock desligado</translation>
 <translation id="7627790789328695202">Ups, <ph name="FILE_NAME" /> já existe. Dê um nome novo e tente novamente.</translation>
@@ -4696,7 +4691,7 @@
 <translation id="8016266267177410919">Armazenamento temporário</translation>
 <translation id="8017335670460187064"><ph name="LABEL" /></translation>
 <translation id="8017667670902200762">Autenticação incorreta</translation>
-<translation id="8018313076035239964">Controle as informações que os Websites podem utilizar e os conteúdos que podem apresentar</translation>
+<translation id="8018313076035239964">Controle as informações que os Sites podem utilizar e os conteúdos que podem apresentar</translation>
 <translation id="8022523925619404071">Ativar atualização automática</translation>
 <translation id="8023801379949507775">Atualizar extensões agora</translation>
 <translation id="8024483450737722621">As aplicações que transferiu do Google Play são eliminadas deste Chromebook.
@@ -4749,7 +4744,7 @@
 <translation id="8083739373364455075">Obtenha 100 GB gratuitos com o Google Drive</translation>
 <translation id="8086015605808120405">A configurar <ph name="PRINTER_NAME" />…</translation>
 <translation id="8088137642766812908">Tenha cuidado, esta funcionalidade pode criar problemas</translation>
-<translation id="8090234456044969073">Ler uma lista dos Websites visitados com mais frequência</translation>
+<translation id="8090234456044969073">Ler uma lista dos Sites visitados com mais frequência</translation>
 <translation id="8094917007353911263">A rede que está a utilizar pode exigir que visite <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" />.</translation>
 <translation id="80974698889265265">Os PINs não coincidem</translation>
 <translation id="8098975406164436557">Utilizar este telemóvel para desbloquear o <ph name="DEVICE_TYPE" />?</translation>
@@ -4874,6 +4869,7 @@
 <translation id="8270242299912238708">Documentos PDF</translation>
 <translation id="827097179112817503">Mostrar botão Página inicial</translation>
 <translation id="8272443605911821513">Faça a gestão das suas extensões clicando em Extensões no menu "Mais ferramentas".</translation>
+<translation id="8274924778568117936">Não desligue ou feche o <ph name="DEVICE_TYPE" /> até a atualização terminar. O <ph name="DEVICE_TYPE" /> será reiniciado quando a instalação estiver concluída.</translation>
 <translation id="8275038454117074363">Importar</translation>
 <translation id="8276560076771292512">Esvaziar cache e recarregamento forçado</translation>
 <translation id="8279388322240498158">Teclado curdo sorani baseado no inglês</translation>
@@ -5205,7 +5201,7 @@
 <translation id="8800004011501252845">A mostrar destinos para</translation>
 <translation id="8800420788467349919">Volume: <ph name="PRECENTAGE" /> %</translation>
 <translation id="8803496343472038847">Teclado russo fonético</translation>
-<translation id="8804398419035066391">Comunicar com Websites de cooperação</translation>
+<translation id="8804398419035066391">Comunicar com Sites de cooperação</translation>
 <translation id="8807632654848257479">Estável</translation>
 <translation id="8808478386290700967">Web Store</translation>
 <translation id="8808686172382650546">Gato</translation>
@@ -5314,7 +5310,6 @@
 <translation id="8963572037665351978">Sair da apresentação</translation>
 <translation id="8965037249707889821">Introduzir palavra-passe antiga</translation>
 <translation id="8965697826696209160">Não existe espaço suficiente.</translation>
-<translation id="8968527460726243404">Criador de imagem do sistema do SO Chrome</translation>
 <translation id="8970203673128054105">Ver lista do modo de transmissão</translation>
 <translation id="89720367119469899">Escape</translation>
 <translation id="8972513834460200407">Consulte o seu administrador de rede para ter a certeza de que a firewall não está a bloquear as transferências dos servidores da Google.</translation>
@@ -5333,7 +5328,7 @@
 <translation id="8996526648899750015">Adicionar conta...</translation>
 <translation id="8997135628821231"><ph name="ISSUED_BY" /> [ <ph name="ISSUED_TO" /> ] ( <ph name="DEVICE" /> )</translation>
 <translation id="9000649589621199759">Não é possível localizar o telemóvel. Certifique-se de que está a utilizar um telemóvel Android compatível que está ligado e à distância de um braço. &lt;a&gt;Saiba mais&lt;/a&gt;</translation>
-<translation id="9003647077635673607">Permitir em todos os Websites</translation>
+<translation id="9003647077635673607">Permitir em todos os Sites</translation>
 <translation id="9003677638446136377">Verificar novamente</translation>
 <translation id="9003704114456258138">Frequência</translation>
 <translation id="9004952710076978168">Recebeu uma notificação para uma impressora desconhecida.</translation>
@@ -5358,7 +5353,7 @@
 <translation id="902638246363752736">Definições do teclado</translation>
 <translation id="9026731007018893674">transferir</translation>
 <translation id="9026738002206640372">Desassociar Conta</translation>
-<translation id="9027146684281895941">Supervisione esta pessoa para controlar e ver os Websites visitados pela mesma a partir da sua Conta Google.</translation>
+<translation id="9027146684281895941">Supervisione esta pessoa para controlar e ver os Sites visitados pela mesma a partir da sua Conta Google.</translation>
 <translation id="9027459031423301635">Abrir Link num Novo &amp;Separador</translation>
 <translation id="9027603907212475920">Configurar sincronização...</translation>
 <translation id="9030515284705930323">A sua entidade não ativou a Google Play Store para a sua conta. Contacte o administrador para obter mais informações.</translation>
@@ -5489,6 +5484,7 @@
 <translation id="93766956588638423">Reparar extensão</translation>
 <translation id="938470336146445890">Instale um certificado de utilizador.</translation>
 <translation id="938582441709398163">Sobreposição do teclado</translation>
+<translation id="939519157834106403">SSID</translation>
 <translation id="939598580284253335">Introduzir frase de acesso</translation>
 <translation id="939736085109172342">Nova pasta</translation>
 <translation id="940425055435005472">Tamanho do tipo de letra:</translation>
diff --git a/chrome/app/resources/generated_resources_ro.xtb b/chrome/app/resources/generated_resources_ro.xtb
index bf72fc4..2658c12 100644
--- a/chrome/app/resources/generated_resources_ro.xtb
+++ b/chrome/app/resources/generated_resources_ro.xtb
@@ -835,7 +835,6 @@
 <translation id="2224551243087462610">Editați numele dosarului</translation>
 <translation id="2226449515541314767">Acest site a fost blocat și nu poate avea control complet asupra dispozitivelor MIDI.</translation>
 <translation id="2226720438730111184">Spune-ne ce se întâmplă</translation>
-<translation id="222903405933288376">Google îți folosește locația pentru a-ți oferi conținut local. Poți schimba această setare din <ph name="SETTINGS_LINK" />.</translation>
 <translation id="2229161054156947610">A mai rămas mai mult de 1 oră</translation>
 <translation id="222931766245975952">Fișier trunchiat</translation>
 <translation id="222949136907494149"><ph name="URL" /> dorește să utilizeze locația computerului dvs.</translation>
@@ -1087,7 +1086,6 @@
 <translation id="2575247648642144396">Această pictogramă va fi vizibilă atunci când extensia poate acționa pe pagina actuală. Utilizați această extensie dând clic pe pictogramă sau apăsând pe <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="2576842806987913196">Există deja un fișier CRX cu acest nume.</translation>
 <translation id="2579575372772932244">Se recreează profilul, așteaptă...</translation>
-<translation id="2580168606262715640">Telefonul nu poate fi găsit. Asigură-te că este în apropiere.</translation>
 <translation id="2580889980133367162">Permiteți întotdeauna <ph name="HOST" /> să descarce mai multe fișiere</translation>
 <translation id="2580924999637585241">Total: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">Lungă</translation>
@@ -2172,7 +2170,6 @@
 <translation id="4130207949184424187">Această extensie a modificat ce pagină se afișează când cauți din caseta polivalentă.</translation>
 <translation id="413121957363593859">Componente</translation>
 <translation id="4131410914670010031">Alb-negru</translation>
-<translation id="4135054690906486073">Această rețea este utilizată în comun cu alți utilizatori</translation>
 <translation id="4135450933899346655">Certificatele tale</translation>
 <translation id="4138267921960073861">Afișează numele de utilizatori și fotografiile pe ecranul de conectare</translation>
 <translation id="4140559601186535628">Mesaje push</translation>
@@ -2576,9 +2573,6 @@
 <translation id="4813345808229079766">Conexiune</translation>
 <translation id="4813512666221746211">Eroare de rețea</translation>
 <translation id="4816492930507672669">Încadrați în pagină</translation>
-<translation id="4816617200045929931">Spune-ne exact ce s-a întâmplat înainte să ți se afișeze mesajul de eroare privind profilul:
-
-****NU MODIFICA NIMIC MAI JOS DE ACEST RÂND****</translation>
 <translation id="4820334425169212497">Nu, nu îl vad</translation>
 <translation id="4821086771593057290">Parola s-a modificat. Încearcă din nou cu noua parolă.</translation>
 <translation id="4821935166599369261">&amp;Analizare activată</translation>
@@ -2944,7 +2938,6 @@
 <translation id="5340217413897845242">Elementul 6 din raft</translation>
 <translation id="5341390997810576190">va folosi datele mobile;</translation>
 <translation id="5342091991439452114">Codul PIN trebuie să conțină minimum <ph name="MINIMUM" /> cifre</translation>
-<translation id="5342344590724511265">Feedback despre fila blocată.</translation>
 <translation id="5342451237681332106">Folosește <ph name="PHONE_NAME" /></translation>
 <translation id="534916491091036097">Parant. desch.</translation>
 <translation id="5350965906220856151">Hopa!</translation>
@@ -3216,6 +3209,7 @@
 <translation id="5764483294734785780">Sal&amp;vează conținutul audio ca...</translation>
 <translation id="57646104491463491">Data modificării</translation>
 <translation id="5764797882307050727">Eliberează spațiu pe dispozitiv.</translation>
+<translation id="5765425701854290211">Ne pare rău, unele fișiere erau deteriorate și actualizarea nu a reușit. Fișierele sincronizate sunt în siguranță.</translation>
 <translation id="5765491088802881382">Nu există rețele disponibile</translation>
 <translation id="5765780083710877561">Descriere:</translation>
 <translation id="5771585441665576801">Transliterație (geia → γεια)</translation>
@@ -4430,6 +4424,7 @@
 <translation id="7615910377284548269">Gestionează blocarea pluginurilor scoase din mediul de testare...</translation>
 <translation id="7617366389578322136">Se conectează la „<ph name="DEVICE_NAME" />”</translation>
 <translation id="761779991806306006">Nicio parolă salvată.</translation>
+<translation id="7622114377921274169">Se încarcă.</translation>
 <translation id="7624154074265342755">Rețele wireless</translation>
 <translation id="7624337243375417909">tasta Caps Lock este dezactivată</translation>
 <translation id="7627790789328695202">Hopa, <ph name="FILE_NAME" /> există deja. Redenumiți și încercați din nou.</translation>
@@ -4869,6 +4864,7 @@
 <translation id="8270242299912238708">Documente PDF</translation>
 <translation id="827097179112817503">Afișează butonul Pagină de pornire</translation>
 <translation id="8272443605911821513">Gestionați extensiile dând clic pe Extensii în meniul „Mai multe instrumente”.</translation>
+<translation id="8274924778568117936">Nu închide și nu opri dispozitivul <ph name="DEVICE_TYPE" /> înainte să se finalizeze actualizarea. Dispozitivul <ph name="DEVICE_TYPE" /> va reporni după ce se finalizează instalarea.</translation>
 <translation id="8275038454117074363">Importă</translation>
 <translation id="8276560076771292512">Goliți memoria cache și reîncărcați forțat</translation>
 <translation id="8279388322240498158">Tastatură kurdă sorani bazată pe engleză</translation>
@@ -5309,7 +5305,6 @@
 <translation id="8963572037665351978">Ieși din prezentare</translation>
 <translation id="8965037249707889821">Introduceți parola veche</translation>
 <translation id="8965697826696209160">Nu există spațiu suficient.</translation>
-<translation id="8968527460726243404">Instrument de scriere a imaginilor de sistem pentru sistemul de operare Chrome</translation>
 <translation id="8970203673128054105">Vezi lista cu moduri de proiecție</translation>
 <translation id="89720367119469899">Tasta Esc</translation>
 <translation id="8972513834460200407">Contactați administratorul de rețea, pentru a vă asigura că firewallul nu blochează descărcările de pe serverele Google.</translation>
@@ -5484,6 +5479,7 @@
 <translation id="93766956588638423">Repară extensia</translation>
 <translation id="938470336146445890">Instalează un certificat de utilizator.</translation>
 <translation id="938582441709398163">Suprapunere a tastaturii</translation>
+<translation id="939519157834106403">SSID</translation>
 <translation id="939598580284253335">Introdu expresia de acces</translation>
 <translation id="939736085109172342">Dosar nou</translation>
 <translation id="940425055435005472">Dimensiunea fontului:</translation>
diff --git a/chrome/app/resources/generated_resources_ru.xtb b/chrome/app/resources/generated_resources_ru.xtb
index 621c3105..69e4804 100644
--- a/chrome/app/resources/generated_resources_ru.xtb
+++ b/chrome/app/resources/generated_resources_ru.xtb
@@ -834,7 +834,6 @@
 <translation id="2224551243087462610">Изменить имя папки</translation>
 <translation id="2226449515541314767">Этому сайту запрещено получать полный контроль над устройствами MIDI.</translation>
 <translation id="2226720438730111184">Описание проблемы</translation>
-<translation id="222903405933288376">Google предлагает результаты поиска в зависимости от вашего местоположения. Изменить настройки этой функции можно здесь: <ph name="SETTINGS_LINK" />.</translation>
 <translation id="2229161054156947610">Осталось больше часа</translation>
 <translation id="222931766245975952">Файл поврежден</translation>
 <translation id="222949136907494149"><ph name="URL" /> запрашивает данные о местоположении вашего компьютера.</translation>
@@ -1086,7 +1085,6 @@
 <translation id="2575247648642144396">Значок будет отображаться, если расширение может работать на загруженной странице. Активируйте его, нажав на значок или с помощью комбинации клавиш <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="2576842806987913196">Файл CRX с таким именем уже существует.</translation>
 <translation id="2579575372772932244">Профиль восстанавливается...</translation>
-<translation id="2580168606262715640">Телефон не обнаружен. Он должен находиться на расстоянии вытянутой руки.</translation>
 <translation id="2580889980133367162">Всегда разрешать <ph name="HOST" /> скачивать нескольких файлов</translation>
 <translation id="2580924999637585241">Всего: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">долгая</translation>
@@ -2173,7 +2171,6 @@
 <translation id="4130207949184424187">Расширение изменило поисковую систему, которая используется по умолчанию при вводе запроса в омнибокс.</translation>
 <translation id="413121957363593859">Компоненты</translation>
 <translation id="4131410914670010031">Черно-белая печать</translation>
-<translation id="4135054690906486073">Эта сеть доступна другим пользователям</translation>
 <translation id="4135450933899346655">Ваши сертификаты</translation>
 <translation id="4138267921960073861">Показывать имена и фотографии пользователей на экране входа</translation>
 <translation id="4140559601186535628">Push-сообщения</translation>
@@ -2577,9 +2574,6 @@
 <translation id="4813345808229079766">Соединение</translation>
 <translation id="4813512666221746211">Ошибка сети</translation>
 <translation id="4816492930507672669">По размеру страницы</translation>
-<translation id="4816617200045929931">Опишите, что произошло перед появлением сообщения об ошибке в профиле:
-
-****НЕ МЕНЯЙТЕ ТЕКСТ ПОД ЭТОЙ ЛИНИЕЙ****</translation>
 <translation id="4820334425169212497">Нет</translation>
 <translation id="4821086771593057290">Ваш пароль изменился. Повторите попытку и введите новый пароль.</translation>
 <translation id="4821935166599369261">&amp;Сбор данных включен</translation>
@@ -2945,7 +2939,6 @@
 <translation id="5340217413897845242">6-й объект на панели запуска</translation>
 <translation id="5341390997810576190">Будет использовать мобильные данные</translation>
 <translation id="5342091991439452114">PIN-код должен содержать не менее <ph name="MINIMUM" /> знаков</translation>
-<translation id="5342344590724511265">Сообщение о сбое вкладки.</translation>
 <translation id="5342451237681332106">Использовать <ph name="PHONE_NAME" /></translation>
 <translation id="534916491091036097">Левая скобка</translation>
 <translation id="5350965906220856151">Ошибка</translation>
@@ -3217,6 +3210,7 @@
 <translation id="5764483294734785780">Со&amp;хранить аудио как...</translation>
 <translation id="57646104491463491">Последнее изменение</translation>
 <translation id="5764797882307050727">Освободите место в памяти устройства.</translation>
+<translation id="5765425701854290211">Не удалось выполнить обновление, так как некоторые файлы были повреждены. Все синхронизированные файлы в безопасности.</translation>
 <translation id="5765491088802881382">Нет доступных сетей</translation>
 <translation id="5765780083710877561">Описание:</translation>
 <translation id="5771585441665576801">Транслитерация (geia → γεια)</translation>
@@ -4433,6 +4427,7 @@
 <translation id="7615910377284548269">Изменить настройки блокирования плагинов вне тестовой среды…</translation>
 <translation id="7617366389578322136">Подключение к устройству "<ph name="DEVICE_NAME" />"</translation>
 <translation id="761779991806306006">Нет сохраненных паролей</translation>
+<translation id="7622114377921274169">Зарядка…</translation>
 <translation id="7624154074265342755">Беспроводные сети</translation>
 <translation id="7624337243375417909">клавиша Caps Lock не нажата</translation>
 <translation id="7627790789328695202">Файл "<ph name="FILE_NAME" />" уже существует. Задайте другое название и повторите попытку.</translation>
@@ -4872,6 +4867,7 @@
 <translation id="8270242299912238708">PDF-файлы</translation>
 <translation id="827097179112817503">Показывать кнопку "Главная страница"</translation>
 <translation id="8272443605911821513">Управляйте расширениями в соответствующем разделе в меню дополнительных инструментов.</translation>
+<translation id="8274924778568117936">Не выключайте и не закрывайте <ph name="DEVICE_TYPE" />, выполняется обновление. После завершения установки <ph name="DEVICE_TYPE" /> перезагрузится.</translation>
 <translation id="8275038454117074363">Импорт</translation>
 <translation id="8276560076771292512">Очистка кеша и аппаратная перезагрузка</translation>
 <translation id="8279388322240498158">Раскладка сорани (латиница)</translation>
@@ -5312,7 +5308,6 @@
 <translation id="8963572037665351978">Выйти из режима презентации</translation>
 <translation id="8965037249707889821">Введите старый пароль</translation>
 <translation id="8965697826696209160">Недостаточно свободного места.</translation>
-<translation id="8968527460726243404">Системное средство записи изображений в Chrome OS</translation>
 <translation id="8970203673128054105">Просмотреть список режимов трансляции</translation>
 <translation id="89720367119469899">Отключить</translation>
 <translation id="8972513834460200407">Уточните у администратора сети, не блокирует ли брандмауэр скачивание файлов с серверов Google.</translation>
@@ -5487,6 +5482,7 @@
 <translation id="93766956588638423">Восстановить расширение</translation>
 <translation id="938470336146445890">Установите сертификат пользователя.</translation>
 <translation id="938582441709398163">Накладка на клавиатуру</translation>
+<translation id="939519157834106403">SSID</translation>
 <translation id="939598580284253335">Введите кодовую фразу</translation>
 <translation id="939736085109172342">Новая папка</translation>
 <translation id="940425055435005472">Размер шрифта:</translation>
diff --git a/chrome/app/resources/generated_resources_sk.xtb b/chrome/app/resources/generated_resources_sk.xtb
index 0db5109a..1014526 100644
--- a/chrome/app/resources/generated_resources_sk.xtb
+++ b/chrome/app/resources/generated_resources_sk.xtb
@@ -837,7 +837,6 @@
 <translation id="2224551243087462610">Upraviť názov priečinka</translation>
 <translation id="2226449515541314767">Týmto stránkam bola zablokovaná úplná kontrola nad zariadeniami MIDI.</translation>
 <translation id="2226720438730111184">Povedzte nám, čo sa deje</translation>
-<translation id="222903405933288376">Google vám poskytuje miestny obsah na základe vašej polohy. Toto nastavenie môžete zmeniť na adrese <ph name="SETTINGS_LINK" />.</translation>
 <translation id="2229161054156947610">Zostáva viac ako 1 hodina</translation>
 <translation id="222931766245975952">Súbor bol upravený</translation>
 <translation id="222949136907494149">Stránky <ph name="URL" /> chcú použiť polohu vášho počítača.</translation>
@@ -1089,7 +1088,6 @@
 <translation id="2575247648642144396">Ikona sa zobrazí, keď sa na aktuálnej stránke bude dať použiť rozšírenie. Rozšírenie použijete kliknutím na ikonu alebo stlačením klávesov <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="2576842806987913196">Súbor CRX s týmto názvom už existuje.</translation>
 <translation id="2579575372772932244">Prebieha opätovné vytvorenie profilu, čakajte…</translation>
-<translation id="2580168606262715640">Váš telefón sa nedá nájsť. Skontrolujte, či je v dosahu.</translation>
 <translation id="2580889980133367162">Vždy povoliť hostiteľovi <ph name="HOST" /> sťahovať viacero súborov</translation>
 <translation id="2580924999637585241">Celkom: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">Dlhé</translation>
@@ -2174,7 +2172,6 @@
 <translation id="4130207949184424187">Toto rozšírenie zmenilo stránku, ktorá sa zobrazí pri vyhľadávaní pomocou všeobecného poľa.</translation>
 <translation id="413121957363593859">Komponenty</translation>
 <translation id="4131410914670010031">Čiernobielo</translation>
-<translation id="4135054690906486073">Táto sieť je zdieľaná s ostatnými používateľmi</translation>
 <translation id="4135450933899346655">Vaše certifikáty</translation>
 <translation id="4138267921960073861">Zobraziť používateľské mená a fotografie na prihlasovacej obrazovke</translation>
 <translation id="4140559601186535628">Správy push</translation>
@@ -2578,9 +2575,6 @@
 <translation id="4813345808229079766">Pripojenie</translation>
 <translation id="4813512666221746211">Chyba siete</translation>
 <translation id="4816492930507672669">Prispôsobiť stránke</translation>
-<translation id="4816617200045929931">Povedzte nám, čo sa presne stalo predtým, než sa zobrazilo hlásenie chyby profilu:
-
-****NEMEŇTE TEXT POD TÝMTO RIADKOM****</translation>
 <translation id="4820334425169212497">Nie, nevidím ho</translation>
 <translation id="4821086771593057290">Vaše heslo bolo zmenené. Skúste to znova s novým heslom.</translation>
 <translation id="4821935166599369261">&amp;Profilovanie povolené</translation>
@@ -2946,7 +2940,6 @@
 <translation id="5340217413897845242">6. položka na poličke</translation>
 <translation id="5341390997810576190">Používať mobilné dáta</translation>
 <translation id="5342091991439452114">Minimálny počet číslic kódu PIN: <ph name="MINIMUM" /></translation>
-<translation id="5342344590724511265">Spätná väzba týkajúca sa zlyhania karty.</translation>
 <translation id="5342451237681332106">Použiť telefón <ph name="PHONE_NAME" /></translation>
 <translation id="534916491091036097">Ľavá zátvorka</translation>
 <translation id="5350965906220856151">Ojoj!</translation>
@@ -3218,6 +3211,7 @@
 <translation id="5764483294734785780">Uložiť &amp;audio ako...</translation>
 <translation id="57646104491463491">Dátum úpravy</translation>
 <translation id="5764797882307050727">Uvoľnite miesto na zariadení.</translation>
+<translation id="5765425701854290211">Je nám ľúto, ale niektoré súbory boli poškodené a aktualizácia nebola úspešná. Synchronizované súbory sú v bezpečí.</translation>
 <translation id="5765491088802881382">Žiadne siete nie sú k dispozícii</translation>
 <translation id="5765780083710877561">Popis:</translation>
 <translation id="5771585441665576801">Prepis (geia → γεια)</translation>
@@ -4433,6 +4427,7 @@
 <translation id="7615910377284548269">Spravovať blokovanie doplnkov, ktoré nie sú v karanténe...</translation>
 <translation id="7617366389578322136">Pripája sa k zariadeniu „<ph name="DEVICE_NAME" />“</translation>
 <translation id="761779991806306006">Neuložili sa žiadne heslá.</translation>
+<translation id="7622114377921274169">Nabíja sa.</translation>
 <translation id="7624154074265342755">Bezdrôtové siete</translation>
 <translation id="7624337243375417909">Funkcia Caps Lock je vypnutá</translation>
 <translation id="7627790789328695202">Hops, súbor <ph name="FILE_NAME" /> už existuje. Premenujte ho a skúste to znova.</translation>
@@ -4872,6 +4867,7 @@
 <translation id="8270242299912238708">Dokumenty PDF</translation>
 <translation id="827097179112817503">Zobrazovať tlačidlo domovskej stránky</translation>
 <translation id="8272443605911821513">Ak chcete spravovať rozšírenia, kliknite v ponuke Ďalšie nástroje na možnosť Rozšírenia.</translation>
+<translation id="8274924778568117936">V priebehu aktualizácie zariadenie <ph name="DEVICE_TYPE" /> nevypínajte ani nezatvárajte. Po dokončení inštalácie sa <ph name="DEVICE_TYPE" /> reštartuje.</translation>
 <translation id="8275038454117074363">Importovať</translation>
 <translation id="8276560076771292512">Vymazať vyrovnávaciu pamäť a vynútiť opätovné načítanie</translation>
 <translation id="8279388322240498158">Kurdská klávesnica (sorání) s anglickým rozložením</translation>
@@ -5313,7 +5309,6 @@
 <translation id="8963572037665351978">Ukončiť prezentáciu</translation>
 <translation id="8965037249707889821">Zadajte staré heslo</translation>
 <translation id="8965697826696209160">Nedostatok miesta</translation>
-<translation id="8968527460726243404">ChromeOS System Image Writer</translation>
 <translation id="8970203673128054105">Zobraziť zoznam režimov prenosu</translation>
 <translation id="89720367119469899">Escape</translation>
 <translation id="8972513834460200407">Kontaktujte správcu siete a uistite sa, že brána firewall neblokuje sťahovanie súborov zo serverov Google.</translation>
@@ -5488,6 +5483,7 @@
 <translation id="93766956588638423">Opraviť rozšírenie</translation>
 <translation id="938470336146445890">Nainštalujte si používateľský certifikát.</translation>
 <translation id="938582441709398163">Prekryvná vrstva klávesnice</translation>
+<translation id="939519157834106403">SSID</translation>
 <translation id="939598580284253335">Zadať prístupovú frázu</translation>
 <translation id="939736085109172342">Nový priečinok</translation>
 <translation id="940425055435005472">Veľkosť písma:</translation>
diff --git a/chrome/app/resources/generated_resources_sl.xtb b/chrome/app/resources/generated_resources_sl.xtb
index 9534312..b77bd21 100644
--- a/chrome/app/resources/generated_resources_sl.xtb
+++ b/chrome/app/resources/generated_resources_sl.xtb
@@ -837,7 +837,6 @@
 <translation id="2224551243087462610">Uredi ime mape</translation>
 <translation id="2226449515541314767">Temu spletnemu mestu je preprečen popolni nadzor nad napravami MIDI.</translation>
 <translation id="2226720438730111184">Povejte nam, kaj se dogaja</translation>
-<translation id="222903405933288376">Google uporablja lokacijo za zagotavljanje lokalne vsebine. To lahko spremenite tukaj: <ph name="SETTINGS_LINK" />.</translation>
 <translation id="2229161054156947610">Še več kot ena ura</translation>
 <translation id="222931766245975952">Datoteka je okrnjena</translation>
 <translation id="222949136907494149"><ph name="URL" /> želi uporabljati lokacijo vašega računalnika.</translation>
@@ -1089,7 +1088,6 @@
 <translation id="2575247648642144396">Ikona bo vidna, če lahko razširitev deluje na trenutni strani. Razširitev uporabite tako, da kliknete ikono ali pritisnete <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="2576842806987913196">Datoteka CRX s tem imenom že obstaja.</translation>
 <translation id="2579575372772932244">Vnovično ustvarjanje profila, počakajte ...</translation>
-<translation id="2580168606262715640">Vašega telefona ni mogoče najti. Poskrbite, da bo v bližini.</translation>
 <translation id="2580889980133367162">Gostitelju <ph name="HOST" /> vedno dovoli prenos več datotek</translation>
 <translation id="2580924999637585241">Skupaj: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">Dolga</translation>
@@ -2174,7 +2172,6 @@
 <translation id="4130207949184424187">Zaradi te razširitve se je spremenila stran, ki je prikazana, ko iščete v naslovni vrstici.</translation>
 <translation id="413121957363593859">Komponente</translation>
 <translation id="4131410914670010031">Črno-belo</translation>
-<translation id="4135054690906486073">To omrežje je v skupni rabi z drugimi uporabniki</translation>
 <translation id="4135450933899346655">Vaša potrdila</translation>
 <translation id="4138267921960073861">Prikaži uporabniška imena in fotografije na prijavnem zaslonu</translation>
 <translation id="4140559601186535628">Potisna sporočila</translation>
@@ -2578,9 +2575,6 @@
 <translation id="4813345808229079766">Povezava</translation>
 <translation id="4813512666221746211">Napaka v omrežju</translation>
 <translation id="4816492930507672669">Prilagodi strani</translation>
-<translation id="4816617200045929931">Opišite, kaj natanko se je zgodilo, preden se je prikazalo sporočilo o napaki profila:
-
-****NE SPREMINJAJTE NIČESAR POD TO ČRTO****</translation>
 <translation id="4820334425169212497">Ne, ne vidim je</translation>
 <translation id="4821086771593057290">Geslo je bilo spremenjeno. Poskusite znova z novim.</translation>
 <translation id="4821935166599369261">&amp;Profiliranje je omogočeno</translation>
@@ -2946,7 +2940,6 @@
 <translation id="5340217413897845242">Element na polici 6</translation>
 <translation id="5341390997810576190">Uporaba prenosa podatkov v mobilnih omrežjih</translation>
 <translation id="5342091991439452114">Koda PIN mora imeti vsaj toliko števk: <ph name="MINIMUM" /></translation>
-<translation id="5342344590724511265">Povratne informacije o zrušitvi zavihka.</translation>
 <translation id="5342451237681332106">Uporabi telefon <ph name="PHONE_NAME" /></translation>
 <translation id="534916491091036097">Oklepaj</translation>
 <translation id="5350965906220856151">Ojoj.</translation>
@@ -3219,6 +3212,7 @@
 <translation id="5764483294734785780">Shr&amp;ani zvočni posnetek kot ...</translation>
 <translation id="57646104491463491">Datum spremembe</translation>
 <translation id="5764797882307050727">Sprostite nekaj prostora v napravi.</translation>
+<translation id="5765425701854290211">Nekatere datoteke so bile poškodovane in posodobitev ni uspela. Sinhronizirane datoteke so varne.</translation>
 <translation id="5765491088802881382">Na voljo ni nobeno omrežje</translation>
 <translation id="5765780083710877561">Opis:</translation>
 <translation id="5771585441665576801">Prečrkovanje (geia → γεια)</translation>
@@ -4433,6 +4427,7 @@
 <translation id="7615910377284548269">Upravljanje blokiranja vtičnikov brez varnostnih omejitev ...</translation>
 <translation id="7617366389578322136">Povezovanje z napravo »<ph name="DEVICE_NAME" />«</translation>
 <translation id="761779991806306006">Ni shranjenih gesel.</translation>
+<translation id="7622114377921274169">Polnjenje.</translation>
 <translation id="7624154074265342755">Brezžična omrežja</translation>
 <translation id="7624337243375417909">zaklepanje velikih črk je izklopljeno</translation>
 <translation id="7627790789328695202">Ups, datoteka <ph name="FILE_NAME" /> že obstaja. Preimenujte jo in poskusite znova.</translation>
@@ -4872,6 +4867,7 @@
 <translation id="8270242299912238708">Dokumenti PDF</translation>
 <translation id="827097179112817503">Pokaži gumb za domačo stran</translation>
 <translation id="8272443605911821513">Razširitve lahko upravljate tako, da v meniju »Več orodij« kliknete »Razširitve«.</translation>
+<translation id="8274924778568117936">Ne izklopite ali zaprite naprave <ph name="DEVICE_TYPE" />, dokler se posodobitev ne konča. Naprava <ph name="DEVICE_TYPE" /> se bo po končani namestitvi znova zagnala.</translation>
 <translation id="8275038454117074363">Uvozi</translation>
 <translation id="8276560076771292512">Izbriši predpomnilnik in znova naloži brez predpomnilnika</translation>
 <translation id="8279388322240498158">Tipkovnica za soransko kurdščino na angleški osnovi</translation>
@@ -5314,7 +5310,6 @@
 <translation id="8963572037665351978">Zapusti predstavitev</translation>
 <translation id="8965037249707889821">Vnesite staro geslo</translation>
 <translation id="8965697826696209160">Na voljo ni dovolj prostora.</translation>
-<translation id="8968527460726243404">Zapisovalnik sistemskih slik za Chrome OS</translation>
 <translation id="8970203673128054105">Ogled seznama načinov predvajanja</translation>
 <translation id="89720367119469899">Escape</translation>
 <translation id="8972513834460200407">Pri skrbniku omrežja se prepričajte, da požarni zid ne blokira prenosov iz Googlovih strežnikov.</translation>
@@ -5490,6 +5485,7 @@
 <translation id="93766956588638423">Popravi razširitev</translation>
 <translation id="938470336146445890">Namestite uporabniško potrdilo.</translation>
 <translation id="938582441709398163">Prekrivna tipkovnica</translation>
+<translation id="939519157834106403">SSID</translation>
 <translation id="939598580284253335">Vnesite geslo</translation>
 <translation id="939736085109172342">Nova mapa</translation>
 <translation id="940425055435005472">Velikost pisave:</translation>
diff --git a/chrome/app/resources/generated_resources_sr.xtb b/chrome/app/resources/generated_resources_sr.xtb
index 3dc0902..47fb8539 100644
--- a/chrome/app/resources/generated_resources_sr.xtb
+++ b/chrome/app/resources/generated_resources_sr.xtb
@@ -834,7 +834,6 @@
 <translation id="2224551243087462610">Измена имена директоријума</translation>
 <translation id="2226449515541314767">Спречено је да овај сајт у потпуности контролише MIDI уређаје.</translation>
 <translation id="2226720438730111184">Реците нам шта се дешава</translation>
-<translation id="222903405933288376">Google користи локацију да би вам пружио локални садржај. Ово можете да промените на страници <ph name="SETTINGS_LINK" />.</translation>
 <translation id="2229161054156947610">Остало је више од сат времена</translation>
 <translation id="222931766245975952">Датотека је скраћена</translation>
 <translation id="222949136907494149"><ph name="URL" /> жели да користи локацију рачунара.</translation>
@@ -1086,7 +1085,6 @@
 <translation id="2575247648642144396">Ова икона ће бити видљива када додатак буде могао да функционише на тренутној страници. Користите овај додатак кликом на икону или притиском на <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="2576842806987913196">Већ постоји CRX датотека са овим називом.</translation>
 <translation id="2579575372772932244">Поново се прави профил. Сачекајте...</translation>
-<translation id="2580168606262715640">Нисмо успели да пронађемо телефон. Проверите да ли је у околини.</translation>
 <translation id="2580889980133367162">Увек дозволи хосту <ph name="HOST" /> да преузима више датотека</translation>
 <translation id="2580924999637585241">Укупно: <ph name="NUMBER_OF_SHEETS" /><ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">Дуго</translation>
@@ -2170,7 +2168,6 @@
 <translation id="4130207949184424187">Овај додатак је променио страницу која се приказује када претражујете из омнибокса.</translation>
 <translation id="413121957363593859">Компоненте</translation>
 <translation id="4131410914670010031">Црно-бело</translation>
-<translation id="4135054690906486073">Ова мрежа се дели са другим корисницима</translation>
 <translation id="4135450933899346655">Ваши сертификати</translation>
 <translation id="4138267921960073861">Прикажи корисничка имена и фотографије на екрану за пријављивање</translation>
 <translation id="4140559601186535628">Искачуће поруке</translation>
@@ -2574,9 +2571,6 @@
 <translation id="4813345808229079766">Веза</translation>
 <translation id="4813512666221746211">Грешка на мрежи</translation>
 <translation id="4816492930507672669">Уклопи у страницу</translation>
-<translation id="4816617200045929931">Реците нам шта се тачно догодило пре него што сте добили поруку о грешци на профилу:
-
-****НЕ МЕЊАЈТЕ СТАВКЕ ИСПОД ОВЕ ЛИНИЈЕ****</translation>
 <translation id="4820334425169212497">Не, не видим га</translation>
 <translation id="4821086771593057290">Лозинка је промењена. Пробајте поново са новом лозинком.</translation>
 <translation id="4821935166599369261">&amp;Профилисање је омогућено</translation>
@@ -2942,7 +2936,6 @@
 <translation id="5340217413897845242">6. ставка на полици</translation>
 <translation id="5341390997810576190">користити мобилне податке</translation>
 <translation id="5342091991439452114">PIN мора да има најмање <ph name="MINIMUM" /> цифре(ара)</translation>
-<translation id="5342344590724511265">Повратне информације о отказивању картице.</translation>
 <translation id="5342451237681332106">Користи <ph name="PHONE_NAME" /></translation>
 <translation id="534916491091036097">Отв. заграда</translation>
 <translation id="5350965906220856151">О, не!</translation>
@@ -3216,6 +3209,7 @@
 <translation id="5764483294734785780">Са&amp;чувај аудио снимак као...</translation>
 <translation id="57646104491463491">Датум измене</translation>
 <translation id="5764797882307050727">Ослободите мало простора на уређају.</translation>
+<translation id="5765425701854290211">Жао нам је, неке датотеке су оштећене и ажурирање није успело. Синхронизоване датотеке су безбедне.</translation>
 <translation id="5765491088802881382">Ниједна мрежа није доступна</translation>
 <translation id="5765780083710877561">Опис:</translation>
 <translation id="5771585441665576801">Транслитерација (geia → γεια)</translation>
@@ -4425,6 +4419,7 @@
 <translation id="7615910377284548269">Управљајте блокирањем додатних компонената које су изван заштићеног окружења...</translation>
 <translation id="7617366389578322136">Повезује се са уређајем „<ph name="DEVICE_NAME" />“</translation>
 <translation id="761779991806306006">Није сачувана ниједна лозинка.</translation>
+<translation id="7622114377921274169">Пуни се.</translation>
 <translation id="7624154074265342755">Бежичне мреже</translation>
 <translation id="7624337243375417909">caps lock је искључен</translation>
 <translation id="7627790789328695202">Упс, <ph name="FILE_NAME" /> већ постоји. Преименујте датотеку и покушајте поново.</translation>
@@ -4865,6 +4860,7 @@
 <translation id="8270242299912238708">PDF документи</translation>
 <translation id="827097179112817503">Прикажи дугме за почетну страницу</translation>
 <translation id="8272443605911821513">Управљајте додацима кликом на Додаци у менију „Још алатки“.</translation>
+<translation id="8274924778568117936">Не искључујте и не затварајте <ph name="DEVICE_TYPE" /> док се ажурирање не заврши. <ph name="DEVICE_TYPE" /> ће се поново покренути када се инсталација заврши.</translation>
 <translation id="8275038454117074363">Увези</translation>
 <translation id="8276560076771292512">Испразни кеш и поново учитај са сервера</translation>
 <translation id="8279388322240498158">Сорани курдска тастатура заснована на енглеском</translation>
@@ -5306,7 +5302,6 @@
 <translation id="8963572037665351978">Затвори презентацију</translation>
 <translation id="8965037249707889821">Унесите стару лозинку</translation>
 <translation id="8965697826696209160">Нема довољно простора.</translation>
-<translation id="8968527460726243404">Уписивање слика Chrome ОС система</translation>
 <translation id="8970203673128054105">Прикажи листу режима пребацивања</translation>
 <translation id="89720367119469899">Escape</translation>
 <translation id="8972513834460200407">Проверите са администратором мреже да бисте се уверили да заштитни зид не блокира преузимања са Google сервера.</translation>
@@ -5482,6 +5477,7 @@
 <translation id="93766956588638423">Поправи додатак</translation>
 <translation id="938470336146445890">Инсталирајте кориснички сертификат.</translation>
 <translation id="938582441709398163">Постављени елемент тастатуре</translation>
+<translation id="939519157834106403">SSID</translation>
 <translation id="939598580284253335">Унесите приступну фразу</translation>
 <translation id="939736085109172342">Нови директоријум</translation>
 <translation id="940425055435005472">Величина фонта:</translation>
diff --git a/chrome/app/resources/generated_resources_sv.xtb b/chrome/app/resources/generated_resources_sv.xtb
index da84b80..39ca1c1 100644
--- a/chrome/app/resources/generated_resources_sv.xtb
+++ b/chrome/app/resources/generated_resources_sv.xtb
@@ -835,7 +835,6 @@
 <translation id="2224551243087462610">Redigera mappnamn</translation>
 <translation id="2226449515541314767">Webbplatsen har blockerats från fullständig kontroll över MIDI-enheter.</translation>
 <translation id="2226720438730111184">Berätta vad som händer</translation>
-<translation id="222903405933288376">Google använder din plats för att ge dig lokalt innehåll. Detta går att ändra i <ph name="SETTINGS_LINK" />.</translation>
 <translation id="2229161054156947610">Mer än 1 timme kvar</translation>
 <translation id="222931766245975952">Filen är trunkerad</translation>
 <translation id="222949136907494149"><ph name="URL" /> vill använda enhetens platsinfo.</translation>
@@ -1087,7 +1086,6 @@
 <translation id="2575247648642144396">Den här ikonen visas när tillägget kan aktiveras för den aktuella sidan. Använd tillägget genom att klicka på ikonen eller genom att trycka på <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="2576842806987913196">Det finns redan en CRX-fil med det här namnet.</translation>
 <translation id="2579575372772932244">Profilen återskapas, vänta …</translation>
-<translation id="2580168606262715640">Mobilen hittades inte. Håll den på armlängds avstånd.</translation>
 <translation id="2580889980133367162">Tillåt alltid att <ph name="HOST" /> laddar flera filer</translation>
 <translation id="2580924999637585241">Totalt: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">Lång</translation>
@@ -2172,7 +2170,6 @@
 <translation id="4130207949184424187">Det här tillägget har ändrat vilken sida som visas när du söker i adressfältet.</translation>
 <translation id="413121957363593859">Komponenter</translation>
 <translation id="4131410914670010031">Svartvitt</translation>
-<translation id="4135054690906486073">Nätverket delas med andra användare</translation>
 <translation id="4135450933899346655">Dina certifikat</translation>
 <translation id="4138267921960073861">Visa användarnamn och foton på inloggningssidan</translation>
 <translation id="4140559601186535628">Push-meddelanden</translation>
@@ -2576,9 +2573,6 @@
 <translation id="4813345808229079766">Anslutning</translation>
 <translation id="4813512666221746211">Nätverksfel</translation>
 <translation id="4816492930507672669">Anpassa till sida</translation>
-<translation id="4816617200045929931">Berätta vad som hände precis innan profilmeddelandet visades:
-
-****ÄNDRA INGENTING NEDANFÖR DEN HÄR RADEN****</translation>
 <translation id="4820334425169212497">Nej, jag ser den inte</translation>
 <translation id="4821086771593057290">Lösenordet har ändrats. Försök igen med ditt nya lösenord.</translation>
 <translation id="4821935166599369261">&amp;Profilering aktiverad</translation>
@@ -2944,7 +2938,6 @@
 <translation id="5340217413897845242">Hyllobjekt 6</translation>
 <translation id="5341390997810576190">Använd mobildata</translation>
 <translation id="5342091991439452114">Pinkoden måste bestå av minst <ph name="MINIMUM" /> siffror</translation>
-<translation id="5342344590724511265">Feedback vid kraschad flik.</translation>
 <translation id="5342451237681332106">Använd <ph name="PHONE_NAME" /></translation>
 <translation id="534916491091036097">Vänsterparen</translation>
 <translation id="5350965906220856151">Oj!</translation>
@@ -3216,6 +3209,7 @@
 <translation id="5764483294734785780">S&amp;para ljud som...</translation>
 <translation id="57646104491463491">Datum ändrad</translation>
 <translation id="5764797882307050727">Frigör utrymme på enheten.</translation>
+<translation id="5765425701854290211">Vissa filer har skadats och uppdateringen slutfördes inte. De synkroniserade filerna är säkra.</translation>
 <translation id="5765491088802881382">Det finns inga nätverk</translation>
 <translation id="5765780083710877561">Beskrivning:</translation>
 <translation id="5771585441665576801">Translitterera (geia → γεια)</translation>
@@ -4430,6 +4424,7 @@
 <translation id="7615910377284548269">Hantera blockering av pluginprogram utanför sandlådan ...</translation>
 <translation id="7617366389578322136">Ansluter till <ph name="DEVICE_NAME" /></translation>
 <translation id="761779991806306006">Inget lösenord har sparats.</translation>
+<translation id="7622114377921274169">Laddas.</translation>
 <translation id="7624154074265342755">Trådlösa nätverk</translation>
 <translation id="7624337243375417909">caps lock av</translation>
 <translation id="7627790789328695202">Det finns redan en fil med namnet <ph name="FILE_NAME" />. Byt namn på filen och försök igen.</translation>
@@ -4869,6 +4864,7 @@
 <translation id="8270242299912238708">PDF-dokument</translation>
 <translation id="827097179112817503">Visa knappen Startsida</translation>
 <translation id="8272443605911821513">Hantera dina tillägg genom att klicka på Tillägg i menyn Fler verktyg.</translation>
+<translation id="8274924778568117936">Stäng inte av eller stäng <ph name="DEVICE_TYPE" /> förrän uppdateringen har slutförts. <ph name="DEVICE_TYPE" /> startas om när installationen är slutförd.</translation>
 <translation id="8275038454117074363">Importera</translation>
 <translation id="8276560076771292512">Töm cacheminne och gör hård inläsning</translation>
 <translation id="8279388322240498158">Tangentbord på sorani/kurdiska och engelska</translation>
@@ -5309,7 +5305,6 @@
 <translation id="8963572037665351978">Avsluta presentationen</translation>
 <translation id="8965037249707889821">Ange det gamla lösenordet</translation>
 <translation id="8965697826696209160">Det finns inte tillräckligt med ledigt utrymme.</translation>
-<translation id="8968527460726243404">Systemavbildningsskrivare för Chrome OS</translation>
 <translation id="8970203673128054105">Visa lista över cast-lägen</translation>
 <translation id="89720367119469899">Escape</translation>
 <translation id="8972513834460200407">Kontrollera med nätverksadministratören att brandväggen inte blockerar nedladdning från Googles servrar.</translation>
@@ -5485,6 +5480,7 @@
 <translation id="93766956588638423">Reparera tillägg</translation>
 <translation id="938470336146445890">Installera ett användarcertifikat.</translation>
 <translation id="938582441709398163">Tangentbordsöverlägg</translation>
+<translation id="939519157834106403">SSID</translation>
 <translation id="939598580284253335">Ange lösenfras</translation>
 <translation id="939736085109172342">Ny mapp</translation>
 <translation id="940425055435005472">Teckenstorlek:</translation>
diff --git a/chrome/app/resources/generated_resources_sw.xtb b/chrome/app/resources/generated_resources_sw.xtb
index 9f7f8aef..6540c285 100644
--- a/chrome/app/resources/generated_resources_sw.xtb
+++ b/chrome/app/resources/generated_resources_sw.xtb
@@ -834,7 +834,6 @@
 <translation id="2224551243087462610">Badilisha jina la folda</translation>
 <translation id="2226449515541314767">Tovuti imezuiwa isiwe na udhibiti kamili wa vifaa vya MIDI.</translation>
 <translation id="2226720438730111184">Tueleze Kinachotendeka</translation>
-<translation id="222903405933288376">Google hutumia mahali ulipo ili kukupa maudhui ya karibu nawe. Unaweza kubadilisha mipangilio hii katika <ph name="SETTINGS_LINK" />.</translation>
 <translation id="2229161054156947610">Zimesalia zaidi ya saa 1</translation>
 <translation id="222931766245975952">Faili imepunguzwa</translation>
 <translation id="222949136907494149"><ph name="URL" /> inataka kutumia eneo lako la kompyuta.</translation>
@@ -1086,7 +1085,6 @@
 <translation id="2575247648642144396">Ikoni hii itaonekana wakati kiendelezi kitakapoweza kufanya kazi kwenye ukurasa wa sasa. Tumia kiendelezi hiki kwa kubofya ikoni au kwa kubonyeza <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="2576842806987913196">Tayari kuna faili ya CRX iliyo na jina hili.</translation>
 <translation id="2579575372772932244">Inaunda wasifu upya, tafadhali subiri...</translation>
-<translation id="2580168606262715640">Haiwezi kupata simu yako. Hakikisha kuwa unaweza kuifikia.</translation>
 <translation id="2580889980133367162">Ruhusu <ph name="HOST" /> kupakua faili nyingi wakati wote</translation>
 <translation id="2580924999637585241">Jumla: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">Muda mrefu</translation>
@@ -2164,7 +2162,6 @@
 <translation id="4130207949184424187">Kiendelezi hiki kimebadilisha ukurasa unaoonyeshwa unapotafuta kutoka Sanduku Kuu.</translation>
 <translation id="413121957363593859">Vipengele</translation>
 <translation id="4131410914670010031">Nyeusi na nyeupe</translation>
-<translation id="4135054690906486073">Mtandao huu unashirikiwa na watumiaji wengine</translation>
 <translation id="4135450933899346655">Vyeti Vyako</translation>
 <translation id="4138267921960073861">Onyesha majina ya watumiaji na picha kwenye skrini ya kuingia</translation>
 <translation id="4140559601186535628">Ujumbe Unaotumwa na Programu Hata Wakati Huitumii</translation>
@@ -2567,9 +2564,6 @@
 <translation id="4813345808229079766">Muunganisho</translation>
 <translation id="4813512666221746211">Hitilafu ya mtandao</translation>
 <translation id="4816492930507672669">Sawazisha kwenye ukurasa</translation>
-<translation id="4816617200045929931">Tueleze hasa kilichotokea kabla ya kpokea ujumbe wa hitilafu ya wasifu:
-
-****USIBADILISHE CHINI YA MSTARI HUU****</translation>
 <translation id="4820334425169212497">Hapana, Siioni</translation>
 <translation id="4821086771593057290">Nenosiri lako limebadilika. Tafadhali jaribu tena kwa nenosiri lako jipya.</translation>
 <translation id="4821935166599369261">&amp;Uwekaji Wasifu Umewezeshwa</translation>
@@ -2935,7 +2929,6 @@
 <translation id="5340217413897845242">Kipengee cha kabati cha 6</translation>
 <translation id="5341390997810576190">Tumia data ya simu za mkononi</translation>
 <translation id="5342091991439452114">Lazima PIN iwe na angalau tarakimu <ph name="MINIMUM" /></translation>
-<translation id="5342344590724511265">Majibu ya kichupo kuacha kufanya kazi.</translation>
 <translation id="5342451237681332106">Tumia <ph name="PHONE_NAME" /></translation>
 <translation id="534916491091036097">Mabado ya kushoto</translation>
 <translation id="5350965906220856151">Ehee!</translation>
@@ -3207,6 +3200,7 @@
 <translation id="5764483294734785780">&amp;Hifadhi audio kama</translation>
 <translation id="57646104491463491">Tarehe ya Kubadilishwa</translation>
 <translation id="5764797882307050727">Tafadhali futa vitu kadhaa ili upate nafasi kwenye kifaa chako.</translation>
+<translation id="5765425701854290211">Samahani, baadhi ya faili zimeharibika, kwa hiyvo sasisho halikukamilika. Faili zako ulizosawazisha ziko salama.</translation>
 <translation id="5765491088802881382">Hakuna mitandao inayopatikana</translation>
 <translation id="5765780083710877561">Maelezo:</translation>
 <translation id="5771585441665576801">Unukuzi wa mfumo wa kuandika (geia → γεια)</translation>
@@ -4423,6 +4417,7 @@
 <translation id="7615910377284548269">Dhibiti uzuiaji wa programu-jalizi isiyo kwenye sandbox...</translation>
 <translation id="7617366389578322136">Inaunganisha kwenye "<ph name="DEVICE_NAME" />"</translation>
 <translation id="761779991806306006">Hakuna nenosiri lililohifadhiwa.</translation>
+<translation id="7622114377921274169">Inachaji.</translation>
 <translation id="7624154074265342755">Mitandao pasiwaya</translation>
 <translation id="7624337243375417909">kitufe cha herufi kubwa kimezimwa</translation>
 <translation id="7627790789328695202">Lo, <ph name="FILE_NAME" /> tayari ipo. Ibadili jina na ujaribu tena.</translation>
@@ -4864,8 +4859,9 @@
 <translation id="8270242299912238708">Hati za PDF</translation>
 <translation id="827097179112817503">Onyesha kitufe cha mwanzo</translation>
 <translation id="8272443605911821513">Dhibiti viendelezi vyako kwa kubofya Viendelezi katika menyu ya "Zana zaidi".</translation>
+<translation id="8274924778568117936">Usizime wala kufunga kifaa chako cha <ph name="DEVICE_TYPE" /> hadi sasisho likamilike. Kifaa chako cha <ph name="DEVICE_TYPE" /> kitazimika na kuwaka baada ya sasisho kukamilika.</translation>
 <translation id="8275038454117074363">Ingiza</translation>
-<translation id="8276560076771292512">Akiba Tupu na Upakiaji Mpya Mkuu</translation>
+<translation id="8276560076771292512">Futa Akiba na Uanzishe Kivinjari Upya</translation>
 <translation id="8279388322240498158">Kibodi inayolingana na Kiingereza cha Kurdu ya Sorani</translation>
 <translation id="8280151743281770066">Fonetiki ya Kiarmenia</translation>
 <translation id="8281886186245836920">Ruka</translation>
@@ -5305,7 +5301,6 @@
 <translation id="8963572037665351978">Ondoka kwenye Wasilisho</translation>
 <translation id="8965037249707889821">Weka nenosiri la zamani</translation>
 <translation id="8965697826696209160">Hakuna nafasi ya kutosha.</translation>
-<translation id="8968527460726243404">Kiandikaji cha Picha za Mfumo wa ChromeOS</translation>
 <translation id="8970203673128054105">Angalia orodha ya hali ya kutuma</translation>
 <translation id="89720367119469899">Ondoka</translation>
 <translation id="8972513834460200407">Tafadhali wasiliana na msimamzi wako wa mtandao ili uhakikishe kuwa ngome haizuii vipakuliwa kutoka seva za Google.</translation>
@@ -5481,6 +5476,7 @@
 <translation id="93766956588638423">Karabati kiendelezi</translation>
 <translation id="938470336146445890">Tafadhali sakinisha cheti cha mtumiaji.</translation>
 <translation id="938582441709398163">Mtandazo wa Kibodi</translation>
+<translation id="939519157834106403">SSID</translation>
 <translation id="939598580284253335">Ingiza kaulisiri</translation>
 <translation id="939736085109172342">Folda mpya</translation>
 <translation id="940425055435005472">Ukubwa wa fonti:</translation>
diff --git a/chrome/app/resources/generated_resources_ta.xtb b/chrome/app/resources/generated_resources_ta.xtb
index edf1b47..416525b0 100644
--- a/chrome/app/resources/generated_resources_ta.xtb
+++ b/chrome/app/resources/generated_resources_ta.xtb
@@ -835,7 +835,6 @@
 <translation id="2224551243087462610">கோப்புறை பெயரை மாற்று</translation>
 <translation id="2226449515541314767">MIDI சாதனங்களை முழுமையாக கட்டுப்படுத்துவதிலிருந்து இந்தத் தளம் தடுக்கப்பட்டுள்ளது.</translation>
 <translation id="2226720438730111184">என்ன நடக்கிறது என்பதை எங்களிடம் கூறவும்</translation>
-<translation id="222903405933288376">உள்ளூர் உள்ளடக்கத்தை வழங்க, Google உங்கள் இருப்பிடத்தைப் பயன்படுத்தும். இதை <ph name="SETTINGS_LINK" /> என்பதில் மாற்றலாம்.</translation>
 <translation id="2229161054156947610">1 மணிநேரத்திற்கும் அதிகமாக உள்ளது</translation>
 <translation id="222931766245975952">கோப்பு சிதைந்தது</translation>
 <translation id="222949136907494149">உங்கள் கணினியின் இருப்பிடத்தை, <ph name="URL" /> பயன்படுத்த விரும்புகிறது.</translation>
@@ -1087,7 +1086,6 @@
 <translation id="2575247648642144396">நீட்டிப்பானது தற்போதைய பக்கத்தில் செயல்படும்போது, இந்த ஐகான் தெரியும். ஐகானில் கிளிக் செய்து அல்லது <ph name="EXTENSION_SHORTCUT" /> ஐ அழுத்தி இந்த நீட்டிப்பைப் பயன்படுத்துக.</translation>
 <translation id="2576842806987913196">இந்தப் பெயருடன் ஏற்கனவே ஒரு CRX கோப்பு உள்ளது.</translation>
 <translation id="2579575372772932244">சுயவிவரத்தை மீண்டும் உருவாக்குகிறது, காத்திருக்கவும்...</translation>
-<translation id="2580168606262715640">ஃபோனைக் கண்டறிய முடியவில்லை. அது கைக்கு எட்டும் தொலைவில் இருப்பதை உறுதிசெய்துகொள்ளவும்.</translation>
 <translation id="2580889980133367162">பல கோப்புகளைப் பதிவிறக்க எப்போதும் <ph name="HOST" /> ஐ அனுமதி</translation>
 <translation id="2580924999637585241">மொத்தம்: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">நீண்ட</translation>
@@ -2172,7 +2170,6 @@
 <translation id="4130207949184424187">சர்வபுலத்திலிருந்து தேடும் போது காண்பிக்கப்படும் பக்கத்தை இந்த நீட்டிப்பு மாற்றியுள்ளது.</translation>
 <translation id="413121957363593859">கூறுகள்</translation>
 <translation id="4131410914670010031">கருப்பு வெள்ளை</translation>
-<translation id="4135054690906486073">பிற பயனர்களுடன் இந்த நெட்வொர்க் பகிரப்பட்டது</translation>
 <translation id="4135450933899346655">உங்கள் சான்றிதழ்கள்</translation>
 <translation id="4138267921960073861">உள்நுழைவு திரையில், பயனர் பெயர்கள் மற்றும் புகைப்படங்களைக் காண்பி</translation>
 <translation id="4140559601186535628">புஷ் செய்திகள்</translation>
@@ -2573,9 +2570,6 @@
 <translation id="4813345808229079766">இணைப்பு</translation>
 <translation id="4813512666221746211">பிணைய பிழை</translation>
 <translation id="4816492930507672669">பக்கத்தில் பொருத்து</translation>
-<translation id="4816617200045929931">சுயவிவரப் பிழை செய்தியைப் பெறுவதற்கு முன் சரியாக என்ன நடந்தது என்பதை விவரிக்கவும்:
-
-****இந்த வரிக்குக் கீழுள்ள உள்ளடக்கத்தில் மாற்றம் செய்யக்கூடாது****</translation>
 <translation id="4820334425169212497">இல்லை, குறியீடு தெரியவில்லை</translation>
 <translation id="4821086771593057290">உங்கள் கடவுச்சொல் மாற்றப்பட்டது. புதிய கடவுச்சொல்லைக் கொண்டு மீண்டும் முயற்சி செய்க.</translation>
 <translation id="4821935166599369261">&amp;சுயவிவரமாக்கம் இயக்கப்பட்டது</translation>
@@ -2939,7 +2933,6 @@
 <translation id="5340217413897845242">ஷெல்ஃப் உருப்படி 6</translation>
 <translation id="5341390997810576190">செல்லுலார் தரவைப் பயன்படுத்து</translation>
 <translation id="5342091991439452114">பின்னில் குறைந்தது <ph name="MINIMUM" /> இலக்கங்கள் இருக்க வேண்டும்</translation>
-<translation id="5342344590724511265">தாவல் சிதைந்தது பற்றிய கருத்து.</translation>
 <translation id="5342451237681332106"><ph name="PHONE_NAME" />ஐப் பயன்படுத்து</translation>
 <translation id="534916491091036097">இடது அடைப்புக்குறி</translation>
 <translation id="5350965906220856151">அடடா!</translation>
@@ -3212,6 +3205,7 @@
 <translation id="5764483294734785780">ஆடியோவை இவ்வாறு சே&amp;மி...</translation>
 <translation id="57646104491463491">மாற்றிய தேதி</translation>
 <translation id="5764797882307050727">சாதனத்தில் சிறிது இடத்தைக் காலி செய்யவும்.</translation>
+<translation id="5765425701854290211">சில கோப்புகள் சேதமடைந்ததால், புதுப்பிக்க முடியவில்லை. ஒத்திசைத்த கோப்புகள் பாதுகாப்பாக உள்ளன.</translation>
 <translation id="5765491088802881382">நெட்வொர்க்குகள் எதுவும் கிடைக்கவில்லை</translation>
 <translation id="5765780083710877561">விவரம்:</translation>
 <translation id="5771585441665576801">ஒலிபெயர்ப்பு (geia → γεια)</translation>
@@ -4419,6 +4413,7 @@
 <translation id="7615910377284548269">சாண்ட்பாக்ஸ் செய்யப்படாத செருகுநிரல் தடுப்பை நிர்வகி...</translation>
 <translation id="7617366389578322136">"<ph name="DEVICE_NAME" />" சாதனத்துடன் இணைக்கிறது</translation>
 <translation id="761779991806306006">கடவுச்சொற்கள் சேமிக்கப்படவில்லை.</translation>
+<translation id="7622114377921274169">சார்ஜாகிறது.</translation>
 <translation id="7624154074265342755">கம்பியில்லா நெட்வொர்க்குகள்</translation>
 <translation id="7624337243375417909">கேப்ஸ்லாக் முடக்கப்பட்டுள்ளது</translation>
 <translation id="7627790789328695202">அடடா, <ph name="FILE_NAME" /> ஏற்கனவே உள்ளது. இதற்கு மறுபெயரிட்டு மீண்டும் முயற்சிக்கவும்.</translation>
@@ -4858,6 +4853,7 @@
 <translation id="8270242299912238708">PDF ஆவணங்கள்</translation>
 <translation id="827097179112817503">முகப்பு பொத்தானைக் காட்டு</translation>
 <translation id="8272443605911821513">"கூடுதல் கருவிகள்" மெனுவில் நீட்டிப்புகள் என்பதைக் கிளிக் செய்து நீட்டிப்புகளை நிர்வகிக்கவும்.</translation>
+<translation id="8274924778568117936">புதுப்பிப்பு முடியும் வரை <ph name="DEVICE_TYPE" /> சாதனத்தை முடக்கவோ அல்லது மூடவோ வேண்டாம். நிறுவியதும், <ph name="DEVICE_TYPE" /> மீண்டும் தொடங்கும்.</translation>
 <translation id="8275038454117074363">இறக்குமதி செய்</translation>
 <translation id="8276560076771292512">தற்காலிகச் சேமிப்பை வெறுமையாக்கி, கடினமாக மீண்டும் ஏற்று</translation>
 <translation id="8279388322240498158">சொரானி குர்டிஷ் ஆங்கில விசைப்பலகை</translation>
@@ -5299,7 +5295,6 @@
 <translation id="8963572037665351978">விளக்கக்காட்சியிலிருந்து வெளியேறு</translation>
 <translation id="8965037249707889821">பழைய கடவுச்சொல்லை உள்ளிடு</translation>
 <translation id="8965697826696209160">போதிய இடம் இல்லை.</translation>
-<translation id="8968527460726243404">ChromeOS சிஸ்டம் இமேஜ் ரைட்டர்</translation>
 <translation id="8970203673128054105">அனுப்பும் பயன்முறையின் பட்டியலைக் காட்டு</translation>
 <translation id="89720367119469899">Escape</translation>
 <translation id="8972513834460200407">Google சேவையகங்களிலிருந்து பதிவிறக்குவதை தீச்சுவர் தடுக்கவில்லை என்பதை உங்கள் பிணைய நிர்வாகியிடம் கேட்டு உறுதிப்படுத்திக்கொள்ளவும்.</translation>
@@ -5474,6 +5469,7 @@
 <translation id="93766956588638423">நீட்டிப்பைப் பழுதுநீக்கு</translation>
 <translation id="938470336146445890">பயனர் சான்றிதழை நிறுவுக.</translation>
 <translation id="938582441709398163">விசைப்பலகை மேல்தோற்றம்</translation>
+<translation id="939519157834106403">SSID</translation>
 <translation id="939598580284253335">கடவுச்சொற்றொடரை உள்ளிடுக</translation>
 <translation id="939736085109172342">புதிய கோப்புறை</translation>
 <translation id="940425055435005472">எழுத்துரு அளவு:</translation>
diff --git a/chrome/app/resources/generated_resources_te.xtb b/chrome/app/resources/generated_resources_te.xtb
index c3cc6769..0f8412e0 100644
--- a/chrome/app/resources/generated_resources_te.xtb
+++ b/chrome/app/resources/generated_resources_te.xtb
@@ -623,6 +623,7 @@
 <translation id="1882130480443819387">శీర్షిక వారీగా క్రమబద్ధీకరించు</translation>
 <translation id="1886996562706621347">ప్రోటోకాల్స్‌కు డిఫాల్ట్ హ్యాండ్లర్‌లుగా కావడం కోసం అడగటానికి సైట్‌లను అనుమతించండి (సిఫార్సు చేయబడింది)</translation>
 <translation id="1887850431809612466">హార్డ్‌వేర్ పునర్విమర్శ</translation>
+<translation id="1889984860246851556">ప్రాక్సీ సెట్టింగ్‌లని తెరవండి</translation>
 <translation id="1891668193654680795">సాఫ్ట్‌వేర్ నిర్మాతలను గుర్తించడం కోసం ఈ ప్రమాణపత్రాన్ని నమ్మండి.</translation>
 <translation id="189210018541388520">పూర్తి స్క్రీన్‌ని తెరువు</translation>
 <translation id="1893406696975231168">క్లౌడ్ కేటాయింపు విధానం విఫలమైంది</translation>
@@ -834,7 +835,6 @@
 <translation id="2224551243087462610">ఫోల్డర్ పేరును సవరించు</translation>
 <translation id="2226449515541314767">ఈ సైట్ MIDI పరికరాలకు పూర్తి నియంత్రణ లేకుండా బ్లాక్ చేయబడింది.</translation>
 <translation id="2226720438730111184">ఏమి జరుగుతోందో మాకు చెప్పండి</translation>
-<translation id="222903405933288376">Google మీకు స్థానిక సమాచారాన్ని అందించేందుకు మీ స్థానాన్ని ఉపయోగిస్తుంది. మీరు దీన్ని <ph name="SETTINGS_LINK" />లో మార్చగలరు.</translation>
 <translation id="2229161054156947610">1 గంట పైగా మిగిలి ఉంది</translation>
 <translation id="222931766245975952">ఫైల్ కుదించబడింది</translation>
 <translation id="222949136907494149"><ph name="URL" /> మీ కంప్యూటర్ స్థానాన్ని ఉపయోగించాలనుకుంటోంది.</translation>
@@ -850,6 +850,7 @@
 <translation id="2241634353105152135">ఒకసారి మాత్రమే</translation>
 <translation id="2242603986093373032">పరికరాలు లేవు</translation>
 <translation id="2242687258748107519">ఫైల్ సమాచారం</translation>
+<translation id="2245240762616536227">శోధన, ప్రకటనలు మరియు ఇతర Google సేవలను మీ బ్రౌజింగ్ చరిత్ర ఏ విధంగా వ్యక్తిగతీకరించాలి అన్నది నియంత్రించండి</translation>
 <translation id="2246340272688122454">రికవరీ చిత్రాన్ని డౌన్‌లోడ్ చేస్తోంది...</translation>
 <translation id="2249499294612408921">పర్యవేక్షించబడే వినియోగదారు మీ మార్గదర్శకత్వంతో వెబ్‌లో అన్వేషించగలరు. Chromeలో పర్యవేక్షించబడే వినియోగదారుని నిర్వాహకుడిగా, మీరు వీటిని చేయవచ్చు
 
@@ -1085,7 +1086,6 @@
 <translation id="2575247648642144396">ప్రస్తుత పేజీలో పొడిగింపును అమలు చేయగలిగినప్పుడు ఈ చిహ్నం కనిపిస్తుంది. చిహ్నంపై క్లిక్ చేయడం ద్వారా లేదా <ph name="EXTENSION_SHORTCUT" />ను నొక్కడం ద్వారా ఈ పొడిగింపును ఉపయోగించండి.</translation>
 <translation id="2576842806987913196">ఈ పేరుతో ఇప్పటికే CRX ఫైల్ ఉంది.</translation>
 <translation id="2579575372772932244">ప్రొఫైల్‌ను పునఃసృష్టిస్తోంది, దయచేసి వేచి ఉండండి...</translation>
-<translation id="2580168606262715640">మీ ఫోన్‌ని కనుగొనలేదు. అది చేతికి అందేంత దగ్గర్లో ఉందని నిర్ధారించుకోండి.</translation>
 <translation id="2580889980133367162">బహుళ ఫైల్‌లను డౌన్‌లోడ్ చేయడానికి <ph name="HOST" />ని ఎల్లప్పుడూ అనుమతించు</translation>
 <translation id="2580924999637585241">మొత్తం: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">ఎక్కువ</translation>
@@ -1376,6 +1376,7 @@
 <translation id="2966449113954629791">మీకు అనుమతించిన మొబైల్ డేటాను మీరు ఉపయోగించి ఉండవచ్చు. మరింత డేటాను కొనుగోలు చేయడానికి <ph name="NAME" /> సక్రియ పోర్టల్‌ను సందర్శించండి.</translation>
 <translation id="2966459079597787514">స్వెడిష్ కీబోర్డ్</translation>
 <translation id="2966598748518102999">"Ok Google" మరియు కొన్ని క్షణాలకు ముందు చెప్పిన దాని యొక్క ధ్వనిని Googleకు పంపడం ద్వారా వాయిస్ శోధనను మెరుగుపరచండి.</translation>
+<translation id="2966937470348689686">Android ప్రాధాన్యతలను నిర్వహించండి</translation>
 <translation id="2967544384642772068">నిర్బంధంగా మూసివేయి</translation>
 <translation id="2971033837577180453">&lt;span&gt;ID:&lt;/span&gt;<ph name="EXTENSION_ID" /></translation>
 <translation id="2971213274238188218">కాంతిహీనం చేయి</translation>
@@ -2135,6 +2136,7 @@
 <translation id="4087089424473531098">పొడిగింపు సృష్టించబడింది:
 
 <ph name="EXTENSION_FILE" /></translation>
+<translation id="4087470595660267445">మీ Chromebookలో Google Play నుండి అనువర్తనాలు మరియు గేమ్‌లను ఇన్‌స్టాల్ చేసుకోండి. &lt;a target="_blank" href="<ph name="URL" />"&gt;మరింత తెలుసుకోండి&lt;/a&gt;</translation>
 <translation id="4088095054444612037">సమూహానికి ఆమోదించు</translation>
 <translation id="4089521618207933045">ఉపమెను ఉంది</translation>
 <translation id="4090103403438682346">ధృవీకృత ప్రాప్యతను ప్రారంభించండి</translation>
@@ -2168,7 +2170,6 @@
 <translation id="4130207949184424187">ఈ పొడిగింపు మీరు ఓమ్నిపెట్టె నుండి శోధించేటప్పుడు చూపబడే పేజీని మార్చింది.</translation>
 <translation id="413121957363593859">భాగాలు</translation>
 <translation id="4131410914670010031">నలుపు మరియు తెలుపు</translation>
-<translation id="4135054690906486073">ఈ నెట్‌వర్క్ ఇతర వినియోగదారులతో భాగస్వామ్యం చేయబడింది</translation>
 <translation id="4135450933899346655">మీ సర్టిఫికెట్‌లు</translation>
 <translation id="4138267921960073861">సైన్-ఇన్ స్క్రీన్‌లో వినియోగదారు పేర్లను మరియు ఫోటోలను చూపించు</translation>
 <translation id="4140559601186535628">పుష్ సందేశాలు</translation>
@@ -2572,9 +2573,6 @@
 <translation id="4813345808229079766">కనెక్షన్</translation>
 <translation id="4813512666221746211">నెట్‌వర్క్ లోపం</translation>
 <translation id="4816492930507672669">పేజీకి తగినట్లు అమర్చు</translation>
-<translation id="4816617200045929931">మీరు ప్రొఫైల్ లోప సందేశాన్ని స్వీకరించడానికి ముందు జరిగిన దాని గురించి మాకు స్పష్టంగా తెలియజేయండి:
-
-****ఈ పంక్తి దిగువ మార్చవద్దు****</translation>
 <translation id="4820334425169212497">లేదు, నాకు కనిపించలేదు</translation>
 <translation id="4821086771593057290">మీ పాస్‌వర్డ్ మార్చబడింది. దయచేసి మీ క్రొత్త పాస్‌వర్డ్‌తో ప్రయత్నించండి.</translation>
 <translation id="4821935166599369261">&amp;ప్రొఫైలింగ్ అనుమతించబడింది</translation>
@@ -2929,6 +2927,7 @@
 <translation id="5329858601952122676">&amp;తొలగించు</translation>
 <translation id="5330145655348521461">ఈ ఫైల్‌లు వేరే డెస్క్‌టాప్‌లో తెరవబడ్డాయి. దీన్ని వీక్షించడానికి <ph name="USER_NAME" /> (<ph name="MAIL_ADDRESS" />)కి తరలించండి.</translation>
 <translation id="5330512191124428349">సమాచారం పొందండి</translation>
+<translation id="5331069282670671859">ఈ వర్గంలో మీకు ప్రమాణపత్రాలు ఏవీ లేవు</translation>
 <translation id="5331425616433531170">"<ph name="CHROME_EXTENSION_NAME" />" దీనితో జత చేయాలనుకుంటోంది</translation>
 <translation id="5332624210073556029">టైమ్ జోన్:</translation>
 <translation id="5334142896108694079">స్క్రిప్ట్ క్యాష్</translation>
@@ -2939,7 +2938,6 @@
 <translation id="5340217413897845242">అర అంశం 6</translation>
 <translation id="5341390997810576190">సెల్యులార్ డేటాను ఉపయోగించు</translation>
 <translation id="5342091991439452114">PIN తప్పనిసరిగా కనీసం <ph name="MINIMUM" /> అంకెలు ఉండాలి</translation>
-<translation id="5342344590724511265">ట్యాబ్ క్రాష్ గురించి అభిప్రాయం.</translation>
 <translation id="5342451237681332106"><ph name="PHONE_NAME" />ని ఉపయోగించు</translation>
 <translation id="534916491091036097">ఎడమ బ్రాకెట్</translation>
 <translation id="5350965906220856151">అయ్యో!</translation>
@@ -2977,6 +2975,7 @@
 <translation id="5399158067281117682">పిన్‌లు సరిపోలడం లేదు!</translation>
 <translation id="5400640815024374115">నమ్మకమైన ప్లాట్‌ఫామ్ మాడ్యూల్ (TPM) చిప్ ఆపివెయ్యబడింది లేదా హాజరు కాలేదు.</translation>
 <translation id="5402367795255837559">బ్రెయిలీ</translation>
+<translation id="5402815541704507626">మొబైల్ డేటా ఉపయోగించి నవీకరణను డౌన్‌లోడ్ చేయండి</translation>
 <translation id="540296380408672091"><ph name="HOST" />లో కుక్కీలను ఎల్లప్పుడూ బ్లాక్ చేయి</translation>
 <translation id="5408750356094797285">జూమ్: <ph name="PERCENT" /></translation>
 <translation id="5409029099497331039">నాకు ఆశ్చర్యం కలిగించు</translation>
@@ -3114,6 +3113,7 @@
 <translation id="558918721941304263">అనువర్తనాలను లోడ్ చేస్తోంది...</translation>
 <translation id="5592595402373377407">ఇంకా తగినంత డేటా అందుబాటులో లేదు.</translation>
 <translation id="5595485650161345191">చిరునామాను సవరించు</translation>
+<translation id="5600706100022181951"><ph name="UPDATE_SIZE_MB" /> MB మొబైల్ డేటాను ఉపయోగించి నవీకరణ డౌన్‌లోడ్ చేయబడుతుంది. మీరు కొనసాగాలనుకుంటున్నారా?</translation>
 <translation id="5601503069213153581">PIN</translation>
 <translation id="5604324414379907186">ఎల్లప్పుడూ బుక్‌మార్క్‌ల బార్‌ను చూపించు</translation>
 <translation id="5605623530403479164">ఇతర శోధన ఇంజిన్‌లు</translation>
@@ -3209,6 +3209,7 @@
 <translation id="5764483294734785780">ఆడియోని ఇలా సే&amp;వ్ చెయ్యి...</translation>
 <translation id="57646104491463491">తేదీ సవరించబడింది</translation>
 <translation id="5764797882307050727">దయచేసి మీ పరికరంలో కొంత స్థలాన్ని ఖాళీ చేయండి.</translation>
+<translation id="5765425701854290211">క్షమించండి, కొన్ని ఫైల్‌లు పాడయ్యాయి మరియు అప్‌డేట్ విజయవంతం కాలేదు. మీ సమకాలీకరించిన ఫైల్‌లు సురక్షితంగా ఉన్నాయి.</translation>
 <translation id="5765491088802881382">నెట్‌వర్క్‌లు ఏవీ అందుబాటులో లేవు</translation>
 <translation id="5765780083710877561">వివరణ:</translation>
 <translation id="5771585441665576801">లిప్యంతరీకరణ (geia → γεια)</translation>
@@ -3222,6 +3223,7 @@
 <translation id="5778747455497889540">దిగువ మీ కంప్యూటర్‌కు కేటాయించబడిన యాదృచ్ఛికంగా రూపొందించబడిన సురక్షిత మాడ్యూల్ పాస్‌వర్డ్ అందించబడింది:</translation>
 <translation id="5780066559993805332">(ఉత్తమమైనది)</translation>
 <translation id="5780973441651030252">ప్రాసెస్ ప్రాధాన్యత</translation>
+<translation id="5781865261247219930"><ph name="EXTENSION_NAME" />కి ఆదేశాలను పంపించండి</translation>
 <translation id="5783221160790377646">లోపం కారణంగా, పర్యవేక్షించబడే వినియోగదారు సృష్టించబడలేదు. దయచేసి తర్వాత మళ్లీ ప్రయత్నించండి.</translation>
 <translation id="5783602409389152506">పరికరాల కోసం స్కాన్ చేస్తున్నప్పుడు...</translation>
 <translation id="57838592816432529">మ్యూట్ చేయి</translation>
@@ -3264,6 +3266,7 @@
 <translation id="5838825566232597749">US వర్క్‌మాన్ అంతర్జాతీయం</translation>
 <translation id="5842497610951477805">బ్లూటూత్‌ను ప్రారంభించు</translation>
 <translation id="5846929185714966548">ట్యాబ్‌ 4</translation>
+<translation id="5848924408752252705">వెనుకకు వెళ్లేందుకు తాకండి.</translation>
 <translation id="5848934677402291689">PDFకు సేవ్ చేయడం ప్రోగ్రెస్‌లో ఉంది</translation>
 <translation id="5849570051105887917">స్వస్థల ప్రదాత కోడ్</translation>
 <translation id="5849869942539715694">పొడిగింపును ప్యాక్ చేయి...</translation>
@@ -3282,6 +3285,7 @@
 <translation id="5859272821192576954">మీరు Hangoutsకి కొనసాగడానికి అంతా పూర్తి చేశారు</translation>
 <translation id="5860033963881614850">ఆఫ్ అయ్యింది</translation>
 <translation id="5860209693144823476">ట్యాబ్ 3</translation>
+<translation id="5860491529813859533">ఆన్ చేయండి</translation>
 <translation id="5860494867054883682">మీ పరికరం <ph name="CHANNEL_NAME" /> ఛానెల్‌కు నవీకరించబడుతోంది (<ph name="PROGRESS_PERCENT" />)</translation>
 <translation id="5862109781435984885">అరలో స్టైలస్ సాధనాలను చూపుతుంది</translation>
 <translation id="58625595078799656"><ph name="PRODUCT_NAME" />కి మీ Google పాస్‌వర్డ్‌ లేదా మీ స్వంత పాస్‌ఫ్రేజ్‌ని ఉపయోగించి మీ డేటాని గుప్తీకరించడానికి మీరు అవసరం.</translation>
@@ -3613,6 +3617,7 @@
 <translation id="6395423953133416962"><ph name="BEGIN_LINK1" />సిస్టమ్ సమాచారం<ph name="END_LINK1" /> మరియు <ph name="BEGIN_LINK2" />గణాంకాలు<ph name="END_LINK2" /> పంపు</translation>
 <translation id="6397363302884558537">మాట్లాడటాన్ని ఆపివేయి</translation>
 <translation id="6397592254427394018">అన్ని బుక్‌మార్క్‌లను &amp;అజ్ఞాత విండోలో తెరువు</translation>
+<translation id="6398715114293939307">Google Play స్టోర్‌ని తీసివేయండి</translation>
 <translation id="6398765197997659313">పూర్తి స్క్రీన్ నుండి నిష్క్రమించు</translation>
 <translation id="6399774419735315745">గూఢచారి</translation>
 <translation id="6401445054534215853">అర అంశం 1</translation>
@@ -4421,6 +4426,7 @@
 <translation id="7615910377284548269">శాండ్‌బాక్స్ చేయని ప్లగిన్‌ను బ్లాక్ చేయడం నిర్వహించు...</translation>
 <translation id="7617366389578322136">"<ph name="DEVICE_NAME" />"కు కనెక్ట్ చేస్తోంది</translation>
 <translation id="761779991806306006">పాస్‌వర్డ్‌లు ఏవీ సేవ్ చేయబడలేదు.</translation>
+<translation id="7622114377921274169">ఛార్జింగ్.</translation>
 <translation id="7624154074265342755">వైర్‌లెస్ నెట్‌వర్క్‌లు</translation>
 <translation id="7624337243375417909">caps lock ఆఫ్‌లో ఉంది</translation>
 <translation id="7627790789328695202">అయ్యో, <ph name="FILE_NAME" /> ఇప్పటికే ఉంది. దీని పేరు మార్చి, మళ్లీ ప్రయత్నించండి.</translation>
@@ -4856,6 +4862,7 @@
 <translation id="8270242299912238708">PDF పత్రాలు</translation>
 <translation id="827097179112817503">హోమ్ బటన్‌ను చూపు</translation>
 <translation id="8272443605911821513">మీ పొడిగింపులను "మరిన్ని సాధనాలు" మెనులోని పొడిగింపులను క్లిక్ చేయడం ద్వారా నిర్వహించండి.</translation>
+<translation id="8274924778568117936">అప్‌డేట్ పూర్తయ్యే వరకు మీ <ph name="DEVICE_TYPE" />ని ఆఫ్ చేయవద్దు లేదా మూసివేయవద్దు. ఇన్‌స్టాలేషన్ పూర్తయిన తర్వాత మీ <ph name="DEVICE_TYPE" /> పునఃప్రారంభమవుతుంది.</translation>
 <translation id="8275038454117074363">దిగుమతి చెయ్యి</translation>
 <translation id="8276560076771292512">ఖాళీ కాష్ మరియు క్లిష్టంగా మళ్లీ లోడ్ చేయి</translation>
 <translation id="8279388322240498158">సొరానీ కుర్డిష్ ఆంగ్ల-ఆధారిత కీబోర్డ్</translation>
@@ -5293,9 +5300,9 @@
 <translation id="8960999352790021682">బెంగాలీ కీబోర్డ్ (ఫొనెటిక్)</translation>
 <translation id="8962083179518285172">వివరాలను దాచిపెట్టు</translation>
 <translation id="8962198349065195967">ఈ నెట్‌వర్క్ మీ నిర్వాహకుడి ద్వారా కాన్ఫిగర్ చేయబడింది.</translation>
+<translation id="8963572037665351978">ప్రదర్శనను నిష్క్రమించు</translation>
 <translation id="8965037249707889821">పాత పాస్‌వర్డ్‌ను నమోదు చేయండి</translation>
 <translation id="8965697826696209160">తగినంత ఖాళీ లేదు.</translation>
-<translation id="8968527460726243404">ChromeOS సిస్టమ్ ఇమేజ్ రైటర్</translation>
 <translation id="8970203673128054105">ప్రసార మోడ్ జాబితాను వీక్షించండి</translation>
 <translation id="89720367119469899">ఎస్కేప్</translation>
 <translation id="8972513834460200407">దయచేసి Google సర్వర్‌ల నుండి డౌన్‌లోడ్‌లను ఫైర్‌వాల్ బ్లాక్ చేయడం లేదని నిర్ధారించుకోవడానికి మీ నెట్‌వర్క్ నిర్వాహకుడిని సంప్రదించండి.</translation>
@@ -5447,6 +5454,7 @@
 <translation id="9188441292293901223">దయచేసి ఈ <ph name="DEVICE_TYPE" />ని అన్‌లాక్ చేయడానికి మీ ఫోన్‌ను Android తాజా సంస్కరణకు నవీకరించండి.</translation>
 <translation id="9189690067274055051">నమోదు చేయడానికి మీ ఫోన్‌ని అన్‌లాక్ చేసి, దాన్ని <ph name="DEVICE_TYPE" /> సమీపంలోకి తీసుకురండి.</translation>
 <translation id="9190063653747922532">L2TP/IPsec + ముందుగా భాగస్వామ్యం చేసిన కీ</translation>
+<translation id="920045321358709304"><ph name="SEARCH_ENGINE" />ని శోధించు</translation>
 <translation id="9201305942933582053">Chrome కోసం Google Now!</translation>
 <translation id="9203398526606335860">&amp;ప్రొఫైలింగ్ అనుమతించబడింది</translation>
 <translation id="9203478404496196495">ట్యాబ్‌ను అన్‌మ్యూట్ చేయి</translation>
@@ -5469,6 +5477,7 @@
 <translation id="93766956588638423">పొడిగింపును సరి చేయి</translation>
 <translation id="938470336146445890">దయచేసి వినియోగదారు సర్టిఫికెట్‌ను వ్యవస్థాపించండి.</translation>
 <translation id="938582441709398163">కీబోర్డ్ అవలోకనం</translation>
+<translation id="939519157834106403">SSID</translation>
 <translation id="939598580284253335">పాస్‌ఫ్రేజ్‌ని ఎంటర్ చెయ్యండి</translation>
 <translation id="939736085109172342">క్రొత్త  ఫోల్డర్</translation>
 <translation id="940425055435005472">ఫాంట్ పరిమాణం:</translation>
@@ -5479,6 +5488,7 @@
 <translation id="946810925362320585">సిఫార్సును అనుసరించండి</translation>
 <translation id="951981865514037445"><ph name="URL" /> మీ పరికర స్థానాన్ని ఉపయోగించాలనుకుంటోంది.</translation>
 <translation id="952992212772159698">సక్రియం చెయ్యబడలేదు</translation>
+<translation id="958515377357646513">ముందుకు వెళ్లడానికి తాకండి.</translation>
 <translation id="960719561871045870">ఆపరేటర్ కోడ్</translation>
 <translation id="960987915827980018">సుమారు 1 గంట మిగిలి ఉంది</translation>
 <translation id="96421021576709873">Wi-Fi నెట్‌వర్క్</translation>
diff --git a/chrome/app/resources/generated_resources_th.xtb b/chrome/app/resources/generated_resources_th.xtb
index 76b7d0c2..2d8390c 100644
--- a/chrome/app/resources/generated_resources_th.xtb
+++ b/chrome/app/resources/generated_resources_th.xtb
@@ -5,7 +5,7 @@
 <translation id="1005274289863221750">ใช้ไมโครโฟนและกล้องถ่ายรูปของคุณ</translation>
 <translation id="1007233996198401083">ไม่สามารถเชื่อมต่อ</translation>
 <translation id="1007408791287232274">ไม่สามารถโหลดอุปกรณ์</translation>
-<translation id="1010366937854368312">เพิ่มคุณลักษณะการเข้าถึงเพิ่มเติม</translation>
+<translation id="1010366937854368312">เพิ่มฟีเจอร์การเข้าถึงเพิ่มเติม</translation>
 <translation id="1010833424573920260">{NUM_PAGES,plural, =1{หน้าไม่ตอบสนอง}other{หน้าไม่ตอบสนอง}}</translation>
 <translation id="1012794136286421601">ไฟล์เอกสาร แผ่นงาน สไลด์ และภาพวาดกำลังซิงค์ เปิดแอป Google ไดรฟ์เพื่อเข้าถึงไฟล์แบบออนไลน์หรือออฟไลน์</translation>
 <translation id="1013707859758800957">ปลั๊กอินที่ไม่ได้อยู่ในแซนด์บ็อกซ์ได้รับอนุญาตให้ทำงานในหน้าเว็บนี้</translation>
@@ -71,7 +71,7 @@
 <translation id="1110753181581583968">{NUM_DOWNLOAD,plural, =1{ดำเนินการดาวน์โหลดต่อ}other{ดำเนินการดาวน์โหลดต่อ}}</translation>
 <translation id="1110772031432362678">ไม่พบเครือข่าย</translation>
 <translation id="1114202307280046356">เพชร</translation>
-<translation id="1114335938027186412">คอมพิวเตอร์ของคุณมีอุปกรณ์รักษาความปลอดภัย Trusted Platform Module (TPM) ซึ่งใช้เพื่อนำคุณลักษณะการรักษาความปลอดภัยที่สำคัญจำนวนมากมาใช้ใน Chrome OS โปรดไปที่ศูนย์ช่วยเหลือของ Chromebook เพื่อเรียนรู้เพิ่มเติม: https://support.google.com/chromebook/?p=tpm</translation>
+<translation id="1114335938027186412">คอมพิวเตอร์ของคุณมีอุปกรณ์รักษาความปลอดภัย Trusted Platform Module (TPM) ซึ่งใช้เพื่อนำฟีเจอร์การรักษาความปลอดภัยที่สำคัญจำนวนมากมาใช้ใน Chrome OS โปรดไปที่ศูนย์ช่วยเหลือของ Chromebook เพื่อเรียนรู้เพิ่มเติม: https://support.google.com/chromebook/?p=tpm</translation>
 <translation id="1114901192629963971">ไม่สามารถยืนยันรหัสผ่านของคุณในเครือข่ายปัจจุบันนี้ โปรดเลือกเครือข่ายอื่น</translation>
 <translation id="1115018219887494029">Smart Lock สำหรับ Chromebook (เบต้า)</translation>
 <translation id="1116694919640316211">เกี่ยวกับ</translation>
@@ -123,7 +123,7 @@
 <translation id="1185924365081634987">คุณสามารถลอง<ph name="GUEST_SIGNIN_LINK_START" />เรียกดูในฐานะผู้เยี่ยมชม<ph name="GUEST_SIGNIN_LINK_END" /> เพื่อแก้ไขข้อผิดพลาดของเครือข่าย</translation>
 <translation id="1187722533808055681">ไม่ใช้งานการปลุก</translation>
 <translation id="1188807932851744811">ยังไม่อัปโหลดบันทึก</translation>
-<translation id="1189418886587279221">เปิดใช้งานคุณลักษณะการเข้าถึงเพื่อให้อุปกรณ์ใช้งานง่ายยิ่งขึ้น</translation>
+<translation id="1189418886587279221">เปิดใช้งานฟีเจอร์การเข้าถึงเพื่อให้อุปกรณ์ใช้งานง่ายยิ่งขึ้น</translation>
 <translation id="1190144681599273207">การดึงไฟล์นี้จะใช้ข้อมูลมือถือขนาดประมาณ <ph name="FILE_SIZE" /></translation>
 <translation id="11901918071949011">{NUM_FILES,plural, =1{เข้าถึง 1 ไฟล์ที่จัดเก็บไว้บนคอมพิวเตอร์}other{เข้าถึง # ไฟล์ที่จัดเก็บไว้บนคอมพิวเตอร์}}</translation>
 <translation id="1195447618553298278">ข้อผิดพลาดที่ไม่รู้จัก</translation>
@@ -281,7 +281,7 @@
 <translation id="1409390508152595145">สร้างผู้ใช้ภายใต้การดูแล</translation>
 <translation id="1410616244180625362">อนุญาตให้ <ph name="HOST" /> เข้าถึงกล้องต่อไป</translation>
 <translation id="1413372529771027206">โทรศัพท์ที่ใช้สำหรับ Smart Lock มีการเปลี่ยนแปลง โปรดพิมพ์รหัสผ่านเพื่ออัปเดต Smart Lock สำหรับ Chromebook บนอุปกรณ์นี้ คุณจะสามารถคลิกรูปภาพเพื่อป้อนรหัสผ่านได้ในครั้งถัดไป</translation>
-<translation id="1414648216875402825">คุณกำลังอัปเดตไปเป็น <ph name="PRODUCT_NAME" /> ในเวอร์ชันที่ไม่เสถียร ซึ่งมีคุณลักษณะที่ยังอยู่ระหว่างดำเนินการ จะมีข้อขัดข้องและข้อบกพร่องที่ไม่คาดคิดเกิดขึ้น โปรดดำเนินการต่อด้วยความระมัดระวัง</translation>
+<translation id="1414648216875402825">คุณกำลังอัปเดตไปเป็น <ph name="PRODUCT_NAME" /> ในเวอร์ชันที่ไม่เสถียร ซึ่งมีฟีเจอร์ที่ยังอยู่ระหว่างดำเนินการ จะมีข้อขัดข้องและข้อบกพร่องที่ไม่คาดคิดเกิดขึ้น โปรดดำเนินการต่อด้วยความระมัดระวัง</translation>
 <translation id="1415990189994829608"><ph name="EXTENSION_NAME" /> (รหัสส่วนขยาย "<ph name="EXTENSION_ID" />") ไม่ได้รับอนุญาตในเซสชันประเภทนี้</translation>
 <translation id="1416836038590872660">EAP-MD5</translation>
 <translation id="1420684932347524586">อ้าว! ไม่สามารถสร้างคีย์ส่วนตัว RSA แบบสุ่มได้</translation>
@@ -449,11 +449,11 @@
 <translation id="1634788685286903402">เชื่อถือใบรับรองนี้ในการระบุตัวตนของผู้ใช้อีเมล</translation>
 <translation id="1635033183663317347">ติดตั้งโดยผู้ดูแล</translation>
 <translation id="1637224376458524414">รับบุ๊กมาร์กนี้ใน iPhone ของคุณ</translation>
-<translation id="1637765355341780467">เกิดข้อผิดพลาดขณะเปิดโปรไฟล์ คุณลักษณะบางอย่างอาจไม่พร้อมใช้งาน</translation>
+<translation id="1637765355341780467">เกิดข้อผิดพลาดขณะเปิดโปรไฟล์ ฟีเจอร์บางอย่างอาจไม่พร้อมใช้งาน</translation>
 <translation id="1638447702436460526">ไม่พบเครื่องพิมพ์</translation>
 <translation id="1639239467298939599">กำลังโหลด</translation>
 <translation id="1640283014264083726">PKCS #1 MD4 พร้อมการเข้ารหัส RSA</translation>
-<translation id="1642494467033190216">ต้องนำการป้องกัน rootfs ออกและรีสตาร์ทก่อนที่จะเปิดใช้คุณลักษณะการแก้ไขข้อบกพร่องอื่นๆ</translation>
+<translation id="1642494467033190216">ต้องนำการป้องกัน rootfs ออกและรีสตาร์ทก่อนที่จะเปิดใช้ฟีเจอร์การแก้ไขข้อบกพร่องอื่นๆ</translation>
 <translation id="1643072738649235303">ลายเซ็น X9.62 ECDSA ที่มี SHA-1</translation>
 <translation id="1644574205037202324">ประวัติการเข้าชม</translation>
 <translation id="1645228020260124617"><ph name="PRECENTAGE" />%</translation>
@@ -638,7 +638,7 @@
 <translation id="1903219944620007795">สำหรับการป้อนข้อความ ให้เลือกภาษาเพื่อดูวิธีป้อนข้อมูลใช้ได้</translation>
 <translation id="1905710495812624430">ลองทำเกินจำนวนครั้งที่กำหนดไว้แล้ว</translation>
 <translation id="1909880997794698664">คุณต้องการเก็บอุปกรณ์นี้ไว้ในโหมดคีออสก์อย่างถาวรหรือไม่</translation>
-<translation id="1910572251697014317">Google ส่งการแจ้งเตือนไปยังโทรศัพท์เครื่องนี้แล้ว โปรดทราบว่าเมื่อใช้บลูทูธ โทรศัพท์ของคุณอาจปลดล็อก <ph name="DEVICE_TYPE" /> เสมอหากอยู่ในระยะ 100 ฟุต หากคุณไม่ต้องการใช้คุณลักษณะนี้ คุณสามารถ&lt;a&gt;ปิดคุณลักษณะนี้ชั่วคราว&lt;/a&gt;</translation>
+<translation id="1910572251697014317">Google ส่งการแจ้งเตือนไปยังโทรศัพท์เครื่องนี้แล้ว โปรดทราบว่าเมื่อใช้บลูทูธ โทรศัพท์ของคุณอาจปลดล็อก <ph name="DEVICE_TYPE" /> เสมอหากอยู่ในระยะ 100 ฟุต หากคุณไม่ต้องการใช้ฟีเจอร์นี้ คุณสามารถ&lt;a&gt;ปิดฟีเจอร์นี้ชั่วคราว&lt;/a&gt;</translation>
 <translation id="1910721550319506122">ยินดีต้อนรับ!</translation>
 <translation id="1916502483199172559">อวาตาร์เริ่มต้นสีแดง</translation>
 <translation id="191688485499383649">เกิดข้อผิดพลาดที่ไม่รู้จักขณะพยายามเชื่อมต่อกับ "<ph name="DEVICE_NAME" />"</translation>
@@ -736,7 +736,7 @@
 <translation id="2090876986345970080">การตั้งค่าความปลอดภัยของระบบ</translation>
 <translation id="2097372108957554726">คุณต้องลงชื่อเข้าใช้ Chrome เพื่อลงทะเบียนอุปกรณ์ใหม่</translation>
 <translation id="2098305189700762159">ไม่พบ</translation>
-<translation id="2099172618127234427">คุณกำลังเปิดใช้คุณลักษณะการแก้ไขข้อบกพร่องของ Chrome OS ซึ่งจะตั้งค่า sshd daemon และเปิดใช้การเปิดเครื่องจากไดรฟ์ USB</translation>
+<translation id="2099172618127234427">คุณกำลังเปิดใช้ฟีเจอร์การแก้ไขข้อบกพร่องของ Chrome OS ซึ่งจะตั้งค่า sshd daemon และเปิดใช้การเปิดเครื่องจากไดรฟ์ USB</translation>
 <translation id="2099686503067610784">ลบใบรับรองของเซิร์ฟเวอร์ "<ph name="CERTIFICATE_NAME" />" หรือไม่</translation>
 <translation id="2100273922101894616">ลงชื่อเข้าใช้อัตโนมัติ</translation>
 <translation id="2101225219012730419">รุ่น:</translation>
@@ -835,7 +835,6 @@
 <translation id="2224551243087462610">แก้ไขชื่อโฟลเดอร์</translation>
 <translation id="2226449515541314767">ไซต์นี้ถูกบล็อกจากการมีสิทธิ์ควบคุมอุปกรณ์ MIDI เต็มรูปแบบ</translation>
 <translation id="2226720438730111184">แจ้งให้เราทราบถึงสิ่งที่เกิดขึ้น</translation>
-<translation id="222903405933288376">Google ใช้ตำแหน่งของคุณเพื่อแสดงเนื้อหาในท้องถิ่น คุณสามารถเปลี่ยนการตั้งค่านี้ใน <ph name="SETTINGS_LINK" /></translation>
 <translation id="2229161054156947610">เหลือเวลามากกว่า 1 ชั่วโมง</translation>
 <translation id="222931766245975952">ไฟล์ไม่สมบูรณ์</translation>
 <translation id="222949136907494149"><ph name="URL" /> ต้องการใช้ตำแหน่งเครื่องคอมพิวเตอร์ของคุณ</translation>
@@ -939,7 +938,7 @@
 <translation id="2352467521400612932">การตั้งค่าสไตลัส</translation>
 <translation id="2352662711729498748">&lt; 1 MB</translation>
 <translation id="2356070529366658676">ถาม</translation>
-<translation id="2357949918965361754">คุณสามารถใช้คุณลักษณะนี้เพื่อแสดงเนื้อหาจาก Chrome บน TV หรืออุปกรณ์อื่นๆ ได้</translation>
+<translation id="2357949918965361754">คุณสามารถใช้ฟีเจอร์นี้เพื่อแสดงเนื้อหาจาก Chrome บน TV หรืออุปกรณ์อื่นๆ ได้</translation>
 <translation id="2359345697448000899">จัดการส่วนขยายของคุณโดยคลิกที่ "ส่วนขยาย" ในเมนู "เครื่องมือ"</translation>
 <translation id="2359808026110333948">ดำเนินการต่อ</translation>
 <translation id="236128817791440714">แนะนำ: ตั้งค่า Smart Lock สำหรับ Android</translation>
@@ -1087,7 +1086,6 @@
 <translation id="2575247648642144396">ไอคอนนี้จะปรากฏเมื่อส่วนขยายสามารถทำงานบนหน้าเว็บปัจจุบัน ใช้ส่วนขยายนี้โดยคลิกที่ไอคอน หรือกด <ph name="EXTENSION_SHORTCUT" /></translation>
 <translation id="2576842806987913196">มีไฟล์ CRX ที่มีชื่อนี้อยู่แล้ว</translation>
 <translation id="2579575372772932244">กำลังสร้างโปรไฟล์อีกครั้ง โปรดรอสักครู่...</translation>
-<translation id="2580168606262715640">ไม่พบโทรศัพท์ของคุณ โปรดตรวจสอบว่าโทรศัพท์อยู่ใกล้ๆ มือคุณ</translation>
 <translation id="2580889980133367162">อนุญาตให้ <ph name="HOST" /> ดาวน์โหลดไฟล์หลายไฟล์เสมอ</translation>
 <translation id="2580924999637585241">รวม: <ph name="SHEETS_LABEL" /> <ph name="NUMBER_OF_SHEETS" /> หน้า</translation>
 <translation id="258095186877893873">ยาว</translation>
@@ -1208,7 +1206,7 @@
 <translation id="2745080116229976798">ตัวย่อยที่เหมาะสมของ Microsoft</translation>
 <translation id="2749756011735116528">ลงชื่อเข้าใช้ <ph name="PRODUCT_NAME" /></translation>
 <translation id="2749881179542288782">ตรวจสอบไวยากรณ์และตัวสะกด</translation>
-<translation id="2755367719610958252">จัดการคุณลักษณะการเข้าถึง</translation>
+<translation id="2755367719610958252">จัดการฟีเจอร์การเข้าถึง</translation>
 <translation id="275662540872599901">ปิดหน้าจอ</translation>
 <translation id="2756798847867733934">ปิดใช้งานซิมการ์ดแล้ว</translation>
 <translation id="2765217105034171413">ขนาดเล็ก</translation>
@@ -1241,9 +1239,9 @@
 <translation id="2800537048826676660">ใช้ภาษานี้สำหรับการตรวจสอบการสะกด</translation>
 <translation id="2801702994096586034">เซิร์ฟเวอร์ 3</translation>
 <translation id="2803375539583399270">ป้อน PIN</translation>
-<translation id="2803887722080936828"><ph name="BEGIN_H3" />คุณลักษณะการแก้ไขข้อบกพร่อง<ph name="END_H3" />
+<translation id="2803887722080936828"><ph name="BEGIN_H3" />ฟีเจอร์การแก้ไขข้อบกพร่อง<ph name="END_H3" />
     <ph name="BR" />
-    คุณสามารถเปิดใช้คุณลักษณะการแก้ไขข้อบกพร่องบนอุปกรณ์ Chrome OS เพื่อติดตั้งและทดสอบรหัสที่กำหนดเองบนอุปกรณ์ได้ ซึ่งจะให้คุณสามารถ:<ph name="BR" />
+    คุณสามารถเปิดใช้ฟีเจอร์การแก้ไขข้อบกพร่องบนอุปกรณ์ Chrome OS เพื่อติดตั้งและทดสอบรหัสที่กำหนดเองบนอุปกรณ์ได้ ซึ่งจะให้คุณสามารถ:<ph name="BR" />
     <ph name="BEGIN_LIST" />
       <ph name="LIST_ITEM" />นำการยืนยัน rootfs ออกเพื่อให้คุณสามารถแก้ไขไฟล์ OS ได้
       <ph name="LIST_ITEM" />เปิดใช้การเข้าถึงอุปกรณ์แบบ SSH โดยใช้คีย์ทดสอบมาตรฐานเพื่อให้คุณสามารถใช้เครื่องมือเช่น <ph name="BEGIN_CODE" />'cros flash'<ph name="END_CODE" /> ในการเข้าถึงอุปกรณ์นั้น
@@ -1251,10 +1249,10 @@
       <ph name="LIST_ITEM" />ตั้งค่า dev และรหัสผ่านการเข้าระบบในระดับรากให้กับค่าที่กำหนดเองเพื่อให้คุณสามารถเข้าถึงอุปกรณ์แบบ SSH ได้ด้วยตนเอง
     <ph name="END_LIST" />
     <ph name="BR" />
-    เมื่อเปิดใช้แล้ว คุณลักษณะการแก้ไขข้อบกพร่องส่วนใหญ่จะยังคงเปิดใช้อยู่แม้ดำเนินการ Powerwash หรือล้างข้อมูลบนอุปกรณ์ที่จัดการโดยองค์กรแล้ว หากต้องการปิดใช้คุณลักษณะโดยสมบูรณ์ ให้ดำเนินการขั้นตอนการกู้คืน Chrome OS (https://support.google.com/chromebook/answer/1080595)
+    เมื่อเปิดใช้แล้ว ฟีเจอร์การแก้ไขข้อบกพร่องส่วนใหญ่จะยังคงเปิดใช้อยู่แม้ดำเนินการ Powerwash หรือล้างข้อมูลบนอุปกรณ์ที่จัดการโดยองค์กรแล้ว หากต้องการปิดใช้ฟีเจอร์โดยสมบูรณ์ ให้ดำเนินการขั้นตอนการกู้คืน Chrome OS (https://support.google.com/chromebook/answer/1080595)
     <ph name="BR" />
     <ph name="BR" />
-    สำหรับข้อมูลเพิ่มเติมเกี่ยวกับคุณลักษณะการแก้ไขข้อบกพร่อง โปรดดู:<ph name="BR" />
+    สำหรับข้อมูลเพิ่มเติมเกี่ยวกับฟีเจอร์การแก้ไขข้อบกพร่อง โปรดดู:<ph name="BR" />
     http://www.chromium.org/chromium-os/how-tos-and-troubleshooting/debugging-features
     <ph name="BR" />
     <ph name="BR" />
@@ -1327,7 +1325,7 @@
 <translation id="289644616180464099">ซิมการ์ดถูกล็อก</translation>
 <translation id="289695669188700754">รหัสคีย์: <ph name="KEY_ID" /></translation>
 <translation id="2897878306272793870">คุณแน่ใจหรือไม่ว่าต้องการเปิด <ph name="TAB_COUNT" /> แท็บ</translation>
-<translation id="290105521672621980">ไฟล์ใช้คุณลักษณะที่ไม่รองรับ</translation>
+<translation id="290105521672621980">ไฟล์ใช้ฟีเจอร์ที่ไม่รองรับ</translation>
 <translation id="2902127500170292085"><ph name="EXTENSION_NAME" /> ไม่สามารถสื่อสารกับเครื่องพิมพ์นี้ โปรดตรวจสอบว่าเครื่องพิมพ์เสียบปลั๊กอยู่และลองอีกครั้ง</translation>
 <translation id="2902734494705624966">แป้นพิมพ์ขยายแบบสหรัฐอเมริกา</translation>
 <translation id="2903493209154104877">ที่อยู่</translation>
@@ -1523,7 +1521,7 @@
 <translation id="3162559335345991374">Wi-Fi ที่คุณใช้อาจต้องการให้คุณไปที่หน้าการเข้าสู่ระบบ</translation>
 <translation id="316307797510303346">ควบคุมและดูเว็บไซต์ที่บุคคลนี้เข้าชมจาก <ph name="CUSTODIAN_EMAIL" />
     รายละเอียดการลงชื่อเข้าใช้บัญชีของคุณล้าสมัยแล้ว</translation>
-<translation id="3165390001037658081">ผู้ให้บริการบางรายอาจบล็อกคุณลักษณะนี้</translation>
+<translation id="3165390001037658081">ผู้ให้บริการบางรายอาจบล็อกฟีเจอร์นี้</translation>
 <translation id="3166571619128686629">คลิกหรือพูดว่า "Ok Google" เพื่อเริ่มค้นหาด้วยเสียง</translation>
 <translation id="3170072451822350649">คุณสามารถข้ามการลงชื่อเข้าใช้และ<ph name="LINK_START" />เรียกดูในฐานะผู้เยี่ยมชม<ph name="LINK_END" />ได้ด้วย</translation>
 <translation id="3170544058711792988">ให้โฟกัสของแว่นขยายอยู่ที่กลางหน้าจอเสมอ</translation>
@@ -1969,7 +1967,7 @@
 <translation id="3815571115159309122">พบรูปภาพใหม่ <ph name="FILE_COUNT" /> ภาพ
     <ph name="LINE_BREAK1" />
     พร้อมสำรองข้อมูลไปยัง <ph name="BEGIN_LINK" />Google ไดรฟ์<ph name="END_LINK" /></translation>
-<translation id="3816789583333631750">ต้องเปิดใช้ปลั๊กอิน Native Client เพื่อใช้คุณลักษณะนี้</translation>
+<translation id="3816789583333631750">ต้องเปิดใช้ปลั๊กอิน Native Client เพื่อใช้ฟีเจอร์นี้</translation>
 <translation id="3819007103695653773">อนุญาตให้ทุกไซต์ส่งข้อความพุชในพื้นหลัง</translation>
 <translation id="3819752733757735746">การเข้าถึงด้วยสวิตช์ (ควบคุมคอมพิวเตอร์ด้วยสวิตช์เพียง 1-2 ตัว)</translation>
 <translation id="3819800052061700452">เ&amp;ต็มหน้าจอ</translation>
@@ -2115,7 +2113,7 @@
 <translation id="4042264909745389898">ข้อกำหนดของ Google Chrome OS</translation>
 <translation id="4044612648082411741">ป้อนรหัสผ่านใบรับรอง</translation>
 <translation id="404493185430269859">เครื่องมือค้นหาเริ่มต้น</translation>
-<translation id="4047112090469382184">คุณลักษณะนี้มีความปลอดภัยอย่างไร</translation>
+<translation id="4047112090469382184">ฟีเจอร์นี้มีความปลอดภัยอย่างไร</translation>
 <translation id="4052120076834320548">ขนาดจิ๋ว</translation>
 <translation id="4055023634561256217">ต้องรีสตาร์ทก่อน จึงจะสามารถรีเซ็ตอุปกรณ์ของคุณด้วย Powerwash ได้</translation>
 <translation id="4057041477816018958"><ph name="SPEED" /> - <ph name="RECEIVED_AMOUNT" /></translation>
@@ -2172,7 +2170,6 @@
 <translation id="4130207949184424187">ส่วนขยายนี้ได้เปลี่ยนหน้าที่จะแสดงเมื่อคุณค้นหาจากแถบอเนกประสงค์</translation>
 <translation id="413121957363593859">คอมโพเนนต์</translation>
 <translation id="4131410914670010031">ขาวดำ</translation>
-<translation id="4135054690906486073">เครือข่ายนี้มีการแชร์กับผู้ใช้อื่น</translation>
 <translation id="4135450933899346655">ใบรับรองของคุณ</translation>
 <translation id="4138267921960073861">แสดงชื่อผู้ใช้และภาพถ่ายบนหน้าจอลงชื่อเข้าใช้</translation>
 <translation id="4140559601186535628">ข้อความพุช</translation>
@@ -2432,7 +2429,7 @@
 <translation id="4589268276914962177">เทอร์มินัลใหม่</translation>
 <translation id="4590324241397107707">พื้นที่จัดเก็บฐานข้อมูล</translation>
 <translation id="4593021220803146968">&amp;ไปที่ <ph name="URL" /></translation>
-<translation id="4594109696316595112">การเปิดใช้งานครั้งเดียว: พิมพ์รหัสผ่านเพื่อเปิดใช้งาน Smart Lock บน <ph name="DEVICE_TYPE" /> นี้ เมื่อใช้ Smart Lock โทรศัพท์ของคุณจะปลดล็อกอุปกรณ์นี้โดยไม่ต้องใช้รหัสผ่าน หากต้องการเปลี่ยนแปลงหรือปิดคุณลักษณะนี้ ให้ไปที่การตั้งค่าของ <ph name="DEVICE_TYPE" /></translation>
+<translation id="4594109696316595112">การเปิดใช้งานครั้งเดียว: พิมพ์รหัสผ่านเพื่อเปิดใช้งาน Smart Lock บน <ph name="DEVICE_TYPE" /> นี้ เมื่อใช้ Smart Lock โทรศัพท์ของคุณจะปลดล็อกอุปกรณ์นี้โดยไม่ต้องใช้รหัสผ่าน หากต้องการเปลี่ยนแปลงหรือปิดฟีเจอร์นี้ ให้ไปที่การตั้งค่าของ <ph name="DEVICE_TYPE" /></translation>
 <translation id="4595560905247879544">แอปและส่วนขยายสามารถแก้ไขได้โดยผู้จัดการ (<ph name="CUSTODIAN_NAME" />) เท่านั้น</translation>
 <translation id="4596295440756783523">คุณมีใบรับรองของไฟล์ซึ่งระบุตัวตนของเซิร์ฟเวอร์เหล่านี้:</translation>
 <translation id="4598556348158889687">การจัดการพื้นที่เก็บข้อมูล</translation>
@@ -2576,9 +2573,6 @@
 <translation id="4813345808229079766">การเชื่อมต่อ</translation>
 <translation id="4813512666221746211">ข้อผิดพลาดของเครือข่าย</translation>
 <translation id="4816492930507672669">พอดีกับหน้า</translation>
-<translation id="4816617200045929931">แจ้งให้เราทราบถึงสิ่งที่เกิดขึ้นโดยละเอียดก่อนที่คุณจะได้รับข้อความแสดงข้อผิดพลาดของโปรไฟล์:
-
-****อย่าเปลี่ยนแปลงข้อมูลด้านล่างนี้****</translation>
 <translation id="4820334425169212497">ไม่เห็น</translation>
 <translation id="4821086771593057290">คุณได้เปลี่ยนรหัสผ่านของคุณแล้ว โปรดลองอีกครั้งโดยใช้รหัสผ่านใหม่ของคุณ</translation>
 <translation id="4821935166599369261">&amp;เปิดใช้งานการทำแฟ้มประวัติ</translation>
@@ -2618,7 +2612,7 @@
 <translation id="4866139711390152178">เจ้าของสามารถเลือกที่จะส่งข้อมูลการวินิจฉัยและการใช้งานสำหรับอุปกรณ์นี้ไปยัง Google <ph name="BEGIN_LINK1" />เรียนรู้เพิ่มเติม<ph name="END_LINK1" /></translation>
 <translation id="486635084936119914">เปิดไฟล์บางประเภทโดยอัตโนมัติหลังจากที่ดาวน์โหลดมา</translation>
 <translation id="4870177177395420201"><ph name="PRODUCT_NAME" /> ไม่สามารถกำหนดหรือตั้งค่าเบราว์เซอร์ที่เป็นค่าเริ่มต้นได้</translation>
-<translation id="48704129375571883">เพิ่มคุณลักษณะ</translation>
+<translation id="48704129375571883">เพิ่มฟีเจอร์</translation>
 <translation id="4870903493621965035">ไม่มีอุปกรณ์ที่จับคู่</translation>
 <translation id="4871210892959306034">$1 KB</translation>
 <translation id="4871308555310586478">ไม่ได้มาจาก Chrome เว็บสโตร์</translation>
@@ -2696,7 +2690,7 @@
 <translation id="4974733135013075877">ออกและล็อกป้องกันเด็ก</translation>
 <translation id="4977942889532008999">ยืนยันการเข้าถึง</translation>
 <translation id="4980805016576257426">ส่วนขยายนี้มีมัลแวร์</translation>
-<translation id="498294082491145744">เปลี่ยนการตั้งค่าที่ควบคุมสิทธิ์ของเว็บไซต์ในการเข้าถึงคุณลักษณะอย่างเช่นคุกกี้, JavaScript, ปลั๊กอิน, ตำแหน่งทางภูมิศาสตร์, ไมโครโฟน, กล้องถ่ายรูป ฯลฯ</translation>
+<translation id="498294082491145744">เปลี่ยนการตั้งค่าที่ควบคุมสิทธิ์ของเว็บไซต์ในการเข้าถึงฟีเจอร์อย่างเช่นคุกกี้, JavaScript, ปลั๊กอิน, ตำแหน่งทางภูมิศาสตร์, ไมโครโฟน, กล้องถ่ายรูป ฯลฯ</translation>
 <translation id="4988526792673242964">หน้า</translation>
 <translation id="4988792151665380515">ไม่สามารถส่งออกคีย์สาธารณะ</translation>
 <translation id="49896407730300355">หมุน&amp;ทวนเข็มนาฬิกา</translation>
@@ -2767,7 +2761,7 @@
 <translation id="5098647635849512368">ไม่พบเส้นทางสัมบูรณ์ไปยังไดเรกทอรีนี้เพื่อทำการแพค</translation>
 <translation id="5099354524039520280">ขึ้น</translation>
 <translation id="5099890666199371110">ไม่พบโทรศัพท์ของคุณ โปรดตรวจสอบว่า <ph name="DEVICE_TYPE" /> เปิดบลูทูธอยู่ &lt;a&gt;เรียนรู้เพิ่มเติม&lt;/a&gt;</translation>
-<translation id="5100114659116077956">คุณต้องอัปเดต Chromebox เพื่อรับคุณลักษณะใหม่ล่าสุด</translation>
+<translation id="5100114659116077956">คุณต้องอัปเดต Chromebox เพื่อรับฟีเจอร์ใหม่ล่าสุด</translation>
 <translation id="5105855035535475848">ตรึงแท็บ</translation>
 <translation id="5108967062857032718">การตั้งค่า - นำแอป Android ออก</translation>
 <translation id="5109044022078737958">มีอา</translation>
@@ -2944,7 +2938,6 @@
 <translation id="5340217413897845242">รายการชั้นวาง 6</translation>
 <translation id="5341390997810576190">ใช้อินเทอร์เน็ตมือถือ</translation>
 <translation id="5342091991439452114">PIN ต้องมีอย่างน้อย <ph name="MINIMUM" /> หลัก</translation>
-<translation id="5342344590724511265">แตะความคิดเห็นที่มีข้อขัดข้อง</translation>
 <translation id="5342451237681332106">ใช้ <ph name="PHONE_NAME" /></translation>
 <translation id="534916491091036097">วงเล็บเปิด</translation>
 <translation id="5350965906220856151">อ๊ะ!</translation>
@@ -3216,6 +3209,7 @@
 <translation id="5764483294734785780">บั&amp;นทึกวิดีโอเป็น...</translation>
 <translation id="57646104491463491">วันที่แก้ไข</translation>
 <translation id="5764797882307050727">โปรดเพิ่มพื้นที่ว่างบางส่วนในอุปกรณ์</translation>
+<translation id="5765425701854290211">ขออภัย บางไฟล์เสียหายและอัปเดตไม่สำเร็จ ไฟล์ที่ซิงค์แล้วปลอดภัย</translation>
 <translation id="5765491088802881382">ไม่พบเครือข่ายใด</translation>
 <translation id="5765780083710877561">คำอธิบาย:</translation>
 <translation id="5771585441665576801">การทับศัพท์ (geia → γεια)</translation>
@@ -3261,7 +3255,7 @@
 <translation id="5832669303303483065">เพิ่มที่อยู่ใหม่...</translation>
 <translation id="5832805196449965646">เพิ่มบุคคล</translation>
 <translation id="583281660410589416">ไม่รู้จัก</translation>
-<translation id="5832965267196858040">ช่องทางนี้ไม่เหมาะกับการใช้งานบนอุปกรณ์หลักของคุณ คุณลักษณะและแอปบางส่วนอาจขัดข้องได้</translation>
+<translation id="5832965267196858040">ช่องทางนี้ไม่เหมาะกับการใช้งานบนอุปกรณ์หลักของคุณ ฟีเจอร์และแอปบางส่วนอาจขัดข้องได้</translation>
 <translation id="5832976493438355584">ล็อกอยู่</translation>
 <translation id="5833610766403489739">ไฟล์นี้ไม่อยู่ในตำแหน่งที่กำหนดไว้ โปรดตรวจสอบการตั้งค่าตำแหน่งที่เก็บไฟล์ดาวน์โหลดและลองอีกครั้ง</translation>
 <translation id="5833726373896279253">เจ้าของเท่านั้นที่สามารถปรับการตั้งค่าเหล่านี้ได้:</translation>
@@ -3286,7 +3280,7 @@
 <translation id="5854912040170951372">สไลซ์</translation>
 <translation id="5855119960719984315">สลับหน้าต่าง</translation>
 <translation id="5855773610748894548">อ๊ะ เกิดข้อผิดพลาดกับโมดูลความปลอดภัย</translation>
-<translation id="5856721540245522153">เปิดใช้คุณลักษณะการแก้ไขข้อบกพร่อง</translation>
+<translation id="5856721540245522153">เปิดใช้ฟีเจอร์การแก้ไขข้อบกพร่อง</translation>
 <translation id="5857090052475505287">โฟลเดอร์ใหม่</translation>
 <translation id="5859272821192576954">คุณพร้อมที่จะไปยังแฮงเอาท์แล้ว</translation>
 <translation id="5860033963881614850">ปิด</translation>
@@ -3295,7 +3289,7 @@
 <translation id="5860494867054883682">กำลังอัปเดตอุปกรณ์เป็นเวอร์ชัน <ph name="CHANNEL_NAME" /> (<ph name="PROGRESS_PERCENT" />)</translation>
 <translation id="5862109781435984885">แสดงเครื่องมือสไตลัสในชั้นวาง</translation>
 <translation id="58625595078799656"><ph name="PRODUCT_NAME" /> ต้องการให้คุณเข้ารหัสข้อมูลของคุณโดยใช้รหัสผ่าน Google หรือข้อความรหัสผ่านของคุณเอง</translation>
-<translation id="5863445608433396414">เปิดใช้คุณลักษณะการแก้ไขข้อบกพร่อง</translation>
+<translation id="5863445608433396414">เปิดใช้ฟีเจอร์การแก้ไขข้อบกพร่อง</translation>
 <translation id="5864471791310927901">การค้นหา DHCP ล้มเหลว</translation>
 <translation id="5865597920301323962">คุกกี้จาก <ph name="DOMAIN" /> จะถูกล้างเมื่อออก</translation>
 <translation id="586567932979200359">คุณกำลังเรียกใช้ <ph name="PRODUCT_NAME" /> จากดิสก์อิมเมจ การติดตั้งผลิตภัณฑ์นี้บนคอมพิวเตอร์จะทำให้คุณเรียกใช้ได้โดยไม่ต้องใช้ดิสก์อิมเมจและคุณมั่นใจได้ว่าผลิตภัณฑ์จะอัปเดตตลอดเวลา</translation>
@@ -3415,7 +3409,7 @@
 <translation id="6064217302520318294">ล็อกหน้าจอ</translation>
 <translation id="6065289257230303064">แอตทริบิวต์ไดเรกทอรีหัวเรื่องของใบรับรอง</translation>
 <translation id="6071181508177083058">ยืนยันรหัสผ่าน</translation>
-<translation id="6073903501322152803">เพิ่มคุณลักษณะการสามารถเข้าถึงได้ง่าย</translation>
+<translation id="6073903501322152803">เพิ่มฟีเจอร์การสามารถเข้าถึงได้ง่าย</translation>
 <translation id="6074825444536523002">Google ฟอร์ม</translation>
 <translation id="6075731018162044558">อ๊ะ!  ระบบล้มเหลวในการรับโทเค็นการเข้าถึง API ในระยะยาวสำหรับอุปกรณ์นี้</translation>
 <translation id="6075907793831890935">แลกเปลี่ยนข้อมูลกับอุปกรณ์ชื่อ <ph name="HOSTNAME" /></translation>
@@ -3554,7 +3548,7 @@
 <translation id="6286684120317096255">กำลังวัดการใช้อินเทอร์เน็ต</translation>
 <translation id="6286708577777130801">รายละเอียดรหัสผ่านที่บันทึกไว้</translation>
 <translation id="6287852322318138013">เลือกแอปที่จะเปิดไฟล์นี้</translation>
-<translation id="6290556621549272952">คุณสามารถใช้คุณลักษณะนี้เพื่อแสดงเนื้อหาจาก Chromium บน TV หรืออุปกรณ์อื่นๆ</translation>
+<translation id="6290556621549272952">คุณสามารถใช้ฟีเจอร์นี้เพื่อแสดงเนื้อหาจาก Chromium บน TV หรืออุปกรณ์อื่นๆ</translation>
 <translation id="6291953229176937411">&amp;แสดงใน Finder</translation>
 <translation id="6295158916970320988">ไซต์ทั้งหมด</translation>
 <translation id="6295855836753816081">กำลังบันทึก...</translation>
@@ -3569,7 +3563,7 @@
 <translation id="6311220991371174222">ไม่สามารถเริ่ม Chrome ได้เนื่องจากเกิดข้อผิดพลาดขณะเปิดโปรไฟล์ ลองเริ่มต้น Chrome ใหม่</translation>
 <translation id="6312403991423642364">ข้อผิดพลาดเครือข่ายที่ไม่รู้จัก</translation>
 <translation id="6314335155547195432">สร้างรหัสผ่าน</translation>
-<translation id="6314819609899340042">คุณได้เปิดใช้คุณลักษณะการแก้ไขข้อบกพร่องบนอุปกรณ์ <ph name="IDS_SHORT_PRODUCT_NAME" /> นี้เรียบร้อยแล้ว</translation>
+<translation id="6314819609899340042">คุณได้เปิดใช้ฟีเจอร์การแก้ไขข้อบกพร่องบนอุปกรณ์ <ph name="IDS_SHORT_PRODUCT_NAME" /> นี้เรียบร้อยแล้ว</translation>
 <translation id="6315343732431721770">มีการเปลี่ยนหน้าเริ่มต้นใช้งานของคุณให้มี <ph name="URL" /> หากต้องการปิดใช้ส่วนขยายที่เปลี่ยนหน้าเริ่มต้นใช้งาน ให้คลิก "คืนค่า"</translation>
 <translation id="6315493146179903667">นำขึ้นมาข้างหน้าทั้งหมด</translation>
 <translation id="6316671927443834085">ไม่สามารถยกเลิกการเชื่อมต่อกับ "<ph name="DEVICE_NAME" />"</translation>
@@ -3765,9 +3759,9 @@
 <translation id="6575251558004911012">ถามเมื่อไซต์ต้องการเข้าถึงกล้องของคุณ (แนะนำ)</translation>
 <translation id="6578664922716508575">เข้ารหัสลับรหัสผ่านที่ซิงค์ด้วยชื่อผู้ใช้และรหัสผ่าน Google ของคุณ</translation>
 <translation id="6580151766480067746">เวอร์ชัน ARC</translation>
-<translation id="6580955892089546165">คุณลักษณะนี้ช่วยให้คุณสามารถเข้าถึงผู้ใช้ที่ลงชื่อเข้าใช้แล้วได้อย่างรวดเร็ว โดยไม่ต้องใช้รหัสผ่าน
+<translation id="6580955892089546165">ฟีเจอร์นี้ช่วยให้คุณสามารถเข้าถึงผู้ใช้ที่ลงชื่อเข้าใช้แล้วได้อย่างรวดเร็ว โดยไม่ต้องใช้รหัสผ่าน
 
-โปรดใช้คุณลักษณะนี้กับบัญชีที่คุณเชื่อถือเท่านั้น</translation>
+โปรดใช้ฟีเจอร์นี้กับบัญชีที่คุณเชื่อถือเท่านั้น</translation>
 <translation id="6581162200855843583">ลิงก์ Google ไดรฟ์</translation>
 <translation id="6584878029876017575">การรับรองตลอดชีพของ Microsoft</translation>
 <translation id="6585234750898046415">เลือกรูปภาพสำหรับบัญชีของคุณเพื่อแสดงในหน้าลงชื่อเข้าใช้</translation>
@@ -3906,7 +3900,7 @@
 <translation id="6805647936811177813">โปรดลงชื่อเข้าใช้ <ph name="TOKEN_NAME" /> เพื่อนำเข้าใบรับรองไคลเอ็นต์จาก <ph name="HOST_NAME" /></translation>
 <translation id="680572642341004180">เปิดใช้งานการติดตาม RLZ บน <ph name="SHORT_PRODUCT_OS_NAME" /></translation>
 <translation id="6807889908376551050">แสดงทั้งหมด...</translation>
-<translation id="6810613314571580006">ลงชื่อเข้าใช้เว็บไซต์โดยอัตโนมัติโดยใช้ข้อมูลรับรองที่เก็บไว้ เมื่อคุณลักษณะนี้ปิดอยู่ ระบบจะขอให้คุณยืนยันทุกครั้งก่อนลงชื่อเข้าใช้เว็บไซต์</translation>
+<translation id="6810613314571580006">ลงชื่อเข้าใช้เว็บไซต์โดยอัตโนมัติโดยใช้ข้อมูลรับรองที่เก็บไว้ เมื่อฟีเจอร์นี้ปิดอยู่ ระบบจะขอให้คุณยืนยันทุกครั้งก่อนลงชื่อเข้าใช้เว็บไซต์</translation>
 <translation id="6812349420832218321">ไม่สามารถเรียกใช้ <ph name="PRODUCT_NAME" /> ในฐานะผู้ใช้ระดับราก</translation>
 <translation id="6812841287760418429">เก็บการเปลี่ยนแปลงไว้</translation>
 <translation id="6817174620439930047">ถามเมื่อเว็บไซต์ต้องการใช้ข้อความเฉพาะของระบบในการเข้าถึงอุปกรณ์ MIDI (แนะนำ)</translation>
@@ -4097,7 +4091,7 @@
 <translation id="7092106376816104">ข้อยกเว้นป๊อปอัป</translation>
 <translation id="7093434536568905704">GTK+</translation>
 <translation id="7093866338626856921">แลกเปลี่ยนข้อมูลกับอุปกรณ์ชื่อ <ph name="HOSTNAMES" /></translation>
-<translation id="7096082900368329802">หากต้องการค้นพบคุณลักษณะที่ยอดเยี่ยมอื่นๆ</translation>
+<translation id="7096082900368329802">หากต้องการค้นพบฟีเจอร์ที่ยอดเยี่ยมอื่นๆ</translation>
 <translation id="7096108453481049031">ไม่สามารถนำเข้าผู้ใช้ภายใต้การดูแล โปรดตรวจสอบการเชื่อมต่อเครือข่ายแล้วลองอีกครั้งในภายหลัง</translation>
 <translation id="7098447629416471489">เครื่องมือค้นหาอื่นๆ ที่บันทึกไว้จะแสดงที่นี่</translation>
 <translation id="7100897339030255923">รายการที่เลือก <ph name="COUNT" /> รายการ</translation>
@@ -4173,7 +4167,7 @@
 <translation id="7224023051066864079">ซับเน็ตมาสก์:</translation>
 <translation id="722454870747268814">แท็บที่ไม่ระบุตัวตนใหม่</translation>
 <translation id="7225179976675429563">ไม่มีประเภทเครือข่าย</translation>
-<translation id="7228479291753472782">แก้ไขการตั้งค่าที่จะกำหนดว่าเว็บไซต์สามารถใช้คุณลักษณะอย่างตำแหน่งทางภูมิศาสตร์ ไมโครโฟน กล้องถ่ายรูป และอื่นๆ ได้ไหม</translation>
+<translation id="7228479291753472782">แก้ไขการตั้งค่าที่จะกำหนดว่าเว็บไซต์สามารถใช้ฟีเจอร์อย่างตำแหน่งทางภูมิศาสตร์ ไมโครโฟน กล้องถ่ายรูป และอื่นๆ ได้ไหม</translation>
 <translation id="7229570126336867161">ต้องใช้ EVDO</translation>
 <translation id="7230787553283372882">กำหนดขนาดข้อความของคุณ</translation>
 <translation id="7238585580608191973">ลายนิ้วมือ SHA-256</translation>
@@ -4358,7 +4352,7 @@
 <translation id="7507930499305566459">ใบรับรอง Status Responder</translation>
 <translation id="7508545000531937079">แสดงภาพสไลด์</translation>
 <translation id="7511955381719512146">Wi-Fi ที่คุณใช้อาจต้องการให้คุณไปที่ <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" /></translation>
-<translation id="7513029293694390567">ลงชื่อเข้าใช้เว็บไซต์โดยอัตโนมัติโดยใช้ข้อมูลรับรองที่เก็บไว้ หากปิดใช้คุณลักษณะนี้ ระบบจะขอให้คุณยืนยันทุกครั้งก่อนลงชื่อเข้าใช้เว็บไซต์</translation>
+<translation id="7513029293694390567">ลงชื่อเข้าใช้เว็บไซต์โดยอัตโนมัติโดยใช้ข้อมูลรับรองที่เก็บไว้ หากปิดใช้ฟีเจอร์นี้ ระบบจะขอให้คุณยืนยันทุกครั้งก่อนลงชื่อเข้าใช้เว็บไซต์</translation>
 <translation id="751507702149411736">เบลารุส</translation>
 <translation id="7517569744831774757">คืนค่าการตั้งค่าเป็นค่าเริ่มต้นเดิม</translation>
 <translation id="7517786267097410259">สร้างรหัสผ่าน -</translation>
@@ -4376,7 +4370,7 @@
 <translation id="7537601449003285327">ตรึงกับแถบงาน</translation>
 <translation id="7540972813190816353">เกิดข้อผิดพลาดในขณะทำการตรวจสอบการอัปเดต: <ph name="ERROR" /></translation>
 <translation id="7541121857749629630">ข้อยกเว้นรูปภาพ</translation>
-<translation id="7543104066686362383">เปิดใช้คุณลักษณะการแก้ไขข้อบกพร่องบนอุปกรณ์ <ph name="IDS_SHORT_PRODUCT_NAME" /> นี้</translation>
+<translation id="7543104066686362383">เปิดใช้ฟีเจอร์การแก้ไขข้อบกพร่องบนอุปกรณ์ <ph name="IDS_SHORT_PRODUCT_NAME" /> นี้</translation>
 <translation id="7544853251252956727">สุ่มเพลง</translation>
 <translation id="7545415673537747415">ควบคุมวิธีที่ Google ใช้ประวัติการท่องเว็บของคุณเพื่อปรับเปลี่ยนการค้นหา โฆษณา และบริการอื่นๆ ของ Google ในแบบของคุณจาก<ph name="BEGIN_LINK" />ส่วนควบคุมกิจกรรม Google<ph name="END_LINK" /></translation>
 <translation id="7547317915858803630">คำเตือน: การตั้งค่า <ph name="PRODUCT_NAME" /> ของคุณได้รับการจัดเก็บไว้ที่ไดรฟ์เครือข่าย ซึ่งอาจส่งผลให้การทำงานล่าช้า เกิดข้อขัดข้อง หรือแม้แต่ข้อมูลสูญหาย</translation>
@@ -4431,6 +4425,7 @@
 <translation id="7615910377284548269">จัดการการบล็อกปลั๊กอินที่ไม่ได้อยู่ในแซนด์บ็อกซ์...</translation>
 <translation id="7617366389578322136">กำลังเชื่อมต่อกับ "<ph name="DEVICE_NAME" />"</translation>
 <translation id="761779991806306006">ไม่ได้บันทึกรหัสผ่าน</translation>
+<translation id="7622114377921274169">กำลังชาร์จ</translation>
 <translation id="7624154074265342755">เครือข่ายระบบไร้สาย</translation>
 <translation id="7624337243375417909">ปิด Caps Lock</translation>
 <translation id="7627790789328695202">อ๊ะ มี <ph name="FILE_NAME" /> อยู่แล้ว เปลี่ยนชื่อแล้วลองอีกครั้ง</translation>
@@ -4667,7 +4662,7 @@
 <translation id="7986295104073916105">อ่านและเปลี่ยนการตั้งค่ารหัสผ่านที่บันทึกไว้</translation>
 <translation id="7987485481246785146">แป้นพิมพ์ภาษาเคิร์ดโซรานีแบบอารบิก</translation>
 <translation id="798749371774946697">ชื่อเครื่องยาวเกินไป</translation>
-<translation id="7988355189918024273">เปิดการใช้งานคุณลักษณะการเข้าถึง</translation>
+<translation id="7988355189918024273">เปิดการใช้งานฟีเจอร์การเข้าถึง</translation>
 <translation id="7988930390477596403">จะมีการเปิดใช้งานในครั้งถัดไปที่คุณปลดล็อก <ph name="DEVICE_TYPE" /> นี้ Smart Lock ช่วยให้คุณสามารถปลดล็อกอุปกรณ์นี้ด้วยโทรศัพท์ได้โดยไม่ต้องใช้รหัสผ่าน ระบบจะเปิดบลูทูธเพื่อเปิดใช้ Smart Lock</translation>
 <translation id="7994370417837006925">การลงชื่อเข้าสู่ระบบพร้อมกันหลายบัญชี</translation>
 <translation id="799547531016638432">ลบทางลัด</translation>
@@ -4744,12 +4739,12 @@
 <translation id="8079530767338315840">เล่นซ้ำ</translation>
 <translation id="8083739373364455075">รับพื้นที่ 100 GB ฟรีด้วย Google ไดรฟ์</translation>
 <translation id="8086015605808120405">กำลังกำหนดค่า <ph name="PRINTER_NAME" /> ...</translation>
-<translation id="8088137642766812908">ระวัง คุณลักษณะนี้อาจมีข้อผิดพลาด</translation>
+<translation id="8088137642766812908">ระวัง ฟีเจอร์นี้อาจมีข้อผิดพลาด</translation>
 <translation id="8090234456044969073">อ่านรายชื่อของเว็บไซต์ที่คุณเข้าชมบ่อยที่สุด</translation>
 <translation id="8094917007353911263">เครือข่ายที่คุณใช้อาจต้องการให้คุณไปที่ <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" /></translation>
 <translation id="80974698889265265">PIN ไม่ตรงกัน</translation>
 <translation id="8098975406164436557">ต้องการใช้โทรศัพท์นี้เพื่อปลดล็อก <ph name="DEVICE_TYPE" /> ไหม</translation>
-<translation id="810066391692572978">ไฟล์ใช้คุณลักษณะที่ไม่ได้รับการสนับสนุน</translation>
+<translation id="810066391692572978">ไฟล์ใช้ฟีเจอร์ที่ไม่ได้รับการสนับสนุน</translation>
 <translation id="8101987792947961127">ต้องใช้ Powerwash ในการรีบูตครั้งถัดไป</translation>
 <translation id="8102535138653976669"><ph name="PRODUCT_NAME" /> ได้ซิงค์ข้อมูลของคุณกับบัญชี Google อย่างปลอดภัยแล้ว โปรดซิงค์ข้อมูลทุกอย่างหรือกำหนดค่าประเภทข้อมูลที่ซิงค์และการตั้งค่าการเข้ารหัสเป็นประจำ</translation>
 <translation id="8104696615244072556">Powerwash อุปกรณ์ <ph name="IDS_SHORT_PRODUCT_NAME" /> ของคุณและเปลี่ยนกลับไปใช้เวอร์ชันก่อนหน้า</translation>
@@ -4870,6 +4865,7 @@
 <translation id="8270242299912238708">เอกสาร PDF</translation>
 <translation id="827097179112817503">แสดงปุ่มหน้าแรก</translation>
 <translation id="8272443605911821513">จัดการส่วนขยายของคุณโดยคลิกที่ "ส่วนขยาย" ในเมนู "เครื่องมือเพิ่มเติม"</translation>
+<translation id="8274924778568117936">อย่าปิดเครื่องหรือปิดฝา <ph name="DEVICE_TYPE" /> จนกว่าการอัปเดตจะเสร็จสิ้น <ph name="DEVICE_TYPE" /> จะรีสตาร์ทหลังติดตั้งเสร็จแล้ว</translation>
 <translation id="8275038454117074363">การนำเข้า</translation>
 <translation id="8276560076771292512">ล้างแคชและโหลดซ้ำแบบดึงข้อมูลใหม่ทั้งหมด</translation>
 <translation id="8279388322240498158">แป้นพิมพ์ภาษาเคิร์ดโซรานีแบบอังกฤษ</translation>
@@ -4910,7 +4906,7 @@
 <translation id="8339059274628563283">ข้อมูล <ph name="SITE" /> ที่เก็บไว้ในเครื่อง</translation>
 <translation id="8342318071240498787">มีไฟล์หรือไดเรกทอรีที่มีชื่อเดียวกันนี้อยู่แล้ว</translation>
 <translation id="8351419472474436977">ส่วนขยายนี้ได้เข้าควบคุมการตั้งค่าพร็อกซีของคุณ ซึ่งหมายความว่าส่วนขยายดังกล่าวสามารถเปลี่ยนแปลง ทำลาย หรือดักฟังทุกอย่างที่คุณทำในระบบออนไลน์ได้ หากคุณไม่ทราบที่มาของการเปลี่ยนแปลงนี้ คุณอาจไม่ต้องการให้มีการเปลี่ยนแปลงดังกล่าวเกิดขึ้น</translation>
-<translation id="8352772353338965963">เพิ่มบัญชีเพื่อลงชื่อเข้าสู่ระบบพร้อมกันหลายบัญชี บัญชีที่ลงชื่อเข้าใช้แล้วทั้งหมดสามารถเข้าถึงได้โดยไม่ต้องใช้รหัสผ่าน คุณจึงควรใช้คุณลักษณะนี้กับบัญชีที่เชื่อถือเท่านั้น</translation>
+<translation id="8352772353338965963">เพิ่มบัญชีเพื่อลงชื่อเข้าสู่ระบบพร้อมกันหลายบัญชี บัญชีที่ลงชื่อเข้าใช้แล้วทั้งหมดสามารถเข้าถึงได้โดยไม่ต้องใช้รหัสผ่าน คุณจึงควรใช้ฟีเจอร์นี้กับบัญชีที่เชื่อถือเท่านั้น</translation>
 <translation id="8353683614194668312">ส่วนขยายหรือแอปพลิเคชันสามารถ:</translation>
 <translation id="8356197132883132838"><ph name="TITLE" /> - <ph name="COUNT" /></translation>
 <translation id="8356258244599961364">ภาษานี้ไม่มีวิธีการป้อนข้อมูล</translation>
@@ -5080,7 +5076,7 @@
 <translation id="8631032106121706562">พีทอล</translation>
 <translation id="8631271110654520730">กำลังคัดลอกอิมเมจการกู้คืน...</translation>
 <translation id="8632275030377321303">ผู้ใช้ไม่สามารถแก้ไขพร็อกซีได้</translation>
-<translation id="8637542770513281060">คอมพิวเตอร์ของคุณมีโมดูลความปลอดภัย ซึ่งใช้เพื่อนำคุณลักษณะการรักษาความปลอดภัยที่สำคัญจำนวนมากมาใช้ใน Chrome OS โปรดไปที่ศูนย์ช่วยเหลือของ Chromebook เพื่อเรียนรู้เพิ่มเติม: https://support.google.com/chromebook/?p=sm</translation>
+<translation id="8637542770513281060">คอมพิวเตอร์ของคุณมีโมดูลความปลอดภัย ซึ่งใช้เพื่อนำฟีเจอร์การรักษาความปลอดภัยที่สำคัญจำนวนมากมาใช้ใน Chrome OS โปรดไปที่ศูนย์ช่วยเหลือของ Chromebook เพื่อเรียนรู้เพิ่มเติม: https://support.google.com/chromebook/?p=sm</translation>
 <translation id="8637688295594795546">มีอัปเดตระบบพร้อมใช้งาน กำลังเตรียมการดาวน์โหลด…</translation>
 <translation id="8639963783467694461">การตั้งค่าป้อนอัตโนมัติ</translation>
 <translation id="8642171459927087831">โทเค็นการเข้าถึง</translation>
@@ -5293,7 +5289,7 @@
 <translation id="8944779739948852228">ตรวจพบเครื่องพิมพ์</translation>
 <translation id="8944964446326379280"><ph name="APP_NAME" /> กำลังแชร์หน้าต่างกับ <ph name="TAB_NAME" /></translation>
 <translation id="8946284507644756416"><ph name="DEVICE_TYPE" /> สามารถปลดล็อกได้ด้วยโทรศัพท์ Android ของคุณ</translation>
-<translation id="8946359700442089734">ไม่ได้เปิดใช้คุณลักษณะการแก้ไขข้อบกพร่องอย่างสมบูรณ์บนอุปกรณ์ <ph name="IDS_SHORT_PRODUCT_NAME" /> นี้</translation>
+<translation id="8946359700442089734">ไม่ได้เปิดใช้ฟีเจอร์การแก้ไขข้อบกพร่องอย่างสมบูรณ์บนอุปกรณ์ <ph name="IDS_SHORT_PRODUCT_NAME" /> นี้</translation>
 <translation id="8948677146203372548">อัปเดตสำเร็จ คุณสามารถใช้แอป Android ได้แล้วในขณะนี้</translation>
 <translation id="895347679606913382">กำลังเริ่มต้น...</translation>
 <translation id="8954952943849489823">การย้่ายล้มเหลว ข้อผิดพลาดที่ไม่คาดคิด: $1</translation>
@@ -5310,12 +5306,11 @@
 <translation id="8963572037665351978">ออกจากงานนำเสนอ</translation>
 <translation id="8965037249707889821">ป้อนรหัสผ่านเก่า</translation>
 <translation id="8965697826696209160">พื้นที่ไม่เพียงพอ</translation>
-<translation id="8968527460726243404">ตัวเขียนอิมเมจระบบ ChromeOS</translation>
 <translation id="8970203673128054105">ดูรายการโหมดแคสต์</translation>
 <translation id="89720367119469899">Escape</translation>
 <translation id="8972513834460200407">โปรดตรวจสอบกับผู้ดูแลระบบเครือข่ายของคุณเพื่อให้แน่ใจว่าไฟร์วอลล์ไม่ได้บล็อกการดาวน์โหลดจากเซิร์ฟเวอร์ของ Google</translation>
 <translation id="8973557916016709913">นำระดับการซูมออก</translation>
-<translation id="8973596347849323817">คุณสามารถปรับแต่งอุปกรณ์นี้ให้ตรงกับความต้องการของคุณ และเปลี่ยนคุณลักษณะการเข้าถึงเหล่านี้ได้ภายหลังใน "การตั้งค่า"</translation>
+<translation id="8973596347849323817">คุณสามารถปรับแต่งอุปกรณ์นี้ให้ตรงกับความต้องการของคุณ และเปลี่ยนฟีเจอร์การเข้าถึงเหล่านี้ได้ภายหลังใน "การตั้งค่า"</translation>
 <translation id="8977811652087512276">รหัสผ่านไม่ถูกต้องหรือไฟล์เสียหาย</translation>
 <translation id="8978154919215542464">เปิด - ซิงค์ทุกอย่าง</translation>
 <translation id="8978526688207379569">ไซต์นี้มีการดาวน์โหลดไฟล์หลายๆ ไฟล์โดยอัตโนมัติ</translation>
@@ -5334,7 +5329,7 @@
 <translation id="9003704114456258138">ความถี่</translation>
 <translation id="9004952710076978168">ได้รับการแจ้งเตือนสำหรับเครื่องพิมพ์ที่ไม่รู้จัก</translation>
 <translation id="9008201768610948239">ไม่สนใจ</translation>
-<translation id="9009299913548444929">คุณลักษณะนี้ไม่พร้อมใช้งานชั่วคราว <ph name="BEGIN_LINK" />ความช่วยเหลือ<ph name="END_LINK" /></translation>
+<translation id="9009299913548444929">ฟีเจอร์นี้ไม่พร้อมใช้งานชั่วคราว <ph name="BEGIN_LINK" />ความช่วยเหลือ<ph name="END_LINK" /></translation>
 <translation id="9009369504041480176">กำลังอัปโหลด (<ph name="PROGRESS_PERCENT" />%)...</translation>
 <translation id="9011163749350026987">แสดงไอคอนเสมอ</translation>
 <translation id="9011178328451474963">แท็บสุดท้าย</translation>
@@ -5485,6 +5480,7 @@
 <translation id="93766956588638423">ซ่อมส่วนขยาย</translation>
 <translation id="938470336146445890">โปรดติดตั้งใบรับรองของผู้ใช้</translation>
 <translation id="938582441709398163">การวางซ้อนแป้นพิมพ์</translation>
+<translation id="939519157834106403">SSID</translation>
 <translation id="939598580284253335">ป้อนข้อความรหัสผ่าน</translation>
 <translation id="939736085109172342">โฟลเดอร์ใหม่</translation>
 <translation id="940425055435005472">ขนาดแบบอักษร:</translation>
diff --git a/chrome/app/resources/generated_resources_tr.xtb b/chrome/app/resources/generated_resources_tr.xtb
index 626041c5..430dbb9 100644
--- a/chrome/app/resources/generated_resources_tr.xtb
+++ b/chrome/app/resources/generated_resources_tr.xtb
@@ -836,7 +836,6 @@
 <translation id="2224551243087462610">Klasör adını düzenle</translation>
 <translation id="2226449515541314767">Bu sitenin MIDI cihazları üzerinde tam denetime sahip olması engellendi.</translation>
 <translation id="2226720438730111184">Ne Olduğunu Anlatın</translation>
-<translation id="222903405933288376">Google, size yerel içerik sağlamak için konumunuzu kullanır. Bunu <ph name="SETTINGS_LINK" /> sayfasından değiştirebilirsiniz.</translation>
 <translation id="2229161054156947610">1 saatten fazla bir süre kaldı</translation>
 <translation id="222931766245975952">Dosya kesilmiş</translation>
 <translation id="222949136907494149"><ph name="URL" />, bilgisayarınızın konumunu kullanmak istiyor.</translation>
@@ -1088,7 +1087,6 @@
 <translation id="2575247648642144396">Uzantı, mevcut sayfada işlem yapabildiğinde bu simge görünür. Simgeyi tıklayarak veya <ph name="EXTENSION_SHORTCUT" /> tuşuna basarak bu uzantıyı kullanın.</translation>
 <translation id="2576842806987913196">Bu adla bir CRX dosyası zaten var.</translation>
 <translation id="2579575372772932244">Profil yeniden oluşturuluyor, lütfen bekleyin...</translation>
-<translation id="2580168606262715640">Telefonunuz bulunamıyor. Telefonunuzun, kol mesafesinde olduğundan emin olun.</translation>
 <translation id="2580889980133367162"><ph name="HOST" /> ana makinesinin birden fazla dosya indirmesine her zaman izin ver</translation>
 <translation id="2580924999637585241">Toplam: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">Uzun</translation>
@@ -2173,7 +2171,6 @@
 <translation id="4130207949184424187">Bu uzantı, Çok Amaçlı Adres Çubuğu'nda arama yaptığınızda gösterilen sayfayı değiştirdi.</translation>
 <translation id="413121957363593859">Bileşenler</translation>
 <translation id="4131410914670010031">Siyah beyaz</translation>
-<translation id="4135054690906486073">Bu ağ diğer kullanıcılarla paylaşılıyor</translation>
 <translation id="4135450933899346655">Sertifikalarınız</translation>
 <translation id="4138267921960073861">Oturum açma ekranında kullanıcı adlarını ve fotoğrafları göster</translation>
 <translation id="4140559601186535628">Push Mesajları</translation>
@@ -2577,9 +2574,6 @@
 <translation id="4813345808229079766">Bağlantı</translation>
 <translation id="4813512666221746211">Ağ hatası</translation>
 <translation id="4816492930507672669">Sayfaya sığdır</translation>
-<translation id="4816617200045929931">Profil hata iletisini almadan önce tam olarak ne yaptığınızı belirtin:
-
-****BU SATIRIN ALTINDAKİ BİLGİLERİ DEĞİŞTİRMEYİN****</translation>
 <translation id="4820334425169212497">Hayır, görmüyorum</translation>
 <translation id="4821086771593057290">Şifreniz değiştirildi. Lütfen yeni şifrenizle tekrar deneyin.</translation>
 <translation id="4821935166599369261">&amp;Profil Oluşturma Etkin</translation>
@@ -2945,7 +2939,6 @@
 <translation id="5340217413897845242">Raf öğesi 6</translation>
 <translation id="5341390997810576190">Hücresel veri kullan</translation>
 <translation id="5342091991439452114">PIN en az <ph name="MINIMUM" /> basamaklı olmalıdır</translation>
-<translation id="5342344590724511265">Sekme kilitlendi geri bildirimi.</translation>
 <translation id="5342451237681332106"><ph name="PHONE_NAME" /> telefonu kullan</translation>
 <translation id="534916491091036097">Sol parantez</translation>
 <translation id="5350965906220856151">Hata!</translation>
@@ -3218,6 +3211,7 @@
 <translation id="5764483294734785780">Sesi farklı kay&amp;det...</translation>
 <translation id="57646104491463491">Değiştirilme Tarihi</translation>
 <translation id="5764797882307050727">Lütfen cihazınızda biraz yer açın.</translation>
+<translation id="5765425701854290211">Maalesef bazı dosyalar hasar gördü ve güncelleme başarılı olmadı. Senkronize edilen dosyalarınız güvende.</translation>
 <translation id="5765491088802881382">Ağ kullanılamıyor</translation>
 <translation id="5765780083710877561">Açıklama:</translation>
 <translation id="5771585441665576801">Harf çevirisi (geia → γεια)</translation>
@@ -4433,6 +4427,7 @@
 <translation id="7615910377284548269">Korumalı alanda olmayan eklentinin engellenmesini yönet...</translation>
 <translation id="7617366389578322136">"<ph name="DEVICE_NAME" />" cihazına bağlanıyor</translation>
 <translation id="761779991806306006">Hiçbir şifre kaydedilmedi.</translation>
+<translation id="7622114377921274169">Şarj oluyor.</translation>
 <translation id="7624154074265342755">Kablosuz ağlar</translation>
 <translation id="7624337243375417909">caps lock kapalı</translation>
 <translation id="7627790789328695202">Hata! <ph name="FILE_NAME" /> zaten mevcut. Yeniden adlandırın ve tekrar deneyin.</translation>
@@ -4873,6 +4868,7 @@
 <translation id="8270242299912238708">PDF dokümanları</translation>
 <translation id="827097179112817503">Ana Sayfa düğmesini göster</translation>
 <translation id="8272443605911821513">"Diğer araçlar" menüsündeki Uzantılar'ı tıklayarak uzantılarınızı yönetin.</translation>
+<translation id="8274924778568117936">Güncelleme bitene kadar <ph name="DEVICE_TYPE" /> cihazınızı kapatmayın. Yükleme işlemi tamamlandıktan sonra <ph name="DEVICE_TYPE" /> cihazınız yeniden başlatılacaktır.</translation>
 <translation id="8275038454117074363">İçe aktar</translation>
 <translation id="8276560076771292512">Önbelleği Boşalt ve Tam Yeniden Yükle</translation>
 <translation id="8279388322240498158">Sorani Kürtçe İngilizce temelli klavye</translation>
@@ -5314,7 +5310,6 @@
 <translation id="8963572037665351978">Sunumdan Çık</translation>
 <translation id="8965037249707889821">Eski şifreyi girin</translation>
 <translation id="8965697826696209160">Yeterli alan yok.</translation>
-<translation id="8968527460726243404">ChromeOS Sistemi Görsel Yazıcı</translation>
 <translation id="8970203673128054105">Yayın modu listesini görüntüle</translation>
 <translation id="89720367119469899">Escape</translation>
 <translation id="8972513834460200407">Güvenlik duvarının, Google sunucularından yapılan indirme işlemlerini engellemediğinden emin olmak için lütfen ağ yöneticinizle görüşün.</translation>
@@ -5490,6 +5485,7 @@
 <translation id="93766956588638423">Uzantıyı onar</translation>
 <translation id="938470336146445890">Lütfen bir kullanıcı sertifikası yükleyin.</translation>
 <translation id="938582441709398163">Klavye Yer Paylaşımı</translation>
+<translation id="939519157834106403">SSID</translation>
 <translation id="939598580284253335">Parolayı girin</translation>
 <translation id="939736085109172342">Yeni klasör</translation>
 <translation id="940425055435005472">Yazı tipi boyutu:</translation>
diff --git a/chrome/app/resources/generated_resources_uk.xtb b/chrome/app/resources/generated_resources_uk.xtb
index 3bb22f97..12cc9b71 100644
--- a/chrome/app/resources/generated_resources_uk.xtb
+++ b/chrome/app/resources/generated_resources_uk.xtb
@@ -835,7 +835,6 @@
 <translation id="2224551243087462610">Редагувати ім’я папки</translation>
 <translation id="2226449515541314767">Цьому сайту заборонено повністю контролювати пристрої MIDI.</translation>
 <translation id="2226720438730111184">Розкажіть нам, що відбувається</translation>
-<translation id="222903405933288376">Google використовує ваші геодані, щоб надавати результати локального пошуку. Цей параметр можна змінити на сторінці "<ph name="SETTINGS_LINK" />".</translation>
 <translation id="2229161054156947610">Залишилося більше 1 год.</translation>
 <translation id="222931766245975952">Файл скорочено</translation>
 <translation id="222949136907494149"><ph name="URL" /> хоче використовувати місцезнаходження вашого комп’ютера.</translation>
@@ -1087,7 +1086,6 @@
 <translation id="2575247648642144396">Цей значок відображатиметься, якщо розширення зможе працювати на поточній сторінці. Запустіть розширення, натиснувши значок або комбінацію клавіш <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="2576842806987913196">Файл у форматі CRX із такою назвою вже існує.</translation>
 <translation id="2579575372772932244">Відновлення профілю, зачекайте…</translation>
-<translation id="2580168606262715640">Не вдається знайти телефон. Переконайтеся, що він поблизу.</translation>
 <translation id="2580889980133367162">Завжди дозволяти <ph name="HOST" /> завантажувати декілька файлів</translation>
 <translation id="2580924999637585241">Усього: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">Довго</translation>
@@ -2172,7 +2170,6 @@
 <translation id="4130207949184424187">Це розширення змінило сторінку, яка відкривається під час пошуку в універсальному вікні пошуку.</translation>
 <translation id="413121957363593859">Компоненти</translation>
 <translation id="4131410914670010031">Чорно-білий</translation>
-<translation id="4135054690906486073">Інші користувачі мають доступ до цієї мережі</translation>
 <translation id="4135450933899346655">Ваші сертифікати</translation>
 <translation id="4138267921960073861">Показувати імена користувачів і фото на екрані входу</translation>
 <translation id="4140559601186535628">Push-повідомлення</translation>
@@ -2576,9 +2573,6 @@
 <translation id="4813345808229079766">З’єднання</translation>
 <translation id="4813512666221746211">Помилка мережі</translation>
 <translation id="4816492930507672669">За розміром сторінки</translation>
-<translation id="4816617200045929931">Опишіть, що сталося перед тим, як з’явилося повідомлення про помилку профілю:
-
-****НЕ ЗМІНЮЙТЕ ТЕКСТ НИЖЧЕ****</translation>
 <translation id="4820334425169212497">Ні</translation>
 <translation id="4821086771593057290">Ваш пароль змінено. Повторіть спробу з новим паролем.</translation>
 <translation id="4821935166599369261">&amp;Профілювання ввімкнено</translation>
@@ -2944,7 +2938,6 @@
 <translation id="5340217413897845242">Елемент полиці 6</translation>
 <translation id="5341390997810576190">Використовувати мобільний трафік</translation>
 <translation id="5342091991439452114">Мінімальна кількість цифр у PIN-коді: <ph name="MINIMUM" /></translation>
-<translation id="5342344590724511265">Відповідь "Вкладка аварійно закрилась".</translation>
 <translation id="5342451237681332106">Використовувати телефон <ph name="PHONE_NAME" /></translation>
 <translation id="534916491091036097">Ліва дужка</translation>
 <translation id="5350965906220856151">Помилка</translation>
@@ -3216,6 +3209,7 @@
 <translation id="5764483294734785780">Збере&amp;гти аудіо як...</translation>
 <translation id="57646104491463491">Дата змінення</translation>
 <translation id="5764797882307050727">Звільніть місце на пристрої.</translation>
+<translation id="5765425701854290211">Деякі файли пошкоджено, тому їх не вдалось оновити. Синхронізовані файли надійно зберігаються.</translation>
 <translation id="5765491088802881382">Недоступна жодна мережа</translation>
 <translation id="5765780083710877561">Опис:</translation>
 <translation id="5771585441665576801">Транслітерація (geia → γεια)</translation>
@@ -4432,6 +4426,7 @@
 <translation id="7615910377284548269">Керувати блокуванням плагінів із неізольованим програмним середовищем…</translation>
 <translation id="7617366389578322136">Під’єднання до пристрою <ph name="DEVICE_NAME" /></translation>
 <translation id="761779991806306006">Немає збережених паролів.</translation>
+<translation id="7622114377921274169">Заряджається.</translation>
 <translation id="7624154074265342755">Бездротові мережі</translation>
 <translation id="7624337243375417909">Caps Lock вимкнено</translation>
 <translation id="7627790789328695202">Файл "<ph name="FILE_NAME" />" вже існує. Перейменуйте його та повторіть спробу.</translation>
@@ -4871,6 +4866,7 @@
 <translation id="8270242299912238708">Документи PDF</translation>
 <translation id="827097179112817503">Показати кнопку "Домашня сторінка"</translation>
 <translation id="8272443605911821513">Керуйте своїми розширеннями, натиснувши "Розширення" в меню "Інші інструменти".</translation>
+<translation id="8274924778568117936">Не вимикайте та не закривайте пристрій <ph name="DEVICE_TYPE" />, поки не завершиться оновлення. Коли встановляться оновлення, пристрій <ph name="DEVICE_TYPE" /> перезавантажиться.</translation>
 <translation id="8275038454117074363">Імпорт</translation>
 <translation id="8276560076771292512">Очищення кеш-пам’яті й жорстке перезавантаження</translation>
 <translation id="8279388322240498158">Курдська клавіатура сорані на основі англійської мови</translation>
@@ -5311,7 +5307,6 @@
 <translation id="8963572037665351978">Вийти з презентації</translation>
 <translation id="8965037249707889821">Введіть старий пароль</translation>
 <translation id="8965697826696209160">Недостатньо місця.</translation>
-<translation id="8968527460726243404">Засіб створення образів ОС Chrome</translation>
 <translation id="8970203673128054105">Переглянути список режиму трансляції</translation>
 <translation id="89720367119469899">Escape</translation>
 <translation id="8972513834460200407">Зверніться до адміністратора мережі, щоб переконатися, що брандмауер не блокує завантаження із серверів Google.</translation>
@@ -5486,6 +5481,7 @@
 <translation id="93766956588638423">Відновити розширення</translation>
 <translation id="938470336146445890">Установіть сертифікат користувача.</translation>
 <translation id="938582441709398163">Розкладка клавіатури</translation>
+<translation id="939519157834106403">SSID</translation>
 <translation id="939598580284253335">Ввести парольну фразу</translation>
 <translation id="939736085109172342">Нова папка</translation>
 <translation id="940425055435005472">Розмір шрифту:</translation>
diff --git a/chrome/app/resources/generated_resources_vi.xtb b/chrome/app/resources/generated_resources_vi.xtb
index 56367b4..d3c77f3 100644
--- a/chrome/app/resources/generated_resources_vi.xtb
+++ b/chrome/app/resources/generated_resources_vi.xtb
@@ -837,7 +837,6 @@
 <translation id="2224551243087462610">Chỉnh sửa tên thư mục</translation>
 <translation id="2226449515541314767">Trang web này đã bị chặn quyền kiểm soát hoàn toàn thiết bị MIDI.</translation>
 <translation id="2226720438730111184">Cho chúng tôi biết điều gì đang xảy ra</translation>
-<translation id="222903405933288376">Google sử dụng vị trí của bạn để cung cấp cho bạn nội dung địa phương. Bạn có thể thay đổi điều này trong <ph name="SETTINGS_LINK" />.</translation>
 <translation id="2229161054156947610">Còn hơn 1 giờ</translation>
 <translation id="222931766245975952">Tệp bị cắt bớt</translation>
 <translation id="222949136907494149"><ph name="URL" /> muốn sử dụng thông tin vị trí máy tính của bạn.</translation>
@@ -1089,7 +1088,6 @@
 <translation id="2575247648642144396">Biểu tượng này sẽ hiển thị khi tiện ích có thể hoạt động trên trang hiện tại. Sử dụng tiện ích này bằng cách nhấp vào biểu tượng hoặc bằng cách nhấn <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="2576842806987913196">Hiện có tệp CRX hiển thị với tên này.</translation>
 <translation id="2579575372772932244">Đang tạo lại hồ sơ, vui lòng đợi...</translation>
-<translation id="2580168606262715640">Không thể tìm thấy điện thoại của bạn. Đảm bảo rằng điện thoại nằm trong tầm tay.</translation>
 <translation id="2580889980133367162">Luôn cho phép <ph name="HOST" /> tải xuống nhiều tệp</translation>
 <translation id="2580924999637585241">Tổng số: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">Lâu</translation>
@@ -2174,7 +2172,6 @@
 <translation id="4130207949184424187">Tiện ích này đã thay đổi trang nào được hiển thị khi bạn tìm kiếm từ Thanh địa chỉ.</translation>
 <translation id="413121957363593859">Thành phần</translation>
 <translation id="4131410914670010031">Đen và trắng</translation>
-<translation id="4135054690906486073">Mạng này được chia sẻ với những người dùng khác</translation>
 <translation id="4135450933899346655">Chứng chỉ của bạn</translation>
 <translation id="4138267921960073861">Hiển thị tên người dùng và ảnh trên màn hình đăng nhập</translation>
 <translation id="4140559601186535628">Thông báo đẩy</translation>
@@ -2578,9 +2575,6 @@
 <translation id="4813345808229079766">Kết nối</translation>
 <translation id="4813512666221746211">Lỗi mạng</translation>
 <translation id="4816492930507672669">Vừa với trang</translation>
-<translation id="4816617200045929931">Hãy cho chúng tôi biết chính xác những gì đã xảy ra trước khi bạn nhận được thông báo lỗi hồ sơ:
-
-****KHÔNG THAY ĐỔI BÊN DƯỚI DÒNG NÀY****</translation>
 <translation id="4820334425169212497">Không, tôi không thấy mã</translation>
 <translation id="4821086771593057290">Mật khẩu của bạn đã thay đổi. Vui lòng thử lại bằng mật khẩu mới của bạn.</translation>
 <translation id="4821935166599369261">&amp;Bật cấu hình</translation>
@@ -2946,7 +2940,6 @@
 <translation id="5340217413897845242">Mục giá 6</translation>
 <translation id="5341390997810576190">Sử dụng dữ liệu di động</translation>
 <translation id="5342091991439452114">Mã PIN phải có ít nhất <ph name="MINIMUM" /> chữ số</translation>
-<translation id="5342344590724511265">Phản hồi tab bị lỗi.</translation>
 <translation id="5342451237681332106">Sử dụng <ph name="PHONE_NAME" /></translation>
 <translation id="534916491091036097">Dấu ngoặc đơn trái</translation>
 <translation id="5350965906220856151">Rất tiếc!</translation>
@@ -3218,6 +3211,7 @@
 <translation id="5764483294734785780">Lư&amp;u âm thanh thành...</translation>
 <translation id="57646104491463491">Ngày Sửa đổi</translation>
 <translation id="5764797882307050727">Hãy giải phóng một số dung lượng trên thiết bị của bạn.</translation>
+<translation id="5765425701854290211">Rất tiếc, một số tệp đã bị hỏng và cập nhật không thành công. Các tệp đã đồng bộ hóa của bạn được an toàn.</translation>
 <translation id="5765491088802881382">Không có mạng nào</translation>
 <translation id="5765780083710877561">Mô tả:</translation>
 <translation id="5771585441665576801">Chuyển ngữ (geia → γεια)</translation>
@@ -3244,7 +3238,7 @@
 <translation id="5800020978570554460">Tệp đích đã bị cắt bớt hoặc xóa kể từ lần tải xuống cuối cùng.</translation>
 <translation id="5801379388827258083">Đang tải xuống từ điển kiểm tra lỗi chính tả...</translation>
 <translation id="5801568494490449797">Tùy chọn</translation>
-<translation id="5804241973901381774">Giấy phép</translation>
+<translation id="5804241973901381774">Quyền</translation>
 <translation id="580571955903695899">Sắp xếp lại theo Tiêu đề</translation>
 <translation id="580961539202306967">Hỏi tôi khi một trang web muốn gửi thông báo đẩy cho tôi (nên chọn)</translation>
 <translation id="5814126672212206791">Loại kết nối</translation>
@@ -4435,6 +4429,7 @@
 <translation id="7615910377284548269">Quản lý chặn plugin không có hộp cát...</translation>
 <translation id="7617366389578322136">Đang kết nối với "<ph name="DEVICE_NAME" />"</translation>
 <translation id="761779991806306006">Không có mật khẩu nào được lưu.</translation>
+<translation id="7622114377921274169">Đang sạc.</translation>
 <translation id="7624154074265342755">Mạng không dây</translation>
 <translation id="7624337243375417909">caps lock tắt</translation>
 <translation id="7627790789328695202">Rất tiếc, <ph name="FILE_NAME" /> đã tồn tại. Hãy đổi tên tệp và thử lại.</translation>
@@ -4874,6 +4869,7 @@
 <translation id="8270242299912238708">Tài liệu PDF</translation>
 <translation id="827097179112817503">Hiển thị nút trang chủ</translation>
 <translation id="8272443605911821513">Quản lý tiện ích của bạn bằng cách nhấp vào Tiện ích trong menu "Công cụ khác".</translation>
+<translation id="8274924778568117936">Không tắt hoặc đóng <ph name="DEVICE_TYPE" /> cho đến khi cập nhật xong. <ph name="DEVICE_TYPE" /> của bạn sẽ khởi động lại sau khi cài đặt xong.</translation>
 <translation id="8275038454117074363">Nhập</translation>
 <translation id="8276560076771292512">Làm trống bộ nhớ cache và tải lại cứng</translation>
 <translation id="8279388322240498158">Bàn phím tiếng Kurd Sorani dựa trên tiếng Anh</translation>
@@ -5314,7 +5310,6 @@
 <translation id="8963572037665351978">Thoát bản trình bày</translation>
 <translation id="8965037249707889821">Nhập mật khẩu cũ</translation>
 <translation id="8965697826696209160">Không có đủ dung lượng.</translation>
-<translation id="8968527460726243404">Trình viết hình ảnh hệ thống ChromeOS</translation>
 <translation id="8970203673128054105">Xem danh sách chế độ truyền</translation>
 <translation id="89720367119469899">Thoát</translation>
 <translation id="8972513834460200407">Vui lòng kiểm tra với quản trị viên mạng của bạn để đảm bảo rằng tường lửa không chặn tài nguyên đã tải xuống từ máy chủ của Google.</translation>
@@ -5490,6 +5485,7 @@
 <translation id="93766956588638423">Sửa tiện ích</translation>
 <translation id="938470336146445890">Vui lòng cài đặt chứng chỉ người dùng.</translation>
 <translation id="938582441709398163">Lớp phủ bàn phím</translation>
+<translation id="939519157834106403">SSID</translation>
 <translation id="939598580284253335">Nhập cụm mật khẩu</translation>
 <translation id="939736085109172342">Thư mục mới</translation>
 <translation id="940425055435005472">Kích thước phông chữ:</translation>
diff --git a/chrome/app/resources/generated_resources_zh-CN.xtb b/chrome/app/resources/generated_resources_zh-CN.xtb
index a8378f6..a352b76 100644
--- a/chrome/app/resources/generated_resources_zh-CN.xtb
+++ b/chrome/app/resources/generated_resources_zh-CN.xtb
@@ -832,7 +832,6 @@
 <translation id="2224551243087462610">修改文件夹名</translation>
 <translation id="2226449515541314767">已禁止该网站完全控制 MIDI 设备。</translation>
 <translation id="2226720438730111184">告诉我们所发生的情况</translation>
-<translation id="222903405933288376">Google 会使用您的位置信息为您提供本地内容。您可以在<ph name="SETTINGS_LINK" />中更改此设置。</translation>
 <translation id="2229161054156947610">剩余时间超过 1 小时</translation>
 <translation id="222931766245975952">文件被截断</translation>
 <translation id="222949136907494149"><ph name="URL" /> 想要使用您的计算机的所在位置信息。</translation>
@@ -1084,7 +1083,6 @@
 <translation id="2575247648642144396">仅当此扩展程序能够对当前网页采取操作时,该图标才会显示。要使用此扩展程序,请点击该图标或按 <ph name="EXTENSION_SHORTCUT" />。</translation>
 <translation id="2576842806987913196">已经有其他 CRX 文件使用了此名称。</translation>
 <translation id="2579575372772932244">正在重新创建个人资料,请稍候…</translation>
-<translation id="2580168606262715640">找不到配对手机,请确保它不超过一臂远。</translation>
 <translation id="2580889980133367162">始终允许 <ph name="HOST" /> 下载多个文件</translation>
 <translation id="2580924999637585241">总计:<ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">长</translation>
@@ -2165,7 +2163,6 @@
 <translation id="4130207949184424187">此扩展程序更改了您通过多功能框进行搜索时系统显示的页面。</translation>
 <translation id="413121957363593859">组件</translation>
 <translation id="4131410914670010031">黑白色</translation>
-<translation id="4135054690906486073">有其他用户共享此网络</translation>
 <translation id="4135450933899346655">您的证书</translation>
 <translation id="4138267921960073861">在登录屏幕上显示用户名和照片</translation>
 <translation id="4140559601186535628">推送消息</translation>
@@ -2566,9 +2563,6 @@
 <translation id="4813345808229079766">连接</translation>
 <translation id="4813512666221746211">网络错误</translation>
 <translation id="4816492930507672669">适合页面大小</translation>
-<translation id="4816617200045929931">请告诉我们在您收到个人资料错误消息之前发生的确切情况:
-
-****请勿更改此行以下的内容****</translation>
 <translation id="4820334425169212497">没看到</translation>
 <translation id="4821086771593057290">您的密码已更改。请使用新密码重试。</translation>
 <translation id="4821935166599369261">分析已启用(&amp;P)</translation>
@@ -2926,7 +2920,6 @@
 <translation id="5340217413897845242">栏中第 6 项</translation>
 <translation id="5341390997810576190">使用移动数据网络</translation>
 <translation id="5342091991439452114">PIN 码必须至少为 <ph name="MINIMUM" /> 位数</translation>
-<translation id="5342344590724511265">标签页崩溃反馈。</translation>
 <translation id="5342451237681332106">使用 <ph name="PHONE_NAME" /></translation>
 <translation id="534916491091036097">左括号</translation>
 <translation id="5350965906220856151">糟糕!</translation>
@@ -3198,6 +3191,7 @@
 <translation id="5764483294734785780">音频另存为(&amp;V)...</translation>
 <translation id="57646104491463491">修改日期</translation>
 <translation id="5764797882307050727">请释放部分设备空间。</translation>
+<translation id="5765425701854290211">抱歉,由于某些文件已损坏,系统未能成功完成更新。但请放心,您的已同步文件不会受到影响。</translation>
 <translation id="5765491088802881382">没有可用网络</translation>
 <translation id="5765780083710877561">说明:</translation>
 <translation id="5771585441665576801">音译(geia → γεια)</translation>
@@ -4404,6 +4398,7 @@
 <translation id="7615910377284548269">管理未经过沙盒屏蔽的插件拦截…</translation>
 <translation id="7617366389578322136">正在连接“<ph name="DEVICE_NAME" />”</translation>
 <translation id="761779991806306006">未保存任何密码。</translation>
+<translation id="7622114377921274169">正在充电。</translation>
 <translation id="7624154074265342755">无线网络</translation>
 <translation id="7624337243375417909">已关闭大写锁定模式</translation>
 <translation id="7627790789328695202">糟糕,<ph name="FILE_NAME" />已存在。请改用其他名称并重试。</translation>
@@ -4843,6 +4838,7 @@
 <translation id="8270242299912238708">PDF 文档</translation>
 <translation id="827097179112817503">显示“主页”按钮</translation>
 <translation id="8272443605911821513">点击“更多工具”菜单中的“扩展程序”,可以管理您的扩展程序。</translation>
+<translation id="8274924778568117936">在完成更新之前,请勿关闭您的 <ph name="DEVICE_TYPE" />。您的 <ph name="DEVICE_TYPE" /> 将会于安装完毕后重启。</translation>
 <translation id="8275038454117074363">导入</translation>
 <translation id="8276560076771292512">清空缓存并硬性重新加载</translation>
 <translation id="8279388322240498158">索拉尼库尔德语(英文字母)键盘</translation>
@@ -5283,7 +5279,6 @@
 <translation id="8963572037665351978">退出演示模式</translation>
 <translation id="8965037249707889821">输入旧密码</translation>
 <translation id="8965697826696209160">空间不足。</translation>
-<translation id="8968527460726243404">Chrome 操作系统映像写入工具</translation>
 <translation id="8970203673128054105">查看投射模式列表</translation>
 <translation id="89720367119469899">转义</translation>
 <translation id="8972513834460200407">请与您的网络管理员联系,确保防火墙没有阻止系统从 Google 服务器下载内容。</translation>
@@ -5458,6 +5453,7 @@
 <translation id="93766956588638423">修复扩展程序</translation>
 <translation id="938470336146445890">请安装用户证书。</translation>
 <translation id="938582441709398163">Overlay 键盘</translation>
+<translation id="939519157834106403">SSID</translation>
 <translation id="939598580284253335">请输入密码</translation>
 <translation id="939736085109172342">新建文件夹</translation>
 <translation id="940425055435005472">字号:</translation>
diff --git a/chrome/app/resources/generated_resources_zh-TW.xtb b/chrome/app/resources/generated_resources_zh-TW.xtb
index 23153a8..5edc38e5 100644
--- a/chrome/app/resources/generated_resources_zh-TW.xtb
+++ b/chrome/app/resources/generated_resources_zh-TW.xtb
@@ -835,7 +835,6 @@
 <translation id="2224551243087462610">編輯資料夾名稱</translation>
 <translation id="2226449515541314767">這個網站已遭封鎖,無法完整控制 MIDI 裝置。</translation>
 <translation id="2226720438730111184">將發生的狀況告訴我們</translation>
-<translation id="222903405933288376">Google 會使用你的位置資訊,為你提供當地的相關內容。你可以在<ph name="SETTINGS_LINK" />中變更這項設定。</translation>
 <translation id="2229161054156947610">剩下 1 個多小時</translation>
 <translation id="222931766245975952">檔案已遭截斷</translation>
 <translation id="222949136907494149"><ph name="URL" /> 要求使用電腦的位置資訊。</translation>
@@ -1087,7 +1086,6 @@
 <translation id="2575247648642144396">畫面上顯示這個圖示時,表示擴充功能可在目前網頁上運作。如要啟用這項擴充功能,請按一下圖示或按下 <ph name="EXTENSION_SHORTCUT" />。</translation>
 <translation id="2576842806987913196">已有一個 CRX 檔案使用這個名稱。</translation>
 <translation id="2579575372772932244">正在重新建立設定檔,請稍候...</translation>
-<translation id="2580168606262715640">找不到您的手機。請確認手機是否在一個手臂的距離範圍內。</translation>
 <translation id="2580889980133367162">永遠允許 <ph name="HOST" /> 下載多個檔案</translation>
 <translation id="2580924999637585241">總計:<ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">長</translation>
@@ -2171,7 +2169,6 @@
 <translation id="4130207949184424187">這個擴充功能已變更您使用網址列搜尋時所顯示的網頁。</translation>
 <translation id="413121957363593859">元件</translation>
 <translation id="4131410914670010031">黑白</translation>
-<translation id="4135054690906486073">有其他使用者共用這個網路</translation>
 <translation id="4135450933899346655">你的憑證</translation>
 <translation id="4138267921960073861">在登入畫面中顯示使用者名稱和相片</translation>
 <translation id="4140559601186535628">推送訊息</translation>
@@ -2573,9 +2570,6 @@
 <translation id="4813345808229079766">連線</translation>
 <translation id="4813512666221746211">網路錯誤</translation>
 <translation id="4816492930507672669">依頁面大小自動調整</translation>
-<translation id="4816617200045929931">請說明你在收到設定檔錯誤訊息前執行的確切動作:
-
-****請勿變更本行以下內容****</translation>
 <translation id="4820334425169212497">否,我沒有看到</translation>
 <translation id="4821086771593057290">你的密碼已變更,請使用你的新密碼再試一次。</translation>
 <translation id="4821935166599369261">分析已啟用(&amp;P)</translation>
@@ -2939,7 +2933,6 @@
 <translation id="5340217413897845242">檔案櫃項目 6</translation>
 <translation id="5341390997810576190">使用行動數據</translation>
 <translation id="5342091991439452114">PIN 至少需有 <ph name="MINIMUM" /> 碼</translation>
-<translation id="5342344590724511265">分頁當機意見回饋。</translation>
 <translation id="5342451237681332106">使用 <ph name="PHONE_NAME" /></translation>
 <translation id="534916491091036097">左括弧</translation>
 <translation id="5350965906220856151">糟糕!</translation>
@@ -3211,6 +3204,7 @@
 <translation id="5764483294734785780">將音訊另存為(&amp;V)...</translation>
 <translation id="57646104491463491">已修改日期</translation>
 <translation id="5764797882307050727">請在裝置上釋出一些空間。</translation>
+<translation id="5765425701854290211">很抱歉,部分檔案已損毀,因此無法更新。已同步的檔案則未受影響。</translation>
 <translation id="5765491088802881382">沒有可用的網路</translation>
 <translation id="5765780083710877561">說明:</translation>
 <translation id="5771585441665576801">音譯 (geia → γεια)</translation>
@@ -4423,6 +4417,7 @@
 <translation id="7615910377284548269">管理無沙箱防護的外掛程式封鎖設定...</translation>
 <translation id="7617366389578322136">正在連線至「<ph name="DEVICE_NAME" />」</translation>
 <translation id="761779991806306006">沒有儲存任何密碼。</translation>
+<translation id="7622114377921274169">充電中。</translation>
 <translation id="7624154074265342755">無線網路</translation>
 <translation id="7624337243375417909">大寫鎖定模式已關閉</translation>
 <translation id="7627790789328695202">糟糕!已存在名為 <ph name="FILE_NAME" /> 的檔案。請重新命名檔案並再試一次。</translation>
@@ -4862,6 +4857,7 @@
 <translation id="8270242299912238708">PDF 文件</translation>
 <translation id="827097179112817503">顯示 [首頁] 按鈕</translation>
 <translation id="8272443605911821513">如要管理擴充功能,只需按一下 [其他工具] 選單裡的 [擴充功能] 即可。</translation>
+<translation id="8274924778568117936">完成更新前,請勿將 <ph name="DEVICE_TYPE" /> 關機。<ph name="DEVICE_TYPE" /> 會在安裝完成後重新啟動。</translation>
 <translation id="8275038454117074363">匯入</translation>
 <translation id="8276560076771292512">清除快取並強制重新載入</translation>
 <translation id="8279388322240498158">索拉尼庫爾德式英文鍵盤</translation>
@@ -5302,7 +5298,6 @@
 <translation id="8963572037665351978">結束展示模式</translation>
 <translation id="8965037249707889821">輸入先前的密碼</translation>
 <translation id="8965697826696209160">空間不足。</translation>
-<translation id="8968527460726243404">Chrome 作業系統映像檔寫入工具</translation>
 <translation id="8970203673128054105">查看投放模式清單</translation>
 <translation id="89720367119469899">Escape</translation>
 <translation id="8972513834460200407">請與網路管理員聯絡,確認防火牆並未封鎖從 Google 伺服器下載的內容。</translation>
@@ -5477,6 +5472,7 @@
 <translation id="93766956588638423">修復擴充功能</translation>
 <translation id="938470336146445890">請安裝使用者憑證。</translation>
 <translation id="938582441709398163">鍵盤自訂快速鍵</translation>
+<translation id="939519157834106403">SSID</translation>
 <translation id="939598580284253335">請輸入通關密語</translation>
 <translation id="939736085109172342">新增資料夾</translation>
 <translation id="940425055435005472">字型大小:</translation>
diff --git a/chrome/app/resources/google_chrome_strings_es.xtb b/chrome/app/resources/google_chrome_strings_es.xtb
index 00656a9..e13588f 100644
--- a/chrome/app/resources/google_chrome_strings_es.xtb
+++ b/chrome/app/resources/google_chrome_strings_es.xtb
@@ -108,7 +108,7 @@
 <translation id="4042449298237264661">Este ordenador dejará de recibir actualizaciones de Google Chrome porque ya no es compatible con Windows XP y Windows Vista.</translation>
 <translation id="4050175100176540509">En la última versión puedes encontrar mejoras de seguridad importantes y nuevas funciones.</translation>
 <translation id="4053720452172726777">Personaliza y controla Google Chrome</translation>
-<translation id="4147555960264124640">Vas a iniciar sesión con una cuenta administrada, lo que significa que proporcionarás a su administrador control sobre tu perfil de Google Chrome. Tus datos de Chrome como, por ejemplo, tus aplicaciones, tus marcadores, tu historial, tus contraseñas y otras opciones se vincularán de forma permanente a la cuenta <ph name="USER_NAME" />. Podrás eliminar estos datos a través del Panel de control de cuentas de Google, pero no podrás asociar estos datos a otra cuenta. <ph name="LEARN_MORE" /></translation>
+<translation id="4147555960264124640">Vas a iniciar sesión con una cuenta gestionada, lo que significa que proporcionarás a su administrador control sobre tu perfil de Google Chrome. Tus datos de Chrome como, por ejemplo, tus aplicaciones, tus marcadores, tu historial, tus contraseñas y otras opciones se vincularán de forma permanente a la cuenta <ph name="USER_NAME" />. Podrás eliminar estos datos a través del Panel de control de cuentas de Google, pero no podrás asociar estos datos a otra cuenta. <ph name="LEARN_MORE" /></translation>
 <translation id="4149882025268051530">El programa de instalación no ha podido descomprimir el archivo. Vuelve a descargar Google Chrome.</translation>
 <translation id="4251615635259297716">¿Quieres vincular tus datos de Chrome a esta cuenta?</translation>
 <translation id="4309555186815777032">(se debe <ph name="BEGIN_BUTTON" />reiniciar<ph name="END_BUTTON" /> Chrome)</translation>
@@ -209,7 +209,7 @@
 <translation id="7177347454226092725">Se eliminarán permanentemente tus datos de navegación de este dispositivo. Para recuperar tus datos en otro momento, inicia sesión en Chrome como $2.</translation>
 <translation id="7185038942300673794"><ph name="EXTENSION_NAME" /> se ha añadido a Chrome.</translation>
 <translation id="7196020411877309443">¿Por qué aparece este mensaje?</translation>
-<translation id="7242029209006116544">Vas a iniciar sesión con una cuenta administrada, lo que significa que proporcionarás a su administrador control sobre tu perfil de Google Chrome. Tus datos de Chrome como, por ejemplo, tus aplicaciones, tus marcadores, tu historial, tus contraseñas y otras opciones se vincularán de forma permanente a la cuenta <ph name="USER_NAME" />. Podrás eliminar estos datos a través del Panel de control de cuentas de Google, pero no podrás asociar estos datos a otra cuenta. De forma opcional, puedes crear un nuevo perfil para mantener separados tus datos de Chrome. <ph name="LEARN_MORE" /></translation>
+<translation id="7242029209006116544">Vas a iniciar sesión con una cuenta gestionada, lo que significa que proporcionarás a su administrador control sobre tu perfil de Google Chrome. Tus datos de Chrome como, por ejemplo, tus aplicaciones, tus marcadores, tu historial, tus contraseñas y otras opciones se vincularán de forma permanente a la cuenta <ph name="USER_NAME" />. Podrás eliminar estos datos a través del Panel de control de cuentas de Google, pero no podrás asociar estos datos a otra cuenta. De forma opcional, puedes crear un nuevo perfil para mantener separados tus datos de Chrome. <ph name="LEARN_MORE" /></translation>
 <translation id="729375352412857283">Este ordenador pronto dejará de recibir actualizaciones de Google Chrome porque Windows XP y Windows Vista dejarán de ser compatibles.</translation>
 <translation id="7339898014177206373">Nueva ventana</translation>
 <translation id="7369650938475876456">Utiliza una contraseña segura generada por Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_pt-PT.xtb b/chrome/app/resources/google_chrome_strings_pt-PT.xtb
index 953c7647..b4ae922e 100644
--- a/chrome/app/resources/google_chrome_strings_pt-PT.xtb
+++ b/chrome/app/resources/google_chrome_strings_pt-PT.xtb
@@ -75,7 +75,7 @@
 <translation id="3089968997497233615">Está disponível uma versão nova e mais segura do Google Chrome.</translation>
 <translation id="3149510190863420837">Aplicações do Chrome</translation>
 <translation id="3180085900771989961">O seu gestor tem de o remover e adicionar novamente ao Chrome.</translation>
-<translation id="3251381707915721925">Para definir que Websites <ph name="NEW_PROFILE_NAME" /> pode ver, pode configurar restrições e definições ao aceder a <ph name="BEGIN_LINK_1" /><ph name="DISPLAY_LINK" /><ph name="END_LINK_1" />. Se não alterar as predefinições, <ph name="NEW_PROFILE_NAME" /> pode procurar tudo na Web.
+<translation id="3251381707915721925">Para definir que Sites <ph name="NEW_PROFILE_NAME" /> pode ver, pode configurar restrições e definições ao aceder a <ph name="BEGIN_LINK_1" /><ph name="DISPLAY_LINK" /><ph name="END_LINK_1" />. Se não alterar as predefinições, <ph name="NEW_PROFILE_NAME" /> pode procurar tudo na Web.
 
 Para evitar que <ph name="NEW_PROFILE_NAME" /> aceda à sua conta, certifique-se de que bloqueia o seu perfil quando não estiver a utilizar o Chrome. Para o fazer, clique no seu nome de perfil no canto superior direito do navegador e selecione "Sair e bloqueio para criança".
 <ph name="BEGIN_LINK_2" />Saber mais<ph name="END_LINK_2" />
@@ -152,7 +152,7 @@
 <translation id="556024056938947818">O Google Chrome está a tentar mostrar palavras-passe.</translation>
 <translation id="5563479599352954471">Pesquisar com um toque</translation>
 <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation>
-<translation id="5620765574781326016">Saiba mais acerca de tópicos em Websites sem sair da página.</translation>
+<translation id="5620765574781326016">Saiba mais acerca de tópicos em Sites sem sair da página.</translation>
 <translation id="565744775970812598"><ph name="FILE_NAME" /> pode ser perigoso, por isso o Chrome bloqueou-o.</translation>
 <translation id="568643307450491754">Encontre os seus marcadores no menu Chrome ou na barra de marcadores.</translation>
 <translation id="573759479754913123">Acerca do SO Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_th.xtb b/chrome/app/resources/google_chrome_strings_th.xtb
index 4150e17..19c0476 100644
--- a/chrome/app/resources/google_chrome_strings_th.xtb
+++ b/chrome/app/resources/google_chrome_strings_th.xtb
@@ -3,7 +3,7 @@
 <translationbundle lang="th">
 <translation id="1001534784610492198">การเก็บข้อมูลของโปรแกรมติดตั้งเสียหายหรือไม่ถูกต้อง โปรดดาวน์โหลด Google Chrome อีกครั้ง</translation>
 <translation id="1035334672863811645">ลงชื่อเข้าใช้ Chrome</translation>
-<translation id="1065672644894730302">ค่ากำหนดของคุณไม่สามารถอ่านได้ คุณลักษณะบางอย่างอาจใช้ไม่ได้และการเปลี่ยนแปลงค่ากำหนดจะไม่ได้รับการบันทึก</translation>
+<translation id="1065672644894730302">ค่ากำหนดของคุณไม่สามารถอ่านได้ ฟีเจอร์บางอย่างอาจใช้ไม่ได้และการเปลี่ยนแปลงค่ากำหนดจะไม่ได้รับการบันทึก</translation>
 <translation id="1088300314857992706"><ph name="USER_EMAIL_ADDRESS" /> ใช้ Chrome อยู่ก่อนหน้านี้</translation>
 <translation id="1104959162601287462">เกี่ยวกับ &amp;Chrome OS</translation>
 <translation id="110877069173485804">นี่คือ Chrome ของคุณ</translation>
@@ -32,7 +32,7 @@
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1773601347087397504">รับความช่วยเหลือเกี่ยวกับการใช้ Chrome OS</translation>
 <translation id="1795405610103747296">ติดตั้ง Chrome ในโทรศัพท์ เราจะส่ง SMS ไปยังโทรศัพท์ของคุณ: <ph name="PHONE_NUMBER" /></translation>
-<translation id="1818142563254268765">Chrome ไม่สามารถอัปเดตตัวเองเป็นเวอร์ชันล่าสุดได้ คุณกำลังพลาดคุณลักษณะเจ๋งๆ และการปรับปรุงความปลอดภัย คุณจำเป็นต้องอัปเดต Chrome</translation>
+<translation id="1818142563254268765">Chrome ไม่สามารถอัปเดตตัวเองเป็นเวอร์ชันล่าสุดได้ คุณกำลังพลาดฟีเจอร์เจ๋งๆ และการปรับปรุงความปลอดภัย คุณจำเป็นต้องอัปเดต Chrome</translation>
 <translation id="1877026089748256423">Chrome ล้าสมัย</translation>
 <translation id="2063848847527508675">ต้องรีสตาร์ท Chrome OS เพื่อใช้การอัปเดต</translation>
 <translation id="2077129598763517140">ใช้การเร่งฮาร์ดแวร์เมื่อสามารถใช้ได้</translation>
@@ -102,7 +102,7 @@
 <translation id="3889417619312448367">ยกเลิกการติดตั้ง Google Chrome</translation>
 <translation id="4028693306634653894">ใช้ Chrome ได้เร็วขึ้น</translation>
 <translation id="4042449298237264661">คอมพิวเตอร์เครื่องนี้จะไม่ได้รับการอัปเดต Google Chrome อีกต่อไปเพราะระบบไม่รองรับ Windows XP และ Windows Vista แล้ว</translation>
-<translation id="4050175100176540509">การปรับปรุงด้านความปลอดภัยที่สำคัญและคุณลักษณะใหม่ๆ พร้อมให้บริการในเวอร์ชันล่าสุด</translation>
+<translation id="4050175100176540509">การปรับปรุงด้านความปลอดภัยที่สำคัญและฟีเจอร์ใหม่ๆ พร้อมให้บริการในเวอร์ชันล่าสุด</translation>
 <translation id="4053720452172726777">กำหนดค่าและควบคุม Google Chrome</translation>
 <translation id="4147555960264124640">คุณกำลังลงชื่อเข้าใช้ด้วยบัญชีที่จัดการ และให้การควบคุมระดับผู้ดูแลระบบของบัญชีดังกล่าวเหนือโปรไฟล์ Google Chrome ของคุณ ข้อมูล Chrome เช่น แอป บุ๊กมาร์ก ประวัติการเข้าชม รหัสผ่าน และการตั้งค่าอื่นๆ จะเชื่อมโยงอย่างถาวรกับ <ph name="USER_NAME" /> คุณจะสามารถลบข้อมูลนี้ผ่านทางแผงควบคุมบัญชี Google แต่คุณจะไม่สามารถเชื่อมโยงข้อมูลนี้กับบัญชีอื่น <ph name="LEARN_MORE" /></translation>
 <translation id="4149882025268051530">โปรแกรมติดตั้งยกเลิกการบีบอัดการเก็บข้อมูลไม่ได้ โปรดดาวน์โหลด Google Chrome อีกครั้ง</translation>
@@ -138,7 +138,7 @@
 <translation id="5037239767309817516">โปรดปิดหน้าต่าง Google Chrome ทั้งหมด แล้วเปิดใหม่อีกครั้งเพื่อให้การเปลี่ยนแปลงนี้มีผล</translation>
 <translation id="5132929315877954718">พบกับแอป เกม ส่วนขยาย และธีมเด็ดๆ สำหรับ Google Chrome</translation>
 <translation id="5166975452760862670">Google Chrome แสดงในภาษานี้</translation>
-<translation id="5170938038195470297">โปรไฟล์ของคุณไม่สามารถใช้ได้เพราะมาจากรุ่นที่ใหม่กว่าของ Google Chrome คุณลักษณะบางอย่างอาจจะไม่พร้อมใช้งาน โปรดระบุไดเรกทอรีของโปรไฟล์อื่นหรือใช้ Chrome รุ่นที่ใหม่กว่า</translation>
+<translation id="5170938038195470297">โปรไฟล์ของคุณไม่สามารถใช้ได้เพราะมาจากรุ่นที่ใหม่กว่าของ Google Chrome ฟีเจอร์บางอย่างอาจจะไม่พร้อมใช้งาน โปรดระบุไดเรกทอรีของโปรไฟล์อื่นหรือใช้ Chrome รุ่นที่ใหม่กว่า</translation>
 <translation id="5193136243808726294">Google Chrome OS ไม่สามารถเปิดหน้านี้</translation>
 <translation id="5204098752394657250"><ph name="TERMS_OF_SERVICE_LINK" />ข้อกำหนดในการให้บริการ<ph name="END_TERMS_OF_SERVICE_LINK" />ของ Google Chrome</translation>
 <translation id="5243785881901838525">Google Payments (คัดลอกลงใน Chrome แล้ว)</translation>
@@ -196,7 +196,7 @@
 <translation id="6989339256997917931">อัปเดต Google Chrome แล้ว แต่คุณไม่ได้ใช้งานมาไม่ต่ำกว่า 30 วันแล้ว</translation>
 <translation id="7098166902387133879">Google Chrome ใช้ไมโครโฟนอยู่</translation>
 <translation id="7106741999175697885">ตัวจัดการงาน - Google Chrome</translation>
-<translation id="7125719106133729027">Chrome ไม่สามารถอัปเดตตัวเองเป็นเวอร์ชันล่าสุดได้ คุณกำลังพลาดคุณลักษณะเจ๋งๆ และการปรับปรุงความปลอดภัย คุณจำเป็นต้องติดตั้ง Chrome ใหม่ด้วยตนเอง</translation>
+<translation id="7125719106133729027">Chrome ไม่สามารถอัปเดตตัวเองเป็นเวอร์ชันล่าสุดได้ คุณกำลังพลาดฟีเจอร์เจ๋งๆ และการปรับปรุงความปลอดภัย คุณจำเป็นต้องติดตั้ง Chrome ใหม่ด้วยตนเอง</translation>
 <translation id="7161904924553537242">ยินดีต้อนรับสู่ Google Chrome</translation>
 <translation id="7164397146364144019">คุณสามารถช่วยปรับปรุงให้ Chrome ปลอดภัยและใช้งานง่ายขึ้นโดยรายงานรายละเอียดของเหตุการณ์ด้านความปลอดภัยที่อาจจะเกิดขึ้นต่อ Google โดยอัตโนมัติ</translation>
 <translation id="7177347454226092725">การดำเนินการนี้จะลบข้อมูลการท่องเว็บของคุณจากอุปกรณ์นี้อย่างถาวร หากต้องการดึงข้อมูลภายหลัง ให้ลงชื่อเข้าใช้ Chrome ในนาม $2</translation>
@@ -210,9 +210,9 @@
 <translation id="7400722733683201933">เกี่ยวกับ Google Chrome</translation>
 <translation id="7408085963519505752">ข้อกำหนดของ Chrome OS</translation>
 <translation id="7419046106786626209">Chrome OS ไม่สามารถซิงค์ข้อมูลของคุณเนื่องจากการซิงค์ไม่พร้อมให้บริการสำหรับโดเมนของคุณ</translation>
-<translation id="7436949144778751379">Google Chrome ต้องใช้ Windows XP หรือรุ่นใหม่กว่า คุณลักษณะบางอย่างอาจไม่ทำงาน</translation>
+<translation id="7436949144778751379">Google Chrome ต้องใช้ Windows XP หรือรุ่นใหม่กว่า ฟีเจอร์บางอย่างอาจไม่ทำงาน</translation>
 <translation id="7437998757836447326">ออกจากระบบ Chrome</translation>
-<translation id="7459554271817304652">ตั้งค่าการซิงค์เพื่อบัน​​ทึกคุณลักษณะเบราว์เซอร์ในแบบของคุณไปยังเว็บและเข้าถึงได้จาก Google Chrome บนคอมพิวเตอร์เครื่องใดก็ได้</translation>
+<translation id="7459554271817304652">ตั้งค่าการซิงค์เพื่อบัน​​ทึกฟีเจอร์เบราว์เซอร์ในแบบของคุณไปยังเว็บและเข้าถึงได้จาก Google Chrome บนคอมพิวเตอร์เครื่องใดก็ได้</translation>
 <translation id="7473136999113284234">Chrome จะอัปเดตโดยอัตโนมัติเพื่อให้คุณได้ใช้เวอร์ชันใหม่ล่าสุดอยู่เสมอ</translation>
 <translation id="7473891865547856676">ไม่ ขอบคุณ</translation>
 <translation id="7494905215383356681">ใบอนุญาตโอเพนซอร์สของ Chrome</translation>
diff --git a/ui/resources/default_100_percent/common/translate.png b/chrome/app/theme/default_100_percent/common/translate_bubble_icon.png
similarity index 100%
rename from ui/resources/default_100_percent/common/translate.png
rename to chrome/app/theme/default_100_percent/common/translate_bubble_icon.png
Binary files differ
diff --git a/ui/resources/default_200_percent/common/translate.png b/chrome/app/theme/default_200_percent/common/translate_bubble_icon.png
similarity index 100%
rename from ui/resources/default_200_percent/common/translate.png
rename to chrome/app/theme/default_200_percent/common/translate_bubble_icon.png
Binary files differ
diff --git a/chrome/app/theme/theme_resources.grd b/chrome/app/theme/theme_resources.grd
index 42d2895..2723b6ec 100644
--- a/chrome/app/theme/theme_resources.grd
+++ b/chrome/app/theme/theme_resources.grd
@@ -515,6 +515,7 @@
       <if expr="is_macosx">
         <structure type="chrome_scaled_image" name="IDR_TRANSLATE" file="legacy/translate.png" />
       </if>
+      <structure type="chrome_scaled_image" name="IDR_TRANSLATE_BUBBLE_ICON" file="common/translate_bubble_icon.png" />
       <structure type="chrome_scaled_image" name="IDR_USB_NOTIFICATION_ICON" file="common/notification_usb_icon.png" />
       <if expr="chromeos">
         <structure type="chrome_scaled_image" name="IDR_USER_IMAGE_CAPTURE" file="cros/snapshot_wide.png" />
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index 902baa1..057e884 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -731,10 +731,6 @@
     "net/sdch_owner_pref_storage.h",
     "net/service_providers_win.cc",
     "net/service_providers_win.h",
-    "net/spdyproxy/chrome_data_use_group.cc",
-    "net/spdyproxy/chrome_data_use_group.h",
-    "net/spdyproxy/chrome_data_use_group_provider.cc",
-    "net/spdyproxy/chrome_data_use_group_provider.h",
     "net/spdyproxy/data_reduction_proxy_chrome_io_data.cc",
     "net/spdyproxy/data_reduction_proxy_chrome_io_data.h",
     "net/spdyproxy/data_reduction_proxy_chrome_settings.cc",
@@ -1604,6 +1600,7 @@
     "//components/translate/core/browser",
     "//components/translate/core/common",
     "//components/ukm:observers",
+    "//components/ukm:ukm_interface",
     "//components/ukm/debug_page",
     "//components/undo",
     "//components/update_client",
diff --git a/chrome/browser/android/offline_pages/evaluation/offline_page_evaluation_bridge.cc b/chrome/browser/android/offline_pages/evaluation/offline_page_evaluation_bridge.cc
index 4a68c9c5..dee7fc72 100644
--- a/chrome/browser/android/offline_pages/evaluation/offline_page_evaluation_bridge.cc
+++ b/chrome/browser/android/offline_pages/evaluation/offline_page_evaluation_bridge.cc
@@ -175,7 +175,7 @@
   std::unique_ptr<Offliner> offliner(new BackgroundLoaderOffliner(
       context, policy.get(),
       OfflinePageModelFactory::GetForBrowserContext(context),
-      nullptr));  // no need to connect LoadTerminatorListener for harness.
+      nullptr));  // no need to connect LoadTerminationListener for harness.
   return GetTestingRequestCoordinator(context, std::move(policy),
                                       std::move(offliner));
 }
diff --git a/chrome/browser/android/vr_shell/vr_shell_gl.cc b/chrome/browser/android/vr_shell/vr_shell_gl.cc
index 9fffc43..a68f6f8d 100644
--- a/chrome/browser/android/vr_shell/vr_shell_gl.cc
+++ b/chrome/browser/android/vr_shell/vr_shell_gl.cc
@@ -289,9 +289,8 @@
     return;
   }
 
-  gl::GLContextAttribs attribs;
-  attribs.context_priority = gl::ContextPriorityHigh;
-  context_ = gl::init::CreateGLContext(nullptr, surface_.get(), attribs);
+  context_ = gl::init::CreateGLContext(nullptr, surface_.get(),
+                                       gl::GLContextAttribs());
   if (!context_.get()) {
     LOG(ERROR) << "gl::init::CreateGLContext failed";
     ForceExitVr();
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc
index 840d9a1..37e6a5d 100644
--- a/chrome/browser/chrome_content_browser_client.cc
+++ b/chrome/browser/chrome_content_browser_client.cc
@@ -153,6 +153,7 @@
 #include "components/task_scheduler_util/browser/initialization.h"
 #include "components/task_scheduler_util/common/variations_util.h"
 #include "components/translate/core/common/translate_switches.h"
+#include "components/ukm/ukm_interface.h"
 #include "components/url_formatter/url_fixer.h"
 #include "components/variations/variations_associated_data.h"
 #include "components/version_info/version_info.h"
@@ -3077,6 +3078,9 @@
       base::Bind(&rappor::RapporRecorderImpl::Create,
                  g_browser_process->rappor_service()),
       ui_task_runner);
+  registry->AddInterface(
+      base::Bind(&ukm::UkmInterface::Create, g_browser_process->ukm_recorder()),
+      ui_task_runner);
   if (NetBenchmarking::CheckBenchmarkingEnabled()) {
     Profile* profile =
         Profile::FromBrowserContext(render_process_host->GetBrowserContext());
diff --git a/chrome/browser/chrome_content_browser_manifest_overlay.json b/chrome/browser/chrome_content_browser_manifest_overlay.json
index 8f8676b..0f1241c 100644
--- a/chrome/browser/chrome_content_browser_manifest_overlay.json
+++ b/chrome/browser/chrome_content_browser_manifest_overlay.json
@@ -15,7 +15,8 @@
           "rappor::mojom::RapporRecorder",
           "spellcheck::mojom::SpellCheckHost",
           "startup_metric_utils::mojom::StartupMetricHost",
-          "translate::mojom::ContentTranslateDriver"
+          "translate::mojom::ContentTranslateDriver",
+          "ukm::mojom::UkmRecorderInterface"
         ],
         "gpu": [
           "metrics::mojom::CallStackProfileCollector"
diff --git a/chrome/browser/chromeos/login/signin/merge_session_throttling_utils.cc b/chrome/browser/chromeos/login/signin/merge_session_throttling_utils.cc
index 49e51f4..661bb8d 100644
--- a/chrome/browser/chromeos/login/signin/merge_session_throttling_utils.cc
+++ b/chrome/browser/chromeos/login/signin/merge_session_throttling_utils.cc
@@ -10,7 +10,7 @@
 #include "base/logging.h"
 #include "base/macros.h"
 #include "base/memory/singleton.h"
-#include "base/threading/non_thread_safe.h"
+#include "base/sequence_checker.h"
 #include "base/time/time.h"
 #include "chrome/browser/chromeos/login/signin/oauth2_login_manager.h"
 #include "chrome/browser/chromeos/login/signin/oauth2_login_manager_factory.h"
@@ -32,17 +32,19 @@
 const int64_t kMaxSessionRestoreTimeInSec = 60;
 
 // The set of blocked profiles.
-class ProfileSet : public base::NonThreadSafe, public std::set<Profile*> {
+class ProfileSet : public std::set<Profile*> {
  public:
   ProfileSet() {}
 
-  virtual ~ProfileSet() {}
+  virtual ~ProfileSet() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); }
 
   static ProfileSet* Get();
 
  private:
   friend struct ::base::LazyInstanceTraitsBase<ProfileSet>;
 
+  SEQUENCE_CHECKER(sequence_checker_);
+
   DISALLOW_COPY_AND_ASSIGN(ProfileSet);
 };
 
diff --git a/chrome/browser/chromeos/printing/printer_discoverer.cc b/chrome/browser/chromeos/printing/printer_discoverer.cc
index e6f9159..6781249 100644
--- a/chrome/browser/chromeos/printing/printer_discoverer.cc
+++ b/chrome/browser/chromeos/printing/printer_discoverer.cc
@@ -75,7 +75,7 @@
       // the observer the initial scan is done now.  This will change when we're
       // also doing network discovery -- we'll hold off on issuing this callback
       // until the network discovery is done as well.
-      observer->OnDiscoveryInitialScanDone();
+      observer->OnDiscoveryInitialScanDone(printers.size());
     }
   }
 
diff --git a/chrome/browser/chromeos/printing/printer_discoverer.h b/chrome/browser/chromeos/printing/printer_discoverer.h
index 20fd8bc..d49720c 100644
--- a/chrome/browser/chromeos/printing/printer_discoverer.h
+++ b/chrome/browser/chromeos/printing/printer_discoverer.h
@@ -28,7 +28,9 @@
     // still call OnPrintersFound if the set of available printers
     // changes, but the user can conclude that if a printer is currently
     // available and not in the list, we're not still looking for it.
-    virtual void OnDiscoveryInitialScanDone() = 0;
+    // TODO(justincarlson): Merge with OnPrintersFound when crbug.com/588234 is
+    // complete.
+    virtual void OnDiscoveryInitialScanDone(int printer_count) = 0;
 
     // Called with a collection of printers as they are discovered.  On each
     // call |printers| is the full set of known printers; it is not
diff --git a/chrome/browser/data_saver/OWNERS b/chrome/browser/data_saver/OWNERS
index 80542d83..78f9747 100644
--- a/chrome/browser/data_saver/OWNERS
+++ b/chrome/browser/data_saver/OWNERS
@@ -1 +1,3 @@
-file://components/data_reduction_proxy/OWNERS
\ No newline at end of file
+file://components/data_reduction_proxy/OWNERS
+
+# COMPONENT: Internals>Network>DataProxy
\ No newline at end of file
diff --git a/chrome/browser/data_use_measurement/OWNERS b/chrome/browser/data_use_measurement/OWNERS
index 80542d83..7d35b934 100644
--- a/chrome/browser/data_use_measurement/OWNERS
+++ b/chrome/browser/data_use_measurement/OWNERS
@@ -1 +1,3 @@
-file://components/data_reduction_proxy/OWNERS
\ No newline at end of file
+file://components/data_reduction_proxy/OWNERS
+
+# COMPONENT: Internals>Network>DataUse
\ No newline at end of file
diff --git a/chrome/browser/devtools/device/adb/mock_adb_server.cc b/chrome/browser/devtools/device/adb/mock_adb_server.cc
index 88658a3..0c3f42d 100644
--- a/chrome/browser/devtools/device/adb/mock_adb_server.cc
+++ b/chrome/browser/devtools/device/adb/mock_adb_server.cc
@@ -12,12 +12,12 @@
 #include "base/memory/ptr_util.h"
 #include "base/memory/weak_ptr.h"
 #include "base/message_loop/message_loop.h"
+#include "base/sequence_checker.h"
 #include "base/single_thread_task_runner.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_split.h"
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
-#include "base/threading/non_thread_safe.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/test/browser_test.h"
@@ -181,7 +181,7 @@
 
 static const int kAdbMessageHeaderSize = 4;
 
-class SimpleHttpServer : base::NonThreadSafe {
+class SimpleHttpServer {
  public:
   class Parser {
    public:
@@ -196,7 +196,7 @@
   virtual ~SimpleHttpServer();
 
  private:
-  class Connection : base::NonThreadSafe {
+  class Connection {
    public:
     Connection(net::StreamSocket* socket, const ParserFactory& factory);
     virtual ~Connection();
@@ -214,6 +214,9 @@
     scoped_refptr<net::GrowableIOBuffer> output_buffer_;
     int bytes_to_write_;
     bool read_closed_;
+
+    SEQUENCE_CHECKER(sequence_checker_);
+
     base::WeakPtrFactory<Connection> weak_factory_;
 
     DISALLOW_COPY_AND_ASSIGN(Connection);
@@ -225,6 +228,9 @@
   ParserFactory factory_;
   std::unique_ptr<net::TCPServerSocket> socket_;
   std::unique_ptr<net::StreamSocket> client_socket_;
+
+  SEQUENCE_CHECKER(sequence_checker_);
+
   base::WeakPtrFactory<SimpleHttpServer> weak_factory_;
 
   DISALLOW_COPY_AND_ASSIGN(SimpleHttpServer);
@@ -240,6 +246,7 @@
 }
 
 SimpleHttpServer::~SimpleHttpServer() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 }
 
 SimpleHttpServer::Connection::Connection(net::StreamSocket* socket,
@@ -257,10 +264,11 @@
 }
 
 SimpleHttpServer::Connection::~Connection() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 }
 
 void SimpleHttpServer::Connection::Send(const std::string& message) {
-  CHECK(CalledOnValidThread());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   const char* data = message.c_str();
   int size = message.size();
 
@@ -287,7 +295,7 @@
 }
 
 void SimpleHttpServer::Connection::ReadData() {
-  CHECK(CalledOnValidThread());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   if (input_buffer_->RemainingCapacity() == 0)
     input_buffer_->SetCapacity(input_buffer_->capacity() * 2);
@@ -302,7 +310,7 @@
 }
 
 void SimpleHttpServer::Connection::OnDataRead(int count) {
-  CHECK(CalledOnValidThread());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   if (count <= 0) {
     if (bytes_to_write_ == 0)
       delete this;
@@ -330,7 +338,7 @@
 }
 
 void SimpleHttpServer::Connection::WriteData() {
-  CHECK(CalledOnValidThread());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   CHECK_GE(output_buffer_->capacity(),
            output_buffer_->offset() + bytes_to_write_) << "Overflow";
 
@@ -344,7 +352,7 @@
 }
 
 void SimpleHttpServer::Connection::OnDataWritten(int count) {
-  CHECK(CalledOnValidThread());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   if (count < 0) {
     delete this;
     return;
@@ -366,7 +374,7 @@
 }
 
 void SimpleHttpServer::OnConnect() {
-  CHECK(CalledOnValidThread());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   int accept_result = socket_->Accept(&client_socket_,
       base::Bind(&SimpleHttpServer::OnAccepted, base::Unretained(this)));
@@ -378,14 +386,13 @@
 }
 
 void SimpleHttpServer::OnAccepted(int result) {
-  CHECK(CalledOnValidThread());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   ASSERT_EQ(result, 0);  // Fails if the socket is already in use.
   new Connection(client_socket_.release(), factory_);
   OnConnect();
 }
 
 class AdbParser : public SimpleHttpServer::Parser,
-                  public base::NonThreadSafe,
                   public MockAndroidConnection::Delegate {
  public:
   static Parser* Create(FlushMode flush_mode,
@@ -393,7 +400,8 @@
     return new AdbParser(flush_mode, callback);
   }
 
-  ~AdbParser() override {}
+  ~AdbParser() override { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); }
+
  private:
   explicit AdbParser(FlushMode flush_mode,
                      const SimpleHttpServer::SendCallback& callback)
@@ -402,7 +410,7 @@
   }
 
   int Consume(const char* data, int size) override {
-    CHECK(CalledOnValidThread());
+    DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
     if (mock_connection_) {
       mock_connection_->Receive(std::string(data, size));
       return size;
@@ -423,7 +431,7 @@
   }
 
   void ProcessCommand(const std::string& command) {
-    CHECK(CalledOnValidThread());
+    DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
     if (command == "host:devices") {
       SendSuccess(base::StringPrintf("%s\tdevice\n%s\toffline",
                                      kSerialOnline,
@@ -449,7 +457,7 @@
   }
 
   void Send(const std::string& status, const std::string& response) {
-    CHECK(CalledOnValidThread());
+    DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
     CHECK_EQ(4U, status.size());
     std::string buffer = status;
     if (flush_mode_ == FlushWithoutSize) {
@@ -477,6 +485,8 @@
   SimpleHttpServer::SendCallback callback_;
   std::string serial_;
   std::unique_ptr<MockAndroidConnection> mock_connection_;
+
+  SEQUENCE_CHECKER(sequence_checker_);
 };
 
 static SimpleHttpServer* mock_adb_server_ = NULL;
@@ -622,4 +632,3 @@
                                   base::MessageLoop::QuitWhenIdleClosure());
   content::RunMessageLoop();
 }
-
diff --git a/chrome/browser/devtools/device/android_device_manager.cc b/chrome/browser/devtools/device/android_device_manager.cc
index 86901ff..733bf15 100644
--- a/chrome/browser/devtools/device/android_device_manager.cc
+++ b/chrome/browser/devtools/device/android_device_manager.cc
@@ -457,6 +457,7 @@
 }
 
 AndroidDeviceManager::Device::~Device() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   provider_->AddRef();
   DeviceProvider* raw_ptr = provider_.get();
   provider_ = nullptr;
@@ -541,6 +542,7 @@
 }
 
 AndroidDeviceManager::~AndroidDeviceManager() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   SetDeviceProviders(DeviceProviders());
 }
 
diff --git a/chrome/browser/devtools/device/android_device_manager.h b/chrome/browser/devtools/device/android_device_manager.h
index 0838c1d..61e33b03 100644
--- a/chrome/browser/devtools/device/android_device_manager.h
+++ b/chrome/browser/devtools/device/android_device_manager.h
@@ -10,8 +10,8 @@
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
 #include "base/memory/weak_ptr.h"
+#include "base/sequence_checker.h"
 #include "base/single_thread_task_runner.h"
-#include "base/threading/non_thread_safe.h"
 #include "chrome/browser/profiles/profile.h"
 #include "content/public/browser/browser_thread.h"
 #include "ui/gfx/geometry/size.h"
@@ -20,7 +20,7 @@
 class StreamSocket;
 }
 
-class AndroidDeviceManager : public base::NonThreadSafe {
+class AndroidDeviceManager {
  public:
   using CommandCallback =
       base::Callback<void(int, const std::string&)>;
@@ -107,8 +107,7 @@
 
   class DeviceProvider;
 
-  class Device : public base::RefCountedThreadSafe<Device>,
-                 public base::NonThreadSafe {
+  class Device : public base::RefCountedThreadSafe<Device> {
    public:
     void QueryDeviceInfo(const DeviceInfoCallback& callback);
 
@@ -144,6 +143,9 @@
     scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
     scoped_refptr<DeviceProvider> provider_;
     std::string serial_;
+
+    SEQUENCE_CHECKER(sequence_checker_);
+
     base::WeakPtrFactory<Device> weak_factory_;
 
     DISALLOW_COPY_AND_ASSIGN(Device);
@@ -243,6 +245,8 @@
   DeviceProviders providers_;
   DeviceWeakMap devices_;
 
+  SEQUENCE_CHECKER(sequence_checker_);
+
   base::WeakPtrFactory<AndroidDeviceManager> weak_factory_;
 };
 
diff --git a/chrome/browser/devtools/device/port_forwarding_controller.cc b/chrome/browser/devtools/device/port_forwarding_controller.cc
index 35587ac..d4ae31f 100644
--- a/chrome/browser/devtools/device/port_forwarding_controller.cc
+++ b/chrome/browser/devtools/device/port_forwarding_controller.cc
@@ -15,7 +15,6 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_split.h"
 #include "base/strings/string_util.h"
-#include "base/threading/non_thread_safe.h"
 #include "chrome/browser/devtools/devtools_protocol.h"
 #include "chrome/browser/devtools/devtools_protocol_constants.h"
 #include "chrome/browser/profiles/profile.h"
@@ -49,7 +48,7 @@
 
 static const char kDevToolsRemoteBrowserTarget[] = "/devtools/browser";
 
-class SocketTunnel : public base::NonThreadSafe {
+class SocketTunnel {
  public:
   static void StartTunnel(const std::string& host,
                           int port,
diff --git a/chrome/browser/devtools/device/usb/android_usb_socket.cc b/chrome/browser/devtools/device/usb/android_usb_socket.cc
index 8736c76f..a81b37ed 100644
--- a/chrome/browser/devtools/device/usb/android_usb_socket.cc
+++ b/chrome/browser/devtools/device/usb/android_usb_socket.cc
@@ -32,7 +32,7 @@
       weak_factory_(this) {}
 
 AndroidUsbSocket::~AndroidUsbSocket() {
-  DCHECK(CalledOnValidThread());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   if (is_connected_)
     Disconnect();
   if (!delete_callback_.is_null())
@@ -162,7 +162,7 @@
 }
 
 int AndroidUsbSocket::Connect(const net::CompletionCallback& callback) {
-  DCHECK(CalledOnValidThread());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(!callback.is_null());
   if (!device_.get())
     return net::ERR_FAILED;
@@ -182,7 +182,7 @@
 }
 
 bool AndroidUsbSocket::IsConnected() const {
-  DCHECK(CalledOnValidThread());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   return is_connected_;
 }
 
diff --git a/chrome/browser/devtools/device/usb/android_usb_socket.h b/chrome/browser/devtools/device/usb/android_usb_socket.h
index 8d3811f..a974168d7 100644
--- a/chrome/browser/devtools/device/usb/android_usb_socket.h
+++ b/chrome/browser/devtools/device/usb/android_usb_socket.h
@@ -12,14 +12,13 @@
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
 #include "base/memory/weak_ptr.h"
-#include "base/threading/non_thread_safe.h"
+#include "base/sequence_checker.h"
 #include "chrome/browser/devtools/device/usb/android_usb_device.h"
 #include "net/base/ip_endpoint.h"
 #include "net/log/net_log_with_source.h"
 #include "net/socket/stream_socket.h"
 
-class AndroidUsbSocket : public net::StreamSocket,
-                         public base::NonThreadSafe {
+class AndroidUsbSocket : public net::StreamSocket {
  public:
   AndroidUsbSocket(scoped_refptr<AndroidUsbDevice> device,
                    uint32_t socket_id,
@@ -77,6 +76,9 @@
   net::CompletionCallback read_callback_;
   net::CompletionCallback write_callback_;
   base::Closure delete_callback_;
+
+  SEQUENCE_CHECKER(sequence_checker_);
+
   base::WeakPtrFactory<AndroidUsbSocket> weak_factory_;
 
   DISALLOW_COPY_AND_ASSIGN(AndroidUsbSocket);
diff --git a/chrome/browser/download/chrome_download_manager_delegate.cc b/chrome/browser/download/chrome_download_manager_delegate.cc
index 9342b140..67ea6dc5 100644
--- a/chrome/browser/download/chrome_download_manager_delegate.cc
+++ b/chrome/browser/download/chrome_download_manager_delegate.cc
@@ -207,8 +207,6 @@
     kDefaultPlatformConflictAction = DownloadPathReservationTracker::UNIQUIFY;
 #endif
 
-constexpr char kPDFMimeType[] = "application/pdf";
-
 }  // namespace
 
 ChromeDownloadManagerDelegate::ChromeDownloadManagerDelegate(Profile* profile)
diff --git a/chrome/browser/extensions/activity_log/activity_log.cc b/chrome/browser/extensions/activity_log/activity_log.cc
index 8db97c5..e1fa65b 100644
--- a/chrome/browser/extensions/activity_log/activity_log.cc
+++ b/chrome/browser/extensions/activity_log/activity_log.cc
@@ -523,7 +523,7 @@
   activity_monitor::Monitor current_event_monitor =
       activity_monitor::GetApiEventMonitor();
   DCHECK(!current_event_monitor || current_event_monitor == &LogApiEvent);
-  if (!current_function_monitor)
+  if (!current_event_monitor)
     activity_monitor::SetApiEventMonitor(&LogApiEvent);
 
   activity_monitor::WebRequestMonitor current_web_request_monitor =
diff --git a/chrome/browser/io_thread.cc b/chrome/browser/io_thread.cc
index 9a94106..f863d07 100644
--- a/chrome/browser/io_thread.cc
+++ b/chrome/browser/io_thread.cc
@@ -222,20 +222,6 @@
       *base::CommandLine::ForCurrentProcess();
 
   net::HostResolver::Options options;
-
-  // Use the retry attempts override from the command-line, if any.
-  if (command_line.HasSwitch(switches::kHostResolverRetryAttempts)) {
-    std::string s =
-        command_line.GetSwitchValueASCII(switches::kHostResolverRetryAttempts);
-    // Parse the switch (it should be a non-negative integer).
-    int n;
-    if (base::StringToInt(s, &n) && n >= 0) {
-      options.max_retry_attempts = static_cast<size_t>(n);
-    } else {
-      LOG(ERROR) << "Invalid switch for host resolver retry attempts: " << s;
-    }
-  }
-
   std::unique_ptr<net::HostResolver> global_host_resolver;
 #if defined OS_CHROMEOS
   global_host_resolver =
@@ -553,14 +539,6 @@
           new chrome_browser_data_usage::TabIdAnnotator()),
       std::move(data_use_amortizer)));
 
-  std::unique_ptr<ChromeNetworkDelegate> chrome_network_delegate(
-      new ChromeNetworkDelegate(extension_event_router_forwarder(),
-                                &system_enable_referrers_));
-  // By default, data usage is considered off the record.
-  chrome_network_delegate->set_data_use_aggregator(
-      globals_->data_use_aggregator.get(),
-      true /* is_data_usage_off_the_record */);
-
 #if defined(OS_ANDROID)
   globals_->external_data_use_observer.reset(
       new chrome::android::ExternalDataUseObserver(
@@ -569,10 +547,6 @@
           BrowserThread::GetTaskRunnerForThread(BrowserThread::UI)));
 #endif  // defined(OS_ANDROID)
 
-  globals_->system_network_delegate =
-      globals_->data_use_ascriber->CreateNetworkDelegate(
-          std::move(chrome_network_delegate), GetMetricsDataUseForwarder());
-
   globals_->host_resolver = CreateGlobalHostResolver(net_log_);
 
   std::map<std::string, std::string> network_quality_estimator_params;
@@ -618,8 +592,6 @@
       command_line.HasSwitch(switches::kIgnoreCertificateErrorsSPKIList));
 #endif
 
-  globals_->transport_security_state.reset(new net::TransportSecurityState());
-
   std::vector<scoped_refptr<const net::CTLogVerifier>> ct_logs(
       net::ct::CreateLogVerifiersForKnownLogs());
 
@@ -637,13 +609,7 @@
   // Register the ct_tree_tracker_ as observer for verified SCTs.
   globals_->cert_transparency_verifier->SetObserver(ct_tree_tracker_.get());
 
-  globals_->ct_policy_enforcer.reset(new net::CTPolicyEnforcer());
-  params_.ct_policy_enforcer = globals_->ct_policy_enforcer.get();
-
-  globals_->ssl_config_service = GetSSLConfigService();
-
   CreateDefaultAuthHandlerFactory();
-  globals_->http_server_properties.reset(new net::HttpServerPropertiesImpl());
   globals_->dns_probe_service.reset(new chrome_browser_net::DnsProbeService());
   globals_->host_mapping_rules.reset(new net::HostMappingRules());
   if (command_line.HasSwitch(switches::kHostRules)) {
@@ -653,8 +619,6 @@
     TRACE_EVENT_END0("startup", "IOThread::InitAsync:SetRulesFromString");
   }
   params_.host_mapping_rules = *globals_->host_mapping_rules.get();
-  globals_->http_user_agent_settings.reset(
-      new net::StaticHttpUserAgentSettings(std::string(), GetUserAgent()));
   globals_->enable_brotli =
       base::FeatureList::IsEnabled(features::kBrotliEncoding);
   params_.enable_token_binding =
@@ -874,13 +838,23 @@
   context->set_enable_brotli(globals_->enable_brotli);
   context->set_name("system");
 
-  context->set_http_user_agent_settings(
-      globals_->http_user_agent_settings.get());
-  context->set_network_delegate(globals_->system_network_delegate.get());
+  context_storage->set_http_user_agent_settings(
+      base::MakeUnique<net::StaticHttpUserAgentSettings>(std::string(),
+                                                         GetUserAgent()));
+  std::unique_ptr<ChromeNetworkDelegate> chrome_network_delegate(
+      new ChromeNetworkDelegate(extension_event_router_forwarder(),
+                                &system_enable_referrers_));
+  // By default, data usage is considered off the record.
+  chrome_network_delegate->set_data_use_aggregator(
+      globals_->data_use_aggregator.get(),
+      true /* is_data_usage_off_the_record */);
+  context_storage->set_network_delegate(
+      globals_->data_use_ascriber->CreateNetworkDelegate(
+          std::move(chrome_network_delegate), GetMetricsDataUseForwarder()));
   context->set_net_log(net_log_);
   context->set_host_resolver(globals_->host_resolver.get());
 
-  context->set_ssl_config_service(globals_->ssl_config_service.get());
+  context_storage->set_ssl_config_service(GetSSLConfigService());
   context->set_http_auth_handler_factory(
       globals_->http_auth_handler_factory.get());
 
@@ -894,20 +868,22 @@
   context->cookie_store()->SetChannelIDServiceID(
       context->channel_id_service()->GetUniqueID());
 
-  context->set_transport_security_state(
-      globals_->transport_security_state.get());
+  context_storage->set_transport_security_state(
+      base::MakeUnique<net::TransportSecurityState>());
 
-  context->set_http_server_properties(globals_->http_server_properties.get());
+  context_storage->set_http_server_properties(
+      base::MakeUnique<net::HttpServerPropertiesImpl>());
 
   context->set_cert_verifier(globals_->cert_verifier.get());
   context->set_cert_transparency_verifier(
       globals_->cert_transparency_verifier.get());
-  context->set_ct_policy_enforcer(globals_->ct_policy_enforcer.get());
+  context_storage->set_ct_policy_enforcer(
+      base::MakeUnique<net::CTPolicyEnforcer>());
 
   const base::CommandLine& command_line =
       *base::CommandLine::ForCurrentProcess();
   context_storage->set_proxy_service(ProxyServiceFactory::CreateProxyService(
-      net_log_, context, globals_->system_network_delegate.get(),
+      net_log_, context, context->network_delegate(),
       std::move(system_proxy_config_service_), command_line,
       WpadQuickCheckEnabled(), PacHttpsUrlStrippingEnabled()));
 
diff --git a/chrome/browser/io_thread.h b/chrome/browser/io_thread.h
index 2cf42f0..2a0b606 100644
--- a/chrome/browser/io_thread.h
+++ b/chrome/browser/io_thread.h
@@ -75,20 +75,15 @@
 }
 
 namespace net {
-class CTPolicyEnforcer;
 class CertVerifier;
 class CTLogVerifier;
 class HostMappingRules;
 class HostResolver;
 class HttpAuthPreferences;
-class HttpServerProperties;
-class HttpUserAgentSettings;
 class LoggingNetworkChangeObserver;
-class NetworkDelegate;
 class NetworkQualityEstimator;
 class ProxyConfigService;
 class SSLConfigService;
-class TransportSecurityState;
 class URLRequestContext;
 class URLRequestContextGetter;
 class URLRequestContextStorage;
@@ -143,20 +138,11 @@
     std::unique_ptr<chrome::android::ExternalDataUseObserver>
         external_data_use_observer;
 #endif  // defined(OS_ANDROID)
-    // The "system" NetworkDelegate, used for Profile-agnostic network events.
-    std::unique_ptr<net::NetworkDelegate> system_network_delegate;
     std::unique_ptr<net::HostResolver> host_resolver;
     std::unique_ptr<net::CertVerifier> cert_verifier;
-    // This TransportSecurityState doesn't load or save any state. It's only
-    // used to enforce pinning for system requests and will only use built-in
-    // pins.
-    std::unique_ptr<net::TransportSecurityState> transport_security_state;
     std::vector<scoped_refptr<const net::CTLogVerifier>> ct_logs;
     std::unique_ptr<net::CTVerifier> cert_transparency_verifier;
-    std::unique_ptr<net::CTPolicyEnforcer> ct_policy_enforcer;
-    scoped_refptr<net::SSLConfigService> ssl_config_service;
     std::unique_ptr<net::HttpAuthHandlerFactory> http_auth_handler_factory;
-    std::unique_ptr<net::HttpServerProperties> http_server_properties;
     std::unique_ptr<net::HttpAuthPreferences> http_auth_preferences;
     std::unique_ptr<net::URLRequestContextStorage>
         system_request_context_storage;
@@ -167,7 +153,6 @@
         extension_event_router_forwarder;
 #endif
     std::unique_ptr<net::HostMappingRules> host_mapping_rules;
-    std::unique_ptr<net::HttpUserAgentSettings> http_user_agent_settings;
     std::unique_ptr<net::NetworkQualityEstimator> network_quality_estimator;
     std::unique_ptr<
         net::NetworkQualityEstimator::RTTAndThroughputEstimatesObserver>
diff --git a/chrome/browser/media_router_resources.grdp b/chrome/browser/media_router_resources.grdp
index 76b9e00..01200e3 100644
--- a/chrome/browser/media_router_resources.grdp
+++ b/chrome/browser/media_router_resources.grdp
@@ -27,6 +27,12 @@
   <include name="IDR_MEDIA_ROUTER_SEARCH_HIGHLIGHTER_CSS" file="resources\media_router\elements\media_router_search_highlighter\media_router_search_highlighter.css" type="BINDATA" />
   <include name="IDR_MEDIA_ROUTER_SEARCH_HIGHLIGHTER_HTML" file="resources\media_router\elements\media_router_search_highlighter\media_router_search_highlighter.html" type="BINDATA" />
   <include name="IDR_MEDIA_ROUTER_SEARCH_HIGHLIGHTER_JS" file="resources\media_router\elements\media_router_search_highlighter\media_router_search_highlighter.js" type="BINDATA" />
+  <include name="IDR_ROUTE_CONTROLS_HTML" file="resources\media_router\elements\route_controls\route_controls.html" type="BINDATA" />
+  <include name="IDR_ROUTE_CONTROLS_CSS" file="resources\media_router\elements\route_controls\route_controls.css" type="BINDATA" />
+  <include name="IDR_ROUTE_CONTROLS_JS" file="resources\media_router\elements\route_controls\route_controls.js" type="BINDATA" />
+  <include name="IDR_EXTENSION_VIEW_WRAPPER_HTML" file="resources\media_router\elements\route_details\extension_view_wrapper\extension_view_wrapper.html" type="BINDATA" />
+  <include name="IDR_EXTENSION_VIEW_WRAPPER_CSS" file="resources\media_router\elements\route_details\extension_view_wrapper\extension_view_wrapper.css" type="BINDATA" />
+  <include name="IDR_EXTENSION_VIEW_WRAPPER_JS" file="resources\media_router\elements\route_details\extension_view_wrapper\extension_view_wrapper.js" type="BINDATA" />
   <include name="IDR_ROUTE_DETAILS_HTML" file="resources\media_router\elements\route_details\route_details.html" type="BINDATA" />
   <include name="IDR_ROUTE_DETAILS_CSS" file="resources\media_router\elements\route_details\route_details.css" type="BINDATA" />
   <include name="IDR_ROUTE_DETAILS_JS" file="resources\media_router\elements\route_details\route_details.js" type="BINDATA" />
diff --git a/chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.cc b/chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.cc
index 9be497e..519e2cb 100644
--- a/chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.cc
+++ b/chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.cc
@@ -40,6 +40,10 @@
 #if defined(OS_LINUX) && !defined(OS_CHROMEOS)
 #include <gnu/libc-version.h>
 
+#include "base/linux_util.h"
+#include "base/strings/string_split.h"
+#include "base/strings/string_util.h"
+#include "base/task_scheduler/post_task.h"
 #include "base/version.h"
 #if defined(USE_X11)
 #include "ui/base/x/x11_util.h"
@@ -60,6 +64,27 @@
 
 namespace {
 
+// These values are written to logs.  New enum values can be added, but existing
+// enums must never be renumbered or deleted and reused.
+enum UMALinuxDistro {
+  UMA_LINUX_DISTRO_UNKNOWN = 0,
+  UMA_LINUX_DISTRO_UBUNTU_OTHER = 1,
+  UMA_LINUX_DISTRO_UBUNTU_14_04 = 2,
+  UMA_LINUX_DISTRO_UBUNTU_16_04 = 3,
+  UMA_LINUX_DISTRO_UBUNTU_16_10 = 4,
+  UMA_LINUX_DISTRO_UBUNTU_17_04 = 5,
+  UMA_LINUX_DISTRO_DEBIAN_OTHER = 6,
+  UMA_LINUX_DISTRO_DEBIAN_8 = 7,
+  UMA_LINUX_DISTRO_OPENSUSE_OTHER = 8,
+  UMA_LINUX_DISTRO_OPENSUSE_LEAP_42_2 = 9,
+  UMA_LINUX_DISTRO_FEDORA_OTHER = 10,
+  UMA_LINUX_DISTRO_FEDORA_24 = 11,
+  UMA_LINUX_DISTRO_FEDORA_25 = 12,
+  // Note: Add new distros to the list above this line, and update LinuxDistro
+  // in tools/metrics/histograms/enums.xml accordingly.
+  UMA_LINUX_DISTRO_MAX
+};
+
 enum UMALinuxGlibcVersion {
   UMA_LINUX_GLIBC_NOT_PARSEABLE,
   UMA_LINUX_GLIBC_UNKNOWN,
@@ -163,7 +188,7 @@
   UMA_HISTOGRAM_ENUMERATION("OSX.BluetoothAvailability",
                             availability,
                             bluetooth_utility::BLUETOOTH_AVAILABILITY_COUNT);
-#endif   // defined(OS_MACOSX)
+#endif  // defined(OS_MACOSX)
 
   // Record whether Chrome is the default browser or not.
   shell_integration::DefaultWebClientState default_state =
@@ -172,6 +197,67 @@
                             shell_integration::NUM_DEFAULT_STATES);
 }
 
+#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
+void RecordLinuxDistro() {
+  UMALinuxDistro distro_result = UMA_LINUX_DISTRO_UNKNOWN;
+
+  std::vector<std::string> distro_tokens =
+      base::SplitString(base::GetLinuxDistro(), base::kWhitespaceASCII,
+                        base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY);
+  if (distro_tokens.size() > 0) {
+    if (distro_tokens[0] == "Ubuntu") {
+      // Format: Ubuntu YY.MM.P [LTS]
+      // We are only concerned with release (YY.MM) not the patch (P).
+      distro_result = UMA_LINUX_DISTRO_UBUNTU_OTHER;
+      if (distro_tokens.size() >= 3) {
+        base::Version version(distro_tokens[1]);
+        if (version.IsValid()) {
+          if (version.CompareToWildcardString("14.04.*") == 0) {
+            distro_result = UMA_LINUX_DISTRO_UBUNTU_14_04;
+          } else if (version.CompareToWildcardString("16.04.*") == 0) {
+            distro_result = UMA_LINUX_DISTRO_UBUNTU_16_04;
+          } else if (version.CompareToWildcardString("16.10.*") == 0) {
+            distro_result = UMA_LINUX_DISTRO_UBUNTU_16_10;
+          } else if (version.CompareToWildcardString("17.04.*") == 0) {
+            distro_result = UMA_LINUX_DISTRO_UBUNTU_17_04;
+          }
+        }
+      }
+    } else if (distro_tokens[0] == "openSUSE") {
+      // Format: openSUSE Leap RR.R
+      distro_result = UMA_LINUX_DISTRO_OPENSUSE_OTHER;
+      if (distro_tokens.size() >= 4 && distro_tokens[1] == "Leap" &&
+          distro_tokens[2] == "42.2") {
+        distro_result = UMA_LINUX_DISTRO_OPENSUSE_LEAP_42_2;
+      }
+    } else if (distro_tokens[0] == "Debian") {
+      // Format: Debian GNU/Linux R.P (<codename>)
+      // We are only concerned with the release (R) not the patch (P).
+      distro_result = UMA_LINUX_DISTRO_DEBIAN_OTHER;
+      if (distro_tokens.size() >= 3) {
+        base::Version version(distro_tokens[2]);
+        if (version.IsValid() && version.CompareToWildcardString("8.*")) {
+          distro_result = UMA_LINUX_DISTRO_DEBIAN_8;
+        }
+      }
+    } else if (distro_tokens[0] == "Fedora") {
+      // Format: Fedora release RR (<codename>)
+      distro_result = UMA_LINUX_DISTRO_FEDORA_OTHER;
+      if (distro_tokens.size() >= 3) {
+        if (distro_tokens[2] == "24") {
+          distro_result = UMA_LINUX_DISTRO_FEDORA_24;
+        } else if (distro_tokens[2] == "25") {
+          distro_result = UMA_LINUX_DISTRO_FEDORA_25;
+        }
+      }
+    }
+  }
+
+  UMA_HISTOGRAM_ENUMERATION("Linux.Distro", distro_result,
+                            UMA_LINUX_DISTRO_MAX);
+}
+#endif  // defined(OS_LINUX) && !defined(OS_CHROMEOS)
+
 void RecordLinuxGlibcVersion() {
 #if defined(OS_LINUX) && !defined(OS_CHROMEOS)
   base::Version version(gnu_get_libc_version());
@@ -382,6 +468,9 @@
   UMA_HISTOGRAM_ENUMERATION("Linux.WindowManager",
                             GetLinuxWindowManager(),
                             UMA_LINUX_WINDOW_MANAGER_COUNT);
+  base::PostTaskWithTraits(FROM_HERE,
+                           {base::MayBlock(), base::TaskPriority::BACKGROUND},
+                           base::BindOnce(&RecordLinuxDistro));
 #endif
 
 #if defined(USE_OZONE) || defined(USE_X11)
diff --git a/chrome/browser/metrics/chrome_browser_main_extra_parts_metrics_unittest.cc b/chrome/browser/metrics/chrome_browser_main_extra_parts_metrics_unittest.cc
index fceb167..5508b99 100644
--- a/chrome/browser/metrics/chrome_browser_main_extra_parts_metrics_unittest.cc
+++ b/chrome/browser/metrics/chrome_browser_main_extra_parts_metrics_unittest.cc
@@ -9,6 +9,7 @@
 #include "base/macros.h"
 #include "base/message_loop/message_loop.h"
 #include "base/test/histogram_tester.h"
+#include "base/test/scoped_task_environment.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/display/screen.h"
 #include "ui/display/test/test_screen.h"
@@ -32,8 +33,8 @@
   ui::test::DeviceDataManagerTestAPI device_data_manager_test_api_;
 
  private:
-  // Required by a ChromeBrowserMainExtraPartsMetrics test target.
-  base::MessageLoop message_loop_;
+  // Provides a message loop and allows the use of the task scheduler
+  base::test::ScopedTaskEnvironment scoped_task_environment_;
 
   // Dummy screen required by a ChromeBrowserMainExtraPartsMetrics test target.
   display::test::TestScreen test_screen_;
diff --git a/chrome/browser/net/spdyproxy/OWNERS b/chrome/browser/net/spdyproxy/OWNERS
index 2783dea..be748d62 100644
--- a/chrome/browser/net/spdyproxy/OWNERS
+++ b/chrome/browser/net/spdyproxy/OWNERS
@@ -1 +1,3 @@
 file://components/data_reduction_proxy/OWNERS
+
+# COMPONENT: Internals>Network>DataProxy
diff --git a/chrome/browser/net/spdyproxy/chrome_data_use_group.cc b/chrome/browser/net/spdyproxy/chrome_data_use_group.cc
deleted file mode 100644
index 40c69bde..0000000
--- a/chrome/browser/net/spdyproxy/chrome_data_use_group.cc
+++ /dev/null
@@ -1,67 +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 "chrome/browser/net/spdyproxy/chrome_data_use_group.h"
-
-#include "base/bind.h"
-#include "content/public/browser/browser_thread.h"
-#include "content/public/browser/render_frame_host.h"
-#include "content/public/browser/resource_request_info.h"
-#include "content/public/browser/web_contents.h"
-#include "net/url_request/url_request.h"
-
-ChromeDataUseGroup::ChromeDataUseGroup(const net::URLRequest* request)
-    : initialized_(false),
-      initilized_on_ui_thread_(false),
-      render_process_id_(-1),
-      render_frame_id_(-1),
-      has_valid_render_frame_id_(false),
-      url_(request->url()) {
-  DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
-
-  has_valid_render_frame_id_ =
-      content::ResourceRequestInfo::GetRenderFrameForRequest(
-          request, &render_process_id_, &render_frame_id_);
-}
-
-ChromeDataUseGroup::~ChromeDataUseGroup() {}
-
-std::string ChromeDataUseGroup::GetHostname() {
-  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
-
-  if (!initilized_on_ui_thread_)
-    InitializeOnUIThread();
-
-  DCHECK(initilized_on_ui_thread_);
-
-  return url_.HostNoBrackets();
-}
-
-void ChromeDataUseGroup::Initialize() {
-  DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
-  if (initialized_)
-    return;
-
-  initialized_ = true;
-
-  content::BrowserThread::PostTask(
-      content::BrowserThread::UI, FROM_HERE,
-      base::BindOnce(&ChromeDataUseGroup::InitializeOnUIThread, this));
-}
-
-void ChromeDataUseGroup::InitializeOnUIThread() {
-  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
-  if (initilized_on_ui_thread_)
-    return;
-
-  initilized_on_ui_thread_ = true;
-
-  if (!has_valid_render_frame_id_)
-    return;
-
-  content::WebContents* tab = content::WebContents::FromRenderFrameHost(
-      content::RenderFrameHost::FromID(render_process_id_, render_frame_id_));
-  if (tab)
-    url_ = tab->GetVisibleURL();
-}
diff --git a/chrome/browser/net/spdyproxy/chrome_data_use_group.h b/chrome/browser/net/spdyproxy/chrome_data_use_group.h
deleted file mode 100644
index e19cf8b7..0000000
--- a/chrome/browser/net/spdyproxy/chrome_data_use_group.h
+++ /dev/null
@@ -1,83 +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.
-
-#ifndef CHROME_BROWSER_NET_SPDYPROXY_CHROME_DATA_USE_GROUP_H_
-#define CHROME_BROWSER_NET_SPDYPROXY_CHROME_DATA_USE_GROUP_H_
-
-#include <string>
-
-#include "components/data_reduction_proxy/core/browser/data_use_group.h"
-#include "url/gurl.h"
-
-namespace net {
-class URLRequest;
-}
-
-// Chrome implementation of |DataUseGroup|. Instances are created on the
-// IO thread but can be destroyed on any thread. The class is reference counted,
-// because its lifetime is determined by both the frames and the URL requests
-// whose data use is being tracked. Logically, a ChromeDataUseGroup would be
-// owned by its corresponding frame, but outstanding requests may incur data use
-// even after the frame is destroyed. This class is not thread safe and each
-// method and field can only be accessed on its designated thread.
-class ChromeDataUseGroup : public data_reduction_proxy::DataUseGroup {
- public:
-  // Creates a new instance for the given URL request. Typically this will be
-  // the main frame URL request, but any URL request from the same group can be
-  // used. This constructor can be called at any stage in the life cycle of
-  // the URL request after construction by |resource_dispatcher_host_impl|.
-  // Instances can only be created on the IO thread.
-  explicit ChromeDataUseGroup(const net::URLRequest* request);
-
-  // Chrome implementation of GetHostname(). This method must be called on the
-  // UI thread.
-  std::string GetHostname() override;
-
-  // Initializes the object. This method will fetch the URL to ascribe data to
-  // from the UI thread if it has not already been fetched. This method must be
-  // called on the IO thread.
-  void Initialize() override;
-
- protected:
-  friend class base::RefCountedThreadSafe<ChromeDataUseGroup>;
-
-  ~ChromeDataUseGroup() override;
-
- private:
-  // Fetches the URL to ascribe data to if it has not already been fetched. This
-  // method must be called on the IO thread.
-  void InitializeOnUIThread();
-
-  // Fields accessed on the IO thread only:
-
-  // Tracks whether Initialized() has been called.
-  bool initialized_;
-
-  // Fields accessed on UI thread only:
-
-  // Tracks whether InitializeOnUIThread has been called.
-  bool initilized_on_ui_thread_;
-
-  // IDs to identify the |RenderFrameHost| that ascribes its data use to this
-  // instance.
-  int render_process_id_;
-  int render_frame_id_;
-
-  // Whether the |RenderFrameHost| ids above are valid. This field will only
-  // be true if requests are made in the context of a tab. It will be false
-  // for requests not initiated from within a |RenderFrameHost|. e.g.:
-  // requests initiated by service workers. This information is not invalidated
-  // when the |RenderFrameHost| is destroyed but rather used to match requests
-  // to the render frames they belonged to.
-  bool has_valid_render_frame_id_;
-
-  // URL to ascribe data use. For page loads, this is the main frame URL. For
-  // requests that are not made from a |RenderFrameHost| this will be the
-  // request URL.
-  GURL url_;
-
-  DISALLOW_COPY_AND_ASSIGN(ChromeDataUseGroup);
-};
-
-#endif  // CHROME_BROWSER_NET_SPDYPROXY_CHROME_DATA_USE_GROUP_H_
diff --git a/chrome/browser/net/spdyproxy/chrome_data_use_group_browsertest.cc b/chrome/browser/net/spdyproxy/chrome_data_use_group_browsertest.cc
deleted file mode 100644
index 649fea9..0000000
--- a/chrome/browser/net/spdyproxy/chrome_data_use_group_browsertest.cc
+++ /dev/null
@@ -1,109 +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 "chrome/browser/net/spdyproxy/chrome_data_use_group.h"
-
-#include "base/memory/ptr_util.h"
-#include "chrome/browser/browser_process.h"
-#include "chrome/browser/io_thread.h"
-#include "chrome/test/base/in_process_browser_test.h"
-#include "chrome/test/base/ui_test_utils.h"
-#include "content/public/browser/browser_thread.h"
-#include "content/public/browser/resource_request_info.h"
-#include "content/public/test/test_utils.h"
-#include "net/base/network_delegate.h"
-#include "net/test/url_request/url_request_mock_http_job.h"
-#include "net/url_request/url_request.h"
-#include "net/url_request/url_request_filter.h"
-#include "net/url_request/url_request_interceptor.h"
-#include "net/url_request/url_request_job.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-// Intercepter to confirm that a render process ID and a render frame ID are
-// set on URL requests.
-class ConfirmFrameIdInterceptor : public net::URLRequestInterceptor {
- public:
-  ConfirmFrameIdInterceptor() : did_intercept_request_(false) {
-  }
-
-  net::URLRequestJob* MaybeInterceptRequest(
-      net::URLRequest* request,
-      net::NetworkDelegate* network_delegate) const override {
-    did_intercept_request_ = true;
-
-    int render_process_id;
-    int render_frame_id;
-    EXPECT_TRUE(content::ResourceRequestInfo::GetRenderFrameForRequest(
-        request, &render_process_id, &render_frame_id));
-    return nullptr;
-  }
-
-  bool did_intercept_request() {
-    return did_intercept_request_;
-  }
-
- private:
-  mutable bool did_intercept_request_;
-};
-
-class ChromeDataUseGroupBrowserTest : public InProcessBrowserTest {
- public:
-  ChromeDataUseGroupBrowserTest() : interceptor_(nullptr) {
-  }
-
-  void SetUpOnMainThread() override {
-    url_ = net::URLRequestMockHTTPJob::GetMockUrl("index.html");
-
-    content::BrowserThread::PostTask(
-        content::BrowserThread::IO, FROM_HERE,
-        base::BindOnce(&ChromeDataUseGroupBrowserTest::SetUpOnIOThread,
-                       base::Unretained(this)));
-    RunAllPendingInMessageLoop(content::BrowserThread::IO);
-  }
-
-  void TearDownOnMainThread() override {
-    content::BrowserThread::PostTask(
-        content::BrowserThread::IO, FROM_HERE,
-        base::BindOnce(&ChromeDataUseGroupBrowserTest::TearDownOnIOThread,
-                       base::Unretained(this)));
-    RunAllPendingInMessageLoop(content::BrowserThread::IO);
-  }
-
-  void SetUpOnIOThread() {
-    DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
-
-    interceptor_ = new ConfirmFrameIdInterceptor();
-    net::URLRequestFilter::GetInstance()->AddUrlInterceptor(url_,
-        base::WrapUnique(interceptor_));
-  }
-
-  void TearDownOnIOThread() {
-    DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
-
-    interceptor_ = nullptr;
-    net::URLRequestFilter::GetInstance()->RemoveUrlHandler(url_);
-  }
-
- protected:
-  GURL& url() {
-    return url_;
-  }
-
-  bool did_intercept_request() {
-    return interceptor_->did_intercept_request();
-  }
-
- private:
-  ConfirmFrameIdInterceptor* interceptor_;
-  GURL url_;
-};
-
-// Confirms that URL requests have a valid |render_process_id| and
-// |render_frame_id| set on them before they begin. This protects against
-// any regressions that may be caused as we move to PlzNavigate.
-IN_PROC_BROWSER_TEST_F(ChromeDataUseGroupBrowserTest, ExistsFrameId) {
-  EXPECT_FALSE(did_intercept_request());
-  ui_test_utils::NavigateToURL(browser(), url());
-  EXPECT_TRUE(did_intercept_request());
-}
diff --git a/chrome/browser/net/spdyproxy/chrome_data_use_group_provider.cc b/chrome/browser/net/spdyproxy/chrome_data_use_group_provider.cc
deleted file mode 100644
index 6d962f7c..0000000
--- a/chrome/browser/net/spdyproxy/chrome_data_use_group_provider.cc
+++ /dev/null
@@ -1,47 +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 "chrome/browser/net/spdyproxy/chrome_data_use_group_provider.h"
-
-#include <stdint.h>
-
-#include "chrome/browser/net/spdyproxy/chrome_data_use_group.h"
-#include "content/public/browser/browser_thread.h"
-#include "content/public/browser/resource_request_info.h"
-
-namespace net {
-class URLRequest;
-}  // namespace net
-
-ChromeDataUseGroupProvider::ChromeDataUseGroupProvider()
-    : // Size of the map is somewhat arbitrary. A larger size reduces the
-      // chance of not finding an existing instance of |DataUseGroup| at the
-      // cost of an increased memory footprint.
-      render_frame_id_data_use_group_map(100) {}
-
-ChromeDataUseGroupProvider::~ChromeDataUseGroupProvider() {}
-
-scoped_refptr<data_reduction_proxy::DataUseGroup>
-ChromeDataUseGroupProvider::GetDataUseGroup(const net::URLRequest* request) {
-  DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
-
-  int render_process_id, render_frame_id;
-  if (!content::ResourceRequestInfo::GetRenderFrameForRequest(
-      request, &render_process_id, &render_frame_id)) {
-    return make_scoped_refptr(new ChromeDataUseGroup(request));
-  }
-
-  RenderFrameHostID key(render_process_id, render_frame_id);
-  auto it = render_frame_id_data_use_group_map.Get(key);
-
-  if (it != render_frame_id_data_use_group_map.end()) {
-    return it->second;
-  }
-
-  scoped_refptr<data_reduction_proxy::DataUseGroup> source =
-      new ChromeDataUseGroup(request);
-  render_frame_id_data_use_group_map.Put(key, source);
-
-  return source;
-}
diff --git a/chrome/browser/net/spdyproxy/chrome_data_use_group_provider.h b/chrome/browser/net/spdyproxy/chrome_data_use_group_provider.h
deleted file mode 100644
index 21abb54..0000000
--- a/chrome/browser/net/spdyproxy/chrome_data_use_group_provider.h
+++ /dev/null
@@ -1,52 +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.
-
-#ifndef CHROME_BROWSER_NET_SPDYPROXY_CHROME_DATA_USE_GROUP_PROVIDER_H_
-#define CHROME_BROWSER_NET_SPDYPROXY_CHROME_DATA_USE_GROUP_PROVIDER_H_
-
-#include <utility>
-
-#include "base/containers/mru_cache.h"
-#include "base/memory/ref_counted.h"
-#include "components/data_reduction_proxy/core/browser/data_use_group.h"
-#include "components/data_reduction_proxy/core/browser/data_use_group_provider.h"
-
-namespace net {
-class URLRequest;
-}
-
-class ChromeDataUseGroupProvider
-    : public data_reduction_proxy::DataUseGroupProvider {
- public:
-  // Constructor for Chrome implementation of |DataUseGroupProvider|.
-  ChromeDataUseGroupProvider();
-
-  // Destructor for Chrome implementation of |DataUseGroupProvider.
-  ~ChromeDataUseGroupProvider();
-
-  // Returns the |DataUseGroup| that tracks data use that is keyed on the given
-  // URL request.
-  // This method does not currently guarantee that a single |DataUseGroup|
-  // instance is created for a page load. However, instances initiated from the
-  // same page will return the same value from |getHostname()|, which is the
-  // only functionality currently supported by this class. This is sufficient
-  // for the current use case of ascribing data use to a hostname.
-  // TODO(kundaji): Enforce that a unique instance of |DataUseGroup| is
-  // created for each data source that will be made visible to the end user.
-  scoped_refptr<data_reduction_proxy::DataUseGroup> GetDataUseGroup(
-      const net::URLRequest* request) override;
-
- private:
-  typedef std::pair<int, int> RenderFrameHostID;
-
-  // Map of <|render_process_id|, |render_frame_id|> to |DataUseGroup| on the
-  // IO thread. This map does not contain all active |DataUseGroup|
-  // instances, but only the most recent ones. This map provides access to
-  // |DataUseGroup| instances for frames that might have already been destroyed.
-  base::MRUCache<RenderFrameHostID,
-                 scoped_refptr<data_reduction_proxy::DataUseGroup>>
-      render_frame_id_data_use_group_map;
-};
-
-#endif  // CHROME_BROWSER_NET_SPDYPROXY_CHROME_DATA_USE_GROUP_PROVIDER_H_
diff --git a/chrome/browser/net/spdyproxy/chrome_data_use_group_provider_unittest.cc b/chrome/browser/net/spdyproxy/chrome_data_use_group_provider_unittest.cc
deleted file mode 100644
index 8a36b1f..0000000
--- a/chrome/browser/net/spdyproxy/chrome_data_use_group_provider_unittest.cc
+++ /dev/null
@@ -1,75 +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 "chrome/browser/net/spdyproxy/chrome_data_use_group_provider.h"
-
-#include <memory>
-
-#include "base/memory/ref_counted.h"
-#include "chrome/browser/net/spdyproxy/chrome_data_use_group.h"
-#include "content/public/browser/resource_request_info.h"
-#include "content/public/common/previews_state.h"
-#include "content/public/test/test_browser_thread_bundle.h"
-#include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
-#include "net/url_request/url_request.h"
-#include "net/url_request/url_request_test_util.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "url/gurl.h"
-
-class ChromeDataUseGroupProviderTest : public testing::Test {
- protected:
-  ChromeDataUseGroupProvider* data_use_group_provider() {
-    return &data_use_group_provider_;
-  }
-
-  std::unique_ptr<net::URLRequest> CreateRequestForFrame(int render_process_id,
-                                                         int render_frame_id) {
-    std::unique_ptr<net::URLRequest> request =
-        context_.CreateRequest(GURL("http://foo.com/"), net::IDLE,
-                               &test_delegate_, TRAFFIC_ANNOTATION_FOR_TESTS);
-
-    content::ResourceRequestInfo::AllocateForTesting(
-        request.get(), content::RESOURCE_TYPE_MAIN_FRAME,
-        /*ResourceContext=*/nullptr, render_process_id, /*render_view_id=*/-1,
-        render_frame_id, /*is_main_frame=*/true,
-        /*parent_is_main_frame=*/false,
-        /*allow_download=*/true,
-        /*is_async=*/true, content::PREVIEWS_OFF);
-
-    return request;
-  }
-
- private:
-  // |thread_bundle_| must be the first field to ensure that threads are
-  // constructed first and destroyed last.
-  content::TestBrowserThreadBundle thread_bundle_;
-
-  net::TestURLRequestContext context_;
-  net::TestDelegate test_delegate_;
-  ChromeDataUseGroupProvider data_use_group_provider_;
-};
-
-TEST_F(ChromeDataUseGroupProviderTest, SameMainFrame) {
-  std::unique_ptr<net::URLRequest> request = CreateRequestForFrame(1, 1);
-  scoped_refptr<data_reduction_proxy::DataUseGroup> group1 =
-      data_use_group_provider()->GetDataUseGroup(request.get());
-
-  request = CreateRequestForFrame(1, 1);
-  scoped_refptr<data_reduction_proxy::DataUseGroup> group2 =
-      data_use_group_provider()->GetDataUseGroup(request.get());
-
-  EXPECT_EQ(group1, group2);
-}
-
-TEST_F(ChromeDataUseGroupProviderTest, DifferentMainFrame) {
-  std::unique_ptr<net::URLRequest> request = CreateRequestForFrame(1, 1);
-  scoped_refptr<data_reduction_proxy::DataUseGroup> group1 =
-      data_use_group_provider()->GetDataUseGroup(request.get());
-
-  request = CreateRequestForFrame(2, 2);
-  scoped_refptr<data_reduction_proxy::DataUseGroup> group2 =
-      data_use_group_provider()->GetDataUseGroup(request.get());
-
-  EXPECT_NE(group1, group2);
-}
diff --git a/chrome/browser/net/spdyproxy/chrome_data_use_group_unittest.cc b/chrome/browser/net/spdyproxy/chrome_data_use_group_unittest.cc
deleted file mode 100644
index af86885..0000000
--- a/chrome/browser/net/spdyproxy/chrome_data_use_group_unittest.cc
+++ /dev/null
@@ -1,59 +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 "chrome/browser/net/spdyproxy/chrome_data_use_group.h"
-
-#include <memory>
-
-#include "base/run_loop.h"
-#include "content/public/browser/resource_request_info.h"
-#include "content/public/common/previews_state.h"
-#include "content/public/test/test_browser_thread_bundle.h"
-#include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
-#include "net/url_request/url_request.h"
-#include "net/url_request/url_request_test_util.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "url/gurl.h"
-
-class ChromeDataUseGroupTest : public testing::Test {
- protected:
-  void SetUp() override {
-    std::unique_ptr<net::URLRequest> request =
-        context_.CreateRequest(GURL("http://foo.com/index.html"), net::IDLE,
-                               &test_delegate_, TRAFFIC_ANNOTATION_FOR_TESTS);
-
-    content::ResourceRequestInfo::AllocateForTesting(
-        request.get(), content::RESOURCE_TYPE_MAIN_FRAME, nullptr,
-        /*render_process_id=*/1,
-        /*render_view_id=*/-1,
-        /*render_frame_id=*/1,
-        /*is_main_frame=*/true,
-        /*parent_is_main_frame=*/false,
-        /*allow_download=*/true,
-        /*is_async=*/true, content::PREVIEWS_OFF);
-
-    data_use_group_ = new ChromeDataUseGroup(request.get());
-    base::RunLoop().RunUntilIdle();
-  }
-
-  ChromeDataUseGroup* data_use_group() { return data_use_group_.get(); }
-
- private:
-  content::TestBrowserThreadBundle thread_bundle_;
-
-  net::TestURLRequestContext context_;
-  net::TestDelegate test_delegate_;
-  scoped_refptr<ChromeDataUseGroup> data_use_group_;
-};
-
-TEST_F(ChromeDataUseGroupTest, GetHostName) {
-  EXPECT_EQ("foo.com", data_use_group()->GetHostname());
-}
-
-TEST_F(ChromeDataUseGroupTest, GetHostNameExplicitInitialize) {
-  data_use_group()->Initialize();
-  base::RunLoop().RunUntilIdle();
-
-  EXPECT_EQ("foo.com", data_use_group()->GetHostname());
-}
diff --git a/chrome/browser/net/spdyproxy/data_reduction_proxy_chrome_io_data.cc b/chrome/browser/net/spdyproxy/data_reduction_proxy_chrome_io_data.cc
index b06934a8..04cd773 100644
--- a/chrome/browser/net/spdyproxy/data_reduction_proxy_chrome_io_data.cc
+++ b/chrome/browser/net/spdyproxy/data_reduction_proxy_chrome_io_data.cc
@@ -9,7 +9,6 @@
 #include "base/bind.h"
 #include "base/memory/ptr_util.h"
 #include "build/build_config.h"
-#include "chrome/browser/net/spdyproxy/chrome_data_use_group_provider.h"
 #include "chrome/browser/net/spdyproxy/data_reduction_proxy_chrome_settings.h"
 #include "chrome/browser/previews/previews_infobar_delegate.h"
 #include "chrome/browser/previews/previews_service.h"
@@ -114,8 +113,6 @@
   data_reduction_proxy_io_data->set_lofi_ui_service(
       base::MakeUnique<data_reduction_proxy::ContentLoFiUIService>(
           ui_task_runner, base::Bind(&OnLoFiResponseReceivedOnUI)));
-  data_reduction_proxy_io_data->set_data_usage_source_provider(
-      base::MakeUnique<ChromeDataUseGroupProvider>());
 
   return data_reduction_proxy_io_data;
 }
diff --git a/chrome/browser/offline_pages/android/DEPS b/chrome/browser/offline_pages/android/DEPS
index a0a66cf..1f69ef6 100644
--- a/chrome/browser/offline_pages/android/DEPS
+++ b/chrome/browser/offline_pages/android/DEPS
@@ -2,6 +2,6 @@
   # This folder contains Android-specific code.
   "+base/android",
   # c/b/a folder will eventually be refactored into
-  # platform-inependent code and Android-specific, and will go away.
+  # platform-independent code and Android-specific, and will go away.
   "!chrome/browser/android",
 ]
diff --git a/chrome/browser/profiles/off_the_record_profile_io_data.cc b/chrome/browser/profiles/off_the_record_profile_io_data.cc
index f9d8e9d..c41e80c 100644
--- a/chrome/browser/profiles/off_the_record_profile_io_data.cc
+++ b/chrome/browser/profiles/off_the_record_profile_io_data.cc
@@ -208,7 +208,7 @@
   main_context->set_cert_transparency_verifier(
       io_thread_globals->cert_transparency_verifier.get());
   main_context->set_ct_policy_enforcer(
-      io_thread_globals->ct_policy_enforcer.get());
+      io_thread_globals->system_request_context->ct_policy_enforcer());
 
   main_context->set_net_log(io_thread->net_log());
 
diff --git a/chrome/browser/profiles/profile_impl_io_data.cc b/chrome/browser/profiles/profile_impl_io_data.cc
index b72ea5c..7a039d6 100644
--- a/chrome/browser/profiles/profile_impl_io_data.cc
+++ b/chrome/browser/profiles/profile_impl_io_data.cc
@@ -479,7 +479,7 @@
 
   main_context->set_transport_security_state(transport_security_state());
   main_context->set_ct_policy_enforcer(
-      io_thread_globals->ct_policy_enforcer.get());
+      io_thread_globals->system_request_context->ct_policy_enforcer());
 
   main_context->set_net_log(io_thread->net_log());
 
@@ -546,6 +546,8 @@
   request_interceptors.insert(
       request_interceptors.begin(),
       data_reduction_proxy_io_data()->CreateInterceptor());
+  data_reduction_proxy_io_data()->SetDataUseAscriber(
+      io_thread_globals->data_use_ascriber.get());
   main_context_storage->set_job_factory(SetUpJobFactoryDefaults(
       std::move(main_job_factory), std::move(request_interceptors),
       std::move(profile_params->protocol_handler_interceptor),
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_th.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_th.xtb
index f2469fa..bb74f10 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_th.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_th.xtb
@@ -518,7 +518,7 @@
 <translation id="5623842676595125836">บันทึก</translation>
 <translation id="5628125749885014029">h4</translation>
 <translation id="5637871198229500030">ไม่มีตารางก่อนหน้า</translation>
-<translation id="5653397561111110475">ใช้คุณลักษณะการเข้าถึงบนหน้าจอสัมผัสของ Chromebook</translation>
+<translation id="5653397561111110475">ใช้ฟีเจอร์การเข้าถึงบนหน้าจอสัมผัสของ Chromebook</translation>
 <translation id="5655682562155942719">คำสั่งข้าม</translation>
 <translation id="56637627897541303">พื้นที่ข้อความ</translation>
 <translation id="5678161956734658133">mled</translation>
diff --git a/chrome/browser/resources/chromeos/keyboard_overlay.js b/chrome/browser/resources/chromeos/keyboard_overlay.js
index 86a3ab0..38cdf54e 100644
--- a/chrome/browser/resources/chromeos/keyboard_overlay.js
+++ b/chrome/browser/resources/chromeos/keyboard_overlay.js
@@ -227,14 +227,6 @@
     delete shortcutDataCache['0<>CTRL<>SHIFT'];
   }
 
-  if (!loadTimeData.getBoolean('backspaceGoesBackFeatureEnabled')) {
-    // If the "backspace key goes back" experiment is not enabled, then we
-    // clear the shortcuts for Backspace and Shift+Backspace to go back or
-    // forward respectively.
-    delete shortcutDataCache['backspace'];
-    delete shortcutDataCache['backspace<>SHIFT'];
-  }
-
   return shortcutDataCache;
 }
 
diff --git a/chrome/browser/resources/chromeos/keyboard_overlay_data.js b/chrome/browser/resources/chromeos/keyboard_overlay_data.js
index 352b929..40095ad3 100644
--- a/chrome/browser/resources/chromeos/keyboard_overlay_data.js
+++ b/chrome/browser/resources/chromeos/keyboard_overlay_data.js
@@ -15811,12 +15811,10 @@
     'b<>CTRL<>SHIFT': 'keyboardOverlayToggleBookmarkBar',
     'back<>CTRL': 'keyboardOverlayFocusPreviousPane',
     'back<>SEARCH': 'keyboardOverlayF1',
-    'backspace': 'keyboardOverlayGoBack',
     'backspace<>ALT': 'keyboardOverlayDelete',
     'backspace<>CTRL': 'keyboardOverlayDeleteWord',
     'backspace<>CTRL<>SHIFT': 'keyboardOverlayClearBrowsingDataDialog',
     'backspace<>SEARCH': 'keyboardOverlayDelete',
-    'backspace<>SHIFT': 'keyboardOverlayGoForward',
     'bright down<>ALT': 'keyboardOverlayDecreaseKeyBrightness',
     'bright down<>ALT<>CTRL': 'keyboardOverlayMagnifierDecreaseZoom',
     'bright down<>SEARCH': 'keyboardOverlayF6',
diff --git a/chrome/browser/resources/local_ntp/local_ntp.html b/chrome/browser/resources/local_ntp/local_ntp.html
index 1ea6c0bd..43cdc3e 100644
--- a/chrome/browser/resources/local_ntp/local_ntp.html
+++ b/chrome/browser/resources/local_ntp/local_ntp.html
@@ -9,7 +9,7 @@
   <script src="chrome-search://local-ntp/config.js"
       integrity="{{CONFIG_INTEGRITY}}"></script>
   <script src="chrome-search://local-ntp/local-ntp.js"
-      integrity="sha256-yAvSu2Dl9rlQTpQn8P1hcE5GUFQVGbuCMHypwtN6uDg="></script>
+      integrity="sha256-//Ntxa12Vzvs6oUFThZ7SAu9dDxHfqgUeSTOrQKqlgE="></script>
   <meta charset="utf-8">
   <meta name="google" value="notranslate">
 </head>
diff --git a/chrome/browser/resources/local_ntp/local_ntp.js b/chrome/browser/resources/local_ntp/local_ntp.js
index ec10dfc..171ba98 100644
--- a/chrome/browser/resources/local_ntp/local_ntp.js
+++ b/chrome/browser/resources/local_ntp/local_ntp.js
@@ -5,6 +5,8 @@
 
 // NOTE: If you modify this file, you also have to change its hash in
 // local_ntp.html and in LocalNtpSource::GetContentSecurityPolicyScriptSrc.
+// To calculate the sum execute the following command
+// sha256sum local_ntp.js | cut -d " " -f 1 | xxd -r -p | base64
 
 
 /**
@@ -637,7 +639,7 @@
     document.body.appendChild(ogScript);
     ogScript.onload = function() {
       injectOneGoogleBar(og.html, og.end_of_body_html);
-    }
+    };
   } else {
     document.body.classList.add(CLASSES.NON_GOOGLE_PAGE);
   }
@@ -717,9 +719,9 @@
         endOfBodyScript.src =
             'chrome-search://local-ntp/one-google/end-of-body.js';
         document.body.appendChild(endOfBodyScript);
-      }
-    }
-  }
+      };
+    };
+  };
 }
 
 
diff --git a/chrome/browser/resources/local_ntp/most_visited_single.js b/chrome/browser/resources/local_ntp/most_visited_single.js
index 55f3df4e..fe7cc9e 100644
--- a/chrome/browser/resources/local_ntp/most_visited_single.js
+++ b/chrome/browser/resources/local_ntp/most_visited_single.js
@@ -196,7 +196,7 @@
   logEvent(LOG_TYPE.NTP_ALL_TILES_RECEIVED);
   countLoad();
   hideOverflowTiles(info);
-}
+};
 
 
 /**
diff --git a/chrome/browser/resources/media_router/compiled_resources2.gyp b/chrome/browser/resources/media_router/compiled_resources2.gyp
index b6af24ba..076bcae7 100644
--- a/chrome/browser/resources/media_router/compiled_resources2.gyp
+++ b/chrome/browser/resources/media_router/compiled_resources2.gyp
@@ -18,6 +18,14 @@
       'includes': ['../../../../third_party/closure_compiler/compile_js2.gypi'],
     },
     {
+      'target_name': 'media_router_browser_api',
+      'dependencies': [
+        'media_router_data',
+        '<(EXTERNS_GYP):chrome_send',
+      ],
+      'includes': ['../../../../third_party/closure_compiler/compile_js2.gypi'],
+    },
+    {
       'target_name': 'media_router_data',
       'dependencies': [
         '<(DEPTH)/ui/webui/resources/js/compiled_resources2.gyp:cr',
@@ -28,9 +36,10 @@
     {
       'target_name': 'media_router_ui_interface',
       'dependencies': [
-        '<(EXTERNS_GYP):chrome_send',
+        'media_router_browser_api',
         'elements/media_router_header/compiled_resources2.gyp:media_router_header',
-        'elements/media_router_container/compiled_resources2.gyp:media_router_container',
+        'elements/media_router_container/compiled_resources2.gyp:media_router_container_interface',
+        'elements/route_controls/compiled_resources2.gyp:route_controls_interface',
       ],
       'includes': ['../../../../third_party/closure_compiler/compile_js2.gypi'],
     },
diff --git a/chrome/browser/resources/media_router/elements/media_router_container/compiled_resources2.gyp b/chrome/browser/resources/media_router/elements/media_router_container/compiled_resources2.gyp
index 967e3bb..d1681804f 100644
--- a/chrome/browser/resources/media_router/elements/media_router_container/compiled_resources2.gyp
+++ b/chrome/browser/resources/media_router/elements/media_router_container/compiled_resources2.gyp
@@ -8,6 +8,7 @@
       'dependencies': [
         'pseudo_sink_search_state',
         '../../compiled_resources2.gyp:externs',
+        '../../compiled_resources2.gyp:media_router_browser_api',
         '../../compiled_resources2.gyp:media_router_data',
         '../../elements/issue_banner/compiled_resources2.gyp:issue_banner',
         '../../elements/media_router_header/compiled_resources2.gyp:media_router_header',
@@ -17,6 +18,13 @@
       'includes': ['../../../../../../third_party/closure_compiler/compile_js2.gypi'],
     },
     {
+      'target_name': 'media_router_container_interface',
+      'dependencies': [
+        '../../compiled_resources2.gyp:media_router_data',
+      ],
+      'includes': ['../../../../../../third_party/closure_compiler/compile_js2.gypi'],
+    },
+    {
       'target_name': 'pseudo_sink_search_state',
       'dependencies': [
         '../../compiled_resources2.gyp:media_router_data',
diff --git a/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.html b/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.html
index c3d6c60..b6af91a 100644
--- a/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.html
+++ b/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.html
@@ -91,7 +91,8 @@
             is-any-sink-currently-launching=
                 "[[computeIsLaunching_(currentLaunchingSinkId_)]]"
             on-change-route-source-click="onChangeRouteSourceClick_"
-            on-close-route="onCloseRoute_">
+            on-close-route="onCloseRoute_"
+            use-web-ui-route-controls="[[useWebUiRouteControls]]">
         </route-details>
       </template>
       <div id="sink-list-view"
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 c4102922..4163d78 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
@@ -2,8 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-// This Polymer element contains the entire media router interface. It handles
-// hiding and showing specific components.
+/**
+ * This Polymer element contains the entire media router interface. It handles
+ * hiding and showing specific components.
+ * @implements {MediaRouterContainerInterface}
+ */
 Polymer({
   is: 'media-router-container',
 
@@ -387,6 +390,16 @@
     },
 
     /**
+     * Whether the WebUI route controls should be shown instead of the
+     * extensionview in the route details view.
+     * @type {boolean}
+     */
+    useWebUiRouteControls: {
+      type: Boolean,
+      value: false,
+    },
+
+    /**
      * Whether the user has explicitly selected a cast mode.
      * @private {boolean}
      */
@@ -864,8 +877,8 @@
    * @return {boolean} Whether the search results list should be hidden.
    * @private
    */
-  computeSearchResultsHidden_: function(searchResultsToShow,
-                                        isSearchListHidden) {
+  computeSearchResultsHidden_: function(
+      searchResultsToShow, isSearchListHidden) {
     return isSearchListHidden || searchResultsToShow.length == 0;
   },
 
@@ -1081,14 +1094,22 @@
    * filter action here.
    * @param {?media_router.MediaRouterView} currentView The current view of the
    *     dialog.
+   * @param {?media_router.MediaRouterView} previousView The previous
+   *     |currentView|.
    * @private
    */
-  currentViewChanged_: function(currentView) {
+  currentViewChanged_: function(currentView, previousView) {
     if (currentView == media_router.MediaRouterView.FILTER) {
       this.reportFilterOnInput_ = true;
       this.maybeReportFilter_();
     }
     this.updateElementPositioning_();
+
+    if (previousView == media_router.MediaRouterView.ROUTE_DETAILS) {
+      media_router.browserApi.onMediaControllerClosed();
+      if (this.$$('route-details'))
+        this.$$('route-details').onClosed();
+    }
   },
 
   /**
@@ -1768,6 +1789,18 @@
   },
 
   /**
+   * Called when the connection to the route controller is invalidated. Switches
+   * from route details view to the sink list view.
+   */
+  onRouteControllerInvalidated: function() {
+    if (this.useWebUiRouteControls &&
+        this.currentView_ == media_router.MediaRouterView.ROUTE_DETAILS) {
+      this.currentRoute_ = null;
+      this.showSinkList_();
+    }
+  },
+
+  /**
    * Called when a sink is clicked.
    *
    * @param {!Event} event The event object.
@@ -2279,6 +2312,12 @@
   showRouteDetails_: function(route) {
     this.currentRoute_ = route;
     this.currentView_ = media_router.MediaRouterView.ROUTE_DETAILS;
+    if (this.useWebUiRouteControls) {
+      media_router.browserApi.onMediaControllerAvailable(route.id);
+    }
+    if (this.$$('route-details')) {
+      this.$$('route-details').onOpened();
+    }
   },
 
   /**
diff --git a/chrome/browser/resources/media_router/elements/media_router_container/media_router_container_interface.js b/chrome/browser/resources/media_router/elements/media_router_container/media_router_container_interface.js
new file mode 100644
index 0000000..4a449144
--- /dev/null
+++ b/chrome/browser/resources/media_router/elements/media_router_container/media_router_container_interface.js
@@ -0,0 +1,155 @@
+// Copyright 2017 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.
+
+/**
+ * This Polymer element contains the entire media router interface. It handles
+ * hiding and showing specific components.
+ * @record
+ */
+function MediaRouterContainerInterface() {}
+
+/**
+ * The list of available sinks.
+ * @type {!Array<!media_router.Sink>}
+ */
+MediaRouterContainerInterface.prototype.allSinks;
+
+/**
+ * The list of CastModes to show.
+ * @type {!Array<!media_router.CastMode>|undefined}
+ */
+MediaRouterContainerInterface.prototype.castModeList;
+
+/**
+ * The URL to open when the device missing link is clicked.
+ * @type {string|undefined}
+ */
+MediaRouterContainerInterface.prototype.deviceMissingUrl;
+
+/**
+ * The URL to open when the cloud services pref learn more link is clicked.
+ * @type {string|undefined}
+ */
+MediaRouterContainerInterface.prototype.firstRunFlowCloudPrefLearnMoreUrl;
+
+/**
+ * The URL to open when the first run flow learn more link is clicked.
+ * @type {string|undefined}
+ */
+MediaRouterContainerInterface.prototype.firstRunFlowLearnMoreUrl;
+
+/**
+ * The header text for the sink list.
+ * @type {string|undefined}
+ */
+MediaRouterContainerInterface.prototype.headerText;
+
+/**
+ * The header text tooltip. This would be descriptive of the
+ * source origin, whether a host name, tab URL, etc.
+ * @type {string|undefined}
+ */
+MediaRouterContainerInterface.prototype.headerTextTooltip;
+
+/**
+ * The issue to show.
+ * @type {?media_router.Issue}
+ */
+MediaRouterContainerInterface.prototype.issue;
+
+/**
+ * The list of current routes.
+ * @type {!Array<!media_router.Route>|undefined}
+ */
+MediaRouterContainerInterface.prototype.routeList;
+
+/**
+ * Whether the search input should be padded as if it were at the bottom of
+ * the dialog.
+ * @type {boolean}
+ */
+MediaRouterContainerInterface.prototype.searchUseBottomPadding;
+
+/**
+ * Whether to show the user domain of sinks associated with identity.
+ * @type {boolean|undefined}
+ */
+MediaRouterContainerInterface.prototype.showDomain;
+
+/**
+ * Whether to show the first run flow.
+ * @type {boolean|undefined}
+ */
+MediaRouterContainerInterface.prototype.showFirstRunFlow;
+
+/**
+ * Whether to show the cloud preference setting in the first run flow.
+ * @type {boolean|undefined}
+ */
+MediaRouterContainerInterface.prototype.showFirstRunFlowCloudPref;
+
+/**
+ * Whether the WebUI route controls should be shown instead of the
+ * extensionview in the route details view.
+ * @type {boolean}
+ */
+MediaRouterContainerInterface.prototype.useWebUiRouteControls;
+
+/**
+ * Fires a 'report-initial-action' event when the user takes their first
+ * action after the dialog opens. Also fires a 'report-initial-action-close'
+ * event if that initial action is to close the dialog.
+ * @param {!media_router.MediaRouterUserAction} initialAction
+ */
+MediaRouterContainerInterface.prototype.maybeReportUserFirstAction = function(
+    initialAction) {};
+
+/**
+ * Updates |currentView_| if the dialog had just opened and there's
+ * only one local route.
+ */
+MediaRouterContainerInterface.prototype.maybeShowRouteDetailsOnOpen =
+    function() {};
+
+/**
+ * Handles response of previous create route attempt.
+ * @param {string} sinkId The ID of the sink to which the Media Route was
+ *     creating a route.
+ * @param {?media_router.Route} route The newly created route that
+ *     corresponds to the sink if route creation succeeded; null otherwise.
+ * @param {boolean} isForDisplay Whether or not |route| is for display.
+ */
+MediaRouterContainerInterface.prototype.onCreateRouteResponseReceived =
+    function(sinkId, route, isForDisplay) {};
+
+/**
+ * Called when a search has completed up to route creation. |sinkId|
+ * identifies the sink that should be in |allSinks|, if a sink was found.
+ * @param {string} sinkId The ID of the sink that is the result of the
+ *     currently pending search.
+ */
+MediaRouterContainerInterface.prototype.onReceiveSearchResult = function(
+    sinkId) {};
+
+/**
+ * Called when the connection to the route controller is invalidated. Switches
+ * from route details view to the sink list view.
+ */
+MediaRouterContainerInterface.prototype.onRouteControllerInvalidated =
+    function() {};
+
+/**
+ * Sets the selected cast mode to the one associated with |castModeType|,
+ * and rebuilds sinks to reflect the change.
+ * @param {number} castModeType The type of the selected cast mode.
+ */
+MediaRouterContainerInterface.prototype.selectCastMode = function(
+    castModeType) {};
+
+/**
+ * Update the max dialog height and update the positioning of the elements.
+ * @param {number} height The max height of the Media Router dialog.
+ */
+MediaRouterContainerInterface.prototype.updateMaxDialogHeight = function(
+    height) {};
diff --git a/chrome/browser/resources/media_router/elements/route_controls/compiled_resources2.gyp b/chrome/browser/resources/media_router/elements/route_controls/compiled_resources2.gyp
new file mode 100644
index 0000000..cb312ae
--- /dev/null
+++ b/chrome/browser/resources/media_router/elements/route_controls/compiled_resources2.gyp
@@ -0,0 +1,25 @@
+# Copyright 2017 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.
+{
+  'targets': [
+    {
+      'target_name': 'route_controls',
+      'dependencies': [
+        '../../compiled_resources2.gyp:media_router_browser_api',
+        '../../compiled_resources2.gyp:media_router_data',
+        '../../compiled_resources2.gyp:media_router_ui_interface',
+        '<(DEPTH)/ui/webui/resources/js/compiled_resources2.gyp:i18n_behavior',
+        '<(DEPTH)/ui/webui/resources/js/compiled_resources2.gyp:load_time_data',
+      ],
+      'includes': ['../../../../../../third_party/closure_compiler/compile_js2.gypi'],
+    },
+    {
+      'target_name': 'route_controls_interface',
+      'dependencies': [
+        '../../compiled_resources2.gyp:media_router_data',
+      ],
+      'includes': ['../../../../../../third_party/closure_compiler/compile_js2.gypi'],
+    },
+  ],
+}
diff --git a/chrome/browser/resources/media_router/elements/route_controls/route_controls.css b/chrome/browser/resources/media_router/elements/route_controls/route_controls.css
new file mode 100644
index 0000000..be9d9ede
--- /dev/null
+++ b/chrome/browser/resources/media_router/elements/route_controls/route_controls.css
@@ -0,0 +1,76 @@
+/* Copyright 2017 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. */
+
+#button-holder {
+  float: left;
+}
+
+#current-time {
+  left: 20px;
+  position: absolute;
+}
+
+#duration {
+  position: absolute;
+  right: 20px;
+}
+
+.ellipsis {
+  padding: 0 1%;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+  width: 90%;
+}
+
+#media-controls {
+  font-size: 1.25em;
+  margin: 0 8px;
+}
+
+#play-pause-volume-controls {
+  display: block;
+  margin-top: 13px;
+  overflow: hidden;
+}
+
+#route-description {
+  margin: 15px 8px 3px 8px;
+  overflow: hidden;
+}
+
+#route-time-controls {
+  display: block;
+  margin-top: 3px;
+  overflow: hidden;
+}
+
+#route-time-slider {
+  --paper-slider-knob-color: rgb(16, 16, 16);
+  --paper-slider-active-color: rgb(16, 16, 16);
+  --paper-slider-pin-color: rgb(16, 16, 16);
+  width: 100%;
+}
+
+#route-title {
+  color: rgb(125, 125, 125);
+  margin: 3px 8px;
+  overflow: hidden;
+}
+
+#route-volume-slider {
+  --paper-slider-knob-color: rgb(16, 16, 16);
+  --paper-slider-active-color: rgb(33, 150, 243);
+  --paper-slider-pin-color: rgb(16, 16, 16);
+  width: 100%;
+}
+
+#timeline {
+  font-size: 0.75em;
+}
+
+#volume-holder {
+  display: block;
+  overflow: hidden;
+  padding: 0.3em 0;
+}
diff --git a/chrome/browser/resources/media_router/elements/route_controls/route_controls.html b/chrome/browser/resources/media_router/elements/route_controls/route_controls.html
new file mode 100644
index 0000000..b6ca6c4
--- /dev/null
+++ b/chrome/browser/resources/media_router/elements/route_controls/route_controls.html
@@ -0,0 +1,68 @@
+<link rel="import" href="chrome://resources/html/polymer.html">
+<link rel="import" href="chrome://resources/html/i18n_behavior.html">
+<link rel="import" href="chrome://resources/polymer/v1_0/iron-icons/av-icons.html">
+<link rel="import" href="chrome://resources/polymer/v1_0/paper-slider/paper-slider.html">
+<dom-module id="route-controls">
+  <link rel="import" type="css" href="../../media_router_common.css">
+  <link rel="import" type="css" href="route_controls.css">
+  <template>
+    <div id="media-controls">
+      <div class="ellipsis" id="route-description"
+           title="[[displayedDescription_]]">
+        [[displayedDescription_]]
+      </div>
+      <div class="ellipsis" id="route-title" title="[[routeStatus.title]]">
+        [[routeStatus.title]]
+      </div>
+      <div>
+        <div id="route-time-controls" hidden="[[!routeStatus.canSeek]]">
+          <paper-slider
+              id="route-time-slider"
+              on-change="onSeekComplete_"
+              on-immediate-value-change="onSeekStart_"
+              min="0" max="[[routeStatus.duration]]" step="1"
+              title="[[i18n('seekTitle')]]"
+              value="[[displayedCurrentTime_]]"></paper-slider>
+          <div id="timeline">
+            <span id="current-time">
+              [[getFormattedTime_(displayedCurrentTime_)]]
+            </span>
+            <span id="duration">
+              [[getFormattedTime_(routeStatus.duration)]]
+            </span>
+          </div>
+        </div>
+        <div id="play-pause-volume-controls">
+          <span id="button-holder">
+            <paper-icon-button
+                id="route-play-pause-button"
+                hidden="[[!routeStatus.canPlayPause]]"
+                disabled="[[!routeStatus.canPlayPause]]"
+                icon="[[getPlayPauseIcon_(routeStatus)]]"
+                title="[[getPlayPauseTitle_(routeStatus)]]"
+                on-click="onPlayPause_"></paper-icon-button>
+            <paper-icon-button
+                id="route-volume-button"
+                hidden="[[!routeStatus.canMute]]"
+                disabled="[[!routeStatus.canMute]]"
+                icon="[[getMuteUnmuteIcon_(routeStatus)]]"
+                title="[[getMuteUnmuteTitle_(routeStatus)]]"
+                on-click="onMuteUnmute_"></paper-icon-button>
+          </span>
+          <span id="volume-holder">
+            <paper-slider
+                id="route-volume-slider"
+                hidden="[[!routeStatus.canSetVolume]]"
+                disabled="[[!routeStatus.canSetVolume]]"
+                on-change="onVolumeChangeComplete_"
+                on-immediate-value-change="onVolumeChangeStart_"
+                title="[[i18n('volumeTitle')]]"
+                value="[[displayedVolume_]]"
+                min="0" max="1" step="0.01"></paper-slider>
+          </span>
+        </div>
+      </div>
+    </div>
+  </template>
+<script src="route_controls.js"></script>
+</dom-module>
diff --git a/chrome/browser/resources/media_router/elements/route_controls/route_controls.js b/chrome/browser/resources/media_router/elements/route_controls/route_controls.js
new file mode 100644
index 0000000..4d3a65bc
--- /dev/null
+++ b/chrome/browser/resources/media_router/elements/route_controls/route_controls.js
@@ -0,0 +1,261 @@
+// Copyright 2017 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.
+
+/**
+ * This Polymer element shows media controls for a route that is currently cast
+ * to a device.
+ * @implements {RouteControlsInterface}
+ */
+Polymer({
+  is: 'route-controls',
+
+  properties: {
+    /**
+     * The current time displayed in seconds, before formatting.
+     * @private {number}
+     */
+    displayedCurrentTime_: {
+      type: Number,
+      value: 0,
+    },
+
+    /**
+     * The media description to display. Uses route description if none is
+     * provided by the route status object.
+     * @private {string}
+     */
+    displayedDescription_: {
+      type: String,
+      value: '',
+    },
+
+    /**
+     * The volume shown in the volume control, between 0 and 1.
+     * @private {number}
+     */
+    displayedVolume_: {
+      type: Number,
+      value: 0,
+    },
+
+    /**
+     * Set to true when the user is dragging the seek bar. Updates for the
+     * current time from the browser will be ignored when set to true.
+     * @private {boolean}
+     */
+    isSeeking_: {
+      type: Boolean,
+      value: false,
+    },
+
+    /**
+     * Set to true when the user is dragging the volume bar. Volume updates from
+     * the browser will be ignored when set to true.
+     * @private {boolean}
+     */
+    isVolumeChanging_: {
+      type: Boolean,
+      value: false,
+    },
+
+    /**
+     * The status of the media route shown.
+     * @type {!media_router.RouteStatus}
+     */
+    routeStatus: {
+      type: Object,
+      observer: 'onRouteStatusChange_',
+      value: new media_router.RouteStatus(
+          '', '', false, false, false, false, false, false, 0, 0, 0),
+    },
+  },
+
+  behaviors: [
+    I18nBehavior,
+  ],
+
+  /**
+   * Called by Polymer when the element loads. Registers the element to be
+   * notified of route status updates.
+   */
+  ready: function() {
+    media_router.ui.setRouteControls(
+        /** @type {RouteControlsInterface} */ (this));
+  },
+
+  /**
+   * Converts a number representing an interval of seconds to a string with
+   * HH:MM:SS format.
+   * @param {number} timeInSec Must be non-negative. Intervals longer than 100
+   *     hours get truncated silently.
+   * @return {string}
+   *
+   * @private
+   */
+  getFormattedTime_: function(timeInSec) {
+    if (timeInSec < 0) {
+      return '';
+    }
+    var hours = Math.floor(timeInSec / 3600);
+    var minutes = Math.floor(timeInSec / 60) % 60;
+    var seconds = Math.floor(timeInSec) % 60;
+    return ('0' + hours).substr(-2) + ':' + ('0' + minutes).substr(-2) + ':' +
+        ('0' + seconds).substr(-2);
+  },
+
+  /**
+   * @param {!media_router.RouteStatus} routeStatus
+   * @return {string} The value for the icon attribute of the mute/unmute
+   *     button.
+   *
+   * @private
+   */
+  getMuteUnmuteIcon_: function(routeStatus) {
+    return routeStatus.isMuted ? 'av:volume-off' : 'av:volume-up';
+  },
+
+  /**
+   * @param {!media_router.RouteStatus} routeStatus
+   * @return {string} Localized title for the mute/unmute button.
+   *
+   * @private
+   */
+  getMuteUnmuteTitle_: function(routeStatus) {
+    return routeStatus.isMuted ? this.i18n('unmuteTitle') :
+                                 this.i18n('muteTitle');
+  },
+
+  /**
+   * @param {!media_router.RouteStatus} routeStatus
+   * @return {string}The value for the icon attribute of the play/pause button.
+   *
+   * @private
+   */
+  getPlayPauseIcon_: function(routeStatus) {
+    return routeStatus.isPaused ? 'av:play-arrow' : 'av:pause';
+  },
+
+  /**
+   * @param {!media_router.RouteStatus} routeStatus
+   * @return {string} Localized title for the play/pause button.
+   *
+   * @private
+   */
+  getPlayPauseTitle_: function(routeStatus) {
+    return routeStatus.isPaused ? this.i18n('playTitle') :
+                                  this.i18n('pauseTitle');
+  },
+
+  /**
+   * Called when the user toggles the mute status of the media. Sends a mute or
+   * unmute command to the browser.
+   *
+   * @private
+   */
+  onMuteUnmute_: function() {
+    media_router.browserApi.setCurrentMediaMute(!this.routeStatus.isMuted);
+  },
+
+  /**
+   * Called when the user toggles between playing and pausing the media. Sends a
+   * play or pause command to the browser.
+   *
+   * @private
+   */
+  onPlayPause_: function() {
+    if (this.routeStatus.isPaused) {
+      media_router.browserApi.playCurrentMedia();
+    } else {
+      media_router.browserApi.pauseCurrentMedia();
+    }
+  },
+
+  /**
+   * Resets the route controls. Called when the route details view is closed.
+   */
+  reset: function() {
+    this.routeStatus = new media_router.RouteStatus(
+        '', '', false, false, false, false, false, false, 0, 0, 0);
+    media_router.ui.setRouteControls(null);
+  },
+
+  /**
+   * Updates seek and volume bars if the user is not currently dragging on
+   * them.
+   * @param {!media_router.RouteStatus} newRouteStatus
+   *
+   * @private
+   */
+  onRouteStatusChange_: function(newRouteStatus) {
+    if (!this.isSeeking_) {
+      this.displayedCurrentTime_ = newRouteStatus.currentTime;
+    }
+    if (!this.isVolumeChanging_) {
+      this.displayedVolume_ = newRouteStatus.volume;
+    }
+    if (newRouteStatus.description !== '') {
+      this.displayedDescription_ = newRouteStatus.description;
+    }
+  },
+
+  /**
+   * Called when the route is updated. Updates the description shown if it has
+   * not been provided by status updates.
+   * @param {!media_router.Route} route
+   */
+  onRouteUpdated: function(route) {
+    if (this.routeStatus.description === '') {
+      this.displayedDescription_ =
+          loadTimeData.getStringF('castingActivityStatus', route.description);
+    }
+  },
+
+  /**
+   * Called when the user clicks on or stops dragging the seek bar.
+   * @param {!Event} e
+   *
+   * @private
+   */
+  onSeekComplete_: function(e) {
+    this.isSeeking_ = false;
+    this.displayedCurrentTime_ = e.target.value;
+    media_router.browserApi.seekCurrentMedia(this.displayedCurrentTime_);
+  },
+
+  /**
+   * Called when the user starts dragging the seek bar.
+   * @param {!Event} e
+   *
+   * @private
+   */
+  onSeekStart_: function(e) {
+    this.isSeeking_ = true;
+    var target = /** @type {{immediateValue: number}} */ (e.target);
+    this.displayedCurrentTime_ = target.immediateValue;
+  },
+
+  /**
+   * Called when the user clicks on or stops dragging the volume bar.
+   * @param {!Event} e
+   *
+   * @private
+   */
+  onVolumeChangeComplete_: function(e) {
+    this.isVolumeChanging_ = false;
+    this.volumeSliderValue_ = e.target.value;
+    media_router.browserApi.setCurrentMediaVolume(this.volumeSliderValue_);
+  },
+
+  /**
+   * Called when the user starts dragging the volume bar.
+   * @param {!Event} e
+   *
+   * @private
+   */
+  onVolumeChangeStart_: function(e) {
+    this.isVolumeChanging_ = true;
+    var target = /** @type {{immediateValue: number}} */ (e.target);
+    this.volumeSliderValue_ = target.immediateValue;
+  },
+});
diff --git a/chrome/browser/resources/media_router/elements/route_controls/route_controls_interface.js b/chrome/browser/resources/media_router/elements/route_controls/route_controls_interface.js
new file mode 100644
index 0000000..93aefe5d
--- /dev/null
+++ b/chrome/browser/resources/media_router/elements/route_controls/route_controls_interface.js
@@ -0,0 +1,27 @@
+// Copyright 2017 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.
+
+/**
+ * Interface for the Polymer element that shows media controls for a route that
+ * is currently cast to a device.
+ * @record
+ */
+function RouteControlsInterface() {}
+
+/**
+ * @type {!media_router.RouteStatus}
+ */
+RouteControlsInterface.prototype.routeStatus;
+
+/**
+ * Resets the route controls. Called when the route details view is closed.
+ */
+RouteControlsInterface.prototype.reset = function() {};
+
+/**
+ * Called when the route is updated. Updates the description shown if it has
+ * not been provided by status updates.
+ * @param {!media_router.Route} route
+ */
+RouteControlsInterface.prototype.onRouteUpdated = function(route) {};
diff --git a/chrome/browser/resources/media_router/elements/route_details/compiled_resources2.gyp b/chrome/browser/resources/media_router/elements/route_details/compiled_resources2.gyp
index 92f14fd0..ea2470c 100644
--- a/chrome/browser/resources/media_router/elements/route_details/compiled_resources2.gyp
+++ b/chrome/browser/resources/media_router/elements/route_details/compiled_resources2.gyp
@@ -6,7 +6,10 @@
     {
       'target_name': 'route_details',
       'dependencies': [
+        'extension_view_wrapper/compiled_resources2.gyp:extension_view_wrapper',
         '../../compiled_resources2.gyp:media_router_data',
+        '../../compiled_resources2.gyp:media_router_ui_interface',
+        '../route_controls/compiled_resources2.gyp:route_controls',
         '<(DEPTH)/ui/webui/resources/js/compiled_resources2.gyp:i18n_behavior',
         '<(DEPTH)/ui/webui/resources/js/compiled_resources2.gyp:load_time_data',
       ],
diff --git a/chrome/browser/resources/media_router/elements/route_details/extension_view_wrapper/compiled_resources2.gyp b/chrome/browser/resources/media_router/elements/route_details/extension_view_wrapper/compiled_resources2.gyp
new file mode 100644
index 0000000..b7d8fe1d
--- /dev/null
+++ b/chrome/browser/resources/media_router/elements/route_details/extension_view_wrapper/compiled_resources2.gyp
@@ -0,0 +1,14 @@
+# Copyright 2017 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.
+{
+  'targets': [
+    {
+      'target_name': 'extension_view_wrapper',
+      'dependencies': [
+        '../../../compiled_resources2.gyp:media_router_data',
+      ],
+      'includes': ['../../../../../../../third_party/closure_compiler/compile_js2.gypi'],
+    },
+  ],
+}
diff --git a/chrome/browser/resources/media_router/elements/route_details/extension_view_wrapper/extension_view_wrapper.css b/chrome/browser/resources/media_router/elements/route_details/extension_view_wrapper/extension_view_wrapper.css
new file mode 100644
index 0000000..bd41df1
--- /dev/null
+++ b/chrome/browser/resources/media_router/elements/route_details/extension_view_wrapper/extension_view_wrapper.css
@@ -0,0 +1,9 @@
+/* Copyright 2017 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. */
+
+#custom-controller {
+  display: inline-block;
+  height: 142px;
+  width: 100%;
+}
diff --git a/chrome/browser/resources/media_router/elements/route_details/extension_view_wrapper/extension_view_wrapper.html b/chrome/browser/resources/media_router/elements/route_details/extension_view_wrapper/extension_view_wrapper.html
new file mode 100644
index 0000000..9b33d90
--- /dev/null
+++ b/chrome/browser/resources/media_router/elements/route_details/extension_view_wrapper/extension_view_wrapper.html
@@ -0,0 +1,9 @@
+<link rel="import" href="chrome://resources/html/polymer.html">
+<dom-module id="extension-view-wrapper">
+  <link rel="import" type="css" href="extension_view_wrapper.css">
+  <template>
+    <extensionview id="custom-controller">
+    </extensionview>
+  </template>
+  <script src="extension_view_wrapper.js"></script>
+</dom-module>
diff --git a/chrome/browser/resources/media_router/elements/route_details/extension_view_wrapper/extension_view_wrapper.js b/chrome/browser/resources/media_router/elements/route_details/extension_view_wrapper/extension_view_wrapper.js
new file mode 100644
index 0000000..997e7e08
--- /dev/null
+++ b/chrome/browser/resources/media_router/elements/route_details/extension_view_wrapper/extension_view_wrapper.js
@@ -0,0 +1,64 @@
+// Copyright 2017 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.
+
+// This Polymer element shows the custom controller for a route using
+// extensionview.
+Polymer({
+  is: 'extension-view-wrapper',
+
+  properties: {
+    /**
+     * The route to show the custom controller for.
+     * @type {?media_router.Route|undefined}
+     */
+    route: {
+      type: Object,
+      observer: 'maybeLoadExtensionView_',
+    },
+
+    /**
+     * Whether the extension view is ready to be shown.
+     * @type {boolean}
+     */
+    isExtensionViewReady: {
+      type: Boolean,
+      value: false,
+      notify: true,
+    },
+  },
+
+  /**
+   * Called by Polymer when this module has loaded.
+   */
+  ready: function() {
+    this.maybeLoadExtensionView_();
+  },
+
+  /**
+   * Loads the custom controller if the controller path for the current route is
+   * valid.
+   */
+  maybeLoadExtensionView_: function() {
+    var extensionview = this.$['custom-controller'];
+
+    // Do nothing if the controller path doesn't exist or is already shown in
+    // the extension view.
+    if (!this.route || !this.route.customControllerPath ||
+        this.route.customControllerPath == extensionview.src) {
+      return;
+    }
+
+    var that = this;
+    extensionview.load(this.route.customControllerPath)
+        .then(
+            function() {
+              // Load was successful; show the custom controller.
+              that.isExtensionViewReady = true;
+            },
+            function() {
+              // Load was unsuccessful; fall back to default view.
+              that.isExtensionViewReady = false;
+            });
+  },
+});
diff --git a/chrome/browser/resources/media_router/elements/route_details/route_details.css b/chrome/browser/resources/media_router/elements/route_details/route_details.css
index 9f1f1dbf..742647d 100644
--- a/chrome/browser/resources/media_router/elements/route_details/route_details.css
+++ b/chrome/browser/resources/media_router/elements/route_details/route_details.css
@@ -2,12 +2,6 @@
  * Use of this source code is governed by a BSD-style license that can be
  * found in the LICENSE file. */
 
-#custom-controller {
-  display: inline-block;
-  height: 142px;
-  width: 100%;
-}
-
 #route-action-buttons {
   @apply(--layout-horizontal);
   @apply(--layout-end-justified);
diff --git a/chrome/browser/resources/media_router/elements/route_details/route_details.html b/chrome/browser/resources/media_router/elements/route_details/route_details.html
index 61043b44..1313fb2 100644
--- a/chrome/browser/resources/media_router/elements/route_details/route_details.html
+++ b/chrome/browser/resources/media_router/elements/route_details/route_details.html
@@ -1,16 +1,25 @@
 <link rel="import" href="chrome://resources/html/polymer.html">
 <link rel="import" href="chrome://resources/html/i18n_behavior.html">
 <link rel="import" href="chrome://resources/polymer/v1_0/paper-button/paper-button.html">
+<link rel="import" href="extension_view_wrapper/extension_view_wrapper.html">
+<link rel="import" href="../route_controls/route_controls.html">
 <dom-module id="route-details">
   <link rel="import" type="css" href="../../media_router_common.css">
   <link rel="import" type="css" href="route_details.css">
   <template>
-    <div id="route-information" hidden$="[[!isCustomControllerHidden_]]">
+    <div id="route-information"
+        hidden$="[[!shouldShowRouteInfoOnly_(controllerType_)]]">
       <span>[[activityStatus_]]</span>
     </div>
-    <extensionview id="custom-controller"
-        hidden$="[[isCustomControllerHidden_]]">
-    </extensionview>
+    <template is="dom-if" if="[[!useWebUiRouteControls]]">
+      <extension-view-wrapper id="extension-view-wrapper" route="[[route]]"
+          is-extension-view-ready="{{isExtensionViewReady}}"
+          hidden$="[[!shouldShowExtensionView_(controllerType_)]]">
+      </extension-view-wrapper>
+    </template>
+    <template is="dom-if" if="[[shouldShowWebUiControls_(controllerType_)]]">
+      <route-controls id="route-controls"></route-controls>
+    </template>
     <div id="route-action-buttons" class="layout">
       <paper-button flat class="route-button button"
           id="start-casting-to-route-button"
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 ae7ebcca..da76f91 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
@@ -24,7 +24,17 @@
     changeRouteSourceAvailable_: {
       type: Boolean,
       computed: 'computeChangeRouteSourceAvailable_(route, sink,' +
-                    'isAnySinkCurrentlyLaunching, shownCastModeValue)',
+          'isAnySinkCurrentlyLaunching, shownCastModeValue)',
+    },
+
+    /**
+     * An enum value to represent the controller to show.
+     * @private {number}
+     */
+    controllerType_: {
+      type: Number,
+      computed: 'computeControllerType_(useWebUiRouteControls,' +
+          'isExtensionViewReady)',
     },
 
     /**
@@ -37,12 +47,21 @@
     },
 
     /**
+     * Whether the custom controller extensionview is ready to be shown.
+     * @type {boolean}
+     */
+    isExtensionViewReady: {
+      type: Boolean,
+      value: false,
+    },
+
+    /**
      * The route to show.
      * @type {?media_router.Route|undefined}
      */
     route: {
       type: Object,
-      observer: 'maybeLoadCustomController_',
+      observer: 'onRouteChange_',
     },
 
     /**
@@ -65,14 +84,13 @@
     },
 
     /**
-     * Whether the custom controller should be hidden.
-     * A custom controller is shown iff |route| specifies customControllerPath
-     * and the view can be loaded.
-     * @private {boolean}
+     * Whether we should use the WebUI route controls. This value is used for
+     * updating |controllerType_|,
+     * @type {boolean}
      */
-    isCustomControllerHidden_: {
+    useWebUiRouteControls: {
       type: Boolean,
-      value: true,
+      value: false,
     },
   },
 
@@ -130,6 +148,23 @@
   },
 
   /**
+   * @param {boolean} useWebUiRouteControls
+   * @param {boolean} isExtensionViewReady
+   * @return {number} An enum value to represent the controller to show.
+   * @private
+   */
+  computeControllerType_: function(
+      useWebUiRouteControls, isExtensionViewReady) {
+    if (useWebUiRouteControls) {
+      return media_router.ControllerType.WEBUI;
+    }
+    if (isExtensionViewReady) {
+      return media_router.ControllerType.EXTENSION;
+    }
+    return media_router.ControllerType.NONE;
+  },
+
+  /**
    * @param {number} castMode User selected cast mode or AUTO.
    * @param {?media_router.Sink} sink Sink to which we will cast.
    * @return {number} The selected cast mode when |castMode| is selected in the
@@ -155,6 +190,85 @@
   },
 
   /**
+   * Updates |activityStatus_| for the default view.
+   *
+   * @private
+   */
+  updateActivityStatus_: function() {
+    this.activityStatus_ = this.route ?
+        loadTimeData.getStringF(
+            'castingActivityStatus', this.route.description) :
+        '';
+  },
+
+  /**
+   * Called when the route details view is closed. Resets route-controls.
+   */
+  onClosed: function() {
+    if (this.controllerType_ === media_router.ControllerType.WEBUI &&
+        this.$$('route-controls')) {
+      this.$$('route-controls').reset();
+    }
+  },
+
+  /**
+   * Called when the route details view is opened.
+   */
+  onOpened: function() {
+    if (this.controllerType_ === media_router.ControllerType.WEBUI &&
+        this.$$('route-controls')) {
+      media_router.ui.setRouteControls(
+          /** @type {RouteControlsInterface} */ (this.$$('route-controls')));
+    }
+  },
+
+  /**
+   * Updates either the extensionview or the WebUI route controller, depending
+   * on which should be shown.
+   * @private
+   */
+  onRouteChange_: function(newRoute) {
+    if (this.controllerType_ !== media_router.ControllerType.WEBUI) {
+      this.updateActivityStatus_();
+    }
+    if (newRoute &&
+        this.controllerType_ === media_router.ControllerType.WEBUI &&
+        this.$$('route-controls')) {
+      this.$$('route-controls').onRouteUpdated(newRoute);
+    }
+  },
+
+  /**
+   * @param {number} controllerType
+   * @return {boolean} Whether the extensionview should be shown instead of the
+   *     default route info element or the WebUI route controller.
+   * @private
+   */
+  shouldShowExtensionView_: function(controllerType) {
+    return controllerType === media_router.ControllerType.EXTENSION;
+  },
+
+  /**
+   * @param {number} controllerType
+   * @return {boolean} Whether the route info element should be shown instead of
+   *     the extensionview or the WebUI route controller.
+   * @private
+   */
+  shouldShowRouteInfoOnly_: function(controllerType) {
+    return controllerType === media_router.ControllerType.NONE;
+  },
+
+  /**
+   * @param {number} controllerType
+   * @return {boolean} Whether the WebUI route controller should be shown
+   *     instead of the default route info element or the extensionview.
+   * @private
+   */
+  shouldShowWebUiControls_: function(controllerType) {
+    return controllerType === media_router.ControllerType.WEBUI;
+  },
+
+  /**
    * Fires a join-route-click event if the current route is joinable, otherwise
    * it fires a change-route-source-click event, which changes the source of the
    * current route. This may cause the current route to be closed and a new
@@ -174,41 +288,4 @@
       });
     }
   },
-
-  /**
-   * Loads the custom controller if |route.customControllerPath| exists.
-   * Falls back to the default route details view otherwise, or if load fails.
-   * Updates |activityStatus_| for the default view.
-   *
-   * @private
-   */
-  maybeLoadCustomController_: function() {
-    this.activityStatus_ = this.route ?
-        loadTimeData.getStringF('castingActivityStatus',
-                                this.route.description) :
-        '';
-
-    if (!this.route || !this.route.customControllerPath) {
-      this.isCustomControllerHidden_ = true;
-      return;
-    }
-
-    // Show custom controller
-    var extensionview = this.$['custom-controller'];
-
-    // Do nothing if the url is the same and the view is not hidden.
-    if (this.route.customControllerPath == extensionview.src &&
-        !this.isCustomControllerHidden_)
-      return;
-
-    var that = this;
-    extensionview.load(this.route.customControllerPath)
-    .then(function() {
-      // Load was successful; show the custom controller.
-      that.isCustomControllerHidden_ = false;
-    }, function() {
-      // Load was unsuccessful; fall back to default view.
-      that.isCustomControllerHidden_ = true;
-    });
-  },
 });
diff --git a/chrome/browser/resources/media_router/media_router.css b/chrome/browser/resources/media_router/media_router.css
index db8b9c05..ad517c4 100644
--- a/chrome/browser/resources/media_router/media_router.css
+++ b/chrome/browser/resources/media_router/media_router.css
@@ -16,5 +16,5 @@
   display: flex;
   flex-direction: column;
   margin-bottom: 1px;
-  width: calc(100% - 1px);
+  width: calc(var(--dialog-width) - 1px);
 }
diff --git a/chrome/browser/resources/media_router/media_router.html b/chrome/browser/resources/media_router/media_router.html
index 027ff7d..b3b8439 100644
--- a/chrome/browser/resources/media_router/media_router.html
+++ b/chrome/browser/resources/media_router/media_router.html
@@ -5,6 +5,7 @@
   <title i18n-content="mediaRouterTitle"></title>
 
   <link rel="stylesheet" href="chrome://resources/css/roboto.css">
+  <link rel="stylesheet" href="media_router_common.css">
   <link rel="stylesheet" href="media_router.css">
   <link rel="import" href="chrome://resources/html/cr.html">
   <link rel="import" href="chrome://resources/html/load_time_data.html">
diff --git a/chrome/browser/resources/media_router/media_router.js b/chrome/browser/resources/media_router/media_router.js
index d3bc326..206f1f4 100644
--- a/chrome/browser/resources/media_router/media_router.js
+++ b/chrome/browser/resources/media_router/media_router.js
@@ -2,6 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+// <include src="media_router_browser_api.js">
 // <include src="media_router_data.js">
 // <include src="media_router_ui_interface.js">
 
@@ -216,7 +217,7 @@
    *   selectedCastModeValue - cast mode selected by the user.
    */
   function onCreateRoute(event) {
-    /** @type {{sinkId: string, selectedCastModeValue, number}} */
+    /** @type {{sinkId: string, selectedCastModeValue: number}} */
     var detail = event.detail;
     media_router.browserApi.requestRoute(detail.sinkId,
                                          detail.selectedCastModeValue);
diff --git a/chrome/browser/resources/media_router/media_router_browser_api.js b/chrome/browser/resources/media_router/media_router_browser_api.js
new file mode 100644
index 0000000..482decf
--- /dev/null
+++ b/chrome/browser/resources/media_router/media_router_browser_api.js
@@ -0,0 +1,319 @@
+// Copyright 2017 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.
+
+// API invoked by this UI to communicate with the browser WebUI message handler.
+cr.define('media_router.browserApi', function() {
+  'use strict';
+
+  /**
+   * Indicates that the user has acknowledged the first run flow.
+   *
+   * @param {boolean} optedIntoCloudServices Whether or not the user opted into
+   *                  cloud services.
+   */
+  function acknowledgeFirstRunFlow(optedIntoCloudServices) {
+    chrome.send('acknowledgeFirstRunFlow', [optedIntoCloudServices]);
+  }
+
+  /**
+   * Acts on the given issue.
+   *
+   * @param {number} issueId
+   * @param {number} actionType Type of action that the user clicked.
+   * @param {?number} helpPageId The numeric help center ID.
+   */
+  function actOnIssue(issueId, actionType, helpPageId) {
+    chrome.send(
+        'actOnIssue',
+        [{issueId: issueId, actionType: actionType, helpPageId: helpPageId}]);
+  }
+
+  /**
+   * Modifies |route| by changing its source to the one identified by
+   * |selectedCastMode|.
+   *
+   * @param {!media_router.Route} route The route being modified.
+   * @param {number} selectedCastMode The value of the cast mode the user
+   *   selected.
+   */
+  function changeRouteSource(route, selectedCastMode) {
+    chrome.send(
+        'requestRoute',
+        [{sinkId: route.sinkId, selectedCastMode: selectedCastMode}]);
+  }
+
+  /**
+   * Closes the dialog.
+   *
+   * @param {boolean} pressEscToClose Whether the user pressed ESC to close the
+   *                  dialog.
+   */
+  function closeDialog(pressEscToClose) {
+    chrome.send('closeDialog', [pressEscToClose]);
+  }
+
+  /**
+   * Closes the given route.
+   *
+   * @param {!media_router.Route} route
+   */
+  function closeRoute(route) {
+    chrome.send('closeRoute', [{routeId: route.id, isLocal: route.isLocal}]);
+  }
+
+  /**
+   * Joins the given route.
+   *
+   * @param {!media_router.Route} route
+   */
+  function joinRoute(route) {
+    chrome.send('joinRoute', [{sinkId: route.sinkId, routeId: route.id}]);
+  }
+
+  /**
+   * Indicates that the initial data has been received.
+   */
+  function onInitialDataReceived() {
+    chrome.send('onInitialDataReceived');
+  }
+
+  /**
+   * Reports that the route details view was closed.
+   */
+  function onMediaControllerClosed() {
+    chrome.send('onMediaControllerClosed');
+  }
+
+  /**
+   * Reports that the route details view was opened for |routeId|.
+   *
+   * @param {string} routeId
+   */
+  function onMediaControllerAvailable(routeId) {
+    chrome.send('onMediaControllerAvailable', [{routeId: routeId}]);
+  }
+
+  /**
+   * Sends a command to pause the route shown in the route details view.
+   */
+  function pauseCurrentMedia() {
+    chrome.send('pauseCurrentMedia');
+  }
+
+  /**
+   * Sends a command to play the route shown in the route details view.
+   */
+  function playCurrentMedia() {
+    chrome.send('playCurrentMedia');
+  }
+
+  /**
+   * Reports when the user clicks outside the dialog.
+   */
+  function reportBlur() {
+    chrome.send('reportBlur');
+  }
+
+  /**
+   * Reports the index of the selected sink.
+   *
+   * @param {number} sinkIndex
+   */
+  function reportClickedSinkIndex(sinkIndex) {
+    chrome.send('reportClickedSinkIndex', [sinkIndex]);
+  }
+
+  /**
+   * Reports that the user used the filter input.
+   */
+  function reportFilter() {
+    chrome.send('reportFilter');
+  }
+
+  /**
+   * Reports the initial dialog view.
+   *
+   * @param {string} view
+   */
+  function reportInitialState(view) {
+    chrome.send('reportInitialState', [view]);
+  }
+
+  /**
+   * Reports the initial action the user took.
+   *
+   * @param {number} action
+   */
+  function reportInitialAction(action) {
+    chrome.send('reportInitialAction', [action]);
+  }
+
+  /**
+   * Reports the navigation to the specified view.
+   *
+   * @param {string} view
+   */
+  function reportNavigateToView(view) {
+    chrome.send('reportNavigateToView', [view]);
+  }
+
+  /**
+   * Reports whether or not a route was created successfully.
+   *
+   * @param {boolean} success
+   */
+  function reportRouteCreation(success) {
+    chrome.send('reportRouteCreation', [success]);
+  }
+
+  /**
+   * Reports the outcome of a create route response.
+   *
+   * @param {number} outcome
+   */
+  function reportRouteCreationOutcome(outcome) {
+    chrome.send('reportRouteCreationOutcome', [outcome]);
+  }
+
+  /**
+   * Reports the cast mode that the user selected.
+   *
+   * @param {number} castModeType
+   */
+  function reportSelectedCastMode(castModeType) {
+    chrome.send('reportSelectedCastMode', [castModeType]);
+  }
+
+  /**
+   * Reports the current number of sinks.
+   *
+   * @param {number} sinkCount
+   */
+  function reportSinkCount(sinkCount) {
+    chrome.send('reportSinkCount', [sinkCount]);
+  }
+
+  /**
+   * Reports the time it took for the user to select a sink after the sink list
+   * is populated and shown.
+   *
+   * @param {number} timeMs
+   */
+  function reportTimeToClickSink(timeMs) {
+    chrome.send('reportTimeToClickSink', [timeMs]);
+  }
+
+  /**
+   * Reports the time, in ms, it took for the user to close the dialog without
+   * taking any other action.
+   *
+   * @param {number} timeMs
+   */
+  function reportTimeToInitialActionClose(timeMs) {
+    chrome.send('reportTimeToInitialActionClose', [timeMs]);
+  }
+
+  /**
+   * Requests data to initialize the WebUI with.
+   * The data will be returned via media_router.ui.setInitialData.
+   */
+  function requestInitialData() {
+    chrome.send('requestInitialData');
+  }
+
+  /**
+   * Requests that a media route be started with the given sink.
+   *
+   * @param {string} sinkId The sink ID.
+   * @param {number} selectedCastMode The value of the cast mode the user
+   *   selected.
+   */
+  function requestRoute(sinkId, selectedCastMode) {
+    chrome.send(
+        'requestRoute', [{sinkId: sinkId, selectedCastMode: selectedCastMode}]);
+  }
+
+  /**
+   * Requests that the media router search all providers for a sink matching
+   * |searchCriteria| that can be used with the media source associated with the
+   * cast mode |selectedCastMode|. If such a sink is found, a route is also
+   * created between the sink and the media source.
+   *
+   * @param {string} sinkId Sink ID of the pseudo sink generating the request.
+   * @param {string} searchCriteria Search criteria for the route providers.
+   * @param {string} domain User's current hosted domain.
+   * @param {number} selectedCastMode The value of the cast mode to be used with
+   *   the sink.
+   */
+  function searchSinksAndCreateRoute(
+      sinkId, searchCriteria, domain, selectedCastMode) {
+    chrome.send('searchSinksAndCreateRoute', [{
+                  sinkId: sinkId,
+                  searchCriteria: searchCriteria,
+                  domain: domain,
+                  selectedCastMode: selectedCastMode
+                }]);
+  }
+
+  /**
+   * Sends a command to seek the route shown in the route details view.
+   *
+   * @param {number} time The new current time in seconds.
+   */
+  function seekCurrentMedia(time) {
+    chrome.send('seekCurrentMedia', [{time: time}]);
+  }
+
+  /**
+   * Sends a command to mute or unmute the route shown in the route details
+   * view.
+   *
+   * @param {boolean} mute Mute the route if true, unmute it if false.
+   */
+  function setCurrentMediaMute(mute) {
+    chrome.send('setCurrentMediaMute', [{mute: mute}]);
+  }
+
+  /**
+   * Sends a command to change the volume of the route shown in the route
+   * details view.
+   *
+   * @param {number} volume The volume between 0 and 1.
+   */
+  function setCurrentMediaVolume(volume) {
+    chrome.send('setCurrentMediaVolume', [{volume: volume}]);
+  }
+
+  return {
+    acknowledgeFirstRunFlow: acknowledgeFirstRunFlow,
+    actOnIssue: actOnIssue,
+    changeRouteSource: changeRouteSource,
+    closeDialog: closeDialog,
+    closeRoute: closeRoute,
+    joinRoute: joinRoute,
+    onInitialDataReceived: onInitialDataReceived,
+    onMediaControllerClosed: onMediaControllerClosed,
+    onMediaControllerAvailable: onMediaControllerAvailable,
+    pauseCurrentMedia: pauseCurrentMedia,
+    playCurrentMedia: playCurrentMedia,
+    reportBlur: reportBlur,
+    reportClickedSinkIndex: reportClickedSinkIndex,
+    reportFilter: reportFilter,
+    reportInitialAction: reportInitialAction,
+    reportInitialState: reportInitialState,
+    reportNavigateToView: reportNavigateToView,
+    reportRouteCreation: reportRouteCreation,
+    reportRouteCreationOutcome: reportRouteCreationOutcome,
+    reportSelectedCastMode: reportSelectedCastMode,
+    reportSinkCount: reportSinkCount,
+    reportTimeToClickSink: reportTimeToClickSink,
+    reportTimeToInitialActionClose: reportTimeToInitialActionClose,
+    requestInitialData: requestInitialData,
+    requestRoute: requestRoute,
+    searchSinksAndCreateRoute: searchSinksAndCreateRoute,
+    seekCurrentMedia: seekCurrentMedia,
+    setCurrentMediaMute: setCurrentMediaMute,
+    setCurrentMediaVolume: setCurrentMediaVolume,
+  };
+});
diff --git a/chrome/browser/resources/media_router/media_router_common.css b/chrome/browser/resources/media_router/media_router_common.css
index 767fd1e..dd22f1cc 100644
--- a/chrome/browser/resources/media_router/media_router_common.css
+++ b/chrome/browser/resources/media_router/media_router_common.css
@@ -5,6 +5,7 @@
 :root {
   --dialog-padding-end: 26px;
   --dialog-padding-start: 16px;
+  --dialog-width: 340px;
   --navigation-icon-button-size: 36px;
   --non-navigation-icon-size: 16px;
 }
diff --git a/chrome/browser/resources/media_router/media_router_data.js b/chrome/browser/resources/media_router/media_router_data.js
index 674fd2b..441ea8e 100644
--- a/chrome/browser/resources/media_router/media_router_data.js
+++ b/chrome/browser/resources/media_router/media_router_data.js
@@ -24,6 +24,16 @@
 };
 
 /**
+ * Route controller types that can be shown in the route details view.
+ * @enum {number}
+ */
+media_router.ControllerType = {
+  NONE: 0,
+  WEBUI: 1,
+  EXTENSION: 2,
+};
+
+/**
  * The ESC key maps to KeyboardEvent.key value 'Escape'.
  * @const {string}
  */
@@ -212,6 +222,61 @@
     this.customControllerPath = customControllerPath;
   };
 
+  /**
+   * @param {string} title The title of the route.
+   * @param {string} description A description for the route.
+   * @param {boolean} canPlayPause Whether the route can be played/paused.
+   * @param {boolean} canMute Whether the route can be muted/unmuted.
+   * @param {boolean} canSetVolume Whether the route volume can be changed.
+   * @param {boolean} canSeek Whether the route's playback position can be
+   *     changed.
+   * @param {boolean} isPaused Whether the route is paused.
+   * @param {boolean} isMuted Whether the route is muted.
+   * @param {number} volume The route's volume, between 0 and 1.
+   * @param {number} duration The route's duration in seconds.
+   * @param {number} currentTime The route's current position in seconds.
+   *     Must not be greater than |duration|.
+   * @constructor
+   * @struct
+   */
+  var RouteStatus = function(
+      title, description, canPlayPause, canMute, canSetVolume, canSeek,
+      isPaused, isMuted, volume, duration, currentTime) {
+
+    /** @type {string} */
+    this.title = title;
+
+    /** @type {string} */
+    this.description = description;
+
+    /** @type {boolean} */
+    this.canPlayPause = canPlayPause;
+
+    /** @type {boolean} */
+    this.canMute = canMute;
+
+    /** @type {boolean} */
+    this.canSetVolume = canSetVolume;
+
+    /** @type {boolean} */
+    this.canSeek = canSeek;
+
+    /** @type {boolean} */
+    this.isPaused = isPaused;
+
+    /** @type {boolean} */
+    this.isMuted = isMuted;
+
+    /** @type {number} */
+    this.volume = volume;
+
+    /** @type {number} */
+    this.duration = duration;
+
+    /** @type {number} */
+    this.currentTime = currentTime;
+  };
+
 
   /**
    * @param {string} id The ID of the media sink.
@@ -271,6 +336,7 @@
     CastMode: CastMode,
     Issue: Issue,
     Route: Route,
+    RouteStatus: RouteStatus,
     Sink: Sink,
     TabInfo: TabInfo,
   };
diff --git a/chrome/browser/resources/media_router/media_router_ui_interface.js b/chrome/browser/resources/media_router/media_router_ui_interface.js
index a8ec544..abe9a27 100644
--- a/chrome/browser/resources/media_router/media_router_ui_interface.js
+++ b/chrome/browser/resources/media_router/media_router_ui_interface.js
@@ -13,6 +13,9 @@
   // The media-router-header element.
   var header = null;
 
+  // The route-controls element. Is null if the route details view isn't open.
+  var routeControls = null;
+
   /**
    * Handles response of previous create route attempt.
    *
@@ -27,6 +30,14 @@
   }
 
   /**
+   * Called when the route controller for the route that is currently selected
+   * is invalidated.
+   */
+  function onRouteControllerInvalidated() {
+    container.onRouteControllerInvalidated();
+  }
+
+  /**
    * Handles the search response by forwarding |sinkId| to the container.
    *
    * @param {string} sinkId The ID of the sink found by search.
@@ -47,7 +58,7 @@
   /**
    * Sets |container| and |header|.
    *
-   * @param {!MediaRouterContainerElement} mediaRouterContainer
+   * @param {!MediaRouterContainerInterface} mediaRouterContainer
    * @param {!MediaRouterHeaderElement} mediaRouterHeader
    */
   function setElements(mediaRouterContainer, mediaRouterHeader) {
@@ -75,10 +86,8 @@
   function setFirstRunFlowData(data) {
     container.firstRunFlowCloudPrefLearnMoreUrl =
         data['firstRunFlowCloudPrefLearnMoreUrl'];
-    container.firstRunFlowLearnMoreUrl =
-        data['firstRunFlowLearnMoreUrl'];
-    container.showFirstRunFlowCloudPref =
-        data['showFirstRunFlowCloudPref'];
+    container.firstRunFlowLearnMoreUrl = data['firstRunFlowLearnMoreUrl'];
+    container.showFirstRunFlowCloudPref = data['showFirstRunFlowCloudPref'];
     // Some users acknowledged the first run flow before the cloud prefs
     // setting was implemented. These users will see the first run flow
     // again.
@@ -102,6 +111,7 @@
    * Parameters in data:
    *   deviceMissingUrl - url to be opened on "Device missing?" clicked.
    *   sinksAndIdentity - list of sinks to be displayed and user identity.
+   *   useWebUiRouteControls - whether new WebUI route controls should be used.
    *   routes - list of routes that are associated with the sinks.
    *   castModes - list of available cast modes.
    *   useTabMirroring - whether the cast mode should be set to TAB_MIRROR.
@@ -110,6 +120,7 @@
     container.deviceMissingUrl = data['deviceMissingUrl'];
     container.castModeList = data['castModes'];
     this.setSinkListAndIdentity(data['sinksAndIdentity']);
+    container.useWebUiRouteControls = !!data['useWebUiRouteControls'];
     container.routeList = data['routes'];
     container.maybeShowRouteDetailsOnOpen();
     if (data['useTabMirroring'])
@@ -128,6 +139,16 @@
   }
 
   /**
+   * Sets |routeControls|. The argument may be null if the route details view is
+   * getting closed.
+   *
+   * @param {?RouteControlsInterface} mediaRouterRouteControls
+   */
+  function setRouteControls(mediaRouterRouteControls) {
+    routeControls = mediaRouterRouteControls;
+  }
+
+  /**
    * Sets the list of currently active routes.
    *
    * @param {!Array<!media_router.Route>} routeList
@@ -166,263 +187,30 @@
     container.updateMaxDialogHeight(height);
   }
 
+  /**
+   * Updates the route status shown in the route controls.
+   *
+   * @param {!media_router.RouteStatus} status
+   */
+  function updateRouteStatus(status) {
+    if (routeControls) {
+      routeControls.routeStatus = status;
+    }
+  }
+
   return {
     onCreateRouteResponseReceived: onCreateRouteResponseReceived,
+    onRouteControllerInvalidated: onRouteControllerInvalidated,
     receiveSearchResult: receiveSearchResult,
     setCastModeList: setCastModeList,
     setElements: setElements,
     setFirstRunFlowData: setFirstRunFlowData,
     setInitialData: setInitialData,
     setIssue: setIssue,
+    setRouteControls: setRouteControls,
     setRouteList: setRouteList,
     setSinkListAndIdentity: setSinkListAndIdentity,
     updateMaxHeight: updateMaxHeight,
-  };
-});
-
-// API invoked by this UI to communicate with the browser WebUI message handler.
-cr.define('media_router.browserApi', function() {
-  'use strict';
-
-  /**
-   * Indicates that the user has acknowledged the first run flow.
-   *
-   * @param {boolean} optedIntoCloudServices Whether or not the user opted into
-   *                  cloud services.
-   */
-  function acknowledgeFirstRunFlow(optedIntoCloudServices) {
-    chrome.send('acknowledgeFirstRunFlow', [optedIntoCloudServices]);
-  }
-
-  /**
-   * Acts on the given issue.
-   *
-   * @param {number} issueId
-   * @param {number} actionType Type of action that the user clicked.
-   * @param {?number} helpPageId The numeric help center ID.
-   */
-  function actOnIssue(issueId, actionType, helpPageId) {
-    chrome.send('actOnIssue', [{issueId: issueId, actionType: actionType,
-                                helpPageId: helpPageId}]);
-  }
-
-  /**
-   * Modifies |route| by changing its source to the one identified by
-   * |selectedCastMode|.
-   *
-   * @param {!media_router.Route} route The route being modified.
-   * @param {number} selectedCastMode The value of the cast mode the user
-   *   selected.
-   */
-  function changeRouteSource(route, selectedCastMode) {
-    chrome.send('requestRoute',
-                [{sinkId: route.sinkId, selectedCastMode: selectedCastMode}]);
-  }
-
-  /**
-   * Closes the dialog.
-   *
-   * @param {boolean} pressEscToClose Whether the user pressed ESC to close the
-   *                  dialog.
-   */
-  function closeDialog(pressEscToClose) {
-    chrome.send('closeDialog', [pressEscToClose]);
-  }
-
-  /**
-   * Closes the given route.
-   *
-   * @param {!media_router.Route} route
-   */
-  function closeRoute(route) {
-    chrome.send('closeRoute', [{routeId: route.id, isLocal: route.isLocal}]);
-  }
-
-  /**
-   * Joins the given route.
-   *
-   * @param {!media_router.Route} route
-   */
-  function joinRoute(route) {
-    chrome.send('joinRoute', [{sinkId: route.sinkId, routeId: route.id}]);
-  }
-
-  /**
-   * Indicates that the initial data has been received.
-   */
-  function onInitialDataReceived() {
-    chrome.send('onInitialDataReceived');
-  }
-
-  /**
-   * Reports when the user clicks outside the dialog.
-   */
-  function reportBlur() {
-    chrome.send('reportBlur');
-  }
-
-  /**
-   * Reports the index of the selected sink.
-   *
-   * @param {number} sinkIndex
-   */
-  function reportClickedSinkIndex(sinkIndex) {
-    chrome.send('reportClickedSinkIndex', [sinkIndex]);
-  }
-
-  /**
-   * Reports that the user used the filter input.
-   */
-  function reportFilter() {
-    chrome.send('reportFilter');
-  }
-
-  /**
-   * Reports the initial dialog view.
-   *
-   * @param {string} view
-   */
-  function reportInitialState(view) {
-    chrome.send('reportInitialState', [view]);
-  }
-
-  /**
-   * Reports the initial action the user took.
-   *
-   * @param {number} action
-   */
-  function reportInitialAction(action) {
-    chrome.send('reportInitialAction', [action]);
-  }
-
-  /**
-   * Reports the navigation to the specified view.
-   *
-   * @param {string} view
-   */
-  function reportNavigateToView(view) {
-    chrome.send('reportNavigateToView', [view]);
-  }
-
-  /**
-   * Reports whether or not a route was created successfully.
-   *
-   * @param {boolean} success
-   */
-  function reportRouteCreation(success) {
-    chrome.send('reportRouteCreation', [success]);
-  }
-
-  /**
-   * Reports the outcome of a create route response.
-   *
-   * @param {number} outcome
-   */
-  function reportRouteCreationOutcome(outcome) {
-    chrome.send('reportRouteCreationOutcome', [outcome]);
-  }
-
-  /**
-   * Reports the cast mode that the user selected.
-   *
-   * @param {number} castModeType
-   */
-  function reportSelectedCastMode(castModeType) {
-    chrome.send('reportSelectedCastMode', [castModeType]);
-  }
-
-  /**
-   * Reports the current number of sinks.
-   *
-   * @param {number} sinkCount
-   */
-  function reportSinkCount(sinkCount) {
-    chrome.send('reportSinkCount', [sinkCount]);
-  }
-
-  /**
-   * Reports the time it took for the user to select a sink after the sink list
-   * is populated and shown.
-   *
-   * @param {number} timeMs
-   */
-  function reportTimeToClickSink(timeMs) {
-    chrome.send('reportTimeToClickSink', [timeMs]);
-  }
-
-  /**
-   * Reports the time, in ms, it took for the user to close the dialog without
-   * taking any other action.
-   *
-   * @param {number} timeMs
-   */
-  function reportTimeToInitialActionClose(timeMs) {
-    chrome.send('reportTimeToInitialActionClose', [timeMs]);
-  }
-
-  /**
-   * Requests data to initialize the WebUI with.
-   * The data will be returned via media_router.ui.setInitialData.
-   */
-  function requestInitialData() {
-    chrome.send('requestInitialData');
-  }
-
-  /**
-   * Requests that a media route be started with the given sink.
-   *
-   * @param {string} sinkId The sink ID.
-   * @param {number} selectedCastMode The value of the cast mode the user
-   *   selected.
-   */
-  function requestRoute(sinkId, selectedCastMode) {
-    chrome.send('requestRoute',
-                [{sinkId: sinkId, selectedCastMode: selectedCastMode}]);
-  }
-
-  /**
-   * Requests that the media router search all providers for a sink matching
-   * |searchCriteria| that can be used with the media source associated with the
-   * cast mode |selectedCastMode|. If such a sink is found, a route is also
-   * created between the sink and the media source.
-   *
-   * @param {string} sinkId Sink ID of the pseudo sink generating the request.
-   * @param {string} searchCriteria Search criteria for the route providers.
-   * @param {string} domain User's current hosted domain.
-   * @param {number} selectedCastMode The value of the cast mode to be used with
-   *   the sink.
-   */
-  function searchSinksAndCreateRoute(
-      sinkId, searchCriteria, domain, selectedCastMode) {
-    chrome.send('searchSinksAndCreateRoute',
-                [{sinkId: sinkId,
-                  searchCriteria: searchCriteria,
-                  domain: domain,
-                  selectedCastMode: selectedCastMode}]);
-  }
-
-  return {
-    acknowledgeFirstRunFlow: acknowledgeFirstRunFlow,
-    actOnIssue: actOnIssue,
-    changeRouteSource: changeRouteSource,
-    closeDialog: closeDialog,
-    closeRoute: closeRoute,
-    joinRoute: joinRoute,
-    onInitialDataReceived: onInitialDataReceived,
-    reportBlur: reportBlur,
-    reportClickedSinkIndex: reportClickedSinkIndex,
-    reportFilter: reportFilter,
-    reportInitialAction: reportInitialAction,
-    reportInitialState: reportInitialState,
-    reportNavigateToView: reportNavigateToView,
-    reportRouteCreation: reportRouteCreation,
-    reportRouteCreationOutcome: reportRouteCreationOutcome,
-    reportSelectedCastMode: reportSelectedCastMode,
-    reportSinkCount: reportSinkCount,
-    reportTimeToClickSink: reportTimeToClickSink,
-    reportTimeToInitialActionClose: reportTimeToInitialActionClose,
-    requestInitialData: requestInitialData,
-    requestRoute: requestRoute,
-    searchSinksAndCreateRoute: searchSinksAndCreateRoute,
+    updateRouteStatus: updateRouteStatus,
   };
 });
diff --git a/chrome/browser/resources/settings/printing_page/cups_printers_list.html b/chrome/browser/resources/settings/printing_page/cups_printers_list.html
index 76c891a..578b48c 100644
--- a/chrome/browser/resources/settings/printing_page/cups_printers_list.html
+++ b/chrome/browser/resources/settings/printing_page/cups_printers_list.html
@@ -9,19 +9,8 @@
 <dom-module id="settings-cups-printers-list">
   <template>
     <style include="settings-shared">
-      #container {
-        border-top: 1px solid lightgray;
-        display: flex;
-        padding: 2px 20px;
-      }
-
-      .name-column {
+      .printer-name {
         flex: 1;
-        margin: 2px;
-      }
-
-      .list-item {
-        min-height: 20px;
       }
     </style>
 
@@ -33,18 +22,18 @@
         $i18n{removePrinter}
       </button>
     </dialog>
-    <template is="dom-repeat" items="[[printers]]"
-        filter="[[filterPrinter_(searchTerm)]]">
-      <div id="container" class="list-item">
-        <div class="name-column">
-          <span class="name" id="printer-name">[[item.printerName]]</span>
+    <div class="list-frame vertical-list">
+      <template is="dom-repeat" items="[[printers]]"
+          filter="[[filterPrinter_(searchTerm)]]">
+        <div class="list-item">
+          <div class="printer-name text-elide">[[item.printerName]]</div>
           <!--TODO(xdai): Add icon for enterprise CUPS printer. -->
+          <paper-icon-button icon="cr:more-vert" on-tap="onOpenActionMenuTap_"
+              title="$i18n{moreActions}">
+          </paper-icon-button>
         </div>
-        <paper-icon-button icon="cr:more-vert" on-tap="onOpenActionMenuTap_"
-            title="$i18n{moreActions}">
-        </paper-icon-button>
-      </div>
-    </template>
+      </template
+    </div>
   </template>
   <script src="cups_printers_list.js"></script>
 </dom-module>
diff --git a/chrome/browser/resources/settings/route.js b/chrome/browser/resources/settings/route.js
index 5027152..b675fc89 100644
--- a/chrome/browser/resources/settings/route.js
+++ b/chrome/browser/resources/settings/route.js
@@ -308,7 +308,7 @@
   var currentQueryParameters = new URLSearchParams();
 
   /** @private {boolean} */
-  var lastRouteChangeWasPopstate_ = false;
+  var wasLastRouteChangePopstate = false;
 
   /** @private */
   var initializeRouteFromUrlCalled = false;
@@ -332,7 +332,7 @@
 
   function resetRouteForTesting() {
     initializeRouteFromUrlCalled = false;
-    lastRouteChangeWasPopstate_ = false;
+    wasLastRouteChangePopstate = false;
     currentRoute = Route.BASIC;
     currentQueryParameters = new URLSearchParams();
   }
@@ -347,7 +347,7 @@
     var oldRoute = currentRoute;
     currentRoute = route;
     currentQueryParameters = queryParameters;
-    lastRouteChangeWasPopstate_ = isPopstate;
+    wasLastRouteChangePopstate = isPopstate;
     routeObservers.forEach(function(observer) {
       observer.currentRouteChanged(currentRoute, oldRoute);
     });
@@ -363,7 +363,7 @@
 
   /** @return {boolean} */
   var lastRouteChangeWasPopstate = function() {
-    return lastRouteChangeWasPopstate_;
+    return wasLastRouteChangePopstate;
   };
 
   /**
diff --git a/chrome/browser/resources/settings/settings_page/main_page_behavior.js b/chrome/browser/resources/settings/settings_page/main_page_behavior.js
index 3886816a..331e9d5 100644
--- a/chrome/browser/resources/settings/settings_page/main_page_behavior.js
+++ b/chrome/browser/resources/settings/settings_page/main_page_behavior.js
@@ -13,7 +13,7 @@
     /**
      * Help CSS to alter style during the horizontal swipe animation.
      * Note that this is unrelated to the |currentAnimation_| (which refers to
-     * the vertical exapand animation).
+     * the vertical expand animation).
      */
     isSubpageAnimating: {
       reflectToAttribute: true,
@@ -35,9 +35,7 @@
   /** @type {?HTMLElement} The scrolling container. */
   scroller: null,
 
-  listeners: {
-    'neon-animation-finish': 'onNeonAnimationFinish_'
-  },
+  listeners: {'neon-animation-finish': 'onNeonAnimationFinish_'},
 
   /** @override */
   attached: function() {
diff --git a/chrome/browser/search/local_ntp_source.cc b/chrome/browser/search/local_ntp_source.cc
index 6fab4ea..3e2a821c 100644
--- a/chrome/browser/search/local_ntp_source.cc
+++ b/chrome/browser/search/local_ntp_source.cc
@@ -72,7 +72,6 @@
     {kThemeCSSFilename, kLocalResource, "text/css"},
     {"local-ntp.css", IDR_LOCAL_NTP_CSS, "text/css"},
     {"images/close_3_mask.png", IDR_CLOSE_3_MASK, "image/png"},
-    {"images/close_4_button.png", IDR_CLOSE_4_BUTTON, "image/png"},
     {"images/ntp_default_favicon.png", IDR_NTP_DEFAULT_FAVICON, "image/png"},
     {kOneGoogleBarScriptFilename, kLocalResource, "text/javascript"},
     {kOneGoogleBarInHeadStyleFilename, kLocalResource, "text/css"},
@@ -425,7 +424,7 @@
          GetIntegritySha256Value(
              GetConfigData(default_search_provider_is_google_io_thread_)) +
          "' "
-         "'sha256-yAvSu2Dl9rlQTpQn8P1hcE5GUFQVGbuCMHypwtN6uDg=';";
+         "'sha256-//Ntxa12Vzvs6oUFThZ7SAu9dDxHfqgUeSTOrQKqlgE=';";
 }
 
 std::string LocalNtpSource::GetContentSecurityPolicyChildSrc() const {
diff --git a/chrome/browser/ui/ash/launcher/launcher_context_menu_unittest.cc b/chrome/browser/ui/ash/launcher/launcher_context_menu_unittest.cc
index 99c3cf0..9b2b0a4 100644
--- a/chrome/browser/ui/ash/launcher/launcher_context_menu_unittest.cc
+++ b/chrome/browser/ui/ash/launcher/launcher_context_menu_unittest.cc
@@ -83,7 +83,7 @@
     ash::RootWindowController* root_window_controller =
         ash::Shell::GetRootWindowControllerWithDisplayId(display_id);
     EXPECT_NE(nullptr, root_window_controller);
-    return root_window_controller->GetShelf();
+    return root_window_controller->shelf();
   }
 
   LauncherContextMenu* CreateLauncherContextMenu(
diff --git a/chrome/browser/ui/browser_command_controller.cc b/chrome/browser/ui/browser_command_controller.cc
index 7db71e16..7486eea 100644
--- a/chrome/browser/ui/browser_command_controller.cc
+++ b/chrome/browser/ui/browser_command_controller.cc
@@ -11,7 +11,6 @@
 #include "base/command_line.h"
 #include "base/debug/debugging_flags.h"
 #include "base/debug/profiler.h"
-#include "base/feature_list.h"
 #include "base/macros.h"
 #include "base/metrics/user_metrics.h"
 #include "build/build_config.h"
@@ -37,7 +36,6 @@
 #include "chrome/browser/ui/chrome_pages.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
 #include "chrome/browser/ui/webui/inspect_ui.h"
-#include "chrome/common/chrome_features.h"
 #include "chrome/common/content_restriction.h"
 #include "chrome/common/pref_names.h"
 #include "chrome/common/profiling.h"
@@ -308,20 +306,14 @@
   switch (id) {
     // Navigation commands
     case IDC_BACKSPACE_BACK:
-      if (base::FeatureList::IsEnabled(features::kBackspaceGoesBackFeature))
-        GoBack(browser_, disposition);
-      else
-        window()->MaybeShowNewBackShortcutBubble(false);
+      window()->MaybeShowNewBackShortcutBubble(false);
       break;
     case IDC_BACK:
       window()->HideNewBackShortcutBubble();
       GoBack(browser_, disposition);
       break;
     case IDC_BACKSPACE_FORWARD:
-      if (base::FeatureList::IsEnabled(features::kBackspaceGoesBackFeature))
-        GoForward(browser_, disposition);
-      else
-        window()->MaybeShowNewBackShortcutBubble(true);
+      window()->MaybeShowNewBackShortcutBubble(true);
       break;
     case IDC_FORWARD:
       window()->HideNewBackShortcutBubble();
diff --git a/chrome/browser/ui/cocoa/page_info/page_info_bubble_controller.h b/chrome/browser/ui/cocoa/page_info/page_info_bubble_controller.h
index 5e7d885..760dc9fa2 100644
--- a/chrome/browser/ui/cocoa/page_info/page_info_bubble_controller.h
+++ b/chrome/browser/ui/cocoa/page_info/page_info_bubble_controller.h
@@ -153,6 +153,11 @@
                          ChosenObjectInfoList chosen_object_info_list) override;
   void SetIdentityInfo(const IdentityInfo& identity_info) override;
 
+ protected:
+  // WebContentsObserver implementation.
+  void DidFinishNavigation(
+      content::NavigationHandle* navigation_handle) override;
+
  private:
   // The WebContents the bubble UI is attached to.
   content::WebContents* web_contents_;
diff --git a/chrome/browser/ui/cocoa/page_info/page_info_bubble_controller.mm b/chrome/browser/ui/cocoa/page_info/page_info_bubble_controller.mm
index 12f7ae7f..c5c727c 100644
--- a/chrome/browser/ui/cocoa/page_info/page_info_bubble_controller.mm
+++ b/chrome/browser/ui/cocoa/page_info/page_info_bubble_controller.mm
@@ -30,6 +30,7 @@
 #include "chrome/grit/theme_resources.h"
 #include "components/strings/grit/components_chromium_strings.h"
 #include "components/strings/grit/components_strings.h"
+#include "content/public/browser/navigation_handle.h"
 #include "content/public/browser/page_navigator.h"
 #include "content/public/browser/ssl_host_state_delegate.h"
 #include "content/public/browser/web_contents.h"
@@ -1336,3 +1337,13 @@
   [bubble_controller_ setPermissionInfo:permission_info_list
                        andChosenObjects:std::move(chosen_object_info_list)];
 }
+
+void PageInfoUIBridge::DidFinishNavigation(
+    content::NavigationHandle* navigation_handle) {
+  if (!navigation_handle->IsInMainFrame() ||
+      !navigation_handle->HasCommitted()) {
+    return;
+  }
+  // If the browser navigates to another page, close the bubble.
+  [bubble_controller_ close];
+}
diff --git a/chrome/browser/ui/cocoa/translate/translate_bubble_controller.mm b/chrome/browser/ui/cocoa/translate/translate_bubble_controller.mm
index 4c12602..6e7c46f 100644
--- a/chrome/browser/ui/cocoa/translate/translate_bubble_controller.mm
+++ b/chrome/browser/ui/cocoa/translate/translate_bubble_controller.mm
@@ -25,6 +25,7 @@
 #include "chrome/browser/ui/translate/translate_bubble_view_state_transition.h"
 #include "chrome/common/url_constants.h"
 #include "chrome/grit/generated_resources.h"
+#include "chrome/grit/theme_resources.h"
 #include "components/strings/grit/components_strings.h"
 #include "components/translate/core/browser/translate_ui_delegate.h"
 #include "content/public/browser/browser_context.h"
@@ -36,7 +37,6 @@
 #import "ui/base/cocoa/window_size_constants.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/models/combobox_model.h"
-#include "ui/resources/grit/ui_resources.h"
 
 // TODO(hajimehoshi): This class is almost same as that of views. Refactor them.
 class TranslateDenialComboboxModel : public ui::ComboboxModel {
@@ -659,7 +659,7 @@
   base::scoped_nsobject<NSImageView> image(
       [[NSImageView alloc] initWithFrame:imageFrame]);
   [image setImage:(ui::ResourceBundle::GetSharedInstance()
-                       .GetImageNamed(IDR_TRANSLATE_ICON_BUBBLE)
+                       .GetImageNamed(IDR_TRANSLATE_BUBBLE_ICON)
                        .ToNSImage())];
   [view addSubview:image];
   return image.get();
diff --git a/chrome/browser/ui/views/constrained_window_views_browsertest.cc b/chrome/browser/ui/views/constrained_window_views_browsertest.cc
index 5db441f..5538e473 100644
--- a/chrome/browser/ui/views/constrained_window_views_browsertest.cc
+++ b/chrome/browser/ui/views/constrained_window_views_browsertest.cc
@@ -5,14 +5,11 @@
 #include <memory>
 
 #include "base/macros.h"
-#include "base/test/scoped_feature_list.h"
 #include "build/build_config.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_commands.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
 #include "chrome/browser/ui/views/tab_modal_confirm_dialog_views.h"
-#include "chrome/common/chrome_features.h"
-#include "chrome/common/url_constants.h"
 #include "chrome/test/base/in_process_browser_test.h"
 #include "chrome/test/base/interactive_test_utils.h"
 #include "chrome/test/base/ui_test_utils.h"
@@ -170,51 +167,6 @@
   EXPECT_EQ(NULL, dialog->GetWidget());
 }
 
-// Tests that the web contents navigates when backspace is pressed.
-IN_PROC_BROWSER_TEST_F(ConstrainedWindowViewTest, NavigationOnBackspace) {
-  content::WebContents* web_contents =
-      browser()->tab_strip_model()->GetActiveWebContents();
-  content::WaitForLoadStop(web_contents);
-  const GURL original_url = web_contents->GetURL();
-  EXPECT_NE(GURL(chrome::kChromeUIVersionURL), original_url);
-  ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUIVersionURL));
-  content::WaitForLoadStop(web_contents);
-  EXPECT_EQ(GURL(chrome::kChromeUIVersionURL), web_contents->GetURL());
-
-  std::unique_ptr<TestDialog> dialog = ShowModalDialog(web_contents);
-
-  views::Widget* widget = dialog->GetWidget();
-
-  EXPECT_TRUE(widget->IsVisible());
-  EXPECT_EQ(dialog->GetContentsView(),
-            widget->GetFocusManager()->GetFocusedView());
-
-  // Pressing backspace should not navigate back and close the dialog
-  // with the Finch flag disabled.
-  EXPECT_TRUE(chrome::CanGoBack(browser()));
-  EXPECT_TRUE(ui_test_utils::SendKeyPressSync(browser(), ui::VKEY_BACK,
-                                              false, false, false, false));
-  content::RunAllPendingInMessageLoop();
-  content::WaitForLoadStop(web_contents);
-
-  EXPECT_EQ(widget, dialog->GetWidget());
-  EXPECT_EQ(GURL(chrome::kChromeUIVersionURL), web_contents->GetURL());
-
-  // Pressing backspace should navigate back and close the dialog with the
-  // Finch flag enabled.
-  base::test::ScopedFeatureList scoped_feature_list;
-  scoped_feature_list.InitAndEnableFeature(features::kBackspaceGoesBackFeature);
-
-  EXPECT_TRUE(chrome::CanGoBack(browser()));
-  EXPECT_TRUE(ui_test_utils::SendKeyPressSync(browser(), ui::VKEY_BACK,
-                                              false, false, false, false));
-  content::RunAllPendingInMessageLoop();
-  content::WaitForLoadStop(web_contents);
-
-  EXPECT_EQ(nullptr, dialog->GetWidget());
-  EXPECT_EQ(original_url, web_contents->GetURL());
-}
-
 // Tests that the dialog closes when the escape key is pressed.
 IN_PROC_BROWSER_TEST_F(ConstrainedWindowViewTest, ClosesOnEscape) {
 #if defined(OS_WIN)
diff --git a/chrome/browser/ui/views/download/download_item_view.cc b/chrome/browser/ui/views/download/download_item_view.cc
index 70778160..4a9360e 100644
--- a/chrome/browser/ui/views/download/download_item_view.cc
+++ b/chrome/browser/ui/views/download/download_item_view.cc
@@ -180,6 +180,7 @@
 
   dropdown_button_->SetBorder(
       views::CreateEmptyBorder(gfx::Insets(kDropdownBorderWidth)));
+  dropdown_button_->set_has_ink_drop_action_on_click(false);
   AddChildView(dropdown_button_);
 
   LoadIcon();
@@ -529,9 +530,6 @@
 
 std::unique_ptr<views::InkDropHighlight>
 DownloadItemView::CreateInkDropHighlight() const {
-  if (IsShowingWarningDialog())
-    return nullptr;
-
   gfx::Size size = GetPreferredSize();
   return base::MakeUnique<views::InkDropHighlight>(
       size, kInkDropSmallCornerRadius,
@@ -539,6 +537,10 @@
       color_utils::DeriveDefaultIconColor(GetTextColor()));
 }
 
+void DownloadItemView::OnInkDropCreated() {
+  ConfigureInkDrop();
+}
+
 void DownloadItemView::OnGestureEvent(ui::GestureEvent* event) {
   if (event->type() == ui::ET_GESTURE_TAP_DOWN) {
     HandlePressEvent(*event, true);
@@ -893,6 +895,16 @@
   SchedulePaint();
 }
 
+void DownloadItemView::ConfigureInkDrop() {
+  if (HasInkDrop())
+    GetInkDrop()->SetShowHighlightOnHover(!IsShowingWarningDialog());
+}
+
+void DownloadItemView::SetMode(Mode mode) {
+  mode_ = mode;
+  ConfigureInkDrop();
+}
+
 void DownloadItemView::ToggleWarningDialog() {
   if (model_.IsDangerous())
     ShowWarningDialog();
@@ -912,7 +924,7 @@
          content::DOWNLOAD_DANGER_TYPE_USER_VALIDATED);
   DCHECK(IsShowingWarningDialog());
 
-  mode_ = NORMAL_MODE;
+  SetMode(NORMAL_MODE);
   dropdown_state_ = NORMAL;
 
   // ExperienceSampling: User proceeded through the warning.
@@ -936,7 +948,7 @@
 }
 
 void DownloadItemView::ShowWarningDialog() {
-  DCHECK(mode_ != DANGEROUS_MODE && mode_ != MALICIOUS_MODE);
+  DCHECK(!IsShowingWarningDialog());
   time_download_warning_shown_ = base::Time::Now();
   content::DownloadDangerType danger_type = download()->GetDangerType();
   RecordDangerousDownloadWarningShown(danger_type);
@@ -946,7 +958,7 @@
         danger_type);
   }
 #endif
-  mode_ = model_.MightBeMalicious() ? MALICIOUS_MODE : DANGEROUS_MODE;
+  SetMode(model_.MightBeMalicious() ? MALICIOUS_MODE : DANGEROUS_MODE);
 
   // ExperienceSampling: Dangerous or malicious download warning is being shown
   // to the user, so we start a new SamplingEvent and track it.
diff --git a/chrome/browser/ui/views/download/download_item_view.h b/chrome/browser/ui/views/download/download_item_view.h
index 981bdd95..6d02fc7c 100644
--- a/chrome/browser/ui/views/download/download_item_view.h
+++ b/chrome/browser/ui/views/download/download_item_view.h
@@ -116,6 +116,7 @@
   std::unique_ptr<views::InkDropRipple> CreateInkDropRipple() const override;
   std::unique_ptr<views::InkDropHighlight> CreateInkDropHighlight()
       const override;
+  void OnInkDropCreated() override;
 
   // ui::EventHandler:
   void OnGestureEvent(ui::GestureEvent* event) override;
@@ -192,6 +193,11 @@
   // Sets the state and triggers a repaint.
   void SetDropdownState(State new_state);
 
+  // Configures the InkDrop. e.g. disables highlight when in dangerous mode.
+  void ConfigureInkDrop();
+
+  void SetMode(Mode mode);
+
   // Whether we are in the dangerous mode.
   bool IsShowingWarningDialog() const {
     return mode_ == DANGEROUS_MODE || mode_ == MALICIOUS_MODE;
diff --git a/chrome/browser/ui/views/ime/ime_warning_bubble_view.cc b/chrome/browser/ui/views/ime/ime_warning_bubble_view.cc
index d2dd0356..1435be2 100644
--- a/chrome/browser/ui/views/ime/ime_warning_bubble_view.cc
+++ b/chrome/browser/ui/views/ime/ime_warning_bubble_view.cc
@@ -18,7 +18,6 @@
 #include "chrome/browser/ui/views/toolbar/browser_actions_container.h"
 #include "chrome/browser/ui/views/toolbar/toolbar_view.h"
 #include "chrome/grit/generated_resources.h"
-#include "extensions/common/feature_switch.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/resource/resource_bundle.h"
 #include "ui/views/controls/button/checkbox.h"
@@ -96,7 +95,7 @@
     : extension_(extension),
       browser_view_(browser_view),
       browser_(browser_view->browser()),
-      anchor_to_browser_action_(false),
+      anchor_to_action_(false),
       never_show_checkbox_(nullptr),
       response_callback_(callback),
       bubble_has_shown_(false),
@@ -135,10 +134,10 @@
 void ImeWarningBubbleView::InitAnchorView() {
   views::View* reference_view = nullptr;
 
-  anchor_to_browser_action_ =
+  anchor_to_action_ =
       extensions::ActionInfo::GetBrowserActionInfo(extension_) ||
-      extensions::FeatureSwitch::extension_action_redesign()->IsEnabled();
-  if (anchor_to_browser_action_) {
+      extensions::ActionInfo::GetPageActionInfo(extension_);
+  if (anchor_to_action_) {
     // Anchors the bubble to the browser action of the extension.
     reference_view = container_->GetViewForId(extension_->id());
   }
@@ -193,5 +192,5 @@
 }
 
 bool ImeWarningBubbleView::IsToolbarAnimating() {
-  return anchor_to_browser_action_ && container_->animating();
+  return anchor_to_action_ && container_->animating();
 }
diff --git a/chrome/browser/ui/views/ime/ime_warning_bubble_view.h b/chrome/browser/ui/views/ime/ime_warning_bubble_view.h
index 1bbbf3f..04ca7a0c 100644
--- a/chrome/browser/ui/views/ime/ime_warning_bubble_view.h
+++ b/chrome/browser/ui/views/ime/ime_warning_bubble_view.h
@@ -77,8 +77,8 @@
   // OnBrowserRemoved() is called.
   Browser* browser_;
 
-  // True if bubble anchors to the browser action of the extension.
-  bool anchor_to_browser_action_;
+  // True if bubble anchors to the action of the extension.
+  bool anchor_to_action_;
 
   // The check box on the bubble view.
   views::Checkbox* never_show_checkbox_;
diff --git a/chrome/browser/ui/views/translate/translate_bubble_view.cc b/chrome/browser/ui/views/translate/translate_bubble_view.cc
index 35b9a6de..4a2aa3e7 100644
--- a/chrome/browser/ui/views/translate/translate_bubble_view.cc
+++ b/chrome/browser/ui/views/translate/translate_bubble_view.cc
@@ -25,6 +25,7 @@
 #include "chrome/browser/ui/views/harmony/chrome_layout_provider.h"
 #include "chrome/common/url_constants.h"
 #include "chrome/grit/generated_resources.h"
+#include "chrome/grit/theme_resources.h"
 #include "components/prefs/pref_service.h"
 #include "components/strings/grit/components_strings.h"
 #include "components/translate/core/browser/translate_download_manager.h"
@@ -36,7 +37,6 @@
 #include "ui/base/models/combobox_model.h"
 #include "ui/base/models/simple_combobox_model.h"
 #include "ui/base/resource/resource_bundle.h"
-#include "ui/resources/grit/ui_resources.h"
 #include "ui/views/bubble/bubble_frame_view.h"
 #include "ui/views/controls/button/blue_button.h"
 #include "ui/views/controls/button/checkbox.h"
@@ -67,7 +67,7 @@
 void AddIconToLayout(views::GridLayout* layout) {
   views::ImageView* icon = new views::ImageView();
   ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
-  icon->SetImage(bundle.GetImageNamed(IDR_TRANSLATE_ICON_BUBBLE).ToImageSkia());
+  icon->SetImage(bundle.GetImageNamed(IDR_TRANSLATE_BUBBLE_ICON).ToImageSkia());
   layout->AddView(icon);
 }
 
diff --git a/chrome/browser/ui/webui/chromeos/keyboard_overlay_ui.cc b/chrome/browser/ui/webui/chromeos/keyboard_overlay_ui.cc
index ae29d008..59a7300 100644
--- a/chrome/browser/ui/webui/chromeos/keyboard_overlay_ui.cc
+++ b/chrome/browser/ui/webui/chromeos/keyboard_overlay_ui.cc
@@ -10,14 +10,12 @@
 #include "base/bind.h"
 #include "base/bind_helpers.h"
 #include "base/command_line.h"
-#include "base/feature_list.h"
 #include "base/macros.h"
 #include "base/memory/ptr_util.h"
 #include "base/memory/weak_ptr.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/values.h"
 #include "chrome/browser/profiles/profile.h"
-#include "chrome/common/chrome_features.h"
 #include "chrome/common/pref_names.h"
 #include "chrome/common/url_constants.h"
 #include "chrome/grit/browser_resources.h"
@@ -316,9 +314,6 @@
   display::DisplayManager* display_manager = shell->display_manager();
   source->AddBoolean("keyboardOverlayIsDisplayUIScalingEnabled",
                      display_manager->IsDisplayUIScalingEnabled());
-  source->AddBoolean(
-      "backspaceGoesBackFeatureEnabled",
-      base::FeatureList::IsEnabled(features::kBackspaceGoesBackFeature));
   source->SetJsonPath("strings.js");
   source->AddResourcePath("keyboard_overlay.js", IDR_KEYBOARD_OVERLAY_JS);
   source->SetDefaultResource(IDR_KEYBOARD_OVERLAY_HTML);
diff --git a/chrome/browser/ui/webui/media_router/media_router_localized_strings_provider.cc b/chrome/browser/ui/webui/media_router/media_router_localized_strings_provider.cc
index 6345cbe..b28aadd 100644
--- a/chrome/browser/ui/webui/media_router/media_router_localized_strings_provider.cc
+++ b/chrome/browser/ui/webui/media_router/media_router_localized_strings_provider.cc
@@ -36,6 +36,18 @@
       IDS_MEDIA_ROUTER_STOP_CASTING_BUTTON);
   html_source->AddLocalizedString("startCastingButtonText",
                                   IDS_MEDIA_ROUTER_START_CASTING_BUTTON);
+  html_source->AddLocalizedString("playTitle",
+                                  IDS_MEDIA_ROUTER_ROUTE_DETAILS_PLAY_TITLE);
+  html_source->AddLocalizedString("pauseTitle",
+                                  IDS_MEDIA_ROUTER_ROUTE_DETAILS_PAUSE_TITLE);
+  html_source->AddLocalizedString("muteTitle",
+                                  IDS_MEDIA_ROUTER_ROUTE_DETAILS_MUTE_TITLE);
+  html_source->AddLocalizedString("unmuteTitle",
+                                  IDS_MEDIA_ROUTER_ROUTE_DETAILS_UNMUTE_TITLE);
+  html_source->AddLocalizedString("seekTitle",
+                                  IDS_MEDIA_ROUTER_ROUTE_DETAILS_SEEK_TITLE);
+  html_source->AddLocalizedString("volumeTitle",
+                                  IDS_MEDIA_ROUTER_ROUTE_DETAILS_VOLUME_TITLE);
 }
 
 void AddIssuesStrings(content::WebUIDataSource* html_source) {
diff --git a/chrome/browser/ui/webui/media_router/media_router_resources_provider.cc b/chrome/browser/ui/webui/media_router/media_router_resources_provider.cc
index 6450288..79861a0 100644
--- a/chrome/browser/ui/webui/media_router/media_router_resources_provider.cc
+++ b/chrome/browser/ui/webui/media_router/media_router_resources_provider.cc
@@ -64,9 +64,14 @@
       "elements/media_router_search_highlighter/"
       "media_router_search_highlighter.js",
       IDR_MEDIA_ROUTER_SEARCH_HIGHLIGHTER_JS);
-  html_source->AddResourcePath(
-      "elements/route_details/route_details.css",
-      IDR_ROUTE_DETAILS_CSS);
+  html_source->AddResourcePath("elements/route_controls/route_controls.css",
+                               IDR_ROUTE_CONTROLS_CSS);
+  html_source->AddResourcePath("elements/route_controls/route_controls.html",
+                               IDR_ROUTE_CONTROLS_HTML);
+  html_source->AddResourcePath("elements/route_controls/route_controls.js",
+                               IDR_ROUTE_CONTROLS_JS);
+  html_source->AddResourcePath("elements/route_details/route_details.css",
+                               IDR_ROUTE_DETAILS_CSS);
   html_source->AddResourcePath(
       "elements/route_details/route_details.html",
       IDR_ROUTE_DETAILS_HTML);
@@ -76,6 +81,17 @@
   html_source->AddResourcePath(
       "elements/media_router_container/pseudo_sink_search_state.js",
       IDR_PSEUDO_SINK_SEARCH_STATE_JS);
+  html_source->AddResourcePath(
+      "elements/route_details/extension_view_wrapper/"
+      "extension_view_wrapper.html",
+      IDR_EXTENSION_VIEW_WRAPPER_HTML);
+  html_source->AddResourcePath(
+      "elements/route_details/extension_view_wrapper/extension_view_wrapper.js",
+      IDR_EXTENSION_VIEW_WRAPPER_JS);
+  html_source->AddResourcePath(
+      "elements/route_details/extension_view_wrapper/"
+      "extension_view_wrapper.css",
+      IDR_EXTENSION_VIEW_WRAPPER_CSS);
 }
 
 }  // namespace
diff --git a/chrome/browser/ui/webui/media_router/media_router_webui_message_handler.cc b/chrome/browser/ui/webui/media_router/media_router_webui_message_handler.cc
index b4da44a..dda4615 100644
--- a/chrome/browser/ui/webui/media_router/media_router_webui_message_handler.cc
+++ b/chrome/browser/ui/webui/media_router/media_router_webui_message_handler.cc
@@ -502,7 +502,7 @@
   initial_data.SetBoolean("useTabMirroring", use_tab_mirroring);
 
   initial_data.SetBoolean(
-      "useNewRouteControls",
+      "useWebUiRouteControls",
       base::FeatureList::IsEnabled(features::kMediaRouterUIRouteController));
 
   web_ui()->CallJavascriptFunctionUnsafe(kSetInitialData, initial_data);
diff --git a/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.cc b/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.cc
index 0a07cfa..2d1181a 100644
--- a/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.cc
+++ b/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.cc
@@ -11,6 +11,7 @@
 #include "base/files/file_util.h"
 #include "base/json/json_string_value_serializer.h"
 #include "base/memory/ptr_util.h"
+#include "base/metrics/histogram_macros.h"
 #include "base/path_service.h"
 #include "base/strings/string_util.h"
 #include "base/threading/sequenced_task_runner_handle.h"
@@ -413,7 +414,8 @@
   FireWebUIListener("on-printer-discovered", *printers_list);
 }
 
-void CupsPrintersHandler::OnDiscoveryInitialScanDone() {
+void CupsPrintersHandler::OnDiscoveryInitialScanDone(int printer_count) {
+  UMA_HISTOGRAM_COUNTS_100("Printing.CUPS.PrintersDiscovered", printer_count);
   FireWebUIListener("on-printer-discovery-done");
 }
 
diff --git a/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.h b/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.h
index 4004a5e..343daea 100644
--- a/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.h
+++ b/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.h
@@ -88,7 +88,7 @@
 
   // chromeos::PrinterDiscoverer::Observer override:
   void OnPrintersFound(const std::vector<Printer>& printers) override;
-  void OnDiscoveryInitialScanDone() override;
+  void OnDiscoveryInitialScanDone(int printer_count) override;
 
   // Invokes debugd to add the printer to CUPS.  If |ipp_everywhere| is true,
   // automatic configuration will be attempted  and |ppd_path| is ignored.
diff --git a/chrome/common/chrome_features.cc b/chrome/common/chrome_features.cc
index 4181b412..7e8134d0 100644
--- a/chrome/common/chrome_features.cc
+++ b/chrome/common/chrome_features.cc
@@ -60,12 +60,6 @@
     "BackgroundModeAllowRestart", base::FEATURE_DISABLED_BY_DEFAULT};
 #endif  // defined(OS_WIN) || defined(OS_LINUX)
 
-// Enables the Backspace key to navigate back in the browser, as well as
-// Shift+Backspace to navigate forward.
-const base::Feature kBackspaceGoesBackFeature {
-  "BackspaceGoesBack", base::FEATURE_DISABLED_BY_DEFAULT
-};
-
 // Enables or disables whether permission prompts are automatically blocked
 // after the user has explicitly dismissed them too many times.
 const base::Feature kBlockPromptsIfDismissedOften{
diff --git a/chrome/common/chrome_features.h b/chrome/common/chrome_features.h
index 3e6348d7..1ac4866 100644
--- a/chrome/common/chrome_features.h
+++ b/chrome/common/chrome_features.h
@@ -46,8 +46,6 @@
 extern const base::Feature kBackgroundModeAllowRestart;
 #endif  // defined(OS_WIN) || defined(OS_LINUX)
 
-extern const base::Feature kBackspaceGoesBackFeature;
-
 extern const base::Feature kBlockPromptsIfDismissedOften;
 extern const base::Feature kBlockPromptsIfIgnoredOften;
 
diff --git a/chrome/common/chrome_switches.cc b/chrome/common/chrome_switches.cc
index 2bfeed07..6901d29d 100644
--- a/chrome/common/chrome_switches.cc
+++ b/chrome/common/chrome_switches.cc
@@ -507,10 +507,6 @@
 // http://google.com.
 const char kHomePage[]                      = "homepage";
 
-// The maximum number of retry attempts to resolve the host. Set this to zero
-// to disable host resolver retry attempts.
-const char kHostResolverRetryAttempts[]     = "host-resolver-retry-attempts";
-
 // Comma-separated list of rules that control how hostnames are mapped.
 //
 // For example:
diff --git a/chrome/common/chrome_switches.h b/chrome/common/chrome_switches.h
index b0ff6e6..6d9cb19e 100644
--- a/chrome/common/chrome_switches.h
+++ b/chrome/common/chrome_switches.h
@@ -156,7 +156,6 @@
 extern const char kForceLocalNtp[];
 extern const char kForceVariationIds[];
 extern const char kHomePage[];
-extern const char kHostResolverRetryAttempts[];
 extern const char kHostRules[];
 extern const char kIgnoreCertificateErrorsSPKIList[];
 extern const char kIgnoreUrlFetcherCertRequests[];
diff --git a/chrome/common/extensions/docs/templates/json/chrome_sidenav.json b/chrome/common/extensions/docs/templates/json/chrome_sidenav.json
index 2fcc838..bd6aadc0 100644
--- a/chrome/common/extensions/docs/templates/json/chrome_sidenav.json
+++ b/chrome/common/extensions/docs/templates/json/chrome_sidenav.json
@@ -722,6 +722,10 @@
             ]
           },
           {
+            "title": "WebAssembly Migration Guide",
+            "href": "/native-client/migration"
+          },
+          {
             "title": "Download the SDK",
             "href": "/native-client/sdk/download",
             "items": [
diff --git a/chrome/common/pdf_uma.h b/chrome/common/pdf_uma.h
index 728edad..e678adab 100644
--- a/chrome/common/pdf_uma.h
+++ b/chrome/common/pdf_uma.h
@@ -17,4 +17,6 @@
 
 void ReportPDFLoadStatus(PDFLoadStatus status);
 
+constexpr char kPDFMimeType[] = "application/pdf";
+
 #endif  // CHROME_COMMON_PDF_UMA_H_
diff --git a/chrome/renderer/BUILD.gn b/chrome/renderer/BUILD.gn
index ab4a350..6a491d4 100644
--- a/chrome/renderer/BUILD.gn
+++ b/chrome/renderer/BUILD.gn
@@ -130,6 +130,8 @@
     "//components/translate/content/renderer",
     "//components/translate/core/common",
     "//components/translate/core/language_detection",
+    "//components/ukm/public",
+    "//components/ukm/public/interfaces",
     "//components/visitedlink/renderer",
     "//components/web_cache/renderer",
     "//content/app/resources",
diff --git a/chrome/renderer/chrome_content_renderer_client.cc b/chrome/renderer/chrome_content_renderer_client.cc
index 8cd60ba..59cd0a21 100644
--- a/chrome/renderer/chrome_content_renderer_client.cc
+++ b/chrome/renderer/chrome_content_renderer_client.cc
@@ -30,6 +30,7 @@
 #include "chrome/common/crash_keys.h"
 #include "chrome/common/features.h"
 #include "chrome/common/pause_tabs_field_trial.h"
+#include "chrome/common/pdf_uma.h"
 #include "chrome/common/pepper_permission_util.h"
 #include "chrome/common/prerender_types.h"
 #include "chrome/common/render_messages.h"
@@ -146,7 +147,6 @@
 #endif
 
 #if BUILDFLAG(ENABLE_PLUGINS)
-#include "chrome/common/pdf_uma.h"
 #include "chrome/common/plugin_utils.h"
 #include "chrome/renderer/plugins/chrome_plugin_placeholder.h"
 #include "chrome/renderer/plugins/power_saver_info.h"
@@ -646,6 +646,10 @@
   *plugin = CreatePlugin(render_frame, params, output);
 #else  // !BUILDFLAG(ENABLE_PLUGINS)
   PluginUMAReporter::GetInstance()->ReportPluginMissing(orig_mime_type, url);
+  if (orig_mime_type == kPDFMimeType) {
+    ReportPDFLoadStatus(
+        PDFLoadStatus::kShowedDisabledPluginPlaceholderForEmbeddedPdf);
+  }
   auto* placeholder = NonLoadablePluginPlaceholder::CreateNotSupportedPlugin(
       render_frame, params);
   *plugin = placeholder->plugin();
diff --git a/chrome/renderer/resources/extensions/content_setting.js b/chrome/renderer/resources/extensions/content_setting.js
index 81f28b3f..745008c 100644
--- a/chrome/renderer/resources/extensions/content_setting.js
+++ b/chrome/renderer/resources/extensions/content_setting.js
@@ -47,6 +47,15 @@
   };
 
   this.set = function(details, callback) {
+    // We check if the setting is deprecated first, since the validation will
+    // fail for deprecated types.
+    if ($Object.hasOwnProperty(DEPRECATED_CONTENT_TYPES, contentType)) {
+      console.warn('contentSettings.' + contentType + ' is deprecated; setting '
+                   + 'it has no effect.');
+      $Function.apply(callback, undefined, []);
+      return;
+    }
+
     // The set schema included in the Schema object is generic, since it varies
     // per-setting. However, this is only ever for a single setting, so we can
     // enforce the types more thoroughly.
@@ -61,14 +70,7 @@
     };
     var modSetSchema = $Array.slice(rawSetSchema);
     modSetSchema[0] = modSettingParam;
-    validate([details, callback], rawSetSchema);
-
-    if ($Object.hasOwnProperty(DEPRECATED_CONTENT_TYPES, contentType)) {
-      console.warn('contentSettings.' + contentType + ' is deprecated; setting '
-                   + 'it has no effect.');
-      $Function.apply(callback, undefined, []);
-      return;
-    }
+    validate([details, callback], modSetSchema);
 
     return sendRequest('contentSettings.set',
                        [contentType, details, callback],
diff --git a/chrome/renderer/resources/extensions/page_capture_custom_bindings.js b/chrome/renderer/resources/extensions/page_capture_custom_bindings.js
index a6590b4..f27147d 100644
--- a/chrome/renderer/resources/extensions/page_capture_custom_bindings.js
+++ b/chrome/renderer/resources/extensions/page_capture_custom_bindings.js
@@ -4,7 +4,7 @@
 
 // Custom binding for the pageCapture API.
 
-var binding = require('binding').Binding.create('pageCapture');
+var binding = apiBridge || require('binding').Binding.create('pageCapture');
 
 var handleUncaughtException = require('uncaught_exception_handler').handle;
 var pageCaptureNatives = requireNative('page_capture');
@@ -32,4 +32,5 @@
   });
 });
 
-exports.$set('binding', binding.generate());
+if (!apiBridge)
+  exports.$set('binding', binding.generate());
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index 5609bdf..56b69361 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -1518,7 +1518,6 @@
       "../browser/net/predictor_browsertest.cc",
       "../browser/net/proxy_browsertest.cc",
       "../browser/net/sdch_browsertest.cc",
-      "../browser/net/spdyproxy/chrome_data_use_group_browsertest.cc",
       "../browser/net/websocket_browsertest.cc",
       "../browser/ntp_snippets/content_suggestions_service_factory_browsertest.cc",
       "../browser/page_load_metrics/observers/ads_page_load_metrics_observer_browsertest.cc",
@@ -3128,8 +3127,6 @@
     "../browser/net/probe_message_unittest.cc",
     "../browser/net/quota_policy_channel_id_store_unittest.cc",
     "../browser/net/safe_search_util_unittest.cc",
-    "../browser/net/spdyproxy/chrome_data_use_group_provider_unittest.cc",
-    "../browser/net/spdyproxy/chrome_data_use_group_unittest.cc",
     "../browser/net/spdyproxy/data_reduction_proxy_chrome_settings_unittest.cc",
     "../browser/net/spdyproxy/data_reduction_proxy_settings_unittest_android.cc",
     "../browser/net/url_info_unittest.cc",
diff --git a/chrome/test/data/android/webvr_instrumentation/html/test_navigation_webvr_page.html b/chrome/test/data/android/webvr_instrumentation/html/test_navigation_webvr_page.html
index e1e4b3b4..867d193f 100644
--- a/chrome/test/data/android/webvr_instrumentation/html/test_navigation_webvr_page.html
+++ b/chrome/test/data/android/webvr_instrumentation/html/test_navigation_webvr_page.html
@@ -4,7 +4,6 @@
   <body>
     <input type="checkbox" onclick="setFullscreen(this)" id="fullscreen">Fullscreen
     <canvas id="webgl-canvas"></canvas>
-    <script src="../../../../../../third_party/WebKit/LayoutTests/resources/testharness.js"></script>
     <script src="../resources/webvr_e2e.js"></script>
     <script src="../resources/webvr_boilerplate.js"></script>
     <script src="../resources/navigation_e2e.js"></script>
diff --git a/chrome/test/data/android/webvr_instrumentation/resources/navigation_e2e.js b/chrome/test/data/android/webvr_instrumentation/resources/navigation_e2e.js
index 32824512..80f1503 100644
--- a/chrome/test/data/android/webvr_instrumentation/resources/navigation_e2e.js
+++ b/chrome/test/data/android/webvr_instrumentation/resources/navigation_e2e.js
@@ -13,4 +13,3 @@
   finishJavaScriptStep();
 }
 document.addEventListener('webkitfullscreenchange', onFullscreenChange, false);
-window.addEventListener('load', finishJavaScriptStep, false);
\ No newline at end of file
diff --git a/chrome/test/data/android/webvr_instrumentation/resources/webvr_boilerplate.js b/chrome/test/data/android/webvr_instrumentation/resources/webvr_boilerplate.js
index 4d168c5..87d6f83 100644
--- a/chrome/test/data/android/webvr_instrumentation/resources/webvr_boilerplate.js
+++ b/chrome/test/data/android/webvr_instrumentation/resources/webvr_boilerplate.js
@@ -2,6 +2,15 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+// Add additional setup steps to the object from webvr_e2e.js if it exists.
+if (typeof initializationSteps !== "undefined") {
+  initializationSteps["getVRDisplays"] = false;
+} else {
+  // Create here if it doesn't exist so we can access it later without checking
+  // if it's defined.
+  var initializationSteps = {};
+}
+
 var webglCanvas = document.getElementById("webgl-canvas");
 var glAttribs = {
   alpha: false,
@@ -67,10 +76,10 @@
       vrDisplay = displays[0];
     }
   }).then( () => {
-    vrDisplayPromiseDone = true;
+    initializationSteps["getVRDisplays"] = true;
   });
 } else {
-  vrDisplayPromiseDone = true;
+  initializationSteps["getVRDisplays"] = true;
 }
 
 gl.clearColor(1.0, 0.0, 0.0, 1.0);
diff --git a/chrome/test/data/android/webvr_instrumentation/resources/webvr_e2e.js b/chrome/test/data/android/webvr_instrumentation/resources/webvr_e2e.js
index 03f006cb..abf05cb 100644
--- a/chrome/test/data/android/webvr_instrumentation/resources/webvr_e2e.js
+++ b/chrome/test/data/android/webvr_instrumentation/resources/webvr_e2e.js
@@ -4,14 +4,28 @@
 
 var testPassed = false;
 var resultString = "";
-var asyncCounter = 0;
 var javascriptDone = false;
-var vrDisplayPromiseDone = false;
+var initializationSteps = {load: false};
 
 function finishJavaScriptStep() {
   javascriptDone = true;
 }
 
+// Used to check when JavaScript is in an acceptable state to start testing
+// after a page load, as Chrome thinking that the page has finished loading
+// is not always sufficient. By default waits until the load event is fired.
+function isInitializationComplete() {
+  for (var step in initializationSteps) {
+    if (!initializationSteps[step]) {
+      return false;
+    }
+  }
+  return true;
+}
+
+window.addEventListener("load",
+    () => {initializationSteps["load"] = true;}, false);
+
 function checkResultsForFailures(tests, harness_status) {
   testPassed = true;
   if (harness_status["status"] != 0) {
@@ -34,9 +48,13 @@
   }
 }
 
-add_completion_callback( (tests, harness_status) => {
-  checkResultsForFailures(tests, harness_status);
-  console.debug("Test result: " + (testPassed ? "Pass" : "Fail"));
-  console.debug("Test result string: " + resultString);
-  finishJavaScriptStep();
-});
+// Only interact with testharness.js if it was actually included on the page
+// before this file
+if (typeof add_completion_callback !== "undefined") {
+  add_completion_callback( (tests, harness_status) => {
+    checkResultsForFailures(tests, harness_status);
+    console.debug("Test result: " + (testPassed ? "Pass" : "Fail"));
+    console.debug("Test result string: " + resultString);
+    finishJavaScriptStep();
+  });
+}
diff --git a/chrome/test/data/extensions/api_test/content_settings/standard/test.js b/chrome/test/data/extensions/api_test/content_settings/standard/test.js
index 237f9c1..ebe71b7d 100644
--- a/chrome/test/data/extensions/api_test/content_settings/standard/test.js
+++ b/chrome/test/data/extensions/api_test/content_settings/standard/test.js
@@ -113,5 +113,14 @@
       'setting': 'allow'
     }, chrome.test.callbackFail(
         "Path wildcards in file URL patterns are not allowed."));
+    var caught = false;
+    try {
+      cs.javascript.set({primaryPattern: '<all_urls>',
+                         secondaryPattern: '<all_urls>',
+                         setting: 'something radically fake'});
+    } catch (e) {
+      caught = true;
+    }
+    chrome.test.assertTrue(caught);
   }
 ]);
diff --git a/chrome/test/data/extensions/api_test/native_bindings/extension/background.js b/chrome/test/data/extensions/api_test/native_bindings/extension/background.js
index d4935eb..516cf9b0 100644
--- a/chrome/test/data/extensions/api_test/native_bindings/extension/background.js
+++ b/chrome/test/data/extensions/api_test/native_bindings/extension/background.js
@@ -296,21 +296,13 @@
 
     // The fullscreen setting is deprecated.
     var fullscreen = chrome.contentSettings.fullscreen;
-    caught = false;
-    try {
-      // Trying to set the fullscreen setting to anything but 'allow' should
-      // fail.
-      fullscreen.set({primaryPattern: pattern, setting: 'block'});
-    } catch (e) {
-      caught = true;
-    }
-    chrome.test.assertTrue(caught);
-
     var deprecatedSettingTest = new Promise(function(resolve, reject) {
       fullscreen.get({primaryUrl: url}, (details) => {
         chrome.test.assertTrue(!!details);
         chrome.test.assertEq('allow', details.setting);
-        fullscreen.set({primaryPattern: pattern, setting: 'allow'}, () => {
+        // Trying to set the fullscreen setting to anything but 'allow' should
+        // silently fail.
+        fullscreen.set({primaryPattern: pattern, setting: 'block'}, () => {
           fullscreen.get({primaryUrl: url}, (details) => {
             chrome.test.assertTrue(!!details);
             chrome.test.assertEq('allow', details.setting);
diff --git a/chrome/test/data/webui/media_router/media_router_container_route_tests.js b/chrome/test/data/webui/media_router/media_router_container_route_tests.js
index 71a41e8..110302c 100644
--- a/chrome/test/data/webui/media_router/media_router_container_route_tests.js
+++ b/chrome/test/data/webui/media_router/media_router_container_route_tests.js
@@ -93,21 +93,21 @@
         document.body.appendChild(container);
 
         // Get common functions and variables.
-        var test_base = media_router_container_test_base.init(container);
+        var testBase = media_router_container_test_base.init(container);
 
-        checkCurrentView = test_base.checkCurrentView;
-        checkElementsVisibleWithId = test_base.checkElementsVisibleWithId;
-        checkElementVisible = test_base.checkElementVisible;
-        checkElementText = test_base.checkElementText;
-        fakeBlockingIssue = test_base.fakeBlockingIssue;
-        fakeCastModeList = test_base.fakeCastModeList;
-        fakeNonBlockingIssue = test_base.fakeNonBlockingIssue;
-        fakeRouteList = test_base.fakeRouteList;
+        checkCurrentView = testBase.checkCurrentView;
+        checkElementsVisibleWithId = testBase.checkElementsVisibleWithId;
+        checkElementVisible = testBase.checkElementVisible;
+        checkElementText = testBase.checkElementText;
+        fakeBlockingIssue = testBase.fakeBlockingIssue;
+        fakeCastModeList = testBase.fakeCastModeList;
+        fakeNonBlockingIssue = testBase.fakeNonBlockingIssue;
+        fakeRouteList = testBase.fakeRouteList;
         fakeRouteListWithLocalRoutesOnly =
-            test_base.fakeRouteListWithLocalRoutesOnly;
-        fakeSinkList = test_base.fakeSinkList;
+            testBase.fakeRouteListWithLocalRoutesOnly;
+        fakeSinkList = testBase.fakeSinkList;
 
-        container.castModeList = test_base.fakeCastModeList;
+        container.castModeList = testBase.fakeCastModeList;
 
         // Allow for the media router container to be created, attached, and
         // listeners registered in an afterNextRender() call.
@@ -254,7 +254,8 @@
 
       // Tests for expected visible UI when the view is ROUTE_DETAILS.
       test('route details visibility', function(done) {
-        container.showRouteDetails_();
+        container.showRouteDetails_(
+            new media_router.Route('id 3', 'sink id 3', 'Title 3', 0, true));
         setTimeout(function() {
           checkElementsVisibleWithId(['container-header',
                                       'device-missing',
@@ -294,7 +295,8 @@
       // Tests for expected visible UI when the view is ROUTE_DETAILS, and there
       // is a non-blocking issue.
       test('route details visibility non blocking issue', function(done) {
-        container.showRouteDetails_();
+        container.showRouteDetails_(
+            new media_router.Route('id 3', 'sink id 3', 'Title 3', 0, true));
 
         // Set a non-blocking issue. The issue should be shown.
         container.issue = fakeNonBlockingIssue;
@@ -309,7 +311,8 @@
       // Tests for expected visible UI when the view is ROUTE_DETAILS, and there
       // is a blocking issue.
       test('route details visibility with blocking issue', function(done) {
-        container.showRouteDetails_();
+        container.showRouteDetails_(
+            new media_router.Route('id 3', 'sink id 3', 'Title 3', 0, true));
 
         // Set a blocking issue. The issue should be shown, and everything
         // else, hidden.
@@ -324,8 +327,8 @@
 
       test('creating route with selected cast mode', function(done) {
         container.allSinks = fakeSinkList;
-        MockInteractions.tap(container.$['container-header'].
-            $['arrow-drop-icon']);
+        MockInteractions.tap(
+            container.$$('#container-header').$['arrow-drop-icon']);
         setTimeout(function() {
           // Select cast mode 2.
           var castModeList =
@@ -416,7 +419,7 @@
           fakeRouteList[i].currentCastMode = 2;
         }
         MockInteractions.tap(
-            container.$['container-header'].$['arrow-drop-icon']);
+            container.$$('#container-header').$$('#arrow-drop-icon'));
         setTimeout(function() {
           MockInteractions.tap(container.$$('#cast-mode-list')
                                    .querySelectorAll('paper-item')[2]);
@@ -445,7 +448,7 @@
           fakeRouteList[i].currentCastMode = 2;
         }
         MockInteractions.tap(
-            container.$['container-header'].$['arrow-drop-icon']);
+            container.$$('#container-header').$$('#arrow-drop-icon'));
         setTimeout(function() {
           MockInteractions.tap(container.$$('#cast-mode-list')
                                    .querySelectorAll('paper-item')[1]);
diff --git a/chrome/test/data/webui/media_router/media_router_elements_browsertest.js b/chrome/test/data/webui/media_router/media_router_elements_browsertest.js
index 6be1d6e..e82cfbad 100644
--- a/chrome/test/data/webui/media_router/media_router_elements_browsertest.js
+++ b/chrome/test/data/webui/media_router/media_router_elements_browsertest.js
@@ -30,9 +30,7 @@
   /** @override */
   accessibilityIssuesAreErrors: true,
 
-  commandLineSwitches: [{
-    switchName: 'media-router', switchValue: '1'
-  }],
+  commandLineSwitches: [{switchName: 'media-router', switchValue: '1'}],
 
   // List tests for individual elements. The media-router-container tests are
   // split between several files and use common functionality from
@@ -48,12 +46,57 @@
     'media_router_container_test_base.js',
     'media_router_header_tests.js',
     'media_router_search_highlighter_tests.js',
+    'route_controls_tests.js',
     'route_details_tests.js',
   ]),
 
+  /**
+   * Mocks the browser API methods to make them fire events instead.
+   */
+  installMockBrowserApi: function() {
+    cr.define('media_router.browserApi', function() {
+      'use strict';
+
+      function pauseCurrentMedia() {
+        document.dispatchEvent(new Event('mock-pause-current-media'));
+      }
+
+      function playCurrentMedia() {
+        document.dispatchEvent(new Event('mock-play-current-media'));
+      }
+
+      function seekCurrentMedia(time) {
+        var event =
+            new CustomEvent('mock-seek-current-media', {detail: {time: time}})
+        document.dispatchEvent(event);
+      }
+
+      function setCurrentMediaMute(mute) {
+        var event = new CustomEvent(
+            'mock-set-current-media-mute', {detail: {mute: mute}});
+        document.dispatchEvent(event);
+      }
+
+      function setCurrentMediaVolume(volume) {
+        var event = new CustomEvent(
+            'mock-set-current-media-volume', {detail: {volume: volume}});
+        document.dispatchEvent(event);
+      }
+
+      return {
+        pauseCurrentMedia: pauseCurrentMedia,
+        playCurrentMedia: playCurrentMedia,
+        seekCurrentMedia: seekCurrentMedia,
+        setCurrentMediaMute: setCurrentMediaMute,
+        setCurrentMediaVolume: setCurrentMediaVolume,
+      };
+    });
+  },
+
   /** @override */
   setUp: function() {
     PolymerTest.prototype.setUp.call(this);
+    this.installMockBrowserApi();
 
     // Enable when failure is resolved.
     // AX_ARIA_02: http://crbug.com/591547
@@ -134,6 +177,12 @@
   mocha.run();
 });
 
+TEST_F(
+    'MediaRouterElementsBrowserTest', 'MediaRouterRouteControls', function() {
+      route_controls.registerTests();
+      mocha.run();
+    });
+
 TEST_F('MediaRouterElementsBrowserTest', 'MediaRouterRouteDetails', function() {
   route_details.registerTests();
   mocha.run();
diff --git a/chrome/test/data/webui/media_router/route_controls_tests.js b/chrome/test/data/webui/media_router/route_controls_tests.js
new file mode 100644
index 0000000..910c7a9
--- /dev/null
+++ b/chrome/test/data/webui/media_router/route_controls_tests.js
@@ -0,0 +1,247 @@
+// Copyright 2017 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.
+
+/** @fileoverview Suite of tests for route-controls. */
+cr.define('route_controls', function() {
+  function registerTests() {
+    suite('RouteControls', function() {
+      /**
+       * Route Controls created before each test.
+       * @type {RouteControls}
+       */
+      var controls;
+
+      /**
+       * First fake route created before each test.
+       * @type {media_router.Route}
+       */
+      var fakeRouteOne;
+
+      /**
+       * Second fake route created before each test.
+       * @type {media_router.Route}
+       */
+      var fakeRouteTwo;
+
+      var assertElementText = function(expected, elementId) {
+        assertEquals(expected, controls.$$('#' + elementId).innerText);
+      };
+
+      var isElementShown = function(elementId) {
+        return !controls.$$('#' + elementId).hasAttribute('hidden');
+      };
+
+      var assertElementShown = function(elementId) {
+        assertTrue(isElementShown(elementId));
+      };
+
+      var assertElementHidden = function(elementId) {
+        assertFalse(isElementShown(elementId));
+      };
+
+      // Creates an instance of RouteStatus with the given parameters. If a
+      // parameter is not set, it defaults to an empty string, zero, or false.
+      var createRouteStatus = function(params = {}) {
+        return new media_router.RouteStatus(
+            params.title ? params.title : '',
+            params.status ? params.status : '', !!params.canPlayPause,
+            !!params.canMute, !!params.canSetVolume, !!params.canSeek,
+            !!params.isPaused, !!params.isMuted,
+            params.volume ? params.volume : 0,
+            params.duration ? params.duration : 0,
+            params.currentTime ? params.currentTime : 0);
+      };
+
+      // Import route_controls.html before running suite.
+      suiteSetup(function() {
+        return PolymerTest.importHtml(
+            'chrome://media-router/elements/route_controls/' +
+            'route_controls.html');
+      });
+
+      // Initialize a route-controls before each test.
+      setup(function(done) {
+        PolymerTest.clearBody();
+        controls = document.createElement('route-controls');
+        document.body.appendChild(controls);
+
+        // Initialize routes and sinks.
+        fakeRouteOne = new media_router.Route(
+            'route id 1', 'sink id 1', 'Video 1', 1, true, false);
+        fakeRouteTwo = new media_router.Route(
+            'route id 2', 'sink id 2', 'Video 2', 2, false, true);
+
+        // Allow for the route controls to be created and attached.
+        setTimeout(done);
+      });
+
+      // Tests the initial expected text.
+      test('initial text setting', function() {
+        // Set |route|.
+        controls.onRouteUpdated(fakeRouteOne);
+        assertElementText(
+            loadTimeData.getStringF(
+                'castingActivityStatus', fakeRouteOne.description),
+            'route-description');
+
+        // Set |route| to a different route.
+        controls.onRouteUpdated(fakeRouteTwo);
+        assertElementText(
+            loadTimeData.getStringF(
+                'castingActivityStatus', fakeRouteTwo.description),
+            'route-description');
+      });
+
+      // Tests that the route title and status are shown when RouteStatus is
+      // updated.
+      test('update route text', function() {
+        var title = 'test title';
+        var status = 'test status';
+        controls.routeStatus =
+            createRouteStatus({title: title, status: status});
+
+        assertElementText(title, 'route-title');
+        assertElementText(status, 'route-description');
+      });
+
+      // Tests that media controls are shown and hidden when RouteStatus is
+      // updated.
+      test('media controls visibility', function() {
+        // Create a RouteStatus with no controls.
+        controls.routeStatus = createRouteStatus();
+        assertElementHidden('route-play-pause-button');
+        assertElementHidden('route-time-controls');
+        assertElementHidden('route-volume-button');
+        assertElementHidden('route-volume-slider');
+
+        controls.routeStatus =
+            createRouteStatus({canPlayPause: true, canSeek: true});
+
+        assertElementShown('route-play-pause-button');
+        assertElementShown('route-time-controls');
+        assertElementHidden('route-volume-button');
+        assertElementHidden('route-volume-slider');
+
+        controls.routeStatus =
+            createRouteStatus({canMute: true, canSetVolume: true});
+
+        assertElementHidden('route-play-pause-button');
+        assertElementHidden('route-time-controls');
+        assertElementShown('route-volume-button');
+        assertElementShown('route-volume-slider');
+      });
+
+      // Tests that the play button sends a command to the browser API.
+      test('send play command', function(done) {
+        document.addEventListener('mock-play-current-media', function(data) {
+          done();
+        });
+
+        controls.routeStatus =
+            createRouteStatus({canPlayPause: true, isPaused: true});
+        MockInteractions.tap(controls.$$('#route-play-pause-button'));
+      });
+
+      // Tests that the pause button sends a command to the browser API.
+      test('send pause command', function(done) {
+        document.addEventListener('mock-pause-current-media', function(data) {
+          done();
+        });
+
+        controls.routeStatus =
+            createRouteStatus({canPlayPause: true, isPaused: false});
+        MockInteractions.tap(controls.$$('#route-play-pause-button'));
+      });
+
+      // Tests that the mute button sends a command to the browser API.
+      test('send mute command', function(done) {
+        function waitForMuteEvent(data) {
+          // Remove the event listener to avoid interfering with other tests.
+          document.removeEventListener(
+              'mock-set-current-media-mute', waitForMuteEvent);
+          if (data.detail.mute) {
+            done();
+          } else {
+            done('Expected the "Mute" command but received "Unmute".');
+          }
+        }
+        document.addEventListener(
+            'mock-set-current-media-mute', waitForMuteEvent);
+
+        controls.routeStatus =
+            createRouteStatus({canMute: true, isMuted: false});
+        MockInteractions.tap(controls.$$('#route-volume-button'));
+      });
+
+      // Tests that the unmute button sends a command to the browser API.
+      test('send unmute command', function(done) {
+        function waitForUnmuteEvent(data) {
+          // Remove the event listener to avoid interfering with other tests.
+          document.removeEventListener(
+              'mock-set-current-media-mute', waitForUnmuteEvent);
+          if (data.detail.mute) {
+            done('Expected the "Unmute" command but received "Mute".');
+          } else {
+            done();
+          }
+        }
+        document.addEventListener(
+            'mock-set-current-media-mute', waitForUnmuteEvent);
+
+        controls.routeStatus =
+            createRouteStatus({canMute: true, isMuted: true});
+        MockInteractions.tap(controls.$$('#route-volume-button'));
+      });
+
+      // // Tests that the seek slider sends a command to the browser API.
+      test('send seek command', function(done) {
+        var currentTime = 500;
+        var duration = 1200;
+        document.addEventListener('mock-seek-current-media', function(data) {
+          if (data.detail.time == currentTime) {
+            done();
+          } else {
+            done(
+                'Expected the time to be ' + currentTime + ' but instead got ' +
+                data.detail.time);
+          }
+        });
+
+        controls.routeStatus =
+            createRouteStatus({canSeek: true, duration: duration});
+
+        // In actual usage, the change event gets fired when the user interacts
+        // with the slider.
+        controls.$$('#route-time-slider').value = currentTime;
+        controls.$$('#route-time-slider').fire('change');
+      });
+
+      // Tests that the volume slider sends a command to the browser API.
+      test('send set volume command', function(done) {
+        var volume = 0.45;
+        document.addEventListener(
+            'mock-set-current-media-volume', function(data) {
+              if (data.detail.volume == volume) {
+                done();
+              } else {
+                done(
+                    'Expected the volume to be ' + volume +
+                    ' but instead got ' + data.detail.volume);
+              }
+            });
+
+        controls.routeStatus = createRouteStatus({canSetVolume: true});
+
+        // In actual usage, the change event gets fired when the user interacts
+        // with the slider.
+        controls.$$('#route-volume-slider').value = volume;
+        controls.$$('#route-volume-slider').fire('change');
+      });
+    });
+  }
+
+  return {
+    registerTests: registerTests,
+  };
+});
diff --git a/chrome/test/data/webui/media_router/route_details_tests.js b/chrome/test/data/webui/media_router/route_details_tests.js
index dcab054..f47a046 100644
--- a/chrome/test/data/webui/media_router/route_details_tests.js
+++ b/chrome/test/data/webui/media_router/route_details_tests.js
@@ -24,49 +24,51 @@
        */
       var fakeRouteTwo;
 
-      // Checks whether |expected| and the text in the span element in
-      // the |elementId| element are equal.
-      var checkSpanText = function(expected, elementId) {
-        assertEquals(expected,
-            details.$[elementId].querySelector('span').innerText);
-      };
-
-      // Checks the default route view is shown.
-      var checkDefaultViewIsShown = function() {
-        assertFalse(details.$['route-information'].hasAttribute('hidden'));
-        assertTrue(details.$['custom-controller'].hasAttribute('hidden'));
-      };
-
-      // Checks the default route view is shown.
-      var checkStartCastButtonIsShown = function() {
-        assertFalse(
-            details.$['start-casting-to-route-button'].hasAttribute('hidden'));
-      };
-
-      // Checks the default route view is not shown.
-      var checkStartCastButtonIsNotShown = function() {
-        assertTrue(
-            details.$['start-casting-to-route-button'].hasAttribute('hidden'));
-      };
-
-      // Checks the custom controller is shown.
-      var checkCustomControllerIsShown = function() {
-        assertTrue(details.$['route-information'].hasAttribute('hidden'));
-        assertFalse(details.$['custom-controller'].hasAttribute('hidden'));
-      };
-
-      // Checks whether |expected| and the text in the |elementId| element
-      // are equal given an id.
-      var checkElementTextWithId = function(expected, elementId) {
-        assertEquals(expected, details.$[elementId].innerText);
-      };
-
       /**
        * Fake sink that corresponds to |fakeRouteOne|.
        * @type {media_router.Sink}
        */
       var fakeSinkOne;
 
+      // Checks whether |expected| and the text in the span element in
+      // the |elementId| element are equal.
+      var checkSpanText = function(expected, elementId) {
+        assertEquals(
+            expected,
+            details.$$('#' + elementId).querySelector('span').innerText);
+      };
+
+      // Checks the default route view is shown.
+      var checkDefaultViewIsShown = function() {
+        assertFalse(details.$$('#route-information').hasAttribute('hidden'));
+        assertTrue(details.$$('extension-view-wrapper').hasAttribute('hidden'));
+      };
+
+      // Checks the start button is shown.
+      var checkStartCastButtonIsShown = function() {
+        assertFalse(details.$$('#start-casting-to-route-button')
+                        .hasAttribute('hidden'));
+      };
+
+      // Checks the start button is not shown.
+      var checkStartCastButtonIsNotShown = function() {
+        assertTrue(details.$$('#start-casting-to-route-button')
+                       .hasAttribute('hidden'));
+      };
+
+      // Checks the custom controller is shown.
+      var checkCustomControllerIsShown = function() {
+        assertTrue(details.$$('#route-information').hasAttribute('hidden'));
+        assertFalse(
+            details.$$('extension-view-wrapper').hasAttribute('hidden'));
+      };
+
+      // Checks whether |expected| and the text in the |elementId| element
+      // are equal given an id.
+      var checkElementTextWithId = function(expected, elementId) {
+        assertEquals(expected, details.$$('#' + elementId).innerText);
+      };
+
       // Import route_details.html before running suite.
       suiteSetup(function() {
         return PolymerTest.importHtml(
@@ -78,6 +80,7 @@
       setup(function(done) {
         PolymerTest.clearBody();
         details = document.createElement('route-details');
+        details.useWebUiRouteControls = false;
         document.body.appendChild(details);
 
         // Initialize routes and sinks.
@@ -140,7 +143,7 @@
         details.addEventListener('close-route', function() {
           done();
         });
-        MockInteractions.tap(details.$['close-route-button']);
+        MockInteractions.tap(details.$$('#close-route-button'));
       });
 
       // Tests for 'join-route-click' event firing when the
@@ -149,7 +152,7 @@
       test('start casting to route button click', function(done) {
         details.addEventListener('join-route-click', function() { done(); });
         details.route = fakeRouteTwo;
-        MockInteractions.tap(details.$['start-casting-to-route-button']);
+        MockInteractions.tap(details.$$('#start-casting-to-route-button'));
       });
 
       // Tests for 'replace-route-click' event firing when the
@@ -160,7 +163,7 @@
             'change-route-source-click', function() { done(); });
         details.route = fakeRouteOne;
         details.availableCastModes = 1;
-        MockInteractions.tap(details.$['start-casting-to-route-button']);
+        MockInteractions.tap(details.$$('#start-casting-to-route-button'));
       });
 
       // Tests the initial expected text.
@@ -199,35 +202,31 @@
 
       // Tests when |route| exists, has a custom controller, and it loads.
       test('route has custom controller and loading succeeds', function(done) {
-        var loadInvoked = false;
-        details.$['custom-controller'].load = function(url) {
-          loadInvoked = true;
-          assertEquals('chrome-extension://123/custom_view.html', url);
+        details.$$('extension-view-wrapper').$$('#custom-controller').load =
+            function(url) {
+          setTimeout(function() {
+            assertEquals('chrome-extension://123/custom_view.html', url);
+            checkCustomControllerIsShown();
+            done();
+          });
           return Promise.resolve();
         };
 
         details.route = fakeRouteOne;
-        setTimeout(function() {
-          assertTrue(loadInvoked);
-          checkCustomControllerIsShown();
-          done();
-        });
       });
 
       // Tests when |route| exists, has a custom controller, but fails to load.
       test('route has custom controller but loading fails', function(done) {
-        var loadInvoked = false;
-        details.$['custom-controller'].load = function(url) {
-          loadInvoked = true;
+        details.$$('extension-view-wrapper').$$('#custom-controller').load =
+            function(url) {
+          setTimeout(function() {
+            checkDefaultViewIsShown();
+            done();
+          });
           return Promise.reject();
         };
 
         details.route = fakeRouteOne;
-        setTimeout(function() {
-          assertTrue(loadInvoked);
-          checkDefaultViewIsShown();
-          done();
-        });
       });
     });
   }
diff --git a/chromecast/media/cma/backend/multizone_backend_unittest.cc b/chromecast/media/cma/backend/multizone_backend_unittest.cc
index b471fa6..f3cfb91 100644
--- a/chromecast/media/cma/backend/multizone_backend_unittest.cc
+++ b/chromecast/media/cma/backend/multizone_backend_unittest.cc
@@ -11,8 +11,10 @@
 #include <vector>
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/command_line.h"
 #include "base/logging.h"
+#include "base/memory/ptr_util.h"
 #include "base/memory/ref_counted.h"
 #include "base/message_loop/message_loop.h"
 #include "base/run_loop.h"
@@ -40,9 +42,8 @@
 
 namespace {
 
-const int64_t kMicrosecondsPerSecond = 1000 * 1000;
 // Total length of test, in microseconds.
-const int64_t kPushTimeUs = 2 * kMicrosecondsPerSecond;
+const int64_t kPushTimeUs = 2 * base::Time::kMicrosecondsPerSecond;
 const int64_t kStartPts = 0;
 const int64_t kMaxRenderingDelayErrorUs = 200;
 const int kNumEffectsStreams = 1;
@@ -54,27 +55,23 @@
  public:
   BufferFeeder(const AudioConfig& config,
                bool effects_only,
-               const base::Closure& eos_cb);
+               base::OnceClosure eos_cb,
+               int playback_rate_change_count);
   ~BufferFeeder() override {}
 
-  void Initialize(float playback_rate);
-  void Start();
+  void Initialize();
+  void Start(float playback_rate);
   void Stop();
 
-  int64_t max_rendering_delay_error_us() {
-    return max_rendering_delay_error_us_;
-  }
-
-  int64_t max_positive_rendering_delay_error_us() {
-    return max_positive_rendering_delay_error_us_;
-  }
-
-  int64_t max_negative_rendering_delay_error_us() {
-    return max_negative_rendering_delay_error_us_;
-  }
-
-  int64_t average_rendering_delay_error_us() {
-    return total_rendering_delay_error_us_ / sample_count_;
+  int64_t GetMaxRenderingDelayErrorUs() {
+    int64_t max = 0;
+    for (int64_t error : errors_) {
+      if (error == kNoTimestamp) {
+        continue;
+      }
+      max = std::max(max, std::abs(error));
+    }
+    return max;
   }
 
  private:
@@ -103,21 +100,19 @@
 
   const AudioConfig config_;
   const bool effects_only_;
-  const base::Closure eos_cb_;
-  double original_playback_rate_;
-  double playback_rate_;
-  int64_t max_rendering_delay_error_us_;
-  int64_t max_positive_rendering_delay_error_us_;
-  int64_t max_negative_rendering_delay_error_us_;
-  int64_t total_rendering_delay_error_us_;
-  size_t sample_count_;
+  base::OnceClosure eos_cb_;
+  const int64_t push_limit_us_;
+  const int64_t playback_rate_change_interval_us_;
+  float original_playback_rate_;
+  float playback_rate_;
+  std::vector<int64_t> errors_;
   bool feeding_completed_;
-  std::unique_ptr<TaskRunnerImpl> task_runner_;
+  TaskRunnerImpl task_runner_;
   std::unique_ptr<MediaPipelineBackend> backend_;
   MediaPipelineBackend::AudioDecoder* decoder_;
-  int64_t push_limit_us_;
   int64_t last_push_length_us_;
   int64_t pushed_us_;
+  int64_t pushed_us_when_rate_changed_;
   int64_t next_push_playback_timestamp_;
   scoped_refptr<DecoderBufferBase> pending_buffer_;
   base::ThreadChecker thread_checker_;
@@ -127,8 +122,8 @@
 
 }  // namespace
 
-using TestParams = std::tr1::tuple<int,     // sample rate
-                                   float>;  // playback rate
+using TestParams =
+    std::tr1::tuple<int /* sample rate */, float /* playback rate */>;
 
 class MultizoneBackendTest : public testing::TestWithParam<TestParams> {
  public:
@@ -155,11 +150,12 @@
 
   void AddEffectsStreams();
 
-  void Initialize(int sample_rate, float playback_rate);
-  void Start();
+  void Initialize(int sample_rate, int playback_rate_change_count);
+  void Start(float playback_rate);
   void OnEndOfStream();
 
  private:
+  base::MessageLoop message_loop_;
   std::vector<std::unique_ptr<BufferFeeder>> effects_feeders_;
   std::unique_ptr<BufferFeeder> audio_feeder_;
 
@@ -170,34 +166,31 @@
 
 BufferFeeder::BufferFeeder(const AudioConfig& config,
                            bool effects_only,
-                           const base::Closure& eos_cb)
+                           base::OnceClosure eos_cb,
+                           int playback_rate_change_count)
     : config_(config),
       effects_only_(effects_only),
-      eos_cb_(eos_cb),
-      original_playback_rate_(1.0),
-      playback_rate_(1.0),
-      max_rendering_delay_error_us_(0),
-      max_positive_rendering_delay_error_us_(0),
-      max_negative_rendering_delay_error_us_(0),
-      total_rendering_delay_error_us_(0),
-      sample_count_(0),
-      feeding_completed_(false),
-      task_runner_(new TaskRunnerImpl()),
-      decoder_(nullptr),
+      eos_cb_(std::move(eos_cb)),
       push_limit_us_(effects_only_ ? 0 : kPushTimeUs),
+      playback_rate_change_interval_us_(push_limit_us_ /
+                                        (playback_rate_change_count + 1)),
+      original_playback_rate_(1.0f),
+      playback_rate_(1.0f),
+      feeding_completed_(false),
+      decoder_(nullptr),
       last_push_length_us_(0),
       pushed_us_(0),
+      pushed_us_when_rate_changed_(0),
       next_push_playback_timestamp_(kNoTimestamp) {
-  CHECK(!eos_cb_.is_null());
+  CHECK(eos_cb_);
 }
 
-void BufferFeeder::Initialize(float playback_rate) {
-  original_playback_rate_ = playback_rate_ = playback_rate;
+void BufferFeeder::Initialize() {
   MediaPipelineDeviceParams params(
       MediaPipelineDeviceParams::kModeIgnorePts,
       effects_only_ ? MediaPipelineDeviceParams::kAudioStreamSoundEffects
                     : MediaPipelineDeviceParams::kAudioStreamNormal,
-      task_runner_.get(), AudioContentType::kMedia,
+      &task_runner_, AudioContentType::kMedia,
       ::media::AudioDeviceDescription::kDefaultDeviceId);
   backend_.reset(CastMediaShlib::CreateMediaPipelineBackend(params));
   CHECK(backend_);
@@ -208,13 +201,18 @@
   decoder_->SetDelegate(this);
 
   ASSERT_TRUE(backend_->Initialize());
-  ASSERT_TRUE(backend_->SetPlaybackRate(playback_rate));
 }
 
-void BufferFeeder::Start() {
+void BufferFeeder::Start(float playback_rate) {
+  // AMP devices only support playback rates between 0.5 and 2.0.
+  ASSERT_GE(playback_rate, 0.5f);
+  ASSERT_LE(playback_rate, 2.0f);
+  original_playback_rate_ = playback_rate_ = playback_rate;
   ASSERT_TRUE(backend_->Start(kStartPts));
+  ASSERT_TRUE(backend_->SetPlaybackRate(playback_rate));
   base::ThreadTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE, base::Bind(&BufferFeeder::FeedBuffer, base::Unretained(this)));
+      FROM_HERE,
+      base::BindOnce(&BufferFeeder::FeedBuffer, base::Unretained(this)));
 }
 
 void BufferFeeder::Stop() {
@@ -227,15 +225,21 @@
   if (feeding_completed_)
     return;
 
-  if (!effects_only_ && pushed_us_ >= push_limit_us_ / 2 &&
-      playback_rate_ == original_playback_rate_) {
-    if (original_playback_rate_ < 1.0) {
+  if (!effects_only_ && pushed_us_ > pushed_us_when_rate_changed_ +
+                                         playback_rate_change_interval_us_) {
+    pushed_us_when_rate_changed_ = pushed_us_;
+    if (playback_rate_ != original_playback_rate_) {
+      playback_rate_ = original_playback_rate_;
+    } else if (original_playback_rate_ < 1.0) {
       playback_rate_ = original_playback_rate_ * 2;
-      ASSERT_TRUE(backend_->SetPlaybackRate(playback_rate_));
     } else {
       playback_rate_ = original_playback_rate_ / 2;
-      ASSERT_TRUE(backend_->SetPlaybackRate(playback_rate_));
     }
+    ASSERT_TRUE(backend_->SetPlaybackRate(playback_rate_));
+    // Changing the playback rate will change the rendering delay on devices
+    // where playback rate changes apply to audio that has already been pushed.
+    // Ignore the next rendering delay.
+    next_push_playback_timestamp_ = kNoTimestamp;
   }
 
   if (!effects_only_ && pushed_us_ >= push_limit_us_) {
@@ -247,7 +251,7 @@
     int size_bytes = (rand() % 96 + 32) * 16;
     int num_samples =
         size_bytes / (config_.bytes_per_channel * config_.channel_number);
-    last_push_length_us_ = num_samples * kMicrosecondsPerSecond /
+    last_push_length_us_ = num_samples * base::Time::kMicrosecondsPerSecond /
                            (config_.samples_per_second * playback_rate_);
     scoped_refptr<::media::DecoderBuffer> silence_buffer(
         new ::media::DecoderBuffer(size_bytes));
@@ -265,7 +269,7 @@
 
 void BufferFeeder::OnEndOfStream() {
   DCHECK(thread_checker_.CalledOnValidThread());
-  eos_cb_.Run();
+  std::move(eos_cb_).Run();
 }
 
 void BufferFeeder::OnPushBufferComplete(BufferStatus status) {
@@ -277,6 +281,7 @@
     MediaPipelineBackend::AudioDecoder::RenderingDelay delay =
         decoder_->GetRenderingDelay();
 
+    int64_t error = kNoTimestamp;
     if (delay.timestamp_microseconds == kNoTimestamp) {
       next_push_playback_timestamp_ = kNoTimestamp;
     } else {
@@ -288,22 +293,11 @@
             next_push_playback_timestamp_ + last_push_length_us_;
         next_push_playback_timestamp_ =
             delay.timestamp_microseconds + delay.delay_microseconds;
-        int64_t error = next_push_playback_timestamp_ -
-                        expected_next_push_playback_timestamp;
-
-        max_rendering_delay_error_us_ =
-            std::max(max_rendering_delay_error_us_, std::abs(error));
-        total_rendering_delay_error_us_ += std::abs(error);
-        if (error >= 0) {
-          max_positive_rendering_delay_error_us_ =
-              std::max(max_positive_rendering_delay_error_us_, error);
-        } else {
-          max_negative_rendering_delay_error_us_ =
-              std::min(max_negative_rendering_delay_error_us_, error);
-        }
-        sample_count_++;
+        error = next_push_playback_timestamp_ -
+                expected_next_push_playback_timestamp;
       }
     }
+    errors_.push_back(error);
   }
   pushed_us_ += last_push_length_us_;
 
@@ -311,7 +305,8 @@
     return;
 
   base::ThreadTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE, base::Bind(&BufferFeeder::FeedBuffer, base::Unretained(this)));
+      FROM_HERE,
+      base::BindOnce(&BufferFeeder::FeedBuffer, base::Unretained(this)));
 }
 
 }  // namespace
@@ -320,19 +315,21 @@
 
 MultizoneBackendTest::~MultizoneBackendTest() {}
 
-void MultizoneBackendTest::Initialize(int sample_rate, float playback_rate) {
+void MultizoneBackendTest::Initialize(int sample_rate,
+                                      int playback_rate_change_count) {
   AudioConfig config;
   config.codec = kCodecPCM;
-  config.sample_format = kSampleFormatS32;
+  config.sample_format = kSampleFormatPlanarF32;
   config.channel_number = 2;
   config.bytes_per_channel = 4;
   config.samples_per_second = sample_rate;
 
-  audio_feeder_.reset(
-      new BufferFeeder(config, false /* effects_only */,
-                       base::Bind(&MultizoneBackendTest::OnEndOfStream,
-                                  base::Unretained(this))));
-  audio_feeder_->Initialize(playback_rate);
+  audio_feeder_ = base::MakeUnique<BufferFeeder>(
+      config, false /* effects_only */,
+      base::BindOnce(&MultizoneBackendTest::OnEndOfStream,
+                     base::Unretained(this)),
+      playback_rate_change_count);
+  audio_feeder_->Initialize();
 }
 
 void MultizoneBackendTest::AddEffectsStreams() {
@@ -344,18 +341,19 @@
   effects_config.samples_per_second = 48000;
 
   for (int i = 0; i < kNumEffectsStreams; ++i) {
-    std::unique_ptr<BufferFeeder> feeder(new BufferFeeder(
-        effects_config, true /* effects_only */, base::Bind(&IgnoreEos)));
-    feeder->Initialize(1.0f);
+    auto feeder = base::MakeUnique<BufferFeeder>(
+        effects_config, true /* effects_only */, base::BindOnce(&IgnoreEos), 0);
+    feeder->Initialize();
     effects_feeders_.push_back(std::move(feeder));
   }
 }
 
-void MultizoneBackendTest::Start() {
+void MultizoneBackendTest::Start(float playback_rate) {
   for (auto& feeder : effects_feeders_)
-    feeder->Start();
+    feeder->Start(1.0f);
   CHECK(audio_feeder_);
-  audio_feeder_->Start();
+  audio_feeder_->Start(playback_rate);
+  base::RunLoop().Run();
 }
 
 void MultizoneBackendTest::OnEndOfStream() {
@@ -365,26 +363,24 @@
 
   base::MessageLoop::current()->QuitWhenIdle();
 
-  EXPECT_LT(audio_feeder_->max_rendering_delay_error_us(),
-            kMaxRenderingDelayErrorUs)
-      << "Max positive rendering delay error: "
-      << audio_feeder_->max_positive_rendering_delay_error_us()
-      << "\nMax negative rendering delay error: "
-      << audio_feeder_->max_negative_rendering_delay_error_us()
-      << "\nAverage rendering delay error: "
-      << audio_feeder_->average_rendering_delay_error_us();
+  EXPECT_LT(audio_feeder_->GetMaxRenderingDelayErrorUs(),
+            kMaxRenderingDelayErrorUs);
 }
 
 TEST_P(MultizoneBackendTest, RenderingDelay) {
-  std::unique_ptr<base::MessageLoop> message_loop(new base::MessageLoop());
   const TestParams& params = GetParam();
   int sample_rate = testing::get<0>(params);
   float playback_rate = testing::get<1>(params);
 
-  Initialize(sample_rate, playback_rate);
+  Initialize(sample_rate, 1 /* playback_rate_change_count */);
   AddEffectsStreams();
-  Start();
-  base::RunLoop().Run();
+  Start(playback_rate);
+}
+
+TEST_F(MultizoneBackendTest, RenderingDelayWithMultipleRateChanges) {
+  Initialize(48000 /* sample_rate */, 10 /* playback_rate_change_count */);
+  AddEffectsStreams();
+  Start(1.0f /* playback_rate */);
 }
 
 INSTANTIATE_TEST_CASE_P(
diff --git a/chromeos/process_proxy/process_proxy_registry.cc b/chromeos/process_proxy/process_proxy_registry.cc
index fbc0442..7ba2e45 100644
--- a/chromeos/process_proxy/process_proxy_registry.cc
+++ b/chromeos/process_proxy/process_proxy_registry.cc
@@ -50,7 +50,7 @@
 ProcessProxyRegistry::~ProcessProxyRegistry() {
   // TODO(tbarzic): Fix issue with ProcessProxyRegistry being destroyed
   // on a different thread (it's a LazyInstance).
-  DetachFromThread();
+  // DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   ShutDown();
 }
@@ -73,7 +73,7 @@
 
 int ProcessProxyRegistry::OpenProcess(const std::string& command,
                                       const OutputCallback& output_callback) {
-  DCHECK(CalledOnValidThread());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   if (!EnsureWatcherThreadStarted())
     return -1;
@@ -104,7 +104,7 @@
 }
 
 bool ProcessProxyRegistry::SendInput(int id, const std::string& data) {
-  DCHECK(CalledOnValidThread());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   std::map<int, ProcessProxyInfo>::iterator it = proxy_map_.find(id);
   if (it == proxy_map_.end())
@@ -113,7 +113,7 @@
 }
 
 bool ProcessProxyRegistry::CloseProcess(int id) {
-  DCHECK(CalledOnValidThread());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   std::map<int, ProcessProxyInfo>::iterator it = proxy_map_.find(id);
   if (it == proxy_map_.end())
@@ -125,7 +125,7 @@
 }
 
 bool ProcessProxyRegistry::OnTerminalResize(int id, int width, int height) {
-  DCHECK(CalledOnValidThread());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   std::map<int, ProcessProxyInfo>::iterator it = proxy_map_.find(id);
   if (it == proxy_map_.end())
@@ -135,7 +135,7 @@
 }
 
 void ProcessProxyRegistry::AckOutput(int id) {
-  DCHECK(CalledOnValidThread());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   std::map<int, ProcessProxyInfo>::iterator it = proxy_map_.find(id);
   if (it == proxy_map_.end())
@@ -147,7 +147,7 @@
 void ProcessProxyRegistry::OnProcessOutput(int id,
                                            ProcessOutputType type,
                                            const std::string& data) {
-  DCHECK(CalledOnValidThread());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   const char* type_str = ProcessOutputTypeToString(type);
   DCHECK(type_str);
diff --git a/chromeos/process_proxy/process_proxy_registry.h b/chromeos/process_proxy/process_proxy_registry.h
index 428a61c..16ca7b5 100644
--- a/chromeos/process_proxy/process_proxy_registry.h
+++ b/chromeos/process_proxy/process_proxy_registry.h
@@ -13,7 +13,7 @@
 #include "base/lazy_instance.h"
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
-#include "base/threading/non_thread_safe.h"
+#include "base/sequence_checker.h"
 #include "base/threading/thread.h"
 #include "chromeos/chromeos_export.h"
 #include "chromeos/process_proxy/process_proxy.h"
@@ -22,7 +22,7 @@
 
 // Keeps track of all created ProcessProxies. It is created lazily and should
 // live on a single thread (where all methods must be called).
-class CHROMEOS_EXPORT ProcessProxyRegistry : public base::NonThreadSafe {
+class CHROMEOS_EXPORT ProcessProxyRegistry {
  public:
   using OutputCallback = base::Callback<void(int terminal_id,
                                              const std::string& output_type,
@@ -73,6 +73,8 @@
 
   std::unique_ptr<base::Thread> watcher_thread_;
 
+  SEQUENCE_CHECKER(sequence_checker_);
+
   DISALLOW_COPY_AND_ASSIGN(ProcessProxyRegistry);
 };
 
diff --git a/components/data_reduction_proxy/OWNERS b/components/data_reduction_proxy/OWNERS
index 340aa35a..7d2916a7 100644
--- a/components/data_reduction_proxy/OWNERS
+++ b/components/data_reduction_proxy/OWNERS
@@ -1,5 +1,4 @@
 bengr@chromium.org
-bolian@chromium.org
 megjablon@chromium.org
 rajendrant@chromium.org
 ryansturm@chromium.org
@@ -11,3 +10,5 @@
 
 per-file *_messages*.h=set noparent
 per-file *_messages*.h=file://ipc/SECURITY_OWNERS
+
+# COMPONENT: Internals>Network>DataProxy
\ No newline at end of file
diff --git a/components/data_reduction_proxy/content/browser/content_lofi_decider.cc b/components/data_reduction_proxy/content/browser/content_lofi_decider.cc
index ac94524..4f98e4e 100644
--- a/components/data_reduction_proxy/content/browser/content_lofi_decider.cc
+++ b/components/data_reduction_proxy/content/browser/content_lofi_decider.cc
@@ -117,10 +117,7 @@
     if (!(request_info->GetPreviewsState() & content::SERVER_LITE_PAGE_ON))
       accept_transform_value += base::StringPrintf(";%s", if_heavy_qualifier());
   } else if (lofi_enabled_via_flags_or_field_trial &&
-             // Only use Lo-Fi if Lite Pages aren't enabled or fallback from
-             // Lite Pages to Lo-Fi is enabled.
-             (!lite_page_enabled_via_flags_or_field_trial ||
-              params::IsLitePageFallbackEnabled()) &&
+             !lite_page_enabled_via_flags_or_field_trial &&
              resource_type_supports_empty_image &&
              !(request_info->GetPreviewsState() &
                content::SERVER_LITE_PAGE_ON)) {
diff --git a/components/data_reduction_proxy/content/browser/content_lofi_decider_unittest.cc b/components/data_reduction_proxy/content/browser/content_lofi_decider_unittest.cc
index d033a521..1b8d9de 100644
--- a/components/data_reduction_proxy/content/browser/content_lofi_decider_unittest.cc
+++ b/components/data_reduction_proxy/content/browser/content_lofi_decider_unittest.cc
@@ -310,10 +310,6 @@
   base::FieldTrialList field_trial_list(nullptr);
   base::FieldTrialList::CreateFieldTrial(params::GetLoFiFieldTrialName(),
                                          "Enabled");
-  // Add the Lite Page fallback field trial. Having this enabled when not in the
-  // Enabled_Previews group should not affect how Lo-Fi works.
-  base::FieldTrialList::CreateFieldTrial(
-      params::GetLitePageFallbackFieldTrialName(), "Enabled");
 
   // Enable Lo-Fi.
   const struct {
@@ -429,51 +425,6 @@
   }
 }
 
-TEST_F(ContentLoFiDeciderTest, LitePageFieldTrialFallbackEnabled) {
-  base::FieldTrialList field_trial_list(nullptr);
-  base::FieldTrialList::CreateFieldTrial(params::GetLoFiFieldTrialName(),
-                                         "Enabled_Preview");
-  base::FieldTrialList::CreateFieldTrial(
-      params::GetLitePageFallbackFieldTrialName(), "Enabled");
-
-  // Enable Lo-Fi.
-  const struct {
-    bool is_using_lofi;
-    bool is_using_lite_page;
-    bool is_main_frame;
-  } tests[] = {
-      {false, false, false}, {false, false, true}, {true, false, true},
-      {true, false, false},  {false, true, false}, {false, true, true},
-      {true, true, true},    {true, true, false},
-  };
-
-  for (size_t i = 0; i < arraysize(tests); ++i) {
-    content::PreviewsState previews_state = content::PREVIEWS_UNSPECIFIED;
-    if (tests[i].is_using_lofi)
-      previews_state |= content::SERVER_LOFI_ON;
-    if (tests[i].is_using_lite_page)
-      previews_state |= content::SERVER_LITE_PAGE_ON;
-    if (previews_state == content::PREVIEWS_UNSPECIFIED)
-      previews_state = content::PREVIEWS_OFF;
-
-    std::unique_ptr<net::URLRequest> request =
-        CreateRequest(tests[i].is_main_frame, previews_state);
-    net::HttpRequestHeaders headers;
-    NotifyBeforeSendHeaders(&headers, request.get(), true);
-    VerifyLoFiHeader(!tests[i].is_main_frame && !tests[i].is_using_lite_page,
-                     !tests[i].is_main_frame && !tests[i].is_using_lofi &&
-                         !tests[i].is_using_lite_page,
-                     headers);
-    VerifyLitePageHeader(tests[i].is_main_frame,
-                         tests[i].is_main_frame && !tests[i].is_using_lite_page,
-                         headers);
-    DataReductionProxyData* data = DataReductionProxyData::GetData(*request);
-    EXPECT_EQ(tests[i].is_using_lofi || tests[i].is_using_lite_page,
-              data->lofi_requested())
-        << i;
-  }
-}
-
 TEST_F(ContentLoFiDeciderTest, LitePageFieldTrialFallbackDisabled) {
   base::FieldTrialList field_trial_list(nullptr);
   base::FieldTrialList::CreateFieldTrial(params::GetLoFiFieldTrialName(),
diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_compression_stats.cc b/components/data_reduction_proxy/core/browser/data_reduction_proxy_compression_stats.cc
index 662892a..3cfa1ff 100644
--- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_compression_stats.cc
+++ b/components/data_reduction_proxy/core/browser/data_reduction_proxy_compression_stats.cc
@@ -20,7 +20,6 @@
 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_metrics.h"
 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_service.h"
 #include "components/data_reduction_proxy/core/browser/data_usage_store.h"
-#include "components/data_reduction_proxy/core/browser/data_use_group.h"
 #include "components/data_reduction_proxy/core/common/data_reduction_proxy_features.h"
 #include "components/data_reduction_proxy/core/common/data_reduction_proxy_pref_names.h"
 #include "components/data_reduction_proxy/core/common/data_reduction_proxy_switches.h"
@@ -437,43 +436,23 @@
   InitListPref(prefs::kDailyOriginalContentLengthWithDataReductionProxyEnabled);
 }
 
-void DataReductionProxyCompressionStats::UpdateContentLengths(
+void DataReductionProxyCompressionStats::RecordDataUseWithMimeType(
     int64_t data_used,
     int64_t original_size,
     bool data_saver_enabled,
     DataReductionProxyRequestType request_type,
-    const scoped_refptr<DataUseGroup>& data_use_group,
     const std::string& mime_type) {
   DCHECK(thread_checker_.CalledOnValidThread());
+  TRACE_EVENT0("loader",
+               "DataReductionProxyCompressionStats::RecordDataUseWithMimeType")
   session_total_received_ += data_used;
   session_total_original_ += original_size;
-  std::string data_use_host;
-  if (data_use_group) {
-    data_use_host = data_use_group->GetHostname();
-  }
-
-  RecordData(data_used, original_size, data_saver_enabled, request_type,
-             data_use_host, mime_type);
-}
-
-void DataReductionProxyCompressionStats::RecordData(
-    int64_t data_used,
-    int64_t original_size,
-    bool data_saver_enabled,
-    DataReductionProxyRequestType request_type,
-    const std::string& data_use_host,
-    const std::string& mime_type) {
-  DCHECK(thread_checker_.CalledOnValidThread());
-  TRACE_EVENT0("loader", "DataReductionProxyCompressionStats::RecordData")
 
   IncreaseInt64Pref(data_reduction_proxy::prefs::kHttpReceivedContentLength,
                     data_used);
   IncreaseInt64Pref(data_reduction_proxy::prefs::kHttpOriginalContentLength,
                     original_size);
 
-  // TODO(rajendrant): Remove RecordDataUsage once data use ascriber based per
-  // domain data usage recording is enabled.
-  RecordDataUsage(data_use_host, data_used, original_size, base::Time::Now());
   RecordRequestSizePrefs(data_used, original_size, data_saver_enabled,
                          request_type, mime_type, base::Time::Now());
 }
@@ -1188,7 +1167,7 @@
   }
 }
 
-void DataReductionProxyCompressionStats::RecordDataUsage(
+void DataReductionProxyCompressionStats::RecordDataUseByHost(
     const std::string& data_usage_host,
     int64_t data_used,
     int64_t original_size,
diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_compression_stats.h b/components/data_reduction_proxy/core/browser/data_reduction_proxy_compression_stats.h
index 324a1da..611402b 100644
--- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_compression_stats.h
+++ b/components/data_reduction_proxy/core/browser/data_reduction_proxy_compression_stats.h
@@ -34,7 +34,6 @@
 namespace data_reduction_proxy {
 class DataReductionProxyService;
 class DataUsageBucket;
-class DataUseGroup;
 class PerSiteDataUsage;
 
 // Data reduction proxy delayed pref service reduces the number calls to pref
@@ -61,27 +60,23 @@
                                      const base::TimeDelta& delay);
   ~DataReductionProxyCompressionStats();
 
-  // Records detailed data usage broken down by connection type and domain. Also
-  // records daily data savings statistics to prefs and reports data savings
-  // UMA. |compressed_size| and |original_size| are measured in bytes.
-  // TODO(rajendrant): This can be changed to RecordRequestMimeType and
-  // |data_use_group| param removed. It records daily data savings statistics to
-  // prefs and reports data savings UMA.
-  void UpdateContentLengths(int64_t compressed_size,
-                            int64_t original_size,
-                            bool data_reduction_proxy_enabled,
-                            DataReductionProxyRequestType request_type,
-                            const scoped_refptr<DataUseGroup>& data_use_group,
-                            const std::string& mime_type);
+  // Records detailed data usage broken down by |mime_type|. Also records daily
+  // data savings statistics to prefs and reports data savings UMA. |data_used|
+  // and |original_size| are measured in bytes.
+  void RecordDataUseWithMimeType(int64_t compressed_size,
+                                 int64_t original_size,
+                                 bool data_reduction_proxy_enabled,
+                                 DataReductionProxyRequestType request_type,
+                                 const std::string& mime_type);
 
   // Record data usage and original size of request broken down by host.
   // |original_request_size| and |data_used| are in bytes. |time| is the time at
   // which the data usage occurred. This method should be called in real time,
   // so |time| is expected to be |Time::Now()|.
-  void RecordDataUsage(const std::string& data_usage_host,
-                       int64_t original_request_size,
-                       int64_t data_used,
-                       const base::Time time);
+  void RecordDataUseByHost(const std::string& data_usage_host,
+                           int64_t original_request_size,
+                           int64_t data_used,
+                           const base::Time time);
 
   // Creates a |Value| summary of the persistent state of the network
   // statistics.
@@ -240,16 +235,6 @@
   // Example: "http://www.finance.google.com" -> "www.finance.google.com"
   static std::string NormalizeHostname(const std::string& host);
 
-  // Records detailed data usage broken down by |host|. Also records daily data
-  // savings statistics to prefs and reports data savings UMA. |data_used| and
-  // |original_size| are measured in bytes.
-  void RecordData(int64_t data_used,
-                  int64_t original_size,
-                  bool data_saver_enabled,
-                  DataReductionProxyRequestType request_type,
-                  const std::string& data_use_host,
-                  const std::string& mime_type);
-
   DataReductionProxyService* service_;
   PrefService* pref_service_;
   const base::TimeDelta delay_;
diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_compression_stats_unittest.cc b/components/data_reduction_proxy/core/browser/data_reduction_proxy_compression_stats_unittest.cc
index d05f679..f701d40 100644
--- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_compression_stats_unittest.cc
+++ b/components/data_reduction_proxy/core/browser/data_reduction_proxy_compression_stats_unittest.cc
@@ -20,7 +20,6 @@
 #include "base/values.h"
 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_prefs.h"
 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_test_utils.h"
-#include "components/data_reduction_proxy/core/browser/data_use_group.h"
 #include "components/data_reduction_proxy/core/common/data_reduction_proxy_pref_names.h"
 #include "components/data_reduction_proxy/core/common/data_reduction_proxy_switches.h"
 #include "components/data_reduction_proxy/proto/data_store.pb.h"
@@ -418,8 +417,8 @@
                        int64_t data_used,
                        int64_t original_size,
                        const base::Time& time) {
-    compression_stats_->RecordDataUsage(data_usage_host, data_used,
-                                        original_size, time);
+    compression_stats_->RecordDataUseByHost(data_usage_host, data_used,
+                                            original_size, time);
   }
 
   void GetHistoricalDataUsage(
@@ -570,9 +569,9 @@
   const int64_t kOriginalLength = 200;
   const int64_t kReceivedLength = 100;
 
-  compression_stats()->UpdateContentLengths(
+  compression_stats()->RecordDataUseWithMimeType(
       kReceivedLength, kOriginalLength, IsDataReductionProxyEnabled(),
-      UNKNOWN_TYPE, nullptr, std::string());
+      UNKNOWN_TYPE, std::string());
 
   EXPECT_EQ(kReceivedLength,
             GetInt64(data_reduction_proxy::prefs::kHttpReceivedContentLength));
@@ -581,9 +580,9 @@
             GetInt64(data_reduction_proxy::prefs::kHttpOriginalContentLength));
 
   // Record the same numbers again, and total lengths should be doubled.
-  compression_stats()->UpdateContentLengths(
+  compression_stats()->RecordDataUseWithMimeType(
       kReceivedLength, kOriginalLength, IsDataReductionProxyEnabled(),
-      UNKNOWN_TYPE, nullptr, std::string());
+      UNKNOWN_TYPE, std::string());
 
   EXPECT_EQ(kReceivedLength * 2,
             GetInt64(data_reduction_proxy::prefs::kHttpReceivedContentLength));
diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_data_use_observer.cc b/components/data_reduction_proxy/core/browser/data_reduction_proxy_data_use_observer.cc
index 8d433aef..391674fa 100644
--- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_data_use_observer.cc
+++ b/components/data_reduction_proxy/core/browser/data_reduction_proxy_data_use_observer.cc
@@ -44,52 +44,6 @@
 const void* DataUseUserDataBytes::kUserDataKey =
     &DataUseUserDataBytes::kUserDataKey;
 
-// Estimate the size of the original headers of |request|. If |used_drp| is
-// true, then it's assumed that the original request would have used HTTP/1.1,
-// otherwise it assumes that the original request would have used the same
-// protocol as |request| did. This is to account for stuff like HTTP/2 header
-// compression.
-int64_t EstimateOriginalHeaderBytes(const net::URLRequest& request,
-                                    bool used_drp) {
-  if (used_drp) {
-    // TODO(sclittle): Remove headers added by Data Reduction Proxy when
-    // computing original size. https://crbug.com/535701.
-    return request.response_headers()->raw_headers().size();
-  }
-  return std::max<int64_t>(0, request.GetTotalReceivedBytes() -
-                                  request.received_response_content_length());
-}
-
-// Given a |request| that went through the Data Reduction Proxy if |used_drp| is
-// true, this function estimates how many bytes would have been received if the
-// response had been received directly from the origin without any data saver
-// optimizations.
-int64_t EstimateOriginalReceivedBytes(
-    const net::URLRequest& request,
-    bool used_drp,
-    const data_reduction_proxy::LoFiDecider* lofi_decider) {
-  if (request.was_cached() || !request.response_headers())
-    return request.GetTotalReceivedBytes();
-
-  if (lofi_decider) {
-    if (lofi_decider->IsClientLoFiAutoReloadRequest(request))
-      return 0;
-
-    int64_t first, last, length;
-    if (lofi_decider->IsClientLoFiImageRequest(request) &&
-        request.response_headers()->GetContentRangeFor206(&first, &last,
-                                                          &length) &&
-        length > request.received_response_content_length()) {
-      return EstimateOriginalHeaderBytes(request, used_drp) + length;
-    }
-  }
-
-  return used_drp
-             ? EstimateOriginalHeaderBytes(request, used_drp) +
-                   data_reduction_proxy::util::CalculateEffectiveOCL(request)
-             : request.GetTotalReceivedBytes();
-}
-
 }  // namespace
 
 namespace data_reduction_proxy {
@@ -134,6 +88,11 @@
       data_use_measurement::DataUse::TrafficType::USER_TRAFFIC)
     return;
 
+  if (!request.url().SchemeIs(url::kHttpsScheme) &&
+      !request.url().SchemeIs(url::kHttpScheme)) {
+    return;
+  }
+
   int64_t network_bytes = request.GetTotalReceivedBytes();
   DataReductionProxyRequestType request_type = GetDataReductionProxyRequestType(
       request, data_reduction_proxy_io_data_->configurator()->GetProxyConfig(),
@@ -141,7 +100,7 @@
 
   // Estimate how many bytes would have been used if the DataReductionProxy was
   // not used, and record the data usage.
-  int64_t original_bytes = EstimateOriginalReceivedBytes(
+  int64_t original_bytes = util::EstimateOriginalReceivedBytes(
       request, request_type == VIA_DATA_REDUCTION_PROXY,
       data_reduction_proxy_io_data_->lofi_decider());
 
diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_io_data.cc b/components/data_reduction_proxy/core/browser/data_reduction_proxy_io_data.cc
index 90318bc..7b02ff1b6 100644
--- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_io_data.cc
+++ b/components/data_reduction_proxy/core/browser/data_reduction_proxy_io_data.cc
@@ -23,7 +23,6 @@
 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_network_delegate.h"
 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_service.h"
 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_settings.h"
-#include "components/data_reduction_proxy/core/browser/data_use_group.h"
 #include "components/data_reduction_proxy/core/common/data_reduction_proxy_event_creator.h"
 #include "components/data_reduction_proxy/core/common/data_reduction_proxy_event_storage_delegate.h"
 #include "components/data_reduction_proxy/core/common/data_reduction_proxy_params.h"
@@ -103,7 +102,7 @@
       net_log_(net_log),
       io_task_runner_(io_task_runner),
       ui_task_runner_(ui_task_runner),
-      data_use_group_provider_(nullptr),
+      data_use_observer_(nullptr),
       enabled_(enabled),
       url_request_context_getter_(nullptr),
       basic_url_request_context_getter_(
@@ -244,10 +243,6 @@
           request_options_.get(), configurator_.get()));
   if (track_proxy_bypass_statistics)
     network_delegate->InitIODataAndUMA(this, bypass_stats_.get());
-  if (data_use_group_provider_) {
-    network_delegate->SetDataUseGroupProvider(
-        std::move(data_use_group_provider_));
-  }
 
   return network_delegate;
 }
@@ -333,7 +328,6 @@
     int64_t original_size,
     bool data_reduction_proxy_enabled,
     DataReductionProxyRequestType request_type,
-    const scoped_refptr<DataUseGroup>& data_use_group,
     const std::string& mime_type) {
   DCHECK(io_task_runner_->BelongsToCurrentThread());
 
@@ -341,7 +335,7 @@
       FROM_HERE,
       base::Bind(&DataReductionProxyService::UpdateContentLengths, service_,
                  data_used, original_size, data_reduction_proxy_enabled,
-                 request_type, data_use_group, mime_type));
+                 request_type, mime_type));
 }
 
 void DataReductionProxyIOData::SetLoFiModeActiveOnMainFrame(
@@ -419,4 +413,12 @@
   SetStringPref(prefs::kDataReductionProxyConfig, serialized_config);
 }
 
+void DataReductionProxyIOData::SetDataUseAscriber(
+    data_use_measurement::DataUseAscriber* data_use_ascriber) {
+  DCHECK(io_task_runner_->BelongsToCurrentThread());
+  DCHECK(data_use_ascriber);
+  data_use_observer_.reset(
+      new DataReductionProxyDataUseObserver(this, data_use_ascriber));
+}
+
 }  // namespace data_reduction_proxy
diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_io_data.h b/components/data_reduction_proxy/core/browser/data_reduction_proxy_io_data.h
index 951a32bf..5549dd2 100644
--- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_io_data.h
+++ b/components/data_reduction_proxy/core/browser/data_reduction_proxy_io_data.h
@@ -15,11 +15,11 @@
 #include "base/memory/ref_counted.h"
 #include "base/memory/weak_ptr.h"
 #include "base/single_thread_task_runner.h"
+#include "components/data_reduction_proxy/core/browser/data_reduction_proxy_data_use_observer.h"
 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_delegate.h"
 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_metrics.h"
 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_network_delegate.h"
 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_request_options.h"
-#include "components/data_reduction_proxy/core/browser/data_use_group_provider.h"
 #include "components/data_reduction_proxy/core/common/data_reduction_proxy_event_storage_delegate.h"
 #include "components/data_reduction_proxy/core/common/data_reduction_proxy_util.h"
 #include "components/data_reduction_proxy/core/common/lofi_decider.h"
@@ -72,6 +72,9 @@
   // Performs UI thread specific shutdown logic.
   void ShutdownOnUIThread();
 
+  void SetDataUseAscriber(
+      data_use_measurement::DataUseAscriber* data_use_ascriber);
+
   // Sets the Data Reduction Proxy service after it has been created.
   // Virtual for testing.
   virtual void SetDataReductionProxyService(
@@ -127,7 +130,6 @@
       int64_t original_size,
       bool data_reduction_proxy_enabled,
       DataReductionProxyRequestType request_type,
-      const scoped_refptr<DataUseGroup>& data_usage_source,
       const std::string& mime_type);
   void SetLoFiModeActiveOnMainFrame(bool lo_fi_mode_active);
 
@@ -209,11 +211,6 @@
     resource_type_provider_ = std::move(resource_type_provider);
   }
 
-  void set_data_usage_source_provider(
-      std::unique_ptr<DataUseGroupProvider> data_usage_source_provider) {
-    data_use_group_provider_ = std::move(data_usage_source_provider);
-  }
-
   // The production channel of this build.
   std::string channel() const { return channel_; }
 
@@ -291,9 +288,8 @@
   scoped_refptr<base::SingleThreadTaskRunner> io_task_runner_;
   scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner_;
 
-  // Manages instances of |DataUsageSource| and maps |URLRequest| instances to
-  // their appropriate |DataUsageSource|.
-  std::unique_ptr<DataUseGroupProvider> data_use_group_provider_;
+  // Observes pageload events and records per host data use.
+  std::unique_ptr<DataReductionProxyDataUseObserver> data_use_observer_;
 
   // Whether the Data Reduction Proxy has been enabled or not by the user. In
   // practice, this can be overridden by the command line.
diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_network_delegate.cc b/components/data_reduction_proxy/core/browser/data_reduction_proxy_network_delegate.cc
index c94d5ea7..dd29ebf 100644
--- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_network_delegate.cc
+++ b/components/data_reduction_proxy/core/browser/data_reduction_proxy_network_delegate.cc
@@ -20,8 +20,6 @@
 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_data.h"
 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_io_data.h"
 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_request_options.h"
-#include "components/data_reduction_proxy/core/browser/data_use_group.h"
-#include "components/data_reduction_proxy/core/browser/data_use_group_provider.h"
 #include "components/data_reduction_proxy/core/common/data_reduction_proxy_headers.h"
 #include "components/data_reduction_proxy/core/common/data_reduction_proxy_params.h"
 #include "components/data_reduction_proxy/core/common/data_reduction_proxy_util.h"
@@ -161,54 +159,6 @@
                           received_content_length);
 }
 
-// Estimate the size of the original headers of |request|. If |used_drp| is
-// true, then it's assumed that the original request would have used HTTP/1.1,
-// otherwise it assumes that the original request would have used the same
-// protocol as |request| did. This is to account for stuff like HTTP/2 header
-// compression.
-// TODO(rajendrant): Remove this method when data use ascriber observers are
-// used to record the per-site data usage.
-int64_t EstimateOriginalHeaderBytes(const net::URLRequest& request,
-                                    bool used_drp) {
-  if (used_drp) {
-    // TODO(sclittle): Remove headers added by Data Reduction Proxy when
-    // computing original size. https://crbug.com/535701.
-    return request.response_headers()->raw_headers().size();
-  }
-  return std::max<int64_t>(0, request.GetTotalReceivedBytes() -
-                                  request.received_response_content_length());
-}
-
-// Given a |request| that went through the Data Reduction Proxy if |used_drp| is
-// true, this function estimates how many bytes would have been received if the
-// response had been received directly from the origin without any data saver
-// optimizations.
-// TODO(rajendrant): Remove this method when data use ascriber observers are
-// used to record the per-site data usage.
-int64_t EstimateOriginalReceivedBytes(const net::URLRequest& request,
-                                      bool used_drp,
-                                      const LoFiDecider* lofi_decider) {
-  if (request.was_cached() || !request.response_headers())
-    return request.GetTotalReceivedBytes();
-
-  if (lofi_decider) {
-    if (lofi_decider->IsClientLoFiAutoReloadRequest(request))
-      return 0;
-
-    int64_t first, last, length;
-    if (lofi_decider->IsClientLoFiImageRequest(request) &&
-        request.response_headers()->GetContentRangeFor206(&first, &last,
-                                                          &length) &&
-        length > request.received_response_content_length()) {
-      return EstimateOriginalHeaderBytes(request, used_drp) + length;
-    }
-  }
-
-  return used_drp ? EstimateOriginalHeaderBytes(request, used_drp) +
-                        util::CalculateEffectiveOCL(request)
-                  : request.GetTotalReceivedBytes();
-}
-
 // Verifies that the chrome proxy related request headers are set correctly.
 // |via_chrome_proxy| is true if the request is being fetched via Chrome Data
 // Saver proxy.
@@ -268,15 +218,6 @@
     const net::CompletionCallback& callback,
     GURL* new_url) {
   DCHECK(thread_checker_.CalledOnValidThread());
-  if (data_use_group_provider_) {
-    // Creates and initializes a |DataUseGroup| for the |request| if it does not
-    // exist. Even though we do not use the |DataUseGroup| here, we want to
-    // associate one with a request as early as possible in case the frame
-    // associated with the request goes away before the request is completed.
-    scoped_refptr<DataUseGroup> data_use_group =
-        data_use_group_provider_->GetDataUseGroup(request);
-    data_use_group->Initialize();
-  }
 
   // |data_reduction_proxy_io_data_| can be NULL for Webview.
   if (data_reduction_proxy_io_data_ &&
@@ -548,7 +489,7 @@
 
   // Estimate how many bytes would have been used if the DataReductionProxy was
   // not used, and record the data usage.
-  int64_t original_size = EstimateOriginalReceivedBytes(
+  int64_t original_size = util::EstimateOriginalReceivedBytes(
       request, request_type == VIA_DATA_REDUCTION_PROXY,
       data_reduction_proxy_io_data_
           ? data_reduction_proxy_io_data_->lofi_decider()
@@ -558,19 +499,13 @@
   if (request.response_headers())
     request.response_headers()->GetMimeType(&mime_type);
 
-  scoped_refptr<DataUseGroup> data_use_group =
-      data_use_group_provider_
-          ? data_use_group_provider_->GetDataUseGroup(&request)
-          : nullptr;
-  AccumulateDataUsage(data_used, original_size, request_type, data_use_group,
-                      mime_type);
+  AccumulateDataUsage(data_used, original_size, request_type, mime_type);
 }
 
 void DataReductionProxyNetworkDelegate::AccumulateDataUsage(
     int64_t data_used,
     int64_t original_size,
     DataReductionProxyRequestType request_type,
-    const scoped_refptr<DataUseGroup>& data_use_group,
     const std::string& mime_type) {
   DCHECK(thread_checker_.CalledOnValidThread());
   DCHECK_GE(data_used, 0);
@@ -578,7 +513,7 @@
   if (data_reduction_proxy_io_data_) {
     data_reduction_proxy_io_data_->UpdateContentLengths(
         data_used, original_size, data_reduction_proxy_io_data_->IsEnabled(),
-        request_type, data_use_group, mime_type);
+        request_type, mime_type);
   }
 }
 
@@ -649,12 +584,6 @@
                                            &data_reduction_proxy_info);
 }
 
-void DataReductionProxyNetworkDelegate::SetDataUseGroupProvider(
-    std::unique_ptr<DataUseGroupProvider> data_use_group_provider) {
-  DCHECK(thread_checker_.CalledOnValidThread());
-  data_use_group_provider_ = std::move(data_use_group_provider);
-}
-
 void DataReductionProxyNetworkDelegate::MaybeAddBrotliToAcceptEncodingHeader(
     const net::ProxyInfo& proxy_info,
     net::HttpRequestHeaders* request_headers,
diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_network_delegate.h b/components/data_reduction_proxy/core/browser/data_reduction_proxy_network_delegate.h
index 600445d..68342475 100644
--- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_network_delegate.h
+++ b/components/data_reduction_proxy/core/browser/data_reduction_proxy_network_delegate.h
@@ -35,8 +35,6 @@
 class DataReductionProxyConfigurator;
 class DataReductionProxyIOData;
 class DataReductionProxyRequestOptions;
-class DataUseGroupProvider;
-class DataUseGroup;
 
 // Values of the UMA DataReductionProxy.LoFi.TransformationType histogram.
 // This enum must remain synchronized with
@@ -76,9 +74,6 @@
       DataReductionProxyIOData* io_data,
       DataReductionProxyBypassStats* bypass_stats);
 
-  void SetDataUseGroupProvider(
-      std::unique_ptr<DataUseGroupProvider> data_use_group_provider);
-
  private:
   friend class DataReductionProxyTestContext;
 
@@ -136,7 +131,6 @@
   void AccumulateDataUsage(int64_t data_used,
                            int64_t original_size,
                            DataReductionProxyRequestType request_type,
-                           const scoped_refptr<DataUseGroup>& data_use_group,
                            const std::string& mime_type);
 
   // Record information such as histograms related to the Content-Length of
@@ -188,8 +182,6 @@
 
   const DataReductionProxyConfigurator* configurator_;
 
-  std::unique_ptr<DataUseGroupProvider> data_use_group_provider_;
-
   base::ThreadChecker thread_checker_;
 
   DISALLOW_COPY_AND_ASSIGN(DataReductionProxyNetworkDelegate);
diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_service.cc b/components/data_reduction_proxy/core/browser/data_reduction_proxy_service.cc
index 94e2445..4d175cd 100644
--- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_service.cc
+++ b/components/data_reduction_proxy/core/browser/data_reduction_proxy_service.cc
@@ -20,7 +20,6 @@
 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_service_observer.h"
 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_settings.h"
 #include "components/data_reduction_proxy/core/browser/data_store.h"
-#include "components/data_reduction_proxy/core/browser/data_use_group.h"
 #include "components/data_reduction_proxy/core/common/data_reduction_proxy_event_store.h"
 #include "components/data_reduction_proxy/core/common/data_reduction_proxy_params.h"
 #include "components/data_reduction_proxy/core/common/data_reduction_proxy_pref_names.h"
@@ -97,8 +96,8 @@
                                                      const std::string& host) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   if (compression_stats_) {
-    compression_stats_->RecordDataUsage(host, original_bytes, network_bytes,
-                                        base::Time::Now());
+    compression_stats_->RecordDataUseByHost(host, network_bytes, original_bytes,
+                                            base::Time::Now());
   }
 }
 
@@ -107,13 +106,12 @@
     int64_t original_size,
     bool data_reduction_proxy_enabled,
     DataReductionProxyRequestType request_type,
-    scoped_refptr<DataUseGroup> data_use_group,
     const std::string& mime_type) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   if (compression_stats_) {
-    compression_stats_->UpdateContentLengths(
-        data_used, original_size, data_reduction_proxy_enabled, request_type,
-        data_use_group, mime_type);
+    compression_stats_->RecordDataUseWithMimeType(data_used, original_size,
+                                                  data_reduction_proxy_enabled,
+                                                  request_type, mime_type);
   }
 }
 
diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_service.h b/components/data_reduction_proxy/core/browser/data_reduction_proxy_service.h
index 040605e2..4686c1d 100644
--- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_service.h
+++ b/components/data_reduction_proxy/core/browser/data_reduction_proxy_service.h
@@ -42,7 +42,6 @@
 class DataReductionProxyPingbackClient;
 class DataReductionProxyServiceObserver;
 class DataReductionProxySettings;
-class DataUseGroup;
 
 // Contains and initializes all Data Reduction Proxy objects that have a
 // lifetime based on the UI thread.
@@ -86,7 +85,6 @@
                             int64_t original_size,
                             bool data_reduction_proxy_enabled,
                             DataReductionProxyRequestType request_type,
-                            scoped_refptr<DataUseGroup> data_use_group,
                             const std::string& mime_type);
 
   // Overrides of DataReductionProxyEventStorageDelegate.
diff --git a/components/data_reduction_proxy/core/browser/data_use_group.h b/components/data_reduction_proxy/core/browser/data_use_group.h
deleted file mode 100644
index 94b5341..0000000
--- a/components/data_reduction_proxy/core/browser/data_use_group.h
+++ /dev/null
@@ -1,35 +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.
-
-#ifndef COMPONENTS_DATA_REDUCTION_PROXY_CORE_BROWSER_DATA_USE_GROUP_H_
-#define COMPONENTS_DATA_REDUCTION_PROXY_CORE_BROWSER_DATA_USE_GROUP_H_
-
-#include <string>
-
-#include "base/memory/ref_counted.h"
-
-namespace data_reduction_proxy {
-
-// Abstract class that tracks data usage for a group of requests, e.g. those
-// corresponding to the same page load. Applications are responsible for
-// providing overrides that track data usage for groups they care about.
-// This class is ref counted because their lifetimes can depends on the lifetime
-// of frames as well as lifetime of URL requests whose data usage is being
-// tracked.
-class DataUseGroup : public base::RefCountedThreadSafe<DataUseGroup> {
- public:
-  // Initialize this instance.
-  virtual void Initialize() = 0;
-
-  // The hostname that this data usage should be ascribed to.
-  virtual std::string GetHostname() = 0;
-
- protected:
-  friend class base::RefCountedThreadSafe<DataUseGroup>;
-  virtual ~DataUseGroup() {}
-};
-
-}  // namespace data_reduction_proxy
-
-#endif  // COMPONENTS_DATA_REDUCTION_PROXY_CORE_BROWSER_DATA_USE_GROUP_H_
diff --git a/components/data_reduction_proxy/core/browser/data_use_group_provider.h b/components/data_reduction_proxy/core/browser/data_use_group_provider.h
deleted file mode 100644
index ca3f266..0000000
--- a/components/data_reduction_proxy/core/browser/data_use_group_provider.h
+++ /dev/null
@@ -1,33 +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.
-
-#ifndef COMPONENTS_DATA_REDUCTION_PROXY_CORE_BROWSER_DATA_USE_GROUP_PROVIDER_H_
-#define COMPONENTS_DATA_REDUCTION_PROXY_CORE_BROWSER_DATA_USE_GROUP_PROVIDER_H_
-
-#include "base/memory/ref_counted.h"
-
-namespace net {
-class URLRequest;
-}
-
-namespace data_reduction_proxy {
-
-class DataUseGroup;
-
-// Abstract class that manages instances of |DataUsageGroup| and maps
-// |URLRequest| instances to their appropriate |DataUsageGroup|. Applications
-// should provide overrides if they are interested in tracking data usage
-// and surfacing it to the end user.
-class DataUseGroupProvider {
- public:
-  // Returns the |DataUseGroup| to which data usage for the given URL should
-  // be ascribed. If no existing |DataUseGroup| exists, a new one will be
-  // created.
-  virtual scoped_refptr<DataUseGroup> GetDataUseGroup(
-      const net::URLRequest* request) = 0;
-};
-
-}  // namespace data_reduction_proxy
-
-#endif  // COMPONENTS_DATA_REDUCTION_PROXY_CORE_BROWSER_DATA_USE_GROUP_PROVIDER_H_
diff --git a/components/data_reduction_proxy/core/common/data_reduction_proxy_params.cc b/components/data_reduction_proxy/core/common/data_reduction_proxy_params.cc
index f0a2d3d0..cd88474a 100644
--- a/components/data_reduction_proxy/core/common/data_reduction_proxy_params.cc
+++ b/components/data_reduction_proxy/core/common/data_reduction_proxy_params.cc
@@ -41,8 +41,6 @@
 const char kQuicFieldTrial[] = "DataReductionProxyUseQuic";
 
 const char kLoFiFieldTrial[] = "DataCompressionProxyLoFi";
-const char kLitePageFallbackFieldTrial[] =
-    "DataCompressionProxyLitePageFallback";
 const char kLoFiFlagFieldTrial[] = "DataCompressionProxyLoFiFlag";
 
 const char kBlackListTransitionFieldTrial[] =
@@ -112,10 +110,6 @@
   return kLoFiFieldTrial;
 }
 
-const char* GetLitePageFallbackFieldTrialName() {
-  return kLitePageFallbackFieldTrial;
-}
-
 const char* GetLoFiFlagFieldTrialName() {
   return kLoFiFlagFieldTrial;
 }
@@ -137,11 +131,6 @@
                           kLitePage, base::CompareCase::SENSITIVE);
 }
 
-bool IsLitePageFallbackEnabled() {
-  return IsIncludedInFieldTrial(GetLitePageFallbackFieldTrialName()) ||
-         (IsLoFiOnViaFlags() && AreLitePagesEnabledViaFlags());
-}
-
 bool IsIncludedInServerExperimentsFieldTrial() {
   return !base::CommandLine::ForCurrentProcess()->HasSwitch(
              data_reduction_proxy::switches::
diff --git a/components/data_reduction_proxy/core/common/data_reduction_proxy_params.h b/components/data_reduction_proxy/core/common/data_reduction_proxy_params.h
index badc927..9bbf6fd 100644
--- a/components/data_reduction_proxy/core/common/data_reduction_proxy_params.h
+++ b/components/data_reduction_proxy/core/common/data_reduction_proxy_params.h
@@ -52,9 +52,6 @@
 // Returns the name of the Lo-Fi field trial.
 const char* GetLoFiFieldTrialName();
 
-// Returns the name of the Lite Page fallback to Lo-Fi field trial.
-const char* GetLitePageFallbackFieldTrialName();
-
 // Returns the name of the Lo-Fi field trial that configures LoFi flags when it
 // is force enabled through flags.
 const char* GetLoFiFlagFieldTrialName();
@@ -71,11 +68,6 @@
 // trial.
 bool IsIncludedInLitePageFieldTrial();
 
-// Returns true if this client is part of the Lite Page fallback to Lo-Fi field
-// trial or if this client has the command line switch to enable lite pages,
-// which should always fallback.
-bool IsLitePageFallbackEnabled();
-
 // Returns true if this client is part of the field trial that should enable
 // server experiments for the data reduction proxy.
 bool IsIncludedInServerExperimentsFieldTrial();
@@ -106,8 +98,7 @@
 
 // Returns true if this client has the command line switch to enable lite pages.
 // This means a preview should be requested instead of placeholders whenever
-// Lo-Fi mode is on. If Lite Pages are enabled via flags, they will always
-// fallback to Lo-Fi placeholders.
+// Lo-Fi mode is on.
 bool AreLitePagesEnabledViaFlags();
 
 // Returns true if this client has the command line switch to enable forced
diff --git a/components/data_reduction_proxy/core/common/data_reduction_proxy_util.cc b/components/data_reduction_proxy/core/common/data_reduction_proxy_util.cc
index ed6759db..8a26cb8 100644
--- a/components/data_reduction_proxy/core/common/data_reduction_proxy_util.cc
+++ b/components/data_reduction_proxy/core/common/data_reduction_proxy_util.cc
@@ -9,6 +9,7 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/time/time.h"
 #include "base/version.h"
+#include "components/data_reduction_proxy/core/common/lofi_decider.h"
 #include "components/data_reduction_proxy/core/common/version.h"
 #include "net/base/net_errors.h"
 #include "net/base/url_util.h"
@@ -58,6 +59,22 @@
   return static_cast<int64_t>(scaled_byte_count);
 }
 
+// Estimate the size of the original headers of |request|. If |used_drp| is
+// true, then it's assumed that the original request would have used HTTP/1.1,
+// otherwise it assumes that the original request would have used the same
+// protocol as |request| did. This is to account for stuff like HTTP/2 header
+// compression.
+int64_t EstimateOriginalHeaderBytes(const net::URLRequest& request,
+                                    bool used_drp) {
+  if (used_drp) {
+    // TODO(sclittle): Remove headers added by Data Reduction Proxy when
+    // computing original size. https://crbug.com/535701.
+    return request.response_headers()->raw_headers().size();
+  }
+  return std::max<int64_t>(0, request.GetTotalReceivedBytes() -
+                                  request.received_response_content_length());
+}
+
 }  // namespace
 
 namespace util {
@@ -187,6 +204,30 @@
                                content_length_from_header);
 }
 
+int64_t EstimateOriginalReceivedBytes(const net::URLRequest& request,
+                                      bool used_drp,
+                                      const LoFiDecider* lofi_decider) {
+  if (request.was_cached() || !request.response_headers())
+    return request.GetTotalReceivedBytes();
+
+  if (lofi_decider) {
+    if (lofi_decider->IsClientLoFiAutoReloadRequest(request))
+      return 0;
+
+    int64_t first, last, length;
+    if (lofi_decider->IsClientLoFiImageRequest(request) &&
+        request.response_headers()->GetContentRangeFor206(&first, &last,
+                                                          &length) &&
+        length > request.received_response_content_length()) {
+      return EstimateOriginalHeaderBytes(request, used_drp) + length;
+    }
+  }
+
+  return used_drp ? EstimateOriginalHeaderBytes(request, used_drp) +
+                        util::CalculateEffectiveOCL(request)
+                  : request.GetTotalReceivedBytes();
+}
+
 }  // namespace util
 
 namespace protobuf_parser {
diff --git a/components/data_reduction_proxy/core/common/data_reduction_proxy_util.h b/components/data_reduction_proxy/core/common/data_reduction_proxy_util.h
index 811faa9..a528060 100644
--- a/components/data_reduction_proxy/core/common/data_reduction_proxy_util.h
+++ b/components/data_reduction_proxy/core/common/data_reduction_proxy_util.h
@@ -28,6 +28,8 @@
 
 namespace data_reduction_proxy {
 
+class LoFiDecider;
+
 enum class Client {
   UNKNOWN,
   CRONET_ANDROID,
@@ -89,6 +91,13 @@
 // for partial responses if necessary.
 int64_t CalculateEffectiveOCL(const net::URLRequest& request);
 
+// Given a |request| that went through the Data Reduction Proxy if |used_drp| is
+// true, this function estimates how many bytes would have been received if the
+// response had been received directly from the origin without any data saver
+// optimizations.
+int64_t EstimateOriginalReceivedBytes(const net::URLRequest& request,
+                                      bool used_drp,
+                                      const LoFiDecider* lofi_decider);
 }  // namespace util
 
 namespace protobuf_parser {
diff --git a/components/data_usage/OWNERS b/components/data_usage/OWNERS
index 78d68ca..e2172b4 100644
--- a/components/data_usage/OWNERS
+++ b/components/data_usage/OWNERS
@@ -1,4 +1,6 @@
 bengr@chromium.org
 rajendrant@chromium.org
 sclittle@chromium.org
-tbansal@chromium.org
\ No newline at end of file
+tbansal@chromium.org
+
+# COMPONENT: Internals>Network>DataUse
\ No newline at end of file
diff --git a/components/data_use_measurement/OWNERS b/components/data_use_measurement/OWNERS
index 2783dea..9bcf864 100644
--- a/components/data_use_measurement/OWNERS
+++ b/components/data_use_measurement/OWNERS
@@ -1 +1,3 @@
 file://components/data_reduction_proxy/OWNERS
+
+# COMPONENT: Internals>Network>DataUse
diff --git a/components/feature_engagement_tracker/internal/BUILD.gn b/components/feature_engagement_tracker/internal/BUILD.gn
index 04883bcb..5f712216 100644
--- a/components/feature_engagement_tracker/internal/BUILD.gn
+++ b/components/feature_engagement_tracker/internal/BUILD.gn
@@ -52,6 +52,8 @@
     "persistent_store.h",
     "single_invalid_configuration.cc",
     "single_invalid_configuration.h",
+    "stats.cc",
+    "stats.h",
     "storage_validator.h",
     "store.h",
     "system_time_provider.cc",
diff --git a/components/feature_engagement_tracker/internal/availability_store.cc b/components/feature_engagement_tracker/internal/availability_store.cc
index e6a9dfd..3c0163c8 100644
--- a/components/feature_engagement_tracker/internal/availability_store.cc
+++ b/components/feature_engagement_tracker/internal/availability_store.cc
@@ -14,6 +14,7 @@
 #include "base/feature_list.h"
 #include "base/memory/ptr_util.h"
 #include "components/feature_engagement_tracker/internal/proto/availability.pb.h"
+#include "components/feature_engagement_tracker/internal/stats.h"
 #include "components/feature_engagement_tracker/public/feature_list.h"
 #include "components/leveldb_proto/proto_database.h"
 
@@ -34,6 +35,7 @@
     std::unique_ptr<std::map<const base::Feature*, uint32_t>>
         feature_availabilities,
     bool success) {
+  stats::RecordDbUpdate(success, stats::StoreType::AVAILABILITY_STORE);
   std::move(on_loaded_callback).Run(success, std::move(feature_availabilities));
 }
 
@@ -44,6 +46,7 @@
     uint32_t current_day,
     bool success,
     std::unique_ptr<std::vector<Availability>> availabilities) {
+  stats::RecordAvailabilityDbLoadEvent(success);
   if (!success) {
     std::move(on_loaded_callback)
         .Run(false,
@@ -116,6 +119,8 @@
     AvailabilityStore::OnLoadedCallback on_loaded_callback,
     uint32_t current_day,
     bool success) {
+  stats::RecordDbInitEvent(success, stats::StoreType::AVAILABILITY_STORE);
+
   if (!success) {
     std::move(on_loaded_callback)
         .Run(false,
diff --git a/components/feature_engagement_tracker/internal/chrome_variations_configuration.cc b/components/feature_engagement_tracker/internal/chrome_variations_configuration.cc
index 9207b57..90d79b3 100644
--- a/components/feature_engagement_tracker/internal/chrome_variations_configuration.cc
+++ b/components/feature_engagement_tracker/internal/chrome_variations_configuration.cc
@@ -18,6 +18,7 @@
 #include "base/strings/string_split.h"
 #include "base/strings/string_util.h"
 #include "components/feature_engagement_tracker/internal/configuration.h"
+#include "components/feature_engagement_tracker/internal/stats.h"
 #include "components/feature_engagement_tracker/public/feature_list.h"
 
 namespace {
@@ -211,8 +212,13 @@
 
   std::map<std::string, std::string> params;
   bool result = base::GetFieldTrialParamsByFeature(*feature, &params);
-  if (!result)
+  if (!result) {
+    stats::RecordConfigParsingEvent(
+        stats::ConfigParsingEvent::FAILURE_NO_FIELD_TRIAL);
+    // Returns early. If no field trial, ConfigParsingEvent::FAILURE will not be
+    // recorded.
     return;
+  }
 
   for (const auto& it : params) {
     const std::string& key = it.first;
@@ -220,12 +226,16 @@
       EventConfig event_config;
       if (!ParseEventConfig(params[key], &event_config)) {
         ++parse_errors;
+        stats::RecordConfigParsingEvent(
+            stats::ConfigParsingEvent::FAILURE_USED_EVENT_PARSE);
         continue;
       }
       config.used = event_config;
     } else if (key == kEventConfigTriggerKey) {
       EventConfig event_config;
       if (!ParseEventConfig(params[key], &event_config)) {
+        stats::RecordConfigParsingEvent(
+            stats::ConfigParsingEvent::FAILURE_TRIGGER_EVENT_PARSE);
         ++parse_errors;
         continue;
       }
@@ -233,6 +243,8 @@
     } else if (key == kSessionRateKey) {
       Comparator comparator;
       if (!ParseComparator(params[key], &comparator)) {
+        stats::RecordConfigParsingEvent(
+            stats::ConfigParsingEvent::FAILURE_SESSION_RATE_PARSE);
         ++parse_errors;
         continue;
       }
@@ -240,6 +252,8 @@
     } else if (key == kAvailabilityKey) {
       Comparator comparator;
       if (!ParseComparator(params[key], &comparator)) {
+        stats::RecordConfigParsingEvent(
+            stats::ConfigParsingEvent::FAILURE_AVAILABILITY_PARSE);
         ++parse_errors;
         continue;
       }
@@ -248,6 +262,8 @@
                                 base::CompareCase::INSENSITIVE_ASCII)) {
       EventConfig event_config;
       if (!ParseEventConfig(params[key], &event_config)) {
+        stats::RecordConfigParsingEvent(
+            stats::ConfigParsingEvent::FAILURE_OTHER_EVENT_PARSE);
         ++parse_errors;
         continue;
       }
@@ -255,13 +271,33 @@
     } else {
       DVLOG(1) << "Ignoring unknown key when parsing config for feature "
                << feature->name << ": " << key;
+      stats::RecordConfigParsingEvent(
+          stats::ConfigParsingEvent::FAILURE_UNKNOWN_KEY);
     }
   }
 
   // The |used| and |trigger| members are required, so should not be the
   // default values.
-  config.valid = config.used != EventConfig() &&
-                 config.trigger != EventConfig() && parse_errors == 0;
+  bool has_used_event = config.used != EventConfig();
+  bool has_trigger_event = config.trigger != EventConfig();
+  config.valid = has_used_event && has_trigger_event && parse_errors == 0;
+
+  if (config.valid) {
+    stats::RecordConfigParsingEvent(stats::ConfigParsingEvent::SUCCESS);
+  } else {
+    stats::RecordConfigParsingEvent(stats::ConfigParsingEvent::FAILURE);
+  }
+
+  // Notice parse errors for used and trigger events will also cause the
+  // following histograms being recorded.
+  if (!has_used_event) {
+    stats::RecordConfigParsingEvent(
+        stats::ConfigParsingEvent::FAILURE_USED_EVENT_MISSING);
+  }
+  if (!has_trigger_event) {
+    stats::RecordConfigParsingEvent(
+        stats::ConfigParsingEvent::FAILURE_TRIGGER_EVENT_MISSING);
+  }
 }
 
 const FeatureConfig& ChromeVariationsConfiguration::GetFeatureConfig(
@@ -271,4 +307,9 @@
   return it->second;
 }
 
+const Configuration::ConfigMap&
+ChromeVariationsConfiguration::GetRegisteredFeatures() const {
+  return configs_;
+}
+
 }  // namespace feature_engagement_tracker
diff --git a/components/feature_engagement_tracker/internal/chrome_variations_configuration.h b/components/feature_engagement_tracker/internal/chrome_variations_configuration.h
index 15774ae7..526e728 100644
--- a/components/feature_engagement_tracker/internal/chrome_variations_configuration.h
+++ b/components/feature_engagement_tracker/internal/chrome_variations_configuration.h
@@ -26,6 +26,7 @@
   // Configuration implementation.
   const FeatureConfig& GetFeatureConfig(
       const base::Feature& feature) const override;
+  const Configuration::ConfigMap& GetRegisteredFeatures() const override;
 
   // Parses the variations configuration for all of the given |features| and
   // stores the result. It is only valid to call ParseFeatureConfig once.
diff --git a/components/feature_engagement_tracker/internal/chrome_variations_configuration_unittest.cc b/components/feature_engagement_tracker/internal/chrome_variations_configuration_unittest.cc
index 8676b6b..9b6e1ea 100644
--- a/components/feature_engagement_tracker/internal/chrome_variations_configuration_unittest.cc
+++ b/components/feature_engagement_tracker/internal/chrome_variations_configuration_unittest.cc
@@ -12,8 +12,10 @@
 #include "base/metrics/field_trial.h"
 #include "base/metrics/field_trial_param_associator.h"
 #include "base/metrics/field_trial_params.h"
+#include "base/test/histogram_tester.h"
 #include "base/test/scoped_feature_list.h"
 #include "components/feature_engagement_tracker/internal/configuration.h"
+#include "components/feature_engagement_tracker/internal/stats.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace feature_engagement_tracker {
@@ -31,6 +33,7 @@
 const char kBarTrialName[] = "BarTrial";
 const char kQuxTrialName[] = "QuxTrial";
 const char kGroupName[] = "Group1";
+const char kConfigParseEventName[] = "InProductHelp.Config.ParsingEvent";
 
 class ChromeVariationsConfigurationTest : public ::testing::Test {
  public:
@@ -112,11 +115,16 @@
 
   FeatureVector features;
   features.push_back(&kTestFeatureFoo);
+  base::HistogramTester histogram_tester;
 
   configuration_.ParseFeatureConfigs(features);
 
   FeatureConfig foo_config = configuration_.GetFeatureConfig(kTestFeatureFoo);
   EXPECT_FALSE(foo_config.valid);
+  histogram_tester.ExpectBucketCount(
+      kConfigParseEventName,
+      static_cast<int>(stats::ConfigParsingEvent::FAILURE_NO_FIELD_TRIAL), 1);
+  histogram_tester.ExpectTotalCount(kConfigParseEventName, 1);
 }
 
 TEST_F(ChromeVariationsConfigurationTest, ParseSingleFeature) {
@@ -133,11 +141,16 @@
       "name:user_opened_downloads_home;comparator:any;window:0;storage:360";
   SetFeatureParams(kTestFeatureFoo, foo_params);
 
+  base::HistogramTester histogram_tester;
   std::vector<const base::Feature*> features = {&kTestFeatureFoo};
   configuration_.ParseFeatureConfigs(features);
 
   FeatureConfig foo = configuration_.GetFeatureConfig(kTestFeatureFoo);
   EXPECT_TRUE(foo.valid);
+  histogram_tester.ExpectBucketCount(
+      kConfigParseEventName,
+      static_cast<int>(stats::ConfigParsingEvent::SUCCESS), 1);
+  histogram_tester.ExpectTotalCount(kConfigParseEventName, 1);
 
   FeatureConfig expected_foo;
   expected_foo.valid = true;
@@ -159,11 +172,20 @@
   foo_params["event_trigger"] = "name:et;comparator:any;window:0;storage:360";
   SetFeatureParams(kTestFeatureFoo, foo_params);
 
+  base::HistogramTester histogram_tester;
   std::vector<const base::Feature*> features = {&kTestFeatureFoo};
   configuration_.ParseFeatureConfigs(features);
 
   FeatureConfig foo = configuration_.GetFeatureConfig(kTestFeatureFoo);
   EXPECT_FALSE(foo.valid);
+  histogram_tester.ExpectBucketCount(
+      kConfigParseEventName,
+      static_cast<int>(stats::ConfigParsingEvent::FAILURE_USED_EVENT_MISSING),
+      1);
+  histogram_tester.ExpectBucketCount(
+      kConfigParseEventName,
+      static_cast<int>(stats::ConfigParsingEvent::FAILURE), 1);
+  histogram_tester.ExpectTotalCount(kConfigParseEventName, 2);
 }
 
 TEST_F(ChromeVariationsConfigurationTest, MissingTriggerIsInvalid) {
@@ -171,11 +193,21 @@
   foo_params["event_used"] = "name:eu;comparator:any;window:0;storage:360";
   SetFeatureParams(kTestFeatureFoo, foo_params);
 
+  base::HistogramTester histogram_tester;
   std::vector<const base::Feature*> features = {&kTestFeatureFoo};
   configuration_.ParseFeatureConfigs(features);
 
   FeatureConfig foo = configuration_.GetFeatureConfig(kTestFeatureFoo);
   EXPECT_FALSE(foo.valid);
+  histogram_tester.ExpectBucketCount(
+      kConfigParseEventName,
+      static_cast<int>(
+          stats::ConfigParsingEvent::FAILURE_TRIGGER_EVENT_MISSING),
+      1);
+  histogram_tester.ExpectBucketCount(
+      kConfigParseEventName,
+      static_cast<int>(stats::ConfigParsingEvent::FAILURE), 1);
+  histogram_tester.ExpectTotalCount(kConfigParseEventName, 2);
 }
 
 TEST_F(ChromeVariationsConfigurationTest, OnlyTriggerAndUsedIsValid) {
@@ -184,6 +216,7 @@
   foo_params["event_trigger"] = "name:et;comparator:any;window:0;storage:360";
   SetFeatureParams(kTestFeatureFoo, foo_params);
 
+  base::HistogramTester histogram_tester;
   std::vector<const base::Feature*> features = {&kTestFeatureFoo};
   configuration_.ParseFeatureConfigs(features);
 
@@ -195,6 +228,10 @@
   expected_foo.used = EventConfig("eu", Comparator(ANY, 0), 0, 360);
   expected_foo.trigger = EventConfig("et", Comparator(ANY, 0), 0, 360);
   EXPECT_EQ(expected_foo, foo);
+  histogram_tester.ExpectBucketCount(
+      kConfigParseEventName,
+      static_cast<int>(stats::ConfigParsingEvent::SUCCESS), 1);
+  histogram_tester.ExpectTotalCount(kConfigParseEventName, 1);
 }
 
 TEST_F(ChromeVariationsConfigurationTest, WhitespaceIsValid) {
@@ -336,11 +373,20 @@
   foo_params["session_rate"] = "bogus value";
   SetFeatureParams(kTestFeatureFoo, foo_params);
 
+  base::HistogramTester histogram_tester;
   std::vector<const base::Feature*> features = {&kTestFeatureFoo};
   configuration_.ParseFeatureConfigs(features);
 
   FeatureConfig foo = configuration_.GetFeatureConfig(kTestFeatureFoo);
   EXPECT_FALSE(foo.valid);
+  histogram_tester.ExpectBucketCount(
+      kConfigParseEventName,
+      static_cast<int>(stats::ConfigParsingEvent::FAILURE_SESSION_RATE_PARSE),
+      1);
+  histogram_tester.ExpectBucketCount(
+      kConfigParseEventName,
+      static_cast<int>(stats::ConfigParsingEvent::FAILURE), 1);
+  histogram_tester.ExpectTotalCount(kConfigParseEventName, 2);
 }
 
 TEST_F(ChromeVariationsConfigurationTest,
@@ -351,11 +397,20 @@
   foo_params["availability"] = "bogus value";
   SetFeatureParams(kTestFeatureFoo, foo_params);
 
+  base::HistogramTester histogram_tester;
   std::vector<const base::Feature*> features = {&kTestFeatureFoo};
   configuration_.ParseFeatureConfigs(features);
 
   FeatureConfig foo = configuration_.GetFeatureConfig(kTestFeatureFoo);
   EXPECT_FALSE(foo.valid);
+  histogram_tester.ExpectBucketCount(
+      kConfigParseEventName,
+      static_cast<int>(stats::ConfigParsingEvent::FAILURE_AVAILABILITY_PARSE),
+      1);
+  histogram_tester.ExpectBucketCount(
+      kConfigParseEventName,
+      static_cast<int>(stats::ConfigParsingEvent::FAILURE), 1);
+  histogram_tester.ExpectTotalCount(kConfigParseEventName, 2);
 }
 
 TEST_F(ChromeVariationsConfigurationTest, InvalidUsedCausesInvalidConfig) {
@@ -364,11 +419,23 @@
   foo_params["event_trigger"] = "name:et;comparator:any;window:0;storage:360";
   SetFeatureParams(kTestFeatureFoo, foo_params);
 
+  base::HistogramTester histogram_tester;
   std::vector<const base::Feature*> features = {&kTestFeatureFoo};
   configuration_.ParseFeatureConfigs(features);
 
   FeatureConfig foo = configuration_.GetFeatureConfig(kTestFeatureFoo);
   EXPECT_FALSE(foo.valid);
+  histogram_tester.ExpectBucketCount(
+      kConfigParseEventName,
+      static_cast<int>(stats::ConfigParsingEvent::FAILURE_USED_EVENT_PARSE), 1);
+  histogram_tester.ExpectBucketCount(
+      kConfigParseEventName,
+      static_cast<int>(stats::ConfigParsingEvent::FAILURE_USED_EVENT_MISSING),
+      1);
+  histogram_tester.ExpectBucketCount(
+      kConfigParseEventName,
+      static_cast<int>(stats::ConfigParsingEvent::FAILURE), 1);
+  histogram_tester.ExpectTotalCount(kConfigParseEventName, 3);
 }
 
 TEST_F(ChromeVariationsConfigurationTest, InvalidTriggerCausesInvalidConfig) {
@@ -377,11 +444,25 @@
   foo_params["event_trigger"] = "bogus value";
   SetFeatureParams(kTestFeatureFoo, foo_params);
 
+  base::HistogramTester histogram_tester;
   std::vector<const base::Feature*> features = {&kTestFeatureFoo};
   configuration_.ParseFeatureConfigs(features);
 
   FeatureConfig foo = configuration_.GetFeatureConfig(kTestFeatureFoo);
   EXPECT_FALSE(foo.valid);
+  histogram_tester.ExpectBucketCount(
+      kConfigParseEventName,
+      static_cast<int>(stats::ConfigParsingEvent::FAILURE_TRIGGER_EVENT_PARSE),
+      1);
+  histogram_tester.ExpectBucketCount(
+      kConfigParseEventName,
+      static_cast<int>(
+          stats::ConfigParsingEvent::FAILURE_TRIGGER_EVENT_MISSING),
+      1);
+  histogram_tester.ExpectBucketCount(
+      kConfigParseEventName,
+      static_cast<int>(stats::ConfigParsingEvent::FAILURE), 1);
+  histogram_tester.ExpectTotalCount(kConfigParseEventName, 3);
 }
 
 TEST_F(ChromeVariationsConfigurationTest,
diff --git a/components/feature_engagement_tracker/internal/condition_validator.cc b/components/feature_engagement_tracker/internal/condition_validator.cc
index da411662..90113483 100644
--- a/components/feature_engagement_tracker/internal/condition_validator.cc
+++ b/components/feature_engagement_tracker/internal/condition_validator.cc
@@ -7,7 +7,7 @@
 namespace feature_engagement_tracker {
 
 ConditionValidator::Result::Result(bool initial_values)
-    : model_ready_ok(initial_values),
+    : event_model_ready_ok(initial_values),
       currently_showing_ok(initial_values),
       feature_enabled_ok(initial_values),
       config_ok(initial_values),
@@ -19,7 +19,7 @@
       availability_ok(initial_values) {}
 
 ConditionValidator::Result::Result(const Result& other) {
-  model_ready_ok = other.model_ready_ok;
+  event_model_ready_ok = other.event_model_ready_ok;
   currently_showing_ok = other.currently_showing_ok;
   feature_enabled_ok = other.feature_enabled_ok;
   config_ok = other.config_ok;
@@ -31,8 +31,8 @@
   availability_ok = other.availability_ok;
 }
 
-bool ConditionValidator::Result::NoErrors() {
-  return model_ready_ok && currently_showing_ok && feature_enabled_ok &&
+bool ConditionValidator::Result::NoErrors() const {
+  return event_model_ready_ok && currently_showing_ok && feature_enabled_ok &&
          config_ok && used_ok && trigger_ok && preconditions_ok &&
          session_rate_ok && availability_model_ready_ok && availability_ok;
 }
diff --git a/components/feature_engagement_tracker/internal/condition_validator.h b/components/feature_engagement_tracker/internal/condition_validator.h
index 2f8f7a59..a4686e0 100644
--- a/components/feature_engagement_tracker/internal/condition_validator.h
+++ b/components/feature_engagement_tracker/internal/condition_validator.h
@@ -33,8 +33,8 @@
     explicit Result(bool initial_values);
     Result(const Result& other);
 
-    // Whether the Model was ready.
-    bool model_ready_ok;
+    // Whether the event model was ready.
+    bool event_model_ready_ok;
 
     // Whether no other in-product helps were shown at the time.
     bool currently_showing_ok;
@@ -65,7 +65,7 @@
 
     // Returns true if this result object has no errors, i.e. no values that
     // are false.
-    bool NoErrors();
+    bool NoErrors() const;
   };
 
   virtual ~ConditionValidator() = default;
diff --git a/components/feature_engagement_tracker/internal/condition_validator_unittest.cc b/components/feature_engagement_tracker/internal/condition_validator_unittest.cc
index 24c7cfa..a6f8cb5 100644
--- a/components/feature_engagement_tracker/internal/condition_validator_unittest.cc
+++ b/components/feature_engagement_tracker/internal/condition_validator_unittest.cc
@@ -18,7 +18,7 @@
 
 TEST(ConditionValidatorResultTest, TestModelNotReady) {
   ConditionValidator::Result result(true);
-  result.model_ready_ok = false;
+  result.event_model_ready_ok = false;
   EXPECT_FALSE(result.NoErrors());
 }
 
diff --git a/components/feature_engagement_tracker/internal/configuration.h b/components/feature_engagement_tracker/internal/configuration.h
index d973cc1..c942e5b 100644
--- a/components/feature_engagement_tracker/internal/configuration.h
+++ b/components/feature_engagement_tracker/internal/configuration.h
@@ -124,6 +124,9 @@
   virtual const FeatureConfig& GetFeatureConfig(
       const base::Feature& feature) const = 0;
 
+  // Returns the immutable ConfigMap that contains all registered features.
+  virtual const ConfigMap& GetRegisteredFeatures() const = 0;
+
  protected:
   Configuration() = default;
 
diff --git a/components/feature_engagement_tracker/internal/editable_configuration.cc b/components/feature_engagement_tracker/internal/editable_configuration.cc
index f7a4cba5..9559f1ea 100644
--- a/components/feature_engagement_tracker/internal/editable_configuration.cc
+++ b/components/feature_engagement_tracker/internal/editable_configuration.cc
@@ -28,4 +28,9 @@
   return it->second;
 }
 
+const Configuration::ConfigMap& EditableConfiguration::GetRegisteredFeatures()
+    const {
+  return configs_;
+}
+
 }  // namespace feature_engagement_tracker
diff --git a/components/feature_engagement_tracker/internal/editable_configuration.h b/components/feature_engagement_tracker/internal/editable_configuration.h
index 2e01b721..7d26122 100644
--- a/components/feature_engagement_tracker/internal/editable_configuration.h
+++ b/components/feature_engagement_tracker/internal/editable_configuration.h
@@ -22,9 +22,10 @@
   EditableConfiguration();
   ~EditableConfiguration() override;
 
-  // Configuration implementaiton.
+  // Configuration implementation.
   const FeatureConfig& GetFeatureConfig(
       const base::Feature& feature) const override;
+  const Configuration::ConfigMap& GetRegisteredFeatures() const override;
 
   // Adds a new FeatureConfig to the current configurations. If it already
   // exists, the contents are replaced.
diff --git a/components/feature_engagement_tracker/internal/feature_config_condition_validator.cc b/components/feature_engagement_tracker/internal/feature_config_condition_validator.cc
index fa8ce2a..ff6e1ad5 100644
--- a/components/feature_engagement_tracker/internal/feature_config_condition_validator.cc
+++ b/components/feature_engagement_tracker/internal/feature_config_condition_validator.cc
@@ -25,7 +25,7 @@
     const AvailabilityModel& availability_model,
     uint32_t current_day) const {
   ConditionValidator::Result result(true);
-  result.model_ready_ok = model.IsReady();
+  result.event_model_ready_ok = model.IsReady();
   result.currently_showing_ok = !currently_showing_;
   result.feature_enabled_ok = base::FeatureList::IsEnabled(feature);
   result.config_ok = config.valid;
diff --git a/components/feature_engagement_tracker/internal/feature_config_condition_validator_unittest.cc b/components/feature_engagement_tracker/internal/feature_config_condition_validator_unittest.cc
index b7d3087..3853f39f 100644
--- a/components/feature_engagement_tracker/internal/feature_config_condition_validator_unittest.cc
+++ b/components/feature_engagement_tracker/internal/feature_config_condition_validator_unittest.cc
@@ -150,7 +150,7 @@
   ConditionValidator::Result result =
       GetResultForDayZero(GetValidFeatureConfig());
   EXPECT_FALSE(result.NoErrors());
-  EXPECT_FALSE(result.model_ready_ok);
+  EXPECT_FALSE(result.event_model_ready_ok);
 }
 
 TEST_F(FeatureConfigConditionValidatorTest, ConfigInvalidShouldFail) {
@@ -170,7 +170,7 @@
 
   ConditionValidator::Result result = GetResultForDayZero(FeatureConfig());
   EXPECT_FALSE(result.NoErrors());
-  EXPECT_FALSE(result.model_ready_ok);
+  EXPECT_FALSE(result.event_model_ready_ok);
   EXPECT_FALSE(result.config_ok);
 }
 
diff --git a/components/feature_engagement_tracker/internal/feature_engagement_tracker_impl.cc b/components/feature_engagement_tracker/internal/feature_engagement_tracker_impl.cc
index 5ab8770..3403c93 100644
--- a/components/feature_engagement_tracker/internal/feature_engagement_tracker_impl.cc
+++ b/components/feature_engagement_tracker/internal/feature_engagement_tracker_impl.cc
@@ -10,6 +10,7 @@
 #include "base/bind.h"
 #include "base/feature_list.h"
 #include "base/memory/ptr_util.h"
+#include "base/metrics/user_metrics.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "components/feature_engagement_tracker/internal/availability_model_impl.h"
 #include "components/feature_engagement_tracker/internal/chrome_variations_configuration.h"
@@ -24,6 +25,7 @@
 #include "components/feature_engagement_tracker/internal/once_condition_validator.h"
 #include "components/feature_engagement_tracker/internal/persistent_store.h"
 #include "components/feature_engagement_tracker/internal/proto/availability.pb.h"
+#include "components/feature_engagement_tracker/internal/stats.h"
 #include "components/feature_engagement_tracker/internal/system_time_provider.h"
 #include "components/feature_engagement_tracker/public/feature_constants.h"
 #include "components/feature_engagement_tracker/public/feature_list.h"
@@ -81,12 +83,17 @@
   base::FilePath event_storage_dir = storage_dir.Append(kEventDBStorageDir);
   auto store =
       base::MakeUnique<PersistentStore>(event_storage_dir, std::move(db));
+
+  auto configuration = base::MakeUnique<ChromeVariationsConfiguration>();
+  configuration->ParseFeatureConfigs(GetAllFeatures());
+
   auto storage_validator = base::MakeUnique<FeatureConfigStorageValidator>();
+  storage_validator->InitializeFeatures(GetAllFeatures(), *configuration);
+
   auto raw_model = base::MakeUnique<ModelImpl>(std::move(store),
                                                std::move(storage_validator));
 
   auto model = base::MakeUnique<InitAwareModel>(std::move(raw_model));
-  auto configuration = base::MakeUnique<ChromeVariationsConfiguration>();
   auto condition_validator =
       base::MakeUnique<FeatureConfigConditionValidator>();
   auto time_provider = base::MakeUnique<SystemTimeProvider>();
@@ -103,10 +110,6 @@
   auto availability_model = base::MakeUnique<AvailabilityModelImpl>(
       std::move(availability_store_loader));
 
-  // Initialize the configuration.
-  configuration->ParseFeatureConfigs(GetAllFeatures());
-  storage_validator->InitializeFeatures(GetAllFeatures(), *configuration);
-
   return new FeatureEngagementTrackerImpl(
       std::move(model), std::move(availability_model), std::move(configuration),
       std::move(condition_validator), std::move(time_provider));
@@ -142,20 +145,16 @@
 FeatureEngagementTrackerImpl::~FeatureEngagementTrackerImpl() = default;
 
 void FeatureEngagementTrackerImpl::NotifyEvent(const std::string& event) {
-  // TODO(nyquist): Track this event in UMA.
   model_->IncrementEvent(event, time_provider_->GetCurrentDay());
+  stats::RecordNotifyEvent(event, configuration_.get(), model_->IsReady());
 }
 
 bool FeatureEngagementTrackerImpl::ShouldTriggerHelpUI(
     const base::Feature& feature) {
-  // TODO(nyquist): Track this event in UMA.
-  bool result =
-      condition_validator_
-          ->MeetsConditions(feature, configuration_->GetFeatureConfig(feature),
-                            *model_, *availability_model_,
-                            time_provider_->GetCurrentDay())
-          .NoErrors();
-  if (result) {
+  ConditionValidator::Result result = condition_validator_->MeetsConditions(
+      feature, configuration_->GetFeatureConfig(feature), *model_,
+      *availability_model_, time_provider_->GetCurrentDay());
+  if (result.NoErrors()) {
     condition_validator_->NotifyIsShowing(feature);
     FeatureConfig feature_config = configuration_->GetFeatureConfig(feature);
     DCHECK_NE("", feature_config.trigger.name);
@@ -163,12 +162,13 @@
                            time_provider_->GetCurrentDay());
   }
 
-  return result;
+  stats::RecordShouldTriggerHelpUI(feature, result);
+  return result.NoErrors();
 }
 
 void FeatureEngagementTrackerImpl::Dismissed(const base::Feature& feature) {
-  // TODO(nyquist): Track this event in UMA.
   condition_validator_->NotifyDismissed(feature);
+  stats::RecordUserDismiss();
 }
 
 bool FeatureEngagementTrackerImpl::IsInitialized() {
diff --git a/components/feature_engagement_tracker/internal/feature_engagement_tracker_impl_unittest.cc b/components/feature_engagement_tracker/internal/feature_engagement_tracker_impl_unittest.cc
index 605cf98..0a01cb4 100644
--- a/components/feature_engagement_tracker/internal/feature_engagement_tracker_impl_unittest.cc
+++ b/components/feature_engagement_tracker/internal/feature_engagement_tracker_impl_unittest.cc
@@ -13,6 +13,7 @@
 #include "base/run_loop.h"
 #include "base/sequenced_task_runner.h"
 #include "base/single_thread_task_runner.h"
+#include "base/test/user_action_tester.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "components/feature_engagement_tracker/internal/availability_model_impl.h"
 #include "components/feature_engagement_tracker/internal/editable_configuration.h"
@@ -21,6 +22,7 @@
 #include "components/feature_engagement_tracker/internal/never_availability_model.h"
 #include "components/feature_engagement_tracker/internal/never_storage_validator.h"
 #include "components/feature_engagement_tracker/internal/once_condition_validator.h"
+#include "components/feature_engagement_tracker/internal/stats.h"
 #include "components/feature_engagement_tracker/internal/time_provider.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -439,10 +441,24 @@
   tracker_->AddOnInitializedCallback(base::Bind(
       &StoringInitializedCallback::OnInitialized, base::Unretained(&callback)));
   base::RunLoop().RunUntilIdle();
+  base::UserActionTester user_action_tester;
 
   tracker_->NotifyEvent("foo");
   tracker_->NotifyEvent("foo");
   tracker_->NotifyEvent("bar");
+  tracker_->NotifyEvent(kTestFeatureFoo.name + std::string("_used"));
+  tracker_->NotifyEvent(kTestFeatureFoo.name + std::string("_trigger"));
+
+  // Used event will record both NotifyEvent and NotifyUsedEvent. Explicitly
+  // specify the whole user action string here.
+  EXPECT_EQ(1, user_action_tester.GetActionCount(
+                   "InProductHelp.NotifyUsedEvent.test_foo"));
+  EXPECT_EQ(2, user_action_tester.GetActionCount(
+                   "InProductHelp.NotifyEvent.test_foo"));
+  EXPECT_EQ(0, user_action_tester.GetActionCount(
+                   "InProductHelp.NotifyUsedEvent.test_bar"));
+  EXPECT_EQ(0, user_action_tester.GetActionCount(
+                   "InProductHelp.NotifyEvent.test_bar"));
 
   Event foo_event = store_->GetEvent("foo");
   ASSERT_EQ(1, foo_event.events_size());
diff --git a/components/feature_engagement_tracker/internal/model_impl.cc b/components/feature_engagement_tracker/internal/model_impl.cc
index beced53..d1032f5 100644
--- a/components/feature_engagement_tracker/internal/model_impl.cc
+++ b/components/feature_engagement_tracker/internal/model_impl.cc
@@ -50,7 +50,6 @@
 
 void ModelImpl::IncrementEvent(const std::string& event_name,
                                uint32_t current_day) {
-  // TODO(nyquist): Track this event in UMA.
   DCHECK(ready_);
 
   if (!storage_validator_->ShouldStore(event_name))
diff --git a/components/feature_engagement_tracker/internal/once_condition_validator.cc b/components/feature_engagement_tracker/internal/once_condition_validator.cc
index 680cdf4b..4451e2c 100644
--- a/components/feature_engagement_tracker/internal/once_condition_validator.cc
+++ b/components/feature_engagement_tracker/internal/once_condition_validator.cc
@@ -21,7 +21,7 @@
     const AvailabilityModel& availability_model,
     uint32_t current_day) const {
   ConditionValidator::Result result(true);
-  result.model_ready_ok = model.IsReady();
+  result.event_model_ready_ok = model.IsReady();
 
   result.currently_showing_ok = currently_showing_feature_ == nullptr;
 
diff --git a/components/feature_engagement_tracker/internal/once_condition_validator_unittest.cc b/components/feature_engagement_tracker/internal/once_condition_validator_unittest.cc
index bf04d05..a60f6a6 100644
--- a/components/feature_engagement_tracker/internal/once_condition_validator_unittest.cc
+++ b/components/feature_engagement_tracker/internal/once_condition_validator_unittest.cc
@@ -112,7 +112,7 @@
   ConditionValidator::Result result = validator_.MeetsConditions(
       kTestFeatureFoo, kValidFeatureConfig, model_, availability_model_, 0u);
   EXPECT_FALSE(result.NoErrors());
-  EXPECT_FALSE(result.model_ready_ok);
+  EXPECT_FALSE(result.event_model_ready_ok);
 
   model_.SetIsReady(true);
   EXPECT_TRUE(validator_
diff --git a/components/feature_engagement_tracker/internal/persistent_store.cc b/components/feature_engagement_tracker/internal/persistent_store.cc
index 58ae423..9be61087 100644
--- a/components/feature_engagement_tracker/internal/persistent_store.cc
+++ b/components/feature_engagement_tracker/internal/persistent_store.cc
@@ -8,6 +8,7 @@
 
 #include "base/bind.h"
 #include "base/memory/ptr_util.h"
+#include "components/feature_engagement_tracker/internal/stats.h"
 
 namespace feature_engagement_tracker {
 namespace {
@@ -18,7 +19,10 @@
 using KeyEventPair = std::pair<std::string, Event>;
 using KeyEventList = std::vector<KeyEventPair>;
 
-void NoopUpdateCallback(bool success) {}
+void NoopUpdateCallback(bool success) {
+  stats::RecordDbUpdate(success, stats::StoreType::EVENTS_STORE);
+}
+
 }  // namespace
 
 PersistentStore::PersistentStore(
@@ -48,7 +52,6 @@
   std::unique_ptr<KeyEventList> entries = base::MakeUnique<KeyEventList>();
   entries->push_back(KeyEventPair(event.name(), event));
 
-  // TODO(dtrainor, nyquist): Consider tracking failures here and storing UMA.
   db_->UpdateEntries(std::move(entries),
                      base::MakeUnique<std::vector<std::string>>(),
                      base::Bind(&NoopUpdateCallback));
@@ -59,13 +62,14 @@
   auto deletes = base::MakeUnique<std::vector<std::string>>();
   deletes->push_back(event_name);
 
-  // TODO(dtrainor, nyquist): Consider tracking failures here and storing UMA.
   db_->UpdateEntries(base::MakeUnique<KeyEventList>(), std::move(deletes),
                      base::Bind(&NoopUpdateCallback));
 }
 
 void PersistentStore::OnInitComplete(const OnLoadedCallback& callback,
                                      bool success) {
+  stats::RecordDbInitEvent(success, stats::StoreType::EVENTS_STORE);
+
   if (!success) {
     callback.Run(false, base::MakeUnique<std::vector<Event>>());
     return;
@@ -79,6 +83,7 @@
     const OnLoadedCallback& callback,
     bool success,
     std::unique_ptr<std::vector<Event>> entries) {
+  stats::RecordEventDbLoadEvent(success, *entries.get());
   ready_ = success;
   callback.Run(success, std::move(entries));
 }
diff --git a/components/feature_engagement_tracker/internal/persistent_store_unittest.cc b/components/feature_engagement_tracker/internal/persistent_store_unittest.cc
index 92859504..290d2b5 100644
--- a/components/feature_engagement_tracker/internal/persistent_store_unittest.cc
+++ b/components/feature_engagement_tracker/internal/persistent_store_unittest.cc
@@ -9,7 +9,9 @@
 #include "base/files/file_path.h"
 #include "base/memory/ptr_util.h"
 #include "base/optional.h"
+#include "base/test/histogram_tester.h"
 #include "components/feature_engagement_tracker/internal/proto/event.pb.h"
+#include "components/feature_engagement_tracker/internal/stats.h"
 #include "components/feature_engagement_tracker/internal/test/event_util.h"
 #include "components/leveldb_proto/proto_database.h"
 #include "components/leveldb_proto/testing/fake_db.h"
@@ -84,8 +86,9 @@
 TEST_F(PersistentStoreTest, SuccessfulInitAndLoadEmptyStore) {
   SetUpDB();
 
-  store_->Load(load_callback_);
+  base::HistogramTester histogram_tester;
 
+  store_->Load(load_callback_);
   // The initialize should not trigger a response to the callback.
   db_->InitCallback(true);
   EXPECT_FALSE(load_successful_.has_value());
@@ -97,6 +100,13 @@
   // Validate that we have no entries.
   EXPECT_NE(nullptr, load_results_);
   EXPECT_TRUE(load_results_->empty());
+
+  // Verify histograms.
+  std::string suffix =
+      stats::ToDbHistogramSuffix(stats::StoreType::EVENTS_STORE);
+  histogram_tester.ExpectBucketCount("InProductHelp.Db.Init." + suffix, 1, 1);
+  histogram_tester.ExpectBucketCount("InProductHelp.Db.Load." + suffix, 1, 1);
+  histogram_tester.ExpectBucketCount("InProductHelp.Db.TotalEvents", 0, 1);
 }
 
 TEST_F(PersistentStoreTest, SuccessfulInitAndLoadWithEvents) {
@@ -115,6 +125,8 @@
 
   SetUpDB();
 
+  base::HistogramTester histogram_tester;
+
   // The initialize should not trigger a response to the callback.
   store_->Load(load_callback_);
   db_->InitCallback(true);
@@ -127,9 +139,17 @@
 
   // Validate that we have the two events that we expect.
   VerifyEventsInListAndMap(db_events_, *load_results_);
+
+  // Verify histograms.
+  std::string suffix =
+      stats::ToDbHistogramSuffix(stats::StoreType::EVENTS_STORE);
+  histogram_tester.ExpectBucketCount("InProductHelp.Db.Init." + suffix, 1, 1);
+  histogram_tester.ExpectBucketCount("InProductHelp.Db.Load." + suffix, 1, 1);
+  histogram_tester.ExpectBucketCount("InProductHelp.Db.TotalEvents", 3, 1);
 }
 
 TEST_F(PersistentStoreTest, SuccessfulInitBadLoad) {
+  base::HistogramTester histogram_tester;
   SetUpDB();
 
   store_->Load(load_callback_);
@@ -142,9 +162,17 @@
   db_->LoadCallback(false);
   EXPECT_FALSE(load_successful_.value());
   EXPECT_FALSE(store_->IsReady());
+
+  // Histograms.
+  std::string suffix =
+      stats::ToDbHistogramSuffix(stats::StoreType::EVENTS_STORE);
+  histogram_tester.ExpectBucketCount("InProductHelp.Db.Init." + suffix, 1, 1);
+  histogram_tester.ExpectBucketCount("InProductHelp.Db.Load." + suffix, 0, 1);
+  histogram_tester.ExpectTotalCount("InProductHelp.Db.TotalEvents", 0);
 }
 
 TEST_F(PersistentStoreTest, BadInit) {
+  base::HistogramTester histogram_tester;
   SetUpDB();
 
   store_->Load(load_callback_);
@@ -153,6 +181,13 @@
   db_->InitCallback(false);
   EXPECT_FALSE(load_successful_.value());
   EXPECT_FALSE(store_->IsReady());
+
+  // Histograms.
+  std::string suffix =
+      stats::ToDbHistogramSuffix(stats::StoreType::EVENTS_STORE);
+  histogram_tester.ExpectBucketCount("InProductHelp.Db.Init." + suffix, 0, 1);
+  histogram_tester.ExpectTotalCount("InProductHelp.Db.Load." + suffix, 0);
+  histogram_tester.ExpectTotalCount("InProductHelp.Db.TotalEvents", 0);
 }
 
 TEST_F(PersistentStoreTest, IsReady) {
diff --git a/components/feature_engagement_tracker/internal/single_invalid_configuration.cc b/components/feature_engagement_tracker/internal/single_invalid_configuration.cc
index ad8d956..5b82515d 100644
--- a/components/feature_engagement_tracker/internal/single_invalid_configuration.cc
+++ b/components/feature_engagement_tracker/internal/single_invalid_configuration.cc
@@ -20,4 +20,9 @@
   return invalid_feature_config_;
 }
 
+const Configuration::ConfigMap&
+SingleInvalidConfiguration::GetRegisteredFeatures() const {
+  return configs_;
+}
+
 }  // namespace feature_engagement_tracker
diff --git a/components/feature_engagement_tracker/internal/single_invalid_configuration.h b/components/feature_engagement_tracker/internal/single_invalid_configuration.h
index 449cee9..dd0ea1ff 100644
--- a/components/feature_engagement_tracker/internal/single_invalid_configuration.h
+++ b/components/feature_engagement_tracker/internal/single_invalid_configuration.h
@@ -17,7 +17,7 @@
 namespace feature_engagement_tracker {
 
 // An Configuration that always returns the same single invalid configuration,
-// regardless of which feature.
+// regardless of which feature. Also holds an empty ConfigMap.
 class SingleInvalidConfiguration : public Configuration {
  public:
   SingleInvalidConfiguration();
@@ -26,11 +26,15 @@
   // Configuration implementation.
   const FeatureConfig& GetFeatureConfig(
       const base::Feature& feature) const override;
+  const Configuration::ConfigMap& GetRegisteredFeatures() const override;
 
  private:
   // The invalid configuration to always return.
   FeatureConfig invalid_feature_config_;
 
+  // An empty map.
+  ConfigMap configs_;
+
   DISALLOW_COPY_AND_ASSIGN(SingleInvalidConfiguration);
 };
 
diff --git a/components/feature_engagement_tracker/internal/stats.cc b/components/feature_engagement_tracker/internal/stats.cc
new file mode 100644
index 0000000..a3e3e2ce
--- /dev/null
+++ b/components/feature_engagement_tracker/internal/stats.cc
@@ -0,0 +1,192 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/feature_engagement_tracker/internal/stats.h"
+
+#include <string>
+
+#include "base/metrics/histogram_functions.h"
+#include "base/metrics/histogram_macros.h"
+#include "base/metrics/user_metrics.h"
+#include "components/feature_engagement_tracker/public/feature_list.h"
+
+namespace feature_engagement_tracker {
+namespace stats {
+namespace {
+
+// Histogram suffixes for database metrics, must match the ones in
+// histograms.xml.
+const char kEventStoreSuffix[] = "EventStore";
+const char kAvailabilityStoreSuffix[] = "AvailabilityStore";
+
+// Helper function to log a TriggerHelpUIResult.
+void LogTriggerHelpUIResult(const std::string& name,
+                            TriggerHelpUIResult result) {
+  // Must not use histograms macros here because we pass in the histogram name.
+  base::UmaHistogramEnumeration(name, result, TriggerHelpUIResult::COUNT);
+}
+
+}  // namespace
+
+std::string ToDbHistogramSuffix(StoreType type) {
+  switch (type) {
+    case StoreType::EVENTS_STORE:
+      return std::string(kEventStoreSuffix);
+    case StoreType::AVAILABILITY_STORE:
+      return std::string(kAvailabilityStoreSuffix);
+    default:
+      NOTREACHED();
+      return std::string();
+  }
+}
+
+void RecordNotifyEvent(const std::string& event_name,
+                       const Configuration* config,
+                       bool is_model_ready) {
+  DCHECK(!event_name.empty());
+  DCHECK(config);
+
+  // Find which feature this event belongs to.
+  const Configuration::ConfigMap& features = config->GetRegisteredFeatures();
+  std::string feature_name;
+  for (const auto& element : features) {
+    const base::Feature* feature = element.first;
+    const FeatureConfig& feature_config = element.second;
+
+    // Track used event separately.
+    if (feature_config.used.name == event_name) {
+      feature_name = feature->name;
+      DCHECK(!feature_name.empty());
+      std::string used_event_action = "InProductHelp.NotifyUsedEvent.";
+      used_event_action.append(feature_name);
+      base::RecordComputedAction(used_event_action);
+      break;
+    }
+
+    // Find if the |event_name| matches any configuration.
+    for (const auto& event : feature_config.event_configs) {
+      if (event.name == event_name) {
+        feature_name = feature->name;
+        break;
+      }
+    }
+    if (feature_config.trigger.name == event_name) {
+      feature_name = feature->name;
+      break;
+    }
+  }
+
+  // Do nothing if no events in the configuration matches the |event_name|.
+  if (feature_name.empty())
+    return;
+
+  std::string event_action = "InProductHelp.NotifyEvent.";
+  event_action.append(feature_name);
+  base::RecordComputedAction(event_action);
+
+  std::string event_histogram = "InProductHelp.NotifyEventReadyState.";
+  event_histogram.append(feature_name);
+  base::UmaHistogramBoolean(event_histogram, is_model_ready);
+}
+
+void RecordShouldTriggerHelpUI(const base::Feature& feature,
+                               const ConditionValidator::Result& result) {
+  // Records the user action.
+  std::string name = "InProductHelp.ShouldTriggerHelpUI.";
+  name.append(feature.name);
+  base::RecordComputedAction(name);
+
+  // Total count histogram, used to compute the percentage of each failure type.
+  if (result.NoErrors()) {
+    LogTriggerHelpUIResult(name, TriggerHelpUIResult::SUCCESS);
+  } else {
+    LogTriggerHelpUIResult(name, TriggerHelpUIResult::FAILURE);
+  }
+
+  // Histogram about the failure reasons.
+  if (!result.event_model_ready_ok)
+    LogTriggerHelpUIResult(name, TriggerHelpUIResult::FAILURE_MODEL_NOT_READY);
+  if (!result.currently_showing_ok) {
+    LogTriggerHelpUIResult(name,
+                           TriggerHelpUIResult::FAILURE_CURRENTLY_SHOWING);
+  }
+  if (!result.feature_enabled_ok) {
+    LogTriggerHelpUIResult(name, TriggerHelpUIResult::FAILURE_FEATURE_DISABLED);
+  }
+  if (!result.config_ok) {
+    LogTriggerHelpUIResult(name, TriggerHelpUIResult::FAILURE_CONFIG_INVALID);
+  }
+  if (!result.used_ok) {
+    LogTriggerHelpUIResult(
+        name, TriggerHelpUIResult::FAILURE_USED_PRECONDITION_UNMET);
+  }
+  if (!result.trigger_ok) {
+    LogTriggerHelpUIResult(
+        name, TriggerHelpUIResult::FAILURE_TRIGGER_PRECONDITION_UNMET);
+  }
+  if (!result.preconditions_ok) {
+    LogTriggerHelpUIResult(
+        name, TriggerHelpUIResult::FAILURE_OTHER_PRECONDITION_UNMET);
+  }
+  if (!result.session_rate_ok) {
+    LogTriggerHelpUIResult(name, TriggerHelpUIResult::FAILURE_SESSION_RATE);
+  }
+  if (!result.availability_model_ready_ok) {
+    LogTriggerHelpUIResult(
+        name, TriggerHelpUIResult::FAILURE_AVAILABILITY_MODEL_NOT_READY);
+  }
+  if (!result.availability_ok) {
+    LogTriggerHelpUIResult(
+        name, TriggerHelpUIResult::FAILURE_AVAILABILITY_PRECONDITION_UNMET);
+  }
+}
+
+void RecordUserDismiss() {
+  base::RecordAction(base::UserMetricsAction("InProductHelp.Dismissed"));
+}
+
+void RecordDbUpdate(bool success, StoreType type) {
+  std::string histogram_name =
+      "InProductHelp.Db.Update." + ToDbHistogramSuffix(type);
+  base::UmaHistogramBoolean(histogram_name, success);
+}
+
+void RecordDbInitEvent(bool success, StoreType type) {
+  std::string histogram_name =
+      "InProductHelp.Db.Init." + ToDbHistogramSuffix(type);
+  base::UmaHistogramBoolean(histogram_name, success);
+}
+
+void RecordEventDbLoadEvent(bool success, const std::vector<Event>& events) {
+  std::string histogram_name =
+      "InProductHelp.Db.Load." + ToDbHistogramSuffix(StoreType::EVENTS_STORE);
+  base::UmaHistogramBoolean(histogram_name, success);
+  UMA_HISTOGRAM_BOOLEAN("InProductHelp.Db.Load", success);
+
+  if (!success)
+    return;
+
+  // Tracks total number of events records when the database is successfully
+  // loaded.
+  int event_count = 0;
+  for (const auto& event : events)
+    event_count += event.events_size();
+  UMA_HISTOGRAM_COUNTS_1000("InProductHelp.Db.TotalEvents", event_count);
+}
+
+void RecordAvailabilityDbLoadEvent(bool success) {
+  std::string histogram_name =
+      "InProductHelp.Db.Load." +
+      ToDbHistogramSuffix(StoreType::AVAILABILITY_STORE);
+  base::UmaHistogramBoolean(histogram_name, success);
+  UMA_HISTOGRAM_BOOLEAN("InProductHelp.Db.Load", success);
+}
+
+void RecordConfigParsingEvent(ConfigParsingEvent event) {
+  UMA_HISTOGRAM_ENUMERATION("InProductHelp.Config.ParsingEvent", event,
+                            ConfigParsingEvent::COUNT);
+}
+
+}  // namespace stats
+}  // namespace feature_engagement_tracker
diff --git a/components/feature_engagement_tracker/internal/stats.h b/components/feature_engagement_tracker/internal/stats.h
new file mode 100644
index 0000000..7171a320
--- /dev/null
+++ b/components/feature_engagement_tracker/internal/stats.h
@@ -0,0 +1,150 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_FEATURE_ENGAGEMENT_TRACKER_INTERNAL_STATS_H_
+#define COMPONENTS_FEATURE_ENGAGEMENT_TRACKER_INTERNAL_STATS_H_
+
+#include <string>
+#include <vector>
+
+#include "components/feature_engagement_tracker/internal/condition_validator.h"
+#include "components/feature_engagement_tracker/internal/configuration.h"
+#include "components/feature_engagement_tracker/internal/proto/event.pb.h"
+
+namespace feature_engagement_tracker {
+namespace stats {
+
+// Enum used in the metrics to record the result when in-product help UI is
+// going to be triggered.
+// Most of the fields maps to |ConditionValidator::Result|.
+// The failure reasons are not mutually exclusive.
+// Out-dated entries shouldn't be deleted but marked as obselete.
+enum class TriggerHelpUIResult {
+  // The help UI is triggered.
+  SUCCESS = 0,
+
+  // The help UI is not triggered.
+  FAILURE = 1,
+
+  // Data layer is not ready.
+  FAILURE_MODEL_NOT_READY = 2,
+
+  // Some other help UI is currently showing.
+  FAILURE_CURRENTLY_SHOWING = 3,
+
+  // The feature is disabled.
+  FAILURE_FEATURE_DISABLED = 4,
+
+  // Configuration can not be parsed.
+  FAILURE_CONFIG_INVALID = 5,
+
+  // Used event precondition is not satisfied.
+  FAILURE_USED_PRECONDITION_UNMET = 6,
+
+  // Trigger event precondition is not satisfied.
+  FAILURE_TRIGGER_PRECONDITION_UNMET = 7,
+
+  // Other event precondition is not satisfied.
+  FAILURE_OTHER_PRECONDITION_UNMET = 8,
+
+  // Session rate does not meet the requirement.
+  FAILURE_SESSION_RATE = 9,
+
+  // Availability mode is not ready.
+  FAILURE_AVAILABILITY_MODEL_NOT_READY = 10,
+
+  // Availability precondition is not satisfied.
+  FAILURE_AVAILABILITY_PRECONDITION_UNMET = 11,
+
+  // Last entry for the enum.
+  COUNT = 12,
+};
+
+// Used in the metrics to track the configuration parsing event.
+// The failure reasons are not mutually exclusive.
+// Out-dated entries shouldn't be deleted but marked as obsolete.
+enum class ConfigParsingEvent {
+  // The configuration is parsed correctly.
+  SUCCESS = 0,
+
+  // The configuration is invalid after parsing.
+  FAILURE = 1,
+
+  // Fails to parse the feature config because no field trial is found.
+  FAILURE_NO_FIELD_TRIAL = 2,
+
+  // Fails to parse the used event.
+  FAILURE_USED_EVENT_PARSE = 3,
+
+  // Used event is missing.
+  FAILURE_USED_EVENT_MISSING = 4,
+
+  // Fails to parse the trigger event.
+  FAILURE_TRIGGER_EVENT_PARSE = 5,
+
+  // Trigger event is missing.
+  FAILURE_TRIGGER_EVENT_MISSING = 6,
+
+  // Fails to parse other events.
+  FAILURE_OTHER_EVENT_PARSE = 7,
+
+  // Fails to parse the session rate comparator.
+  FAILURE_SESSION_RATE_PARSE = 8,
+
+  // Fails to parse the availability comparator.
+  FAILURE_AVAILABILITY_PARSE = 9,
+
+  // UnKnown key in configuration parameters.
+  FAILURE_UNKNOWN_KEY = 10,
+
+  // Last entry for the enum.
+  COUNT = 11,
+};
+
+// Used in metrics to track database states. Each type will match to a suffix
+// in the histograms to identify the database.
+enum class StoreType {
+  // Events store.
+  EVENTS_STORE = 0,
+
+  // Availability store.
+  AVAILABILITY_STORE = 1,
+};
+
+// Helper function that converts a store type to histogram suffix string.
+std::string ToDbHistogramSuffix(StoreType type);
+
+// Records the feature engagement events. Used event will be tracked
+// separately.
+void RecordNotifyEvent(const std::string& event,
+                       const Configuration* config,
+                       bool is_model_ready);
+
+// Records user action and the result histogram when in-product help will be
+// shown to the user.
+void RecordShouldTriggerHelpUI(const base::Feature& feature,
+                               const ConditionValidator::Result& result);
+
+// Records when the user dismisses the in-product help UI.
+void RecordUserDismiss();
+
+// Records the result of database updates.
+void RecordDbUpdate(bool success, StoreType type);
+
+// Record database init.
+void RecordDbInitEvent(bool success, StoreType type);
+
+// Records events database load event.
+void RecordEventDbLoadEvent(bool success, const std::vector<Event>& events);
+
+// Records availability database load event.
+void RecordAvailabilityDbLoadEvent(bool success);
+
+// Records configuration parsing event.
+void RecordConfigParsingEvent(ConfigParsingEvent event);
+
+}  // namespace stats
+}  // namespace feature_engagement_tracker
+
+#endif  // COMPONENTS_FEATURE_ENGAGEMENT_TRACKER_INTERNAL_STATS_H_
diff --git a/components/filesystem/public/cpp/prefs/BUILD.gn b/components/filesystem/public/cpp/prefs/BUILD.gn
deleted file mode 100644
index ed36b59..0000000
--- a/components/filesystem/public/cpp/prefs/BUILD.gn
+++ /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.
-
-source_set("prefs") {
-  sources = [
-    "filesystem_json_pref_store.cc",
-    "filesystem_json_pref_store.h",
-    "pref_service_factory.cc",
-    "pref_service_factory.h",
-  ]
-
-  deps = [
-    "//base",
-    "//components/filesystem/public/interfaces",
-    "//components/prefs",
-    "//mojo/common",
-    "//services/service_manager/public/cpp",
-  ]
-
-  data_deps = [
-    "//components/filesystem",
-  ]
-}
diff --git a/components/filesystem/public/cpp/prefs/filesystem_json_pref_store.cc b/components/filesystem/public/cpp/prefs/filesystem_json_pref_store.cc
deleted file mode 100644
index eb15b25..0000000
--- a/components/filesystem/public/cpp/prefs/filesystem_json_pref_store.cc
+++ /dev/null
@@ -1,428 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "components/filesystem/public/cpp/prefs/filesystem_json_pref_store.h"
-
-#include <stddef.h>
-
-#include <algorithm>
-#include <utility>
-
-#include "base/bind.h"
-#include "base/callback.h"
-#include "base/files/file_path.h"
-#include "base/files/file_util.h"
-#include "base/json/json_string_value_serializer.h"
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/strings/string_util.h"
-#include "base/task_runner_util.h"
-#include "base/time/default_clock.h"
-#include "base/values.h"
-#include "components/prefs/pref_filter.h"
-
-namespace filesystem {
-
-// Result returned from internal read tasks.
-struct FilesystemJsonPrefStore::ReadResult {
- public:
-  ReadResult();
-  ~ReadResult();
-
-  std::unique_ptr<base::Value> value;
-  PrefReadError error;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(ReadResult);
-};
-
-FilesystemJsonPrefStore::ReadResult::ReadResult()
-    : error(PersistentPrefStore::PREF_READ_ERROR_NONE) {}
-
-FilesystemJsonPrefStore::ReadResult::~ReadResult() {}
-
-namespace {
-
-PersistentPrefStore::PrefReadError HandleReadErrors(const base::Value* value) {
-  if (!value->IsType(base::Value::Type::DICTIONARY))
-    return PersistentPrefStore::PREF_READ_ERROR_JSON_TYPE;
-  return PersistentPrefStore::PREF_READ_ERROR_NONE;
-}
-
-}  // namespace
-
-FilesystemJsonPrefStore::FilesystemJsonPrefStore(
-    const std::string& pref_filename,
-    filesystem::mojom::FileSystemPtr filesystem,
-    std::unique_ptr<PrefFilter> pref_filter)
-    : path_(pref_filename),
-      binding_(this),
-      filesystem_(std::move(filesystem)),
-      prefs_(new base::DictionaryValue()),
-      read_only_(false),
-      pref_filter_(std::move(pref_filter)),
-      initialized_(false),
-      filtering_in_progress_(false),
-      pending_lossy_write_(false),
-      read_error_(PREF_READ_ERROR_NONE) {
-  DCHECK(!path_.empty());
-}
-
-bool FilesystemJsonPrefStore::GetValue(const std::string& key,
-                                       const base::Value** result) const {
-  DCHECK(CalledOnValidThread());
-
-  base::Value* tmp = nullptr;
-  if (!prefs_->Get(key, &tmp))
-    return false;
-
-  if (result)
-    *result = tmp;
-  return true;
-}
-
-std::unique_ptr<base::DictionaryValue> FilesystemJsonPrefStore::GetValues()
-    const {
-  return prefs_->CreateDeepCopy();
-}
-
-void FilesystemJsonPrefStore::AddObserver(PrefStore::Observer* observer) {
-  DCHECK(CalledOnValidThread());
-
-  observers_.AddObserver(observer);
-}
-
-void FilesystemJsonPrefStore::RemoveObserver(PrefStore::Observer* observer) {
-  DCHECK(CalledOnValidThread());
-
-  observers_.RemoveObserver(observer);
-}
-
-bool FilesystemJsonPrefStore::HasObservers() const {
-  DCHECK(CalledOnValidThread());
-
-  return observers_.might_have_observers();
-}
-
-bool FilesystemJsonPrefStore::IsInitializationComplete() const {
-  DCHECK(CalledOnValidThread());
-
-  return initialized_;
-}
-
-bool FilesystemJsonPrefStore::GetMutableValue(const std::string& key,
-                                              base::Value** result) {
-  DCHECK(CalledOnValidThread());
-
-  return prefs_->Get(key, result);
-}
-
-void FilesystemJsonPrefStore::SetValue(const std::string& key,
-                                       std::unique_ptr<base::Value> value,
-                                       uint32_t flags) {
-  DCHECK(CalledOnValidThread());
-
-  DCHECK(value);
-  base::Value* old_value = nullptr;
-  prefs_->Get(key, &old_value);
-  if (!old_value || !value->Equals(old_value)) {
-    prefs_->Set(key, std::move(value));
-    ReportValueChanged(key, flags);
-  }
-}
-
-void FilesystemJsonPrefStore::SetValueSilently(
-    const std::string& key,
-    std::unique_ptr<base::Value> value,
-    uint32_t flags) {
-  DCHECK(CalledOnValidThread());
-
-  DCHECK(value);
-  base::Value* old_value = nullptr;
-  prefs_->Get(key, &old_value);
-  if (!old_value || !value->Equals(old_value)) {
-    prefs_->Set(key, std::move(value));
-    ScheduleWrite(flags);
-  }
-}
-
-void FilesystemJsonPrefStore::RemoveValue(const std::string& key,
-                                          uint32_t flags) {
-  DCHECK(CalledOnValidThread());
-
-  if (prefs_->RemovePath(key, nullptr))
-    ReportValueChanged(key, flags);
-}
-
-void FilesystemJsonPrefStore::RemoveValueSilently(const std::string& key,
-                                                  uint32_t flags) {
-  DCHECK(CalledOnValidThread());
-
-  prefs_->RemovePath(key, nullptr);
-  ScheduleWrite(flags);
-}
-
-void FilesystemJsonPrefStore::ClearMutableValues() {
-  NOTIMPLEMENTED();
-}
-
-bool FilesystemJsonPrefStore::ReadOnly() const {
-  DCHECK(CalledOnValidThread());
-
-  return read_only_;
-}
-
-PersistentPrefStore::PrefReadError FilesystemJsonPrefStore::GetReadError()
-    const {
-  DCHECK(CalledOnValidThread());
-
-  return read_error_;
-}
-
-PersistentPrefStore::PrefReadError FilesystemJsonPrefStore::ReadPrefs() {
-  NOTREACHED();
-  // TODO(erg): Synchronously reading files makes no sense in a mojo world and
-  // should be removed from the API.
-  return PREF_READ_ERROR_ASYNCHRONOUS_TASK_INCOMPLETE;
-}
-
-void FilesystemJsonPrefStore::ReadPrefsAsync(
-    ReadErrorDelegate* error_delegate) {
-  DCHECK(CalledOnValidThread());
-
-  initialized_ = false;
-  error_delegate_.reset(error_delegate);
-
-  if (!directory_) {
-    OpenFilesystem(
-        Bind(&FilesystemJsonPrefStore::OnPreferencesReadStart, AsWeakPtr()));
-  } else {
-    OnPreferencesReadStart();
-  }
-}
-
-void FilesystemJsonPrefStore::CommitPendingWrite() {
-  DCHECK(CalledOnValidThread());
-
-  // TODO(erg): This is another one of those cases where we have problems
-  // because of mismatch between the models used in the pref service versus
-  // here. Most of the time, CommitPendingWrite() is called from
-  // PrefService. However, in JSONPrefStore, we also call this method on
-  // shutdown and thus need to synchronously write. But in mojo:filesystem,
-  // everything is done asynchronously. So we're sort of stuck until we can
-  // change the interface, which we'll do in the longer term.
-
-  SchedulePendingLossyWrites();
-}
-
-void FilesystemJsonPrefStore::SchedulePendingLossyWrites() {
-  // This method is misnamed for the sake of the interface. Given that writing
-  // is already asynchronous in this new world, "sheduleing" a pending write
-  // just starts the asynchronous process.
-  if (pending_lossy_write_)
-    PerformWrite();
-}
-
-void FilesystemJsonPrefStore::ReportValueChanged(const std::string& key,
-                                                 uint32_t flags) {
-  DCHECK(CalledOnValidThread());
-
-  if (pref_filter_)
-    pref_filter_->FilterUpdate(key);
-
-  for (PrefStore::Observer& observer : observers_)
-    observer.OnPrefValueChanged(key);
-
-  ScheduleWrite(flags);
-}
-
-void FilesystemJsonPrefStore::OnFileSystemShutdown() {}
-
-void FilesystemJsonPrefStore::OnFileRead(
-    std::unique_ptr<ReadResult> read_result) {
-  DCHECK(CalledOnValidThread());
-
-  DCHECK(read_result);
-
-  std::unique_ptr<base::DictionaryValue> unfiltered_prefs(
-      new base::DictionaryValue);
-
-  read_error_ = read_result->error;
-
-  switch (read_error_) {
-    case PREF_READ_ERROR_ACCESS_DENIED:
-    case PREF_READ_ERROR_FILE_OTHER:
-    case PREF_READ_ERROR_FILE_LOCKED:
-    case PREF_READ_ERROR_JSON_TYPE:
-    case PREF_READ_ERROR_FILE_NOT_SPECIFIED:
-      read_only_ = true;
-      break;
-    case PREF_READ_ERROR_NONE:
-      DCHECK(read_result->value.get());
-      unfiltered_prefs.reset(
-          static_cast<base::DictionaryValue*>(read_result->value.release()));
-      break;
-    case PREF_READ_ERROR_NO_FILE:
-    // If the file just doesn't exist, maybe this is first run.  In any case
-    // there's no harm in writing out default prefs in this case.
-    case PREF_READ_ERROR_JSON_PARSE:
-    case PREF_READ_ERROR_JSON_REPEAT:
-      break;
-    case PREF_READ_ERROR_ASYNCHRONOUS_TASK_INCOMPLETE:
-    // This is a special error code to be returned by ReadPrefs when it
-    // can't complete synchronously, it should never be returned by the read
-    // operation itself.
-    case PREF_READ_ERROR_MAX_ENUM:
-      NOTREACHED();
-      break;
-  }
-
-  if (pref_filter_) {
-    filtering_in_progress_ = true;
-    const PrefFilter::PostFilterOnLoadCallback post_filter_on_load_callback(
-        base::Bind(&FilesystemJsonPrefStore::FinalizeFileRead, AsWeakPtr()));
-    pref_filter_->FilterOnLoad(post_filter_on_load_callback,
-                               std::move(unfiltered_prefs));
-  } else {
-    FinalizeFileRead(std::move(unfiltered_prefs), false);
-  }
-}
-
-FilesystemJsonPrefStore::~FilesystemJsonPrefStore() {
-  // TODO(erg): Now that writing is asynchronous, we can't really async write
-  // prefs at shutdown. See comment in CommitPendingWrite().
-}
-
-void FilesystemJsonPrefStore::FinalizeFileRead(
-    std::unique_ptr<base::DictionaryValue> prefs,
-    bool schedule_write) {
-  DCHECK(CalledOnValidThread());
-
-  filtering_in_progress_ = false;
-
-  prefs_ = std::move(prefs);
-
-  initialized_ = true;
-
-  if (schedule_write)
-    ScheduleWrite(DEFAULT_PREF_WRITE_FLAGS);
-
-  if (error_delegate_ && read_error_ != PREF_READ_ERROR_NONE)
-    error_delegate_->OnError(read_error_);
-
-  for (PrefStore::Observer& observer : observers_)
-    observer.OnInitializationCompleted(true);
-}
-
-void FilesystemJsonPrefStore::ScheduleWrite(uint32_t flags) {
-  if (read_only_)
-    return;
-
-  if (flags & LOSSY_PREF_WRITE_FLAG)
-    pending_lossy_write_ = true;
-  else
-    PerformWrite();
-}
-
-void FilesystemJsonPrefStore::PerformWrite() {
-  if (!directory_) {
-    OpenFilesystem(
-        Bind(&FilesystemJsonPrefStore::OnTempFileWriteStart, AsWeakPtr()));
-  } else {
-    OnTempFileWriteStart();
-  }
-}
-
-void FilesystemJsonPrefStore::OpenFilesystem(base::Closure callback) {
-  filesystem::mojom::FileSystemClientPtr client;
-  binding_.Bind(MakeRequest(&client));
-
-  filesystem_->OpenFileSystem(
-      "origin", MakeRequest(&directory_), std::move(client),
-      base::Bind(&FilesystemJsonPrefStore::OnOpenFilesystem, AsWeakPtr(),
-                 callback));
-}
-
-void FilesystemJsonPrefStore::OnOpenFilesystem(base::Closure callback,
-                                               mojom::FileError err) {
-  if (err != mojom::FileError::OK) {
-    // Do real error checking.
-    NOTIMPLEMENTED();
-    return;
-  }
-
-  callback.Run();
-}
-
-void FilesystemJsonPrefStore::OnTempFileWriteStart() {
-  // Calculate what we want to write, and then write to the temporary file.
-  pending_lossy_write_ = false;
-
-  if (pref_filter_)
-    pref_filter_->FilterSerializeData(prefs_.get());
-
-  std::string output;
-  JSONStringValueSerializer serializer(&output);
-  serializer.set_pretty_print(false);
-  serializer.Serialize(*prefs_);
-
-  directory_->WriteFile(
-      "tmp", std::vector<uint8_t>(output.begin(), output.end()),
-      Bind(&FilesystemJsonPrefStore::OnTempFileWrite, AsWeakPtr()));
-}
-
-void FilesystemJsonPrefStore::OnTempFileWrite(mojom::FileError err) {
-  // TODO(erg): Error handling. The JsonPrefStore code assumes that writing the
-  // file can never fail.
-  CHECK_EQ(mojom::FileError::OK, err);
-
-  directory_->Rename(
-      "tmp", path_,
-      Bind(&FilesystemJsonPrefStore::OnTempFileRenamed, AsWeakPtr()));
-}
-
-void FilesystemJsonPrefStore::OnTempFileRenamed(mojom::FileError err) {}
-
-void FilesystemJsonPrefStore::OnPreferencesReadStart() {
-  directory_->ReadEntireFile(
-      path_,
-      Bind(&FilesystemJsonPrefStore::OnPreferencesFileRead, AsWeakPtr()));
-}
-
-void FilesystemJsonPrefStore::OnPreferencesFileRead(
-    mojom::FileError err,
-    const std::vector<uint8_t>& contents) {
-  std::unique_ptr<FilesystemJsonPrefStore::ReadResult> read_result(
-      new FilesystemJsonPrefStore::ReadResult);
-  // TODO(erg): Needs even better error handling.
-  switch (err) {
-    case mojom::FileError::IN_USE:
-    case mojom::FileError::ACCESS_DENIED:
-    case mojom::FileError::NOT_A_FILE: {
-      read_only_ = true;
-      break;
-    }
-    case mojom::FileError::FAILED:
-    case mojom::FileError::NOT_FOUND: {
-      // If the file just doesn't exist, maybe this is the first run. Just
-      // don't pass a value.
-      read_result->error = PREF_READ_ERROR_NO_FILE;
-      break;
-    }
-    default: {
-      int error_code;
-      std::string error_msg;
-      JSONStringValueDeserializer deserializer(base::StringPiece(
-          reinterpret_cast<char*>(&contents.front()), contents.size()));
-      read_result->value = deserializer.Deserialize(&error_code, &error_msg);
-      read_result->error = HandleReadErrors(read_result->value.get());
-    }
-  }
-
-  OnFileRead(std::move(read_result));
-}
-
-}  // namespace filesystem
diff --git a/components/filesystem/public/cpp/prefs/filesystem_json_pref_store.h b/components/filesystem/public/cpp/prefs/filesystem_json_pref_store.h
deleted file mode 100644
index fcd9e29f..0000000
--- a/components/filesystem/public/cpp/prefs/filesystem_json_pref_store.h
+++ /dev/null
@@ -1,179 +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.
-
-#ifndef COMPONENTS_FILESYSTEM_PUBLIC_CPP_PREFS_FILESYSTEM_JSON_PREF_STORE_H_
-#define COMPONENTS_FILESYSTEM_PUBLIC_CPP_PREFS_FILESYSTEM_JSON_PREF_STORE_H_
-
-#include <stdint.h>
-
-#include <memory>
-#include <set>
-#include <string>
-
-#include "base/callback_forward.h"
-#include "base/compiler_specific.h"
-#include "base/files/file_path.h"
-#include "base/gtest_prod_util.h"
-#include "base/macros.h"
-#include "base/memory/weak_ptr.h"
-#include "base/observer_list.h"
-#include "base/threading/non_thread_safe.h"
-#include "components/filesystem/public/interfaces/directory.mojom.h"
-#include "components/filesystem/public/interfaces/file.mojom.h"
-#include "components/filesystem/public/interfaces/file_system.mojom.h"
-#include "components/filesystem/public/interfaces/types.mojom.h"
-#include "components/prefs/base_prefs_export.h"
-#include "components/prefs/persistent_pref_store.h"
-#include "components/prefs/pref_filter.h"
-#include "mojo/public/cpp/bindings/binding.h"
-
-class PrefFilter;
-
-namespace base {
-class DictionaryValue;
-class JsonPrefStoreLossyWriteTest;
-class Value;
-}
-
-namespace filesystem {
-
-// A forked, hack'n'slashed copy of base::JsonPrefStore which writes its
-// preference data to the mojo filesystem instead of the real
-// filesystem. Unlike base::JsonPrefStore, this class can safely be used inside
-// a sandboxed process.
-//
-// In the long run, we'll want to replace the current PrefService code with
-// something very different, especially since this component hard punts on all
-// the hard things that the preference service does (enterprise management,
-// parental controls, extension integration, etc.) and its interface is really
-// not optimal for a mojoified world--there are a few places where we assume
-// that writing to disk is synchronous...but it no longer is!
-//
-// Removing this class is a part of crbug.com/580652.
-class FilesystemJsonPrefStore
-    : public PersistentPrefStore,
-      public filesystem::mojom::FileSystemClient,
-      public base::SupportsWeakPtr<FilesystemJsonPrefStore>,
-      public base::NonThreadSafe {
- public:
-  struct ReadResult;
-
-  FilesystemJsonPrefStore(const std::string& pref_filename,
-                          filesystem::mojom::FileSystemPtr filesystem,
-                          std::unique_ptr<PrefFilter> pref_filter);
-
-  // PrefStore overrides:
-  bool GetValue(const std::string& key,
-                const base::Value** result) const override;
-  std::unique_ptr<base::DictionaryValue> GetValues() const override;
-  void AddObserver(PrefStore::Observer* observer) override;
-  void RemoveObserver(PrefStore::Observer* observer) override;
-  bool HasObservers() const override;
-  bool IsInitializationComplete() const override;
-
-  // PersistentPrefStore overrides:
-  bool GetMutableValue(const std::string& key, base::Value** result) override;
-  void SetValue(const std::string& key,
-                std::unique_ptr<base::Value> value,
-                uint32_t flags) override;
-  void SetValueSilently(const std::string& key,
-                        std::unique_ptr<base::Value> value,
-                        uint32_t flags) override;
-  void RemoveValue(const std::string& key, uint32_t flags) override;
-  bool ReadOnly() const override;
-  PrefReadError GetReadError() const override;
-  // Note this method may be asynchronous if this instance has a |pref_filter_|
-  // in which case it will return PREF_READ_ERROR_ASYNCHRONOUS_TASK_INCOMPLETE.
-  // See details in pref_filter.h.
-  PrefReadError ReadPrefs() override;
-  void ReadPrefsAsync(ReadErrorDelegate* error_delegate) override;
-  void CommitPendingWrite() override;
-  void SchedulePendingLossyWrites() override;
-  void ReportValueChanged(const std::string& key, uint32_t flags) override;
-
-  // FileSystemClient overrides:
-  void OnFileSystemShutdown() override;
-
-  // Just like RemoveValue(), but doesn't notify observers. Used when doing some
-  // cleanup that shouldn't otherwise alert observers.
-  void RemoveValueSilently(const std::string& key, uint32_t flags);
-
-  void ClearMutableValues() override;
-
- private:
-  friend class base::JsonPrefStoreLossyWriteTest;
-
-  ~FilesystemJsonPrefStore() override;
-
-  // This method is called after the JSON file has been read.  It then hands
-  // |value| (or an empty dictionary in some read error cases) to the
-  // |pref_filter| if one is set. It also gives a callback pointing at
-  // FinalizeFileRead() to that |pref_filter_| which is then responsible for
-  // invoking it when done. If there is no |pref_filter_|, FinalizeFileRead()
-  // is invoked directly.
-  void OnFileRead(std::unique_ptr<ReadResult> read_result);
-
-  // This method is called after the JSON file has been read and the result has
-  // potentially been intercepted and modified by |pref_filter_|.
-  // |schedule_write| indicates whether a write should be immediately scheduled
-  // (typically because the |pref_filter_| has already altered the |prefs|) --
-  // this will be ignored if this store is read-only.
-  void FinalizeFileRead(std::unique_ptr<base::DictionaryValue> prefs,
-                        bool schedule_write);
-
-  // Schedule a write with the file writer as long as |flags| doesn't contain
-  // WriteablePrefStore::LOSSY_PREF_WRITE_FLAG.
-  void ScheduleWrite(uint32_t flags);
-
-  // Actually performs a write. Unlike the //base version of this class, we
-  // don't use the ImportantFileWriter and instead write using the mojo
-  // filesystem API.
-  void PerformWrite();
-
-  // Opens the filesystem and calls |callback| when completed, whether
-  // successfully or unsuccessfully.
-  void OpenFilesystem(base::Closure callback);
-
-  // Callback method which verifies that there were no errors on opening the
-  // filesystem, and if there aren't, invokes the passed in callback.
-  void OnOpenFilesystem(base::Closure callback, mojom::FileError err);
-
-  // Asynchronous implementation details of PerformWrite().
-  void OnTempFileWriteStart();
-  void OnTempFileWrite(mojom::FileError err);
-  void OnTempFileRenamed(mojom::FileError err);
-
-  // Asynchronous implementation details of ReadPrefsAsync().
-  void OnPreferencesReadStart();
-  void OnPreferencesFileRead(mojom::FileError err,
-                             const std::vector<uint8_t>& contents);
-
-  const std::string path_;
-  mojo::Binding<filesystem::mojom::FileSystemClient> binding_;
-  filesystem::mojom::FileSystemPtr filesystem_;
-
-  // |directory_| is only bound after the first attempt to access the
-  // |filesystem. See OpenFilesystem().
-  mojom::DirectoryPtr directory_;
-
-  std::unique_ptr<base::DictionaryValue> prefs_;
-
-  bool read_only_;
-
-  std::unique_ptr<PrefFilter> pref_filter_;
-  base::ObserverList<PrefStore::Observer, true> observers_;
-
-  std::unique_ptr<ReadErrorDelegate> error_delegate_;
-
-  bool initialized_;
-  bool filtering_in_progress_;
-  bool pending_lossy_write_;
-  PrefReadError read_error_;
-
-  DISALLOW_COPY_AND_ASSIGN(FilesystemJsonPrefStore);
-};
-
-}  // namespace filesystem
-
-#endif  // COMPONENTS_FILESYSTEM_PUBLIC_CPP_PREFS_FILESYSTEM_JSON_PREF_STORE_H_
diff --git a/components/filesystem/public/cpp/prefs/pref_service_factory.cc b/components/filesystem/public/cpp/prefs/pref_service_factory.cc
deleted file mode 100644
index e9ca2b9..0000000
--- a/components/filesystem/public/cpp/prefs/pref_service_factory.cc
+++ /dev/null
@@ -1,47 +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 "components/filesystem/public/cpp/prefs/pref_service_factory.h"
-
-#include "base/bind.h"
-#include "components/filesystem/public/cpp/prefs/filesystem_json_pref_store.h"
-#include "components/prefs/pref_notifier_impl.h"
-#include "components/prefs/pref_registry.h"
-#include "components/prefs/pref_service.h"
-#include "components/prefs/pref_value_store.h"
-#include "components/prefs/value_map_pref_store.h"
-#include "components/prefs/writeable_pref_store.h"
-#include "services/service_manager/public/cpp/connector.h"
-
-namespace filesystem {
-
-namespace {
-
-// Do-nothing default implementation.
-void DoNothingHandleReadError(PersistentPrefStore::PrefReadError error) {}
-
-}  // namespace
-
-std::unique_ptr<PrefService> CreatePrefService(
-    service_manager::Connector* connector,
-    PrefRegistry* pref_registry) {
-  filesystem::mojom::FileSystemPtr filesystem;
-  connector->BindInterface("filesystem", &filesystem);
-
-  scoped_refptr<FilesystemJsonPrefStore> user_prefs =
-      new FilesystemJsonPrefStore("preferences.json", std::move(filesystem),
-                                  nullptr /* TODO(erg): pref filter */);
-
-  PrefNotifierImpl* pref_notifier = new PrefNotifierImpl();
-  std::unique_ptr<PrefService> pref_service(new PrefService(
-      pref_notifier,
-      new PrefValueStore(nullptr, nullptr, nullptr, nullptr, user_prefs.get(),
-                         nullptr, pref_registry->defaults().get(),
-                         pref_notifier),
-      user_prefs.get(), pref_registry, base::Bind(&DoNothingHandleReadError),
-      true /* async */));
-  return pref_service;
-}
-
-}  // namespace filesystem
diff --git a/components/filesystem/public/cpp/prefs/pref_service_factory.h b/components/filesystem/public/cpp/prefs/pref_service_factory.h
deleted file mode 100644
index 86a2704..0000000
--- a/components/filesystem/public/cpp/prefs/pref_service_factory.h
+++ /dev/null
@@ -1,29 +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.
-
-#ifndef COMPONENTS_FILESYSTEM_PUBLIC_CPP_PREFS_PREF_SERVICE_FACTORY_H_
-#define COMPONENTS_FILESYSTEM_PUBLIC_CPP_PREFS_PREF_SERVICE_FACTORY_H_
-
-#include <memory>
-
-#include "components/prefs/pref_service.h"
-
-namespace mojo {
-class Connector;
-}
-
-class PrefRegistry;
-
-namespace filesystem {
-
-// This factory method creates a PrefService for the local process based on the
-// preference registry passed in. This PrefService will synchronize with a JSON
-// file in the mojo:filesystem.
-std::unique_ptr<PrefService> CreatePrefService(
-    service_manager::Connector* connector,
-    PrefRegistry* registry);
-
-}  // namespace filesystem
-
-#endif  // COMPONENTS_FILESYSTEM_PUBLIC_CPP_PREFS_PREF_SERVICE_FACTORY_H_
diff --git a/components/login/screens/screen_context.cc b/components/login/screens/screen_context.cc
index 5e170b6..3473d9c3 100644
--- a/components/login/screens/screen_context.cc
+++ b/components/login/screens/screen_context.cc
@@ -29,6 +29,7 @@
 }
 
 ScreenContext::~ScreenContext() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 }
 
 bool ScreenContext::SetBoolean(const KeyType& key, bool value) {
@@ -131,17 +132,17 @@
 }
 
 bool ScreenContext::HasKey(const KeyType& key) const {
-  DCHECK(CalledOnValidThread());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   return storage_.HasKey(key);
 }
 
 bool ScreenContext::HasChanges() const {
-  DCHECK(CalledOnValidThread());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   return !changes_.empty();
 }
 
 void ScreenContext::GetChangesAndReset(base::DictionaryValue* diff) {
-  DCHECK(CalledOnValidThread());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(diff);
   changes_.Swap(diff);
   changes_.Clear();
@@ -149,7 +150,7 @@
 
 void ScreenContext::ApplyChanges(const base::DictionaryValue& diff,
                                  std::vector<std::string>* keys) {
-  DCHECK(CalledOnValidThread());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(!HasChanges());
   if (keys) {
     keys->clear();
@@ -165,7 +166,7 @@
 }
 
 bool ScreenContext::Set(const KeyType& key, base::Value* value) {
-  DCHECK(CalledOnValidThread());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(value);
   std::unique_ptr<base::Value> new_value(value);
 
diff --git a/components/login/screens/screen_context.h b/components/login/screens/screen_context.h
index 665f7989..03fc037a 100644
--- a/components/login/screens/screen_context.h
+++ b/components/login/screens/screen_context.h
@@ -10,8 +10,8 @@
 
 #include "base/logging.h"
 #include "base/macros.h"
+#include "base/sequence_checker.h"
 #include "base/strings/string16.h"
-#include "base/threading/non_thread_safe.h"
 #include "base/values.h"
 #include "components/login/base_screen_handler_utils.h"
 #include "components/login/login_export.h"
@@ -31,7 +31,7 @@
 // ScreenContext memorizes changed key-value pairs and returns them
 // via GetChangesAndReset() method. After call to this method an
 // internal buffer of changes will be cleared.
-class LOGIN_EXPORT ScreenContext : public base::NonThreadSafe {
+class LOGIN_EXPORT ScreenContext {
  public:
   typedef std::string KeyType;
   typedef base::Value ValueType;
@@ -94,7 +94,7 @@
 
   template <typename T>
   T Get(const KeyType& key) const {
-    DCHECK(CalledOnValidThread());
+    DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
     const base::Value* value;
     bool has_key = storage_.Get(key, &value);
     DCHECK(has_key);
@@ -108,7 +108,7 @@
 
   template <typename T>
   T Get(const KeyType& key, const T& default_value) const {
-    DCHECK(CalledOnValidThread());
+    DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
     if (!HasKey(key))
       return default_value;
     return Get<T>(key);
@@ -120,6 +120,8 @@
   // Contains all pending changes.
   base::DictionaryValue changes_;
 
+  SEQUENCE_CHECKER(sequence_checker_);
+
   DISALLOW_COPY_AND_ASSIGN(ScreenContext);
 };
 
diff --git a/components/policy/resources/policy_templates_bn.xtb b/components/policy/resources/policy_templates_bn.xtb
index da95c0f..58de8d6 100644
--- a/components/policy/resources/policy_templates_bn.xtb
+++ b/components/policy/resources/policy_templates_bn.xtb
@@ -1090,6 +1090,11 @@
 <translation id="5148753489738115745">যখন <ph name="PRODUCT_FRAME_NAME" />  <ph name="PRODUCT_NAME" /> আরম্ভ করে তখন আপনাকে ব্যবহার করা অতিরিক্তি প্যারামিটার নির্দিষ্ট করতে অনুমতি দেয়৷
 
          যদি এই নীতি সেট করা না হয় ডিফল্ট কমান্ড লাইন ব্যবহার করা হবে৷</translation>
+<translation id="5159469559091666409">নেটওয়ার্ক মনিটর করার প্যাকেট কত ঘনঘন পাঠানো হয়, মিলিসেকেন্ডে তার হিসেব।
+
+      এই নীতিটি সেট করা না হলে ডিফল্ট ব্যবধান ৩ মিনিট ধরা হবে। ন্যূনতম
+      ব্যবধান ৩০ সেকেন্ড এবং সর্বোচ্চ ব্যবধান ২৪ ঘণ্টা - এর থেকে
+      কম বা বেশি মানগুলিকে এই সীমার মধ্যে বেঁধে রাখা হবে।</translation>
 <translation id="5182055907976889880">Google ড্রাইভ <ph name="PRODUCT_OS_NAME" /> এ কনফিগার করুন৷</translation>
 <translation id="5183383917553127163">কোন এক্সটেনশনগুলি কালো তালিকার বিবেচনাধীন নয় তা নিদিষ্ট করার অনুমতি দেয়৷
 
diff --git a/components/policy/resources/policy_templates_es.xtb b/components/policy/resources/policy_templates_es.xtb
index 01f4640..d7635a0 100644
--- a/components/policy/resources/policy_templates_es.xtb
+++ b/components/policy/resources/policy_templates_es.xtb
@@ -24,7 +24,7 @@
 
       Si se asigna el valor false a esta política, no se informará sobre las estadísticas.
       Si se asigna el valor true o si la política no se configura, se informará sobre ellas.</translation>
-<translation id="1046484220783400299">Habilita funciones obsoletas de la plataforma web durante un período de tiempo limitado</translation>
+<translation id="1046484220783400299">Habilita funciones obsoletas de la plataforma web durante un periodo de tiempo limitado</translation>
 <translation id="1047128214168693844">No permitir que ningún sitio haga un seguimiento de la ubicación física de los usuarios</translation>
 <translation id="1049138910114524876">Establece la configuración regional que se fuerza a aplicar en la pantalla de inicio de sesión de <ph name="PRODUCT_OS_NAME" />.
 
@@ -243,7 +243,7 @@
 Si esta política se establece en True, <ph name="PRODUCT_OS_NAME" /> intentará descargar cargas útiles de actualizaciones automáticas a través de HTTP. Si la política se establece en False o no se configura, se utilizará HTTPS para descargar cargas útiles de actualizaciones automáticas.</translation>
 <translation id="2006530844219044261">Administración de energía</translation>
 <translation id="201557587962247231">Frecuencia de subida de informes de estado del dispositivo</translation>
-<translation id="2018836497795982119">Permite especificar el período en milisegundos en el que se solicita información sobre políticas del usuario al servicio de administración de dispositivos.
+<translation id="2018836497795982119">Permite especificar el periodo en milisegundos en el que se solicita información sobre políticas del usuario al servicio de administración de dispositivos.
 
       Al establecer esta política, se anula el valor predeterminado de tres horas. Los valores válidos están comprendidos entre 1.800.000 (30 minutos) y 86.400.000 (un día). Si el valor no está incluido en este intervalo, se redondeará al límite correspondiente. Si la plataforma admite notificaciones sobre políticas, el tiempo de actualización se establecerá en 24 horas, ya que se espera que estas notificaciones fuercen una actualización automática en cuanto se produzca algún cambio en una política.
 
@@ -948,7 +948,7 @@
 
       Si esta política no se configura o si la lista está vacía o no coincide con ninguna de las etiquetas de cadena admitidas, todas las funciones obsoletas de la plataforma web permanecerán inhabilitadas.
 
-      Aunque la política en sí es compatible con las plataformas anteriores, es posible que la función que habilita no esté disponible en todas ellas. No todas las funciones de Web Platform obsoletas se pueden volver a habilitar. Solo es posible hacerlo con las indicadas específicamente y durante un período de tiempo limitado diferente para cada función. El formato general de la etiqueta de cadena será:[NombreDeFunciónObsoleta]_EffectiveUntil[aaaammdd]. Como referencia, puedes consultar los intentos detrás de los cambios de la función Web Platform en la página https://bit.ly/blinkintents.
+      Aunque la política en sí es compatible con las plataformas anteriores, es posible que la función que habilita no esté disponible en todas ellas. No todas las funciones de Web Platform obsoletas se pueden volver a habilitar. Solo es posible hacerlo con las indicadas específicamente y durante un periodo de tiempo limitado diferente para cada función. El formato general de la etiqueta de cadena será:[NombreDeFunciónObsoleta]_EffectiveUntil[aaaammdd]. Como referencia, puedes consultar los intentos detrás de los cambios de la función Web Platform en la página https://bit.ly/blinkintents.
       </translation>
 <translation id="4442582539341804154">Habilitar el bloqueo cuando el dispositivo esté inactivo o suspendido</translation>
 <translation id="4449545651113180484">Girar la pantalla 270 grados hacia la derecha</translation>
@@ -1207,7 +1207,7 @@
 <translation id="5475361623548884387">Habilitar impresión</translation>
 <translation id="5499375345075963939">Esta política solo se encuentra activa en el modo comercial.
 
-      Cuando el valor de esta política se establece en un número distinto de 0, la sesión del usuario que haya iniciado sesión en ese momento en modo de demostración se cerrará automáticamente una vez que haya transcurrido el período de inactividad especificado.
+      Cuando el valor de esta política se establece en un número distinto de 0, la sesión del usuario que haya iniciado sesión en ese momento en modo de demostración se cerrará automáticamente una vez que haya transcurrido el periodo de inactividad especificado.
 
       El valor de la política se debe especificar en milisegundos.</translation>
 <translation id="5511702823008968136">Habilitar barra de marcadores</translation>
@@ -1217,7 +1217,7 @@
       Si se establece esta política, se iniciará automáticamente la sesión especificada una vez que haya transcurrido un tiempo sin que el usuario haya realizado ninguna acción en la pantalla de inicio de sesión. La sesión pública tendrá que estar configurada previamente (ver | DeviceLocalAccounts|).
 
       Si no se establece esta política, no se realiza el inicio de sesión automático.</translation>
-<translation id="5529037166721644841">Permite especificar el período en milisegundos en el que se solicita información sobre políticas de dispositivos al servicio de administración de dispositivos.
+<translation id="5529037166721644841">Permite especificar el periodo en milisegundos en el que se solicita información sobre políticas de dispositivos al servicio de administración de dispositivos.
 
       Al establecer esta política, se anula el valor predeterminado de tres horas. Los valores válidos están comprendidos entre 1.800.000 (30 minutos) y 86.400.000 (un día). Si el valor no está incluido en este intervalo, se redondeará al límite correspondiente.
 
@@ -1377,7 +1377,7 @@
 
           Cuando no se establece el tiempo transcurrido, se utilizará un valor de tiempo predeterminado.
 
-          El modo recomendado para bloquear la pantalla en modo de inactividad es habilitar el bloqueo de pantalla en modo de suspensión y hacer que <ph name="PRODUCT_OS_NAME" /> entre en modo de suspensión después del retraso de inactividad. Esta política solo debe utilizarse cuando el bloqueo se produce en un período de tiempo anterior a la suspensión o cuando no se quiere que se produzca la suspensión en modo de inactividad.
+          El modo recomendado para bloquear la pantalla en modo de inactividad es habilitar el bloqueo de pantalla en modo de suspensión y hacer que <ph name="PRODUCT_OS_NAME" /> entre en modo de suspensión después del retraso de inactividad. Esta política solo debe utilizarse cuando el bloqueo se produce en un periodo de tiempo anterior a la suspensión o cuando no se quiere que se produzca la suspensión en modo de inactividad.
 
           El valor de la política se debe especificar en milisegundos. Los valores están establecidos para ser inferiores al retraso de inactividad.</translation>
 <translation id="6111936128861357925">Permitir el juego del huevo de pascua de dinosaurio</translation>
@@ -1400,7 +1400,7 @@
 <translation id="6190022522129724693">Configuración de pop-ups predeterminada</translation>
 <translation id="6197453924249895891">Concede acceso a claves corporativas de extensiones.
 
-      Las claves están designadas para un uso corporativo si se generan con la API chrome.enterprise.platformKeys en una cuenta administrada. Las claves importadas o generadas de otra forma no están designadas para este uso.
+      Las claves están designadas para un uso corporativo si se generan con la API chrome.enterprise.platformKeys en una cuenta gestionada. Las claves importadas o generadas de otra forma no están designadas para este uso.
 
       El acceso a las claves designadas para uso corporativo se controla únicamente a través de esta política. El usuario no puede conceder acceso a extensiones mediante claves corporativas ni retirarlo.
 
@@ -1473,7 +1473,7 @@
 
           Cuando no se establece esta política, se utilizará un valor de tiempo predeterminado.
 
-          El modo recomendado para bloquear la pantalla en modo de inactividad es habilitar el bloqueo de pantalla en modo de suspensión y hacer que <ph name="PRODUCT_OS_NAME" /> entre en modo de suspensión después del retraso de inactividad. Esta política solo debe utilizarse cuando el bloqueo se produce en un período de tiempo anterior a la suspensión o cuando no se quiere que se produzca la suspensión en modo de inactividad.
+          El modo recomendado para bloquear la pantalla en modo de inactividad es habilitar el bloqueo de pantalla en modo de suspensión y hacer que <ph name="PRODUCT_OS_NAME" /> entre en modo de suspensión después del retraso de inactividad. Esta política solo debe utilizarse cuando el bloqueo se produce en un periodo de tiempo anterior a la suspensión o cuando no se quiere que se produzca la suspensión en modo de inactividad.
 
           El valor de la política se debe especificar en milisegundos. Los valores están establecidos para ser inferiores al retraso de inactividad.</translation>
 <translation id="6536600139108165863">Reinicio automático al cerrar el dispositivo</translation>
@@ -1518,7 +1518,7 @@
       Si asignas el valor "always", "never" o "WiFi only" a esta preferencia, los usuarios no podrán cambiar ni anular esta configuración en <ph name="PRODUCT_NAME" />.
 
       Si esta política no se configura, la predicción de red se habilitará, pero el usuario no podrá modificarla.</translation>
-<translation id="6658245400435704251">Especifica el número de segundos hasta los que un dispositivo puede retrasar aleatoriamente la descarga de una actualización desde el momento en el que esta se envío al servidor por primera vez. El dispositivo puede dedicar una parte de este tiempo al propio proceso de actualización y el resto a realizar las comprobaciones necesarias. En cualquier caso, el límite superior de la dispersión es un período de tiempo constante, para que el dispositivo no se quede bloqueado mientras descarga una actualización.</translation>
+<translation id="6658245400435704251">Especifica el número de segundos hasta los que un dispositivo puede retrasar aleatoriamente la descarga de una actualización desde el momento en el que esta se envío al servidor por primera vez. El dispositivo puede dedicar una parte de este tiempo al propio proceso de actualización y el resto a realizar las comprobaciones necesarias. En cualquier caso, el límite superior de la dispersión es un periodo de tiempo constante, para que el dispositivo no se quede bloqueado mientras descarga una actualización.</translation>
 <translation id="6689792153960219308">Informar sobre el estado del hardware</translation>
 <translation id="6693751878507293182">Si habilitas esta opción, se inhabilitará la búsqueda y la instalación automática de los complementos que falten en <ph name="PRODUCT_NAME" />.
 
@@ -1582,7 +1582,7 @@
       Si no se establece esta política, se utilizará la ruta de perfil predeterminada y el usuario podrá anularla con el indicador de línea de comando "--user-data-dir".</translation>
 <translation id="7027785306666625591">Configura la administración de energía en <ph name="PRODUCT_OS_NAME" />.
 
-Estas políticas te permiten configurar el comportamiento de <ph name="PRODUCT_OS_NAME" /> cuando el usuario permanece inactivo durante un período de tiempo determinado.</translation>
+Estas políticas te permiten configurar el comportamiento de <ph name="PRODUCT_OS_NAME" /> cuando el usuario permanece inactivo durante un periodo de tiempo determinado.</translation>
 <translation id="7040229947030068419">Valor de ejemplo:</translation>
 <translation id="7049373494483449255">Permite que <ph name="PRODUCT_NAME" /> envíe documentos a <ph name="CLOUD_PRINT_NAME" /> para imprimirlos. NOTA: Esto solo afecta a la asistencia de <ph name="CLOUD_PRINT_NAME" /> en <ph name="PRODUCT_NAME" />. No evita que otros usuarios envíen trabajos de impresión a través sitios web.
 
@@ -1949,7 +1949,7 @@
           Si estableces esta política, los usuarios no podrán modificarla o anularla.
 
           Si no se establece esta política, el modo de contraste alto se inhabilitará de forma inicial, pero el usuario podrá habilitarlo en cualquier momento.</translation>
-<translation id="815061180603915310">Si se habilita, esta política fuerza el cambio del perfil al modo efímero. Si se especifica como política del sistema operativo (p. ej., GPO en Windows), se aplicará a todos los perfiles del sistema; si se establece como política de la nube, solo se aplicará a un perfil en el que se inicie sesión con una cuenta administrada.
+<translation id="815061180603915310">Si se habilita, esta política fuerza el cambio del perfil al modo efímero. Si se especifica como política del sistema operativo (p. ej., GPO en Windows), se aplicará a todos los perfiles del sistema; si se establece como política de la nube, solo se aplicará a un perfil en el que se inicie sesión con una cuenta gestionada.
 
       En este modo, los datos de perfil solo se mantienen en el disco mientras dura la sesión del usuario. Una vez que se cierra el navegador, no se conservan ciertas funciones, como las extensiones y sus datos o el historial web, datos de Internet como las cookies ni las bases de datos web. Sin embargo, esto no impide que el usuario pueda descargar datos en el disco manualmente, guardar páginas o imprimirlas.
 
@@ -2172,7 +2172,7 @@
 
           Cuando no se establece esta política, se utilizará un valor de tiempo predeterminado.
 
-          El modo recomendado para bloquear la pantalla en modo de inactividad es habilitar el bloqueo de pantalla en modo de suspensión y hacer que <ph name="PRODUCT_OS_NAME" /> entre en modo de suspensión después del retraso de inactividad. Esta política solo debe utilizarse cuando el bloqueo se produce en un período de tiempo anterior a la suspensión o cuando no se quiere que se produzca la suspensión en modo de inactividad.
+          El modo recomendado para bloquear la pantalla en modo de inactividad es habilitar el bloqueo de pantalla en modo de suspensión y hacer que <ph name="PRODUCT_OS_NAME" /> entre en modo de suspensión después del retraso de inactividad. Esta política solo debe utilizarse cuando el bloqueo se produce en un periodo de tiempo anterior a la suspensión o cuando no se quiere que se produzca la suspensión en modo de inactividad.
 
           El valor de la política se debe especificar en milisegundos. Los valores están establecidos para ser inferiores al retraso de inactividad.</translation>
 <translation id="891435090623616439">codificado como cadena JSON, consulta <ph name="COMPLEX_POLICIES_URL" /> para obtener más información</translation>
diff --git a/components/policy/resources/policy_templates_gu.xtb b/components/policy/resources/policy_templates_gu.xtb
index 228e284..a0543bd 100644
--- a/components/policy/resources/policy_templates_gu.xtb
+++ b/components/policy/resources/policy_templates_gu.xtb
@@ -1103,6 +1103,11 @@
 <translation id="5148753489738115745">તમને વધારાનાં પેરામીટર્સનો ઉલ્લેખ કરવાની મંજૂરી આપે છે જેનો ઉપયોગ <ph name="PRODUCT_FRAME_NAME" /> જ્યારે <ph name="PRODUCT_NAME" /> શરૂ કરે છે ત્યારે કરવામાં આવે છે.
 
           જો આ નીતિ સેટ કરેલી નથી, તો ડિફૉલ્ટ કમાન્ડ લાઇનનો ઉપયોગ કરવામાં આવશે</translation>
+<translation id="5159469559091666409">નિયમનકારી નેટવર્ક પૅકેટો કેટલા અંતરાલે મોકલવામાં આવે છે તે, મિલિસેકંડમાં.
+
+      જો આ નીતિ સેટ કરેલી ન હોય, તો ડિફૉલ્ટ અંતરાલ 3 મિનિટનો છે. ન્યૂનતમ
+      અંતરાલ 30 સેકંડનો અને મહત્તમ અંતરાલ 24 કલાકનો છે - આ શ્રેણીની
+      બહારના મૂલ્યો આ શ્રેણી સાથે જોડવામાં આવશે.</translation>
 <translation id="5182055907976889880"><ph name="PRODUCT_OS_NAME" /> માં Google ડ્રાઇવને ગોઠવો</translation>
 <translation id="5183383917553127163">કયા એક્સ્ટેંશન્સ બ્લેકલિસ્ટને પાત્ર નથી તેનો ઉલ્લેખ કરવાની મંજૂરી આપે છે.
 
diff --git a/components/policy/resources/policy_templates_kn.xtb b/components/policy/resources/policy_templates_kn.xtb
index a954f2b2..aea6a72 100644
--- a/components/policy/resources/policy_templates_kn.xtb
+++ b/components/policy/resources/policy_templates_kn.xtb
@@ -1035,6 +1035,9 @@
 <translation id="5148753489738115745"><ph name="PRODUCT_FRAME_NAME" /> <ph name="PRODUCT_NAME" /> ಅನ್ನು ಪ್ರಾರಂಭಿಸಿದಾಗ ಬಳಸಲಾಗುವ ಹೆಚ್ಚುವರಿ ಪ್ಯಾರಾಮೀಟರ್‌ಗಳನ್ನು ನಿರ್ದಿಷ್ಟಪಡಿಸಲು ನಿಮ್ಮನ್ನು ಅನುಮತಿಸುತ್ತದೆ.
 
          ಈ ನೀತಿಯನ್ನು ಹೊಂದಿಸದೇ ಇದ್ದರೆ ಡಿಫಾಲ್ಟ್ ಆದೇಶ ಸಾಲನ್ನು ಬಳಸಲಾಗುತ್ತದೆ.</translation>
+<translation id="5159469559091666409">ಮಿಲಿಸೆಕೆಂಡುಗಳಲ್ಲಿ, ನೆಟ್‌ವರ್ಕ್‌ ಪ್ಯಾಕೇಟ್‌ಗಳ ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡುವುದನ್ನು ಎಷ್ಟು ಬಾರಿ ಕಳುಹಿಸಲಾಗುತ್ತದೆ.
+      ಈ ನೀತಿಯನ್ನು ಹೊಂದಿಸದೇ ಇದ್ದರೆ, ಡಿಫಾಲ್ಟ್ ವಿರಾಮವು 3 ನಿಮಿಷಗಳಾಗಿರುತ್ತದೆ. ಕನಿಷ್ಠ ವಿರಾಮ 30 ಸೆಕೆಂಡುಗಳಾಗಿರುತ್ತದೆ ಮತ್ತು ಗರಿಷ್ಠ ವಿರಾಮ 24 ಗಂಟೆಗಳಾಗಿರುತ್ತದೆ - ಈ ವ್ಯಾಪ್ತಿಯ ಹೊರಗಿನ
+ಮೌಲ್ಯಗಳನ್ನು ಈ ವ್ಯಾಪ್ತಿಗೆ ಸೇರಿಸಲಾಗುತ್ತದೆ.</translation>
 <translation id="5182055907976889880"><ph name="PRODUCT_OS_NAME" /> ರಲ್ಲಿ Google ಡ್ರೈವ್ ಕಾನ್ಫಿಗರ್ ಮಾಡಿ.</translation>
 <translation id="5183383917553127163">ಯಾವ ವಿಸ್ತರಣೆಗಳು ಕಪ್ಪುಪಟ್ಟಿಗೆ ಒಳಪಡುವುದಿಲ್ಲ ಎಂದು ನಿರ್ದಿಷ್ಟಪಡಿಸಲು ನಿಮ್ಮನ್ನು ಅನುಮತಿಸುತ್ತದೆ.
 
diff --git a/components/policy/resources/policy_templates_ml.xtb b/components/policy/resources/policy_templates_ml.xtb
index 61b7abf..aa7f9b2 100644
--- a/components/policy/resources/policy_templates_ml.xtb
+++ b/components/policy/resources/policy_templates_ml.xtb
@@ -1118,6 +1118,11 @@
 <translation id="5148753489738115745"><ph name="PRODUCT_FRAME_NAME" />, <ph name="PRODUCT_NAME" /> എന്നത് സമാരംഭിക്കുമ്പോൾ ഉപയോഗിക്കുന്ന കൂടുതൽ പാരാമീറ്ററുകൾ വ്യക്തമാക്കുന്നതിന് നിങ്ങളെ അനുവദിക്കുന്നു .
 
           ഈ നയം സ്ഥിരസ്ഥിതിയായി സജ്ജമാക്കിയിട്ടില്ലെങ്കിൽ, കമാന്റ് ലൈൻ ഉപയോഗിക്കും.</translation>
+<translation id="5159469559091666409">മില്ലിസെക്കൻഡിനുള്ളിൽ എത്ര സമയം ഇടവിട്ടാണ് നെറ്റ്‌വർക്ക് പാക്കറ്റുകളുടെ നിരീക്ഷണവിവരം അയയ്‌ക്കുന്നത്.
+
+      ഈ നയം സജ്ജമാക്കിയിട്ടില്ലെങ്കിൽ, ഡിഫോൾട്ടായ ഇടവേള 3 മിനിറ്റ് ആണ്. ഏറ്റവും
+      കുറഞ്ഞ ഇടവേള 30 സെക്കൻഡും ഏറ്റവും കൂടിയ ഇടവേള 24 മണിക്കൂറുമാണ് - ഈ
+      പരിധിക്ക് പുറത്തുള്ള മൂല്യങ്ങളെ ഇതുമായി സംയോജിപ്പിക്കും.</translation>
 <translation id="5182055907976889880"><ph name="PRODUCT_OS_NAME" />-ൽ Google ഡ്രൈവ് കോൺഫിഗർ ചെയ്യുക.</translation>
 <translation id="5183383917553127163">അനുമതിയില്ലാത്ത ലിസ്റ്റിന്‌ ബാധകമല്ലാത്ത വിപുലീകരണങ്ങള്‍ നിര്‍ദേശിക്കാന്‍ നിങ്ങളെ അനുവദിക്കുന്നു.
 
diff --git a/components/policy/resources/policy_templates_mr.xtb b/components/policy/resources/policy_templates_mr.xtb
index d9055ec7..25db2424 100644
--- a/components/policy/resources/policy_templates_mr.xtb
+++ b/components/policy/resources/policy_templates_mr.xtb
@@ -1091,6 +1091,11 @@
 <translation id="5148753489738115745"><ph name="PRODUCT_FRAME_NAME" /> लाँच होते <ph name="PRODUCT_NAME" /> तेव्हा वापरले जाण्यासाठी अतिरिक्त मापदंड निर्दिष्ट करण्याची आपल्याला अनुमती देते.
 
           हे धोरण सेट न केल्यास डीफॉल्ट आदेश रेखा वापरली जाईल.</translation>
+<translation id="5159469559091666409">नेटवर्क पॅकेटचे परीक्षण मिलिसेकंदांमध्‍ये किती वारंवार पाठवले जाते.
+
+      हे धोरण सेट केलेले नसल्‍यास, डीफॉल्‍ट मध्यांतर 3 मिनिटे आहे. किमान
+      मध्यांतर 30 सेकंदांचे आणि कमाल मध्यांतर 24 तासांचे असते - 
+या श्रेणीच्या बाहेरील मूल्ये या श्रेणीमध्‍ये जोडली जातील.</translation>
 <translation id="5182055907976889880"><ph name="PRODUCT_OS_NAME" /> मध्ये Google ड्राइव्ह कॉन्फिगर करा.</translation>
 <translation id="5183383917553127163">काळ्यासूचीच्या अधीन नसलेला विस्तार निर्दिष्ट करण्याची आपल्याला परवानगी देते
 
diff --git a/components/policy/resources/policy_templates_pt-PT.xtb b/components/policy/resources/policy_templates_pt-PT.xtb
index d0cf3f23..012e69e 100644
--- a/components/policy/resources/policy_templates_pt-PT.xtb
+++ b/components/policy/resources/policy_templates_pt-PT.xtb
@@ -88,7 +88,7 @@
       Se esta política for definida como falsa, o <ph name="PRODUCT_NAME" /> não permite que os perfis de convidado sejam iniciados.</translation>
 <translation id="1363275621236827384">Ativar consultas ao Quirks Server para perfis de hardware</translation>
 <translation id="1397855852561539316">URL de sugestão do fornecedor de pesquisas padrão</translation>
-<translation id="1398889361882383850">Permite-lhe definir se os Websites têm automaticamente permissão para executar plug-ins. Os plug-ins automaticamente em execução podem ser permitidos para todos os Websites ou negados para todos os Websites.
+<translation id="1398889361882383850">Permite-lhe definir se os Sites têm automaticamente permissão para executar plug-ins. Os plug-ins automaticamente em execução podem ser permitidos para todos os Sites ou negados para todos os Sites.
 
           Clicar para reproduzir permite a execução de plug-ins, mas o utilizador deve clicar sobre eles para iniciar a sua execução.
 
@@ -430,7 +430,7 @@
 <translation id="2529880111512635313">Configurar a lista de aplicações e extensões de instalação forçada</translation>
 <translation id="253135976343875019">Atraso do aviso de inatividade quando o dispositivo está ligado à eletricidade</translation>
 <translation id="2552966063069741410">Fuso Horário</translation>
-<translation id="2558917182010914102">Se esta política estiver definida como verdadeira ou não estiver definida, o Google Cast está ativado e os utilizadores podem iniciá-lo a partir do menu da aplicação, dos menus de contexto da página, dos controlos multimédia nos Websites compatíveis com o Google Cast e (se apresentado) do ícone da barra de ferramentas do Google Cast.
+<translation id="2558917182010914102">Se esta política estiver definida como verdadeira ou não estiver definida, o Google Cast está ativado e os utilizadores podem iniciá-lo a partir do menu da aplicação, dos menus de contexto da página, dos controlos multimédia nos Sites compatíveis com o Google Cast e (se apresentado) do ícone da barra de ferramentas do Google Cast.
 
           Se esta política estiver definida como falsa, o Google Cast está desativado.</translation>
 <translation id="2562339630163277285">Especifica o URL do motor de pesquisa utilizado para apresentar resultados instantâneos. O URL deve incluir a string <ph name="SEARCH_TERM_MARKER" />, que, no momento da consulta, será substituída pelo texto que o utilizador tenha introduzido.
@@ -828,7 +828,7 @@
 <translation id="4039085364173654945">Controla se o subconteúdo de terceiros numa página tem permissão para apresentar uma caixa de diálogo de Autenticação Básica de HTTP. Normalmente, esta definição está desativada como uma defesa contra phishing. Se esta política não for definida, a definição será desativada e o subconteúdo de terceiros não terá permissão para apresentar uma caixa de diálogo de Autenticação Básica de HTTP.</translation>
 <translation id="4056910949759281379">Desativar o protocolo SPDY</translation>
 <translation id="4088589230932595924">Modo de navegação anónima forçado</translation>
-<translation id="4088983553732356374">Permite-lhe definir se os Websites estão autorizados a definir dados locais. A definição dos dados locais pode ser autorizada para todos os Websites ou negada para todos os Websites.
+<translation id="4088983553732356374">Permite-lhe definir se os Sites estão autorizados a definir dados locais. A definição dos dados locais pode ser autorizada para todos os Sites ou negada para todos os Sites.
 
           Se esta política estiver definida como "Manter cookies durante toda a sessão", os cookies são apagados quando a sessão for fechada. Tenha em atenção que se o <ph name="PRODUCT_NAME" /> estiver em execução no "modo de segundo plano", a sessão pode não ser fechada quando a última janela for fechada. Consulte a política "BackgroundModeEnabled" para obter mais informações acerca da configuração deste comportamento.
 
@@ -1399,7 +1399,7 @@
           Se esta política não for definida, o teclado no ecrã é desativado quando o ecrã de início de sessão é apresentado pela primeira vez. Os utilizadores podem ativar ou desativar o teclado no ecrã a qualquer momento e o seu estado no ecrã de início de sessão persiste entre utilizadores.</translation>
 <translation id="6573305661369899995">Definir uma fonte externa de restrições de URL</translation>
 <translation id="6598235178374410284">Imagem do avatar do utilizador</translation>
-<translation id="6628646143828354685">Permite definir se os Websites estão autorizados a obter acesso a dispositivos Bluetooth próximos. É possível bloquear completamente o acesso ou o utilizador pode ser consultado sempre que um Website pretenda obter acesso a dispositivos Bluetooth próximos.
+<translation id="6628646143828354685">Permite definir se os Sites estão autorizados a obter acesso a dispositivos Bluetooth próximos. É possível bloquear completamente o acesso ou o utilizador pode ser consultado sempre que um Website pretenda obter acesso a dispositivos Bluetooth próximos.
 
           Se esta política não for definida, é utilizada a definição "3" e o utilizador pode alterá-la.</translation>
 <translation id="6641981670621198190">Desativar o suporte para APIs de gráficos 3D</translation>
@@ -1889,7 +1889,7 @@
 <translation id="8300455783946254851">Desativa a sincronização do Google Drive na aplicação Ficheiros do <ph name="PRODUCT_OS_NAME" /> ao utilizar uma rede móvel e a definição de verdadeiro. Nesse caso, os dados só são sincronizados com o Google Drive quando estiver ligado por Wi-Fi ou Ethernet.
 
           Se não estiver definido ou estiver definido como falso, os utilizadores poderão transferir ficheiros para o Google Drive através de redes móveis.</translation>
-<translation id="8312129124898414409">Permite definir se os Websites estão autorizados a utilizar a geração de chaves. É possível permitir a geração de chaves para todos os Websites ou negá-la para todos os Websites.
+<translation id="8312129124898414409">Permite definir se os Sites estão autorizados a utilizar a geração de chaves. É possível permitir a geração de chaves para todos os Sites ou negá-la para todos os Sites.
           Se esta política não for definida, é utilizada a opção "BlockKeygen" e o utilizador pode alterá-la.</translation>
 <translation id="8316806736175990584">Configura o tipo da página inicial predefinida no <ph name="PRODUCT_NAME" /> e impede que os utilizadores alterem as preferências da página inicial. A página inicial pode ser definida como um URL que especifique ou definida como a página Novo separador.
 
@@ -2021,7 +2021,7 @@
 <translation id="8864975621965365890">Suprime o pedido de recusa que aparece quando um site é convertido por <ph name="PRODUCT_FRAME_NAME" />.</translation>
 <translation id="8870318296973696995">Página inicial</translation>
 <translation id="8906768759089290519">Ativar o modo de convidado</translation>
-<translation id="8908294717014659003">Permite-lhe definir se os Websites podem aceder a dispositivos de captura de multimédia. O acesso a dispositivos de captura de multimédia pode ser autorizado por predefinição ou o utilizador pode ser consultado sempre que um Website pretenda obter acesso a dispositivos de captura de multimédia.
+<translation id="8908294717014659003">Permite-lhe definir se os Sites podem aceder a dispositivos de captura de multimédia. O acesso a dispositivos de captura de multimédia pode ser autorizado por predefinição ou o utilizador pode ser consultado sempre que um Website pretenda obter acesso a dispositivos de captura de multimédia.
 
           Se deixar esta política por definir, será utilizado o "PromptOnAccess" e o utilizador poderá alterá-la.</translation>
 <translation id="8909280293285028130">Especifica o período de tempo sem atividade por parte do utilizador após o qual o ecrã é bloqueado quando o dispositivo está ligado à eletricidade.
diff --git a/components/policy/resources/policy_templates_te.xtb b/components/policy/resources/policy_templates_te.xtb
index 294ba69b..983bdd4 100644
--- a/components/policy/resources/policy_templates_te.xtb
+++ b/components/policy/resources/policy_templates_te.xtb
@@ -1065,6 +1065,9 @@
 <translation id="5148753489738115745"><ph name="PRODUCT_FRAME_NAME" /> <ph name="PRODUCT_NAME" />ను ప్రారంభించినప్పుడు ఉపయోగించే అదనపు పరామితులను పేర్కొనడానికి మిమ్మల్ని అనుమతిస్తుంది.
 
           ఈ విధానాన్ని సెట్ చేయకపోతే డిఫాల్ట్ ఆదేశ పంక్తి ఉపయోగించబడుతుంది.</translation>
+<translation id="5159469559091666409">పర్యవేక్షిత నెట్‌వర్క్ ప్యాకెట్‌లు పంపబడే సమయ వ్యవధి, మిల్లీసెకన్లలో ఉండాలి.
+
+      ఈ విధానాన్ని సెట్ చేయకుంటే, డిఫాల్ట్ సమయ వ్యవధి 3 నిమిషాలు ఉంటుంది. దీని కనీస సమయ వ్యవధి 30 సెకన్లు మరియు గరిష్ట సమయ వ్యవధి 24 గంటలు - ఈ పరిధిని విలువలు దాటితే నిర్బంధంగా ఈ పరిధిలోకి మార్చబడతాయి.</translation>
 <translation id="5182055907976889880"><ph name="PRODUCT_OS_NAME" />లో Google డిస్క్‌ని కాన్ఫిగర్ చేయండి.</translation>
 <translation id="5183383917553127163">ఆమోదంకానిజాబితాకి సంబంధించని పొడిగింపులని పేర్కొనడానికి మిమ్మల్ని అనుమతిస్తుంది.
 
diff --git a/components/policy/resources/policy_templates_th.xtb b/components/policy/resources/policy_templates_th.xtb
index 97319de8..be0fa9d 100644
--- a/components/policy/resources/policy_templates_th.xtb
+++ b/components/policy/resources/policy_templates_th.xtb
@@ -24,7 +24,7 @@
 
       หากตั้งค่านโยบายเป็น False จะไม่มีการรายงานสถิติ
       หากตั้งค่าเป็น True หรือไม่ตั้งค่า จะมีการรายงานสถิติ</translation>
-<translation id="1046484220783400299">เปิดใช้คุณลักษณะแพลตฟอร์มของเว็บที่เลิกใช้แล้วเป็นเวลาจำกัด</translation>
+<translation id="1046484220783400299">เปิดใช้ฟีเจอร์แพลตฟอร์มของเว็บที่เลิกใช้แล้วเป็นเวลาจำกัด</translation>
 <translation id="1047128214168693844">ไม่อนุญาตให้ไซต์ใดๆ ติดตามตำแหน่งทางกายภาพของผู้ใช้</translation>
 <translation id="1049138910114524876">กำหนดค่าภาษาที่จะบังคับใช้ในหน้าจอการลงชื่อเข้าใช้ของ <ph name="PRODUCT_OS_NAME" />
 
@@ -112,7 +112,7 @@
 
       หากไม่กำหนดค่านโยบายนี้ ค่าเริ่มต้น "MultiProfileUserBehaviorMustBePrimary" จะนำไปใช้กับผู้ใช้ที่ได้รับการจัดการโดยองค์กรและ "MultiProfileUserBehaviorUnrestricted" จะนำไปใช้กับผู้ใช้ที่ไม่ได้รับการจัดการ</translation>
 <translation id="1465619815762735808">คลิกเพื่อเล่น</translation>
-<translation id="1468307069016535757">ตั้งค่าสถานะเริ่มต้นของคุณลักษณะการเข้าถึงโหมดคอนทราสต์สูงบนหน้าจอการเข้าสู่ระบบ
+<translation id="1468307069016535757">ตั้งค่าสถานะเริ่มต้นของฟีเจอร์การเข้าถึงโหมดคอนทราสต์สูงบนหน้าจอการเข้าสู่ระบบ
 
           หากนโยบายนี้ถูกตั้งค่าเป็น "จริง" โหมดคอนทราสต์สูงจะถูกเปิดใช้งานเมื่อหน้าจอการเข้าสู่ระบบแสดงขึ้น
 
@@ -126,7 +126,7 @@
       ผู้ใช้อาจปิดใช้เดสก์ท็อปแบบรวมหลายหน้าจอสำหรับหน้าจอบางหน้าได้โดยยกเลิกการทำเครื่องหมาย
       หน้าจอนั้นๆ ในการตั้งค่าการแสดงผล
       หากนโยบายนี้ตั้งค่าเป็นเท็จหรือไม่ได้ตั้งค่า เดสก์ท็อปแบบรวมหลายหน้าจอจะ
-      ปิดใช้งาน ซึ่งในกรณีนี้ ผู้ใช้จะเปิดใช้งานคุณลักษณะนี้ไม่ได้</translation>
+      ปิดใช้งาน ซึ่งในกรณีนี้ ผู้ใช้จะเปิดใช้งานฟีเจอร์นี้ไม่ได้</translation>
 <translation id="1474273443907024088">ปิดใช้ TLS False Start</translation>
 <translation id="1477934438414550161">TLS 1.2</translation>
 <translation id="1484146587843605071"><ph name="PRODUCT_NAME" /> จะข้ามพร็อกซีของของโฮสต์ในรายการที่ให้ไว้ในที่นี้
@@ -377,7 +377,7 @@
       เครื่องพิมพ์ต่างๆ ที่เชื่อมต่อกับ <ph name="CLOUD_PRINT_NAME" /> จะถือว่าเป็น <ph name="PRINTER_TYPE_CLOUD" /> เครื่องพิมพ์ที่เหลือจะจัดประเภทเป็น <ph name="PRINTER_TYPE_LOCAL" />
       การข้ามช่องใดช่องหนึ่งไปแสดงว่าค่าทั้งหมดตรง ตัวอย่างเช่น การไม่ระบุการเชื่อมต่อจะทำให้การแสดงตัวอย่างก่อนพิมพ์เริ่มการค้นหาเครื่องพิมพ์ทุกประเภท ทั้งเครื่องพิมพ์ที่ต่อกับระบบและในระบบคลาวด์
       รูปแบบนิพจน์ทั่วไปต้องเป็นไปตามไวยากรณ์ JavaScript RegExp และการจับคู่จะคำนึงถึงตัวพิมพ์อักษรเล็กและใหญ่</translation>
-<translation id="2426782419955104525">เปิดใช้คุณลักษณะค้นหาทันใจของ <ph name="PRODUCT_NAME" /> และป้องกันไม่ให้ผู้ใช้เปลี่ยนการตั้งค่านี้
+<translation id="2426782419955104525">เปิดใช้ฟีเจอร์ค้นหาทันใจของ <ph name="PRODUCT_NAME" /> และป้องกันไม่ให้ผู้ใช้เปลี่ยนการตั้งค่านี้
 
       หากคุณเปิดใช้การตั้งค่านี้ <ph name="PRODUCT_NAME" /> จะมีการเปิดใช้ "ค้นหาทันใจ"
 
@@ -411,7 +411,7 @@
 
       หากนโยบายนี้มีการตั้งค่าเป็น "เท็จ" ข้อความแสดงข้อผิดพลาดจะปรากฏขึ้นแทนพรอมต์การกำหนดค่าเครือข่าย</translation>
 <translation id="2498238926436517902">ซ่อนชั้นวางอัตโนมัติเสมอ</translation>
-<translation id="2503514368596117142">กำหนดค่านโยบายต่างๆ สำหรับ Google Cast ซึ่งเป็นคุณลักษณะที่ให้ผู้ใช้ส่งเนื้อหาในแท็บ ไซต์ หรือเดสก์ท็อปจากเบราว์เซอร์ไปยังจอแสดงผลและระบบเสียงระยะไกลได้</translation>
+<translation id="2503514368596117142">กำหนดค่านโยบายต่างๆ สำหรับ Google Cast ซึ่งเป็นฟีเจอร์ที่ให้ผู้ใช้ส่งเนื้อหาในแท็บ ไซต์ หรือเดสก์ท็อปจากเบราว์เซอร์ไปยังจอแสดงผลและระบบเสียงระยะไกลได้</translation>
 <translation id="2514328368635166290">ระบุ URL ไอคอนที่ชื่นชอบของผู้ให้บริการการค้นหาเริ่มต้น นโยบายนี้เป็นทางเลือก หากไม่ได้ตั้งค่า จะไม่มีการแสดงไอคอนสำหรับผู้ให้บริการการค้นหา นโยบายนี้จะใช้เฉพาะในกรณีที่มีการเปิดใช้งานนโยบาย "DefaultSearchProviderEnabled" เท่านั้น</translation>
 <translation id="2516600974234263142">ช่วยให้สามารถพิมพ์ใน <ph name="PRODUCT_NAME" /> และป้องกันไม่ให้ผู้ใช้เปลี่ยนการตั้งค่านี้
 
@@ -444,7 +444,7 @@
 <translation id="2571066091915960923">เปิดใช้หรือปิดใช้พร็อกซีการบีบอัดข้อมูล และป้องกันไม่ให้ผู้ใช้เปลี่ยนการตั้งค่านี้
       หากคุณเปิดใช้หรือปิดใช้การตั้งค่านี้ ผู้ใช้จะไม่สามารถเปลี่ยนหรือโอเวอร์ไรด์การตั้งค่านี้
 
-      หากนโยบายนี้ไม่ได้ตั้งค่า คุณลักษณะพร็อกซีการบีบอัดข้อมูลจะพร้อมใช้งานสำหรับให้ผู้ใช้เลือกว่าจะใช้หรือไม่ใช้</translation>
+      หากนโยบายนี้ไม่ได้ตั้งค่า ฟีเจอร์พร็อกซีการบีบอัดข้อมูลจะพร้อมใช้งานสำหรับให้ผู้ใช้เลือกว่าจะใช้หรือไม่ใช้</translation>
 <translation id="2587719089023392205">ตั้ง <ph name="PRODUCT_NAME" /> เป็นเบราว์เซอร์เริ่มต้น</translation>
 <translation id="2592091433672667839">ระยะเวลาการไม่ใช้งานก่อนที่โปรแกรมรักษาหน้าจอจะแสดงขึ้นบนหน้าจอลงชื่อเข้าใช้ในโหมดปลีก</translation>
 <translation id="2623014935069176671">รอกิจกรรมเริ่มต้นของผู้ใช้</translation>
@@ -460,7 +460,7 @@
 <translation id="2660846099862559570">ไม่ใช้พร็อกซี</translation>
 <translation id="267596348720209223">กำหนดการเข้ารหัสตัวอักษรที่สนับสนุนโดยผู้ให้บริการการค้นหา การเข้ารหัสหมายถึงชื่อหน้ารหัสอย่างเช่น UTF-8, GB2312 และ ISO-8859-1 โดยมีการนำมาใช้ตามลำดับที่ให้มา นโยบายนี้เป็นทางเลือก หากไม่ตั้งค่าไว้ จะมีการใช้ค่าเริ่มต้นซึ่งก็คือ UTF-8 นโยบายนี้จะใช้เฉพาะในกรณีที่มีการเปิดใช้งานนโยบาย "DefaultSearchProviderEnabled" เท่านั้น</translation>
 <translation id="2682225790874070339">ปิดใช้ไดรฟ์ในแอป Files ของ <ph name="PRODUCT_OS_NAME" /></translation>
-<translation id="268577405881275241">เปิดใช้คุณลักษณะพร็อกซีการบีบอัดข้อมูล</translation>
+<translation id="268577405881275241">เปิดใช้ฟีเจอร์พร็อกซีการบีบอัดข้อมูล</translation>
 <translation id="2731627323327011390">ปิดการใช้งานใบรับรอง <ph name="PRODUCT_OS_NAME" /> สำหรับแอป ARC</translation>
 <translation id="2742843273354638707">ซ่อนแอป Chrome เว็บสโตร์ และลิงก์ส่วนท้ายจากหน้าแท็บใหม่ และเครื่องเรียกใช้งานแอป <ph name="PRODUCT_OS_NAME" />
 
@@ -482,7 +482,7 @@
 
       แต่ละข้อมูลในรายการจะระบุตัวชี้ ซึ่งใช้ภายในสำหรับการแยกบัญชีภายในอุปกรณ์จากกัน</translation>
 <translation id="2769952903507981510">กำหนดค่าชื่อโดเมนที่จำเป็นสำหรับโฮสต์การเข้าถึงระยะไกล</translation>
-<translation id="2785954641789149745">เปิดใช้งานคุณลักษณะ Google Safe Browsing ของ <ph name="PRODUCT_NAME" /> และป้องกันไม่ให้ผู้ใช้เปลี่ยนการตั้งค่านี้
+<translation id="2785954641789149745">เปิดใช้งานฟีเจอร์ Google Safe Browsing ของ <ph name="PRODUCT_NAME" /> และป้องกันไม่ให้ผู้ใช้เปลี่ยนการตั้งค่านี้
 
       หากคุณเปิดใช้งานการตั้งค่านี้ Google Safe Browsing จะใช้งานอยู่เสมอ
 
@@ -509,7 +509,7 @@
 <translation id="2824715612115726353">เปิดใช้งานโหมดไม่ระบุตัวตน</translation>
 <translation id="2844404652289407061">เปิดใช้ตัวเลือก "แตะเพื่อค้นหา" ในมุมมองเนื้อหาของ <ph name="PRODUCT_NAME" />
 
-      หากคุณเปิดใช้การตั้งค่านี้ แตะเพื่อค้นหาจะมีให้ผู้ใช้เลือกใช้ ผู้ใช้สามารถเลือกว่าจะเปิดหรือปิดคุณลักษณะนี้ได้
+      หากคุณเปิดใช้การตั้งค่านี้ แตะเพื่อค้นหาจะมีให้ผู้ใช้เลือกใช้ ผู้ใช้สามารถเลือกว่าจะเปิดหรือปิดฟีเจอร์นี้ได้
 
       หากคุณปิดใช้การตั้งค่านี้ แตะเพื่อค้นหาจะถูกปิดใช้ทั้งหมด
 
@@ -727,7 +727,7 @@
 <translation id="3805659594028420438">เปิดใช้ส่วนขยายใบรับรองที่ผูกกับโดเมน TLS (เลิกใช้แล้ว)</translation>
 <translation id="3808945828600697669">ระบุรายการปลั๊กอินที่ปิดใช้งาน</translation>
 <translation id="3816312845600780067">เปิดใช้งานแป้นพิมพ์ลัด bailout สำหรับการเข้าสู่ระบบอัตโนมัติ</translation>
-<translation id="3820526221169548563">เปิดใช้คุณลักษณะการเข้าถึงแป้นพิมพ์บนหน้าจอ
+<translation id="3820526221169548563">เปิดใช้ฟีเจอร์การเข้าถึงแป้นพิมพ์บนหน้าจอ
 
           หากตั้งค่านโยบายเป็น "จริง" จะมีการเปิดแป้นพิมพ์บนหน้าจอไว้เสมอ
 
@@ -890,13 +890,13 @@
 
       หากมีการกำหนดค่านโยบายนี้ ผู้ใช้จะไม่สามารถเปลี่ยนแปลงได้ และทางลัดของแอปจะแสดงเสมอหรือไม่แสดงเลย</translation>
 <translation id="443665821428652897">ล้างข้อมูลไซต์เมื่อปิดเบราว์เซอร์ (เลิกใช้งานแล้ว)</translation>
-<translation id="4439336120285389675">ระบุรายชื่อคุณลักษณะของเว็บแพลตฟอร์มที่เลิกใช้แล้วเพื่อเปิดใช้ใหม่ชั่วคราว
+<translation id="4439336120285389675">ระบุรายชื่อฟีเจอร์ของเว็บแพลตฟอร์มที่เลิกใช้แล้วเพื่อเปิดใช้ใหม่ชั่วคราว
 
-      นโยบายนี้จะทำให้ผู้ดูแลระบบสามารถเปิดใช้คุณลักษณะของเว็บแพลตฟอร์มซึ่งเลิกใช้ไปแล้วได้ใหม่อีกครั้งครั้งในเวลาจำกัด คุณลักษณะเหล่านี้จะระบุโดยสตริงแท็ก ซึ่งคุณลักษณะที่สอดคล้องกับแท็กที่มีอยู่ในรายการที่นโยบายนี้กำหนดจะถูกเปิดใช้อีกครั้ง
+      นโยบายนี้จะทำให้ผู้ดูแลระบบสามารถเปิดใช้ฟีเจอร์ของเว็บแพลตฟอร์มซึ่งเลิกใช้ไปแล้วได้ใหม่อีกครั้งครั้งในเวลาจำกัด ฟีเจอร์เหล่านี้จะระบุโดยสตริงแท็ก ซึ่งฟีเจอร์ที่สอดคล้องกับแท็กที่มีอยู่ในรายการที่นโยบายนี้กำหนดจะถูกเปิดใช้อีกครั้ง
 
-      หากไม่ตั้งค่านโยบายนี้ ไม่มีข้อมูลในรายการ หรือไม่ตรงกับสตริงแท็กที่สนับสนุนใดๆ คุณลักษณะของเว็บแพลตฟอร์มที่เลิกใช้แล้วทั้งหมดจะยังถูกปิดใช้
+      หากไม่ตั้งค่านโยบายนี้ ไม่มีข้อมูลในรายการ หรือไม่ตรงกับสตริงแท็กที่สนับสนุนใดๆ ฟีเจอร์ของเว็บแพลตฟอร์มที่เลิกใช้แล้วทั้งหมดจะยังถูกปิดใช้
 
-      แม้ตัวนโยบายจะได้รับการสนับสนุนบนแพลตฟอร์มข้างต้น แต่คุณลักษณะที่นโยบายเปิดใช้อาจใช้ได้บนแพลตฟอร์มไม่กี่แห่ง คุณลักษณะเว็บแพลตฟอร์มที่เลิกใช้แล้วบางรายการอาจไม่สามารถเปิดใช้ได้อีก เฉพาะคุณลักษณะที่ระบุไว้อย่างชัดเจนด้านล่างเท่านั้นที่สามารถเปิดใช้ได้อีกภายในช่วงเวลาจำกัด ซึ่งจะแตกต่างกันไปตามคุณลักษณะ รูปแบบของสตริงแท็กทั่วไปคือ [DeprecatedFeatureName]_EffectiveUntil[yyyymmdd] ตามข้อมูลอ้างอิง คุณสามารถค้นหาเจตนาในการเปลี่ยนแปลงคุณลักษณะเว็บแพลตฟอร์มได้ที่ https://bit.ly/blinkintents
+      แม้ตัวนโยบายจะได้รับการสนับสนุนบนแพลตฟอร์มข้างต้น แต่ฟีเจอร์ที่นโยบายเปิดใช้อาจใช้ได้บนแพลตฟอร์มไม่กี่แห่ง ฟีเจอร์เว็บแพลตฟอร์มที่เลิกใช้แล้วบางรายการอาจไม่สามารถเปิดใช้ได้อีก เฉพาะฟีเจอร์ที่ระบุไว้อย่างชัดเจนด้านล่างเท่านั้นที่สามารถเปิดใช้ได้อีกภายในช่วงเวลาจำกัด ซึ่งจะแตกต่างกันไปตามฟีเจอร์ รูปแบบของสตริงแท็กทั่วไปคือ [DeprecatedFeatureName]_EffectiveUntil[yyyymmdd] ตามข้อมูลอ้างอิง คุณสามารถค้นหาเจตนาในการเปลี่ยนแปลงฟีเจอร์เว็บแพลตฟอร์มได้ที่ https://bit.ly/blinkintents
       </translation>
 <translation id="4442582539341804154">เปิดใช้งานการล็อกเมื่อไม่ได้ใช้งานหรือระงับใช้อุปกรณ์</translation>
 <translation id="4449545651113180484">หมุนหน้าจอตามเข็มนาฬิกา 270 องศา</translation>
@@ -945,7 +945,7 @@
 <translation id="465099050592230505">URL เว็บสโตร์ขององค์กร (เลิกใช้งาน)</translation>
 <translation id="4665897631924472251">การตั้งค่าการจัดการส่วนขยาย</translation>
 <translation id="4668325077104657568">การตั้งค่าภาพเริ่มต้น</translation>
-<translation id="467236746355332046">คุณลักษณะที่ได้รับการสนับสนุน:</translation>
+<translation id="467236746355332046">ฟีเจอร์ที่ได้รับการสนับสนุน:</translation>
 <translation id="4674167212832291997">กำหนดรายการรูปแบบ URL ที่ควรแสดงผลโดย <ph name="PRODUCT_FRAME_NAME" /> ทุกครั้ง
 
           หากไม่ได้ตั้งค่านโยบายนี้ ระบบจะใช้ตัวแสดงผลเริ่มต้นกับเว็บไซต์ทั้งหมดตามที่ได้กำหนดไว้ในนโยบาย "ChromeFrameRendererSettings"
@@ -967,7 +967,7 @@
 
           หากคุณปล่อยนโยบายนี้ไว้โดยไม่มีการตั้งค่า <ph name="PRODUCT_NAME" /> จะไม่มอบสิทธิ์ข้อมูลรับรองผู้ใช้ แม้จะตรวจพบว่าเซิร์ฟเวอร์เป็นอินทราเน็ตก็ตาม</translation>
 <translation id="4752880493649142945">ใบรับรองไคลเอ็นต์สำหรับการเชื่อมต่อกับ RemoteAccessHostTokenValidationUrl</translation>
-<translation id="4791031774429044540">เปิดใช้งานคุณลักษณะการเข้าถึงเคอร์เซอร์ขนาดใหญ่
+<translation id="4791031774429044540">เปิดใช้งานฟีเจอร์การเข้าถึงเคอร์เซอร์ขนาดใหญ่
 
           หากนโยบายนี้ถูกตั้งค่าเป็น "จริง" เคอร์เซอร์ขนาดใหญ่จะถูกเปิดใช้งานเสมอ
 
@@ -1201,7 +1201,7 @@
       หากไม่มีการตั้งค่านี้ ระบบจะใช้ไดเรกทอรีโปรไฟล์เริ่มต้น</translation>
 <translation id="5826047473100157858">กำหนดว่าผู้ใช้สามารถจะเปิดหน้าเว็บในโหมดไม่ระบุตัวตนใน <ph name="PRODUCT_NAME" /> ได้หรือไม่ หากเลือก "เปิดใช้งาน" หรือไม่ได้ตั้งค่านโยบายไว้ จะสามารถเปิดหน้าเว็บในโหมดไม่ระบุตัวตนได้ หากเลือก "ปิดใช้งาน" ผู้ใช้จะไม่สามารถเปิดหน้าเว็บในโหมดไม่ระบุตัวตนได้ หากเลือก "บังคับ" หน้าเว็บจะเปิดขึ้นได้ในโหมดไม่ระบุตัวตนเท่านั้น</translation>
 <translation id="5836064773277134605">จำกัดช่วงพอร์ต UDP ที่ใช้โดยโฮสต์การเข้าถึงระยะไกล</translation>
-<translation id="5862253018042179045">ตั้งค่าสถานะเริ่มต้นของคุณลักษณะการเข้าถึงเสียงพูดตอบรับบนหน้าจอการเข้าสู่ระบบ
+<translation id="5862253018042179045">ตั้งค่าสถานะเริ่มต้นของฟีเจอร์การเข้าถึงเสียงพูดตอบรับบนหน้าจอการเข้าสู่ระบบ
 
           หากนโยบายนี้ถูกตั้งค่าเป็น "จริง" เสียงพูดตอบรับจะถูกเปิดใช้งานเมื่อหน้าจอการเข้าสู่ระบบแสดง
 
@@ -1239,7 +1239,7 @@
       หากตั้งค่าเป็น False จะไม่มีการควบคุมการใช้งานเครือข่าย
       หากตั้งค่าเป็น True ระบบจะถูกควบคุมการใช้งานเครือข่ายเพื่อให้ได้อัตราการอัปโหลดและดาวน์โหลดที่ระบุไว้ (หน่วยเป็น kbits/s)</translation>
 <translation id="5921713479449475707">อนุญาตการดาวน์โหลดการอัปเดตอัตโนมัติผ่านทาง HTTP</translation>
-<translation id="5921888683953999946">ตั้งค่าสถานะเริ่มต้นของคุณลักษณะการเข้าถึงเคอร์เซอร์ขนาดใหญ่บนหน้าจอการเข้าสู่ระบบ
+<translation id="5921888683953999946">ตั้งค่าสถานะเริ่มต้นของฟีเจอร์การเข้าถึงเคอร์เซอร์ขนาดใหญ่บนหน้าจอการเข้าสู่ระบบ
 
           หากนโยบายนี้มีการตั้งค่าเป็น "จริง" เคอร์เซอร์ขนาดใหญ่จะถูกเปิดใช้งานเมื่อหน้าจอการเข้าสู่ระบบแสดงขึ้น
 
@@ -1342,7 +1342,7 @@
 <translation id="637934607141010488">รายงานรายชื่อผู้ใช้อุปกรณ์ที่เข้าสู่ระบบเมื่อเร็วๆ นี้
 
       หากตั้งค่านโยบายนี้เป็น False จะไม่มีการรายงานผู้ใช้</translation>
-<translation id="6392973646875039351">เปิดใช้งานคุณลักษณะป้อนอัตโนมัติของ <ph name="PRODUCT_NAME" /> และช่วยให้ผู้ใช้กรอกข้อมูลเว็บฟอร์มอัตโนมัติโดยใช้ข้อมูลที่เก็บไว้ก่อนหน้านี้ เช่น ที่อยู่หรือข้อมูลบัตรเครดิต หากคุณปิดใช้งานการตั้งค่านี้ ผู้ใช้จะใช้งานการป้อนอัตโนมัติไม่ได้ หากคุณเปิดใช้งานการตั้งค่านี้หรือไม่ได้กำหนดค่า การป้อนอัตโนมัติจะอยู่ภายใต้การควบคุมของผู้ใช้ ซึ่งจะช่วยให้ผู้ใช้สามารถกำหนดค่าโปรไฟล์ป้อนอัตโนมัติและปิดหรือเปิดการป้อนอัตโนมัติได้ตามที่ผู้ใช้เห็นสมควร</translation>
+<translation id="6392973646875039351">เปิดใช้งานฟีเจอร์ป้อนอัตโนมัติของ <ph name="PRODUCT_NAME" /> และช่วยให้ผู้ใช้กรอกข้อมูลเว็บฟอร์มอัตโนมัติโดยใช้ข้อมูลที่เก็บไว้ก่อนหน้านี้ เช่น ที่อยู่หรือข้อมูลบัตรเครดิต หากคุณปิดใช้งานการตั้งค่านี้ ผู้ใช้จะใช้งานการป้อนอัตโนมัติไม่ได้ หากคุณเปิดใช้งานการตั้งค่านี้หรือไม่ได้กำหนดค่า การป้อนอัตโนมัติจะอยู่ภายใต้การควบคุมของผู้ใช้ ซึ่งจะช่วยให้ผู้ใช้สามารถกำหนดค่าโปรไฟล์ป้อนอัตโนมัติและปิดหรือเปิดการป้อนอัตโนมัติได้ตามที่ผู้ใช้เห็นสมควร</translation>
 <translation id="6394350458541421998">นโยบายนี้ได้ถูกยกเลิกไปตั้งแต่ <ph name="PRODUCT_OS_NAME" /> เวอร์ชัน 29 โปรดใช้นโยบาย PresentationScreenDimDelayScale แทน</translation>
 <translation id="6401669939808766804">ออกจากระบบให้ผู้ใช้</translation>
 <translation id="6417861582779909667">ช่วยให้คุณกำหนดรายการของรูปแบบ URL ที่ระบุไซต์ที่ไม่ได้รับอนุญาตให้ตั้งค่าคุกกี้ หากนโยบายนี้ไม่มีการตั้งค่าไว้ จะใช้ค่าเริ่มต้นของทั่วโลกสำหรับไซต์ทั้งหมด ทั้งจากนโยบาย "DefaultCookiesSetting" หากมีการตั้งค่าไว้ หรือจากการกำหนดค่าส่วนบุคคลของผู้ใช้</translation>
@@ -1376,7 +1376,7 @@
       ช่องที่ผู้ใช้เลือกจะถูกแทนที่โดยนโยบาย ChromeOsReleaseChannel แต่ถ้าช่องนโยบายมีความเสถียรมากกว่าช่องที่ติดตั้งบนอุปกรณ์ ช่องดังกล่าวจะเปิด/ปิดใช้งานหลังจากที่ช่องที่เสถียรมากกว่าอัปเกรดไปจนถึงรุ่นที่สูงกว่าช่องที่ติดตั้งบนอุปกรณ์</translation>
 <translation id="6559057113164934677">ไม่อนุญาตให้ไซต์ใดๆ เข้าถึงกล้องและไมโครโฟน</translation>
 <translation id="6561396069801924653">แสดงตัวเลือกการเข้าถึงในเมนูถาดระบบ</translation>
-<translation id="6565312346072273043">ตั้งสถานะเริ่มต้นของคุณลักษณะการเข้าถึงแป้นพิมพ์บนหน้าจอบนหน้าจอการเข้าสู่ระบบ
+<translation id="6565312346072273043">ตั้งสถานะเริ่มต้นของฟีเจอร์การเข้าถึงแป้นพิมพ์บนหน้าจอบนหน้าจอการเข้าสู่ระบบ
 
           หากตั้งค่านโยบายนี้เป็น "จริง" จะมีการเปิดแป้นพิมพ์บนหน้าจอเมื่อหน้าจอการเข้าสู่ระบบปรากฏ
 
@@ -1433,7 +1433,7 @@
 
       กำหนดชุด URL ที่จะโหลดเมื่อเริ่มเซสชันการสาธิต นโยบายนี้จะลบล้างกลไกใดๆ ที่ใช้ในการตั้งค่า URL เริ่มต้น และจะสามารถใช้ได้กับเซสชันที่ไม่เชื่อมโยงกับผู้ใช้ใดเป็นการเฉพาะเท่านั้น</translation>
 <translation id="6908640907898649429">กำหนดค่าผู้ให้บริการการค้นหาเริ่มต้น คุณสามารถระบุผู้ให้บริการการค้นหาเริ่มต้นที่ผู้ใช้จะใช้หรือเลือกปิดใช้งานการค้นหาเริ่มต้น</translation>
-<translation id="6915442654606973733">เปิดใช้งานคุณลักษณะการเข้าถึงเสียงพูดตอบรับ
+<translation id="6915442654606973733">เปิดใช้งานฟีเจอร์การเข้าถึงเสียงพูดตอบรับ
 
           หากนโยบายนี้ถูกตั้งค่าเป็น "จริง" เสียงพูดตอบรับจะถูกเปิดใช้งานเสมอ
 
@@ -1454,7 +1454,7 @@
 
       หากไม่ตั้งค่านโยบายนี้ จะมีการใช้ค่าเริ่มต้นซึ่งก็คือ 32</translation>
 <translation id="6943577887654905793">ชื่อค่ากำหนด Mac/Linux:</translation>
-<translation id="69525503251220566">พารามิเตอร์ที่ให้คุณลักษณะการค้นหาโดยภาพสำหรับผู้ให้บริการการค้นหาเริ่มต้น</translation>
+<translation id="69525503251220566">พารามิเตอร์ที่ให้ฟีเจอร์การค้นหาโดยภาพสำหรับผู้ให้บริการการค้นหาเริ่มต้น</translation>
 <translation id="6956272732789158625">ไม่อนุญาตให้เว็บไซต์ใดๆ ใช้การสร้างคีย์</translation>
 <translation id="6997592395211691850">การตรวจสอบ OCSP/CRL ออนไลน์จำเป็นสำหรับ Anchors ความเชื่อถือได้ในตัว</translation>
 <translation id="7003334574344702284">นโยบายนี้บังคับให้นำเข้ารหัสผ่านที่บันทึกไว้จากเบราว์เซอร์เริ่มต้นก่อนหน้าหากเปิดใช้งาน หากเปิดใช้งาน นโยบายนี้ยังมีผลต่อข้อความโต้ตอบการนำเข้าอีกด้วย หากปิดใช้งาน จะไม่มีการนำเข้ารหัสผ่านที่บันทึกไว้ หากไม่มีการตั้งค่าไว้ ผู้ใช้อาจจะได้รับคำถามว่าจะนำเข้าหรือไม่ หรือการนำเข้าอาจเกิดขึ้นโดยอัตโนมัติ</translation>
@@ -1556,7 +1556,7 @@
 <translation id="7271085005502526897">การนำเข้าหน้าแรกจากเบราว์เซอร์เริ่มต้นในการเรียกใช้งานครั้งแรก</translation>
 <translation id="7273823081800296768">หากการตั้งค่านี้เปิดใช้งานหรือไม่ได้กำหนดค่า ผู้ใช้สามารถเลือกที่จะจับคู่ลูกค้าและโฮสต์ในเวลาเชื่อมต่อ โดยไม่จำเป็นต้องป้อน PIN ทุกครั้ง
 
-          หากการตั้งค่านี้ถูกปิดใช้งาน คุณลักษณะนี้จะไม่สามารถใช้ได้</translation>
+          หากการตั้งค่านี้ถูกปิดใช้งาน ฟีเจอร์นี้จะไม่สามารถใช้ได้</translation>
 <translation id="7275334191706090484">บุ๊กมาร์กที่มีการจัดการ</translation>
 <translation id="7295019613773647480">เปิดใช้งานผู้ใช้ภายใต้การดูแล</translation>
 <translation id="7301543427086558500">ระบุรายการ URL สำรองที่สามารถใช้ในการดึงข้อความค้นหาจากเครื่องมือค้นหา URL ควรมีสตริง <ph name="SEARCH_TERM_MARKER" /> ซึ่งจะใช้ในการดึงข้อความค้นหา
@@ -1666,7 +1666,7 @@
           นโยบายนี้ใช้สำหรับการใช้งานภายใน <ph name="PRODUCT_NAME" /> เอง</translation>
 <translation id="7712109699186360774">ถามทุกครั้งที่ไซต์ต้องการเข้าถึงกล้องและ/หรือไมโครโฟน</translation>
 <translation id="7715711044277116530">เปอร์เซ็นต์ของระดับการปรับการหน่วงเวลาการสลัวหน้าจอในโหมดการนำเสนอ</translation>
-<translation id="7717938661004793600">กำหนดค่าคุณลักษณะการเข้าถึงของ <ph name="PRODUCT_OS_NAME" /></translation>
+<translation id="7717938661004793600">กำหนดค่าฟีเจอร์การเข้าถึงของ <ph name="PRODUCT_OS_NAME" /></translation>
 <translation id="7719251660743813569">ควบคุมว่าจะรายงานเมตริกการใช้งานกลับไปที่ Google หรือไม่ หากตั้งค่าเป็น "จริง" <ph name="PRODUCT_OS_NAME" /> จะรายงานเมตริกการใช้งาน หากไม่กำหนดค่าหรือตั้งค่าเป็น "เท็จ" การรายงานเมตริกจะถูกปิดใช้งาน</translation>
 <translation id="7724994675283793633">นโยบายนี้เปิดใช้ HTTP/0.9 บนพอร์ตอื่นนอกเหนือจากพอร์ต 80 สำหรับ HTTP และพอร์ต 443 สำหรับ HTTPS
 
@@ -1808,7 +1808,7 @@
 <translation id="8141795997560411818">นโยบายนี้ไม่ได้ป้องกันไม่ให้ผู้ใช้ใช้แอป Google ไดรฟ์ของ Android หากต้องการป้องกันเข้าถึง Google ไดรฟ์ คุณควรยกเลิกการอนุญาตให้ติดตั้งแอป Google ไดรฟ์ของ Android</translation>
 <translation id="8146727383888924340">อนุญาตให้ผู้ใช้แลกข้อเสนอพิเศษผ่านการลงทะเบียน Chrome OS</translation>
 <translation id="8148785525797916822">ระงับคำเตือนที่ปรากฏขึ้นเมื่อ <ph name="PRODUCT_NAME" /> ทำงานบนคอมพิวเตอร์หรือระบบปฏิบัติการที่ไม่ได้รับการสนับสนุนอีกต่อไป</translation>
-<translation id="8148901634826284024">เปิดใช้งานคุณลักษณะการเข้าถึงโหมดคอนทราสต์สูง
+<translation id="8148901634826284024">เปิดใช้งานฟีเจอร์การเข้าถึงโหมดคอนทราสต์สูง
 
           หากนโยบายนี้ถูกตั้งค่าเป็น "จริง" โหมดคอนทราสต์สูงจะถูกเปิดใช้งานเสมอ
 
@@ -1819,7 +1819,7 @@
           หากนโยบายนี้ไม่มีการตั้งค่า โหมดคอนทราสต์สูงจะถูกปิดใช้งานในขั้นต้น แต่สามารถเปิดใช้งานโดยผู้ใช้ได้ทุกเมื่อ</translation>
 <translation id="815061180603915310">หากตั้งค่าเป็นเปิดใช้นโยบาย นโยบายนี้จะบังคับให้โปรไฟล์เปลี่ยนเป็นโหมดชั่วคราว หากระบุนโยบายนี้เป็นนโยบาย OS (เช่น GPO ใน Windows) นโยบายจะใช้กับทุกโปรไฟล์บนระบบ หากตั้งค่านโยบายเป็นนโยบายระบบคลาวด์ นโยบายจะใช้กับโปรไฟล์ที่ลงชื่อเข้าใช้ด้วยบัญชีที่มีการจัดการเท่านั้น
 
-      ในโหมดนี้ ข้อมูลโปรไฟล์จะยังอยู่ในดิสก์เป็นเวลาเท่ากับเซสชันของผู้ใช้เท่านั้น จะไม่มีการเก็บคุณลักษณะต่างๆ หลังปิดเบราว์เซอร์ เช่น ประวัติการเข้าชมของเบราว์เซอร์ ส่วนขยายและข้อมูลของส่วนขยาย ข้อมูลเว็บ เช่น คุกกี้และฐานข้อมูลเว็บ อย่างไรก็ตาม ผู้ใช้ยังคงสามารถดาวน์โหลดข้อมูลต่างๆ ลงในดิสก์ บันทึกหน้าหรือพิมพ์หน้าดังกล่าวด้วยตนเอง
+      ในโหมดนี้ ข้อมูลโปรไฟล์จะยังอยู่ในดิสก์เป็นเวลาเท่ากับเซสชันของผู้ใช้เท่านั้น จะไม่มีการเก็บฟีเจอร์ต่างๆ หลังปิดเบราว์เซอร์ เช่น ประวัติการเข้าชมของเบราว์เซอร์ ส่วนขยายและข้อมูลของส่วนขยาย ข้อมูลเว็บ เช่น คุกกี้และฐานข้อมูลเว็บ อย่างไรก็ตาม ผู้ใช้ยังคงสามารถดาวน์โหลดข้อมูลต่างๆ ลงในดิสก์ บันทึกหน้าหรือพิมพ์หน้าดังกล่าวด้วยตนเอง
 
       หากผู้ใช้ได้เปิดใช้การซิงค์ ข้อมูลทั้งหมดนี้จะเก็บไว้ในโปรไฟล์การซิงค์ของพวกเขาเหมือนกับโปรไฟล์ทั่วไป ทั้งนี้โหมดไม่ระบุตัวตนยังสามารถใช้งานได้หากไม่ได้ปิดใช้ตามนโยบาย
 
@@ -1849,18 +1849,18 @@
       นโยบายนี้จะไม่มีผลกับบัญชีผู้ใช้ทั่วไป</translation>
 <translation id="8279832363395120715">ตัดส่วนที่ละเอียดอ่อนต่อความเป็นส่วนตัวและความปลอดภัยใน URL แบบ https:// ออกก่อนส่งต่อไปยังสคริปต์ PAC (การกำหนดค่าพร็อกซีอัตโนมัติ) ที่ <ph name="PRODUCT_NAME" /> ใช้ระหว่างการแก้ปัญหาพร็อกซี
 
-      เมื่อตั้งค่าเป็น True ระบบจะเปิดใช้คุณลักษณะความปลอดภัย
+      เมื่อตั้งค่าเป็น True ระบบจะเปิดใช้ฟีเจอร์ความปลอดภัย
       และตัด URL แบบ https:// ก่อนที่จะส่งไปยังสคริปต์ PAC
       การดำเนินการเช่นนี้ทำให้สคริปต์ PAC ไม่สามารถดูข้อมูลที่มีการป้องกันแบบปกติ
       โดยช่องทางที่เข้ารหัส (เช่น เส้นทาง URL และคำสืบค้น)
 
-      เมื่อตั้งค่าเป็น False ระบบจะปิดใช้คุณลักษณะความปลอดภัยและสคริปต์ PAC
+      เมื่อตั้งค่าเป็น False ระบบจะปิดใช้ฟีเจอร์ความปลอดภัยและสคริปต์ PAC
       จะมีสิทธิ์ดูคอมโพเนนต์ทั้งหมดของ URL แบบ https:// โดยปริยาย
       การตั้งค่านี้จะมีผลกับสคริปต์ PAC ทั้งหมดไม่ว่าจะมาจากที่ใด
       (รวมทั้งสคริปต์ที่ดึงมาจากการรับส่งข้อมูลที่ไม่ปลอดภัย
       หรือค้นพบผ่าน WPAD อย่างไม่ปลอดภัย)
 
-      การตั้งค่านี้มีค่าเริ่มต้นเป็น True (เปิดใช้คุณลักษณะความปลอดภัย)
+      การตั้งค่านี้มีค่าเริ่มต้นเป็น True (เปิดใช้ฟีเจอร์ความปลอดภัย)
       ยกเว้นสำหรับผู้ใช้ Chrome OS ในองค์กร ซึ่งขณะนี้มีค่าเริ่มต้นเป็น False
 
       เราขอแนะนำให้ตั้งค่าเป็น True และตั้งเป็น False เมื่อการตั้งค่านี้ทำให้เกิดปัญหา
diff --git a/components/previews/OWNERS b/components/previews/OWNERS
index 2783dea..9a86a9f4 100644
--- a/components/previews/OWNERS
+++ b/components/previews/OWNERS
@@ -1 +1,3 @@
 file://components/data_reduction_proxy/OWNERS
+
+# COMPONENT: UI>Browser>Previews
\ No newline at end of file
diff --git a/components/strings/components_strings_am.xtb b/components/strings/components_strings_am.xtb
index 561a1bb..8ae4bc8 100644
--- a/components/strings/components_strings_am.xtb
+++ b/components/strings/components_strings_am.xtb
@@ -220,7 +220,6 @@
 <translation id="2826760142808435982">ግንኙነቱ የተመሰጠረ እና <ph name="CIPHER" />ን በመጠቀም የተረጋገጠ ነው፣ እና <ph name="KX" />ን እንደ የቁልፍ መቀያየሪያ ስልት ይጠቀምበታል።</translation>
 <translation id="2835170189407361413">ቅጽ አጽዳ</translation>
 <translation id="2889159643044928134">ዳግም አትጫን</translation>
-<translation id="2900469785430194048">Google Chrome ይህን ድረ-ገጽ ለማሳየት በሚሞክርበት ጊዜ ማኅደረ ትውስታ አልቆበታል።</translation>
 <translation id="2909946352844186028">የአውታረ መረብ ለውጥ ተገኝቷል።</translation>
 <translation id="2916038427272391327">ሌሎች ፕሮግራሞችን ይዝጉ</translation>
 <translation id="2922350208395188000">የአገልጋይ እውቅና ማረጋገጫ ሊረጋገጥ አልቻለም።</translation>
@@ -243,7 +242,6 @@
 <translation id="3024663005179499861">የተሳሳተ የመምሪያ አይነት</translation>
 <translation id="3032412215588512954">ይህን ጣቢያ ዳግም መጫን ይፈልጋሉ?</translation>
 <translation id="3037605927509011580">ውይ፣ ተሰናከለ!</translation>
-<translation id="3040955737384246924">{COUNT,plural, =0{በተሰመሩ መሣሪያዎች ላይ ቢያንስ 1 ንጥል}=1{1 ንጥል (እና ተጨማሪ የተሰመሩ መሣሪያዎች ላይ)}one{# ንጥሎች (እና ተጨማሪ የተሰመሩ መሣሪያዎች ላይ)}other{# ንጥሎች (እና ተጨማሪ የተሰመሩ መሣሪያዎች ላይ)}}</translation>
 <translation id="3041612393474885105">የሰርቲፊኬት መረጃ</translation>
 <translation id="3063697135517575841">Chrome በዚህ ጊዜ የእርስዎን ካርድ ማረጋገጥ አልቻለም። እባክዎ ቆይተው እንደገና ይሞክሩ።</translation>
 <translation id="3064966200440839136">በውጫዊ ማከማቻ በኩል ለማጫወት ማንነት ከማያሳውቅ ሁነታ በመውጣት ላይ። ይቀጥል?</translation>
@@ -336,7 +334,6 @@
 <translation id="3681007416295224113">የሰርቲፊኬት መረጃ</translation>
 <translation id="3690164694835360974">መግቢያ ደህንነቱ የተጠበቀ አይደለም</translation>
 <translation id="3693415264595406141">የይለፍ ቃል፦</translation>
-<translation id="3696411085566228381">ምንም</translation>
 <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation>
 <translation id="370665806235115550">በመጫን ላይ…</translation>
 <translation id="3712624925041724820">ሁሉም ፍቃዶች ተሞክረዋል</translation>
@@ -384,7 +381,6 @@
 <translation id="4171400957073367226">መጥፎ የማረጋገጫ ፊርማ</translation>
 <translation id="4196861286325780578">&amp;ውሰድን ድገም</translation>
 <translation id="4203896806696719780"><ph name="BEGIN_LINK" />የኬላ እና የጸረ-ቫይረስ ውቅረቶችን መፈተሽ<ph name="END_LINK" /></translation>
-<translation id="4206349416402437184">{COUNT,plural, =0{ምንም}=1{1 መተግበሪያ ($1)}=2{2 መተግበሪያዎች ($1፣ $2)}one{# መተግበሪያዎች ($1፣ $2፣ $3)}other{# መተግበሪያዎች ($1፣ $2፣ $3)}}</translation>
 <translation id="4220128509585149162">ብልሽቶች</translation>
 <translation id="4226937834893929579"><ph name="BEGIN_LINK" />የአውታረ መረብ መመርመሪያን አሂደው ይሞክሩ<ph name="END_LINK" /></translation>
 <translation id="4250431568374086873">ወደዚህ ጣቢያ ያልዎት ግንኙነት ሙሉ በሙሉ ደህንነቱ አስተማማኝ አይደለም።</translation>
@@ -468,7 +464,6 @@
 <translation id="5045550434625856497">ትክክል ያልሆነ የይለፍ ቃል</translation>
 <translation id="5056549851600133418">ለእርስዎ የሚሆኑ ጽሑፎች</translation>
 <translation id="5070335125961472645"><ph name="BEGIN_LINK" />የወኪሉን አድራሻ መፈተሽ<ph name="END_LINK" /></translation>
-<translation id="5076731569460970710">{COUNT,plural, =0{ምንም ኩኪዎች የሉም}=1{1 ጣቢያ ኩኪዎችን ይጠቀማል። }one{# ጣቢያዎች ኩኪዎችን ይጠቀማሉ። }other{# ጣቢያዎች ኩኪዎችን ይጠቀማሉ። }}</translation>
 <translation id="5087286274860437796">የአገልጋይ የዕውቅና ማረጋገጫ በዚህ ጊዜ ላይ የሚሰራ አይደለም።</translation>
 <translation id="5087580092889165836">ካርድ አክል</translation>
 <translation id="5089810972385038852">ግዛት</translation>
@@ -602,7 +597,6 @@
 <translation id="6358450015545214790">እነዚህ ምን ማለት ናቸው?</translation>
 <translation id="6386120369904791316">{COUNT,plural, =1{1 ሌላ የአስተያየት ጥቆማ}one{# ሌሎች የአስተያየት ጥቆማዎች}other{# ሌሎች የአስተያየት ጥቆማዎች}}</translation>
 <translation id="6387478394221739770">አዲስ የChrome ባህሪያትን ይፈልጋሉ? የቅድመ ይሁንታ ሰርጣችንን በchrome.com/beta ላይ ይሞክሩት።</translation>
-<translation id="6389758589412724634">Chromium ይህን ድረ-ገጽ ለማሳየት በሚሞክርበት ጊዜ ማኅደረ ትውስታ አልቆበታል።</translation>
 <translation id="6404511346730675251">ዕልባት አርትዕ</translation>
 <translation id="6410264514553301377">የ<ph name="CREDIT_CARD" /> የአገልግሎት ማብቂያ ቀን እና ሲቪሲ ያስገቡ</translation>
 <translation id="6414888972213066896">ይህን ጣቢያ መጎብኘት ችግር ካለው ወላጅዎን ጠይቀዋል</translation>
@@ -625,7 +619,6 @@
 <translation id="6556915248009097796">አገልግሎቱ የሚያበቃው፦ <ph name="EXPIRATION_DATE_ABBR" />፣ ለመጨረሻ ጊዜ ጥቅም ላይ የዋለው በ<ph name="LAST_USED_DATE_NO_DETAIL" /> ላይ</translation>
 <translation id="6563469144985748109">የእርስዎ አስተዳዳሪ ገና አላጸደቁትም</translation>
 <translation id="6569060085658103619">የቅጥያ ገጽ እየተመለከቱ ነው</translation>
-<translation id="6593753688552673085">ከ<ph name="UPPER_ESTIMATE" /> በታች</translation>
 <translation id="6596325263575161958">የምስጠራ አማራጮች</translation>
 <translation id="662080504995468778">ቆይ</translation>
 <translation id="6626291197371920147">የሚሰራ የካርድ ቁጥር ያክሉ</translation>
@@ -637,7 +630,6 @@
 <translation id="6710594484020273272">&lt;የፍለጋ ቃል ይተይቡ&gt;</translation>
 <translation id="6711464428925977395">በተኪ አገልጋዩ ላይ የሆነ ችግር አለ ወይም አድራሻው ትክክል አይደለም።</translation>
 <translation id="6727102863431372879">አዘጋጅ</translation>
-<translation id="6731320287533051140">{COUNT,plural, =0{ምንም}=1{1 ንጥል}one{# ንጥሎች}other{# ንጥሎች}}</translation>
 <translation id="674375294223700098">ያልታወቀ የአገልጋይ እውቅና ማረጋገጫ ስህተት።</translation>
 <translation id="6753269504797312559">የመምሪያ እሴት</translation>
 <translation id="6757797048963528358">የእርስዎ መሣሪያ ተኝቷል።</translation>
@@ -743,6 +735,7 @@
 <translation id="7669271284792375604">በዚህ ጣቢያ ላይ ያሉ አጥቂዎች እርስዎ የአሰሳ ተሞክሮዎን ሊጎዱ (ለምሳሌ፦ መነሻ ገጽዎን በመቀየር ወይም በሚጎበኟቸው ጣቢያዎች ላይ ተጨማሪ ማስታወቂያዎችን በማሳየት) የሚችሉ ፕሮግራሞችን እንዲጭኑ ለማታለል ሊሞክሩ ይችላሉ።</translation>
 <translation id="7674629440242451245">አዲስ የሆኑ አሪፍ የChrome ባህሪያትን ይፈልጋሉ? በ chrome.com/dev ላይ ያለውን የdev ሰርጣችንን ይሞክሩት።</translation>
 <translation id="7682287625158474539">ዕቃን የማጓጓዝ ስራ</translation>
+<translation id="7701040980221191251">ምንም</translation>
 <translation id="7704050614460855821"><ph name="BEGIN_LINK" />ወደ <ph name="SITE" /> ቀጥል (ደህንነቱ ያልተጠበቀ)<ph name="END_LINK" /></translation>
 <translation id="7714464543167945231">ሰርቲፊኬት</translation>
 <translation id="7716424297397655342">ይህ ጣቢያ ከመሸጎጫው ላይ ሊጫን አይችልም</translation>
@@ -782,7 +775,6 @@
 <translation id="8041089156583427627">ግብረ መልስ ላክ</translation>
 <translation id="8041940743680923270">ሁለንተናዊ ነባሪውን ተጠቀሙ (ጠይቅ)</translation>
 <translation id="8088680233425245692">ጽሑፉን ማየት አልተቻለም።</translation>
-<translation id="8089520772729574115">ከ1 ሜባ ያነሰ</translation>
 <translation id="8091372947890762290">ማግበር በአገልጋዩ ላይ በመጠባበቅ ላይ ነው</translation>
 <translation id="8118489163946903409">የመክፈያ ዘዴ</translation>
 <translation id="8131740175452115882">አረጋግጥ</translation>
diff --git a/components/strings/components_strings_ar.xtb b/components/strings/components_strings_ar.xtb
index 0f77b64..f5d49da 100644
--- a/components/strings/components_strings_ar.xtb
+++ b/components/strings/components_strings_ar.xtb
@@ -220,7 +220,6 @@
 <translation id="2826760142808435982">تم تشفير الاتصال ومصادقته باستخدام <ph name="CIPHER" />، ويستخدم <ph name="KX" /> كآلية التبادل الرئيسية.</translation>
 <translation id="2835170189407361413">محو النموذج</translation>
 <translation id="2889159643044928134">إلغاء إعادة التحميل</translation>
-<translation id="2900469785430194048">‏نفدت ذاكرة Google Chrome أثناء محاولة عرض صفحة الويب هذه.</translation>
 <translation id="2909946352844186028">تم اكتشاف حدوث تغيير في الشبكة.</translation>
 <translation id="2916038427272391327">إغلاق البرامج الأخرى</translation>
 <translation id="2922350208395188000">لا يمكن التحقق من شهادة الخادم.</translation>
@@ -243,7 +242,6 @@
 <translation id="3024663005179499861">نوع السياسة غير صحيح</translation>
 <translation id="3032412215588512954">هل تريد إعادة تحميل هذا الموقع؟</translation>
 <translation id="3037605927509011580">عذرًا!</translation>
-<translation id="3040955737384246924">{COUNT,plural, =0{عنصر واحد على الأقل على الأجهزة المتزامنة}=1{عنصر واحد (1) (وأكثر على الأجهزة المتزامنة)}two{عنصران (#) (وأكثر على الأجهزة المتزامنة)}few{# عناصر (وأكثر على الأجهزة المتزامنة)}many{# عنصرًا (وأكثر على الأجهزة المتزامنة)}other{# عنصر (وأكثر على الأجهزة المتزامنة)}}</translation>
 <translation id="3041612393474885105">معلومات الشهادة</translation>
 <translation id="3063697135517575841">‏لم يتمكن Chrome من التأكد من بطاقتك في الوقت الحالي. يُرجى إعادة المحاولة في وقت لاحق.</translation>
 <translation id="3064966200440839136">ستتم مغادرة وضع التصفح المتخفي للدفع عبر تطبيق خارجي. هل تريد المتابعة؟</translation>
@@ -337,7 +335,6 @@
 <translation id="3681007416295224113">معلومات الشهادة</translation>
 <translation id="3690164694835360974">عملية تسجيل الدخول غير آمنة</translation>
 <translation id="3693415264595406141">كلمة المرور:</translation>
-<translation id="3696411085566228381">بدون</translation>
 <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation>
 <translation id="370665806235115550">جارٍ التحميل...</translation>
 <translation id="3712624925041724820">التراخيص مستنفذة</translation>
@@ -385,7 +382,6 @@
 <translation id="4171400957073367226">توقيع تحقق سيئ</translation>
 <translation id="4196861286325780578">إ&amp;عادة النقل</translation>
 <translation id="4203896806696719780"><ph name="BEGIN_LINK" />التحقق من عمليات تهيئة الجدار الناري وبرامج مكافحة الفيروسات<ph name="END_LINK" /></translation>
-<translation id="4206349416402437184">{COUNT,plural, =0{لا شيء}=1{تطبيق واحد ($1)}=2{تطبيقان (2) ($1، $2)}few{# تطبيقات ($1، $2، $3)}many{# تطبيقًا ($1، $2، $3)}other{# تطبيق ($1، $2، $3)}}</translation>
 <translation id="4220128509585149162">الأعطال</translation>
 <translation id="4226937834893929579"><ph name="BEGIN_LINK" />تجربة تشغيل بيانات تشخيص الشبكة<ph name="END_LINK" />.</translation>
 <translation id="4250431568374086873">إن اتصالك بهذا الموقع غير آمن تمامًا</translation>
@@ -469,7 +465,6 @@
 <translation id="5045550434625856497">كلمة مرور غير صحيحة</translation>
 <translation id="5056549851600133418">مقالات من أجلك</translation>
 <translation id="5070335125961472645"><ph name="BEGIN_LINK" />التحقق من عنوان الخادم الوكيل<ph name="END_LINK" /></translation>
-<translation id="5076731569460970710">{COUNT,plural, =0{لا توجد ملفات تعريف ارتباط}=1{يستخدم موقع ويب واحد ملفات تعريف الارتباط. }two{يستخدم موقعا ويب (#) ملفات تعريف الارتباط. }few{تستخدم # مواقع ويب ملفات تعريف الارتباط. }many{يستخدم # موقعًا من مواقع الويب ملفات تعريف الارتباط. }other{يستخدم # موقع ويب ملفات تعريف الارتباط. }}</translation>
 <translation id="5087286274860437796">شهادة الخادم ليست صالحة حاليًا.</translation>
 <translation id="5087580092889165836">إضافة بطاقة</translation>
 <translation id="5089810972385038852">بلد/دولة</translation>
@@ -601,7 +596,6 @@
 <translation id="6358450015545214790">ماذا تعني هذه الأقسام؟</translation>
 <translation id="6386120369904791316">{COUNT,plural, =1{اقتراح واحد آخر}zero{# اقتراح آخر}two{اقتراحان آخران (#)}few{# اقتراحات أخرى}many{# اقتراحًا آخر}other{# اقتراح آخر}}</translation>
 <translation id="6387478394221739770">‏إذا كنت مهتمًا بميزات Google الجديدة والرائعة، فيُمكنك تجربة القناة التجريبية على chrome.com/beta.</translation>
-<translation id="6389758589412724634">‏نفدت ذاكرة Chromium أثناء محاولة عرض صفحة الويب هذه.</translation>
 <translation id="6404511346730675251">تعديل إشارة مرجعية</translation>
 <translation id="6410264514553301377">‏أدخِل تاريخ انتهاء الصلاحية ورمز التحقق من البطاقة (CVC) لـ <ph name="CREDIT_CARD" /></translation>
 <translation id="6414888972213066896">لقد سألت والديك ما إذا كانت زيارة هذا الموقع مناسبةً لك</translation>
@@ -624,7 +618,6 @@
 <translation id="6556915248009097796">تاريخ انتهاء الصلاحية: <ph name="EXPIRATION_DATE_ABBR" />، وتاريخ آخر استخدام: <ph name="LAST_USED_DATE_NO_DETAIL" /></translation>
 <translation id="6563469144985748109">لم يوافق عليه مديرك حتى الآن</translation>
 <translation id="6569060085658103619">أنت تعرض صفحة إضافة</translation>
-<translation id="6593753688552673085">أقل من <ph name="UPPER_ESTIMATE" /></translation>
 <translation id="6596325263575161958">خيارات التشفير</translation>
 <translation id="662080504995468778">البقاء</translation>
 <translation id="6626291197371920147">إضافة رقم بطاقة صالح</translation>
@@ -636,7 +629,6 @@
 <translation id="6710594484020273272">&lt;إدخال عبارة البحث&gt;</translation>
 <translation id="6711464428925977395">هناك خطأ ما في الخادم الوكيل، أو العنوان غير صحيح.</translation>
 <translation id="6727102863431372879">تعيين</translation>
-<translation id="6731320287533051140">{COUNT,plural, =0{لا شيء}=1{عنصر واحد}two{عنصران (#)}few{# عناصر}many{# عنصرًا}other{# عنصر}}</translation>
 <translation id="674375294223700098">حدث خطأ غير معروف في شهادة الخادم.</translation>
 <translation id="6753269504797312559">قيمة السياسة</translation>
 <translation id="6757797048963528358">خضع جهازك إلى وضع السكون.</translation>
@@ -742,6 +734,7 @@
 <translation id="7669271284792375604">قد يحاول المهاجمون في هذا الموقع خداعك من خلال تثبيت برامج تضر بتجربة التصفح (على سبيل المثال، من خلال تغيير صفحتك الرئيسية أو عرض إعلانات إضافية على المواقع التي تزورها).</translation>
 <translation id="7674629440242451245">‏إذا كنت مهتمًا بميزات Google الجديدة والرائعة، فيُمكنك تجربة قناة مطوري البرامج على chrome.com/dev.</translation>
 <translation id="7682287625158474539">الشحن</translation>
+<translation id="7701040980221191251">بلا</translation>
 <translation id="7704050614460855821"><ph name="BEGIN_LINK" />متابعة إلى <ph name="SITE" /> (غير آمن)<ph name="END_LINK" /></translation>
 <translation id="7714464543167945231">شهادة</translation>
 <translation id="7716424297397655342">لا يمكن تحميل موقع الويب هذا من ذاكرة التخزين المؤقت</translation>
@@ -781,7 +774,6 @@
 <translation id="8041089156583427627">إرسال تعليقات</translation>
 <translation id="8041940743680923270">استخدام الإعداد الافتراضي العمومي (طلب)</translation>
 <translation id="8088680233425245692">تعذّر عرض المقالة.</translation>
-<translation id="8089520772729574115">أقل من ميغابايت واحدة</translation>
 <translation id="8091372947890762290">التنشيط قيد الانتظار في الخادم</translation>
 <translation id="8118489163946903409">طريقة الدفع</translation>
 <translation id="8131740175452115882">التأكيد</translation>
diff --git a/components/strings/components_strings_bg.xtb b/components/strings/components_strings_bg.xtb
index c5b62c52..45eb5496 100644
--- a/components/strings/components_strings_bg.xtb
+++ b/components/strings/components_strings_bg.xtb
@@ -220,7 +220,6 @@
 <translation id="2826760142808435982">Връзката е шифрована и удостоверена посредством <ph name="CIPHER" /> и използва <ph name="KX" /> като механизъм за обмен на ключове.</translation>
 <translation id="2835170189407361413">Изчистване на формуляра</translation>
 <translation id="2889159643044928134">Без презареждане</translation>
-<translation id="2900469785430194048">Паметта на Google Chrome се изчерпа, докато браузърът опитваше да покаже тази уеб страница.</translation>
 <translation id="2909946352844186028">Установена бе промяна в мрежата.</translation>
 <translation id="2916038427272391327">Затворете другите програми.</translation>
 <translation id="2922350208395188000">Сертификатът на сървъра не може да бъде проверен.</translation>
@@ -243,7 +242,6 @@
 <translation id="3024663005179499861">Грешен тип на правилото</translation>
 <translation id="3032412215588512954">Искате ли да презаредите този сайт?</translation>
 <translation id="3037605927509011580">Ужас!</translation>
-<translation id="3040955737384246924">{COUNT,plural, =0{поне 1 елемент на синхронизирани устройства}=1{1 елемент (и други на синхронизирани устройства)}other{# елемента (и други на синхронизирани устройства)}}</translation>
 <translation id="3041612393474885105">Информация за сертификата</translation>
 <translation id="3063697135517575841">Chrome не можа да потвърди картата ви. Моля, опитайте отново по-късно.</translation>
 <translation id="3064966200440839136">Ще напуснете режим „инкогнито“, за да платите във външно приложение. Искате ли да продължите?</translation>
@@ -337,7 +335,6 @@
 <translation id="3681007416295224113">Информация за сертификата</translation>
 <translation id="3690164694835360974">Страницата за вход не е защитена</translation>
 <translation id="3693415264595406141">Парола:</translation>
-<translation id="3696411085566228381">няма</translation>
 <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> „<ph name="TITLE" />“ <ph name="DOMAIN" /></translation>
 <translation id="370665806235115550">Зарежда се...</translation>
 <translation id="3712624925041724820">Лицензите са изчерпани</translation>
@@ -385,7 +382,6 @@
 <translation id="4171400957073367226">Невалиден подпис за потвърждаване</translation>
 <translation id="4196861286325780578">&amp;Възстановяване на преместването</translation>
 <translation id="4203896806696719780"><ph name="BEGIN_LINK" />Проверете конфигурацията на защитната стена и антивирусния софтуер<ph name="END_LINK" />.</translation>
-<translation id="4206349416402437184">{COUNT,plural, =0{няма}=1{1 приложение ($1)}=2{2 приложения ($1, $2)}other{# приложения ($1, $2, $3)}}</translation>
 <translation id="4220128509585149162">Сривове</translation>
 <translation id="4226937834893929579"><ph name="BEGIN_LINK" />Опитайте да стартирате мрежова диагностика<ph name="END_LINK" />.</translation>
 <translation id="4250431568374086873">Връзката ви с този сайт не е напълно защитена</translation>
@@ -469,7 +465,6 @@
 <translation id="5045550434625856497">Грешна парола</translation>
 <translation id="5056549851600133418">Статии за вас</translation>
 <translation id="5070335125961472645"><ph name="BEGIN_LINK" />Проверете адреса на прокси сървъра<ph name="END_LINK" />.</translation>
-<translation id="5076731569460970710">{COUNT,plural, =0{Няма „бисквитки“}=1{1 сайт използва „бисквитки“. }other{# сайта използват „бисквитки“. }}</translation>
 <translation id="5087286274860437796">Понастоящем сертификатът на сървъра не е валиден.</translation>
 <translation id="5087580092889165836">Добавяне на карта</translation>
 <translation id="5089810972385038852">Щат</translation>
@@ -601,7 +596,6 @@
 <translation id="6358450015545214790">Какво означават тези неща?</translation>
 <translation id="6386120369904791316">{COUNT,plural, =1{още 1 предложение}other{още # предложения}}</translation>
 <translation id="6387478394221739770">Търсите интересни нови функции на Chrome? Изпробвайте бета канала на адрес chrome.com/beta.</translation>
-<translation id="6389758589412724634">Паметта на Chromium се изчерпа, докато браузърът опитваше да покаже тази уеб страница.</translation>
 <translation id="6404511346730675251">Редактиране на отметката</translation>
 <translation id="6410264514553301377">Въвеждане на датата на валидност и кода за проверка за <ph name="CREDIT_CARD" /></translation>
 <translation id="6414888972213066896">Попитахте родителя си дали може да посетите този сайт</translation>
@@ -624,7 +618,6 @@
 <translation id="6556915248009097796">Валидност: <ph name="EXPIRATION_DATE_ABBR" />. Последно използване: <ph name="LAST_USED_DATE_NO_DETAIL" /></translation>
 <translation id="6563469144985748109">Мениджърът ви все още не е одобрил заявката</translation>
 <translation id="6569060085658103619">Преглеждате страница на разширение</translation>
-<translation id="6593753688552673085">по-малко от <ph name="UPPER_ESTIMATE" /></translation>
 <translation id="6596325263575161958">Опции за шифроване</translation>
 <translation id="662080504995468778">Оставане</translation>
 <translation id="6626291197371920147">Добавяне на валиден номер на карта</translation>
@@ -636,7 +629,6 @@
 <translation id="6710594484020273272">&lt;Въведете дума за търсене&gt;</translation>
 <translation id="6711464428925977395">Нещо не е наред с прокси сървъра или адресът е неправилен.</translation>
 <translation id="6727102863431372879">Задаване</translation>
-<translation id="6731320287533051140">{COUNT,plural, =0{няма}=1{1 елемент}other{# елемента}}</translation>
 <translation id="674375294223700098">Неизвестна грешка в сертификата на сървъра.</translation>
 <translation id="6753269504797312559">Стойност за правилото</translation>
 <translation id="6757797048963528358">Устройството ви премина в спящ режим.</translation>
@@ -742,6 +734,7 @@
 <translation id="7669271284792375604">Извършителите на атаки, използващи този сайт, може да опитат да ви подведат да инсталирате програми, които вредят на сърфирането ви (например, като променят началната ви страница или показват допълнителни реклами в посещаваните от вас сайтове).</translation>
 <translation id="7674629440242451245">Търсите интересни нови функции на Chrome? Изпробвайте канала за програмисти на адрес chrome.com/dev.</translation>
 <translation id="7682287625158474539">Адрес за доставка</translation>
+<translation id="7701040980221191251">Няма</translation>
 <translation id="7704050614460855821"><ph name="BEGIN_LINK" />Продължаване към <ph name="SITE" /> (опасно)<ph name="END_LINK" /></translation>
 <translation id="7714464543167945231">Сертификат</translation>
 <translation id="7716424297397655342">Този сайт не може да се зареди от кеш паметта</translation>
@@ -781,7 +774,6 @@
 <translation id="8041089156583427627">Изпращане на отзивите</translation>
 <translation id="8041940743680923270">Използване на глобалната стандартна стойност (запитване)</translation>
 <translation id="8088680233425245692">Преглеждането на статията не бе успешно.</translation>
-<translation id="8089520772729574115">по-малко от 1 МБ</translation>
 <translation id="8091372947890762290">В сървъра се изчаква активиране</translation>
 <translation id="8118489163946903409">Начин на плащане</translation>
 <translation id="8131740175452115882">Потвърждаване</translation>
diff --git a/components/strings/components_strings_bn.xtb b/components/strings/components_strings_bn.xtb
index 015565b..09d52e1 100644
--- a/components/strings/components_strings_bn.xtb
+++ b/components/strings/components_strings_bn.xtb
@@ -221,10 +221,10 @@
 <translation id="2826760142808435982"><ph name="CIPHER" /> ব্যবহার করে এই সংযোগটি এনক্রিপ্টেড এবং প্রমাণীকৃত করা হয়েছে এবং কী এক্সচেঞ্জ প্রক্রিয়া হিসাবে <ph name="KX" /> ব্যবহার করে৷</translation>
 <translation id="2835170189407361413">ফর্ম সাফ করুন</translation>
 <translation id="2889159643044928134">আবার লোড করবেন না</translation>
-<translation id="2900469785430194048">এই ওয়েবপৃষ্ঠা প্রদর্শন করার সময় Google Chrome এর মেমরি শেষ হয়ে গেছে।</translation>
 <translation id="2909946352844186028">একটি নেটওয়ার্ক পরিবর্তন সনাক্ত হয়েছে৷</translation>
 <translation id="2916038427272391327">অন্যান্য প্রোগ্রামগুলি বন্ধ করুন</translation>
 <translation id="2922350208395188000">সার্ভারের শংসাপত্র চেক করা যাবে না৷</translation>
+<translation id="2928905813689894207">বিলিংয়ের ঠিকানা</translation>
 <translation id="2941952326391522266">এই সার্ভার প্রমাণ করতে পারেনি যে এটি <ph name="DOMAIN" />; এর নিরাপত্তা শংসাপত্র <ph name="DOMAIN2" /> থেকে পাওয়া। কোনো ভুল কনফিগারেশনের কারণে অথবা কোনো আক্রমণকারী আপনার সংযোগ মাঝপথে আটকে দিচ্ছে বলে এমনটা হতে পারে।</translation>
 <translation id="2948083400971632585">আপনি সেটিংস পৃষ্ঠা থেকে সংযোগের জন্য কনফিগার করা যেকোনো প্রক্সি নিষ্ক্রিয় করতে পারেন৷</translation>
 <translation id="2955913368246107853">খোঁজ দণ্ড বন্ধ করুন</translation>
@@ -239,10 +239,10 @@
 <translation id="3005723025932146533">সংরক্ষিত প্রতিলিপি দেখান</translation>
 <translation id="3008447029300691911"><ph name="CREDIT_CARD" /> এর CVC লিখুন। আপনি নিশ্চিত করলে, আপনার কার্ডের বিবরণ এই সাইটের সাথে শেয়ার করা হবে।</translation>
 <translation id="3010559122411665027">তালিকার এন্ট্রি " <ph name="ENTRY_INDEX" /> ": <ph name="ERROR" /></translation>
+<translation id="301521992641321250">স্বয়ংক্রিয়ভাবে ব্লক করা হয়েছে</translation>
 <translation id="3024663005179499861">নীতির ভুল প্রকার</translation>
 <translation id="3032412215588512954">আপনি কি এই সাইটটি পুনরায় লোড করতে চান?</translation>
 <translation id="3037605927509011580">ইস!</translation>
-<translation id="3040955737384246924">{COUNT,plural, =0{সিঙ্ক করা ডিভাইসে ন্যূনতম ১টি আইটেম}=1{১টি আইটেম (এবং সিঙ্ক করা ডিভাইসে আরো)}one{#টি আইটেম (এবং সিঙ্ক করা ডিভাইসে আরো)}other{#টি আইটেম (এবং সিঙ্ক করা ডিভাইসে আরো)}}</translation>
 <translation id="3041612393474885105">শংসাপত্র তথ্য</translation>
 <translation id="3063697135517575841">Chrome এই মুহূর্তে আপনার কার্ড নিশ্চিত করতে পারছে না৷ অনুগ্রহ করে পরে আবার চেষ্টা করুন৷</translation>
 <translation id="3064966200440839136">বহিরাগত অ্যাপ্লিকেশানের মাধ্যমে অর্থপ্রদান করার জন্য ছদ্মবেশী মোড থেকে বেরিয়ে যাচ্ছে। চালিয়ে যাবেন?</translation>
@@ -336,7 +336,6 @@
 <translation id="3681007416295224113">শংসাপত্র তথ্য</translation>
 <translation id="3690164694835360974">লগইন সুরক্ষিত নয়</translation>
 <translation id="3693415264595406141">পাসওয়ার্ড:</translation>
-<translation id="3696411085566228381">কিছুই নেই</translation>
 <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation>
 <translation id="370665806235115550">লোড হচ্ছে...</translation>
 <translation id="3712624925041724820">লাইসেন্সগুলির মেয়াদ শেষ হয়ে গেছে</translation>
@@ -384,7 +383,6 @@
 <translation id="4171400957073367226">খারাপ যাচাইকরণের স্বাক্ষর</translation>
 <translation id="4196861286325780578">&amp;সরানোর কাজটি আবার করুন</translation>
 <translation id="4203896806696719780"><ph name="BEGIN_LINK" />ফায়ারওয়াল এবং অ্যান্টিভাইরাস কনফিগারেশন পরীক্ষা করে দেখুন<ph name="END_LINK" /></translation>
-<translation id="4206349416402437184">{COUNT,plural, =0{কিছুই নেই}=1{১টি অ্যাপ্লিকেশান ($1)}=2{২টি অ্যাপ্লিকেশান ($1, $2)}one{#টি অ্যাপ্লিকেশান ($1, $2, $3)}other{#টি অ্যাপ্লিকেশান ($1, $2, $3)}}</translation>
 <translation id="4220128509585149162">ক্র্যাশেস</translation>
 <translation id="4226937834893929579"><ph name="BEGIN_LINK" />নেটওয়ার্ক ডায়গনিস্টিক্স চালিয়ে দেখুন<ph name="END_LINK" />।</translation>
 <translation id="4250431568374086873">এই সাইটে আপনার সংযোগ সম্পূর্ণরূপে নিরাপদ নয়</translation>
@@ -468,7 +466,6 @@
 <translation id="5045550434625856497">ভুল পাসওয়ার্ড</translation>
 <translation id="5056549851600133418">আপনার জন্য নিবন্ধগুলি</translation>
 <translation id="5070335125961472645"><ph name="BEGIN_LINK" />প্রক্সি ঠিকানা পরীক্ষা করে দেখুন<ph name="END_LINK" /></translation>
-<translation id="5076731569460970710">{COUNT,plural, =0{কোনো কুকি নেই}=1{১টি সাইট কুকি ব্যবহার করে। }one{#টি সাইট কুকি ব্যবহার করে। }other{#টি সাইট কুকি ব্যবহার করে। }}</translation>
 <translation id="5087286274860437796">সার্ভারের শংসাপত্র এই সময়ে বৈধ নয়৷</translation>
 <translation id="5087580092889165836">কার্ড জুড়ুন</translation>
 <translation id="5089810972385038852">রাজ্য</translation>
@@ -574,6 +571,7 @@
 <translation id="6165508094623778733">আরো জানুন</translation>
 <translation id="6169916984152623906">এখন আপনি গোপনভাবে ব্রাউজ করতে পারেন, এবং অন্য যেসব বক্তি এই ডিভাইস ব্যবহার করেন তারা আপনার কার্যকলাপ দেখতে পাবেন না। তবে, আপনার ডাউনলোড এবং বুকমার্কগুলি সংরক্ষণ করা হবে।</translation>
 <translation id="6177128806592000436">এই সাইটে আপনার সংযোগ নিরাপদ নয়</translation>
+<translation id="6184817833369986695">(দল: <ph name="UPDATE_COHORT_NAME" />)</translation>
 <translation id="6203231073485539293">আপনার ইন্টারনেট সংযোগ পরীক্ষা করুন</translation>
 <translation id="6218753634732582820">Chromium থেকে ঠিকানা সরাবেন?</translation>
 <translation id="6221345481584921695">Google নিরাপদ ব্রাউজিং সাম্প্রতিক <ph name="SITE" /> এ <ph name="BEGIN_LINK" />ম্যালওয়্যার শনাক্ত করেছে<ph name="END_LINK" />। যেসব ওয়েবসাইট সাধারণত নিরাপদ থাকে, সেগুলি কখনও কখনও ম্যালওয়্যার দ্বারা আক্রান্ত হয়। <ph name="SUBRESOURCE_HOST" />, একটি পরিচিত ম্যালওয়্যার বিতরণকারী, থেকে ক্ষতিকারক সামগ্রী আসে। কয়েক ঘণ্টা পরে আপনার ফিরে আসা উচিত।</translation>
@@ -598,7 +596,6 @@
 <translation id="6358450015545214790">এর অর্থ কী?</translation>
 <translation id="6386120369904791316">{COUNT,plural, =1{আরো ১টি প্রস্তাব}one{অন্যান্য #টি প্রস্তাব}other{অন্যান্য #টি প্রস্তাব}}</translation>
 <translation id="6387478394221739770">Chrome এর নতুন দুর্দান্ত বৈশিষ্ট্যগুলিতে আগ্রহী? chrome.com/beta এ আমাদের বিটা চ্যানেল ব্যবহার করে দেখুন৷</translation>
-<translation id="6389758589412724634">এই ওয়েবপৃষ্ঠা প্রদর্শন করার সময় Chromium এর মেমরি শেষ হয়ে গেছে।</translation>
 <translation id="6404511346730675251">বুকমার্ক সম্পাদনা করুন</translation>
 <translation id="6410264514553301377"><ph name="CREDIT_CARD" /> এর মেয়াদ শেষের তারিখ এবং CVC লিখুন</translation>
 <translation id="6414888972213066896">এই সাইটটি ঘুরে দেখা ঠিক হবে কিনা সেই বিষয়ে আপনি আপনার পিতামাতাকে জিজ্ঞাসা করেছেন</translation>
@@ -621,7 +618,6 @@
 <translation id="6556915248009097796">মেয়াদ শেষের তারিখ: <ph name="EXPIRATION_DATE_ABBR" />, শেষবার ব্যবহার করা হয়েছে <ph name="LAST_USED_DATE_NO_DETAIL" /></translation>
 <translation id="6563469144985748109">আপনার পরিচালক এখনও এটি অনুমোদন করেন নি</translation>
 <translation id="6569060085658103619">আপনি একটি এক্সটেনশান পৃষ্ঠা দেখছেন</translation>
-<translation id="6593753688552673085"><ph name="UPPER_ESTIMATE" /> এর কম</translation>
 <translation id="6596325263575161958">এনক্রিপশন বিকল্পগুলি</translation>
 <translation id="662080504995468778">থাকুন</translation>
 <translation id="6626291197371920147">বৈধ কার্ড নম্বর যোগ করুন</translation>
@@ -633,7 +629,6 @@
 <translation id="6710594484020273272">&lt;অনুসন্ধানের পদ লিখুন&gt;</translation>
 <translation id="6711464428925977395">প্রক্সী সার্ভারের কোনো সমস্যা হয়েছে, অথবা ঠিকানাটি ভুল।</translation>
 <translation id="6727102863431372879">সেট</translation>
-<translation id="6731320287533051140">{COUNT,plural, =0{কিছুই নেই}=1{১টি আইটেম}one{#টি আইটেম}other{#টি আইটেম}}</translation>
 <translation id="674375294223700098">অজানা সার্ভার শংসাপত্র ত্রুটি৷</translation>
 <translation id="6753269504797312559">নীতি মান</translation>
 <translation id="6757797048963528358">আপনার ডিভাইস নিদ্রা মোডে গিয়েছে।</translation>
@@ -676,6 +671,7 @@
 <translation id="7180611975245234373">রিফ্রেশ করুন</translation>
 <translation id="7182878459783632708">কোন নীতি সেট করা নেই</translation>
 <translation id="7186367841673660872">এই পৃষ্ঠাটি<ph name="ORIGINAL_LANGUAGE" />থেকে<ph name="LANGUAGE_LANGUAGE" />তে অনুবাদ করা হয়েছে</translation>
+<translation id="7192203810768312527"><ph name="SIZE" /> জায়গা খালি করে। পরের বার যখন দেখবেন তখন কিছু সাইট লোড হতে দেরি হতে পারে।</translation>
 <translation id="719464814642662924">Visa</translation>
 <translation id="7210863904660874423"><ph name="HOST_NAME" /> নিরাপত্তা মান মেনে চলে না।</translation>
 <translation id="721197778055552897">এই সমস্যাটি সম্পর্কে <ph name="BEGIN_LINK" />আরো জানুন<ph name="END_LINK" />৷</translation>
@@ -738,6 +734,7 @@
 <translation id="7669271284792375604">এই সাইটে থাকা আক্রমণকারীরা কৌশলে আপনাকে দিয়ে এমন প্রোগ্রাম ইনস্টল করাতে পারে যা আপনার ব্রাউজিং অভিজ্ঞতার জন্য ক্ষতিকর হতে পারে (উদাহরণস্বরূপ, আপনার হোমপৃষ্ঠা পরিবর্তন করা বা আপনার পরিদর্শিত সাইটগুলিতে অতিরিক্ত বিজ্ঞাপন দেখানো)৷</translation>
 <translation id="7674629440242451245">Chrome এর নতুন দুর্দান্ত বৈশিষ্ট্যগুলিতে আগ্রহী? chrome.com/dev এ আমাদের ডেভ চ্যানেল ব্যবহার করে দেখুন৷</translation>
 <translation id="7682287625158474539">শিপিং</translation>
+<translation id="7701040980221191251">কিছুই নয়</translation>
 <translation id="7704050614460855821"><ph name="BEGIN_LINK" /> <ph name="SITE" /> এ এগিয়ে যান (নিরাপদ নয়) <ph name="END_LINK" /></translation>
 <translation id="7714464543167945231">শংসাপত্র</translation>
 <translation id="7716424297397655342">এই সাইটটি ক্যাশে থেকে লোড করা যাবে না</translation>
@@ -777,7 +774,6 @@
 <translation id="8041089156583427627">প্রতিক্রিয়া পাঠান</translation>
 <translation id="8041940743680923270">বিশ্বব্যাপী ডিফল্ট ব্যবহার করুন (জানতে চান)</translation>
 <translation id="8088680233425245692">নিবন্ধ দেখতে ব্যর্থ হয়েছে৷</translation>
-<translation id="8089520772729574115">১ মেগাবাইটের কম</translation>
 <translation id="8091372947890762290">সার্ভারে সক্রিয়করণ বাকি আছে</translation>
 <translation id="8118489163946903409">পেমেন্টের পদ্ধতি</translation>
 <translation id="8131740175452115882">নিশ্চিত হন</translation>
diff --git a/components/strings/components_strings_ca.xtb b/components/strings/components_strings_ca.xtb
index 86f12cff..e64c2ae 100644
--- a/components/strings/components_strings_ca.xtb
+++ b/components/strings/components_strings_ca.xtb
@@ -220,7 +220,6 @@
 <translation id="2826760142808435982">La connexió s'ha encriptat i autenticat mitjançant <ph name="CIPHER" /> i fa servir <ph name="KX" /> com a mecanisme d'intercanvi clau.</translation>
 <translation id="2835170189407361413">Esborra el formulari</translation>
 <translation id="2889159643044928134">No tornis a carregar</translation>
-<translation id="2900469785430194048">Google Chrome s'ha quedat sense memòria en provar de mostrar aquesta pàgina web.</translation>
 <translation id="2909946352844186028">S'ha detectat un canvi a la xarxa.</translation>
 <translation id="2916038427272391327">Tanca altres programes</translation>
 <translation id="2922350208395188000">No es pot comprovar el certificat del servidor.</translation>
@@ -243,7 +242,6 @@
 <translation id="3024663005179499861">Tipus de política incorrecte</translation>
 <translation id="3032412215588512954">Voleu tornar a carregar aquest lloc?</translation>
 <translation id="3037605927509011580">Oh, no!</translation>
-<translation id="3040955737384246924">{COUNT,plural, =0{almenys 1 element als dispositius sincronitzats}=1{1 element (i altres elements als dispositius sincronitzats)}other{# elements (i altres elements als dispositius sincronitzats)}}</translation>
 <translation id="3041612393474885105">Informació del certificat</translation>
 <translation id="3063697135517575841">Chrome no ha pogut confirmar la teva targeta. Torna-ho a provar més tard.</translation>
 <translation id="3064966200440839136">Per pagar amb una aplicació externa sortiràs del mode d'incògnit. Vols continuar?</translation>
@@ -337,7 +335,6 @@
 <translation id="3681007416295224113">Informació del certificat</translation>
 <translation id="3690164694835360974">L'inici de sessió no és segur</translation>
 <translation id="3693415264595406141">Contrasenya:</translation>
-<translation id="3696411085566228381">cap</translation>
 <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation>
 <translation id="370665806235115550">S'està carregant...</translation>
 <translation id="3712624925041724820">Llicències exhaurides</translation>
@@ -385,7 +382,6 @@
 <translation id="4171400957073367226">La signatura de verificació és incorrecta</translation>
 <translation id="4196861286325780578">&amp;Refés el moviment</translation>
 <translation id="4203896806696719780"><ph name="BEGIN_LINK" />Comproveu la configuració del tallafoc i de l'antivirus<ph name="END_LINK" /></translation>
-<translation id="4206349416402437184">{COUNT,plural, =0{cap}=1{1 aplicació ($1)}=2{2 aplicacions ($1, $2)}other{# aplicacions ($1, $2, $3)}}</translation>
 <translation id="4220128509585149162">Errors</translation>
 <translation id="4226937834893929579"><ph name="BEGIN_LINK" />Proveu d'executar el Diagnòstic de xarxa<ph name="END_LINK" />.</translation>
 <translation id="4250431568374086873">La teva connexió amb aquest lloc no és del tot segura</translation>
@@ -469,7 +465,6 @@
 <translation id="5045550434625856497">Contrasenya incorrecta</translation>
 <translation id="5056549851600133418">Articles que us poden interessar</translation>
 <translation id="5070335125961472645"><ph name="BEGIN_LINK" />Comproveu l'adreça del servidor intermediari<ph name="END_LINK" /></translation>
-<translation id="5076731569460970710">{COUNT,plural, =0{No s'utilitzen galetes}=1{1 lloc utilitza galetes. }other{# llocs utilitzen galetes. }}</translation>
 <translation id="5087286274860437796">En aquest moment el certificat del servidor no és vàlid.</translation>
 <translation id="5087580092889165836">Afegiu una targeta</translation>
 <translation id="5089810972385038852">Estat</translation>
@@ -601,7 +596,6 @@
 <translation id="6358450015545214790">Què vol dir tot això?</translation>
 <translation id="6386120369904791316">{COUNT,plural, =1{1 suggeriment més}other{# suggeriments més}}</translation>
 <translation id="6387478394221739770">Esteu interessat en les funcions de Chrome noves i interessants? Proveu el nostre canal beta a la pàgina chrome.com/beta.</translation>
-<translation id="6389758589412724634">Chromium s'ha quedat sense memòria en provar de mostrar aquesta pàgina web.</translation>
 <translation id="6404511346730675251">Edita l'adreça d'interès</translation>
 <translation id="6410264514553301377">Introdueix la data de caducitat i el CVC de la targeta <ph name="CREDIT_CARD" /></translation>
 <translation id="6414888972213066896">Has demanat permís als teus pares per visitar aquest lloc</translation>
@@ -624,7 +618,6 @@
 <translation id="6556915248009097796">Data de caducitat: <ph name="EXPIRATION_DATE_ABBR" />; última utilització: <ph name="LAST_USED_DATE_NO_DETAIL" /></translation>
 <translation id="6563469144985748109">El teu gestor encara no ho ha aprovat</translation>
 <translation id="6569060085658103619">Estàs consultant la pàgina d'una extensió</translation>
-<translation id="6593753688552673085">menys de: <ph name="UPPER_ESTIMATE" /></translation>
 <translation id="6596325263575161958">Opcions d'encriptació</translation>
 <translation id="662080504995468778">No surtis</translation>
 <translation id="6626291197371920147">Afegeix un número de targeta vàlid</translation>
@@ -636,7 +629,6 @@
 <translation id="6710594484020273272">&lt;Escriviu el terme de cerca&gt;</translation>
 <translation id="6711464428925977395">Hi ha hagut algun problema amb el servidor intermediari o l'adreça no és correcta.</translation>
 <translation id="6727102863431372879">Configura</translation>
-<translation id="6731320287533051140">{COUNT,plural, =0{cap}=1{1 element}other{# elements}}</translation>
 <translation id="674375294223700098">Error de certificat del servidor desconegut.</translation>
 <translation id="6753269504797312559">Valor de la política</translation>
 <translation id="6757797048963528358">El dispositiu ha entrat en mode de repòs.</translation>
@@ -742,6 +734,7 @@
 <translation id="7669271284792375604">És possible que els atacants d'aquest lloc intentin enganyar-te perquè instal·lis programes que perjudiquen la teva navegació (per exemple, et poden canviar la pàgina d'inici o mostrar anuncis addicionals als llocs que visites).</translation>
 <translation id="7674629440242451245">Esteu interessat en les funcions de Chrome noves i interessants? Proveu el nostre canal per a desenvolupadors a la pàgina chrome.com/dev.</translation>
 <translation id="7682287625158474539">Enviament</translation>
+<translation id="7701040980221191251">Cap</translation>
 <translation id="7704050614460855821"><ph name="BEGIN_LINK" />Continua per accedir a <ph name="SITE" /> (no segur)<ph name="END_LINK" /></translation>
 <translation id="7714464543167945231">Certificat</translation>
 <translation id="7716424297397655342">Aquest lloc no es pot carregar des de la memòria cau</translation>
@@ -781,7 +774,6 @@
 <translation id="8041089156583427627">Envia comentaris</translation>
 <translation id="8041940743680923270">Utilitza l'opció predeterminada global (Pregunta)</translation>
 <translation id="8088680233425245692">No s'ha pogut consultar l'article.</translation>
-<translation id="8089520772729574115">menys d'1 MB</translation>
 <translation id="8091372947890762290">L'activació està pendent al servidor</translation>
 <translation id="8118489163946903409">Mètode de pagament</translation>
 <translation id="8131740175452115882">Confirma</translation>
diff --git a/components/strings/components_strings_cs.xtb b/components/strings/components_strings_cs.xtb
index 0b72b2d..cf384a8 100644
--- a/components/strings/components_strings_cs.xtb
+++ b/components/strings/components_strings_cs.xtb
@@ -220,7 +220,6 @@
 <translation id="2826760142808435982">Připojení je šifrováno a ověřeno pomocí šifry <ph name="CIPHER" /> a jako mechanismus výměny klíčů používá <ph name="KX" />.</translation>
 <translation id="2835170189407361413">Vymazat formulář</translation>
 <translation id="2889159643044928134">Nenačítat znovu</translation>
-<translation id="2900469785430194048">Prohlížeč Google Chrome k zobrazení této webové stránky neměl dostatek paměti.</translation>
 <translation id="2909946352844186028">Byla zjištěna změna sítě.</translation>
 <translation id="2916038427272391327">Zavřete ostatní programy</translation>
 <translation id="2922350208395188000">Certifikát serveru nelze zkontrolovat.</translation>
@@ -243,7 +242,6 @@
 <translation id="3024663005179499861">Chybný typ zásady</translation>
 <translation id="3032412215588512954">Chcete tento web načíst znovu?</translation>
 <translation id="3037605927509011580">Aj, chyba!</translation>
-<translation id="3040955737384246924">{COUNT,plural, =0{alespoň jedna položka v synchronizovaných zařízeních}=1{1 položka (a další v synchronizovaných zařízeních)}few{# položky (a další v synchronizovaných zařízeních)}many{# položky (a další v synchronizovaných zařízeních)}other{# položek (a další v synchronizovaných zařízeních)}}</translation>
 <translation id="3041612393474885105">Informace o certifikátu</translation>
 <translation id="3063697135517575841">Chrome vaši kartu aktuálně nemohl ověřit. Zkuste to prosím znovu později.</translation>
 <translation id="3064966200440839136">Chystáte se opustit anonymní režim, abyste mohli zaplatit v externí aplikaci. Chcete pokračovat?</translation>
@@ -333,7 +331,6 @@
 <translation id="3681007416295224113">Informace o certifikátu</translation>
 <translation id="3690164694835360974">Přihlášení není zabezpečené</translation>
 <translation id="3693415264595406141">Heslo:</translation>
-<translation id="3696411085566228381">žádné</translation>
 <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation>
 <translation id="370665806235115550">Načítání...</translation>
 <translation id="3712624925041724820">Byly vyčerpány licence</translation>
@@ -381,7 +378,6 @@
 <translation id="4171400957073367226">Chybný ověřovací podpis</translation>
 <translation id="4196861286325780578">&amp;Opakovat přesunutí</translation>
 <translation id="4203896806696719780"><ph name="BEGIN_LINK" />Zkontrolovat konfiguraci firewallu a antivirového softwaru<ph name="END_LINK" /></translation>
-<translation id="4206349416402437184">{COUNT,plural, =0{žádná aplikace}=1{1 aplikace ($1)}=2{2 aplikace ($1, $2)}few{# aplikace ($1, $2 $3)}many{# aplikace ($1, $2 $3)}other{# aplikací ($1, $2 $3)}}</translation>
 <translation id="4220128509585149162">Selhání</translation>
 <translation id="4226937834893929579"><ph name="BEGIN_LINK" />Zkuste spustit Diagnostiku sítě<ph name="END_LINK" />.</translation>
 <translation id="4250431568374086873">Spojení s tímto webem není plně zabezpečené</translation>
@@ -465,7 +461,6 @@
 <translation id="5045550434625856497">Nesprávné heslo</translation>
 <translation id="5056549851600133418">Články pro vás</translation>
 <translation id="5070335125961472645"><ph name="BEGIN_LINK" />Zkontrolovat adresu proxy serveru<ph name="END_LINK" /></translation>
-<translation id="5076731569460970710">{COUNT,plural, =0{Žádné soubory cookie}=1{Soubory cookie používá 1 web. }few{Soubory cookie používají # weby. }many{Soubory cookie používá # webu. }other{Soubory cookie používá # webů. }}</translation>
 <translation id="5087286274860437796">Certifikát serveru v tuto chvíli není platný.</translation>
 <translation id="5087580092889165836">Přidat kartu</translation>
 <translation id="5089810972385038852">Stát/kraj</translation>
@@ -596,7 +591,6 @@
 <translation id="6358450015545214790">Nápověda</translation>
 <translation id="6386120369904791316">{COUNT,plural, =1{1 další návrh}few{# další návrhy}many{# dalšího návrhu}other{# dalších návrhů}}</translation>
 <translation id="6387478394221739770">Zajímají vás nové funkce Chromu? Vyzkoušejte kanál beta na adrese chrome.com/beta.</translation>
-<translation id="6389758589412724634">Prohlížeč Chromium k zobrazení této webové stránky neměl dostatek paměti.</translation>
 <translation id="6404511346730675251">Upravit záložku</translation>
 <translation id="6410264514553301377">Zadejte datum vypršení platnosti a kód CVC karty <ph name="CREDIT_CARD" />.</translation>
 <translation id="6414888972213066896">Zeptal(a) ses rodiče, zda můžeš navštívit tento web.</translation>
@@ -619,7 +613,6 @@
 <translation id="6556915248009097796">Platnost do <ph name="EXPIRATION_DATE_ABBR" />, naposledy použito <ph name="LAST_USED_DATE_NO_DETAIL" /></translation>
 <translation id="6563469144985748109">Správce vám přístup na web dosud neschválil.</translation>
 <translation id="6569060085658103619">Prohlížíte si stránku rozšíření</translation>
-<translation id="6593753688552673085">méně než <ph name="UPPER_ESTIMATE" /></translation>
 <translation id="6596325263575161958">Možnosti šifrování</translation>
 <translation id="662080504995468778">Zůstat</translation>
 <translation id="6626291197371920147">Přidání platného čísla karty</translation>
@@ -631,7 +624,6 @@
 <translation id="6710594484020273272">&lt;Zadejte vyhledávací dotaz&gt;</translation>
 <translation id="6711464428925977395">Došlo k chybě proxy serveru nebo jste zadali nesprávnou adresu.</translation>
 <translation id="6727102863431372879">Nastavit</translation>
-<translation id="6731320287533051140">{COUNT,plural, =0{žádné položky}=1{1 položka}few{# položky}many{# položky}other{# položek}}</translation>
 <translation id="674375294223700098">Neznámá chyba certifikátu serveru.</translation>
 <translation id="6753269504797312559">Hodnota zásady</translation>
 <translation id="6757797048963528358">Zařízení přešlo do režimu spánku.</translation>
@@ -737,6 +729,7 @@
 <translation id="7669271284792375604">Útočníci na tomto webu by se mohli pokusit přimět vás k instalaci programů, které nepříznivě ovlivní procházení webu (například změní vaši domovskou stránku nebo na navštěvovaných stránkách budou zobrazovat další reklamy).</translation>
 <translation id="7674629440242451245">Zajímají vás nové funkce Chromu? Vyzkoušejte kanál pro vývojáře na adrese chrome.com/dev.</translation>
 <translation id="7682287625158474539">Doprava</translation>
+<translation id="7701040980221191251">Žádné</translation>
 <translation id="7704050614460855821"><ph name="BEGIN_LINK" />Pokračovat na web <ph name="SITE" /> (nespolehlivý)<ph name="END_LINK" /></translation>
 <translation id="7714464543167945231">Certifikát</translation>
 <translation id="7716424297397655342">Tento web nelze načíst z mezipaměti</translation>
@@ -776,7 +769,6 @@
 <translation id="8041089156583427627">Odeslat svůj názor</translation>
 <translation id="8041940743680923270">Použít výchozí globální hodnotu (Dotázat se)</translation>
 <translation id="8088680233425245692">Zobrazení článku se nezdařilo.</translation>
-<translation id="8089520772729574115">méně než 1 MB</translation>
 <translation id="8091372947890762290">Čeká se na aktivaci na serveru</translation>
 <translation id="8118489163946903409">Platební metoda</translation>
 <translation id="8131740175452115882">Potvrdit</translation>
diff --git a/components/strings/components_strings_da.xtb b/components/strings/components_strings_da.xtb
index f927815..43f4d38 100644
--- a/components/strings/components_strings_da.xtb
+++ b/components/strings/components_strings_da.xtb
@@ -220,7 +220,6 @@
 <translation id="2826760142808435982">Forbindelsen er krypteret og godkendt ved hjælp af <ph name="CIPHER" />, og den anvender <ph name="KX" /> som primær udvekslingsmekanisme.</translation>
 <translation id="2835170189407361413">Ryd formular</translation>
 <translation id="2889159643044928134">Genindlæs ikke siden</translation>
-<translation id="2900469785430194048">Google Chrome løb tør for hukommelse, da websiden skulle vises.</translation>
 <translation id="2909946352844186028">Der blev registreret en netværksændring.</translation>
 <translation id="2916038427272391327">Luk andre programmer</translation>
 <translation id="2922350208395188000">Serverens certifikat kan ikke kontrolleres.</translation>
@@ -243,7 +242,6 @@
 <translation id="3024663005179499861">Forkert politiktype</translation>
 <translation id="3032412215588512954">Vil du genindlæse denne side?</translation>
 <translation id="3037605927509011580">Øv, surt!</translation>
-<translation id="3040955737384246924">{COUNT,plural, =0{mindst 1 element på synkroniserede enheder}=1{1 element (og flere på synkroniserede enheder)}one{# element (og flere på synkroniserede enheder)}other{# elementer (og flere på synkroniserede enheder)}}</translation>
 <translation id="3041612393474885105">Certifikatoplysninger</translation>
 <translation id="3063697135517575841">Chrome kan ikke bekræfte dit kort i øjeblikket. Prøv igen senere.</translation>
 <translation id="3064966200440839136">Du forlader inkognitotilstand for at betale via en ekstern applikation. Vil du fortsætte?</translation>
@@ -337,7 +335,6 @@
 <translation id="3681007416295224113">Certifikatoplysninger</translation>
 <translation id="3690164694835360974">Login er ikke sikkert</translation>
 <translation id="3693415264595406141">Adgangskode:</translation>
-<translation id="3696411085566228381">ingen</translation>
 <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation>
 <translation id="370665806235115550">Indlæser...</translation>
 <translation id="3712624925041724820">Licenserne er opbrugt</translation>
@@ -385,7 +382,6 @@
 <translation id="4171400957073367226">Ugyldig verifikationssignatur</translation>
 <translation id="4196861286325780578">&amp;Annuller fortryd flytning</translation>
 <translation id="4203896806696719780"><ph name="BEGIN_LINK" />Kontrollere firewall- og antiviruskonfigurationer<ph name="END_LINK" /></translation>
-<translation id="4206349416402437184">{COUNT,plural, =0{ingen}=1{1 app ($1)}=2{2 apps ($1, $2)}one{# app ($1, $2, $3)}other{# apps ($1, $2, $3)}}</translation>
 <translation id="4220128509585149162">Nedbrud</translation>
 <translation id="4226937834893929579"><ph name="BEGIN_LINK" />Prøv at køre Netværksdiagnosticering<ph name="END_LINK" />.</translation>
 <translation id="4250431568374086873">Din forbindelse til dette website er ikke helt sikker</translation>
@@ -469,7 +465,6 @@
 <translation id="5045550434625856497">Ugyldig adgangskode</translation>
 <translation id="5056549851600133418">Artikler til dig</translation>
 <translation id="5070335125961472645"><ph name="BEGIN_LINK" />Tjekke proxy-adressen<ph name="END_LINK" /></translation>
-<translation id="5076731569460970710">{COUNT,plural, =0{Ingen cookies}=1{1 website bruger cookies. }one{# website bruger cookies. }other{# websites bruger cookies. }}</translation>
 <translation id="5087286274860437796">Serverens certifikatet er ikke gyldigt i øjeblikket.</translation>
 <translation id="5087580092889165836">Tilføj kort</translation>
 <translation id="5089810972385038852">Delstat</translation>
@@ -601,7 +596,6 @@
 <translation id="6358450015545214790">Hvad betyder dette?</translation>
 <translation id="6386120369904791316">{COUNT,plural, =1{1 andet forslag}one{# andet forslag}other{# andre forslag}}</translation>
 <translation id="6387478394221739770">Er du interesseret i smarte nye Chrome-funktioner? Prøv vores betakanal på chrome.com/beta.</translation>
-<translation id="6389758589412724634">Chromium løb tør for hukommelse, da websiden skulle vises.</translation>
 <translation id="6404511346730675251">Rediger bogmærke</translation>
 <translation id="6410264514553301377">Indtast udløbsdatoen og kontrolkoden for <ph name="CREDIT_CARD" /></translation>
 <translation id="6414888972213066896">Du har spurgt en af dine forældre, om det er i orden, at du besøger dette website.</translation>
@@ -624,7 +618,6 @@
 <translation id="6556915248009097796">Udløbsdato: <ph name="EXPIRATION_DATE_ABBR" />. Sidst anvendt <ph name="LAST_USED_DATE_NO_DETAIL" /></translation>
 <translation id="6563469144985748109">Din administrator har ikke godkendt det endnu</translation>
 <translation id="6569060085658103619">Du ser en udvidelsesside</translation>
-<translation id="6593753688552673085">mindre end <ph name="UPPER_ESTIMATE" /></translation>
 <translation id="6596325263575161958">Krypteringsmuligheder</translation>
 <translation id="662080504995468778">Bliv her</translation>
 <translation id="6626291197371920147">Tilføj gyldigt kortnummer</translation>
@@ -636,7 +629,6 @@
 <translation id="6710594484020273272">&lt;Indtast søgeterm&gt;</translation>
 <translation id="6711464428925977395">Der er noget galt med proxyserveren, eller adressen er forkert.</translation>
 <translation id="6727102863431372879">Angiv</translation>
-<translation id="6731320287533051140">{COUNT,plural, =0{ingen}=1{1 element}one{# element}other{# elementer}}</translation>
 <translation id="674375294223700098">Ukendt fejl i servercertifikatet.</translation>
 <translation id="6753269504797312559">Politikkens værdi</translation>
 <translation id="6757797048963528358">Din enhed gik i dvale.</translation>
@@ -742,6 +734,7 @@
 <translation id="7669271284792375604">Hackere på dette website kan forsøge at narre dig til at installere programmer, der skader din browseroplevelse (f.eks. ved at ændre din startside eller vise flere annoncer på de websites, du besøger).</translation>
 <translation id="7674629440242451245">Er du interesseret i smarte nye Chrome-funktioner? Prøv vores udviklerkanal på chrome.com/dev.</translation>
 <translation id="7682287625158474539">Forsendelse</translation>
+<translation id="7701040980221191251">Ingen</translation>
 <translation id="7704050614460855821"><ph name="BEGIN_LINK" />Fortsæt til <ph name="SITE" /> (usikkert)<ph name="END_LINK" /></translation>
 <translation id="7714464543167945231">Certifikat</translation>
 <translation id="7716424297397655342">Dette website kan ikke indlæses fra cachen</translation>
@@ -781,7 +774,6 @@
 <translation id="8041089156583427627">Send feedback</translation>
 <translation id="8041940743680923270">Brug global standard (spørg)</translation>
 <translation id="8088680233425245692">Artiklen kunne ikke vises.</translation>
-<translation id="8089520772729574115">mindre end 1 MB</translation>
 <translation id="8091372947890762290">Aktivering afventer serveren</translation>
 <translation id="8118489163946903409">Betalingsmetode</translation>
 <translation id="8131740175452115882">Bekræft</translation>
diff --git a/components/strings/components_strings_de.xtb b/components/strings/components_strings_de.xtb
index 9df58b1..a345dab81 100644
--- a/components/strings/components_strings_de.xtb
+++ b/components/strings/components_strings_de.xtb
@@ -220,7 +220,6 @@
 <translation id="2826760142808435982">Die Verbindung ist mit <ph name="CIPHER" /> verschlüsselt und authentifiziert und verwendet <ph name="KX" /> als Mechanismus für den Schlüsselaustausch.</translation>
 <translation id="2835170189407361413">Formular leeren</translation>
 <translation id="2889159643044928134">Nicht neu laden</translation>
-<translation id="2900469785430194048">Beim Versuch, diese Webseite aufzurufen, hat Google Chrome das Arbeitsspeicherlimit erreicht.</translation>
 <translation id="2909946352844186028">Eine Netzwerkänderung ist aufgetreten.</translation>
 <translation id="2916038427272391327">Andere Programme schließen</translation>
 <translation id="2922350208395188000">Das Serverzertifikat kann nicht überprüft werden.</translation>
@@ -243,7 +242,6 @@
 <translation id="3024663005179499861">Falscher Richtlinientyp</translation>
 <translation id="3032412215588512954">Möchten Sie diese Website neu laden?</translation>
 <translation id="3037605927509011580">Oh nein!</translation>
-<translation id="3040955737384246924">{COUNT,plural, =0{mindestens 1 Inhalt auf synchronisierten Geräten}=1{1 Inhalt (und weitere auf synchronisierten Geräten)}other{# Inhalte (und weitere auf synchronisierten Geräten)}}</translation>
 <translation id="3041612393474885105">Zertifikatinformationen</translation>
 <translation id="3063697135517575841">Ihre Karte kann von Chrome zurzeit nicht bestätigt werden. Bitte versuchen Sie es später noch einmal.</translation>
 <translation id="3064966200440839136">Der Inkognitomodus wird beendet, um über eine externe Anwendung zu zahlen. Fortfahren?</translation>
@@ -336,7 +334,6 @@
 <translation id="3681007416295224113">Zertifikatinformationen</translation>
 <translation id="3690164694835360974">Log-in nicht sicher</translation>
 <translation id="3693415264595406141">Passwort:</translation>
-<translation id="3696411085566228381">keine</translation>
 <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation>
 <translation id="370665806235115550">Wird geladen...</translation>
 <translation id="3712624925041724820">Lizenzen aufgebraucht</translation>
@@ -384,7 +381,6 @@
 <translation id="4171400957073367226">Ungültige Bestätigungssignatur</translation>
 <translation id="4196861286325780578">&amp;Verschieben wiederholen</translation>
 <translation id="4203896806696719780"><ph name="BEGIN_LINK" />Firewall und Antivirenkonfiguration prüfen<ph name="END_LINK" /></translation>
-<translation id="4206349416402437184">{COUNT,plural, =0{keine}=1{1 App ($1)}=2{2 Apps ($1, $2)}other{# Apps ($1, $2, $3)}}</translation>
 <translation id="4220128509585149162">Abstürze</translation>
 <translation id="4226937834893929579"><ph name="BEGIN_LINK" />Versuchen Sie, die Netzwerkdiagnose auszuführen.<ph name="END_LINK" /></translation>
 <translation id="4250431568374086873">Die Verbindung zu dieser Website ist nicht uneingeschränkt sicher</translation>
@@ -468,7 +464,6 @@
 <translation id="5045550434625856497">Falsches Passwort</translation>
 <translation id="5056549851600133418">Artikel für Sie</translation>
 <translation id="5070335125961472645"><ph name="BEGIN_LINK" />Proxyadresse prüfen<ph name="END_LINK" /></translation>
-<translation id="5076731569460970710">{COUNT,plural, =0{Keine Cookies}=1{1 Website verwendet Cookies. }other{# Websites verwenden Cookies. }}</translation>
 <translation id="5087286274860437796">Das Serverzertifikat ist zurzeit ungültig.</translation>
 <translation id="5087580092889165836">Karte hinzufügen</translation>
 <translation id="5089810972385038852">Bundesstaat/-land</translation>
@@ -600,7 +595,6 @@
 <translation id="6358450015545214790">Was bedeuten diese Hinweise?</translation>
 <translation id="6386120369904791316">{COUNT,plural, =1{1 weiterer Vorschlag}other{# weitere Vorschläge}}</translation>
 <translation id="6387478394221739770">Interessiert an coolen neuen Chrome-Funktionen? Testen Sie unsere Betaversion unter chrome.com/beta.</translation>
-<translation id="6389758589412724634">Beim Versuch, diese Webseite aufzurufen, hat Chromium das Arbeitsspeicherlimit erreicht.</translation>
 <translation id="6404511346730675251">Lesezeichen bearbeiten</translation>
 <translation id="6410264514553301377">Ablaufdatum und CVC für <ph name="CREDIT_CARD" /> eingeben</translation>
 <translation id="6414888972213066896">Du hast ein Elternteil gefragt, ob du diese Website besuchen darfst</translation>
@@ -623,7 +617,6 @@
 <translation id="6556915248009097796">Gültig bis: <ph name="EXPIRATION_DATE_ABBR" />, zuletzt verwendet: <ph name="LAST_USED_DATE_NO_DETAIL" /></translation>
 <translation id="6563469144985748109">Der Administrator hat die Berechtigung noch nicht erteilt</translation>
 <translation id="6569060085658103619">Dies ist eine Erweiterungsseite</translation>
-<translation id="6593753688552673085">weniger als <ph name="UPPER_ESTIMATE" /></translation>
 <translation id="6596325263575161958">Verschlüsselungsoptionen</translation>
 <translation id="662080504995468778">Bleiben</translation>
 <translation id="6626291197371920147">Gültige Kartennummer hinzufügen</translation>
@@ -635,7 +628,6 @@
 <translation id="6710594484020273272">&lt;Suchbegriff eingeben&gt;</translation>
 <translation id="6711464428925977395">Mit dem Proxyserver ist ein Problem aufgetreten oder die Adresse ist falsch.</translation>
 <translation id="6727102863431372879">Festlegen</translation>
-<translation id="6731320287533051140">{COUNT,plural, =0{keine}=1{1 Inhalt}other{# Inhalte}}</translation>
 <translation id="674375294223700098">Fehler wegen unbekanntem Serverzertifikat</translation>
 <translation id="6753269504797312559">Wert der Richtlinie</translation>
 <translation id="6757797048963528358">Ihr Gerät ist im Ruhemodus.</translation>
@@ -741,6 +733,7 @@
 <translation id="7669271284792375604">Unbefugte Dritte auf dieser Website versuchen eventuell, Sie zur Installation von Programmen zu bewegen, die sich nachteilig auf Ihre Browsernutzung auswirken. Dabei kann zum Beispiel Ihre Startseite geändert werden oder es erscheinen zusätzliche Anzeigen auf von Ihnen besuchten Websites.</translation>
 <translation id="7674629440242451245">Interessiert an coolen neuen Chrome-Funktionen? Testen Sie unsere Dev-Version unter chrome.com/dev.</translation>
 <translation id="7682287625158474539">Versand</translation>
+<translation id="7701040980221191251">Keine</translation>
 <translation id="7704050614460855821"><ph name="BEGIN_LINK" />Weiter zu <ph name="SITE" /> (unsicher)<ph name="END_LINK" /></translation>
 <translation id="7714464543167945231">Zertifikat</translation>
 <translation id="7716424297397655342">Diese Website kann nicht aus dem Cache geladen werden</translation>
@@ -780,7 +773,6 @@
 <translation id="8041089156583427627">Feedback geben</translation>
 <translation id="8041940743680923270">Globalen Standard verwenden (Fragen)</translation>
 <translation id="8088680233425245692">Der Artikel kann nicht angezeigt werden.</translation>
-<translation id="8089520772729574115">weniger als 1 MB</translation>
 <translation id="8091372947890762290">Aktivierung auf dem Server steht noch aus.</translation>
 <translation id="8118489163946903409">Zahlungsmethode</translation>
 <translation id="8131740175452115882">Bestätigen</translation>
diff --git a/components/strings/components_strings_el.xtb b/components/strings/components_strings_el.xtb
index 8b13ffd..16513bf 100644
--- a/components/strings/components_strings_el.xtb
+++ b/components/strings/components_strings_el.xtb
@@ -220,7 +220,6 @@
 <translation id="2826760142808435982">Η κρυπτογράφηση και ο έλεγχος ταυτότητας της σύνδεσης γίνονται με <ph name="CIPHER" /> και χρησιμοποιεί το <ph name="KX" /> ως μηχανισμό ανταλλαγής κλειδιών.</translation>
 <translation id="2835170189407361413">Διαγραφή φόρμας</translation>
 <translation id="2889159643044928134">Να μην γίνει επανάληψη φόρτωσης</translation>
-<translation id="2900469785430194048">Η διαθέσιμη μνήμη του Google Chrome εξαντλήθηκε, κατά την προσπάθεια προβολής αυτής της ιστοσελίδας.</translation>
 <translation id="2909946352844186028">Εντοπίστηκε μια αλλαγή δικτύου.</translation>
 <translation id="2916038427272391327">Κλείστε τα άλλα προγράμματα</translation>
 <translation id="2922350208395188000">Δεν είναι δυνατός ο έλεγχος του πιστοποιητικού του διακομιστή.</translation>
@@ -243,7 +242,6 @@
 <translation id="3024663005179499861">Λανθασμένος τύπος πολιτικής</translation>
 <translation id="3032412215588512954">Θέλετε να φορτώσετε ξανά αυτόν τον ιστότοπο;</translation>
 <translation id="3037605927509011580">Όπα! Κάτι πήγε στραβά!</translation>
-<translation id="3040955737384246924">{COUNT,plural, =0{τουλάχιστον ένα στοιχείο στις συγχρονισμένες συσκευές}=1{1 στοιχείο (και περισσότερα στις συγχρονισμένες συσκευές)}other{# στοιχεία (και περισσότερα στις συγχρονισμένες συσκευές)}}</translation>
 <translation id="3041612393474885105">Πληροφορίες πιστοποιητικού</translation>
 <translation id="3063697135517575841">Δεν ήταν δυνατή η επιβεβαίωση της κάρτας σας από το Chrome αυτήν τη στιγμή. Δοκιμάστε ξανά αργότερα.</translation>
 <translation id="3064966200440839136">Αποχώρηση από την κατάσταση ανώνυμης περιήγησης για πληρωμή μέσω εξωτερικής εφαρμογής. Συνέχεια;</translation>
@@ -337,7 +335,6 @@
 <translation id="3681007416295224113">Πληροφορίες πιστοποιητικού</translation>
 <translation id="3690164694835360974">Μη ασφαλής σύνδεση</translation>
 <translation id="3693415264595406141">Κωδικός πρόσβασης:</translation>
-<translation id="3696411085566228381">κανένα</translation>
 <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation>
 <translation id="370665806235115550">Φόρτωση...</translation>
 <translation id="3712624925041724820">Οι άδειες έχουν εξαντληθεί</translation>
@@ -385,7 +382,6 @@
 <translation id="4171400957073367226">Εσφαλμένη υπογραφή επαλήθευσης</translation>
 <translation id="4196861286325780578">&amp;Επανάληψη μετακίνησης</translation>
 <translation id="4203896806696719780"><ph name="BEGIN_LINK" />Ελέγξτε τις διαμορφώσεις του τείχους προστασίας και της προστασίας από ιούς<ph name="END_LINK" /></translation>
-<translation id="4206349416402437184">{COUNT,plural, =0{καμία}=1{1 εφαρμογή ($1)}=2{2 εφαρμογές ($1, $2)}other{# εφαρμογές ($1, $2, $3)}}</translation>
 <translation id="4220128509585149162">Απότομες διακοπές λειτουργίας</translation>
 <translation id="4226937834893929579"><ph name="BEGIN_LINK" />Δοκιμάστε να εκτελέσετε τον Διαγνωστικό έλεγχο δικτύου<ph name="END_LINK" />.</translation>
 <translation id="4250431568374086873">Η σύνδεσή σας σε αυτόν τον ιστότοπο δεν είναι πλήρως ασφαλής</translation>
@@ -469,7 +465,6 @@
 <translation id="5045550434625856497">Λανθασμένος κωδικός πρόσβασης</translation>
 <translation id="5056549851600133418">Άρθρα για εσάς</translation>
 <translation id="5070335125961472645"><ph name="BEGIN_LINK" />Ελέγξτε τη διεύθυνση του διακομιστή μεσολάβησης<ph name="END_LINK" /></translation>
-<translation id="5076731569460970710">{COUNT,plural, =0{Χωρίς cookie}=1{1 ιστότοπος χρησιμοποιεί cookie. }other{# ιστότοποι χρησιμοποιούν cookie. }}</translation>
 <translation id="5087286274860437796">Το πιστοποιητικό του διακομιστή δεν είναι έγκυρο αυτήν τη στιγμή.</translation>
 <translation id="5087580092889165836">Προσθήκη κάρτας</translation>
 <translation id="5089810972385038852">Πολιτεία</translation>
@@ -601,7 +596,6 @@
 <translation id="6358450015545214790">Τι σημαίνουν αυτά;</translation>
 <translation id="6386120369904791316">{COUNT,plural, =1{1 πρόταση ακόμα}other{# προτάσεις ακόμα}}</translation>
 <translation id="6387478394221739770">Θέλετε να ενημερώνεστε για τις συναρπαστικές νέες δυνατότητες του Chrome; Επισκεφτείτε το κανάλι beta στη διεύθυνση chrome.com/beta.</translation>
-<translation id="6389758589412724634">Η διαθέσιμη μνήμη του Chromium εξαντλήθηκε, κατά την προσπάθεια προβολής αυτής της ιστοσελίδας.</translation>
 <translation id="6404511346730675251">Επεξεργασία σελιδοδείκτη</translation>
 <translation id="6410264514553301377">Εισαγάγετε την ημερομηνία λήξης και τον κωδικό CVC για την κάρτα <ph name="CREDIT_CARD" /></translation>
 <translation id="6414888972213066896">Ρώτησες τους γονείς σου εάν σου επιτρέπουν να επισκεφτείς αυτόν τον ιστότοπο</translation>
@@ -624,7 +618,6 @@
 <translation id="6556915248009097796">Λήξη: <ph name="EXPIRATION_DATE_ABBR" />, τελευταία χρήση <ph name="LAST_USED_DATE_NO_DETAIL" /></translation>
 <translation id="6563469144985748109">Ο διαχειριστής σας δεν τον έχει εγκρίνει ακόμα</translation>
 <translation id="6569060085658103619">Βλέπετε μια σελίδα επέκτασης</translation>
-<translation id="6593753688552673085">λιγότερο από <ph name="UPPER_ESTIMATE" /></translation>
 <translation id="6596325263575161958">Επιλογές κρυπτογράφησης</translation>
 <translation id="662080504995468778">Παραμονή</translation>
 <translation id="6626291197371920147">Προσθήκη έγκυρου αριθμού κάρτας</translation>
@@ -636,7 +629,6 @@
 <translation id="6710594484020273272">&lt;Πληκτρολογήστε όρο αναζήτησης&gt;</translation>
 <translation id="6711464428925977395">Υπάρχει κάποιο πρόβλημα με το διακομιστή μεσολάβησης ή η διεύθυνση είναι εσφαλμένη.</translation>
 <translation id="6727102863431372879">Ορισμός</translation>
-<translation id="6731320287533051140">{COUNT,plural, =0{καμία}=1{1 στοιχείο}other{# στοιχεία}}</translation>
 <translation id="674375294223700098">Άγνωστο σφάλμα πιστοποιητικού διακομιστή</translation>
 <translation id="6753269504797312559">Τιμή πολιτικής</translation>
 <translation id="6757797048963528358">Η συσκευή σας τέθηκε σε αδράνεια.</translation>
@@ -742,6 +734,7 @@
 <translation id="7669271284792375604">Οι εισβολείς σε αυτόν τον ιστότοπο μπορεί να επιχειρήσουν να σας ξεγελάσουν, έτσι ώστε να εγκαταστήσετε προγράμματα που βλάπτουν την εμπειρία περιήγησής σας (για παράδειγμα, αλλάζοντας την αρχική σελίδα σας ή εμφανίζοντας επιπλέον διαφημίσεις στους ιστότοπους που επισκέπτεστε).</translation>
 <translation id="7674629440242451245">Θέλετε να ενημερώνεστε για τις συναρπαστικές νέες δυνατότητες του Chrome; Επισκεφτείτε το κανάλι προγραμματιστών στη διεύθυνση chrome.com/dev.</translation>
 <translation id="7682287625158474539">Αποστολή</translation>
+<translation id="7701040980221191251">Καμία</translation>
 <translation id="7704050614460855821"><ph name="BEGIN_LINK" />Μετάβαση στον ιστότοπο <ph name="SITE" /> (μη ασφαλής)<ph name="END_LINK" /></translation>
 <translation id="7714464543167945231">Πιστοποιητικό</translation>
 <translation id="7716424297397655342">Δεν είναι δυνατή η φόρτωση αυτού του ιστότοπου από την κρυφή μνήμη</translation>
@@ -781,7 +774,6 @@
 <translation id="8041089156583427627">Αποστολή σχολίων</translation>
 <translation id="8041940743680923270">Χρήση καθολικής προεπιλεγμένης ρύθμισης (Ερώτηση)</translation>
 <translation id="8088680233425245692">Αποτυχία προβολής άρθρου.</translation>
-<translation id="8089520772729574115">λιγότερο από 1 MB</translation>
 <translation id="8091372947890762290">Η ενεργοποίηση στο διακομιστή εκκρεμεί</translation>
 <translation id="8118489163946903409">Τρόπος πληρωμής</translation>
 <translation id="8131740175452115882">Επιβεβαίωση</translation>
diff --git a/components/strings/components_strings_en-GB.xtb b/components/strings/components_strings_en-GB.xtb
index 7faf045..e522ae6 100644
--- a/components/strings/components_strings_en-GB.xtb
+++ b/components/strings/components_strings_en-GB.xtb
@@ -220,7 +220,6 @@
 <translation id="2826760142808435982">The connection is encrypted and authenticated using <ph name="CIPHER" /> and uses <ph name="KX" /> as the key exchange mechanism.</translation>
 <translation id="2835170189407361413">Clear form</translation>
 <translation id="2889159643044928134">Don't reload</translation>
-<translation id="2900469785430194048">Google Chrome ran out of memory while trying to display this web page.</translation>
 <translation id="2909946352844186028">A network change was detected.</translation>
 <translation id="2916038427272391327">Close other programmes</translation>
 <translation id="2922350208395188000">Server's certificate cannot be checked.</translation>
@@ -243,7 +242,6 @@
 <translation id="3024663005179499861">Wrong policy type</translation>
 <translation id="3032412215588512954">Do you want to reload this site?</translation>
 <translation id="3037605927509011580">Aw, Snap!</translation>
-<translation id="3040955737384246924">{COUNT,plural, =0{at least 1 item on synced devices}=1{1 item (and more on synced devices)}other{# items (and more on synced devices)}}</translation>
 <translation id="3041612393474885105">Certificate Information</translation>
 <translation id="3063697135517575841">Chrome was unable to confirm your card at this time. Please try again later.</translation>
 <translation id="3064966200440839136">Leaving incognito mode to pay via an external application. Continue?</translation>
@@ -337,7 +335,6 @@
 <translation id="3681007416295224113">Certificate information</translation>
 <translation id="3690164694835360974">Login not secure</translation>
 <translation id="3693415264595406141">Password:</translation>
-<translation id="3696411085566228381">none</translation>
 <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation>
 <translation id="370665806235115550">Loading...</translation>
 <translation id="3712624925041724820">Licenses exhausted</translation>
@@ -385,7 +382,6 @@
 <translation id="4171400957073367226">Bad verification signature</translation>
 <translation id="4196861286325780578">&amp;Redo move</translation>
 <translation id="4203896806696719780"><ph name="BEGIN_LINK" />Checking firewall and antivirus configurations<ph name="END_LINK" /></translation>
-<translation id="4206349416402437184">{COUNT,plural, =0{none}=1{1 app ($1)}=2{2 apps ($1, $2)}other{# apps ($1, $2, $3)}}</translation>
 <translation id="4220128509585149162">Crashes</translation>
 <translation id="4226937834893929579"><ph name="BEGIN_LINK" />Try running Network Diagnostics<ph name="END_LINK" />.</translation>
 <translation id="4250431568374086873">Your connection to this site is not fully secure</translation>
@@ -469,7 +465,6 @@
 <translation id="5045550434625856497">Incorrect password</translation>
 <translation id="5056549851600133418">Articles for you</translation>
 <translation id="5070335125961472645"><ph name="BEGIN_LINK" />Checking the proxy address<ph name="END_LINK" /></translation>
-<translation id="5076731569460970710">{COUNT,plural, =0{No cookies}=1{1 site uses cookies. }other{# sites use cookies. }}</translation>
 <translation id="5087286274860437796">Server's certificate is not valid at this time.</translation>
 <translation id="5087580092889165836">Add card</translation>
 <translation id="5089810972385038852">County</translation>
@@ -601,7 +596,6 @@
 <translation id="6358450015545214790">What do these mean?</translation>
 <translation id="6386120369904791316">{COUNT,plural, =1{1 other suggestion}other{# other suggestions}}</translation>
 <translation id="6387478394221739770">Interested in cool new Chrome features? Try our beta channel at chrome.com/beta.</translation>
-<translation id="6389758589412724634">Chromium ran out of memory while trying to display this web page.</translation>
 <translation id="6404511346730675251">Edit bookmark</translation>
 <translation id="6410264514553301377">Enter the expiry date and CVC for <ph name="CREDIT_CARD" /></translation>
 <translation id="6414888972213066896">You asked your parent if it's OK to visit this site</translation>
@@ -624,7 +618,6 @@
 <translation id="6556915248009097796">Exp: <ph name="EXPIRATION_DATE_ABBR" />, last used <ph name="LAST_USED_DATE_NO_DETAIL" /></translation>
 <translation id="6563469144985748109">Your manager hasn't approved it yet</translation>
 <translation id="6569060085658103619">You're viewing an extension page</translation>
-<translation id="6593753688552673085">less than <ph name="UPPER_ESTIMATE" /></translation>
 <translation id="6596325263575161958">Encryption options</translation>
 <translation id="662080504995468778">Stay</translation>
 <translation id="6626291197371920147">Add valid card number</translation>
@@ -636,7 +629,6 @@
 <translation id="6710594484020273272">&lt;Type search term&gt;</translation>
 <translation id="6711464428925977395">There is something wrong with the proxy server or the address is incorrect.</translation>
 <translation id="6727102863431372879">Set</translation>
-<translation id="6731320287533051140">{COUNT,plural, =0{none}=1{1 item}other{# items}}</translation>
 <translation id="674375294223700098">Unknown server certificate error.</translation>
 <translation id="6753269504797312559">Policy Value</translation>
 <translation id="6757797048963528358">Your device went to sleep.</translation>
@@ -742,6 +734,7 @@
 <translation id="7669271284792375604">Attackers on this site might try to trick you into installing programs that harm your browsing experience (for example, by changing your homepage or showing extra ads on sites that you visit).</translation>
 <translation id="7674629440242451245">Interested in cool new Chrome features? Try our dev channel at chrome.com/dev.</translation>
 <translation id="7682287625158474539">Shipping</translation>
+<translation id="7701040980221191251">None</translation>
 <translation id="7704050614460855821"><ph name="BEGIN_LINK" />Proceed to <ph name="SITE" /> (unsafe)<ph name="END_LINK" /></translation>
 <translation id="7714464543167945231">Certificate</translation>
 <translation id="7716424297397655342">This site can’t be loaded from the cache</translation>
@@ -781,7 +774,6 @@
 <translation id="8041089156583427627">Send Feedback</translation>
 <translation id="8041940743680923270">Use global default (Ask)</translation>
 <translation id="8088680233425245692">Failed to view article.</translation>
-<translation id="8089520772729574115">less than 1 MB</translation>
 <translation id="8091372947890762290">Activation is pending on the server</translation>
 <translation id="8118489163946903409">Payment method</translation>
 <translation id="8131740175452115882">Confirm</translation>
diff --git a/components/strings/components_strings_es-419.xtb b/components/strings/components_strings_es-419.xtb
index 6976adf..0651b15 100644
--- a/components/strings/components_strings_es-419.xtb
+++ b/components/strings/components_strings_es-419.xtb
@@ -220,7 +220,6 @@
 <translation id="2826760142808435982">La conexión se encriptó y autenticó con <ph name="CIPHER" />, y utiliza <ph name="KX" /> como el mecanismo de intercambio de claves.</translation>
 <translation id="2835170189407361413">Eliminar formulario</translation>
 <translation id="2889159643044928134">No volver a cargar</translation>
-<translation id="2900469785430194048">Google Chrome se quedó sin memoria cuando intentaba mostrar esta página web.</translation>
 <translation id="2909946352844186028">Se detectó un cambio de red.</translation>
 <translation id="2916038427272391327">Cierra los demás programas.</translation>
 <translation id="2922350208395188000">No se puede comprobar el certificado del servidor.</translation>
@@ -243,7 +242,6 @@
 <translation id="3024663005179499861">Tipo de política incorrecto</translation>
 <translation id="3032412215588512954">¿Deseas volver a cargar este sitio?</translation>
 <translation id="3037605927509011580">¡Oh, no!</translation>
-<translation id="3040955737384246924">{COUNT,plural, =0{al menos 1 elemento en dispositivos sincronizados}=1{1 elemento (y más en dispositivos sincronizados)}other{# elementos (y más en dispositivos sincronizados)}}</translation>
 <translation id="3041612393474885105">Información sobre el certificado</translation>
 <translation id="3063697135517575841">Chrome no pudo confirmar tu tarjeta en este momento. Vuelve a intentarlo más tarde.</translation>
 <translation id="3064966200440839136">Saldrás del modo de navegación incógnito para pagar mediante una aplicación externa. ¿Deseas continuar?</translation>
@@ -338,7 +336,6 @@
 <translation id="3681007416295224113">Información sobre el certificado</translation>
 <translation id="3690164694835360974">Acceso no seguro</translation>
 <translation id="3693415264595406141">Contraseña:</translation>
-<translation id="3696411085566228381">ninguno</translation>
 <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation>
 <translation id="370665806235115550">Cargando...</translation>
 <translation id="3712624925041724820">Licencias agotadas</translation>
@@ -386,7 +383,6 @@
 <translation id="4171400957073367226">La firma de verificación no es válida.</translation>
 <translation id="4196861286325780578">&amp;Rehacer Mover</translation>
 <translation id="4203896806696719780"><ph name="BEGIN_LINK" />Comprobar las configuraciones de firewall y antivirus<ph name="END_LINK" />.</translation>
-<translation id="4206349416402437184">{COUNT,plural, =0{ninguna}=1{1 app ($1)}=2{2 apps ($1, $2)}other{# apps ($1, $2, $3)}}</translation>
 <translation id="4220128509585149162">Fallos</translation>
 <translation id="4226937834893929579"><ph name="BEGIN_LINK" />Intenta ejecutar el Diagnóstico de red<ph name="END_LINK" />.</translation>
 <translation id="4250431568374086873">Tu conexión con este sitio no es completamente segura</translation>
@@ -470,7 +466,6 @@
 <translation id="5045550434625856497">Contraseña incorrecta</translation>
 <translation id="5056549851600133418">Artículos para ti</translation>
 <translation id="5070335125961472645"><ph name="BEGIN_LINK" />Comprobar la dirección de proxy<ph name="END_LINK" />.</translation>
-<translation id="5076731569460970710">{COUNT,plural, =0{Sin cookies}=1{1 sitio usa cookies. }other{# sitios usan cookies. }}</translation>
 <translation id="5087286274860437796">El certificado del servidor no es válido en este momento.</translation>
 <translation id="5087580092889165836">Agregar tarjeta</translation>
 <translation id="5089810972385038852">Estado</translation>
@@ -602,7 +597,6 @@
 <translation id="6358450015545214790">¿Qué significa esto?</translation>
 <translation id="6386120369904791316">{COUNT,plural, =1{1 sugerencia más}other{# sugerencias más}}</translation>
 <translation id="6387478394221739770">Si estás interesado en probar nuevas e interesantes funciones de Chrome, visita nuestro canal beta en chrome.com/beta.</translation>
-<translation id="6389758589412724634">Chromium se quedó sin memoria cuando intentaba mostrar esta página web.</translation>
 <translation id="6404511346730675251">Editar marcador</translation>
 <translation id="6410264514553301377">Ingresar la fecha de vencimiento y el CVC para <ph name="CREDIT_CARD" /></translation>
 <translation id="6414888972213066896">Les preguntaste a tus padres si puedes visitar este sitio</translation>
@@ -625,7 +619,6 @@
 <translation id="6556915248009097796">Venc.: <ph name="EXPIRATION_DATE_ABBR" />, último uso: <ph name="LAST_USED_DATE_NO_DETAIL" /></translation>
 <translation id="6563469144985748109">Tu administrador aún no lo aprobó</translation>
 <translation id="6569060085658103619">Estás viendo la página de una extensión</translation>
-<translation id="6593753688552673085">menos de <ph name="UPPER_ESTIMATE" /></translation>
 <translation id="6596325263575161958">Opciones de encriptación</translation>
 <translation id="662080504995468778">Permanecer aquí</translation>
 <translation id="6626291197371920147">Agregar un número de tarjeta válido</translation>
@@ -637,7 +630,6 @@
 <translation id="6710594484020273272">&lt;Escribe el término de búsqueda&gt;</translation>
 <translation id="6711464428925977395">Hay un error en el servidor proxy o la dirección es incorrecta.</translation>
 <translation id="6727102863431372879">Establecer</translation>
-<translation id="6731320287533051140">{COUNT,plural, =0{ninguno}=1{1 elemento}other{# elementos}}</translation>
 <translation id="674375294223700098">Error de certificado de servidor desconocido.</translation>
 <translation id="6753269504797312559">Valor de la política</translation>
 <translation id="6757797048963528358">El dispositivo se suspendió.</translation>
@@ -743,6 +735,7 @@
 <translation id="7669271284792375604">Es posible que los atacantes de este sitio intenten engañarte para que instales programas que pueden afectar tu experiencia de navegación (p. ej., podrían cambiar la página principal o mostrar más anuncios en los sitios que visitas).</translation>
 <translation id="7674629440242451245">Si estás interesado en probar nuevas e interesantes funciones de Chrome, visita nuestro canal de programadores en chrome.com/dev.</translation>
 <translation id="7682287625158474539">Envío</translation>
+<translation id="7701040980221191251">Ninguno</translation>
 <translation id="7704050614460855821"><ph name="BEGIN_LINK" />Continuar a <ph name="SITE" /> (no seguro)<ph name="END_LINK" /></translation>
 <translation id="7714464543167945231">Certificado</translation>
 <translation id="7716424297397655342">No se puede cargar este sitio desde la caché</translation>
@@ -782,7 +775,6 @@
 <translation id="8041089156583427627">Enviar comentario</translation>
 <translation id="8041940743680923270">Usar configuración global predeterminada (Preguntar)</translation>
 <translation id="8088680233425245692">Error al visualizar artículo</translation>
-<translation id="8089520772729574115">menos de 1 Mb</translation>
 <translation id="8091372947890762290">La activación está pendiente en el servidor.</translation>
 <translation id="8118489163946903409">Forma de pago</translation>
 <translation id="8131740175452115882">Confirmar</translation>
diff --git a/components/strings/components_strings_es.xtb b/components/strings/components_strings_es.xtb
index f35eba86..f56f788 100644
--- a/components/strings/components_strings_es.xtb
+++ b/components/strings/components_strings_es.xtb
@@ -220,7 +220,6 @@
 <translation id="2826760142808435982">La conexión se ha encriptado y autenticado con <ph name="CIPHER" />, y utiliza <ph name="KX" /> como el mecanismo de intercambio clave.</translation>
 <translation id="2835170189407361413">Eliminar formulario</translation>
 <translation id="2889159643044928134">No volver a cargar</translation>
-<translation id="2900469785430194048">Google Chrome se ha quedado sin memoria al intentar mostrar esta página web.</translation>
 <translation id="2909946352844186028">Se ha detectado un cambio de red.</translation>
 <translation id="2916038427272391327">Cierra otros programas</translation>
 <translation id="2922350208395188000">No es posible comprobar el certificado del servidor.</translation>
@@ -243,7 +242,6 @@
 <translation id="3024663005179499861">Tipo de política incorrecto</translation>
 <translation id="3032412215588512954">¿Quieres volver a cargar este sitio web?</translation>
 <translation id="3037605927509011580">¡Oh, no!</translation>
-<translation id="3040955737384246924">{COUNT,plural, =0{al menos un elemento en dispositivos sincronizados}=1{un elemento (y otros elementos más en dispositivos sincronizados)}other{# elementos (y otros elementos más en dispositivos sincronizados)}}</translation>
 <translation id="3041612393474885105">Datos del certificado</translation>
 <translation id="3063697135517575841">Chrome no ha podido confirmar tu tarjeta en este momento. Vuelve a intentarlo más tarde.</translation>
 <translation id="3064966200440839136">Saldrás del modo incógnito para realizar un pago en una aplicación externa. ¿Quieres continuar?</translation>
@@ -337,7 +335,6 @@
 <translation id="3681007416295224113">Datos del certificado</translation>
 <translation id="3690164694835360974">Inicio de sesión no seguro</translation>
 <translation id="3693415264595406141">Contraseña:</translation>
-<translation id="3696411085566228381">ninguno</translation>
 <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation>
 <translation id="370665806235115550">Cargando...</translation>
 <translation id="3712624925041724820">Licencias agotadas</translation>
@@ -385,7 +382,6 @@
 <translation id="4171400957073367226">La firma de verificación no es válida</translation>
 <translation id="4196861286325780578">&amp;Rehacer movimiento</translation>
 <translation id="4203896806696719780"><ph name="BEGIN_LINK" />Comprobar la configuración del cortafuegos y del antivirus<ph name="END_LINK" /></translation>
-<translation id="4206349416402437184">{COUNT,plural, =0{ninguna}=1{Una aplicación ($1)}=2{Dos aplicaciones ($1, $2)}other{# aplicaciones ($1, $2, $3)}}</translation>
 <translation id="4220128509585149162">La página no responde o se cierra</translation>
 <translation id="4226937834893929579"><ph name="BEGIN_LINK" />Prueba a ejecutar Diagnósticos de red<ph name="END_LINK" />.</translation>
 <translation id="4250431568374086873">Tu conexión con este sitio web no es completamente segura</translation>
@@ -469,7 +465,6 @@
 <translation id="5045550434625856497">Contraseña incorrecta</translation>
 <translation id="5056549851600133418">Artículos recomendados para ti</translation>
 <translation id="5070335125961472645"><ph name="BEGIN_LINK" />Comprobar la dirección del proxy<ph name="END_LINK" /></translation>
-<translation id="5076731569460970710">{COUNT,plural, =0{No hay cookies}=1{1 sitio web usa cookies. }other{# sitios web usan cookies. }}</translation>
 <translation id="5087286274860437796">El certificado del servidor no es válido en este momento.</translation>
 <translation id="5087580092889165836">Añadir tarjeta</translation>
 <translation id="5089810972385038852">Estado</translation>
@@ -571,7 +566,7 @@
 <translation id="6146055958333702838">Comprueba los cables y reinicia los routers, los módems o cualquier otro dispositivo
     de red que estés utilizando.</translation>
 <translation id="614940544461990577">Prueba a:</translation>
-<translation id="6151417162996330722">El certificado del servidor tiene un período de validez demasiado largo.</translation>
+<translation id="6151417162996330722">El certificado del servidor tiene un periodo de validez demasiado largo.</translation>
 <translation id="6157877588268064908">Selecciona una dirección para ver los métodos de envío y los requisitos</translation>
 <translation id="6165508094623778733">Más información</translation>
 <translation id="6169916984152623906">Ahora puedes navegar de forma privada; las otras personas que usen este dispositivo no verán tu actividad. No obstante, se guardarán las descargas y los marcadores.</translation>
@@ -601,7 +596,6 @@
 <translation id="6358450015545214790">¿Necesitas ayuda?</translation>
 <translation id="6386120369904791316">{COUNT,plural, =1{Una sugerencia más}other{# sugerencias más}}</translation>
 <translation id="6387478394221739770">Si estás interesado en probar nuevas e interesantes funciones de Chrome, prueba nuestro canal beta en la página chrome.com/beta.</translation>
-<translation id="6389758589412724634">Chromium se ha quedado sin memoria al intentar mostrar esta página web.</translation>
 <translation id="6404511346730675251">Editar marcador</translation>
 <translation id="6410264514553301377">Introduce la fecha de vencimiento y el código CVC de la tarjeta <ph name="CREDIT_CARD" /></translation>
 <translation id="6414888972213066896">Has solicitado permiso a uno de tus padres para poder acceder a este sitio web</translation>
@@ -624,7 +618,6 @@
 <translation id="6556915248009097796">Fecha de caducidad: <ph name="EXPIRATION_DATE_ABBR" /> (usada por última vez el <ph name="LAST_USED_DATE_NO_DETAIL" />)</translation>
 <translation id="6563469144985748109">Tu administrador aún no la ha aprobado</translation>
 <translation id="6569060085658103619">Estas viendo la página de una extensión</translation>
-<translation id="6593753688552673085">menos de <ph name="UPPER_ESTIMATE" /></translation>
 <translation id="6596325263575161958">Opciones de cifrado</translation>
 <translation id="662080504995468778">Seguir aquí</translation>
 <translation id="6626291197371920147">Añadir un número de tarjeta válido</translation>
@@ -636,7 +629,6 @@
 <translation id="6710594484020273272">&lt;Introducir término de búsqueda&gt;</translation>
 <translation id="6711464428925977395">Se ha producido un error con el servidor proxy o la dirección es incorrecta.</translation>
 <translation id="6727102863431372879">Establecer</translation>
-<translation id="6731320287533051140">{COUNT,plural, =0{ninguno}=1{Un elemento}other{# elementos}}</translation>
 <translation id="674375294223700098">Error de certificado de servidor desconocido</translation>
 <translation id="6753269504797312559">Valor de la política</translation>
 <translation id="6757797048963528358">El dispositivo se ha suspendido.</translation>
@@ -664,7 +656,7 @@
 <translation id="7012363358306927923">China UnionPay</translation>
 <translation id="7012372675181957985">Es posible que en tu cuenta de Google haya otros datos de navegación registrados, que puedes consultar en la página <ph name="BEGIN_LINK" />history.google.com<ph name="END_LINK" /></translation>
 <translation id="7029809446516969842">Contraseñas</translation>
-<translation id="7050187094878475250">Has intentado acceder a <ph name="DOMAIN" />, pero el servidor ha presentado un certificado cuyo período de validez es demasiado largo para que se considere de confianza.</translation>
+<translation id="7050187094878475250">Has intentado acceder a <ph name="DOMAIN" />, pero el servidor ha presentado un certificado cuyo periodo de validez es demasiado largo para que se considere de confianza.</translation>
 <translation id="7053983685419859001">Bloquear</translation>
 <translation id="7064851114919012435">Información de contacto</translation>
 <translation id="7079718277001814089">Este sitio web contiene software malicioso</translation>
@@ -742,6 +734,7 @@
 <translation id="7669271284792375604">Es posible que los atacantes que se encuentren en este sitio web intenten engañarte para que instales programas que empeoren tu experiencia de navegación (por ejemplo, que cambien tu página principal o muestren anuncios adicionales en los sitios web a los que accedas).</translation>
 <translation id="7674629440242451245">Si estás interesado en probar nuevas e interesantes funciones de Chrome, prueba el canal para desarrolladores en la página chrome.com/dev.</translation>
 <translation id="7682287625158474539">Dirección de envío</translation>
+<translation id="7701040980221191251">Ninguno</translation>
 <translation id="7704050614460855821"><ph name="BEGIN_LINK" />Acceder a <ph name="SITE" /> (sitio no seguro)<ph name="END_LINK" /></translation>
 <translation id="7714464543167945231">Certificado</translation>
 <translation id="7716424297397655342">No se puede cargar este sitio web desde la caché</translation>
@@ -781,7 +774,6 @@
 <translation id="8041089156583427627">Enviar</translation>
 <translation id="8041940743680923270">Utilizar valor predeterminado global (Preguntar)</translation>
 <translation id="8088680233425245692">Se ha producido un error al ver el artículo.</translation>
-<translation id="8089520772729574115">menos de 1 MB</translation>
 <translation id="8091372947890762290">La activación está pendiente en el servidor.</translation>
 <translation id="8118489163946903409">Forma de pago</translation>
 <translation id="8131740175452115882">Confirmar</translation>
diff --git a/components/strings/components_strings_et.xtb b/components/strings/components_strings_et.xtb
index aa134969..a3b6c1e 100644
--- a/components/strings/components_strings_et.xtb
+++ b/components/strings/components_strings_et.xtb
@@ -220,7 +220,6 @@
 <translation id="2826760142808435982">Ühendus on krüptitud ja autenditud üksusega <ph name="CIPHER" /> ning kasutab peamise vahetusmehhanismina üksust <ph name="KX" />.</translation>
 <translation id="2835170189407361413">Tühjenda vorm</translation>
 <translation id="2889159643044928134">Ära laadi uuesti</translation>
-<translation id="2900469785430194048">Google Chrome'il pole selle veebilehe kuvamiseks piisavalt mälu.</translation>
 <translation id="2909946352844186028">Tuvastati võrgumuudatus.</translation>
 <translation id="2916038427272391327">Sulgege muud programmid</translation>
 <translation id="2922350208395188000">Serveri sertifikaati ei saa kontrollida.</translation>
@@ -243,7 +242,6 @@
 <translation id="3024663005179499861">Reegli tüüp on vale</translation>
 <translation id="3032412215588512954">Kas soovite selle saidi uuesti laadida?</translation>
 <translation id="3037605927509011580">Ups, ebaõnn!</translation>
-<translation id="3040955737384246924">{COUNT,plural, =0{vähemalt 1 üksus sünkroonitud seadmetes}=1{1 üksus (ja rohkem sünkroonitud seadmetes)}other{# üksust (ja rohkem sünkroonitud seadmetes)}}</translation>
 <translation id="3041612393474885105">Sertifikaadi andmed</translation>
 <translation id="3063697135517575841">Chrome ei saanud praegu teie kaarti kinnitada. Proovige hiljem uuesti.</translation>
 <translation id="3064966200440839136">Väljute inkognito režiimist, et välise rakenduse kaudu maksta. Kas soovite jätkata?</translation>
@@ -337,7 +335,6 @@
 <translation id="3681007416295224113">Sertifikaadi andmed</translation>
 <translation id="3690164694835360974">Sisselogimine pole turvaline</translation>
 <translation id="3693415264595406141">Parool:</translation>
-<translation id="3696411085566228381">puudub</translation>
 <translation id="3704609568417268905"><ph name="TIME" />, <ph name="BOOKMARKED" />, <ph name="TITLE" />, <ph name="DOMAIN" /></translation>
 <translation id="370665806235115550">Laadimine...</translation>
 <translation id="3712624925041724820">Litsentsid on ammendunud</translation>
@@ -385,7 +382,6 @@
 <translation id="4171400957073367226">Sobimatu kinnitusallkiri</translation>
 <translation id="4196861286325780578">&amp;Teisalda uuesti</translation>
 <translation id="4203896806696719780"><ph name="BEGIN_LINK" />Kontrollige tulemüüri ja viirusetõrje seadistusi<ph name="END_LINK" /></translation>
-<translation id="4206349416402437184">{COUNT,plural, =0{mitte ühtegi}=1{1 rakendus ($1)}=2{2 rakendust ($1, $2)}other{# rakendust ($1, $2, $3)}}</translation>
 <translation id="4220128509585149162">Krahhid</translation>
 <translation id="4226937834893929579"><ph name="BEGIN_LINK" />Proovige käitada võrgudiagnostikat<ph name="END_LINK" />.</translation>
 <translation id="4250431568374086873">Teie ühendus selle saidiga pole täielikult turvaline</translation>
@@ -469,7 +465,6 @@
 <translation id="5045550434625856497">Vale salasõna</translation>
 <translation id="5056549851600133418">Teile soovitatud artiklid</translation>
 <translation id="5070335125961472645"><ph name="BEGIN_LINK" />Kontrollige puhverserveri aadressi<ph name="END_LINK" /></translation>
-<translation id="5076731569460970710">{COUNT,plural, =0{Küpsisefaile pole}=1{1 sait kasutab küpsisefaile. }other{# saiti kasutab küpsisefaile. }}</translation>
 <translation id="5087286274860437796">Serveri sertifikaat pole praegu kehtiv.</translation>
 <translation id="5087580092889165836">Lisa kaart</translation>
 <translation id="5089810972385038852">Osariik</translation>
@@ -601,7 +596,6 @@
 <translation id="6358450015545214790">Mida need tähendavad?</translation>
 <translation id="6386120369904791316">{COUNT,plural, =1{veel 1 soovitus}other{veel # soovitust}}</translation>
 <translation id="6387478394221739770">Kas olete huvitatud Chrome'i uutest lahedatest funktsioonidest? Proovige meie beetakanalit aadressil chrome.com/beta.</translation>
-<translation id="6389758589412724634">Chromiumil pole selle veebilehe kuvamiseks piisavalt mälu.</translation>
 <translation id="6404511346730675251">Muuda järjehoidjat</translation>
 <translation id="6410264514553301377">Sisestage krediitkaardi <ph name="CREDIT_CARD" /> aegumiskuupäev ja CVC</translation>
 <translation id="6414888972213066896">Küsisite vanemalt, kas võite seda saiti külastada</translation>
@@ -624,7 +618,6 @@
 <translation id="6556915248009097796">Aegub: <ph name="EXPIRATION_DATE_ABBR" />. Viimati kasutati kuupäeval <ph name="LAST_USED_DATE_NO_DETAIL" /></translation>
 <translation id="6563469144985748109">Haldur ei ole seda veel kinnitanud</translation>
 <translation id="6569060085658103619">Vaatate laienduse lehte</translation>
-<translation id="6593753688552673085">vähem kui <ph name="UPPER_ESTIMATE" /></translation>
 <translation id="6596325263575161958">Krüpteerimise valikud</translation>
 <translation id="662080504995468778">Jää siia</translation>
 <translation id="6626291197371920147">Kehtiva kaardinumbri lisamine</translation>
@@ -636,7 +629,6 @@
 <translation id="6710594484020273272">&lt;Sisestage otsingutermin&gt;</translation>
 <translation id="6711464428925977395">Puhverserveriga on midagi valesti või aadress on vale.</translation>
 <translation id="6727102863431372879">Määra</translation>
-<translation id="6731320287533051140">{COUNT,plural, =0{mitte ühtegi}=1{1 üksus}other{# üksust}}</translation>
 <translation id="674375294223700098">Serveri sertifikaadi tundmatu viga.</translation>
 <translation id="6753269504797312559">Reegli väärtus</translation>
 <translation id="6757797048963528358">Teie seade lülitus unerežiimile.</translation>
@@ -742,6 +734,7 @@
 <translation id="7669271284792375604">Sellel saidil asuvad ründajad võivad proovida meelitada teid installima programme, mis kahjustavad sirvimiskogemust (nt muudavad avalehte või kuvavad külastatavatel saitidel lisareklaame).</translation>
 <translation id="7674629440242451245">Kas olete huvitatud Chrome'i uutest lahedatest funktsioonidest? Proovige meie arenduskanalit aadressil chrome.com/beta.</translation>
 <translation id="7682287625158474539">Kohaletoimetamine</translation>
+<translation id="7701040980221191251">Mitte ükski</translation>
 <translation id="7704050614460855821"><ph name="BEGIN_LINK" />Edasiliikumine saidile <ph name="SITE" /> (ebaturvaline)<ph name="END_LINK" /></translation>
 <translation id="7714464543167945231">Sertifikaat</translation>
 <translation id="7716424297397655342">Seda saiti ei saa vahemälust laadida</translation>
@@ -781,7 +774,6 @@
 <translation id="8041089156583427627">Saada tagasiside</translation>
 <translation id="8041940743680923270">Kasuta globaalset vaikeseadet (küsi)</translation>
 <translation id="8088680233425245692">Artikli kuvamine ebaõnnestus.</translation>
-<translation id="8089520772729574115">vähem kui 1 MB</translation>
 <translation id="8091372947890762290">Aktiveerimine on serveris ootel</translation>
 <translation id="8118489163946903409">Makseviis</translation>
 <translation id="8131740175452115882">Kinnita</translation>
diff --git a/components/strings/components_strings_fa.xtb b/components/strings/components_strings_fa.xtb
index fae7711a..9112f47d 100644
--- a/components/strings/components_strings_fa.xtb
+++ b/components/strings/components_strings_fa.xtb
@@ -220,7 +220,6 @@
 <translation id="2826760142808435982">اتصال با استفاده از <ph name="CIPHER" /> رمزگذاری و راستی‌آزمایی شده است و از <ph name="KX" /> به عنوان مکانیسم تبادل کلید استفاده می‌کند.</translation>
 <translation id="2835170189407361413">پاک کردن فرم</translation>
 <translation id="2889159643044928134">تازه‌سازی نشود</translation>
-<translation id="2900469785430194048">‏Google Chrome هنگام تلاش برای نمایش این صفحه با کمبود حافظه روبرو شد.</translation>
 <translation id="2909946352844186028">تغییر شبکه تشخیص داده شد.</translation>
 <translation id="2916038427272391327">برنامه‌های دیگر را ببندید</translation>
 <translation id="2922350208395188000">گواهی سرور بررسی نمی‌شود.</translation>
@@ -243,7 +242,6 @@
 <translation id="3024663005179499861">نوع خط‌مشی اشتباه است</translation>
 <translation id="3032412215588512954">می‌خواهید این سایت را تازه‌سازی کنید؟</translation>
 <translation id="3037605927509011580">اوه، نه!</translation>
-<translation id="3040955737384246924">{COUNT,plural, =0{حداقل ۱ مورد در دستگاه‌های همگام‌سازی‌شده}=1{۱ مورد (و بیشتر در دستگاه‌های همگام‌سازی‌شده)}one{# مورد (و بیشتر در دستگاه‌های همگام‌سازی‌شده)}other{# مورد (و بیشتر در دستگاه‌های همگام‌سازی‌شده)}}</translation>
 <translation id="3041612393474885105">اطلاعات گواهی</translation>
 <translation id="3063697135517575841">‏Chrome درحال حاضر نمی‌تواند کارت شما را تأیید کند. لطفاً بعداً دوباره امتحان کنید.</translation>
 <translation id="3064966200440839136">درحال خروج از حالت ناشناس، برای پرداخت ازطریق یک برنامه خارجی. ادامه می‌دهید؟</translation>
@@ -337,7 +335,6 @@
 <translation id="3681007416295224113">اطلاعات گواهی</translation>
 <translation id="3690164694835360974">ورود به سیستم امن نیست</translation>
 <translation id="3693415264595406141">گذرواژه:</translation>
-<translation id="3696411085566228381">هیچ‌کدام</translation>
 <translation id="3704609568417268905"><ph name="TIME" /> ‏<ph name="BOOKMARKED" /> ‏<ph name="TITLE" /> ‏<ph name="DOMAIN" /></translation>
 <translation id="370665806235115550">در حال بارکردن…</translation>
 <translation id="3712624925041724820">مجوزها دیگر معتبر نیستند</translation>
@@ -369,7 +366,7 @@
 <translation id="4072486802667267160">هنگام پردازش سفارش شما خطایی روی داد. لطفاً دوباره امتحان کنید.</translation>
 <translation id="4075732493274867456">‏کلاینت و سرور از مجموعه رمزگذاری یا نسخه پروتکل SSL مشترکی استفاده نمی‌کنند.</translation>
 <translation id="4079302484614802869">‏تنظیمات پروکسی، برای استفاده از آدرس اسکریپت pac. تنظیم شده است و از سرورهای ثابت نمی‌تواند استفاده کند.</translation>
-<translation id="4098354747657067197">سایت پیش‌رو فریب‌کار است</translation>
+<translation id="4098354747657067197">احتیاط، سایت گول‌زننده</translation>
 <translation id="4103249731201008433">شماره سریال دستگاه نامعتبر است</translation>
 <translation id="410351446219883937">پخش خودکار</translation>
 <translation id="4103763322291513355">‏برای مشاهده فهرست نشانی‌های وب ممنوع و سایر خط‌مشی‌های اجباری براساس تصمیم سرپرست سیستم خود از &lt;strong&gt;chrome://policy&lt;/strong&gt; بازدید نمایید.</translation>
@@ -385,7 +382,6 @@
 <translation id="4171400957073367226">امضای تأیید نامناسب</translation>
 <translation id="4196861286325780578">&amp;انجام مجدد انتقال</translation>
 <translation id="4203896806696719780"><ph name="BEGIN_LINK" />بررسی پیکربندی آنتی‌ویروس و دیوار آتش<ph name="END_LINK" /></translation>
-<translation id="4206349416402437184">{COUNT,plural, =0{هیچ‌}=1{۱ برنامه ($1)}=2{۲ برنامه ($1،‏ $2)}one{# برنامه ($1،‏ $2،‏ $3)}other{# برنامه ($1،‏ $2،‏ $3)}}</translation>
 <translation id="4220128509585149162">خرابی ها</translation>
 <translation id="4226937834893929579"><ph name="BEGIN_LINK" />عیب‌یابی شبکه را اجرا کنید<ph name="END_LINK" />.</translation>
 <translation id="4250431568374086873">اتصال شما به این سایت کاملاً امن نیست</translation>
@@ -469,7 +465,6 @@
 <translation id="5045550434625856497">گذرواژه نادرست</translation>
 <translation id="5056549851600133418">مقالاتی برای شما</translation>
 <translation id="5070335125961472645"><ph name="BEGIN_LINK" />بررسی آدرس پروکسی<ph name="END_LINK" /></translation>
-<translation id="5076731569460970710">{COUNT,plural, =0{بدون کوکی}=1{۱ سایت از کوکی استفاده می‌کند. }one{# سایت از کوکی استفاده می‌کنند. }other{# سایت از کوکی استفاده می‌کنند. }}</translation>
 <translation id="5087286274860437796">در حال حاضر گواهی سرور معتبر نیست.</translation>
 <translation id="5087580092889165836">افزودن کارت</translation>
 <translation id="5089810972385038852">ایالت</translation>
@@ -594,14 +589,13 @@
 <translation id="6319915415804115995">آخرین استفاده، بیش از یک سال قبل</translation>
 <translation id="6321917430147971392">‏تنظیمات DNS خودتان را بررسی کنید</translation>
 <translation id="6328639280570009161">غیرفعال کردن پیش‌بینی شبکه را امتحان کنید</translation>
-<translation id="6328786501058569169">این سایت گمراه‌کننده است</translation>
+<translation id="6328786501058569169">این سایت گول‌زننده است</translation>
 <translation id="6337534724793800597">فیلتر کردن خط‌مشی‌ها براساس نام</translation>
 <translation id="6342069812937806050">فقط اکنون</translation>
 <translation id="6355080345576803305">لغو جلسه عمومی</translation>
 <translation id="6358450015545214790">معنی این‌ها چیست؟</translation>
 <translation id="6386120369904791316">{COUNT,plural, =1{۱ پیشنهاد دیگر}one{# پیشنهاد دیگر}other{# پیشنهاد دیگر}}</translation>
 <translation id="6387478394221739770">‏علاقه‌مند به قابلیت‌های جدید و جالب Chrome هستید؟ کانال بتای ما را در chrome.com/beta امتحان کنید.</translation>
-<translation id="6389758589412724634">‏Chromium هنگام تلاش برای نمایش این صفحه با کمبود حافظه روبرو شد.</translation>
 <translation id="6404511346730675251">ویرایش نشانک</translation>
 <translation id="6410264514553301377">‏CVC‏ و تاریخ انقضای <ph name="CREDIT_CARD" /> را وارد کنید</translation>
 <translation id="6414888972213066896">از والدینتان پرسیدید آیا اجازه بازدید از این سایت را دارید</translation>
@@ -624,7 +618,6 @@
 <translation id="6556915248009097796">تاریخ انقضا: <ph name="EXPIRATION_DATE_ABBR" />، آخرین استفاده: <ph name="LAST_USED_DATE_NO_DETAIL" /></translation>
 <translation id="6563469144985748109">مدیرتان هنوز این سایت را تأیید نکرده است</translation>
 <translation id="6569060085658103619">درحال مشاهده یک صفحه افزونه هستید</translation>
-<translation id="6593753688552673085">کمتر از <ph name="UPPER_ESTIMATE" /></translation>
 <translation id="6596325263575161958">گزینه‌های رمزگذاری</translation>
 <translation id="662080504995468778">ماندن</translation>
 <translation id="6626291197371920147">افزودن شماره کارت معتبر</translation>
@@ -636,7 +629,6 @@
 <translation id="6710594484020273272">&lt;عبارت جستجو را تایپ کنید&gt;</translation>
 <translation id="6711464428925977395">مشکلی در سرور پروکسی وجود دارد یا این آدرس درست نیست.</translation>
 <translation id="6727102863431372879">تنظیم</translation>
-<translation id="6731320287533051140">{COUNT,plural, =0{هیچ‌}=1{۱ مورد}one{# مورد}other{# مورد}}</translation>
 <translation id="674375294223700098">خطای ناشناس گواهی سرور.</translation>
 <translation id="6753269504797312559">مقدار خط‌‌مشی</translation>
 <translation id="6757797048963528358">دستگاهتان به خواب رفته است.</translation>
@@ -742,6 +734,7 @@
 <translation id="7669271284792375604">مهاجمان در این سایت ممکن است تلاش کنند شما را با نصب برنامه‌هایی که به تجربه مرور شما آسیب می‌رساند، فریب دهند (مثلاً با تغییر دادن صفحه اصلی شما یا با نشان دادن آگهی‌های بیش از حد در سایت‌هایی که بازدید می‌کنید).</translation>
 <translation id="7674629440242451245">‏علاقه‌مند به قابلیت‌های جدید و جالب Chrome هستید؟ کانال برنامه‌نویسان ما را در chrome.com/dev امتحان کنید.</translation>
 <translation id="7682287625158474539">ارسال</translation>
+<translation id="7701040980221191251">هیچ کدام</translation>
 <translation id="7704050614460855821"><ph name="BEGIN_LINK" />ادامه به <ph name="SITE" /> (غیرایمن)<ph name="END_LINK" /></translation>
 <translation id="7714464543167945231">گواهی</translation>
 <translation id="7716424297397655342">این سایت نمی‌تواند از حافظه پنهان بار شود</translation>
@@ -781,7 +774,6 @@
 <translation id="8041089156583427627">ارسال بازخورد</translation>
 <translation id="8041940743680923270">استفاده از پیش‌فرض جهانی (سؤال شود)</translation>
 <translation id="8088680233425245692">مشاهده مقاله ناموفق بود.</translation>
-<translation id="8089520772729574115">کمتر از ۱ مگابایت</translation>
 <translation id="8091372947890762290">فعال‌سازی در سرور در حالت تعلیق است</translation>
 <translation id="8118489163946903409">روش پرداخت</translation>
 <translation id="8131740175452115882">تأیید</translation>
diff --git a/components/strings/components_strings_fi.xtb b/components/strings/components_strings_fi.xtb
index 9e6a2d51..5a8940a 100644
--- a/components/strings/components_strings_fi.xtb
+++ b/components/strings/components_strings_fi.xtb
@@ -74,7 +74,7 @@
 <translation id="1592005682883173041">Tietojen paikallinen käyttö</translation>
 <translation id="1594030484168838125">Valitse</translation>
 <translation id="161042844686301425">Turkoosi</translation>
-<translation id="1620510694547887537">kameraasi</translation>
+<translation id="1620510694547887537">Kamera</translation>
 <translation id="1629803312968146339">Haluatko, että Chrome tallentaa tämän kortin?</translation>
 <translation id="1639239467298939599">Ladataan</translation>
 <translation id="1640180200866533862">Käyttäjäkäytännöt</translation>
@@ -220,7 +220,6 @@
 <translation id="2826760142808435982">Yhteys on salattu ja todennettu <ph name="CIPHER" />:n avulla ja se käyttää menetelmää <ph name="KX" /> avainvaihtomekanismina.</translation>
 <translation id="2835170189407361413">Tyhjennä lomake</translation>
 <translation id="2889159643044928134">Älä päivitä</translation>
-<translation id="2900469785430194048">Google Chromen muisti loppui verkkosivua näytettäessä.</translation>
 <translation id="2909946352844186028">Verkossa havaittiin muutos.</translation>
 <translation id="2916038427272391327">Sulje muita ohjelmia.</translation>
 <translation id="2922350208395188000">Palvelimen varmennetta ei voi tarkistaa.</translation>
@@ -243,7 +242,6 @@
 <translation id="3024663005179499861">Väärä käytäntötyyppi</translation>
 <translation id="3032412215588512954">Haluatko päivittää tämän sivuston?</translation>
 <translation id="3037605927509011580">Voi räkä!</translation>
-<translation id="3040955737384246924">{COUNT,plural, =0{vähintään 1 kohde synkronoiduilla laitteilla}=1{1 kohde (ja lisää synkronoiduilla laitteilla)}other{# kohdetta (ja lisää synkronoiduilla laitteilla)}}</translation>
 <translation id="3041612393474885105">Varmenteen tiedot</translation>
 <translation id="3063697135517575841">Chrome ei voinut vahvistaa korttiasi. Yritä myöhemmin uudelleen.</translation>
 <translation id="3064966200440839136">Incognito-tilasta poistutaan ulkoisessa sovelluksessa maksamisen vuoksi. Haluatko jatkaa?</translation>
@@ -268,7 +266,7 @@
 <translation id="3207960819495026254">Kirjanmerkeissä</translation>
 <translation id="3225919329040284222">Palvelin esitti varmenteen, joka ei vastaa sisäänrakennettuja odotuksia. Tietyillä tehokkaasti suojatuilla sivustoilla on odotuksia, joilla suojataan käyttäjiä.</translation>
 <translation id="3226128629678568754">Paina päivityspainiketta, niin sivun lataukseen tarvittavat tiedot lähetetään uudelleen.</translation>
-<translation id="3227137524299004712">mikrofoniasi</translation>
+<translation id="3227137524299004712">Mikrofoni</translation>
 <translation id="3228969707346345236">Käännös epäonnistui, koska sivun kieli on jo <ph name="LANGUAGE" />.</translation>
 <translation id="323107829343500871">Anna kortin <ph name="CREDIT_CARD" /> CVC</translation>
 <translation id="3234666976984236645">Havaitse aina tärkeä sisältö tällä sivustolla</translation>
@@ -338,7 +336,6 @@
 <translation id="3681007416295224113">Varmenteen tiedot</translation>
 <translation id="3690164694835360974">Sisäänkirjautuminen ei ole turvallinen</translation>
 <translation id="3693415264595406141">Salasana:</translation>
-<translation id="3696411085566228381">ei mitään</translation>
 <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation>
 <translation id="370665806235115550">Ladataan...</translation>
 <translation id="3712624925041724820">Käyttöluvat ovat lopussa</translation>
@@ -386,7 +383,6 @@
 <translation id="4171400957073367226">Virheellinen vahvistusallekirjoitus.</translation>
 <translation id="4196861286325780578">&amp;Toista siirto</translation>
 <translation id="4203896806696719780"><ph name="BEGIN_LINK" />Tarkista palomuurin ja virustorjuntaohjelmiston määritykset.<ph name="END_LINK" /></translation>
-<translation id="4206349416402437184">{COUNT,plural, =0{ei yhtään}=1{1 sovellus ($1)}=2{2 sovellusta ($1 ja $2)}other{# sovellusta ($1, $2 $3)}}</translation>
 <translation id="4220128509585149162">Kaatuu</translation>
 <translation id="4226937834893929579"><ph name="BEGIN_LINK" />Kokeile verkon diagnostiikkaa<ph name="END_LINK" /></translation>
 <translation id="4250431568374086873">Yhteytesi sivustoon ei ole täysin suojattu.</translation>
@@ -416,7 +412,7 @@
 <translation id="450710068430902550">Jakaminen järjestelmänvalvojan kanssa</translation>
 <translation id="4515275063822566619">Kortit ja osoitteet ovat peräisin Chromesta ja Google-tililtäsi (<ph name="ACCOUNT_EMAIL" />). Voit hallinnoida niitä <ph name="BEGIN_LINK" />asetuksissa<ph name="END_LINK" />.</translation>
 <translation id="4522570452068850558">Tiedot</translation>
-<translation id="4552089082226364758">Salama</translation>
+<translation id="4552089082226364758">Flash</translation>
 <translation id="4558551763791394412">Poista laajennukset käytöstä.</translation>
 <translation id="457875822857220463">Toimitus</translation>
 <translation id="4587425331216688090">Poistetaanko osoite Chromen tiedoista?</translation>
@@ -470,7 +466,6 @@
 <translation id="5045550434625856497">Väärä salasana</translation>
 <translation id="5056549851600133418">Sinulle valitut artikkelit</translation>
 <translation id="5070335125961472645"><ph name="BEGIN_LINK" />Tarkista välityspalvelimen osoite.<ph name="END_LINK" /></translation>
-<translation id="5076731569460970710">{COUNT,plural, =0{Ei evästeitä}=1{1 sivusto käyttää evästeitä. }other{# sivustoa käyttää evästeitä. }}</translation>
 <translation id="5087286274860437796">Palvelimen varmenne ei ole tällä hetkellä kelvollinen.</translation>
 <translation id="5087580092889165836">Lisää kortti</translation>
 <translation id="5089810972385038852">Osavaltio/alue</translation>
@@ -602,7 +597,6 @@
 <translation id="6358450015545214790">Mitä nämä tarkoittavat?</translation>
 <translation id="6386120369904791316">{COUNT,plural, =1{1 muu ehdotus}other{# muuta ehdotusta}}</translation>
 <translation id="6387478394221739770">Oletko kiinnostunut Chromen uusista jännittävistä ominaisuuksista? Kokeile beta-kanavaa osoitteessa chrome.com/beta.</translation>
-<translation id="6389758589412724634">Chromiumin muisti loppui verkkosivua näytettäessä.</translation>
 <translation id="6404511346730675251">Muokkaa kirjanmerkkiä</translation>
 <translation id="6410264514553301377">Anna kortin <ph name="CREDIT_CARD" /> vanhentumispäivä ja CVC</translation>
 <translation id="6414888972213066896">Pyysit vanhemmiltasi lupaa käydä tällä sivustolla.</translation>
@@ -625,7 +619,6 @@
 <translation id="6556915248009097796">Vanhenee: <ph name="EXPIRATION_DATE_ABBR" />, käytetty viimeksi: <ph name="LAST_USED_DATE_NO_DETAIL" /></translation>
 <translation id="6563469144985748109">Ylläpitäjä ei ole hyväksynyt sitä vielä.</translation>
 <translation id="6569060085658103619">Tämä on laajennussivu.</translation>
-<translation id="6593753688552673085">alle <ph name="UPPER_ESTIMATE" /></translation>
 <translation id="6596325263575161958">Salausasetukset</translation>
 <translation id="662080504995468778">Jää</translation>
 <translation id="6626291197371920147">Lisää kelvollinen kortin numero</translation>
@@ -637,7 +630,6 @@
 <translation id="6710594484020273272">&lt;Anna hakukysely&gt;</translation>
 <translation id="6711464428925977395">Välityspalvelimessa on jotain vikaa tai osoite on virheellinen.</translation>
 <translation id="6727102863431372879">Aseta</translation>
-<translation id="6731320287533051140">{COUNT,plural, =0{ei yhtään}=1{1 kohde}other{# kohdetta}}</translation>
 <translation id="674375294223700098">Tuntematon palvelimen varmennevirhe.</translation>
 <translation id="6753269504797312559">Käytännön arvo</translation>
 <translation id="6757797048963528358">Laitteesi siirtyi virransäästötilaan.</translation>
@@ -743,6 +735,7 @@
 <translation id="7669271284792375604">Tämän sivuston hyökkääjät saattavat yrittää huijata sinua asentamaan ohjelmia, jotka ovat haitallisia selauskokemuksellesi (esimerkiksi vaihtamalla aloitussivusi tai näyttämällä ylimääräisiä mainoksia käymilläsi sivustoilla).</translation>
 <translation id="7674629440242451245">Oletko kiinnostunut Chromen uusista jännittävistä ominaisuuksista? Kokeile kehittäjäkanavaa osoitteessa chrome.com/dev.</translation>
 <translation id="7682287625158474539">Toimitus</translation>
+<translation id="7701040980221191251">Ei mitään</translation>
 <translation id="7704050614460855821"><ph name="BEGIN_LINK" />Siirry sivustoon <ph name="SITE" /> (tämä ei ole turvallista)<ph name="END_LINK" /></translation>
 <translation id="7714464543167945231">Varmenne</translation>
 <translation id="7716424297397655342">Tätä sivustoa ei voi ladata välimuistista</translation>
@@ -782,7 +775,6 @@
 <translation id="8041089156583427627">Lähetä palautetta</translation>
 <translation id="8041940743680923270">Käytä yleistä oletusasetusta (kysy)</translation>
 <translation id="8088680233425245692">Artikkelin näyttäminen epäonnistui.</translation>
-<translation id="8089520772729574115">alle 1 Mt</translation>
 <translation id="8091372947890762290">Aktivointi odottaa palvelimella</translation>
 <translation id="8118489163946903409">Maksutapa</translation>
 <translation id="8131740175452115882">Vahvista</translation>
diff --git a/components/strings/components_strings_fil.xtb b/components/strings/components_strings_fil.xtb
index 1cfa7589e..ac7082728 100644
--- a/components/strings/components_strings_fil.xtb
+++ b/components/strings/components_strings_fil.xtb
@@ -220,7 +220,6 @@
 <translation id="2826760142808435982">Ine-encrypt at pinapatotoo ang koneksyon gamit ang <ph name="CIPHER" /> at ginagamit ang <ph name="KX" /> bilang key exchange mechanism.</translation>
 <translation id="2835170189407361413">I-clear ang form</translation>
 <translation id="2889159643044928134">Huwag I-reload</translation>
-<translation id="2900469785430194048">Naubusan ng memory ang Google Chrome habang sinusubukang ipakita ang webpage na ito.</translation>
 <translation id="2909946352844186028">May nakitang pagbabago sa network.</translation>
 <translation id="2916038427272391327">Isara ang iba pang program</translation>
 <translation id="2922350208395188000">Hindi masuri ang certificate ng server.</translation>
@@ -243,7 +242,6 @@
 <translation id="3024663005179499861">Maling uri ng patakaran</translation>
 <translation id="3032412215588512954">Gusto mo bang i-reload ang site na ito?</translation>
 <translation id="3037605927509011580">Ay, Naku!</translation>
-<translation id="3040955737384246924">{COUNT,plural, =0{kahit 1 item sa mga naka-sync na device}=1{1 item (at higit pa sa mga naka-sync na device)}one{# item (at higit pa sa mga naka-sync na device)}other{# na item (at higit pa sa mga naka-sync na device)}}</translation>
 <translation id="3041612393474885105">Impormasyon sa Certificate</translation>
 <translation id="3063697135517575841">Hindi nakumpirma ng Chrome ang iyong card sa pagkakataong ito. Pakisubukang muli sa ibang pagkakataon.</translation>
 <translation id="3064966200440839136">Aalis sa incognito mode upang magbayad sa pamamagitan ng external na application. Magpatuloy?</translation>
@@ -337,7 +335,6 @@
 <translation id="3681007416295224113">Impormasyon sa certificate</translation>
 <translation id="3690164694835360974">Hindi ligtas ang pag-log in</translation>
 <translation id="3693415264595406141">Password:</translation>
-<translation id="3696411085566228381">wala</translation>
 <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation>
 <translation id="370665806235115550">Naglo-load...</translation>
 <translation id="3712624925041724820">Naubos na ang mga lisensya</translation>
@@ -385,7 +382,6 @@
 <translation id="4171400957073367226">Hindi wasto ang signature sa pag-verify</translation>
 <translation id="4196861286325780578">&amp;Gawing muli ang paglilipat</translation>
 <translation id="4203896806696719780"><ph name="BEGIN_LINK" />Suriin ang mga configuration ng firewall at antivirus<ph name="END_LINK" /></translation>
-<translation id="4206349416402437184">{COUNT,plural, =0{wala}=1{1 app ($1)}=2{2 app ($1, $2)}one{# app ($1, $2, $3)}other{# na app ($1, $2, $3)}}</translation>
 <translation id="4220128509585149162">Mga Pag-crash</translation>
 <translation id="4226937834893929579"><ph name="BEGIN_LINK" />Subukang magpatakbo ng Network Diagnostics<ph name="END_LINK" />.</translation>
 <translation id="4250431568374086873">Hindi ganap na ligtas ang iyong koneksyon sa site na ito</translation>
@@ -469,7 +465,6 @@
 <translation id="5045550434625856497">Hindi wastong password</translation>
 <translation id="5056549851600133418">Mga artikulo para sa iyo</translation>
 <translation id="5070335125961472645"><ph name="BEGIN_LINK" />Suriin ang proxy address<ph name="END_LINK" /></translation>
-<translation id="5076731569460970710">{COUNT,plural, =0{Walang cookies}=1{1 site ang gumagamit ng cookies. }one{# site ang gumagamit ng cookies. }other{# na site ang gumagamit ng cookies. }}</translation>
 <translation id="5087286274860437796">Hindi angkop ang certificate ng server sa oras na ito.</translation>
 <translation id="5087580092889165836">Magdagdag ng card</translation>
 <translation id="5089810972385038852">Estado</translation>
@@ -601,7 +596,6 @@
 <translation id="6358450015545214790">Ano ang ibig sabihin ng mga ito?</translation>
 <translation id="6386120369904791316">{COUNT,plural, =1{1 pang suhestyon}one{# pang suhestyon}other{# pang suhestyon}}</translation>
 <translation id="6387478394221739770">Interesado sa mga astig at bagong tampok sa Chrome? Subukan ang aming beta channel sa chrome.com/beta.</translation>
-<translation id="6389758589412724634">Naubusan ng memory ang Chromium habang sinusubukang ipakita ang webpage na ito.</translation>
 <translation id="6404511346730675251">I-edit ang bookmark</translation>
 <translation id="6410264514553301377">Ilagay ang petsa ng pag-expire at CVC para sa <ph name="CREDIT_CARD" /></translation>
 <translation id="6414888972213066896">Tinanong mo ang iyong magulang kung maaari mong bisitahin ang site na ito</translation>
@@ -624,7 +618,6 @@
 <translation id="6556915248009097796">Exp: <ph name="EXPIRATION_DATE_ABBR" />, huling ginamit noong <ph name="LAST_USED_DATE_NO_DETAIL" /></translation>
 <translation id="6563469144985748109">Hindi pa ito inaaprubahan ng iyong manager</translation>
 <translation id="6569060085658103619">Isang page ng extension ang tinitingnan mo</translation>
-<translation id="6593753688552673085">wala pang <ph name="UPPER_ESTIMATE" /></translation>
 <translation id="6596325263575161958">Mga pagpipilian sa pag-encrypt</translation>
 <translation id="662080504995468778">Manatili</translation>
 <translation id="6626291197371920147">Magdagdag ng wastong card number</translation>
@@ -636,7 +629,6 @@
 <translation id="6710594484020273272">&lt;I-type ang termino para sa paghahanap&gt;</translation>
 <translation id="6711464428925977395">May problema sa proxy server, o mali ang address.</translation>
 <translation id="6727102863431372879">Itakda</translation>
-<translation id="6731320287533051140">{COUNT,plural, =0{wala}=1{1 item}one{# item}other{# na item}}</translation>
 <translation id="674375294223700098">Hindi alam na error sa certificate ng server</translation>
 <translation id="6753269504797312559">Halaga ng patakaran</translation>
 <translation id="6757797048963528358">Nag-sleep ang iyong device.</translation>
@@ -742,6 +734,7 @@
 <translation id="7669271284792375604">Maaaring subukan ng mga attacker sa site na ito na linlangin ka upang mag-install ng mga program na makakasama sa iyong karanasan sa pag-browse (halimbawa, sa pamamagitan ng pagbabago ng iyong homepage o pagpapakita ng mga karagdagang ad sa mga site na binibisita mo).</translation>
 <translation id="7674629440242451245">Interesado sa mga astig at bagong tampok sa Chrome? Subukan ang aming dev channel sa chrome.com/dev.</translation>
 <translation id="7682287625158474539">Pagpapadala</translation>
+<translation id="7701040980221191251">Wala</translation>
 <translation id="7704050614460855821"><ph name="BEGIN_LINK" />Magpatuloy sa <ph name="SITE" /> (hindi ligtas)<ph name="END_LINK" /></translation>
 <translation id="7714464543167945231">Certificate</translation>
 <translation id="7716424297397655342">Hindi maaaring i-load ang site na ito mula sa cache</translation>
@@ -781,7 +774,6 @@
 <translation id="8041089156583427627">Magpadala ng Feedback</translation>
 <translation id="8041940743680923270">Gamitin ang pangkalahatang default (Tanungin)</translation>
 <translation id="8088680233425245692">Hindi natingnan ang artikulo.</translation>
-<translation id="8089520772729574115">wala pang 1 MB</translation>
 <translation id="8091372947890762290">Nakabinbin sa server ang pag-activate</translation>
 <translation id="8118489163946903409">Paraan ng pagbabayad</translation>
 <translation id="8131740175452115882">Kumpirmahin</translation>
diff --git a/components/strings/components_strings_fr.xtb b/components/strings/components_strings_fr.xtb
index 5424c1b..496089fd 100644
--- a/components/strings/components_strings_fr.xtb
+++ b/components/strings/components_strings_fr.xtb
@@ -220,7 +220,6 @@
 <translation id="2826760142808435982">La connexion est chiffrée et authentifiée avec la clé <ph name="CIPHER" />. La méthode d'échange de clés utilisé est <ph name="KX" />.</translation>
 <translation id="2835170189407361413">Effacer le formulaire</translation>
 <translation id="2889159643044928134">Ne pas actualiser</translation>
-<translation id="2900469785430194048">Google Chrome n'avait pas suffisamment de mémoire pour afficher cette page Web.</translation>
 <translation id="2909946352844186028">Un changement de réseau a été détecté.</translation>
 <translation id="2916038427272391327">Fermez les autres programmes</translation>
 <translation id="2922350208395188000">Impossible de vérifier le certificat du serveur.</translation>
@@ -243,7 +242,6 @@
 <translation id="3024663005179499861">Type de règle incorrect.</translation>
 <translation id="3032412215588512954">Voulez-vous actualiser ce site ?</translation>
 <translation id="3037605927509011580">Aie aie aie</translation>
-<translation id="3040955737384246924">{COUNT,plural, =0{au moins 1 élément sur les appareils synchronisés}=1{1 élément (et plus sur appareils synchronisés)}one{# élément (et plus sur appareils synchronisés)}other{# éléments (et plus sur appareils synchronisés)}}</translation>
 <translation id="3041612393474885105">Informations relatives au certificat</translation>
 <translation id="3063697135517575841">Impossible de valider votre carte dans Chrome pour le moment. Veuillez réessayer plus tard.</translation>
 <translation id="3064966200440839136">En payant via une application externe, vous allez quitter le mode navigation privée. Voulez-vous continuer ?</translation>
@@ -337,7 +335,6 @@
 <translation id="3681007416295224113">Informations relatives au certificat</translation>
 <translation id="3690164694835360974">Connexion non sécurisée</translation>
 <translation id="3693415264595406141">Mot de passe :</translation>
-<translation id="3696411085566228381">aucune</translation>
 <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation>
 <translation id="370665806235115550">Chargement en cours...</translation>
 <translation id="3712624925041724820">Licences épuisées.</translation>
@@ -385,7 +382,6 @@
 <translation id="4171400957073367226">Signature de validation non valide.</translation>
 <translation id="4196861286325780578">&amp;Rétablir le déplacement</translation>
 <translation id="4203896806696719780"><ph name="BEGIN_LINK" />Vérifier les configurations du pare-feu et de l'antivirus<ph name="END_LINK" /></translation>
-<translation id="4206349416402437184">{COUNT,plural, =0{aucune}=1{1 application ($1)}=2{2 applications ($1, $2)}one{# application ($1, $2 $3)}other{# applications ($1, $2 $3)}}</translation>
 <translation id="4220128509585149162">Plantages</translation>
 <translation id="4226937834893929579"><ph name="BEGIN_LINK" />Essayez d'exécuter les diagnostics réseau<ph name="END_LINK" />.</translation>
 <translation id="4250431568374086873">Votre connexion à ce site n'est pas totalement sécurisée.</translation>
@@ -469,7 +465,6 @@
 <translation id="5045550434625856497">Mot de passe incorrect</translation>
 <translation id="5056549851600133418">Articles pour vous</translation>
 <translation id="5070335125961472645"><ph name="BEGIN_LINK" />Vérifier l'adresse du proxy<ph name="END_LINK" /></translation>
-<translation id="5076731569460970710">{COUNT,plural, =0{Aucun cookie}=1{Un site utilise des cookies. }one{# site utilise des cookies. }other{# sites utilisent des cookies. }}</translation>
 <translation id="5087286274860437796">Le certificat actuel du serveur n'est pas valide.</translation>
 <translation id="5087580092889165836">Ajouter une carte</translation>
 <translation id="5089810972385038852">État</translation>
@@ -601,7 +596,6 @@
 <translation id="6358450015545214790">Qu'est-ce que c'est ?</translation>
 <translation id="6386120369904791316">{COUNT,plural, =1{1 autre suggestion}one{# autre suggestion}other{# autres suggestions}}</translation>
 <translation id="6387478394221739770">Vous souhaitez bénéficier de nouvelles fonctionnalités Chrome passionnantes ? Essayez notre version bêta à l'adresse chrome.com/beta.</translation>
-<translation id="6389758589412724634">Chromium n'avait pas suffisamment de mémoire pour afficher cette page Web.</translation>
 <translation id="6404511346730675251">Modifier le favori</translation>
 <translation id="6410264514553301377">Saisissez la date d'expiration et le code CVC pour <ph name="CREDIT_CARD" /></translation>
 <translation id="6414888972213066896">Une demande d'autorisation a été envoyée à tes parents pour la consultation de ce site</translation>
@@ -624,7 +618,6 @@
 <translation id="6556915248009097796">Date d'expiration : <ph name="EXPIRATION_DATE_ABBR" />, dernière utilisation : <ph name="LAST_USED_DATE_NO_DETAIL" /></translation>
 <translation id="6563469144985748109">Votre responsable ne l'a pas encore autorisé</translation>
 <translation id="6569060085658103619">Vous consultez actuellement une page d'extension</translation>
-<translation id="6593753688552673085">moins de <ph name="UPPER_ESTIMATE" /></translation>
 <translation id="6596325263575161958">Options de chiffrement</translation>
 <translation id="662080504995468778">Rester</translation>
 <translation id="6626291197371920147">Ajouter un numéro de carte valide</translation>
@@ -636,7 +629,6 @@
 <translation id="6710594484020273272">&lt;Saisissez le terme de recherche&gt;</translation>
 <translation id="6711464428925977395">Le serveur proxy présente une erreur, ou l'adresse est incorrecte.</translation>
 <translation id="6727102863431372879">Définir</translation>
-<translation id="6731320287533051140">{COUNT,plural, =0{aucun}=1{1 élément}one{# élément}other{# éléments}}</translation>
 <translation id="674375294223700098">Erreur inconnue liée au certificat du serveur.</translation>
 <translation id="6753269504797312559">Valeur de la règle</translation>
 <translation id="6757797048963528358">Votre appareil s'est mis en veille.</translation>
@@ -742,6 +734,7 @@
 <translation id="7669271284792375604">Des individus malveillants à l'œuvre sur ce site pourraient vous inciter à installer des programmes qui nuisent à votre confort de navigation (par exemple, en changeant votre page d'accueil ou en affichant des annonces supplémentaires sur les sites que vous consultez.</translation>
 <translation id="7674629440242451245">Vous souhaitez bénéficier de nouvelles fonctionnalités Chrome passionnantes ? Essayez notre version en développement à l'adresse chrome.com/dev.</translation>
 <translation id="7682287625158474539">Adresse de livraison</translation>
+<translation id="7701040980221191251">Aucun</translation>
 <translation id="7704050614460855821"><ph name="BEGIN_LINK" />Continuer vers le site <ph name="SITE" /> (dangereux)<ph name="END_LINK" /></translation>
 <translation id="7714464543167945231">Certificat</translation>
 <translation id="7716424297397655342">Impossible de charger ce site à partir du cache</translation>
@@ -781,7 +774,6 @@
 <translation id="8041089156583427627">Envoyer</translation>
 <translation id="8041940743680923270">Utiliser le paramètre global par défaut ("Demander")</translation>
 <translation id="8088680233425245692">Échec de l'affichage de l'article.</translation>
-<translation id="8089520772729574115">moins de 1 Mo</translation>
 <translation id="8091372947890762290">Activation en attente sur le serveur.</translation>
 <translation id="8118489163946903409">Mode de paiement</translation>
 <translation id="8131740175452115882">Confirmer</translation>
diff --git a/components/strings/components_strings_gu.xtb b/components/strings/components_strings_gu.xtb
index df3af296..836a5cb 100644
--- a/components/strings/components_strings_gu.xtb
+++ b/components/strings/components_strings_gu.xtb
@@ -220,10 +220,10 @@
 <translation id="2826760142808435982">કનેક્શન <ph name="CIPHER" /> નો ઉપયોગ કરીને એન્ક્રિપ્ટ અને પ્રમાણિત કરેલુ છે અને મુખ્ય એક્સચેન્જ મેકેનિઝ્મ તરીકે <ph name="KX" /> નો ઉપયોગ કરે છે.</translation>
 <translation id="2835170189407361413">ફોર્મ સાફ કરો</translation>
 <translation id="2889159643044928134">ફરીથી લોડ કરશો નહીં</translation>
-<translation id="2900469785430194048">આ વેબ પૃષ્ઠ પ્રદર્શિત કરવાનો પ્રયાસ કરતી વખતે Google Chrome ની મેમરી સમાપ્ત થઈ ગઈ.</translation>
 <translation id="2909946352844186028">નેટવર્ક ફેરફાર મળ્યો હતો.</translation>
 <translation id="2916038427272391327">અન્ય પ્રોગ્રામ બંધ કરો</translation>
 <translation id="2922350208395188000">સર્વરનું પ્રમાણપત્ર તપાસી શકાતું નથી.</translation>
+<translation id="2928905813689894207">બિલિંગનું સરનામું</translation>
 <translation id="2941952326391522266">આ સર્વર સાબિત કરી શક્યું નથી કે તે <ph name="DOMAIN" /> છે; તેનું સુરક્ષા પ્રમાણપત્ર <ph name="DOMAIN2" /> નું છે. આ કોઈ ખોટી ગોઠવણીને કારણે થયું હશે અથવા કોઈ હુમલાખોર તમારા કનેક્શનને અટકાવી રહ્યો છે.</translation>
 <translation id="2948083400971632585">તમે સેટિંગ્સ પૃષ્ઠમાંથી કનેક્શન માટે ગોઠવવામાં આવેલ કોઇપણ પ્રોક્સીઓ અક્ષમ કરી શકો છો.</translation>
 <translation id="2955913368246107853">શોધ બાર બંધ કરો</translation>
@@ -238,10 +238,10 @@
 <translation id="3005723025932146533">સાચવેલી કૉપિ બતાવો</translation>
 <translation id="3008447029300691911"><ph name="CREDIT_CARD" /> માટે CVC દાખલ કરો. એકવાર તમે પુષ્ટિ કરી લો, તે પછી આ સાઇટ સાથે તમારા કાર્ડની વિગતો શેર કરવામાં આવશે.</translation>
 <translation id="3010559122411665027">"<ph name="ENTRY_INDEX" />" એન્ટ્રીને સૂચિબદ્ધ કરો: <ph name="ERROR" /></translation>
+<translation id="301521992641321250">આપમેળે અવરોધિત</translation>
 <translation id="3024663005179499861">ખોટો નીતિ પ્રકાર</translation>
 <translation id="3032412215588512954">શું તમે આ સાઇટ ફરીથી લોડ કરવા માંગો છો?</translation>
 <translation id="3037605927509011580">અરર કંઇક ભુલ થઇ!</translation>
-<translation id="3040955737384246924">{COUNT,plural, =0{સમન્વયિત ઉપકરણો પર ઓછામાં ઓછી 1 આઇટમ}=1{1 આઇટમ (અને સમન્વયિત ઉપકરણો પર વધુ)}one{# આઇટમ (અને સમન્વયિત ઉપકરણો પર વધુ)}other{# આઇટમ (અને સમન્વયિત ઉપકરણો પર વધુ)}}</translation>
 <translation id="3041612393474885105">પ્રમાણપત્ર માહિતી</translation>
 <translation id="3063697135517575841">આ સમયે Chrome તમારા કાર્ડની પુષ્ટિ કરવામાં અસમર્થ હતું. કૃપા કરીને પછીથી ફરી પ્રયાસ કરો.</translation>
 <translation id="3064966200440839136">બાહ્ય ઍપ્લિકેશન મારફતે ચુકવણી કરવા માટે છુપો મોડ છોડી રહ્યાં છીએ. તો ચાલુ રાખીએ?</translation>
@@ -335,7 +335,6 @@
 <translation id="3681007416295224113">પ્રમાણપત્ર માહિતી</translation>
 <translation id="3690164694835360974">લોગિન સુરક્ષિત નથી</translation>
 <translation id="3693415264595406141">પાસવર્ડ:</translation>
-<translation id="3696411085566228381">કોઈ નહીં</translation>
 <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation>
 <translation id="370665806235115550">લોડ કરી રહ્યું છે...</translation>
 <translation id="3712624925041724820">લાઇસેંસીસ પૂર્ણ</translation>
@@ -383,7 +382,6 @@
 <translation id="4171400957073367226">ખોટી ચકાસણી સહી</translation>
 <translation id="4196861286325780578">&amp;ખસેડવું ફરી કરો</translation>
 <translation id="4203896806696719780"><ph name="BEGIN_LINK" />ફાયરવોલ અને એન્ટીવાઇરસ ગોઠવણી તપાસીને<ph name="END_LINK" /></translation>
-<translation id="4206349416402437184">{COUNT,plural, =0{કોઈ નહીં}=1{1 ઍપ્લિકેશન ($1)}=2{2 ઍપ્લિકેશન ($1, $2)}one{# ઍપ્લિકેશન ($1, $2, $3)}other{# ઍપ્લિકેશન ($1, $2, $3)}}</translation>
 <translation id="4220128509585149162">ક્રેશેસ</translation>
 <translation id="4226937834893929579"><ph name="BEGIN_LINK" />નેટવર્ક ડાયગ્નોસ્ટિક્સ ચલાવવાનો પ્રયાસ કરો<ph name="END_LINK" />.</translation>
 <translation id="4250431568374086873">આ સાઇટ પરનું તમારું કનેક્શન પૂર્ણપણે સુરક્ષિત નથી</translation>
@@ -467,7 +465,6 @@
 <translation id="5045550434625856497">ખોટો પાસવર્ડ</translation>
 <translation id="5056549851600133418">તમારા માટે લેખ</translation>
 <translation id="5070335125961472645"><ph name="BEGIN_LINK" />પ્રોક્સી સરનામું તપાસીને<ph name="END_LINK" /></translation>
-<translation id="5076731569460970710">{COUNT,plural, =0{કોઈ કુકી નહીં}=1{1 સાઇટ કુકીનો ઉપયોગ કરે છે. }one{# સાઇટ કુકીનો ઉપયોગ કરે છે. }other{# સાઇટ કુકીનો ઉપયોગ કરે છે. }}</translation>
 <translation id="5087286274860437796">સર્વરનું પ્રમાણપત્ર આ સમયે માન્ય નથી.</translation>
 <translation id="5087580092889165836">કાર્ડ ઉમેરો</translation>
 <translation id="5089810972385038852">રાજ્ય</translation>
@@ -574,6 +571,7 @@
 <translation id="6165508094623778733">વધુ જાણો</translation>
 <translation id="6169916984152623906">હવે તમે ખાનગીમાં બ્રાઉઝ કરી શકો છો અને અન્ય લોકો જે આ ઉપકરણનો ઉપયોગ કરે છે તે પણ તમારી પ્રવૃત્તિ જોઇ શકશે નહીં. જો કે ડાઉનલોડ અને બુકમાર્ક સાચવવામાં આવશે.</translation>
 <translation id="6177128806592000436">આ સાઇટ પરનું તમારું કનેક્શન સુરક્ષિત નથી</translation>
+<translation id="6184817833369986695">(સાથી: <ph name="UPDATE_COHORT_NAME" />)</translation>
 <translation id="6203231073485539293">તમારું ઇન્ટરનેટ કનેક્શન તપાસો</translation>
 <translation id="6218753634732582820">Chromium માંથી સરનામું દૂર કરીએ?</translation>
 <translation id="6221345481584921695">Google Safe Browsing ને તાજેતરમાં <ph name="SITE" /> પર <ph name="BEGIN_LINK" />મૉલવેર મળ્યું<ph name="END_LINK" />. વેબસાઇટ્સ કે જે સામાન્ય રીતે સુરક્ષિત છે તે ક્યારેક મૉલવેરથી દૂષિત હોય છે. દુર્ભાવનાપૂર્ણ સામગ્રી એક જ્ઞાત મૉલવેર વિક્રેતા એવા, <ph name="SUBRESOURCE_HOST" /> થી આવે છે.</translation>
@@ -598,7 +596,6 @@
 <translation id="6358450015545214790">આનો અર્થ શું છે?</translation>
 <translation id="6386120369904791316">{COUNT,plural, =1{1 અન્ય સૂચન}one{# અન્ય સૂચન}other{# અન્ય સૂચન}}</translation>
 <translation id="6387478394221739770">શું કૂલ નવી Chrome સુવિધાઓમાં રુચિ ધરાવો છો? chrome.com/beta પર અમારી બીટા ચેનલ અજમાવી જુઓ.</translation>
-<translation id="6389758589412724634">આ વેબ પૃષ્ઠ પ્રદર્શિત કરવાનો પ્રયાસ કરતી વખતે Chromium ની મેમરી સમાપ્ત થઈ ગઈ.</translation>
 <translation id="6404511346730675251">બુકમાર્ક સંપાદિત કરો</translation>
 <translation id="6410264514553301377"><ph name="CREDIT_CARD" /> માટે સમાપ્તિ તારીખ અને CVC દાખલ કરો</translation>
 <translation id="6414888972213066896">આ પૃષ્ઠની મુલાકાત લો છો તે ઠીક છે કે કેમ તેવું તમે તમારા માતાપિતાને પૂછ્યું</translation>
@@ -621,7 +618,6 @@
 <translation id="6556915248009097796">સમાપ્તિ: <ph name="EXPIRATION_DATE_ABBR" />, છેલ્લે <ph name="LAST_USED_DATE_NO_DETAIL" /> ના રોજ ઉપયોગ કર્યો</translation>
 <translation id="6563469144985748109">તમારા સંચાલકે હજી સુધી તેને મંજૂર કરેલ નથી</translation>
 <translation id="6569060085658103619">તમે એક્સ્ટેન્શન પૃષ્ઠ જોઈ રહ્યાં છો</translation>
-<translation id="6593753688552673085"><ph name="UPPER_ESTIMATE" /> કરતાં ઓછું</translation>
 <translation id="6596325263575161958">એન્ક્રિપ્શન વિકલ્પો</translation>
 <translation id="662080504995468778">પૃષ્ઠ પર રહો</translation>
 <translation id="6626291197371920147">માન્ય કાર્ડ નંબર ઉમેરો</translation>
@@ -633,7 +629,6 @@
 <translation id="6710594484020273272">&lt;શોધ શબ્દ લખો&gt;</translation>
 <translation id="6711464428925977395">પ્રોક્સી સર્વરમાં કંઈક ખોટું થયું છે અથવા તો સરનામું ખોટું છે.</translation>
 <translation id="6727102863431372879">સેટ કરો</translation>
-<translation id="6731320287533051140">{COUNT,plural, =0{કોઈ નહીં}=1{1 આઇટમ}one{# આઇટમ}other{# આઇટમ}}</translation>
 <translation id="674375294223700098">અજ્ઞાત સર્વર પ્રમાણપત્ર ભૂલ.</translation>
 <translation id="6753269504797312559">નીતિ મૂલ્ય</translation>
 <translation id="6757797048963528358">તમારું ઉપકરણ નિષ્ક્રિય થઈ ગયું હતું.</translation>
@@ -676,6 +671,7 @@
 <translation id="7180611975245234373">તાજું કરો</translation>
 <translation id="7182878459783632708">કોઈ નીતિઓ  સેટ નથી</translation>
 <translation id="7186367841673660872">આ પૃષ્ઠનું<ph name="ORIGINAL_LANGUAGE" />માંથી<ph name="LANGUAGE_LANGUAGE" />માં ભાષાંતર કરવામાં આવ્યું છે.</translation>
+<translation id="7192203810768312527"><ph name="SIZE" /> ખાલી કરે છે. તમારી આગલી મુલાકાત સમયે કેટલીક સાઇટો વધુ ધીમે લોડ થઈ શકે છે.</translation>
 <translation id="719464814642662924">વિઝા</translation>
 <translation id="7210863904660874423"><ph name="HOST_NAME" />, સુરક્ષા માનકોનું પાલન કરતું નથી.</translation>
 <translation id="721197778055552897">આ સમસ્યા વિશે <ph name="BEGIN_LINK" />વધુ જાણો<ph name="END_LINK" />.</translation>
@@ -738,6 +734,7 @@
 <translation id="7669271284792375604">આ સાઇટ પરના હુમલાખોરો તમને તમારા બ્રાઉઝિંગ અનુભવને નુકસાન પહોંચાડે એવા પ્રોગ્રામ્સ ઇન્સ્ટૉલ કરવા માટે છેતરવાનો પ્રયાસ કરી શકે છે (ઉદાહરણ તરીકે, તમારું હોમપેજ બદલીને અથવા તમે મુલાકાત લો છો તે સાઇટ્સ પર વધુ પડતી જાહેરાતો બતાવીને).</translation>
 <translation id="7674629440242451245">શું કૂલ નવી Chrome સુવિધાઓમાં રુચિ ધરાવો છો? chrome.com/dev પર અમારી dev ચૅનલ અજમાવી જુઓ.</translation>
 <translation id="7682287625158474539">શિપિંગ</translation>
+<translation id="7701040980221191251">કોઈ નહીં</translation>
 <translation id="7704050614460855821"><ph name="BEGIN_LINK" /><ph name="SITE" /> પર આગળ વધો (અસલામત)<ph name="END_LINK" /></translation>
 <translation id="7714464543167945231">પ્રમાણપત્ર</translation>
 <translation id="7716424297397655342">કૅશમાંથી આ સાઇટ લોડ કરી શકાતી નથી</translation>
@@ -777,7 +774,6 @@
 <translation id="8041089156583427627">પ્રતિસાદ મોકલો</translation>
 <translation id="8041940743680923270">વૈશ્વિક ડિફોલ્ટનો ઉપયોગ કરો (કહો)</translation>
 <translation id="8088680233425245692">લેખ જોવામાં નિષ્ફળ થયાં.</translation>
-<translation id="8089520772729574115">1 MB કરતાં ઓછું</translation>
 <translation id="8091372947890762290">સક્રિયતા સર્વર પર બાકી છે</translation>
 <translation id="8118489163946903409">ચુકવણી પદ્ધતિ</translation>
 <translation id="8131740175452115882">પુષ્ટિ કરો</translation>
diff --git a/components/strings/components_strings_hi.xtb b/components/strings/components_strings_hi.xtb
index bbe579c..f8d22d1 100644
--- a/components/strings/components_strings_hi.xtb
+++ b/components/strings/components_strings_hi.xtb
@@ -220,7 +220,6 @@
 <translation id="2826760142808435982">कनेक्शन को <ph name="CIPHER" /> का उपयोग करके एन्क्रिप्ट और प्रमाणित किया गया है और यह कुंजी विनिमय तकनीक के रूप में <ph name="KX" /> का उपयोग करता है.</translation>
 <translation id="2835170189407361413">फ़ॉर्म साफ़ करें</translation>
 <translation id="2889159643044928134">पुन: लोड ना करें</translation>
-<translation id="2900469785430194048">यह वेबपेज दिखाते समय Google Chrome में जगह नहीं बची.</translation>
 <translation id="2909946352844186028">नेटवर्क में बदलाव का पता चला.</translation>
 <translation id="2916038427272391327">दूसरे प्रोग्राम बंद करें</translation>
 <translation id="2922350208395188000">सर्वर प्रमाणपत्र की जांच नहीं की जा सकती.</translation>
@@ -243,7 +242,6 @@
 <translation id="3024663005179499861">गलत नीति प्रकार</translation>
 <translation id="3032412215588512954">क्या आप इस साइट को फिर से लोड करना चाहते हैं?</translation>
 <translation id="3037605927509011580">हे भगवान!</translation>
-<translation id="3040955737384246924">{COUNT,plural, =0{समन्वयित डिवाइस पर कम से कम 1 आइटम}=1{1 आइटम (समन्वयित डिवाइस पर और भी)}one{# आइटम (समन्वयित डिवाइस पर और भी)}other{# आइटम (समन्वयित डिवाइस पर और भी)}}</translation>
 <translation id="3041612393474885105">प्रमाणपत्र जानकारी</translation>
 <translation id="3063697135517575841">Chrome इस समय आपके कार्ड की पुष्टि नहीं कर सका. कृपया बाद में पुन: प्रयास करें.</translation>
 <translation id="3064966200440839136">किसी बाहरी ऐप्लिकेशन के ज़रिए भुगतान करने के लिए गुप्त मोड छोड़ रहे हैं. जारी रखना चाहते हैं?</translation>
@@ -337,7 +335,6 @@
 <translation id="3681007416295224113">प्रमाणपत्र जानकारी</translation>
 <translation id="3690164694835360974">लॉगिन सुरक्षित नहीं है</translation>
 <translation id="3693415264595406141">पासवर्ड:</translation>
-<translation id="3696411085566228381">कोई नहीं</translation>
 <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation>
 <translation id="370665806235115550">लोड हो रही हैं...</translation>
 <translation id="3712624925041724820">लाइसेंस समाप्त हो गए</translation>
@@ -385,7 +382,6 @@
 <translation id="4171400957073367226">गलत सत्यापन हस्ताक्षर</translation>
 <translation id="4196861286325780578">&amp;ले जाना फिर से करें</translation>
 <translation id="4203896806696719780"><ph name="BEGIN_LINK" />फायरवॉल और एंटीवायरस कॉन्फ़िगरेशन की जांच करें<ph name="END_LINK" /></translation>
-<translation id="4206349416402437184">{COUNT,plural, =0{कोई नहीं}=1{1 ऐप्लिकेशन ($1)}=2{2 ऐप्लिकेशन ($1, $2)}one{# ऐप्लिकेशन ($1, $2, $3)}other{# ऐप्लिकेशन ($1, $2, $3)}}</translation>
 <translation id="4220128509585149162">क्रैश</translation>
 <translation id="4226937834893929579"><ph name="BEGIN_LINK" />नेटवर्क निदान चलाकर देखें<ph name="END_LINK" />.</translation>
 <translation id="4250431568374086873">इस साइट से आपका कनेक्शन पूरी तरह से सुरक्षित नहीं है</translation>
@@ -469,7 +465,6 @@
 <translation id="5045550434625856497">ग़लत पासवर्ड</translation>
 <translation id="5056549851600133418">आपके लिए लेख</translation>
 <translation id="5070335125961472645"><ph name="BEGIN_LINK" />प्रॉक्सी पते की जांच करें<ph name="END_LINK" /></translation>
-<translation id="5076731569460970710">{COUNT,plural, =0{कोई कुकी नहीं}=1{1 साइट कुकी का उपयोग करती है. }one{# साइटें कुकी का उपयोग करती हैं. }other{# साइटें कुकी का उपयोग करती हैं. }}</translation>
 <translation id="5087286274860437796">सर्वर का प्रमाण पत्र इस समय मान्य नहीं है.</translation>
 <translation id="5087580092889165836">कार्ड जोड़ें</translation>
 <translation id="5089810972385038852">राज्य</translation>
@@ -601,7 +596,6 @@
 <translation id="6358450015545214790">इनका क्‍या अर्थ है?</translation>
 <translation id="6386120369904791316">{COUNT,plural, =1{1 अन्‍य सुझाव}one{# अन्‍य सुझाव}other{# अन्‍य सुझाव}}</translation>
 <translation id="6387478394221739770">बेहतरीन नई Chrome सुविधाओं में रूचि है? chrome.com/beta पर हमारा बीटा चैनल आज़माएं.</translation>
-<translation id="6389758589412724634">यह वेबपेज दिखाते समय क्रोमियम में जगह नहीं बची.</translation>
 <translation id="6404511346730675251">बुकमार्क संपादित करें</translation>
 <translation id="6410264514553301377"><ph name="CREDIT_CARD" /> का समाप्ति दिनांक और CVC डालें</translation>
 <translation id="6414888972213066896">आपने अपने अभिभावक से पूछा था कि इस साइट पर जाना ठीक है या नहीं</translation>
@@ -624,7 +618,6 @@
 <translation id="6556915248009097796">खत्म होने की तारीख: <ph name="EXPIRATION_DATE_ABBR" />, पिछली बार <ph name="LAST_USED_DATE_NO_DETAIL" /> को उपयोग किया गया</translation>
 <translation id="6563469144985748109">आपके प्रबंधक ने अभी तक इसकी स्वीकृति नहीं दी है</translation>
 <translation id="6569060085658103619">आप एक एक्सटेंशन पेज देख रहे हैं</translation>
-<translation id="6593753688552673085"><ph name="UPPER_ESTIMATE" /> से कम</translation>
 <translation id="6596325263575161958">सुरक्षित तरीका विकल्प</translation>
 <translation id="662080504995468778">इसपर रहें</translation>
 <translation id="6626291197371920147">मान्य कार्ड नंबर जोड़ें</translation>
@@ -636,7 +629,6 @@
 <translation id="6710594484020273272">&lt;खोज शब्द लिखें&gt;</translation>
 <translation id="6711464428925977395">प्रॉक्सी सर्वर के साथ कुछ गलत है या पता गलत है.</translation>
 <translation id="6727102863431372879">सेट करें</translation>
-<translation id="6731320287533051140">{COUNT,plural, =0{कोई नहीं}=1{1 आइटम}one{# आइटम}other{# आइटम}}</translation>
 <translation id="674375294223700098">अज्ञात सर्वर प्रमाणपत्र गड़बड़ी.</translation>
 <translation id="6753269504797312559">नीति मान</translation>
 <translation id="6757797048963528358">आपका डिवाइस निष्क्रिय हो गया है.</translation>
@@ -742,6 +734,7 @@
 <translation id="7669271284792375604">इस साइट पर मौजूद हमलावर आपके ब्राउज़िंग अनुभव को हानि पहुंचा सकने वाले प्रोग्राम इंस्टॉल करने के लिए आपको भ्रमित कर सकते हैं (उदाहरण के लिए, आपके मुखपृष्ठ को बदलकर या आपकी विज़िट की जा रहीं साइट पर अतिरिक्त विज्ञापन दिखाकर).</translation>
 <translation id="7674629440242451245">शानदार नई Chrome सुविधाओं में रूचि है? तो chrome.com/dev पर हमारा डेव चैनल आज़माएं.</translation>
 <translation id="7682287625158474539">शिपिंग</translation>
+<translation id="7701040980221191251">कुछ नहीं</translation>
 <translation id="7704050614460855821"><ph name="BEGIN_LINK" /><ph name="SITE" /> में आगे बढ़ें (असुरक्षित)<ph name="END_LINK" /></translation>
 <translation id="7714464543167945231">प्रमाणपत्र</translation>
 <translation id="7716424297397655342">इस साइट को संचय से लोड नहीं किया जा सकता</translation>
@@ -781,7 +774,6 @@
 <translation id="8041089156583427627">सुझाव भेजें</translation>
 <translation id="8041940743680923270">वैश्विक डिफ़ॉल्ट का उपयोग करें (पूछें)</translation>
 <translation id="8088680233425245692">लेख देखने में विफल रहा.</translation>
-<translation id="8089520772729574115">1 MB से कम</translation>
 <translation id="8091372947890762290">सर्वर पर सक्रियण लंबित है</translation>
 <translation id="8118489163946903409">भुगतान विधि</translation>
 <translation id="8131740175452115882">दुबारा पूछें</translation>
diff --git a/components/strings/components_strings_hr.xtb b/components/strings/components_strings_hr.xtb
index 4054e3c9..194ddf9 100644
--- a/components/strings/components_strings_hr.xtb
+++ b/components/strings/components_strings_hr.xtb
@@ -220,7 +220,6 @@
 <translation id="2826760142808435982">Veza je kriptirana i autentificirana šifrom <ph name="CIPHER" />, a <ph name="KX" /> služi za mehanizam razmjene ključeva.</translation>
 <translation id="2835170189407361413">Obriši obrazac</translation>
 <translation id="2889159643044928134">Ne učitavaj ponovo</translation>
-<translation id="2900469785430194048">Google Chrome ostao je bez memorije dok je pokušavao prikazati ovu web-stranicu.</translation>
 <translation id="2909946352844186028">Otkrivena je promjena mreže.</translation>
 <translation id="2916038427272391327">Zatvorite ostale programe</translation>
 <translation id="2922350208395188000">Certifikat poslužitelja nije moguće provjeriti.</translation>
@@ -243,7 +242,6 @@
 <translation id="3024663005179499861">Pogrešna vrsta pravila</translation>
 <translation id="3032412215588512954">Želite li ponovo učitati tu web-lokaciju?</translation>
 <translation id="3037605927509011580">O, ne!</translation>
-<translation id="3040955737384246924">{COUNT,plural, =0{najmanje 1 stavka na sinkroniziranim uređajima}=1{1 stavka (i više njih na sinkroniziranim uređajima)}one{# stavka (i više njih na sinkroniziranim uređajima)}few{# stavke (i više njih na sinkroniziranim uređajima)}other{# stavki (i više njih na sinkroniziranim uređajima)}}</translation>
 <translation id="3041612393474885105">Podaci o certifikatu</translation>
 <translation id="3063697135517575841">Chrome nije uspio potvrditi vašu karticu. Pokušajte ponovo kasnije.</translation>
 <translation id="3064966200440839136">Napuštate anonimni način rada da biste platili putem vanjske aplikacije. Želite li nastaviti?</translation>
@@ -336,7 +334,6 @@
 <translation id="3681007416295224113">Podaci o certifikatu</translation>
 <translation id="3690164694835360974">Prijava nije sigurna</translation>
 <translation id="3693415264595406141">Zaporka:</translation>
-<translation id="3696411085566228381">ništa</translation>
 <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation>
 <translation id="370665806235115550">Učitavanje...</translation>
 <translation id="3712624925041724820">Licence su potrošene</translation>
@@ -384,7 +381,6 @@
 <translation id="4171400957073367226">Potpis za potvrdu nije ispravan.</translation>
 <translation id="4196861286325780578">&amp;Ponovi premještanje</translation>
 <translation id="4203896806696719780"><ph name="BEGIN_LINK" />provjerite vatrozid i konfiguraciju antivirusnog programa<ph name="END_LINK" /></translation>
-<translation id="4206349416402437184">{COUNT,plural, =0{ništa}=1{1 aplikacija ($1)}=2{2 aplikacije ($1, $2)}one{# aplikacija ($1, $2, $3)}few{# aplikacije ($1, $2, $3)}other{# aplikacija ($1, $2, $3)}}</translation>
 <translation id="4220128509585149162">Padovi programa</translation>
 <translation id="4226937834893929579"><ph name="BEGIN_LINK" />Pokušajte pokrenuti Mrežnu dijagnostiku<ph name="END_LINK" />.</translation>
 <translation id="4250431568374086873">Veza s ovom web-lokacijom nije potpuno sigurna</translation>
@@ -468,7 +464,6 @@
 <translation id="5045550434625856497">Pogrešna zaporka</translation>
 <translation id="5056549851600133418">Preporučeni članci</translation>
 <translation id="5070335125961472645"><ph name="BEGIN_LINK" />provjerite proxy adresu<ph name="END_LINK" /></translation>
-<translation id="5076731569460970710">{COUNT,plural, =0{Nema kolačića}=1{1 web-lokacija upotrebljava kolačiće. }one{# web-lokacija upotrebljava kolačiće. }few{# web-lokacije upotrebljavaju kolačiće. }other{# web-lokacija upotrebljava kolačiće. }}</translation>
 <translation id="5087286274860437796">Certifikat poslužitelja trenutačno nije važeći.</translation>
 <translation id="5087580092889165836">Dodaj karticu</translation>
 <translation id="5089810972385038852">Država</translation>
@@ -600,7 +595,6 @@
 <translation id="6358450015545214790">Što to znači?</translation>
 <translation id="6386120369904791316">{COUNT,plural, =1{1 drugi prijedlog}one{# drugi prijedlog}few{# druga prijedloga}other{# drugih prijedloga}}</translation>
 <translation id="6387478394221739770">Zanimaju li vas nove, kul značajke preglednika Chrome? Isprobajte naš beta kanal na stranici chrome.com/beta.</translation>
-<translation id="6389758589412724634">Chromium je ostao bez memorije dok je pokušavao prikazati ovu web-stranicu.</translation>
 <translation id="6404511346730675251">Uredi oznaku</translation>
 <translation id="6410264514553301377">Unesite datum isteka i CVC za karticu <ph name="CREDIT_CARD" /></translation>
 <translation id="6414888972213066896">Pitao si roditelja smiješ li otvoriti tu web-lokaciju</translation>
@@ -623,7 +617,6 @@
 <translation id="6556915248009097796">Istek: <ph name="EXPIRATION_DATE_ABBR" />, posljednja upotreba <ph name="LAST_USED_DATE_NO_DETAIL" /></translation>
 <translation id="6563469144985748109">Voditelj je još nije odobrio</translation>
 <translation id="6569060085658103619">Gledate stranicu proširenja</translation>
-<translation id="6593753688552673085">manje od <ph name="UPPER_ESTIMATE" /></translation>
 <translation id="6596325263575161958">Opcije šifriranja</translation>
 <translation id="662080504995468778">Ostani</translation>
 <translation id="6626291197371920147">Dodajte važeći broj kartice</translation>
@@ -635,7 +628,6 @@
 <translation id="6710594484020273272">&lt;Upišite pojam za pretraživanje&gt;</translation>
 <translation id="6711464428925977395">Nešto nije u redu s proxy poslužiteljem ili adresa nije točna.</translation>
 <translation id="6727102863431372879">Postavi</translation>
-<translation id="6731320287533051140">{COUNT,plural, =0{ništa}=1{1 stavka}one{# stavka}few{# stavke}other{# stavki}}</translation>
 <translation id="674375294223700098">Nepoznata pogreška certifikata poslužitelja</translation>
 <translation id="6753269504797312559">Vrijednost pravila</translation>
 <translation id="6757797048963528358">Uređaj je u stanju mirovanja.</translation>
@@ -741,6 +733,7 @@
 <translation id="7669271284792375604">Napadači na ovoj web-lokaciji mogu vas pokušati navesti na instaliranje programa koji smanjuju kvalitetu pregledavanja interneta (npr. promjenom početne stranice ili prikazivanjem dodatnih oglasa na web-lokacijama koje posjetite).</translation>
 <translation id="7674629440242451245">Zanimaju li vas nove, kul značajke preglednika Chrome? Isprobajte naš razvojni kanal na stranici chrome.com/dev.</translation>
 <translation id="7682287625158474539">Dostava</translation>
+<translation id="7701040980221191251">Nema</translation>
 <translation id="7704050614460855821"><ph name="BEGIN_LINK" />Idi na web-lokaciju <ph name="SITE" /> (nije sigurno)<ph name="END_LINK" /></translation>
 <translation id="7714464543167945231">Certifikat</translation>
 <translation id="7716424297397655342">Web-lokacija se ne može učitati iz predmemorije</translation>
@@ -780,7 +773,6 @@
 <translation id="8041089156583427627">Slanje povratnih informacija</translation>
 <translation id="8041940743680923270">Upotrijebi globalnu zadanu vrijednost (pitaj)</translation>
 <translation id="8088680233425245692">Prikaz članka nije uspio.</translation>
-<translation id="8089520772729574115">manje od 1 MB</translation>
 <translation id="8091372947890762290">Aktivacija je na čekanju na poslužitelju</translation>
 <translation id="8118489163946903409">Način plaćanja</translation>
 <translation id="8131740175452115882">Potvrdi</translation>
diff --git a/components/strings/components_strings_hu.xtb b/components/strings/components_strings_hu.xtb
index 7510aca8..0d3e3d1 100644
--- a/components/strings/components_strings_hu.xtb
+++ b/components/strings/components_strings_hu.xtb
@@ -220,7 +220,6 @@
 <translation id="2826760142808435982">A kapcsolat <ph name="KX" /> algoritmust használ kulcscserélő mechanizmusként, kódolása pedig <ph name="CIPHER" /> használatával történt.</translation>
 <translation id="2835170189407361413">Űrlap törlése</translation>
 <translation id="2889159643044928134">Ne töltse újra</translation>
-<translation id="2900469785430194048">Elfogyott a memória, miközben a Google Chrome megpróbálta megjeleníteni ezt a weboldalt.</translation>
 <translation id="2909946352844186028">Változást érzékeltünk a hálózatban.</translation>
 <translation id="2916038427272391327">Zárja be a többi programot</translation>
 <translation id="2922350208395188000">A szerver tanúsítványát nem sikerült leellenőrizni.</translation>
@@ -243,7 +242,6 @@
 <translation id="3024663005179499861">Nem megfelelő irányelvtípus</translation>
 <translation id="3032412215588512954">Szeretné újratölteni a webhelyet?</translation>
 <translation id="3037605927509011580">A manóba!</translation>
-<translation id="3040955737384246924">{COUNT,plural, =0{legalább 1 elem van a szinkronizált eszközökön}=1{1 elem (és még több a szinkronizált eszközökön)}other{# elem (és még több a szinkronizált eszközökön)}}</translation>
 <translation id="3041612393474885105">Tanúsítvány adatai</translation>
 <translation id="3063697135517575841">A Chrome ez alkalommal nem tudta ellenőrizni az Ön kártyáját. Próbálja újra később.</translation>
 <translation id="3064966200440839136">Inkognitómód elhagyása külső alkalmazással történő fizetéshez. Folytatja?</translation>
@@ -335,7 +333,6 @@
 <translation id="3681007416295224113">Tanúsítvány adatai</translation>
 <translation id="3690164694835360974">A bejelentkezés nem biztonságos</translation>
 <translation id="3693415264595406141">Jelszó:</translation>
-<translation id="3696411085566228381">nincs</translation>
 <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation>
 <translation id="370665806235115550">Betöltés...</translation>
 <translation id="3712624925041724820">Az engedélyek elfogytak</translation>
@@ -383,7 +380,6 @@
 <translation id="4171400957073367226">Hibás igazoló aláírás.</translation>
 <translation id="4196861286325780578">&amp;Áthelyezés újra</translation>
 <translation id="4203896806696719780"><ph name="BEGIN_LINK" />A tűzfal és a vírusirtó konfigurációjának ellenőrzése<ph name="END_LINK" /></translation>
-<translation id="4206349416402437184">{COUNT,plural, =0{nincsen}=1{1 alkalmazás ($1)}=2{2 alkalmazás ($1, $2)}other{# alkalmazás ($1, $2, $3)}}</translation>
 <translation id="4220128509585149162">Összeomlások</translation>
 <translation id="4226937834893929579"><ph name="BEGIN_LINK" />Próbálkozzon a Hálózati diagnosztika futtatásával<ph name="END_LINK" />.</translation>
 <translation id="4250431568374086873">Kapcsolata a webhellyel nem teljesen biztonságos</translation>
@@ -467,7 +463,6 @@
 <translation id="5045550434625856497">Helytelen jelszó</translation>
 <translation id="5056549851600133418">Cikkek Önnek</translation>
 <translation id="5070335125961472645"><ph name="BEGIN_LINK" />A proxy címének ellenőrzése<ph name="END_LINK" /></translation>
-<translation id="5076731569460970710">{COUNT,plural, =0{Nincs cookie}=1{1 webhely használ cookie-kat. }other{# webhely használ cookie-kat. }}</translation>
 <translation id="5087286274860437796">A szerver tanúsítványa jelenleg nem érvényes.</translation>
 <translation id="5087580092889165836">Kártya hozzáadása</translation>
 <translation id="5089810972385038852">Állam</translation>
@@ -599,7 +594,6 @@
 <translation id="6358450015545214790">Mit jelent ez?</translation>
 <translation id="6386120369904791316">{COUNT,plural, =1{1 egyéb javaslat}other{# egyéb javaslat}}</translation>
 <translation id="6387478394221739770">Érdekli néhány remek új Chrome-funkció? Próbálja ki a Béta csatornánkat a chrome.com/beta webhelyen.</translation>
-<translation id="6389758589412724634">Elfogyott a memória, miközben a Chromium megpróbálta megjeleníteni ezt a weboldalt.</translation>
 <translation id="6404511346730675251">Könyvjelző szerkesztése</translation>
 <translation id="6410264514553301377">Írja be a(z) <ph name="CREDIT_CARD" /> kártyán szereplő lejárati dátumot és CVC-t</translation>
 <translation id="6414888972213066896">Megkérdezted a szülőt, hogy meg szabad-e látogatnod ezt a webhelyet</translation>
@@ -622,7 +616,6 @@
 <translation id="6556915248009097796">Lejárati dátum: <ph name="EXPIRATION_DATE_ABBR" />, utolsó használat: <ph name="LAST_USED_DATE_NO_DETAIL" /></translation>
 <translation id="6563469144985748109">A kezelő még nem hagyta jóvá</translation>
 <translation id="6569060085658103619">Jelenleg bővítményoldalt tekint meg</translation>
-<translation id="6593753688552673085">kevesebb, mint <ph name="UPPER_ESTIMATE" /></translation>
 <translation id="6596325263575161958">Titkosítási lehetőségek</translation>
 <translation id="662080504995468778">Mégse</translation>
 <translation id="6626291197371920147">Adjon meg érvényes kártyaszámot</translation>
@@ -634,7 +627,6 @@
 <translation id="6710594484020273272">&lt;Írja be a keresési kifejezést&gt;</translation>
 <translation id="6711464428925977395">Valami gond van a proxyszerverrel, vagy a cím nem megfelelő.</translation>
 <translation id="6727102863431372879">Beállítás</translation>
-<translation id="6731320287533051140">{COUNT,plural, =0{nincsen}=1{1 elem}other{# elem}}</translation>
 <translation id="674375294223700098">Ismeretlen szervertanúsítvány-hiba.</translation>
 <translation id="6753269504797312559">Házirend értéke</translation>
 <translation id="6757797048963528358">Eszköze alvó üzemmódba váltott.</translation>
@@ -740,6 +732,7 @@
 <translation id="7669271284792375604">A webhelyen lévő támadók megpróbálhatják csellel rávenni Önt olyan programok telepítésére, amelyek károsak a böngészési élmény szempontjából (például módosítják a kezdőlapot, vagy plusz hirdetéseket jelenítenek meg a felkeresett webhelyeken).</translation>
 <translation id="7674629440242451245">Érdekli néhány remek új Chrome-funkció? Próbálja ki a fejlesztői csatornánkat a chrome.com/dev webhelyen.</translation>
 <translation id="7682287625158474539">Szállítási cím</translation>
+<translation id="7701040980221191251">Nincs</translation>
 <translation id="7704050614460855821"><ph name="BEGIN_LINK" />Tovább a(z) <ph name="SITE" /> webhelyre (nem biztonságos)<ph name="END_LINK" /></translation>
 <translation id="7714464543167945231">Tanúsítvány</translation>
 <translation id="7716424297397655342">A webhely nem tölthető be a gyorsítótárból</translation>
@@ -779,7 +772,6 @@
 <translation id="8041089156583427627">Visszajelzés küldése</translation>
 <translation id="8041940743680923270">Globális alapértelmezés használata (Megkérdezés)</translation>
 <translation id="8088680233425245692">Nem sikerült megtekinteni a cikket.</translation>
-<translation id="8089520772729574115">kevesebb mint 1 MB</translation>
 <translation id="8091372947890762290">Az aktiválás függőben van a szerveren</translation>
 <translation id="8118489163946903409">Fizetési mód</translation>
 <translation id="8131740175452115882">Megerősítés</translation>
diff --git a/components/strings/components_strings_id.xtb b/components/strings/components_strings_id.xtb
index 396fd82..5d11a73 100644
--- a/components/strings/components_strings_id.xtb
+++ b/components/strings/components_strings_id.xtb
@@ -220,7 +220,6 @@
 <translation id="2826760142808435982">Sambungan dienkripsi dan diautentikasi menggunakan <ph name="CIPHER" /> dan menggunakan <ph name="KX" /> sebagai mekanisme pertukaran kunci.</translation>
 <translation id="2835170189407361413">Hapus formulir</translation>
 <translation id="2889159643044928134">Jangan Muat Ulang</translation>
-<translation id="2900469785430194048">Google Chrome kehabisan memori saat mencoba menampilkan laman web ini.</translation>
 <translation id="2909946352844186028">Perubahan jaringan terdeteksi.</translation>
 <translation id="2916038427272391327">Tutup program lain</translation>
 <translation id="2922350208395188000">Sertifikat server tidak dapat diperiksa.</translation>
@@ -243,7 +242,6 @@
 <translation id="3024663005179499861">Jenis kebijakan salah</translation>
 <translation id="3032412215588512954">Ingin memuat ulang situs ini?</translation>
 <translation id="3037605927509011580">Yah!</translation>
-<translation id="3040955737384246924">{COUNT,plural, =0{minimal 1 item pada perangkat yang disinkronkan}=1{1 item (dan beberapa di perangkat yang disinkronkan)}other{# item (dan beberapa di perangkat yang disinkronkan)}}</translation>
 <translation id="3041612393474885105">Informasi Sertifikat</translation>
 <translation id="3063697135517575841">Saat ini Chrome tidak dapat mengonfirmasi kartu. Coba lagi nanti.</translation>
 <translation id="3064966200440839136">Keluar dari mode penyamaran untuk membayar melalui aplikasi eksternal. Lanjutkan?</translation>
@@ -337,7 +335,6 @@
 <translation id="3681007416295224113">Informasi sertifikat</translation>
 <translation id="3690164694835360974">Proses masuk tidak aman</translation>
 <translation id="3693415264595406141">Sandi:</translation>
-<translation id="3696411085566228381">tidak ada</translation>
 <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation>
 <translation id="370665806235115550">Memuat...</translation>
 <translation id="3712624925041724820">Lisensi habis</translation>
@@ -385,7 +382,6 @@
 <translation id="4171400957073367226">Tanda tangan verifikasi tidak valid</translation>
 <translation id="4196861286325780578">&amp;Ulangi pemindahan</translation>
 <translation id="4203896806696719780"><ph name="BEGIN_LINK" />Periksa konfigurasi antivirus dan firewall<ph name="END_LINK" /></translation>
-<translation id="4206349416402437184">{COUNT,plural, =0{tidak ada}=1{1 aplikasi ($1)}=2{2 aplikasi ($1, $2)}other{# aplikasi ($1, $2, $3)}}</translation>
 <translation id="4220128509585149162">Kerusakan</translation>
 <translation id="4226937834893929579"><ph name="BEGIN_LINK" />Coba jalankan Diagnostik Jaringan<ph name="END_LINK" />.</translation>
 <translation id="4250431568374086873">Sambungan ke situs ini tidak sepenuhnya aman</translation>
@@ -469,7 +465,6 @@
 <translation id="5045550434625856497">Sandi salah</translation>
 <translation id="5056549851600133418">Artikel untuk Anda</translation>
 <translation id="5070335125961472645"><ph name="BEGIN_LINK" />Periksa alamat proxy<ph name="END_LINK" /></translation>
-<translation id="5076731569460970710">{COUNT,plural, =0{Tak ada cookie}=1{1 situs menggunakan cookie. }other{# situs menggunakan cookie. }}</translation>
 <translation id="5087286274860437796">Sertifikat server saat ini tidak valid.</translation>
 <translation id="5087580092889165836">Tambahkan kartu</translation>
 <translation id="5089810972385038852">Negara bagian</translation>
@@ -601,7 +596,6 @@
 <translation id="6358450015545214790">Apakah maksud ini?</translation>
 <translation id="6386120369904791316">{COUNT,plural, =1{1 saran lain}other{# saran lain}}</translation>
 <translation id="6387478394221739770">Tertarik dengan fitur Chrome baru yang keren? Coba saluran beta kami di chrome.com/beta.</translation>
-<translation id="6389758589412724634">Chromium kehabisan memori saat mencoba menampilkan laman web ini.</translation>
 <translation id="6404511346730675251">Edit bookmark</translation>
 <translation id="6410264514553301377">Masukkan tanggal kedaluwarsa dan CVC <ph name="CREDIT_CARD" /></translation>
 <translation id="6414888972213066896">Kamu telah meminta izin kepada orang tua untuk mengunjungi situs ini</translation>
@@ -624,7 +618,6 @@
 <translation id="6556915248009097796">Habis masa berlaku: <ph name="EXPIRATION_DATE_ABBR" />, terakhir digunakan pada <ph name="LAST_USED_DATE_NO_DETAIL" /></translation>
 <translation id="6563469144985748109">Pengelola Anda belum menyetujuinya</translation>
 <translation id="6569060085658103619">Anda melihat halaman ekstensi</translation>
-<translation id="6593753688552673085">kurang dari <ph name="UPPER_ESTIMATE" /></translation>
 <translation id="6596325263575161958">Opsi enkripsi</translation>
 <translation id="662080504995468778">Tinggal</translation>
 <translation id="6626291197371920147">Tambahkan kartu yang valid</translation>
@@ -636,7 +629,6 @@
 <translation id="6710594484020273272">&lt;Ketik istilah penelusuran&gt;</translation>
 <translation id="6711464428925977395">Ada yang salah dengan server proxy, atau alamat tidak benar.</translation>
 <translation id="6727102863431372879">Setel</translation>
-<translation id="6731320287533051140">{COUNT,plural, =0{tidak ada}=1{1 item}other{# item}}</translation>
 <translation id="674375294223700098">Kesalahan sertifikat server tidak dikenal.</translation>
 <translation id="6753269504797312559">Nilai kebijakan</translation>
 <translation id="6757797048963528358">Perangkat Anda sedang dalam mode tidur.</translation>
@@ -742,6 +734,7 @@
 <translation id="7669271284792375604">Penyerang di situs ini mungkin berusaha mengelabui Anda agar memasang program yang dapat membahayakan pengalaman menjelajah Anda (misalnya dengan mengubah beranda Anda atau menayangkan iklan ekstra pada situs yang dikunjungi).</translation>
 <translation id="7674629440242451245">Tertarik dengan fitur Chrome baru yang keren? Coba saluran dev kami di chrome.com/dev.</translation>
 <translation id="7682287625158474539">Pengiriman</translation>
+<translation id="7701040980221191251">Tidak ada</translation>
 <translation id="7704050614460855821"><ph name="BEGIN_LINK" />Lanjutkan ke <ph name="SITE" /> (tidak aman)<ph name="END_LINK" /></translation>
 <translation id="7714464543167945231">Sertifikat</translation>
 <translation id="7716424297397655342">Situs ini tidak dapat dimuat dari cache</translation>
@@ -781,7 +774,6 @@
 <translation id="8041089156583427627">Kirim Masukan</translation>
 <translation id="8041940743680923270">Gunakan default global (Tanyakan)</translation>
 <translation id="8088680233425245692">Gagal melihat artikel.</translation>
-<translation id="8089520772729574115">kurang dari 1 MB</translation>
 <translation id="8091372947890762290">Aktivasi ditunda di server</translation>
 <translation id="8118489163946903409">Metode pembayaran</translation>
 <translation id="8131740175452115882">Konfirmasi</translation>
diff --git a/components/strings/components_strings_it.xtb b/components/strings/components_strings_it.xtb
index db0a173e..743f219 100644
--- a/components/strings/components_strings_it.xtb
+++ b/components/strings/components_strings_it.xtb
@@ -220,7 +220,6 @@
 <translation id="2826760142808435982">La connessione è stata criptata e autenticata utilizzando <ph name="CIPHER" /> e <ph name="KX" /> come meccanismo di scambio delle chiavi.</translation>
 <translation id="2835170189407361413">Cancella modulo</translation>
 <translation id="2889159643044928134">Non ricaricare</translation>
-<translation id="2900469785430194048">Google Chrome ha esaurito la memoria mentre cercava di visualizzare questa pagina web.</translation>
 <translation id="2909946352844186028">È stato rilevato un cambio di rete.</translation>
 <translation id="2916038427272391327">Chiudi altri programmi</translation>
 <translation id="2922350208395188000">Il certificato del server non può essere verificato.</translation>
@@ -243,7 +242,6 @@
 <translation id="3024663005179499861">Tipo di criterio errato</translation>
 <translation id="3032412215588512954">Vuoi ricaricare questo sito?</translation>
 <translation id="3037605927509011580">Uffa!</translation>
-<translation id="3040955737384246924">{COUNT,plural, =0{almeno 1 elemento sui dispositivi sincronizzati}=1{1 elemento (e altri sui dispositivi sincronizzati)}other{# elementi (e altri sui dispositivi sincronizzati)}}</translation>
 <translation id="3041612393474885105">Informazioni certificato</translation>
 <translation id="3063697135517575841">Al momento non è possibile confermare la carta in Chrome. Riprova più tardi.</translation>
 <translation id="3064966200440839136">Per procedere al pagamento tramite un'applicazione esterna, uscirai dalla modalità di navigazione in incognito. Continuare?</translation>
@@ -334,7 +332,6 @@
 <translation id="3681007416295224113">Informazioni certificato</translation>
 <translation id="3690164694835360974">Accesso non sicuro</translation>
 <translation id="3693415264595406141">Password:</translation>
-<translation id="3696411085566228381">nessuno</translation>
 <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation>
 <translation id="370665806235115550">Caricamento in corso...</translation>
 <translation id="3712624925041724820">Licenze esaurite</translation>
@@ -382,7 +379,6 @@
 <translation id="4171400957073367226">Firma di verifica non valida</translation>
 <translation id="4196861286325780578">&amp;Ripeti spostamento</translation>
 <translation id="4203896806696719780"><ph name="BEGIN_LINK" />Controllare le configurazioni del firewall e antivirus<ph name="END_LINK" /></translation>
-<translation id="4206349416402437184">{COUNT,plural, =0{nessuna}=1{1 app ($ 1)}=2{2 app ($ 1, $ 2)}other{# app ($ 1, $ 2, $ 3)}}</translation>
 <translation id="4220128509585149162">Arresti anomali</translation>
 <translation id="4226937834893929579"><ph name="BEGIN_LINK" />Prova a eseguire lo strumento Diagnostica di rete<ph name="END_LINK" />.</translation>
 <translation id="4250431568374086873">La connessione a questo sito non è completamente protetta</translation>
@@ -466,7 +462,6 @@
 <translation id="5045550434625856497">Password non corretta</translation>
 <translation id="5056549851600133418">Articoli per te</translation>
 <translation id="5070335125961472645"><ph name="BEGIN_LINK" />Controllare l'indirizzo proxy<ph name="END_LINK" /></translation>
-<translation id="5076731569460970710">{COUNT,plural, =0{Nessun cookie}=1{1 sito usa i cookie. }other{# siti usano i cookie. }}</translation>
 <translation id="5087286274860437796">Il certificato del server non è valido in questa fase.</translation>
 <translation id="5087580092889165836">Aggiungi carta</translation>
 <translation id="5089810972385038852">Provincia</translation>
@@ -597,7 +592,6 @@
 <translation id="6358450015545214790">Che cosa significano?</translation>
 <translation id="6386120369904791316">{COUNT,plural, =1{1 altro suggerimento}other{# altri suggerimenti}}</translation>
 <translation id="6387478394221739770">Ti interessano le nuove e straordinarie funzioni di Chrome? Prova il nostro canale beta all'indirizzo chrome.com/beta.</translation>
-<translation id="6389758589412724634">Chromium ha esaurito la memoria mentre cercava di visualizzare questa pagina web.</translation>
 <translation id="6404511346730675251">Modifica preferito</translation>
 <translation id="6410264514553301377">Inserisci la data di scadenza e il codice CVC della carta <ph name="CREDIT_CARD" /></translation>
 <translation id="6414888972213066896">Hai chiesto ai tuoi genitori l'autorizzazione per visitare questo sito</translation>
@@ -620,7 +614,6 @@
 <translation id="6556915248009097796">Scadenza: <ph name="EXPIRATION_DATE_ABBR" />, ultimo utilizzo: <ph name="LAST_USED_DATE_NO_DETAIL" /></translation>
 <translation id="6563469144985748109">Il tuo gestore non ha ancora approvato la richiesta</translation>
 <translation id="6569060085658103619">È visualizzata la pagina di un'estensione</translation>
-<translation id="6593753688552673085">meno di <ph name="UPPER_ESTIMATE" /></translation>
 <translation id="6596325263575161958">Opzioni di crittografia</translation>
 <translation id="662080504995468778">Rimani</translation>
 <translation id="6626291197371920147">Aggiungi un numero di carta valido</translation>
@@ -632,7 +625,6 @@
 <translation id="6710594484020273272">&lt;Digita un termine di ricerca&gt;</translation>
 <translation id="6711464428925977395">Si è verificato un problema con il server proxy oppure l'indirizzo non è corretto.</translation>
 <translation id="6727102863431372879">Imposta</translation>
-<translation id="6731320287533051140">{COUNT,plural, =0{nessuno}=1{1 elemento}other{# elementi}}</translation>
 <translation id="674375294223700098">Errore sconosciuto del certificato del server.</translation>
 <translation id="6753269504797312559">Valore norma</translation>
 <translation id="6757797048963528358">Il dispositivo è entrato in modalità sospensione.</translation>
@@ -738,6 +730,7 @@
 <translation id="7669271284792375604">I malintenzionati su questo sito potrebbero cercare di indurti con l'inganno a installare programmi che danneggiano la tua navigazione (ad esempio cambiando la tua pagina iniziale o mostrando annunci extra sui siti che visiti).</translation>
 <translation id="7674629440242451245">Ti interessano le nuove e straordinarie funzioni di Chrome? Prova il nostro canale Dev all'indirizzo chrome.com/dev.</translation>
 <translation id="7682287625158474539">Spedizione</translation>
+<translation id="7701040980221191251">Nessuno</translation>
 <translation id="7704050614460855821"><ph name="BEGIN_LINK" />Procedi su <ph name="SITE" /> (non sicuro)<ph name="END_LINK" /></translation>
 <translation id="7714464543167945231">Certificato</translation>
 <translation id="7716424297397655342">Impossibile caricare il sito dalla cache</translation>
@@ -777,7 +770,6 @@
 <translation id="8041089156583427627">Invia feedback</translation>
 <translation id="8041940743680923270">Usa predefinita globale (Chiedi)</translation>
 <translation id="8088680233425245692">Impossibile visualizzare l'articolo.</translation>
-<translation id="8089520772729574115">meno di 1 MB</translation>
 <translation id="8091372947890762290">Attivazione in attesa sul server</translation>
 <translation id="8118489163946903409">Metodo di pagamento</translation>
 <translation id="8131740175452115882">Conferma</translation>
diff --git a/components/strings/components_strings_iw.xtb b/components/strings/components_strings_iw.xtb
index 92044d4..7e49332 100644
--- a/components/strings/components_strings_iw.xtb
+++ b/components/strings/components_strings_iw.xtb
@@ -220,7 +220,6 @@
 <translation id="2826760142808435982">החיבור מוצפן ומאומת באמצעות <ph name="CIPHER" /> ומשתמש ב-<ph name="KX" /> כמנגנון להחלפת מפתחות.</translation>
 <translation id="2835170189407361413">נקה טופס</translation>
 <translation id="2889159643044928134">אל תטען מחדש</translation>
-<translation id="2900469785430194048">‏אזל הזיכרון הזמין ל-Google Chrome בניסיון להציג את דף האינטרנט הזה.</translation>
 <translation id="2909946352844186028">אותר שינוי ברשת.</translation>
 <translation id="2916038427272391327">סגירת תוכניות אחרות</translation>
 <translation id="2922350208395188000">לא ניתן לבדוק את אישור השרת.</translation>
@@ -243,7 +242,6 @@
 <translation id="3024663005179499861">סוג המדיניות שגוי</translation>
 <translation id="3032412215588512954">האם ברצונך לטעון מחדש את האתר?</translation>
 <translation id="3037605927509011580">אוי, לא!</translation>
-<translation id="3040955737384246924">{COUNT,plural, =0{לפחות פריט אחד במכשירים מסונכרנים}=1{פריט אחד (ופריטים נוספים במכשירים מסונכרנים)}two{שני פריטים (ופריטים נוספים במכשירים מסונכרנים)}many{# פריטים (ופריטים נוספים במכשירים מסונכרנים)}other{# פריטים (ופריטים נוספים במכשירים מסונכרנים)}}</translation>
 <translation id="3041612393474885105">פרטי אישור</translation>
 <translation id="3063697135517575841">‏Chrome לא הצליח לאשר את הכרטיס שלך הפעם. נסה שוב מאוחר יותר.</translation>
 <translation id="3064966200440839136">בחרת לצאת ממצב גלישה בסתר כדי לשלם באמצעות יישום חיצוני. להמשיך?</translation>
@@ -337,7 +335,6 @@
 <translation id="3681007416295224113">פרטי אישור</translation>
 <translation id="3690164694835360974">ההתחברות אינה מאובטחת</translation>
 <translation id="3693415264595406141">סיסמה:</translation>
-<translation id="3696411085566228381">ללא</translation>
 <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation>
 <translation id="370665806235115550">טוען...</translation>
 <translation id="3712624925041724820">אין מספיק רישיונות</translation>
@@ -385,7 +382,6 @@
 <translation id="4171400957073367226">חתימת אימות לא חוקית</translation>
 <translation id="4196861286325780578">&amp;ביצוע מחדש של העברה</translation>
 <translation id="4203896806696719780"><ph name="BEGIN_LINK" />לבדוק את תצורת האנטי-וירוס וחומת האש<ph name="END_LINK" /></translation>
-<translation id="4206349416402437184">{COUNT,plural, =0{ללא}=1{אפליקציה אחת ($1)}=2{שתי אפליקציות ($1, $2)}many{# אפליקציות ($1, $2, $3)}other{# אפליקציות ($1, $2, $3)}}</translation>
 <translation id="4220128509585149162">קריסה</translation>
 <translation id="4226937834893929579"><ph name="BEGIN_LINK" />נסה להפעיל את אבחון הרשת<ph name="END_LINK" />.</translation>
 <translation id="4250431568374086873">החיבור שלך לאתר הזה לא מאובטח בצורה מלאה</translation>
@@ -473,7 +469,6 @@
 <translation id="5045550434625856497">סיסמה שגויה</translation>
 <translation id="5056549851600133418">מאמרים שעשויים לעניין אותך</translation>
 <translation id="5070335125961472645">‏<ph name="BEGIN_LINK" />לבדוק את כתובת שרת ה-Proxy<ph name="END_LINK" /></translation>
-<translation id="5076731569460970710">{COUNT,plural, =0{‏אין קובצי Cookie}=1{‏אתר אחד משתמש בקובצי Cookie. }two{‏# אתרים משתמשים בקובצי Cookie. }many{‏# אתרים משתמשים בקובצי Cookie. }other{‏# אתרים משתמשים בקובצי Cookie. }}</translation>
 <translation id="5087286274860437796">האישור של השרת אינו תקף כעת.</translation>
 <translation id="5087580092889165836">הוסף כרטיס</translation>
 <translation id="5089810972385038852">מדינה</translation>
@@ -606,7 +601,6 @@
 <translation id="6358450015545214790">מה זה אומר?</translation>
 <translation id="6386120369904791316">{COUNT,plural, =1{הצעה אחת נוספת}two{שתי הצעות נוספות}many{# הצעות נוספות}other{# הצעות נוספות}}</translation>
 <translation id="6387478394221739770">‏מעוניין בתכונות חדשות ומגניבות של Chrome? נסה את ערוץ הביטא שלנו בכתובת chrome.com/beta.</translation>
-<translation id="6389758589412724634">‏אזל הזיכרון הזמין ל-Chromium בניסיון להציג את דף האינטרנט הזה.</translation>
 <translation id="6404511346730675251">ערוך סימניה</translation>
 <translation id="6410264514553301377">הזן את תאריך התפוגה ואת קוד האימות של <ph name="CREDIT_CARD" /></translation>
 <translation id="6414888972213066896">שאלת אחד מהוריך אם אתה יכול לבקר באתר הזה</translation>
@@ -629,7 +623,6 @@
 <translation id="6556915248009097796">תאריך תפוגה: <ph name="EXPIRATION_DATE_ABBR" />, שימוש אחרון: <ph name="LAST_USED_DATE_NO_DETAIL" /></translation>
 <translation id="6563469144985748109">המנהל שלך עדיין לא אישר זאת</translation>
 <translation id="6569060085658103619">אתה מציג דף של תוסף</translation>
-<translation id="6593753688552673085">פחות מ-<ph name="UPPER_ESTIMATE" /></translation>
 <translation id="6596325263575161958">אפשרויות הצפנה</translation>
 <translation id="662080504995468778">הישאר</translation>
 <translation id="6626291197371920147">הוסף מספר כרטיס חוקי</translation>
@@ -641,7 +634,6 @@
 <translation id="6710594484020273272">&lt;הקלד מונח חיפוש&gt;</translation>
 <translation id="6711464428925977395">‏משהו אינו תקין בשרת ה-proxy, או שהכתובת שגויה.</translation>
 <translation id="6727102863431372879">הגדר</translation>
-<translation id="6731320287533051140">{COUNT,plural, =0{ללא}=1{פריט אחד}two{שני פריטים}many{# פריטים}other{# פריטים}}</translation>
 <translation id="674375294223700098">שגיאת אישור שרת לא ידוע.</translation>
 <translation id="6753269504797312559">ערך מדיניות</translation>
 <translation id="6757797048963528358">המכשיר עבר למצב שינה.</translation>
@@ -747,6 +739,7 @@
 <translation id="7669271284792375604">תוקפים באתר הזה עשויים לגרום לך, בדרכי מרמה, להתקין תוכניות שיפגעו בחוויית הגלישה שלך (לדוגמה, על ידי שינוי דף הבית או הצגת מודעות נוספות באתרים שבהם אתה מבקר).</translation>
 <translation id="7674629440242451245">‏מעוניין בתכונות חדשות ומגניבות של Chrome? נסה את הערוץ שלנו למפתחים בכתובת chrome.com/dev.</translation>
 <translation id="7682287625158474539">משלוח</translation>
+<translation id="7701040980221191251">ללא</translation>
 <translation id="7704050614460855821"><ph name="BEGIN_LINK" />המשך אל <ph name="SITE" /> (לא בטוח)<ph name="END_LINK" /></translation>
 <translation id="7714464543167945231">אישור</translation>
 <translation id="7716424297397655342">לא ניתן לטעון את האתר הזה מהמטמון</translation>
@@ -786,7 +779,6 @@
 <translation id="8041089156583427627">שלח משוב</translation>
 <translation id="8041940743680923270">השתמש בברירת המחדל הכללית (שאל)</translation>
 <translation id="8088680233425245692">הצגת הפריט נכשלה.</translation>
-<translation id="8089520772729574115">‏פחות מ-‎1 MB</translation>
 <translation id="8091372947890762290">ההפעלה ממתינה בשרת</translation>
 <translation id="8118489163946903409">אמצעי תשלום</translation>
 <translation id="8131740175452115882">אישור</translation>
diff --git a/components/strings/components_strings_ja.xtb b/components/strings/components_strings_ja.xtb
index 4345b03..e6e2a4f4 100644
--- a/components/strings/components_strings_ja.xtb
+++ b/components/strings/components_strings_ja.xtb
@@ -220,7 +220,6 @@
 <translation id="2826760142808435982">接続は <ph name="CIPHER" /> を使用して暗号化および認証されており、<ph name="KX" /> が鍵交換メカニズムとして使用されています。</translation>
 <translation id="2835170189407361413">フォームをクリア</translation>
 <translation id="2889159643044928134">再読み込みを中止</translation>
-<translation id="2900469785430194048">このウェブページを表示しようとしましたが、Google Chrome のメモリが不足しています。</translation>
 <translation id="2909946352844186028">ネットワークの変更が検出されました。</translation>
 <translation id="2916038427272391327">他のプログラムを終了する</translation>
 <translation id="2922350208395188000">サーバーの証明書を確認できません。</translation>
@@ -243,7 +242,6 @@
 <translation id="3024663005179499861">ポリシー タイプが間違っています</translation>
 <translation id="3032412215588512954">このサイトを再読み込みしますか?</translation>
 <translation id="3037605927509011580">エラー</translation>
-<translation id="3040955737384246924">{COUNT,plural, =0{同期デバイスで 1 件以上のアイテム}=1{1 件のアイテム(同期デバイスではそれ以上のアイテム)}other{# 件のアイテム(同期デバイスではそれ以上のアイテム)}}</translation>
 <translation id="3041612393474885105">証明書情報</translation>
 <translation id="3063697135517575841">Chrome でカードを確認できませんでした。しばらくしてからもう一度お試しください。</translation>
 <translation id="3064966200440839136">外部アプリケーションを経由したお支払いの処理に進むため、シークレット モードを解除します。続行しますか?</translation>
@@ -337,7 +335,6 @@
 <translation id="3681007416295224113">証明書情報</translation>
 <translation id="3690164694835360974">ログイン情報は保護されません</translation>
 <translation id="3693415264595406141">パスワード:</translation>
-<translation id="3696411085566228381">なし</translation>
 <translation id="3704609568417268905"><ph name="TIME" />、<ph name="TITLE" />(<ph name="DOMAIN" />)を<ph name="BOOKMARKED" /></translation>
 <translation id="370665806235115550">読み込んでいます...</translation>
 <translation id="3712624925041724820">ライセンスを使い切りました</translation>
@@ -385,7 +382,6 @@
 <translation id="4171400957073367226">確認用の署名に問題があります</translation>
 <translation id="4196861286325780578">移動のやり直し(&amp;R)</translation>
 <translation id="4203896806696719780"><ph name="BEGIN_LINK" />ファイアウォールとウイルス対策の設定を確認する<ph name="END_LINK" /></translation>
-<translation id="4206349416402437184">{COUNT,plural, =0{なし}=1{1 個のアプリ($1)}=2{2 個のアプリ($1、$2)}other{# 個のアプリ($1、$2、$3)}}</translation>
 <translation id="4220128509585149162">クラッシュ</translation>
 <translation id="4226937834893929579"><ph name="BEGIN_LINK" />ネットワーク診断ツールを実行してみてください<ph name="END_LINK" />。</translation>
 <translation id="4250431568374086873">このサイトへの接続は完全には保護されていません</translation>
@@ -469,7 +465,6 @@
 <translation id="5045550434625856497">パスワードが正しくありません</translation>
 <translation id="5056549851600133418">おすすめの記事</translation>
 <translation id="5070335125961472645"><ph name="BEGIN_LINK" />プロキシ アドレスを確認する<ph name="END_LINK" /></translation>
-<translation id="5076731569460970710">{COUNT,plural, =0{Cookie は使用されていません。}=1{1 件のサイトで Cookie が使用されています。}other{# 件のサイトで Cookie が使用されています。}}</translation>
 <translation id="5087286274860437796">サーバーの証明書が現在有効ではありません。</translation>
 <translation id="5087580092889165836">カードを追加</translation>
 <translation id="5089810972385038852">都道府県 / 州</translation>
@@ -601,7 +596,6 @@
 <translation id="6358450015545214790">ヘルプ</translation>
 <translation id="6386120369904791316">{COUNT,plural, =1{他 1 件の候補}other{他 # 件の候補}}</translation>
 <translation id="6387478394221739770">Chrome の新しい機能に関心をお持ちでしたら、chrome.com/beta から Beta チャンネルをお試しください。</translation>
-<translation id="6389758589412724634">このウェブページを表示しようとしましたが、Chromium のメモリが不足しています。</translation>
 <translation id="6404511346730675251">ブックマークを編集</translation>
 <translation id="6410264514553301377"><ph name="CREDIT_CARD" /> の有効期限と CVC を入力</translation>
 <translation id="6414888972213066896">このサイトを開いてもよいかの問い合わせを保護者に送信しました</translation>
@@ -624,7 +618,6 @@
 <translation id="6556915248009097796">有効期限: <ph name="EXPIRATION_DATE_ABBR" />、最終使用日: <ph name="LAST_USED_DATE_NO_DETAIL" /></translation>
 <translation id="6563469144985748109">管理者がまだサイトを開くことを許可していません</translation>
 <translation id="6569060085658103619">拡張機能のページを表示しています</translation>
-<translation id="6593753688552673085"><ph name="UPPER_ESTIMATE" /> 未満</translation>
 <translation id="6596325263575161958">暗号化オプション</translation>
 <translation id="662080504995468778">とどまる</translation>
 <translation id="6626291197371920147">有効なカード番号を追加</translation>
@@ -636,7 +629,6 @@
 <translation id="6710594484020273272">&lt;検索キーワードを入力&gt;</translation>
 <translation id="6711464428925977395">プロキシ サーバーに問題がある、またはアドレスが正しくありません。</translation>
 <translation id="6727102863431372879">設定</translation>
-<translation id="6731320287533051140">{COUNT,plural, =0{なし}=1{1 件のアイテム}other{# 件のアイテム}}</translation>
 <translation id="674375294223700098">不明なサーバー証明書エラー</translation>
 <translation id="6753269504797312559">ポリシーの値</translation>
 <translation id="6757797048963528358">デバイスがスリープ状態です。</translation>
@@ -742,6 +734,7 @@
 <translation id="7669271284792375604">このサイトを利用すると、悪意のあるユーザーによって、閲覧時のエクスペリエンスを損なうプログラム(ホームページを改ざんする、アクセス先のサイトに追加の広告を表示するなどのプログラム)をインストールするよう誘導される可能性があります。</translation>
 <translation id="7674629440242451245">Chrome の新しい機能に関心をお持ちでしたら、chrome.com/dev から Dev チャンネルをお試しください。</translation>
 <translation id="7682287625158474539">発送先</translation>
+<translation id="7701040980221191251">なし</translation>
 <translation id="7704050614460855821"><ph name="BEGIN_LINK" /><ph name="SITE" /> にアクセスする(安全ではありません)<ph name="END_LINK" /></translation>
 <translation id="7714464543167945231">証明書</translation>
 <translation id="7716424297397655342">このサイトをキャッシュから読み込むことができません</translation>
@@ -781,7 +774,6 @@
 <translation id="8041089156583427627">フィードバックを送信</translation>
 <translation id="8041940743680923270">グローバルのデフォルト値([確認])を使用</translation>
 <translation id="8088680233425245692">記事を表示できませんでした。</translation>
-<translation id="8089520772729574115">1 MB 未満</translation>
 <translation id="8091372947890762290">サーバーで有効化が保留になっています</translation>
 <translation id="8118489163946903409">お支払い方法</translation>
 <translation id="8131740175452115882">確認</translation>
diff --git a/components/strings/components_strings_kn.xtb b/components/strings/components_strings_kn.xtb
index 5926905..01c0999 100644
--- a/components/strings/components_strings_kn.xtb
+++ b/components/strings/components_strings_kn.xtb
@@ -220,10 +220,10 @@
 <translation id="2826760142808435982"><ph name="CIPHER" /> ಬಳಸಿಕೊಂಡು ಸಂಪರ್ಕವನ್ನು ಎನ್‌ಕ್ರಿಪ್ಟ್ ಮಾಡಲಾಗಿದೆ ಮತ್ತು ದೃಢೀಕರಿಸಲಾಗಿದೆ ಮತ್ತು <ph name="KX" /> ಅನ್ನು ಕೀ ವಿನಿಮಯ ಯಾಂತ್ರಿಕತೆಯಂತೆ ಬಳಸುತ್ತದೆ.</translation>
 <translation id="2835170189407361413">ಫಾರ್ಮ್ ತೆರವುಗೊಳಿಸು</translation>
 <translation id="2889159643044928134">ಮರುಲೋಡ್ ಮಾಡಬೇಡ</translation>
-<translation id="2900469785430194048">ಈ ವೆಬ್‌ಪುಟ ಪ್ರದರ್ಶಿಸಲು ಪ್ರಯತ್ನಿಸುವಾಗ Google Chrome ಮೆಮೊರಿ ಖಾಲಿಯಾಗಿದೆ.</translation>
 <translation id="2909946352844186028">ನೆಟ್‌ವರ್ಕ್ ಬದಲಾವಣೆಯನ್ನು ಪತ್ತೆ ಮಾಡಲಾಗಿದೆ.</translation>
 <translation id="2916038427272391327">ಇತರ ಪ್ರೋಗ್ರಾಂಗಳನ್ನು ಮುಚ್ಚಿ</translation>
 <translation id="2922350208395188000">ಸರ್ವರ್‌ನ ಪ್ರಮಾಣಪತ್ರವನ್ನು ಪರಿಶೀಲಿಸಲಾಗುವುದಿಲ್ಲ.</translation>
+<translation id="2928905813689894207">ಬಿಲ್ಲಿಂಗ್ ವಿಳಾಸ</translation>
 <translation id="2941952326391522266">ಈ ಸರ್ವರ್ <ph name="DOMAIN" /> ಆಗಿದೆ ಎಂಬುದನ್ನು ಸಾಬೀತುಪಡಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ; ಅದರ ಸುರಕ್ಷತಾ ಪ್ರಮಾಣಪತ್ರವು <ph name="DOMAIN2" /> ದಿಂದ ಆಗಿದೆ. ಇದು ತಪ್ಪು ಕಾನ್ಫಿಗರೇಶನ್‌ನಿಂದ ಅಥವಾ ಆಕ್ರಮಣಕಾರರು ನಿಮ್ಮ ಸಂಪರ್ಕದಲ್ಲಿ ಒಳನುಸುಳಿರುವುದರಿಂದ ಆಗಿರಬಹುದು.</translation>
 <translation id="2948083400971632585">ಸಂಪರ್ಕಕ್ಕಾಗಿ ಕಾನ್ಫಿಗರ್ ಮಾಡಲಾಗಿರುವ ಯಾವುದೇ ಪ್ರಾಕ್ಸಿಗಳನ್ನು ನೀವು ಸೆಟ್ಟಿಂಗ್‌ಗಳ ಪುಟದಿಂದ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಬಹುದು.</translation>
 <translation id="2955913368246107853">ಹುಡುಕಿ ಬಾರ್ ಅನ್ನು ಮುಚ್ಚಿ</translation>
@@ -238,10 +238,10 @@
 <translation id="3005723025932146533">ಉಳಿಸಲಾದ ನಕಲನ್ನು ತೋರಿಸು</translation>
 <translation id="3008447029300691911"><ph name="CREDIT_CARD" /> ಗೆ CVC ಅನ್ನು ನಮೂದಿಸಿ. ನೀವು ಒಮ್ಮೆ ಖಚಿತಪಡಿಸಿದರೆ, ನಿಮ್ಮ ಕಾರ್ಡ್ ವಿವರಗಳನ್ನು ಈ ಸೈಟ್ ಜೊತೆಗೆ ಹಂಚಿಕೊಳ್ಳಲಾಗುತ್ತದೆ.</translation>
 <translation id="3010559122411665027">ಪಟ್ಟಿ ನಮೂದು "<ph name="ENTRY_INDEX" />": <ph name="ERROR" /></translation>
+<translation id="301521992641321250">ಸ್ವಯಂಚಾಲಿತವಾಗಿ ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ</translation>
 <translation id="3024663005179499861">ತಪ್ಪಾದ ನೀತಿಯ ಪ್ರಕಾರ</translation>
 <translation id="3032412215588512954">ನೀವು ಈ ಸೈಟ್ ಮರುಲೋಡ್ ಮಾಡಲು ಬಯಸುವಿರಾ?</translation>
 <translation id="3037605927509011580">ಓಹ್, ಹೋಯ್ತು!</translation>
-<translation id="3040955737384246924">{COUNT,plural, =0{ಸಿಂಕ್ ಮಾಡಿದ ಸಾಧನಗಳಲ್ಲಿ ಕನಿಷ್ಟ 1 ಐಟಂ}=1{1 ಐಟಂ (ಮತ್ತು ಸಿಂಕ್ ಮಾಡಿದ ಸಾಧನಗಳಲ್ಲಿ ಇನ್ನಷ್ಟು)}one{# ಐಟಂಗಳು (ಮತ್ತು ಸಿಂಕ್ ಮಾಡಿದ ಸಾಧನಗಳಲ್ಲಿ ಇನ್ನಷ್ಟು)}other{# ಐಟಂಗಳು (ಮತ್ತು ಸಿಂಕ್ ಮಾಡಿದ ಸಾಧನಗಳಲ್ಲಿ ಇನ್ನಷ್ಟು)}}</translation>
 <translation id="3041612393474885105">ಪ್ರಮಾಣಪತ್ರ ಮಾಹಿತಿ</translation>
 <translation id="3063697135517575841">ಈ ಸಮಯದಲ್ಲಿ Chrome ಗೆ ನಿಮ್ಮ ಕಾರ್ಡ್ ಅನ್ನು ಖಚಿತಪಡಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ. ದಯವಿಟ್ಟು ನಂತರ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ.</translation>
 <translation id="3064966200440839136">ಬಾಹ್ಯ ಅಪ್ಲಿಕೇಶನ್‌‌ ಮೂಲಕರ ಪಾವತಿಸಲು ಅದೃಶ್ಯ ಮೋಡ್‌‌ ತೊರೆಯಲಾಗುತ್ತಿದೆ. ಮುಂದುವರಿಸುವುದೇ?</translation>
@@ -332,7 +332,6 @@
 <translation id="3681007416295224113">ಪ್ರಮಾಣಪತ್ರ ಮಾಹಿತಿ</translation>
 <translation id="3690164694835360974">ಲಾಗಿನ್ ಸುರಕ್ಷಿತವಾಗಿಲ್ಲ</translation>
 <translation id="3693415264595406141">ಪಾಸ್‌ವರ್ಡ್:</translation>
-<translation id="3696411085566228381">ಯಾವುದೂ ಇಲ್ಲ</translation>
 <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation>
 <translation id="370665806235115550">ಲೋಡ್ ಆಗುತ್ತಿದೆ...</translation>
 <translation id="3712624925041724820">ಪರವಾನಗಿಗಳು ಬರಿದಾಗಿವೆ</translation>
@@ -380,7 +379,6 @@
 <translation id="4171400957073367226">ತಪ್ಪು ಪರಿಶೀಲನೆ ಸಹಿ</translation>
 <translation id="4196861286325780578">&amp;ಸರಿಸುವುದನ್ನು ಮತ್ತೆಮಾಡು</translation>
 <translation id="4203896806696719780"><ph name="BEGIN_LINK" />ಫೈರ್‌ವಾಲ್ ಮತ್ತು ಆಂಟಿವೈರಸ್ ಕಾನ್ಫಿಗರೇಶನ್‌‌ಗಳನ್ನು ಪರಿಶೀಲಿಸಲಾಗುತ್ತಿದೆ<ph name="END_LINK" /></translation>
-<translation id="4206349416402437184">{COUNT,plural, =0{ಯಾವುದೂ ಇಲ್ಲ}=1{1 ಅಪ್ಲಿಕೇಶನ್‌ ($1)}=2{2 ಅಪ್ಲಿಕೇಶನ್‌ಗಳು ($1, $2)}one{# ಅಪ್ಲಿಕೇಶನ್‌ಗಳು ($1, $2, $3)}other{# ಅಪ್ಲಿಕೇಶನ್‌ಗಳು ($1, $2, $3)}}</translation>
 <translation id="4220128509585149162">ವಿಫಲತೆಗಳು</translation>
 <translation id="4226937834893929579"><ph name="BEGIN_LINK" />ನೆಟ್‌ವರ್ಕ್ ಡಯಾಗ್ನಾಸ್ಟಿಕ್ಸ್‌ ರನ್ ಮಾಡಲು ಪ್ರಯತ್ನಿಸಿ<ph name="END_LINK" />.</translation>
 <translation id="4250431568374086873">ಈ ಸೈಟ್‌ಗೆ ನಿಮ್ಮ ಸಂಪರ್ಕವು ಸಂಪೂರ್ಣವಾಗಿ ಸುರಕ್ಷಿತವಾಗಿಲ್ಲ</translation>
@@ -464,7 +462,6 @@
 <translation id="5045550434625856497">ತಪ್ಪು ಪಾಸ್‌ವರ್ಡ್</translation>
 <translation id="5056549851600133418">ನಿಮಗಾಗಿ ಲೇಖನಗಳು</translation>
 <translation id="5070335125961472645"><ph name="BEGIN_LINK" />ಪ್ರಾಕ್ಸಿ ವಿಳಾಸವನ್ನು ಪರಿಶೀಲಿಸಲಾಗುತ್ತಿದೆ<ph name="END_LINK" /></translation>
-<translation id="5076731569460970710">{COUNT,plural, =0{ಯಾವುದೇ ಕುಕೀಗಳಿಲ್ಲ}=1{1 ಸೈಟ್ ಕುಕೀಗಳನ್ನು ಬಳಸುತ್ತದೆ. }one{# ಸೈಟ್‌ಗಳು ಕುಕೀಗಳನ್ನು ಬಳಸುತ್ತವೆ. }other{# ಸೈಟ್‌ಗಳು ಕುಕೀಗಳನ್ನು ಬಳಸುತ್ತವೆ. }}</translation>
 <translation id="5087286274860437796">ಈ ಸಮಯದಲ್ಲಿ ಸರ್ವರ್‌ನ ಪ್ರಮಾಣಪತ್ರ ಮಾನ್ಯವಾಗಿಲ್ಲ.</translation>
 <translation id="5087580092889165836">ಕಾರ್ಡ್ ಸೇರಿಸಿ</translation>
 <translation id="5089810972385038852">ರಾಜ್ಯ</translation>
@@ -570,6 +567,7 @@
 <translation id="6165508094623778733">ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ</translation>
 <translation id="6169916984152623906">ನೀವೀಗ ಖಾಸಗಿಯಾಗಿ ಬ್ರೌಸ್ ಮಾಡಬಹುದು. ಈ ಸಾಧನವನ್ನು ಬಳಸುವ ಬೇರೆ ಯಾರಿಗೂ ನಿಮ್ಮ ಚಟುವಟಿಕೆ ಕಾಣಿಸುವುದಿಲ್ಲ. ಆದರೂ, ಡೌನ್‌ಲೋಡ್‌ಗಳು ಮತ್ತು ಬುಕ್‌ಮಾರ್ಕ್‌ಗಳು ಉಳಿದಿರುತ್ತವೆ.</translation>
 <translation id="6177128806592000436">ಈ ಸೈಟ್‌ಗೆ ನಿಮ್ಮ ಸಂಪರ್ಕವು ಸುರಕ್ಷಿತವಾಗಿಲ್ಲ</translation>
+<translation id="6184817833369986695">(ಸಂಘ: <ph name="UPDATE_COHORT_NAME" />)</translation>
 <translation id="6203231073485539293">ನಿಮ್ಮ ಇಂಟರ್ನೆಟ್ ಸಂಪರ್ಕವನ್ನು ಪರಿಶೀಲಿಸಿ</translation>
 <translation id="6218753634732582820">Chromium ನಿಂದ ವಿಳಾಸವನ್ನು ತೆಗೆದುಹಾಕುವುದೇ?</translation>
 <translation id="6221345481584921695">Google ಸುರಕ್ಷಿತ ಬ್ರೌಸಿಂಗ್ ಇತ್ತೀಚೆಗೆ <ph name="SITE" /> ನಲ್ಲಿ <ph name="BEGIN_LINK" />ಮಾಲ್‌ವೇರ್ ಪತ್ತೆಹಚ್ಚಿದೆ<ph name="END_LINK" />. ಸಾಮಾನ್ಯವಾಗಿ ಸುರಕ್ಷಿತವಾಗಿರುವ ವೆಬ್‌ಸೈಟ್‌ಗಳು ಕೆಲವೊಮ್ಮೆ ಮಾಲ್‌ವೇರ್ ಸೋಂಕಿಗೆ ತುತ್ತಾಗಿರುತ್ತವೆ. ದುರುದ್ದೇಶಪೂರಿತ ಸಂಗತಿಗಳು ಮಾಲ್‌ವೇರ್ ವಿತರಕರಾದ <ph name="SUBRESOURCE_HOST" /> ರಿಂದ ಬರುತ್ತವೆ.</translation>
@@ -594,7 +592,6 @@
 <translation id="6358450015545214790">ಇವುಗಳ ಅರ್ಥವೇನು?</translation>
 <translation id="6386120369904791316">{COUNT,plural, =1{1 ಇತರ ಸಲಹೆ}one{# ಇತರ ಸಲಹೆಗಳು}other{# ಇತರ ಸಲಹೆಗಳು}}</translation>
 <translation id="6387478394221739770">ಉತ್ತಮವಾದ ಹೊಸ Chrome ವೈಶಿಷ್ಟ್ಯಗಳಲ್ಲಿ ಆಸಕ್ತಿ ಇದೆಯೇ? chrome.com/beta ನಲ್ಲಿ ನಮ್ಮ ಬೀಟಾ ಚಾನಲ್ ಪ್ರಯತ್ನಿಸಿ.</translation>
-<translation id="6389758589412724634">ಈ ವೆಬ್‌ಪುಟ ಪ್ರದರ್ಶಿಸಲು ಪ್ರಯತ್ನಿಸುವಾಗ Chromium ಮೆಮೊರಿ ಖಾಲಿಯಾಗಿದೆ.</translation>
 <translation id="6404511346730675251">ಬುಕ್‌ಮಾರ್ಕ್‌ಗಳನ್ನು ಎಡಿಟ್ ಮಾಡಿ</translation>
 <translation id="6410264514553301377"><ph name="CREDIT_CARD" /> ಗೆ ಮುಕ್ತಾಯ ದಿನಾಂಕ ಮತ್ತು ಸಿವಿಸಿ ಅನ್ನು ನಮೂದಿಸಿ</translation>
 <translation id="6414888972213066896">ಈ ಸೈಟ್‌ಗೆ ಭೇಟಿ ನೀಡುವುದು ಸರಿಯೇ ಎಂದು ನೀವು ನಿಮ್ಮ ಪೋಷಕರನ್ನು ಕೇಳಿರುವಿರಿ</translation>
@@ -617,7 +614,6 @@
 <translation id="6556915248009097796">ಅವಧಿ ಮೀರುವ ಸಮಯ: <ph name="EXPIRATION_DATE_ABBR" />, <ph name="LAST_USED_DATE_NO_DETAIL" /> ಅಂತಿಮವಾಗಿ ಬಳಸಲಾಗಿದೆ</translation>
 <translation id="6563469144985748109">ನಿಮ್ಮ ಮ್ಯಾನೇಜರ್ ಇನ್ನೂ ಇದನ್ನು ಅಂಗೀಕರಿಸಿಲ್ಲ</translation>
 <translation id="6569060085658103619">ನೀವು ವಿಸ್ತರಣೆ ಪುಟವನ್ನು ವೀಕ್ಷಿಸುತ್ತಿರುವಿರಿ</translation>
-<translation id="6593753688552673085"><ph name="UPPER_ESTIMATE" /> ಗಿಂತ ಕಡಿಮೆ</translation>
 <translation id="6596325263575161958">ಎನ್‌ಕ್ರಿಫ್ಶನ್ ಆಯ್ಕೆಗಳು</translation>
 <translation id="662080504995468778">ಉಳಿಯಿರಿ</translation>
 <translation id="6626291197371920147">ಮಾನ್ಯವಾದ ಕಾರ್ಡ್ ಸಂಖ್ಯೆಯನ್ನು ಸೇರಿಸಿ</translation>
@@ -629,7 +625,6 @@
 <translation id="6710594484020273272">&lt;ಹುಡುಕಾಟದ ಪದ ಟೈಪ್ ಮಾಡಿ&gt;</translation>
 <translation id="6711464428925977395">ಪ್ರಾಕ್ಸಿ ಸರ್ವರ್‌‌ನಲ್ಲಿ ಏನೋ ದೋಷವಿದೆ ಅಥವಾ ವಿಳಾಸವು ತಪ್ಪಾಗಿದೆ.</translation>
 <translation id="6727102863431372879">ಹೊಂದಿಸು</translation>
-<translation id="6731320287533051140">{COUNT,plural, =0{ಯಾವುದೂ ಇಲ್ಲ}=1{1 ಐಟಂ}one{# ಐಟಂಗಳು}other{# ಐಟಂಗಳು}}</translation>
 <translation id="674375294223700098">ಅಪರಿಚಿತ ಸರ್ವರ್ ಪ್ರಮಾಣಪತ್ರ ದೋಷ.</translation>
 <translation id="6753269504797312559">ನೀತಿ ಮೌಲ್ಯ</translation>
 <translation id="6757797048963528358">ನಿಮ್ಮ ಸಾಧನವು ನಿದ್ರಾವಸ್ಥೆಗೆ ಹೋಗಿದೆ.</translation>
@@ -672,6 +667,7 @@
 <translation id="7180611975245234373">ರೀಫ್ರೆಶ್ ಮಾಡಿ</translation>
 <translation id="7182878459783632708">ಯಾವುದೇ ನೀತಿಗಳನ್ನು ಹೊಂದಿಸಿಲ್ಲ</translation>
 <translation id="7186367841673660872">ಈ ಪುಟವನ್ನು<ph name="ORIGINAL_LANGUAGE" />ನಿಂದ<ph name="LANGUAGE_LANGUAGE" />ಗೆ ಭಾಷಾಂತರಿಸಲಾಗಿದೆ</translation>
+<translation id="7192203810768312527"><ph name="SIZE" /> ತೆಗೆದುಹಾಕಿ. ನಿಮ್ಮ ನಂತರದ ಭೇಟಿಯ ಸಮಯದಲ್ಲಿ ಕೆಲವು ಸೈಟ್‌ಗಳು ನಿಧಾನವಾಗಿ ಲೋಡ್ ಆಗಬಹುದು.</translation>
 <translation id="719464814642662924">ವೀಸಾ</translation>
 <translation id="7210863904660874423"><ph name="HOST_NAME" /> ಭದ್ರತೆ ಮಾನದಂಡಗಳನ್ನು ಅನುಸರಿಸುತ್ತಿಲ್ಲ.</translation>
 <translation id="721197778055552897">ಈ ತೊಂದರೆಯ ಬಗ್ಗೆ <ph name="BEGIN_LINK" />ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ<ph name="END_LINK" />.</translation>
@@ -734,6 +730,7 @@
 <translation id="7669271284792375604">ನಿಮ್ಮ ಬ್ರೌಸಿಂಗ್‌ ಅನುಭವವನ್ನು ಹಾನಿಮಾಡಲು ಸ್ಥಾಪಿಸಲಾಗುವ ಪ್ರೋಗ್ರಾಂಗಳಲ್ಲಿ ನಿಮ್ಮನ್ನು ವಂಚಿಸಲು ಆಕ್ರಮಣಕಾರರು ಈ ಸೈಟ್‌ ಮೇಲೆ ದಾಳಿ ಮಾಡಬಹುದು (ಉದಾಹರಣೆಗೆ, ನಿಮ್ಮ ಮುಖಪುಟವನ್ನು ಬದಲಾಯಿಸಲಾಗುತ್ತದೆ ಅಥವಾ ನೀವು ಭೇಟಿ ನೀಡುವ ಸೈಟ್‌ಗಳಲ್ಲಿ ಹೆಚ್ಚಿನ ಜಾಹೀರಾತುಗಳನ್ನು ತೋರಿಸಲಾಗುತ್ತದೆ).</translation>
 <translation id="7674629440242451245">ಉತ್ತಮವಾದ ಹೊಸ Chrome ವೈಶಿಷ್ಟ್ಯಗಳಲ್ಲಿ ಆಸಕ್ತಿ ಇದೆಯೇ? chrome.com/dev ನಲ್ಲಿ ನಮ್ಮ dev ಚಾನಲ್ ಪ್ರಯತ್ನಿಸಿ.</translation>
 <translation id="7682287625158474539">ಶಿಪ್ಪಿಂಗ್</translation>
+<translation id="7701040980221191251">ಯಾವುದೂ ಇಲ್ಲ</translation>
 <translation id="7704050614460855821"><ph name="BEGIN_LINK" /><ph name="SITE" /> ಗೆ (ಅಸುರಕ್ಷಿತ) ಮುಂದುವರೆಸು<ph name="END_LINK" /></translation>
 <translation id="7714464543167945231">ಪ್ರಮಾಣಪತ್ರ</translation>
 <translation id="7716424297397655342">ಸಂಗ್ರಹದಿಂದ ಈ ಸೈಟ್ ಲೋಡ್ ಮಾಡಲಾಗುವುದಿಲ್ಲ</translation>
@@ -773,7 +770,6 @@
 <translation id="8041089156583427627">ಪ್ರತಿಕ್ರಿಯೆ ಕಳುಹಿಸಿ</translation>
 <translation id="8041940743680923270">ಜಾಗತಿಕ ಡಿಫಾಲ್ಟ್ ಬಳಸಿ (ಕೇಳಿ)</translation>
 <translation id="8088680233425245692">ಲೇಖನವನ್ನು ವೀಕ್ಷಿಸಲು ವಿಫಲವಾಗಿದೆ.</translation>
-<translation id="8089520772729574115">1 MB ಗಿಂತ ಕಡಿಮೆ</translation>
 <translation id="8091372947890762290">ಸರ್ವರ್‌ನಲ್ಲಿ ಸಕ್ರಿಯತೆ ಬಾಕಿ ಉಳಿದಿದೆ</translation>
 <translation id="8118489163946903409">ಪಾವತಿ ವಿಧಾನ</translation>
 <translation id="8131740175452115882">ದೃಢೀಕರಿಸು</translation>
diff --git a/components/strings/components_strings_ko.xtb b/components/strings/components_strings_ko.xtb
index 502dbee..b637ffc2 100644
--- a/components/strings/components_strings_ko.xtb
+++ b/components/strings/components_strings_ko.xtb
@@ -220,7 +220,6 @@
 <translation id="2826760142808435982">이 연결은 <ph name="CIPHER" />을(를) 사용하여 암호화되고 인증되며 <ph name="KX" />을(를) 키 교환 매커니즘으로 사용합니다.</translation>
 <translation id="2835170189407361413">서식 지우기</translation>
 <translation id="2889159643044928134">새로고침 안함</translation>
-<translation id="2900469785430194048">이 웹페이지를 표시하려고 했으나 Chrome 메모리가 부족합니다.</translation>
 <translation id="2909946352844186028">네트워크 변경이 감지되었습니다.</translation>
 <translation id="2916038427272391327">다른 프로그램 닫기</translation>
 <translation id="2922350208395188000">서버 인증서를 확인할 수 없습니다.</translation>
@@ -243,7 +242,6 @@
 <translation id="3024663005179499861">잘못된 정책 유형</translation>
 <translation id="3032412215588512954">이 사이트를 새로고침하시겠습니까?</translation>
 <translation id="3037605927509011580">앗, 이런!</translation>
-<translation id="3040955737384246924">{COUNT,plural, =0{동기화된 기기에 최소 1개}=1{1개(동기화된 기기에는 그 이상)}other{#개(동기화된 기기에는 그 이상)}}</translation>
 <translation id="3041612393474885105">인증서 정보</translation>
 <translation id="3063697135517575841">현재 Chrome에서 카드를 확인할 수 없습니다. 나중에 다시 시도해 주세요.</translation>
 <translation id="3064966200440839136">시크릿 모드를 종료하고 외부 애플리케이션에서 결제합니다. 계속하시겠습니까?</translation>
@@ -337,7 +335,6 @@
 <translation id="3681007416295224113">인증서 정보</translation>
 <translation id="3690164694835360974">로그인이 안전하지 않음</translation>
 <translation id="3693415264595406141">비밀번호:</translation>
-<translation id="3696411085566228381">없음</translation>
 <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation>
 <translation id="370665806235115550">로드 중...</translation>
 <translation id="3712624925041724820">라이선스 만료됨</translation>
@@ -385,7 +382,6 @@
 <translation id="4171400957073367226">잘못된 인증 서명입니다.</translation>
 <translation id="4196861286325780578">이동 다시 실행(&amp;R)</translation>
 <translation id="4203896806696719780"><ph name="BEGIN_LINK" />방화벽 및 바이러스 백신 소프트웨어 설정 확인<ph name="END_LINK" /></translation>
-<translation id="4206349416402437184">{COUNT,plural, =0{없음}=1{앱 1개($1)}=2{앱 2개($1, $2)}other{앱 #개($1, $2, $3)}}</translation>
 <translation id="4220128509585149162">비정상 종료</translation>
 <translation id="4226937834893929579"><ph name="BEGIN_LINK" />네트워크 진단 프로그램을 실행<ph name="END_LINK" />해 보세요.</translation>
 <translation id="4250431568374086873">이 사이트에 대한 연결은 완벽하게 보안이 되지 않습니다.</translation>
@@ -469,7 +465,6 @@
 <translation id="5045550434625856497">비밀번호가 잘못되었습니다.</translation>
 <translation id="5056549851600133418">추천 도움말</translation>
 <translation id="5070335125961472645"><ph name="BEGIN_LINK" />프록시 주소 확인<ph name="END_LINK" /></translation>
-<translation id="5076731569460970710">{COUNT,plural, =0{쿠키를 사용하는 사이트 없음}=1{사이트 1개에서 쿠키를 사용합니다. }other{사이트 #개에서 쿠키를 사용합니다. }}</translation>
 <translation id="5087286274860437796">서버의 인증서가 현재 유효하지 않습니다.</translation>
 <translation id="5087580092889165836">카드 추가</translation>
 <translation id="5089810972385038852">주</translation>
@@ -601,7 +596,6 @@
 <translation id="6358450015545214790">자세히 알아보기</translation>
 <translation id="6386120369904791316">{COUNT,plural, =1{그 외 제안 1건}other{그 외 제안 #건}}</translation>
 <translation id="6387478394221739770">Chrome의 멋진 새 기능에 관심이 있으십니까? chrome.com/beta 페이지에서 베타 채널을 방문해 보세요.</translation>
-<translation id="6389758589412724634">이 웹페이지를 표시하려고 했으나 Chromium 메모리가 부족합니다.</translation>
 <translation id="6404511346730675251">북마크 수정</translation>
 <translation id="6410264514553301377"><ph name="CREDIT_CARD" />의 만료일과 CVC를 입력하세요.</translation>
 <translation id="6414888972213066896">이 사이트를 방문해도 괜찮은지 부모님께 문의했습니다.</translation>
@@ -624,7 +618,6 @@
 <translation id="6556915248009097796">만료: <ph name="EXPIRATION_DATE_ABBR" />, 마지막 사용일: <ph name="LAST_USED_DATE_NO_DETAIL" /></translation>
 <translation id="6563469144985748109">관리자가 아직 승인하지 않았습니다.</translation>
 <translation id="6569060085658103619">확장 프로그램 페이지를 보는 중</translation>
-<translation id="6593753688552673085"><ph name="UPPER_ESTIMATE" /> 미만</translation>
 <translation id="6596325263575161958">암호화 옵션</translation>
 <translation id="662080504995468778">머무르기</translation>
 <translation id="6626291197371920147">유효한 카드 번호 추가</translation>
@@ -636,7 +629,6 @@
 <translation id="6710594484020273272">&lt;검색어 입력&gt;</translation>
 <translation id="6711464428925977395">프록시 서버에 문제가 발생했거나 주소가 잘못되었습니다.</translation>
 <translation id="6727102863431372879">설정</translation>
-<translation id="6731320287533051140">{COUNT,plural, =0{없음}=1{항목 1개}other{항목 #개}}</translation>
 <translation id="674375294223700098">알 수 없는 서버 인증서 오류입니다.</translation>
 <translation id="6753269504797312559">정책 값</translation>
 <translation id="6757797048963528358">기기가 절전 모드 상태입니다.</translation>
@@ -742,6 +734,7 @@
 <translation id="7669271284792375604">이 사이트의 공격자가 인터넷 사용 환경에 악영향을 미치는 프로그램을 설치하도록 속임수(예를 들어, 방문하는 사이트의 홈페이지를 변경하거나 추가로 광고를 표시)를 시도할 수 있습니다.</translation>
 <translation id="7674629440242451245">Chrome의 멋진 새 기능에 관심이 있으십니까? chrome.com/dev 페이지에서 개발자 채널에 방문해 보세요.</translation>
 <translation id="7682287625158474539">배송</translation>
+<translation id="7701040980221191251">없음</translation>
 <translation id="7704050614460855821"><ph name="BEGIN_LINK" /><ph name="SITE" />(안전하지 않음)<ph name="END_LINK" />(으)로 이동</translation>
 <translation id="7714464543167945231">인증서</translation>
 <translation id="7716424297397655342">이 사이트를 캐시에서 로드할 수 없음</translation>
@@ -781,7 +774,6 @@
 <translation id="8041089156583427627">의견 보내기</translation>
 <translation id="8041940743680923270">전체 기본값 사용(요청)</translation>
 <translation id="8088680233425245692">글을 조회하지 못했습니다.</translation>
-<translation id="8089520772729574115">1MB 미만</translation>
 <translation id="8091372947890762290">활성화 요청이 서버에서 대기 중</translation>
 <translation id="8118489163946903409">결제 수단</translation>
 <translation id="8131740175452115882">확인</translation>
diff --git a/components/strings/components_strings_lt.xtb b/components/strings/components_strings_lt.xtb
index a035091..d5fa286 100644
--- a/components/strings/components_strings_lt.xtb
+++ b/components/strings/components_strings_lt.xtb
@@ -220,7 +220,6 @@
 <translation id="2826760142808435982">Ryšys užšifruotas ir tapatybė nustatyta naudojant <ph name="CIPHER" />. <ph name="KX" /> naudojamas kaip pagrindinis mainų mechanizmas.</translation>
 <translation id="2835170189407361413">Valyti formą</translation>
 <translation id="2889159643044928134">Neįkelti iš naujo</translation>
-<translation id="2900469785430194048">„Google Chrome“ trūksta atminties šiam tinklalapiui pateikti.</translation>
 <translation id="2909946352844186028">Aptiktas tinklo pasikeitimas.</translation>
 <translation id="2916038427272391327">Uždarykite kitas programas</translation>
 <translation id="2922350208395188000">Neįmanoma patikrinti serverio sertifikato.</translation>
@@ -243,7 +242,6 @@
 <translation id="3024663005179499861">Netinkamas politikos tipas</translation>
 <translation id="3032412215588512954">Ar norite iš naujo įkelti šią svetainę?</translation>
 <translation id="3037605927509011580">Oi!</translation>
-<translation id="3040955737384246924">{COUNT,plural, =0{mažiausiai 1 elementas sinchronizuotuose įrenginiuose}=1{1 elementas (ir dar daugiau sinchronizuotuose įrenginiuose)}one{# elementas (ir dar daugiau sinchronizuotuose įrenginiuose)}few{# elementai (ir dar daugiau sinchronizuotuose įrenginiuose)}many{# elemento (ir dar daugiau sinchronizuotuose įrenginiuose)}other{# elementų (ir dar daugiau sinchronizuotuose įrenginiuose)}}</translation>
 <translation id="3041612393474885105">Sertifikato informacija</translation>
 <translation id="3063697135517575841">Šiuo metu „Chrome“ negali patvirtinti jūsų kortelės. Vėliau bandykite dar kartą.</translation>
 <translation id="3064966200440839136">Išjungiate inkognito režimą, kad galėtumėte sumokėti naudodami išorinę programą. Tęsti?</translation>
@@ -338,7 +336,6 @@
 <translation id="3681007416295224113">Sertifikato informacija</translation>
 <translation id="3690164694835360974">Prisijungimas nesaugus</translation>
 <translation id="3693415264595406141">Slaptažodis:</translation>
-<translation id="3696411085566228381">nėra</translation>
 <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation>
 <translation id="370665806235115550">Įkeliama...</translation>
 <translation id="3712624925041724820">Licencijos baigėsi</translation>
@@ -386,7 +383,6 @@
 <translation id="4171400957073367226">Netinkamas patvirtinimo parašas</translation>
 <translation id="4196861286325780578">&amp;Perkelti dar kartą</translation>
 <translation id="4203896806696719780"><ph name="BEGIN_LINK" />Patikrinti užkardos ir antivirusinės sistemos konfigūracijas<ph name="END_LINK" /></translation>
-<translation id="4206349416402437184">{COUNT,plural, =0{nėra}=1{1 programa („$1“)}=2{2 programos („$1“, „$2“)}one{# programa („$1“, „$2“, „$3“)}few{# programos („$1“, „$2“, „$3“)}many{# programos („$1“, „$2“, „$3“)}other{# programų („$1“, „$2“, „$3“)}}</translation>
 <translation id="4220128509585149162">Gedimai</translation>
 <translation id="4226937834893929579"><ph name="BEGIN_LINK" />Pabandykite paleisti „Windows Network Diagnostics“<ph name="END_LINK" />.</translation>
 <translation id="4250431568374086873">Ryšys su šia svetaine nėra visiškai saugus</translation>
@@ -470,7 +466,6 @@
 <translation id="5045550434625856497">Neteisingas slaptažodis</translation>
 <translation id="5056549851600133418">Jums skirti straipsniai</translation>
 <translation id="5070335125961472645"><ph name="BEGIN_LINK" />Patikrinti tarpinio serverio adresą<ph name="END_LINK" /></translation>
-<translation id="5076731569460970710">{COUNT,plural, =0{Nėra jokių slapukų}=1{1 svetainė naudoja slapukus. }one{# svetainė naudoja slapukus. }few{# svetainės naudoja slapukus. }many{# svetainės naudoja slapukus. }other{# svetainių naudoja slapukus. }}</translation>
 <translation id="5087286274860437796">Šiuo metu serverio sertifikatas negalioja.</translation>
 <translation id="5087580092889165836">Pridėti kortelę</translation>
 <translation id="5089810972385038852">Valstija</translation>
@@ -602,7 +597,6 @@
 <translation id="6358450015545214790">Ką tai reiškia?</translation>
 <translation id="6386120369904791316">{COUNT,plural, =1{Dar 1 pasiūlymas}one{Dar # pasiūlymas}few{Dar # pasiūlymai}many{Dar # pasiūlymo}other{Dar # pasiūlymų}}</translation>
 <translation id="6387478394221739770">Domina naujos „Chrome“ funkcijos? Išbandykite mūsų beta kanalą adresu chrome.com/beta.</translation>
-<translation id="6389758589412724634">„Chromium“ trūksta atminties šiam tinklalapiui pateikti.</translation>
 <translation id="6404511346730675251">Redaguoti žymę</translation>
 <translation id="6410264514553301377">įveskite „<ph name="CREDIT_CARD" />“ galiojimo pabaigos datą ir kortelės saugos kodą (CVC)</translation>
 <translation id="6414888972213066896">Paprašėte vieno iš tėvų leidimo apsilankyti šiame puslapyje</translation>
@@ -625,7 +619,6 @@
 <translation id="6556915248009097796">Galiojimo laiko pabaiga: <ph name="EXPIRATION_DATE_ABBR" />, paskutinį kartą naudota <ph name="LAST_USED_DATE_NO_DETAIL" /></translation>
 <translation id="6563469144985748109">Jūsų valdytojas dar jos nepatvirtino</translation>
 <translation id="6569060085658103619">Peržiūrite plėtinio puslapį</translation>
-<translation id="6593753688552673085">mažiau nei <ph name="UPPER_ESTIMATE" /></translation>
 <translation id="6596325263575161958">Šifravimo parinktys</translation>
 <translation id="662080504995468778">Likti</translation>
 <translation id="6626291197371920147">Galiojančios kortelės numerio pridėjimas</translation>
@@ -637,7 +630,6 @@
 <translation id="6710594484020273272">&lt;Įveskite paieškos terminą&gt;</translation>
 <translation id="6711464428925977395">Kažkas negerai su tarpiniu serveriu arba adresas netinkamas.</translation>
 <translation id="6727102863431372879">Nustatyti</translation>
-<translation id="6731320287533051140">{COUNT,plural, =0{nėra}=1{1 elementas}one{# elementas}few{# elementai}many{# elemento}other{# elementų}}</translation>
 <translation id="674375294223700098">Nežinoma serverio sertifikato klaida.</translation>
 <translation id="6753269504797312559">Politikos vertė</translation>
 <translation id="6757797048963528358">Įjungta įrenginio miego būsena.</translation>
@@ -743,6 +735,7 @@
 <translation id="7669271284792375604">Šios svetainės užgrobėjai gali bandyti apgaule priversti jus įdiegti naršymo funkcijas trikdančių programų (pvz., pakeitę pagrindinį puslapį ar rodydami papildomų skelbimų svetainėse, kuriose lankotės).</translation>
 <translation id="7674629440242451245">Domina naujos „Chrome“ funkcijos? Išbandykite mūsų kuriamą kanalą adresu chrome.com/dev.</translation>
 <translation id="7682287625158474539">Pristatymas</translation>
+<translation id="7701040980221191251">Nieko</translation>
 <translation id="7704050614460855821"><ph name="BEGIN_LINK" />Eiti į svetainę <ph name="SITE" /> (nesaugu)<ph name="END_LINK" /></translation>
 <translation id="7714464543167945231">Sertifikatas</translation>
 <translation id="7716424297397655342">Nepavyksta įkelti šios svetainės iš talpyklos</translation>
@@ -782,7 +775,6 @@
 <translation id="8041089156583427627">Siųsti atsiliepimą</translation>
 <translation id="8041940743680923270">Naudoti visuotinį numatytąjį nustatymą (klausti)</translation>
 <translation id="8088680233425245692">Nepavyko peržiūrėti straipsnio.</translation>
-<translation id="8089520772729574115">mažiau nei 1 MB</translation>
 <translation id="8091372947890762290">Laukiama aktyvinimo serveryje</translation>
 <translation id="8118489163946903409">Mokėjimo metodas</translation>
 <translation id="8131740175452115882">Patvirtinti</translation>
diff --git a/components/strings/components_strings_lv.xtb b/components/strings/components_strings_lv.xtb
index be3625d..fdeac113 100644
--- a/components/strings/components_strings_lv.xtb
+++ b/components/strings/components_strings_lv.xtb
@@ -220,7 +220,6 @@
 <translation id="2826760142808435982">Savienojums ir šifrēts un autentificēts, izmantojot <ph name="CIPHER" />, un tajā tiek izmantots <ph name="KX" /> kā atslēgu apmaiņas mehānisms.</translation>
 <translation id="2835170189407361413">Notīrīt veidlapu</translation>
 <translation id="2889159643044928134">Neielādēt atkārtoti</translation>
-<translation id="2900469785430194048">Mēģinot parādīt šo tīmekļa lapu, pārlūka Google Chrome atmiņā nepietika vietas.</translation>
 <translation id="2909946352844186028">Konstatētas tīkla izmaiņas.</translation>
 <translation id="2916038427272391327">Aizveriet citas programmas</translation>
 <translation id="2922350208395188000">Servera sertifikātu nevar pārbaudīt.</translation>
@@ -243,7 +242,6 @@
 <translation id="3024663005179499861">Politikas tips nav pareizs.</translation>
 <translation id="3032412215588512954">Vai vēlaties atkārtoti ielādēt šo vietni?</translation>
 <translation id="3037605927509011580">Cilnes avārija.</translation>
-<translation id="3040955737384246924">{COUNT,plural, =0{vismaz 1 vienums sinhronizētās ierīcēs}=1{1 vienums (un vēl citi sinhronizētās ierīcēs)}zero{# vienumi (un vēl citi sinhronizētās ierīcēs)}one{# vienums (un vēl citi sinhronizētās ierīcēs)}other{# vienumi (un vēl citi sinhronizētās ierīcēs)}}</translation>
 <translation id="3041612393474885105">Sertifikāta informācija</translation>
 <translation id="3063697135517575841">Pārlūkā Chrome pašlaik nevar apstiprināt jūsu karti. Lūdzu, vēlāk mēģiniet vēlreiz.</translation>
 <translation id="3064966200440839136">Ja maksāšanai tiks izmantota ārēja lietojumprogramma, tiks aizvērts inkognito režīms. Vai turpināt?</translation>
@@ -336,7 +334,6 @@
 <translation id="3681007416295224113">Sertifikāta informācija</translation>
 <translation id="3690164694835360974">Pieteikšanās nav droša</translation>
 <translation id="3693415264595406141">Parole:</translation>
-<translation id="3696411085566228381">nav</translation>
 <translation id="3704609568417268905"><ph name="TIME" />, <ph name="BOOKMARKED" />, <ph name="TITLE" />, <ph name="DOMAIN" /></translation>
 <translation id="370665806235115550">Notiek ielāde...</translation>
 <translation id="3712624925041724820">Nav pietiekami daudz licenču.</translation>
@@ -384,7 +381,6 @@
 <translation id="4171400957073367226">Verifikācijas paraksts nav derīgs.</translation>
 <translation id="4196861286325780578">&amp;Atcelt pārvietošanas atsaukšanu</translation>
 <translation id="4203896806696719780"><ph name="BEGIN_LINK" />Pārbaudiet ugunsmūri un pretvīrusu programmu konfigurācijas<ph name="END_LINK" />.</translation>
-<translation id="4206349416402437184">{COUNT,plural, =0{nav}=1{1 lietotne ($1)}=2{2 lietotnes ($1, $2)}zero{# lietotnes ($1, $2, $3)}one{# lietotne ($1, $2, $3)}other{# lietotnes ($1, $2, $3)}}</translation>
 <translation id="4220128509585149162">Avārijas</translation>
 <translation id="4226937834893929579"><ph name="BEGIN_LINK" />Mēģiniet palaist tīkla diagnostiku<ph name="END_LINK" />.</translation>
 <translation id="4250431568374086873">Jūsu savienojums ar šo vietni nav pavisam drošs.</translation>
@@ -468,7 +464,6 @@
 <translation id="5045550434625856497">Nepareiza parole</translation>
 <translation id="5056549851600133418">Jums piemeklēti raksti</translation>
 <translation id="5070335125961472645"><ph name="BEGIN_LINK" />Pārbaudiet starpniekservera adresi<ph name="END_LINK" />.</translation>
-<translation id="5076731569460970710">{COUNT,plural, =0{Nav sīkfailu.}=1{1 vietne izmanto sīkfailus. }zero{# vietnes izmanto sīkfailus. }one{# vietne izmanto sīkfailus. }other{# vietnes izmanto sīkfailus. }}</translation>
 <translation id="5087286274860437796">Servera sertifikāts šobrīd nav derīgs.</translation>
 <translation id="5087580092889165836">Pievienot karti</translation>
 <translation id="5089810972385038852">Štats</translation>
@@ -600,7 +595,6 @@
 <translation id="6358450015545214790">Ko tas nozīmē?</translation>
 <translation id="6386120369904791316">{COUNT,plural, =1{vēl 1 ieteikums}zero{vēl # ieteikumi}one{vēl # ieteikums}other{vēl # ieteikumi}}</translation>
 <translation id="6387478394221739770">Vai jūs interesē jaunas Chrome funkcijas? Izmēģiniet mūsu Beta versiju, kas pieejama vietnē chrome.com/beta.</translation>
-<translation id="6389758589412724634">Mēģinot parādīt šo tīmekļa lapu, pārlūka Chromium atmiņā nepietika vietas.</translation>
 <translation id="6404511346730675251">Rediģēt grāmatzīmi</translation>
 <translation id="6410264514553301377">Ievadiet kredītkartes <ph name="CREDIT_CARD" /> derīguma termiņu un CVC.</translation>
 <translation id="6414888972213066896">Jūs lūdzāt vienam no vecākiem atļauju apmeklēt šo vietni</translation>
@@ -623,7 +617,6 @@
 <translation id="6556915248009097796">Derīguma termiņš: <ph name="EXPIRATION_DATE_ABBR" />; pēdējoreiz izmantota: <ph name="LAST_USED_DATE_NO_DETAIL" /></translation>
 <translation id="6563469144985748109">Jūsu vadītājs vēl nav to apstiprinājis</translation>
 <translation id="6569060085658103619">Jūs skatāt paplašinājumu lapu.</translation>
-<translation id="6593753688552673085">mazāk nekā <ph name="UPPER_ESTIMATE" /></translation>
 <translation id="6596325263575161958">Šifrēšanas opcijas</translation>
 <translation id="662080504995468778">Palikt</translation>
 <translation id="6626291197371920147">Derīga kartes numura pievienošana</translation>
@@ -635,7 +628,6 @@
 <translation id="6710594484020273272">&lt;Ierakstiet meklēšanas vienumu&gt;</translation>
 <translation id="6711464428925977395">Starpniekserverī radās kļūda, vai arī adrese nav pareiza.</translation>
 <translation id="6727102863431372879">Iestatīt</translation>
-<translation id="6731320287533051140">{COUNT,plural, =0{nav}=1{1 vienums}zero{# vienumi}one{# vienums}other{# vienumi}}</translation>
 <translation id="674375294223700098">Nezināma servera sertifikāta kļūda.</translation>
 <translation id="6753269504797312559">Politikas vērtība</translation>
 <translation id="6757797048963528358">Ierīce tika pārslēgta miega režīmā.</translation>
@@ -741,6 +733,7 @@
 <translation id="7669271284792375604">Uzbrucēji šajā vietnē var mudināt jūs uz tādu programmu instalēšanu, kuras traucē pārlūkošanu (piemēram, mainot sākumlapu vai apmeklētajās vietnēs rādot papildu reklāmas).</translation>
 <translation id="7674629440242451245">Vai jūs interesē jaunas Chrome funkcijas? Izmēģiniet izstrādātāja versiju vietnē chrome.com/dev.</translation>
 <translation id="7682287625158474539">Piegāde</translation>
+<translation id="7701040980221191251">Neviens</translation>
 <translation id="7704050614460855821"><ph name="BEGIN_LINK" />Apmeklēt vietni <ph name="SITE" /> (nav droša)<ph name="END_LINK" /></translation>
 <translation id="7714464543167945231">Sertifikāts</translation>
 <translation id="7716424297397655342">Šo vietni nevar ielādēt no kešatmiņas</translation>
@@ -780,7 +773,6 @@
 <translation id="8041089156583427627">Sūtīt atsauksmes</translation>
 <translation id="8041940743680923270">Izmantot globālo noklusējumu (Vaicāt)</translation>
 <translation id="8088680233425245692">Rakstu neizdevās skatīt.</translation>
-<translation id="8089520772729574115">mazāk nekā 1 MB</translation>
 <translation id="8091372947890762290">Aktivizācija vēl nav apstiprināta serverī.</translation>
 <translation id="8118489163946903409">Maksājuma veids</translation>
 <translation id="8131740175452115882">Apstiprināt</translation>
diff --git a/components/strings/components_strings_ml.xtb b/components/strings/components_strings_ml.xtb
index 22c58073..bb23e8a 100644
--- a/components/strings/components_strings_ml.xtb
+++ b/components/strings/components_strings_ml.xtb
@@ -220,10 +220,10 @@
 <translation id="2826760142808435982"><ph name="CIPHER" /> ഉപയോഗിച്ച് കണക്ഷൻ എൻക്രിപ്‌റ്റുചെയ്‌ത് പ്രാമാണീകരിക്കുന്നു, ഒപ്പം പ്രധാന എക്‌സേഞ്ച് മെക്കാനിസമായി <ph name="KX" /> ഉപയോഗിക്കുന്നു.</translation>
 <translation id="2835170189407361413">ഫോം മായ്‌ക്കുക</translation>
 <translation id="2889159643044928134">റീലോഡുചെയ്യരുത്</translation>
-<translation id="2900469785430194048">ഈ വെബ്‌പേജ് പ്രദർശിപ്പിക്കാൻ ശ്രമിക്കുന്നതിനിടയിൽ Google Chrome-ന്റെ മെമ്മറി നിറഞ്ഞു.</translation>
 <translation id="2909946352844186028">ഒരു നെറ്റ്‌വർക്ക് മാറ്റം കണ്ടെത്തി.</translation>
 <translation id="2916038427272391327">മറ്റ് പ്രോഗ്രാമുകൾ അടയ്‌ക്കുക</translation>
 <translation id="2922350208395188000">സെര്‍വറിന്‍റെ സര്‍ട്ടിഫിക്കറ്റ് പരിശോധിക്കാന്‍ കഴിയില്ല.</translation>
+<translation id="2928905813689894207">ബില്ലിംഗ് വിലാസം</translation>
 <translation id="2941952326391522266">ഈ സെർവറിന് അത് <ph name="DOMAIN" /> ആണെന്ന് തെളിയിക്കാനായില്ല; <ph name="DOMAIN2" /> എന്നതിൽ നിന്നുള്ളതാണ് അതിന്റെ സുരക്ഷാ സർട്ടിഫിക്കറ്റ്. തെറ്റായ കോൺഫിഗറേഷൻ കാരണമോ ഒരു അക്രമണകാരി നിങ്ങളുടെ കണക്ഷനെ തടസ്സപ്പെടുത്തുന്നത് കൊണ്ടോ ആയിരിക്കാം ഇത് സംഭവിച്ചത്.</translation>
 <translation id="2948083400971632585">കണക്ഷനായി കോൺഫിഗർ ചെയ്‌ത ഏതൊരു പ്രോക്‌സികളും ക്രമീകരണങ്ങൾ പേജിൽ നിന്ന് നിങ്ങൾക്ക് പ്രവർത്തനരഹിതമാക്കാനാകും.</translation>
 <translation id="2955913368246107853">ഫൈന്‍ഡ് ബാര്‍ അടയ്ക്കുക</translation>
@@ -238,10 +238,10 @@
 <translation id="3005723025932146533">സംരക്ഷിച്ച പകർപ്പ് കാണിക്കുക</translation>
 <translation id="3008447029300691911"><ph name="CREDIT_CARD" />-ന്റെ CVC നൽകുക. സ്ഥിരീകരിച്ച് കഴിഞ്ഞാൽ, നിങ്ങളുടെ കാർഡ് വിശദാംശങ്ങൾ ഈ സൈറ്റുമായി പങ്കിടും.</translation>
 <translation id="3010559122411665027">ലിസ്റ്റ് എൻട്രി "<ph name="ENTRY_INDEX" />": <ph name="ERROR" /></translation>
+<translation id="301521992641321250">സ്വയമേവ ബ്ലോക്കുചെയ്‌തു</translation>
 <translation id="3024663005179499861">തെറ്റായ നയ തരം</translation>
 <translation id="3032412215588512954">ഈ സൈറ്റ് റീലോഡുചെയ്യണോ?</translation>
 <translation id="3037605927509011580">കഷ്ടം!</translation>
-<translation id="3040955737384246924">{COUNT,plural, =0{സമന്വയിപ്പിച്ച ഉപകരണങ്ങളിൽ ഒരു ഇനമെങ്കിലും}=1{ഒരു ഇനം (ഒപ്പം സമന്വയിപ്പിച്ച ഉപകരണങ്ങളിൽ അതിൽ കൂടുതലും)}other{# ഇനങ്ങൾ (ഒപ്പം സമന്വയിപ്പിച്ച ഉപകരണങ്ങളിൽ അതിൽ കൂടുതലും)}}</translation>
 <translation id="3041612393474885105">സര്‍‌ട്ടിഫിക്കറ്റ് വിവരങ്ങള്‍‌</translation>
 <translation id="3063697135517575841">Chrome-ന് ഇപ്പോൾ നിങ്ങളുടെ കാർഡ് സ്ഥിരീകരിക്കാനായില്ല. പിന്നീട് വീണ്ടും ശ്രമിക്കുക.</translation>
 <translation id="3064966200440839136">ഒരു എക്‌സ്‌റ്റേണൽ അപ്ലിക്കേഷൻ വഴി പണമടയ്‌ക്കാൻ അദൃശ്യതാ സംവിധാനം ഒഴിവാക്കുന്നു. തുടരണോ?</translation>
@@ -334,7 +334,6 @@
 <translation id="3681007416295224113">സര്‍‌ട്ടിഫിക്കറ്റ് വിവരങ്ങള്‍‌</translation>
 <translation id="3690164694835360974">ലോഗിൻ ചെയ്യുന്നത് സുരക്ഷിതമല്ല</translation>
 <translation id="3693415264595406141">പാസ്‌വേഡ്:</translation>
-<translation id="3696411085566228381">ഒന്നുമില്ല</translation>
 <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation>
 <translation id="370665806235115550">ലോഡ്ചെയ്യുന്നു...</translation>
 <translation id="3712624925041724820">ലൈസൻസുകൾ കാലഹരണപ്പെട്ടു</translation>
@@ -382,7 +381,6 @@
 <translation id="4171400957073367226">മോശം പരിശോധിച്ചുറപ്പിക്കൽ സിഗ്‌നേച്ചർ</translation>
 <translation id="4196861286325780578">&amp;നീക്കുന്നത് വീണ്ടും ചെയ്യുക</translation>
 <translation id="4203896806696719780"><ph name="BEGIN_LINK" />ഫയർവാളും ആന്റിവൈറസ് കോൺഫിഗറേഷനുകളും പരിശോധിക്കുന്നു<ph name="END_LINK" /></translation>
-<translation id="4206349416402437184">{COUNT,plural, =0{ഒന്നുമില്ല}=1{ഒരു ആപ്പ് ($1)}=2{2 ആപ്‌സ് ($1, $2)}other{# ആപ്‌സ് ($1, $2, $3)}}</translation>
 <translation id="4220128509585149162">ക്രാഷുകള്‍</translation>
 <translation id="4226937834893929579"><ph name="BEGIN_LINK" />നെറ്റ്‌വർക്ക് ഡയഗണോസ്‌റ്റിക്‌സ് റൺ ചെയ്‌തുനോക്കൂ<ph name="END_LINK" />.</translation>
 <translation id="4250431568374086873">ഈ സൈറ്റിലുള്ള നിങ്ങളുടെ കണക്ഷൻ പൂർണ്ണമായും സുരക്ഷിതമല്ല</translation>
@@ -466,7 +464,6 @@
 <translation id="5045550434625856497">ശരിയല്ലാത്ത രഹസ്യവാക്ക്</translation>
 <translation id="5056549851600133418">നിങ്ങൾക്കുള്ള ലേഖനങ്ങൾ</translation>
 <translation id="5070335125961472645"><ph name="BEGIN_LINK" />പ്രോക്‌സി വിലാസം പരിശോധിക്കുന്നു<ph name="END_LINK" /></translation>
-<translation id="5076731569460970710">{COUNT,plural, =0{കുക്കികളില്ല}=1{ഒരു സൈറ്റ് കുക്കികൾ ഉപയോഗിക്കുന്നു. }other{# സൈറ്റുകൾ, കുക്കികൾ ഉപയോഗിക്കുന്നു. }}</translation>
 <translation id="5087286274860437796">സെർവറിന്റെ സർട്ടിഫിക്കറ്റിന് ഇപ്പോൾ സാധുതയില്ല.</translation>
 <translation id="5087580092889165836">കാർഡ് ചേർക്കുക</translation>
 <translation id="5089810972385038852">സ്റ്റേറ്റ്</translation>
@@ -573,6 +570,7 @@
 <translation id="6165508094623778733">കൂടുതൽ‍ മനസിലാക്കുക</translation>
 <translation id="6169916984152623906">നിങ്ങൾക്കിപ്പോൾ സ്വകാര്യമായി ബ്രൗസ് ചെയ്യാം, ഈ ഉപകരണം ഉപയോഗിക്കുന്ന മറ്റ് ആളുകൾക്ക് നിങ്ങളുടെ ആക്‌റ്റിവിറ്റി കാണാനാവില്ല. എന്നാൽ ഡൗൺലോഡുകളും ബുക്ക്‌മാർക്കുകളും സംരക്ഷിക്കപ്പെടും.</translation>
 <translation id="6177128806592000436">ഈ സൈറ്റിലേക്കുള്ള നിങ്ങളുടെ കണക്ഷൻ സുരക്ഷിതമല്ല</translation>
+<translation id="6184817833369986695">(സമാന വിഭാഗത്തിൽപ്പെട്ടവ: <ph name="UPDATE_COHORT_NAME" />)</translation>
 <translation id="6203231073485539293">നിങ്ങളുടെ ഇന്റർനെറ്റ് കണക്ഷൻ പരിശോധിക്കുക</translation>
 <translation id="6218753634732582820">Chromium-ത്തിൽ നിന്ന് വിലാസം നീക്കംചെയ്യണോ?</translation>
 <translation id="6221345481584921695"><ph name="BEGIN_LINK" /> എന്നതിൽ Google സുരക്ഷിത ബ്രൗസിംഗ് ഈയിടെ <ph name="END_LINK" />മാൽവെയർ കണ്ടെത്തി<ph name="SITE" /> . സാധാരണ നിലയിൽ സുരക്ഷിതമായ വെബ്സൈറ്റുകളിൽ ചിലപ്പോൾ മാൽവെയർ ഉണ്ടായിരിക്കാം. ഒരു അറിയപ്പെടുന്ന മാൽ‌വെയർ വിതരണക്കാരായ <ph name="SUBRESOURCE_HOST" /> എന്നതിൽ നിന്നാണ് ദോഷകരമായ ഉള്ളടക്കം വരുന്നത്.</translation>
@@ -597,7 +595,6 @@
 <translation id="6358450015545214790">ഇത് അര്‍ത്ഥമാക്കുന്നതെന്താണ്?</translation>
 <translation id="6386120369904791316">{COUNT,plural, =1{മറ്റൊരു നിർദ്ദേശം}other{മറ്റ് # നിർദ്ദേശങ്ങൾ}}</translation>
 <translation id="6387478394221739770">Chrome-ന്റെ രസകരമായ പുതിയ സവിശേഷതകളിൽ താൽപ്പര്യമുണ്ടോ? chrome.com/beta-യിൽ ഞങ്ങളുടെ ബീറ്റ ചാനൽ പരീക്ഷിക്കുക.</translation>
-<translation id="6389758589412724634">ഈ വെബ്‌പേജ് പ്രദർശിപ്പിക്കാൻ ശ്രമിക്കുന്നതിനിടയിൽ Chromium-ത്തിന്റെ മെമ്മറി നിറഞ്ഞു.</translation>
 <translation id="6404511346730675251">ബുക്ക്‌മാർക്ക് എഡിറ്റുചെയ്യുക</translation>
 <translation id="6410264514553301377"><ph name="CREDIT_CARD" />-ന്റെ കാലാവധി തീരുന്ന തീയതിയും CVC-യും നൽകുക</translation>
 <translation id="6414888972213066896">ഈ സൈറ്റ് സന്ദർശിക്കുന്നതിന് നിങ്ങൾ രക്ഷിതാവിനോട് അനുമതി ആവശ്യപ്പെട്ടു</translation>
@@ -620,7 +617,6 @@
 <translation id="6556915248009097796">കാലഹരണപ്പെടുന്ന തീയതി: <ph name="EXPIRATION_DATE_ABBR" />, <ph name="LAST_USED_DATE_NO_DETAIL" />-ന് അവസാനമായി ഉപയോഗിച്ചു</translation>
 <translation id="6563469144985748109">നിങ്ങളുടെ മാനേജർ ഇതുവരെ അംഗീകാരം നൽകിയിട്ടില്ല</translation>
 <translation id="6569060085658103619">നിങ്ങൾ ഒരു വിപുലീകരണ പേജാണ് കാണുന്നത്</translation>
-<translation id="6593753688552673085"><ph name="UPPER_ESTIMATE" />-യിൽ താഴെ</translation>
 <translation id="6596325263575161958">എൻക്രിപ്‌ഷൻ ഓപ്‌ഷനുകൾ</translation>
 <translation id="662080504995468778">തുടരുക</translation>
 <translation id="6626291197371920147">ശരിയായ കാർഡ് നമ്പർ ചേർക്കുക</translation>
@@ -632,7 +628,6 @@
 <translation id="6710594484020273272">&lt;തിരയൽ പദം നൽകുക&gt;</translation>
 <translation id="6711464428925977395">പ്രോക്‌സി സെർവറിൽ എന്തോ പ്രശ്‌നമുണ്ട്, അല്ലെങ്കിൽ വിലാസം തെറ്റാണ്.</translation>
 <translation id="6727102863431372879">സജ്ജമാക്കുക</translation>
-<translation id="6731320287533051140">{COUNT,plural, =0{ഒന്നുമില്ല}=1{ഒരു ഇനം}other{# ഇനങ്ങൾ}}</translation>
 <translation id="674375294223700098">അറിയപ്പെടാത്ത സെര്‍വര്‍ സര്‍ട്ടിഫിക്കറ്റ് പിശക്.</translation>
 <translation id="6753269504797312559">നയ മൂല്യം</translation>
 <translation id="6757797048963528358">നിങ്ങളുടെ ഉപകരണം സുഷുപ്‌തിയിലായി.</translation>
@@ -675,6 +670,7 @@
 <translation id="7180611975245234373">പുതുക്കുക</translation>
 <translation id="7182878459783632708">നയങ്ങളൊന്നും സജ്ജമാക്കിയിട്ടില്ല</translation>
 <translation id="7186367841673660872">ഈ പേജ്<ph name="ORIGINAL_LANGUAGE" />ല്‍‌ നിന്നും<ph name="LANGUAGE_LANGUAGE" />ലേക്ക് വിവര്‍‌ത്തനം ചെയ്‌തു</translation>
+<translation id="7192203810768312527"><ph name="SIZE" /> ലാഭിക്കുക. നിങ്ങളുടെ അടുത്ത സന്ദർശനത്തിൽ ചില സൈറ്റുകൾ സാവധാനത്തിൽ ലോഡുചെയ്‌തേക്കാം.</translation>
 <translation id="719464814642662924">Visa</translation>
 <translation id="7210863904660874423"><ph name="HOST_NAME" />, സുരക്ഷാ മാനദണ്ഡങ്ങൾ പാലിക്കുന്നില്ല.</translation>
 <translation id="721197778055552897">ഈ പ്രശ്‌നത്തെക്കുറിച്ച് <ph name="BEGIN_LINK" />കൂടുതൽ‍ മനസിലാക്കുക<ph name="END_LINK" />.</translation>
@@ -737,6 +733,7 @@
 <translation id="7669271284792375604">ഈ സൈറ്റിലെ ആക്രമണകാരികൾ, ബ്രൗസർ അനുഭവത്തെ ദോഷകരമായി ബാധിക്കുന്ന പ്രോഗ്രാമുകൾ ഇൻസ്‌റ്റാൾ ചെയ്യിക്കുന്ന വിധത്തിൽ നിങ്ങളെ കബളിപ്പിക്കാൻ ശ്രമിച്ചേക്കും (ഉദാഹരണത്തിന്, നിങ്ങളുടെ ഹോംപേജ് മാറ്റുന്നതിലൂടെയോ അല്ലെങ്കിൽ സന്ദർശിക്കുന്ന സൈറ്റുകളിൽ കൂടുതൽ പരസ്യങ്ങൾ കാണിക്കുന്നതിലൂടെയോ).</translation>
 <translation id="7674629440242451245">പുതിയ Chrome-ന്റെ രസകരമായ സവിശേഷതകളിൽ താൽപ്പര്യമുണ്ടോ? chrome.com/dev-ൽ ഞങ്ങളുടെ ഡെവലപ്പർ ചാനൽ പരീക്ഷിച്ചുനോക്കുക.</translation>
 <translation id="7682287625158474539">ഷിപ്പിംഗ്</translation>
+<translation id="7701040980221191251">ഒന്നുമില്ല</translation>
 <translation id="7704050614460855821"><ph name="BEGIN_LINK" /> <ph name="SITE" /> എന്നതിലേക്ക് പോകുക (സുരക്ഷിതമല്ല)<ph name="END_LINK" /></translation>
 <translation id="7714464543167945231">സര്‍‌ട്ടിഫിക്കറ്റ്</translation>
 <translation id="7716424297397655342">ഈ സൈറ്റ് കാഷെയിൽ നിന്ന് ലോഡുചെയ്യാനാകില്ല</translation>
@@ -776,7 +773,6 @@
 <translation id="8041089156583427627">ഫീഡ്ബാക്ക് അയയ്ക്കുക</translation>
 <translation id="8041940743680923270">ഗ്ലോബൽ ഡിഫോൾട്ട് ഉപയോഗിക്കുക (ചോദിക്കുക)</translation>
 <translation id="8088680233425245692">ലേഖനം കാണുന്നത് പരാജയപ്പെട്ടു.</translation>
-<translation id="8089520772729574115">ഒരു MB-യിൽ കുറവാണ്</translation>
 <translation id="8091372947890762290">സെർവറിൽ സജീവമാക്കൽ തീർപ്പാക്കിയിട്ടില്ല</translation>
 <translation id="8118489163946903409">പേയ്‌മെന്റ് രീതി</translation>
 <translation id="8131740175452115882">സ്ഥിരീകരിക്കുക</translation>
diff --git a/components/strings/components_strings_mr.xtb b/components/strings/components_strings_mr.xtb
index 3804a9c..e48a5b3 100644
--- a/components/strings/components_strings_mr.xtb
+++ b/components/strings/components_strings_mr.xtb
@@ -220,10 +220,10 @@
 <translation id="2826760142808435982">कनेक्शन <ph name="CIPHER" /> वापरून आणि की विनिमय तंत्र म्हणून <ph name="KX" /> वापर कूटबद्ध आणि प्रमाणीकृत केले आहे.</translation>
 <translation id="2835170189407361413">फॉर्म क्लिअर करा</translation>
 <translation id="2889159643044928134">रीलोड करु नका</translation>
-<translation id="2900469785430194048">हे वेबपृष्ठ प्रदर्शित करण्याचा प्रयत्न करताना Google Chrome ची मेमरी संपली आहे.</translation>
 <translation id="2909946352844186028">एक नेटवर्क बदल आढळला.</translation>
 <translation id="2916038427272391327">अन्य प्रोग्राम बंद करा</translation>
 <translation id="2922350208395188000">सर्व्हरचे प्रमाणपत्र तपासणे शक्य नाही.</translation>
+<translation id="2928905813689894207">बिलिंग पत्ता</translation>
 <translation id="2941952326391522266">हा सर्व्हर हे <ph name="DOMAIN" /> असल्याचे सिद्ध करू शकला नाही; त्याचे सुरक्षितता प्रमाणपत्र <ph name="DOMAIN2" /> वरील आहे. हे कदाचित एका चुकीच्या कॉन्फिगरेशनमुळे किंवा आक्रमणकर्त्याने आपले कनेक्शन आंतरखंडित केल्यामुळे झाले असू शकते.</translation>
 <translation id="2948083400971632585">आपण सेटिंग्ज पृष्ठावरून एका कनेक्शनसाठी कॉन्फिगर केलेले कोणतेही प्रॉक्सी अक्षम करू शकता.</translation>
 <translation id="2955913368246107853">शोध बार बंद करा</translation>
@@ -238,10 +238,10 @@
 <translation id="3005723025932146533">जतन केलेली प्रत दर्शवा</translation>
 <translation id="3008447029300691911"><ph name="CREDIT_CARD" /> साठी CVC प्रविष्‍ट करा. आपण पुष्टी केल्यावर, आपले कार्ड तपशील या साइटसह सामायिक केले जातील.</translation>
 <translation id="3010559122411665027">सूची प्रविष्टी "<ph name="ENTRY_INDEX" />": <ph name="ERROR" /></translation>
+<translation id="301521992641321250">आपोआप ब्लॉक केलेले</translation>
 <translation id="3024663005179499861">चुकीचा धोरण प्रकार</translation>
 <translation id="3032412215588512954">आपण ही साइट पुन्हा रीलोड करू इच्छिता?</translation>
 <translation id="3037605927509011580">च्चक!</translation>
-<translation id="3040955737384246924">{COUNT,plural, =0{संकालित डिव्‍हाइसेसवर किमान 1 आयटम}=1{1 आयटम (आणि संकालित डिव्‍हाइसेसवर आणखी)}one{# आयटम (आणि संकालित डिव्‍हाइसेसवर आणखी)}other{# आयटम (आणि संकालित डिव्‍हाइसेसवर आणखी)}}</translation>
 <translation id="3041612393474885105">प्रमाणपत्र माहिती...</translation>
 <translation id="3063697135517575841">Chrome यावेळी आपल्या कार्डची पुष्टी करण्यात अक्षम होते. कृपया नंतर पुन्हा प्रयत्न करा.</translation>
 <translation id="3064966200440839136">बाह्य अनुप्रयोग द्वारे देय देण्यासाठी गुप्त मोड सोडत आहे. सुरु ठेवायचे?</translation>
@@ -335,7 +335,6 @@
 <translation id="3681007416295224113">प्रमाणपत्र माहिती...</translation>
 <translation id="3690164694835360974">लॉग इन सुरक्षित नाही</translation>
 <translation id="3693415264595406141">संकेतशब्द:</translation>
-<translation id="3696411085566228381">काहीही नाही</translation>
 <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation>
 <translation id="370665806235115550">लोड करीत आहे...</translation>
 <translation id="3712624925041724820">परवाने संपुष्टात</translation>
@@ -383,7 +382,6 @@
 <translation id="4171400957073367226">खराब सत्यापन स्वाक्षरी</translation>
 <translation id="4196861286325780578">&amp;हलवा पुन्हा करा</translation>
 <translation id="4203896806696719780"><ph name="BEGIN_LINK" />फायरवॉल आणि अँटीव्हायरस कॉन्फिगरेशन तपासणे<ph name="END_LINK" /></translation>
-<translation id="4206349416402437184">{COUNT,plural, =0{काहीही नाही}=1{1 अ‍ॅप ($1)}=2{2 अ‍ॅप्स ($1, $2)}one{# अ‍ॅप्स ($1, $2, $3)}other{# अ‍ॅप्स ($1, $2, $3)}}</translation>
 <translation id="4220128509585149162">क्रॅश होते</translation>
 <translation id="4226937834893929579"><ph name="BEGIN_LINK" />नेटवर्क निदान चालवून पहा<ph name="END_LINK" />.</translation>
 <translation id="4250431568374086873">या साइटवरील आपले कनेक्शन पूर्णपणे सुरक्षित नाही</translation>
@@ -467,7 +465,6 @@
 <translation id="5045550434625856497">अयोग्य संकेतशब्द</translation>
 <translation id="5056549851600133418">आपल्यासाठी लेख</translation>
 <translation id="5070335125961472645"><ph name="BEGIN_LINK" />प्रॉक्सी पत्ता तपासणे<ph name="END_LINK" /></translation>
-<translation id="5076731569460970710">{COUNT,plural, =0{कुकीज नाहीत}=1{1 साइट कुकीज वापरते. }one{# साइट कुकीज वापरते. }other{# साइट कुकीज वापरतात. }}</translation>
 <translation id="5087286274860437796">यावेळी सर्व्हरचे प्रमाणपत्र वैध नाही.</translation>
 <translation id="5087580092889165836">कार्ड जोडा</translation>
 <translation id="5089810972385038852">राज्य</translation>
@@ -575,6 +572,7 @@
 <translation id="6165508094623778733">अधिक जाणून घ्या</translation>
 <translation id="6169916984152623906">आता आपण खाजगीरित्या ब्राउझ करू शकता आणि हे डिव्हाइस वापरणारे इतर लोक आपले क्रियाकलाप पाहू शकणार नाहीत. तथापि, डाउनलोड आणि बुकमार्क सेव्ह केले जातील.</translation>
 <translation id="6177128806592000436">या साइटवरील आपले कनेक्शन सुरक्षित नाही</translation>
+<translation id="6184817833369986695">(cohort: <ph name="UPDATE_COHORT_NAME" />)</translation>
 <translation id="6203231073485539293">आपले इंटरनेट कनेक्शन तपासा</translation>
 <translation id="6218753634732582820">Chromium वरून पत्ता काढायचा?</translation>
 <translation id="6221345481584921695">Google सुरक्षित ब्राउझिंगला अलीकडे <ph name="SITE" /> वर <ph name="BEGIN_LINK" />मालवेअर आढळले आहे<ph name="END_LINK" />. सामान्यतः सुरक्षित असलेल्या वेबसाइट काहीवेळा मालवेअरमुळे संक्रमित झालेल्या असतात. एक ज्ञात मालवेअर वितरक असलेल्या, <ph name="SUBRESOURCE_HOST" /> कडून दुर्भावनापूर्ण सामग्री येते.</translation>
@@ -599,7 +597,6 @@
 <translation id="6358450015545214790">याचा अर्थ काय आहे?</translation>
 <translation id="6386120369904791316">{COUNT,plural, =1{1 अन्य सूचना}one{# अन्य सूचना}other{# अन्य सूचना}}</translation>
 <translation id="6387478394221739770">छान नवीन Chrome वैशिष्ट्यांमध्ये स्वारस्य आहे? chrome.com/beta वरील आमचे बीटा चॅनेल वापरून पहा.</translation>
-<translation id="6389758589412724634">हे वेबपृष्ठ प्रदर्शित करण्याचा प्रयत्न करताना Chromium ची मेमरी संपली आहे.</translation>
 <translation id="6404511346730675251">बुकमार्क संपादित करा</translation>
 <translation id="6410264514553301377"><ph name="CREDIT_CARD" /> साठी कालबाह्यता तारीख आणि CVC प्रविष्‍ट करा</translation>
 <translation id="6414888972213066896">या साइटला भेट देणे ठीक आहे का ते आपण आपल्‍या पालकास विचारले</translation>
@@ -622,7 +619,6 @@
 <translation id="6556915248009097796">कालबाह्यता: <ph name="EXPIRATION_DATE_ABBR" />, अखेरचे वापरले: <ph name="LAST_USED_DATE_NO_DETAIL" /></translation>
 <translation id="6563469144985748109">आपल्या व्यवस्थापकाने अद्याप ती मंजूर केली नाही</translation>
 <translation id="6569060085658103619">आपण एक विस्तार पृष्ठ पाहत आहात</translation>
-<translation id="6593753688552673085"><ph name="UPPER_ESTIMATE" /> पेक्षा कमी</translation>
 <translation id="6596325263575161958">कूटबद्धता पर्याय</translation>
 <translation id="662080504995468778">यावर रहा</translation>
 <translation id="6626291197371920147">वैध कार्ड नंबर जोडा</translation>
@@ -634,7 +630,6 @@
 <translation id="6710594484020273272">&lt;शोध संज्ञा प्रविष्ट करा&gt;</translation>
 <translation id="6711464428925977395">प्रॉक्सी सर्व्हरमध्ये काहीतरी चुकीचे आहे किंवा पत्ता चुकीचा आहे.</translation>
 <translation id="6727102863431372879">सेट करा</translation>
-<translation id="6731320287533051140">{COUNT,plural, =0{काहीही नाही}=1{1 आयटम}one{# आयटम}other{# आयटम}}</translation>
 <translation id="674375294223700098">अज्ञात सर्व्हर प्रमाणपत्र त्रुटी.</translation>
 <translation id="6753269504797312559">धोरण मूल्य</translation>
 <translation id="6757797048963528358">आपले डिव्हाइस निष्क्रीय झाले.</translation>
@@ -677,6 +672,7 @@
 <translation id="7180611975245234373">रीफ्रेश करा</translation>
 <translation id="7182878459783632708">कोणतीही धोरणे सेट नाहीत</translation>
 <translation id="7186367841673660872">हे पृष्ठ<ph name="ORIGINAL_LANGUAGE" />मधून<ph name="LANGUAGE_LANGUAGE" />मध्ये अनुवादित केले गेले आहे</translation>
+<translation id="7192203810768312527"><ph name="SIZE" /> जागा मोकळी करते. काही साइट तुमच्या पुढील भेटीच्या वेळी आणखी धीम्या गतीने लोड होऊ शकतात.</translation>
 <translation id="719464814642662924">Visa</translation>
 <translation id="7210863904660874423"><ph name="HOST_NAME" /> नी सुरक्षितता मानकांचे पालन केले नाही.</translation>
 <translation id="721197778055552897">या समस्येबद्दल <ph name="BEGIN_LINK" />अधिक जाणून घ्या<ph name="END_LINK" />.</translation>
@@ -739,6 +735,7 @@
 <translation id="7669271284792375604">या साइट वरील आक्रमणकर्ते कदाचित आपल्या ब्राउझिंग अनुभवास हानी पोहोचविणारे प्रोग्राम (उदाहरणार्थ, आपले मुख्यपृष्ठ बदलून किंवा आपण भेट देता त्या साइटवर अतिरिक्त जाहिराती दर्शवून) स्थापित करून आपली फसवणूक करण्‍याचा प्रयत्न करू शकतात.</translation>
 <translation id="7674629440242451245">छान नवीन Chrome वैशिष्ट्यांमध्ये स्वारस्य आहे? chrome.com/dev येथे आमचे dev चॅनेल वापरून पहा.</translation>
 <translation id="7682287625158474539">शिपिंग</translation>
+<translation id="7701040980221191251">काहीही नाही</translation>
 <translation id="7704050614460855821"><ph name="BEGIN_LINK" /> <ph name="SITE" /> (असुरक्षित) वर सुरु ठेवा<ph name="END_LINK" /></translation>
 <translation id="7714464543167945231">प्रमाणपत्र</translation>
 <translation id="7716424297397655342">ही साइट कॅश   मधून लोड करणे शक्य नाही</translation>
@@ -778,7 +775,6 @@
 <translation id="8041089156583427627">अभिप्राय पाठवा</translation>
 <translation id="8041940743680923270">सार्वत्रिक डीफॉल्‍ट वापरा (विचारा)</translation>
 <translation id="8088680233425245692">लेख पाहण्यात अयशस्वी.</translation>
-<translation id="8089520772729574115">1 MB पेक्षा कमी</translation>
 <translation id="8091372947890762290">सक्रियकरण सर्व्हरवर प्रलंबित आहे</translation>
 <translation id="8118489163946903409">पेमेंट पद्धत</translation>
 <translation id="8131740175452115882">पुष्टी करा</translation>
diff --git a/components/strings/components_strings_ms.xtb b/components/strings/components_strings_ms.xtb
index acdc36a..9e30193 100644
--- a/components/strings/components_strings_ms.xtb
+++ b/components/strings/components_strings_ms.xtb
@@ -220,7 +220,6 @@
 <translation id="2826760142808435982">Sambungan disulitkan dan disahkan menggunakan <ph name="CIPHER" /> dan menggunakan <ph name="KX" /> sebagai mekanisme pertukaran kunci.</translation>
 <translation id="2835170189407361413">Kosongkan borang</translation>
 <translation id="2889159643044928134">Jangan Muat Semula</translation>
-<translation id="2900469785430194048">Google Chrome kehabisan memori semasa cuba memaparkan halaman web ini.</translation>
 <translation id="2909946352844186028">Perubahan rangkaian dikesan.</translation>
 <translation id="2916038427272391327">Tutup atur cara lain</translation>
 <translation id="2922350208395188000">Sijil pelayan tidak boleh diperiksa.</translation>
@@ -243,7 +242,6 @@
 <translation id="3024663005179499861">Jenis dasar salah</translation>
 <translation id="3032412215588512954">Adakah anda ingin memuat semula tapak ini?</translation>
 <translation id="3037605927509011580">Oh, Tidak!</translation>
-<translation id="3040955737384246924">{COUNT,plural, =0{sekurang-kurangnya 1 item pada peranti yang disegerakkan}=1{1 item (dan beberapa lagi pada peranti yang disegerakkan)}other{# item (dan beberapa lagi pada peranti yang disegerakkan)}}</translation>
 <translation id="3041612393474885105">Maklumat Sijil</translation>
 <translation id="3063697135517575841">Chrome tidak dapat mengesahkan kad anda pada masa ini. Sila cuba sebentar lagi.</translation>
 <translation id="3064966200440839136">Meninggalkan mod inkognito untuk membayar melalui aplikasi luar. Teruskan?</translation>
@@ -338,7 +336,6 @@
 <translation id="3681007416295224113">Maklumat sijil</translation>
 <translation id="3690164694835360974">Log masuk tidak selamat</translation>
 <translation id="3693415264595406141">Kata laluan:</translation>
-<translation id="3696411085566228381">tiada</translation>
 <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation>
 <translation id="370665806235115550">Memuatkan...</translation>
 <translation id="3712624925041724820">Kehabisan lesen</translation>
@@ -386,7 +383,6 @@
 <translation id="4171400957073367226">Tandatangan pengesahan tidak sah</translation>
 <translation id="4196861286325780578">&amp;Buat semula pindahkan</translation>
 <translation id="4203896806696719780"><ph name="BEGIN_LINK" />Menyemak konfigurasi tembok api dan antivirus<ph name="END_LINK" /></translation>
-<translation id="4206349416402437184">{COUNT,plural, =0{tiada}=1{1 apl ($1)}=2{2 apl ($1, $2)}other{# apl ($1, $2, $3)}}</translation>
 <translation id="4220128509585149162">Nahas</translation>
 <translation id="4226937834893929579"><ph name="BEGIN_LINK" />Cuba jalankan Diagnostik Rangkaian<ph name="END_LINK" />.</translation>
 <translation id="4250431568374086873">Sambungan anda ke tapak ini tidak selamat sepenuhnya</translation>
@@ -470,7 +466,6 @@
 <translation id="5045550434625856497">Kata laluan tidak sah</translation>
 <translation id="5056549851600133418">Artikel untuk anda</translation>
 <translation id="5070335125961472645"><ph name="BEGIN_LINK" />Menyemak alamat proksi<ph name="END_LINK" /></translation>
-<translation id="5076731569460970710">{COUNT,plural, =0{Tiada kuki}=1{1 tapak menggunakan kuki. }other{# tapak menggunakan kuki. }}</translation>
 <translation id="5087286274860437796">Sijil pelayan tidak sah pada masa ini.</translation>
 <translation id="5087580092889165836">Tambah kad</translation>
 <translation id="5089810972385038852">Negeri</translation>
@@ -602,7 +597,6 @@
 <translation id="6358450015545214790">Apakah maksudnya?</translation>
 <translation id="6386120369904791316">{COUNT,plural, =1{1 cadangan lain}other{# cadangan lain}}</translation>
 <translation id="6387478394221739770">Berminat dengan ciri Chrome baharu yang hebat? Cuba saluran beta kami di chrome.com/beta.</translation>
-<translation id="6389758589412724634">Chromium kehabisan memori semasa cuba memaparkan halaman web ini.</translation>
 <translation id="6404511346730675251">Edit penanda halaman</translation>
 <translation id="6410264514553301377">Masukkan tarikh tamat tempoh dan CVC untuk <ph name="CREDIT_CARD" /></translation>
 <translation id="6414888972213066896">Anda telah bertanya kepada ibu bapa anda sama ada OK untuk melawat tapak ini</translation>
@@ -625,7 +619,6 @@
 <translation id="6556915248009097796">Tamat: <ph name="EXPIRATION_DATE_ABBR" />, kali terakhir digunakan <ph name="LAST_USED_DATE_NO_DETAIL" /></translation>
 <translation id="6563469144985748109">Pengurus anda belum meluluskannya</translation>
 <translation id="6569060085658103619">Anda sedang melihat halaman sambungan</translation>
-<translation id="6593753688552673085">kurang daripada <ph name="UPPER_ESTIMATE" /></translation>
 <translation id="6596325263575161958">Pilihan penyulitan</translation>
 <translation id="662080504995468778">Kekal di sini</translation>
 <translation id="6626291197371920147">Tambahkan nombor kad yang sah</translation>
@@ -637,7 +630,6 @@
 <translation id="6710594484020273272">&lt;Taip istilah carian&gt;</translation>
 <translation id="6711464428925977395">Ada sesuatu yang tidak kena dengan pelayan proksi atau alamat tidak betul.</translation>
 <translation id="6727102863431372879">Tetapkan</translation>
-<translation id="6731320287533051140">{COUNT,plural, =0{tiada}=1{1 item}other{# item}}</translation>
 <translation id="674375294223700098">Ralat sijil pelayan tidak diketahui.</translation>
 <translation id="6753269504797312559">Nilai dasar</translation>
 <translation id="6757797048963528358">Peranti anda tidak aktif.</translation>
@@ -743,6 +735,7 @@
 <translation id="7669271284792375604">Penyerang pada tapak ini mungkin cuba menipu dengan meminta anda memasang atur cara yang membahayakan pengalaman penyemakan imbas anda (contohnya, dengan menukar halaman utama anda atau menunjukkan iklan tambahan pada laman yang anda lawati).</translation>
 <translation id="7674629440242451245">Berminat dengan ciri Chrome baharu yang hebat? Cuba saluran pembangun kami di chrome.com/dev.</translation>
 <translation id="7682287625158474539">Penghantaran</translation>
+<translation id="7701040980221191251">Tiada</translation>
 <translation id="7704050614460855821"><ph name="BEGIN_LINK" />Teruskan ke <ph name="SITE" /> (tidak selamat)<ph name="END_LINK" /></translation>
 <translation id="7714464543167945231">Sijil</translation>
 <translation id="7716424297397655342">Tapak ini tidak dapat dimuatkan daripada cache</translation>
@@ -782,7 +775,6 @@
 <translation id="8041089156583427627">Hantar Maklum Balas</translation>
 <translation id="8041940743680923270">Gunakan lalai global (Tanya)</translation>
 <translation id="8088680233425245692">Gagal melihat artikel.</translation>
-<translation id="8089520772729574115">kurang daripada 1 MB</translation>
 <translation id="8091372947890762290">Pengaktifan belum selesai pada pelayan</translation>
 <translation id="8118489163946903409">Kaedah pembayaran</translation>
 <translation id="8131740175452115882">Sahkan</translation>
diff --git a/components/strings/components_strings_nl.xtb b/components/strings/components_strings_nl.xtb
index 92fe2b2e..ecc38405 100644
--- a/components/strings/components_strings_nl.xtb
+++ b/components/strings/components_strings_nl.xtb
@@ -220,7 +220,6 @@
 <translation id="2826760142808435982">De verbinding is gecodeerd en geverifieerd met <ph name="CIPHER" /> en gebruikt <ph name="KX" /> als mechanisme voor sleuteluitwisseling.</translation>
 <translation id="2835170189407361413">Formulier leegmaken</translation>
 <translation id="2889159643044928134">Niet opnieuw laden</translation>
-<translation id="2900469785430194048">Google Chrome beschikt over onvoldoende geheugen om deze webpagina weer te geven.</translation>
 <translation id="2909946352844186028">Er is een netwerkwijziging gedetecteerd.</translation>
 <translation id="2916038427272391327">Andere programma's sluiten</translation>
 <translation id="2922350208395188000">Het servercertificaat kan niet worden gecontroleerd.</translation>
@@ -243,7 +242,6 @@
 <translation id="3024663005179499861">Onjuist beleidstype</translation>
 <translation id="3032412215588512954">Wil je deze site opnieuw laden?</translation>
 <translation id="3037605927509011580">Helaas.</translation>
-<translation id="3040955737384246924">{COUNT,plural, =0{ten minste 1 item op gesynchroniseerde apparaten}=1{1 item (en meer op gesynchroniseerde apparaten)}other{# items (en meer op gesynchroniseerde apparaten)}}</translation>
 <translation id="3041612393474885105">Certificaatgegevens</translation>
 <translation id="3063697135517575841">Chrome kan je creditcard momenteel niet bevestigen. Probeer het later opnieuw.</translation>
 <translation id="3064966200440839136">Je verlaat de incognitomodus om te betalen via een externe app. Doorgaan?</translation>
@@ -333,7 +331,6 @@
 <translation id="3681007416295224113">Certificaatgegevens</translation>
 <translation id="3690164694835360974">Inloggen niet veilig</translation>
 <translation id="3693415264595406141">Wachtwoord:</translation>
-<translation id="3696411085566228381">geen</translation>
 <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation>
 <translation id="370665806235115550">Bezig met laden...</translation>
 <translation id="3712624925041724820">Licenties zijn verbruikt</translation>
@@ -381,7 +378,6 @@
 <translation id="4171400957073367226">Onjuiste verificatiehandtekening</translation>
 <translation id="4196861286325780578">&amp;Opnieuw verplaatsen</translation>
 <translation id="4203896806696719780"><ph name="BEGIN_LINK" />Controleer firewall- en antivirusconfiguraties<ph name="END_LINK" /></translation>
-<translation id="4206349416402437184">{COUNT,plural, =0{geen}=1{1 app ($1)}=2{2 apps ($1, $2)}other{# apps ($1, $2, $3)}}</translation>
 <translation id="4220128509585149162">Crashes</translation>
 <translation id="4226937834893929579"><ph name="BEGIN_LINK" />Voer Netwerkcontrole uit<ph name="END_LINK" />.</translation>
 <translation id="4250431568374086873">Je verbinding met deze site is niet volledig veilig</translation>
@@ -465,7 +461,6 @@
 <translation id="5045550434625856497">Onjuist wachtwoord</translation>
 <translation id="5056549851600133418">Artikelen voor jou</translation>
 <translation id="5070335125961472645"><ph name="BEGIN_LINK" />Het proxy-adres controleren<ph name="END_LINK" /></translation>
-<translation id="5076731569460970710">{COUNT,plural, =0{Geen cookies}=1{1 site gebruikt cookies. }other{# sites gebruiken cookies. }}</translation>
 <translation id="5087286274860437796">Het servercertificaat is momenteel niet geldig.</translation>
 <translation id="5087580092889165836">Kaart toevoegen</translation>
 <translation id="5089810972385038852">Staat</translation>
@@ -596,7 +591,6 @@
 <translation id="6358450015545214790">Wat betekent dit?</translation>
 <translation id="6386120369904791316">{COUNT,plural, =1{1 andere suggestie}other{# andere suggesties}}</translation>
 <translation id="6387478394221739770">Ben je geïnteresseerd in nieuwe, coole Chrome-functies? Probeer ons bèta-kanaal op chrome.com/beta.</translation>
-<translation id="6389758589412724634">Chromium beschikt over onvoldoende geheugen om deze webpagina weer te geven.</translation>
 <translation id="6404511346730675251">Bladwijzer bewerken</translation>
 <translation id="6410264514553301377">Geef de vervaldatum en CVC-code op voor <ph name="CREDIT_CARD" /></translation>
 <translation id="6414888972213066896">Je hebt je ouder of voogd gevraagd of je deze site mag bezoeken</translation>
@@ -619,7 +613,6 @@
 <translation id="6556915248009097796">Vervaldatum: <ph name="EXPIRATION_DATE_ABBR" />, laatst gebruikt: <ph name="LAST_USED_DATE_NO_DETAIL" /></translation>
 <translation id="6563469144985748109">Je beheerder heeft dit nog niet goedgekeurd</translation>
 <translation id="6569060085658103619">Je bekijkt een extensiepagina</translation>
-<translation id="6593753688552673085">minder dan <ph name="UPPER_ESTIMATE" /></translation>
 <translation id="6596325263575161958">Opties voor encryptie</translation>
 <translation id="662080504995468778">Blijven</translation>
 <translation id="6626291197371920147">Een geldig kaartnummer toevoegen</translation>
@@ -631,7 +624,6 @@
 <translation id="6710594484020273272">&lt;Typ een zoekterm&gt;</translation>
 <translation id="6711464428925977395">Er is iets mis met de proxyserver of het adres is onjuist.</translation>
 <translation id="6727102863431372879">Instellen</translation>
-<translation id="6731320287533051140">{COUNT,plural, =0{geen}=1{1 item}other{# items}}</translation>
 <translation id="674375294223700098">Onbekende fout met servercertificaat.</translation>
 <translation id="6753269504797312559">Beleidswaarde</translation>
 <translation id="6757797048963528358">De slaapstand van je apparaat is geactiveerd.</translation>
@@ -737,6 +729,7 @@
 <translation id="7669271284792375604">Cybercriminelen op deze site proberen je mogelijk over te halen om programma's te installeren die schadelijk zijn voor de browsefunctionaliteit (door bijvoorbeeld je homepage te wijzigen of extra advertenties weer te geven op sites die je bezoekt).</translation>
 <translation id="7674629440242451245">Ben je geïnteresseerd in nieuwe, coole Chrome-functies? Probeer ons ontwikkelaarskanaal op chrome.com/dev.</translation>
 <translation id="7682287625158474539">Verzendadres</translation>
+<translation id="7701040980221191251">Geen</translation>
 <translation id="7704050614460855821"><ph name="BEGIN_LINK" />Doorgaan naar <ph name="SITE" /> (onveilig)<ph name="END_LINK" /></translation>
 <translation id="7714464543167945231">Certificaat</translation>
 <translation id="7716424297397655342">Deze site kan niet worden geladen vanuit het cachegeheugen</translation>
@@ -776,7 +769,6 @@
 <translation id="8041089156583427627">Feedback verzenden</translation>
 <translation id="8041940743680923270">Algemene standaardinstelling gebruiken (Vragen)</translation>
 <translation id="8088680233425245692">Kan artikel niet bekijken.</translation>
-<translation id="8089520772729574115">minder dan 1 MB</translation>
 <translation id="8091372947890762290">Activering is in behandeling op de server</translation>
 <translation id="8118489163946903409">Betaalmethode</translation>
 <translation id="8131740175452115882">Bevestigen</translation>
diff --git a/components/strings/components_strings_no.xtb b/components/strings/components_strings_no.xtb
index 16c42b8f..c290007 100644
--- a/components/strings/components_strings_no.xtb
+++ b/components/strings/components_strings_no.xtb
@@ -220,7 +220,6 @@
 <translation id="2826760142808435982">Tilkoblingen er kryptert ved hjelp av <ph name="CIPHER" />, og bruker <ph name="KX" /> som mekanisme for nøkkelutveksling.</translation>
 <translation id="2835170189407361413">Slett skjemaet</translation>
 <translation id="2889159643044928134">Ikke last inn på nytt</translation>
-<translation id="2900469785430194048">Google Chrome gikk tom for minne under forsøket på å vise denne nettsiden.</translation>
 <translation id="2909946352844186028">En nettverksendring ble oppdaget.</translation>
 <translation id="2916038427272391327">Lukk andre programmer</translation>
 <translation id="2922350208395188000">Tjenerens sertifikat kan ikke kontrolleres.</translation>
@@ -243,7 +242,6 @@
 <translation id="3024663005179499861">Feil type enhetsinnstillinger</translation>
 <translation id="3032412215588512954">Vil du laste inn dette nettstedet på nytt?</translation>
 <translation id="3037605927509011580">Æsj!</translation>
-<translation id="3040955737384246924">{COUNT,plural, =0{minst 1 element på synkroniserte enheter}=1{1 element (og flere på synkroniserte enheter)}other{# elementer (og flere på synkroniserte enheter)}}</translation>
 <translation id="3041612393474885105">Sertifikatinformasjon</translation>
 <translation id="3063697135517575841">Chrome kunne ikke bekrefte kortet ditt akkurat nå. Prøv igjen senere.</translation>
 <translation id="3064966200440839136">Går ut av inkognitomodus for å betale via en ekstern app. Vil du fortsette?</translation>
@@ -337,7 +335,6 @@
 <translation id="3681007416295224113">Sertifikatinformasjon</translation>
 <translation id="3690164694835360974">Påloggingen er ikke trygg</translation>
 <translation id="3693415264595406141">Passord:</translation>
-<translation id="3696411085566228381">ingen</translation>
 <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation>
 <translation id="370665806235115550">Laster inn ...</translation>
 <translation id="3712624925041724820">Lisensene er oppbrukt</translation>
@@ -385,7 +382,6 @@
 <translation id="4171400957073367226">Ugyldig bekreftelsessignatur</translation>
 <translation id="4196861286325780578">&amp;Flytt likevel</translation>
 <translation id="4203896806696719780"><ph name="BEGIN_LINK" />Sjekk brannmur- og antiviruskonfigurasjonen<ph name="END_LINK" /></translation>
-<translation id="4206349416402437184">{COUNT,plural, =0{ingen}=1{1 app ($1)}=2{2 apper ($1, $2)}other{# apper ($1, $2, $3)}}</translation>
 <translation id="4220128509585149162">Kræsj</translation>
 <translation id="4226937834893929579"><ph name="BEGIN_LINK" />Prøv å kjøre Nettverksdiagnose<ph name="END_LINK" />.</translation>
 <translation id="4250431568374086873">Tilkoblingen til dette nettstedet er ikke helt sikker</translation>
@@ -469,7 +465,6 @@
 <translation id="5045550434625856497">Feil passord</translation>
 <translation id="5056549851600133418">Artikler for deg</translation>
 <translation id="5070335125961472645"><ph name="BEGIN_LINK" />Sjekk proxy-tjeneradressen<ph name="END_LINK" /></translation>
-<translation id="5076731569460970710">{COUNT,plural, =0{Ingen informasjonskapsler}=1{1 nettsted bruker informasjonskapsler }other{# nettsteder bruker informasjonskapsler }}</translation>
 <translation id="5087286274860437796">Sertifikatet til tjeneren er ikke gyldig for øyeblikket.</translation>
 <translation id="5087580092889165836">Legg til et kort</translation>
 <translation id="5089810972385038852">Fylke / delstat</translation>
@@ -601,7 +596,6 @@
 <translation id="6358450015545214790">Hva innebærer dette?</translation>
 <translation id="6386120369904791316">{COUNT,plural, =1{1 annet forslag}other{# andre forslag}}</translation>
 <translation id="6387478394221739770">Interessert i nye kule Chrome-funksjoner? Prøv betakanalen vår på chrome.com/beta</translation>
-<translation id="6389758589412724634">Chromium gikk tom for minne under forsøket på å vise denne nettsiden.</translation>
 <translation id="6404511346730675251">Rediger bokmerket</translation>
 <translation id="6410264514553301377">Skriv inn utløpsdatoen og verifiseringskoden for <ph name="CREDIT_CARD" /></translation>
 <translation id="6414888972213066896">Du har spurt forelderen din om det er greit å besøke dette nettstedet</translation>
@@ -624,7 +618,6 @@
 <translation id="6556915248009097796">Utløper: <ph name="EXPIRATION_DATE_ABBR" />. Sist brukt: <ph name="LAST_USED_DATE_NO_DETAIL" /></translation>
 <translation id="6563469144985748109">Administratoren din har ikke godkjent det ennå</translation>
 <translation id="6569060085658103619">Du ser på en utvidelsesside</translation>
-<translation id="6593753688552673085">mindre enn <ph name="UPPER_ESTIMATE" /></translation>
 <translation id="6596325263575161958">Krypteringsalternativer</translation>
 <translation id="662080504995468778">Bli her</translation>
 <translation id="6626291197371920147">Legg til et gyldig kortnummer</translation>
@@ -636,7 +629,6 @@
 <translation id="6710594484020273272">&lt;Skriv inn en søketerm&gt;</translation>
 <translation id="6711464428925977395">Det er noe galt med proxy-tjeneren, eller adressen er feil.</translation>
 <translation id="6727102863431372879">Angi</translation>
-<translation id="6731320287533051140">{COUNT,plural, =0{ingen}=1{1 element}other{# elementer}}</translation>
 <translation id="674375294223700098">Ukjent feil med tjenersertifikat.</translation>
 <translation id="6753269504797312559">Retningslinjeverdi</translation>
 <translation id="6757797048963528358">Enheten din gikk inn i hvilemodus.</translation>
@@ -742,6 +734,7 @@
 <translation id="7669271284792375604">Angripere på dette nettstedet kan forsøke å lure deg til å installere programmer som ødelegger surfeopplevelsen din (for eksempel ved å endre startsiden din eller vise ekstra annonser på nettstedene du besøker).</translation>
 <translation id="7674629440242451245">Interessert i nye kule Chrome-funksjoner? Prøv utviklerkanalen vår på chrome.com/dev</translation>
 <translation id="7682287625158474539">Forsendelse</translation>
+<translation id="7701040980221191251">Ingen</translation>
 <translation id="7704050614460855821"><ph name="BEGIN_LINK" />Fortsett til <ph name="SITE" /> (usikker side)<ph name="END_LINK" /></translation>
 <translation id="7714464543167945231">Sertifikat</translation>
 <translation id="7716424297397655342">Dette nettstedet kan ikke lastes inn fra bufferen</translation>
@@ -781,7 +774,6 @@
 <translation id="8041089156583427627">Send tilbakemelding</translation>
 <translation id="8041940743680923270">Bruk global standardinnstilling (Spør)</translation>
 <translation id="8088680233425245692">Kunne ikke åpne artikkelen.</translation>
-<translation id="8089520772729574115">under 1 MB</translation>
 <translation id="8091372947890762290">Aktivering venter på tjeneren</translation>
 <translation id="8118489163946903409">Betalingsmåte</translation>
 <translation id="8131740175452115882">Bekreft</translation>
diff --git a/components/strings/components_strings_pl.xtb b/components/strings/components_strings_pl.xtb
index e21580b..3372acc 100644
--- a/components/strings/components_strings_pl.xtb
+++ b/components/strings/components_strings_pl.xtb
@@ -220,7 +220,6 @@
 <translation id="2826760142808435982">Połączenie jest szyfrowane i uwierzytelniane algorytmem <ph name="CIPHER" />, a mechanizm wymiany kluczy to <ph name="KX" />.</translation>
 <translation id="2835170189407361413">Wyczyść formularz</translation>
 <translation id="2889159643044928134">Nie ładuj ponownie</translation>
-<translation id="2900469785430194048">Podczas próby wyświetlenia tej strony w Google Chrome zabrakło pamięci.</translation>
 <translation id="2909946352844186028">Wykryto zmianę sieci.</translation>
 <translation id="2916038427272391327">Zamknij inne programy</translation>
 <translation id="2922350208395188000">Nie można sprawdzić certyfikatu serwera.</translation>
@@ -243,7 +242,6 @@
 <translation id="3024663005179499861">Nieprawidłowy typ zasady</translation>
 <translation id="3032412215588512954">Chcesz ponownie załadować tę stronę?</translation>
 <translation id="3037605927509011580">Kurza twarz!</translation>
-<translation id="3040955737384246924">{COUNT,plural, =0{co najmniej 1 element na synchronizowanych urządzeniach}=1{1 element (i więcej na synchronizowanych urządzeniach)}few{# elementy (i więcej na synchronizowanych urządzeniach)}many{# elementów (i więcej na synchronizowanych urządzeniach)}other{# elementu (i więcej na synchronizowanych urządzeniach)}}</translation>
 <translation id="3041612393474885105">Informacje o certyfikacie</translation>
 <translation id="3063697135517575841">Chrome nie może obecnie potwierdzić karty. Spróbuj ponownie później.</translation>
 <translation id="3064966200440839136">Opuszczasz tryb incognito, by zapłacić w aplikacji zewnętrznej. Kontynuować?</translation>
@@ -337,7 +335,6 @@
 <translation id="3681007416295224113">Informacje o certyfikacie</translation>
 <translation id="3690164694835360974">Logowanie nie jest bezpieczne</translation>
 <translation id="3693415264595406141">Hasło:</translation>
-<translation id="3696411085566228381">brak</translation>
 <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation>
 <translation id="370665806235115550">Ładuję...</translation>
 <translation id="3712624925041724820">Brak wolnych licencji</translation>
@@ -385,7 +382,6 @@
 <translation id="4171400957073367226">Nieprawidłowy podpis weryfikujący</translation>
 <translation id="4196861286325780578">&amp;Ponów przeniesienie</translation>
 <translation id="4203896806696719780"><ph name="BEGIN_LINK" />Sprawdź konfigurację zapory sieciowej i oprogramowania antywirusowego<ph name="END_LINK" /></translation>
-<translation id="4206349416402437184">{COUNT,plural, =0{brak}=1{1 aplikacja ($1)}=2{2 aplikacje ($1, $2)}few{# aplikacje ($1, $2, $3)}many{# aplikacji ($1, $2, $3)}other{# aplikacji ($1, $2, $3)}}</translation>
 <translation id="4220128509585149162">Awarie</translation>
 <translation id="4226937834893929579"><ph name="BEGIN_LINK" />Uruchom diagnostykę sieci<ph name="END_LINK" />.</translation>
 <translation id="4250431568374086873">Twoje połączenie z tą witryną nie jest w pełni bezpieczne</translation>
@@ -469,7 +465,6 @@
 <translation id="5045550434625856497">Nieprawidłowe hasło</translation>
 <translation id="5056549851600133418">Artykuły dla Ciebie</translation>
 <translation id="5070335125961472645"><ph name="BEGIN_LINK" />Sprawdź adres serwera proxy<ph name="END_LINK" /></translation>
-<translation id="5076731569460970710">{COUNT,plural, =0{Bez plików cookie}=1{1 strona używa plików cookie. }few{# strony używają plików cookie. }many{# stron używa plików cookie. }other{# strony używa plików cookie. }}</translation>
 <translation id="5087286274860437796">Certyfikat serwera nie jest obecnie ważny.</translation>
 <translation id="5087580092889165836">Dodaj kartę</translation>
 <translation id="5089810972385038852">Stan</translation>
@@ -601,7 +596,6 @@
 <translation id="6358450015545214790">Co to oznacza?</translation>
 <translation id="6386120369904791316">{COUNT,plural, =1{1 inna podpowiedź}few{# inne podpowiedzi}many{# innych podpowiedzi}other{# innej podpowiedzi}}</translation>
 <translation id="6387478394221739770">Interesują Cię nowe, przydatne funkcje Chrome? Wypróbuj wersję beta ze strony chrome.com/beta.</translation>
-<translation id="6389758589412724634">Podczas próby wyświetlenia tej strony w Chromium zabrakło pamięci.</translation>
 <translation id="6404511346730675251">Edytuj zakładkę</translation>
 <translation id="6410264514553301377">Wpisz datę ważności i kod CVC karty <ph name="CREDIT_CARD" /></translation>
 <translation id="6414888972213066896">Zapytałeś rodzica, czy możesz odwiedzić tę stronę</translation>
@@ -624,7 +618,6 @@
 <translation id="6556915248009097796">Data ważności: <ph name="EXPIRATION_DATE_ABBR" />, ostatnio używana: <ph name="LAST_USED_DATE_NO_DETAIL" /></translation>
 <translation id="6563469144985748109">Twój menedżer jeszcze na to nie zezwolił</translation>
 <translation id="6569060085658103619">Przeglądasz stronę rozszerzenia</translation>
-<translation id="6593753688552673085">mniej niż <ph name="UPPER_ESTIMATE" /></translation>
 <translation id="6596325263575161958">Opcje szyfrowania</translation>
 <translation id="662080504995468778">Zostań</translation>
 <translation id="6626291197371920147">Dodaj prawidłowy numer karty</translation>
@@ -636,7 +629,6 @@
 <translation id="6710594484020273272">&lt;Wpisz wyszukiwane słowa&gt;</translation>
 <translation id="6711464428925977395">Serwer proxy działa nieprawidłowo albo adres jest błędny.</translation>
 <translation id="6727102863431372879">Ustaw</translation>
-<translation id="6731320287533051140">{COUNT,plural, =0{brak}=1{1 element}few{# elementy}many{# elementów}other{# elementu}}</translation>
 <translation id="674375294223700098">Nieznany błąd certyfikatu serwera.</translation>
 <translation id="6753269504797312559">Wartość zasady</translation>
 <translation id="6757797048963528358">Twoje urządzenie przeszło w tryb uśpienia.</translation>
@@ -742,6 +734,7 @@
 <translation id="7669271284792375604">Osoby atakujące tę stronę mogą podstępem próbować nakłonić Cię do zainstalowania programów utrudniających przeglądanie internetu (np. zmieniających stronę główną lub wyświetlających dodatkowe reklamy na stronach, na które wchodzisz).</translation>
 <translation id="7674629440242451245">Interesują Cię nowe, przydatne funkcje Chrome? Wypróbuj wersję deweloperską ze strony chrome.com/dev.</translation>
 <translation id="7682287625158474539">Adres wysyłkowy</translation>
+<translation id="7701040980221191251">Brak</translation>
 <translation id="7704050614460855821"><ph name="BEGIN_LINK" />Otwórz stronę <ph name="SITE" /> (niebezpieczną)<ph name="END_LINK" /></translation>
 <translation id="7714464543167945231">Certyfikat</translation>
 <translation id="7716424297397655342">Nie można załadować tej strony z pamięci podręcznej</translation>
@@ -781,7 +774,6 @@
 <translation id="8041089156583427627">Prześlij opinię</translation>
 <translation id="8041940743680923270">Użyj globalnej wartości domyślnej (Pytaj)</translation>
 <translation id="8088680233425245692">Nie udało się wyświetlić artykułu.</translation>
-<translation id="8089520772729574115">mniej niż 1 MB</translation>
 <translation id="8091372947890762290">Aktywacja oczekuje na serwerze</translation>
 <translation id="8118489163946903409">Forma płatności</translation>
 <translation id="8131740175452115882">Potwierdź</translation>
diff --git a/components/strings/components_strings_pt-BR.xtb b/components/strings/components_strings_pt-BR.xtb
index ad01b62..e4229b7 100644
--- a/components/strings/components_strings_pt-BR.xtb
+++ b/components/strings/components_strings_pt-BR.xtb
@@ -220,7 +220,6 @@
 <translation id="2826760142808435982">A conexão foi criptografada e autenticada utilizando <ph name="CIPHER" /> e usa <ph name="KX" /> como o mecanismo de troca de chave.</translation>
 <translation id="2835170189407361413">Limpar formulário</translation>
 <translation id="2889159643044928134">Não atualizar</translation>
-<translation id="2900469785430194048">O Google Chrome ficou sem memória ao tentar exibir essa página da Web.</translation>
 <translation id="2909946352844186028">Foi detectada uma alteração na rede.</translation>
 <translation id="2916038427272391327">Fechar outros programas</translation>
 <translation id="2922350208395188000">O certificado do servidor não pode ser verificado.</translation>
@@ -243,7 +242,6 @@
 <translation id="3024663005179499861">Tipo de política incorreto</translation>
 <translation id="3032412215588512954">Deseja atualizar este site?</translation>
 <translation id="3037605927509011580">Ah, não!</translation>
-<translation id="3040955737384246924">{COUNT,plural, =0{pelo menos 1 item em dispositivos sincronizados}=1{1 item (e mais em dispositivos sincronizados)}one{# items (and more on synced devices)}other{# itens (e mais em dispositivos sincronizados)}}</translation>
 <translation id="3041612393474885105">Informações do certificado</translation>
 <translation id="3063697135517575841">Não foi possível confirmar seu cartão com o Chrome no momento. Tente novamente mais tarde.</translation>
 <translation id="3064966200440839136">Saindo do modo de navegação anônima para pagar usando um aplicativo externo. Continuar?</translation>
@@ -337,7 +335,6 @@
 <translation id="3681007416295224113">Informações do certificado</translation>
 <translation id="3690164694835360974">Login não seguro</translation>
 <translation id="3693415264595406141">Senha:</translation>
-<translation id="3696411085566228381">nenhum</translation>
 <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation>
 <translation id="370665806235115550">Carregando...</translation>
 <translation id="3712624925041724820">Licenças esgotadas</translation>
@@ -385,7 +382,6 @@
 <translation id="4171400957073367226">Assinatura de verificação inválida</translation>
 <translation id="4196861286325780578">&amp;Refazer mover</translation>
 <translation id="4203896806696719780"><ph name="BEGIN_LINK" />Verificar as configurações do antivírus e firewall<ph name="END_LINK" /></translation>
-<translation id="4206349416402437184">{COUNT,plural, =0{nenhum}=1{1 app ($1)}=2{2 apps ($1, $2)}one{# apps ($1, $2, $3)}other{# apps ($1, $2, $3)}}</translation>
 <translation id="4220128509585149162">Falhas</translation>
 <translation id="4226937834893929579"><ph name="BEGIN_LINK" />Tente executar o Diagnóstico de Rede<ph name="END_LINK" />.</translation>
 <translation id="4250431568374086873">Sua conexão com esse site não é completamente segura</translation>
@@ -469,7 +465,6 @@
 <translation id="5045550434625856497">Senha incorreta</translation>
 <translation id="5056549851600133418">Artigos para você</translation>
 <translation id="5070335125961472645"><ph name="BEGIN_LINK" />Verificar o endereço do proxy<ph name="END_LINK" /></translation>
-<translation id="5076731569460970710">{COUNT,plural, =0{Sem cookies}=1{1 site usa cookies. }one{# sites use cookies. }other{# sites usam cookies. }}</translation>
 <translation id="5087286274860437796">O certificado do servidor não é válido no momento.</translation>
 <translation id="5087580092889165836">Adicionar cartão</translation>
 <translation id="5089810972385038852">Estado</translation>
@@ -601,7 +596,6 @@
 <translation id="6358450015545214790">O que são essas informações?</translation>
 <translation id="6386120369904791316">{COUNT,plural, =1{1 outra sugestão}one{# outra sugestão}other{# outras sugestões}}</translation>
 <translation id="6387478394221739770">Interessado em novos recursos interessantes do Google Chrome? Veja nosso Canal Beta em chrome.com/beta.</translation>
-<translation id="6389758589412724634">O Chromium ficou sem memória ao tentar exibir essa página da Web.</translation>
 <translation id="6404511346730675251">Editar favorito</translation>
 <translation id="6410264514553301377">Digite a data de validade e o CVC do <ph name="CREDIT_CARD" /></translation>
 <translation id="6414888972213066896">Você perguntou ao seu responsável se pode visitar este site</translation>
@@ -624,7 +618,6 @@
 <translation id="6556915248009097796">Validade: <ph name="EXPIRATION_DATE_ABBR" />, usado pela última vez em: <ph name="LAST_USED_DATE_NO_DETAIL" /></translation>
 <translation id="6563469144985748109">Seu administrador ainda não o aprovou</translation>
 <translation id="6569060085658103619">Você está vendo uma página de extensões</translation>
-<translation id="6593753688552673085">menos que <ph name="UPPER_ESTIMATE" /></translation>
 <translation id="6596325263575161958">Opções de criptografia</translation>
 <translation id="662080504995468778">Ficar</translation>
 <translation id="6626291197371920147">Adicionar número de cartão de crédito válido</translation>
@@ -636,7 +629,6 @@
 <translation id="6710594484020273272">&lt;Digitar termo de pesquisa&gt;</translation>
 <translation id="6711464428925977395">Há algo errado com o servidor proxy, ou o endereço está incorreto.</translation>
 <translation id="6727102863431372879">Definir</translation>
-<translation id="6731320287533051140">{COUNT,plural, =0{nenhum}=1{1 item}one{# items}other{# itens}}</translation>
 <translation id="674375294223700098">Erro, certificado de servidor desconhecido.</translation>
 <translation id="6753269504797312559">Valor da política</translation>
 <translation id="6757797048963528358">O dispositivo entrou em modo de suspensão.</translation>
@@ -742,6 +734,7 @@
 <translation id="7669271284792375604">Invasores nesse site podem tentar enganar você para que instale programas que prejudicam sua experiência de navegação (por exemplo, alterando sua página inicial ou mostrando mais anúncios nos sites que você visita).</translation>
 <translation id="7674629440242451245">Interessado em novos recursos interessantes do Google Chrome? Veja nosso Canal Dev em chrome.com/dev.</translation>
 <translation id="7682287625158474539">Entrega</translation>
+<translation id="7701040980221191251">Nenhum</translation>
 <translation id="7704050614460855821"><ph name="BEGIN_LINK" />Ir para <ph name="SITE" /> (não seguro)<ph name="END_LINK" /></translation>
 <translation id="7714464543167945231">Certificado</translation>
 <translation id="7716424297397655342">Não é possível carregar este site a partir do cache</translation>
@@ -781,7 +774,6 @@
 <translation id="8041089156583427627">Enviar comentários</translation>
 <translation id="8041940743680923270">Usar padrão global (Perguntar)</translation>
 <translation id="8088680233425245692">Falha ao exibir artigo.</translation>
-<translation id="8089520772729574115">menos de 1 MB</translation>
 <translation id="8091372947890762290">A ativação está pendente no servidor</translation>
 <translation id="8118489163946903409">Método de pagamento</translation>
 <translation id="8131740175452115882">Confirmar</translation>
diff --git a/components/strings/components_strings_pt-PT.xtb b/components/strings/components_strings_pt-PT.xtb
index eee4869..49c4ef80 100644
--- a/components/strings/components_strings_pt-PT.xtb
+++ b/components/strings/components_strings_pt-PT.xtb
@@ -46,7 +46,7 @@
 <translation id="129863573139666797"><ph name="BEGIN_LINK" />Experimente limpar os cookies<ph name="END_LINK" /></translation>
 <translation id="1333989956347591814">A sua atividade <ph name="BEGIN_EMPHASIS" />poderá continuar visível<ph name="END_EMPHASIS" /> para:
         <ph name="BEGIN_LIST" />
-          <ph name="LIST_ITEM" />Os Websites que visita
+          <ph name="LIST_ITEM" />Os Sites que visita
           <ph name="LIST_ITEM" />A sua entidade empregadora ou escola
           <ph name="LIST_ITEM" />O seu fornecedor de serviços de Internet
         <ph name="END_LIST" /></translation>
@@ -215,12 +215,11 @@
 <translation id="277499241957683684">Registo do dispositivo em falta</translation>
 <translation id="2784949926578158345">A ligação foi reposta.</translation>
 <translation id="2794233252405721443">Site bloqueado</translation>
-<translation id="2803306138276472711">A Navegação Segura do Google <ph name="BEGIN_LINK" />detetou software malicioso<ph name="END_LINK" /> recentemente em <ph name="SITE" />. Os Websites que normalmente são seguros por vezes são infetados com software malicioso.</translation>
+<translation id="2803306138276472711">A Navegação Segura do Google <ph name="BEGIN_LINK" />detetou software malicioso<ph name="END_LINK" /> recentemente em <ph name="SITE" />. Os Sites que normalmente são seguros por vezes são infetados com software malicioso.</translation>
 <translation id="2824775600643448204">Barra de pesquisa e endereço</translation>
 <translation id="2826760142808435982">A ligação é encriptada e autenticada com <ph name="CIPHER" /> e utiliza <ph name="KX" /> como mecanismo de troca de chaves.</translation>
 <translation id="2835170189407361413">Limpar formulário</translation>
 <translation id="2889159643044928134">Não atualizar</translation>
-<translation id="2900469785430194048">O Google Chrome ficou sem memória ao tentar apresentar esta página Web.</translation>
 <translation id="2909946352844186028">Foi detetada uma alteração de rede.</translation>
 <translation id="2916038427272391327">Fechar outros programas</translation>
 <translation id="2922350208395188000">Não é possível verificar o certificado do servidor.</translation>
@@ -230,12 +229,12 @@
 <translation id="2955913368246107853">Fechar barra de localização</translation>
 <translation id="2958431318199492670">A configuração de rede não cumpre a norma ONC. Partes da configuração podem não ser importadas.</translation>
 <translation id="2966678944701946121">Exp.: <ph name="EXPIRATION_DATE_ABBR" />, adicionado a <ph name="ADDED_TO_AUTOFILL_MONTH" /></translation>
-<translation id="2969319727213777354">Para estabelecer uma ligação segura, o relógio tem de ser definido corretamente. Isto deve-se ao facto de os certificados que os Websites utilizam para se identificarem serem apenas válidos para períodos de tempo específicos. Uma vez que o relógio do seu dispositivo está incorreto, o Google Chrome não consegue validar estes certificados.</translation>
+<translation id="2969319727213777354">Para estabelecer uma ligação segura, o relógio tem de ser definido corretamente. Isto deve-se ao facto de os certificados que os Sites utilizam para se identificarem serem apenas válidos para períodos de tempo específicos. Uma vez que o relógio do seu dispositivo está incorreto, o Google Chrome não consegue validar estes certificados.</translation>
 <translation id="2972581237482394796">&amp;Repetir</translation>
 <translation id="2985306909656435243">Se ativada, o Chromium armazena uma cópia do seu cartão neste dispositivo para preencher formulários mais rapidamente.</translation>
 <translation id="2985398929374701810">Introduza um endereço válido</translation>
 <translation id="2986368408720340940">Este método de recolha não está disponível. Experimente um método diferente.</translation>
-<translation id="2991174974383378012">Partilha com Websites</translation>
+<translation id="2991174974383378012">Partilha com Sites</translation>
 <translation id="3005723025932146533">Mostrar cópia guardada</translation>
 <translation id="3008447029300691911">Introduza o Código de Segurança/CVC de <ph name="CREDIT_CARD" />. Ao confirmar, os detalhes do cartão são partilhados com este site.</translation>
 <translation id="3010559122411665027">Entrada da lista "<ph name="ENTRY_INDEX" />": <ph name="ERROR" /></translation>
@@ -243,7 +242,6 @@
 <translation id="3024663005179499861">Tipo de política incorreto</translation>
 <translation id="3032412215588512954">Pretende atualizar este site?</translation>
 <translation id="3037605927509011580">Ah, bolas!!</translation>
-<translation id="3040955737384246924">{COUNT,plural, =0{pelo menos 1 item em dispositivos sincronizados}=1{1 item (e mais em dispositivos sincronizados)}one{# items (and more on synced devices)}other{# itens (e mais em dispositivos sincronizados)}}</translation>
 <translation id="3041612393474885105">Informações do certificado</translation>
 <translation id="3063697135517575841">O Chrome não conseguiu confirmar o seu cartão neste momento. Tente novamente mais tarde.</translation>
 <translation id="3064966200440839136">Está a sair do modo de navegação anónima para pagar através de uma aplicação externa. Pretende continuar?</translation>
@@ -337,7 +335,6 @@
 <translation id="3681007416295224113">Informações do certificado</translation>
 <translation id="3690164694835360974">Início de sessão não seguro</translation>
 <translation id="3693415264595406141">Palavra-passe:</translation>
-<translation id="3696411085566228381">nenhuns</translation>
 <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation>
 <translation id="370665806235115550">A carregar...</translation>
 <translation id="3712624925041724820">Licenças esgotadas</translation>
@@ -385,7 +382,6 @@
 <translation id="4171400957073367226">Assinatura de verificação incorreta</translation>
 <translation id="4196861286325780578">&amp;Refazer movimentação</translation>
 <translation id="4203896806696719780"><ph name="BEGIN_LINK" />Verificar as configurações da firewall e de antivírus<ph name="END_LINK" /></translation>
-<translation id="4206349416402437184">{COUNT,plural, =0{nenhuma}=1{1 aplicação ($1)}=2{2 aplicações ($1, $2)}one{# apps ($1, $2, $3)}other{# aplicações ($1, $2, $3)}}</translation>
 <translation id="4220128509585149162">Erros</translation>
 <translation id="4226937834893929579"><ph name="BEGIN_LINK" />Experimente executar o Diagnóstico de rede<ph name="END_LINK" />.</translation>
 <translation id="4250431568374086873">A ligação a este site não é totalmente segura</translation>
@@ -469,7 +465,6 @@
 <translation id="5045550434625856497">Palavra-passe incorrecta</translation>
 <translation id="5056549851600133418">Artigos para si</translation>
 <translation id="5070335125961472645"><ph name="BEGIN_LINK" />Verificar o endereço proxy<ph name="END_LINK" /></translation>
-<translation id="5076731569460970710">{COUNT,plural, =0{Sem cookies}=1{1 site utiliza cookies. }one{# sites use cookies. }other{# sites utilizam cookies. }}</translation>
 <translation id="5087286274860437796">De momento, o certificado do servidor não é válido.</translation>
 <translation id="5087580092889165836">Adicionar cartão</translation>
 <translation id="5089810972385038852">Estado</translation>
@@ -579,7 +574,7 @@
 <translation id="6184817833369986695">(grupo com caraterísticas em comum: <ph name="UPDATE_COHORT_NAME" />)</translation>
 <translation id="6203231073485539293">Verificar a ligação à Internet</translation>
 <translation id="6218753634732582820">Pretende remover o endereço do Chromium?</translation>
-<translation id="6221345481584921695">A Navegação Segura do Google <ph name="BEGIN_LINK" />detetou software malicioso<ph name="END_LINK" /> recentemente em <ph name="SITE" />. Os Websites que normalmente são seguros por vezes são infetados com software malicioso. O conteúdo malicioso provém de <ph name="SUBRESOURCE_HOST" />, um distribuidor de software malicioso conhecido.</translation>
+<translation id="6221345481584921695">A Navegação Segura do Google <ph name="BEGIN_LINK" />detetou software malicioso<ph name="END_LINK" /> recentemente em <ph name="SITE" />. Os Sites que normalmente são seguros por vezes são infetados com software malicioso. O conteúdo malicioso provém de <ph name="SUBRESOURCE_HOST" />, um distribuidor de software malicioso conhecido.</translation>
 <translation id="6251924700383757765">Política de privacidade</translation>
 <translation id="6254436959401408446">Não existe memória suficiente para abrir esta página</translation>
 <translation id="625755898061068298">Optou por desativar os avisos de segurança para este site.</translation>
@@ -601,7 +596,6 @@
 <translation id="6358450015545214790">O que significam?</translation>
 <translation id="6386120369904791316">{COUNT,plural, =1{1 outra sugestão}one{# other suggestions}other{# outras sugestões}}</translation>
 <translation id="6387478394221739770">Está interessado nas novas e fantásticas funcionalidades do Chrome? Experimente o nosso canal beta em chrome.com/beta.</translation>
-<translation id="6389758589412724634">O Chromium ficou sem memória ao tentar apresentar esta página Web.</translation>
 <translation id="6404511346730675251">Editar marcador</translation>
 <translation id="6410264514553301377">Introduza a data de validade e o Código de Segurança/CVC de <ph name="CREDIT_CARD" /></translation>
 <translation id="6414888972213066896">Perguntaste ao teu pai/à tua mãe se podes aceder a este site.</translation>
@@ -624,7 +618,6 @@
 <translation id="6556915248009097796">Exp.: <ph name="EXPIRATION_DATE_ABBR" />, última utilização a <ph name="LAST_USED_DATE_NO_DETAIL" /></translation>
 <translation id="6563469144985748109">O seu administrador ainda não o aprovou</translation>
 <translation id="6569060085658103619">Está a ver a página de uma extensão</translation>
-<translation id="6593753688552673085">menos de <ph name="UPPER_ESTIMATE" /></translation>
 <translation id="6596325263575161958">Opções de encriptação</translation>
 <translation id="662080504995468778">Ficar</translation>
 <translation id="6626291197371920147">Adicionar número de cartão válido</translation>
@@ -636,7 +629,6 @@
 <translation id="6710594484020273272">&lt;Introduzir termo de pesquisa&gt;</translation>
 <translation id="6711464428925977395">Existe um problema com o servidor proxy ou o endereço está incorreto.</translation>
 <translation id="6727102863431372879">Definir</translation>
-<translation id="6731320287533051140">{COUNT,plural, =0{nenhuma}=1{1 item}one{# items}other{# itens}}</translation>
 <translation id="674375294223700098">Erro de certificado de servidor desconhecido.</translation>
 <translation id="6753269504797312559">Valor da política</translation>
 <translation id="6757797048963528358">O dispositivo entrou em suspensão.</translation>
@@ -742,6 +734,7 @@
 <translation id="7669271284792375604">Os utilizadores mal intencionados neste site podem tentar enganá-lo para instalar programas que são prejudiciais para a sua experiência de navegação (por exemplo, ao alterar a sua página inicial ou ao mostrar anúncios adicionais em sites que visita).</translation>
 <translation id="7674629440242451245">Está interessado nas novas e fantásticas funcionalidades do Chrome? Experimente o nosso canal para programadores em chrome.com/dev.</translation>
 <translation id="7682287625158474539">Envio</translation>
+<translation id="7701040980221191251">Nenhum</translation>
 <translation id="7704050614460855821"><ph name="BEGIN_LINK" />Prosseguir para <ph name="SITE" /> (não seguro)<ph name="END_LINK" /></translation>
 <translation id="7714464543167945231">Certificado</translation>
 <translation id="7716424297397655342">Não é possível carregar este site a partir da cache</translation>
@@ -760,7 +753,7 @@
 <translation id="7812922009395017822">Mir</translation>
 <translation id="7813600968533626083">Pretende remover a sugestão do formulário do Chrome?</translation>
 <translation id="7815407501681723534">Encontrados <ph name="NUMBER_OF_RESULTS" /> <ph name="SEARCH_RESULTS" /> para "<ph name="SEARCH_STRING" />"</translation>
-<translation id="785549533363645510">No entanto, a navegação não é invisível. Passar para o modo de navegação anónima não oculta a navegação do empregador ou do fornecedor de serviços de Internet, nem dos Websites que visitar.</translation>
+<translation id="785549533363645510">No entanto, a navegação não é invisível. Passar para o modo de navegação anónima não oculta a navegação do empregador ou do fornecedor de serviços de Internet, nem dos Sites que visitar.</translation>
 <translation id="7855695075675558090"><ph name="TOTAL_LABEL" /> <ph name="CURRENCY_CODE" /> <ph name="FORMATTED_TOTAL_AMOUNT" /></translation>
 <translation id="7887683347370398519">Verifique o Código de Segurança/CVC e tente novamente</translation>
 <translation id="79338296614623784">Introduza um número de telefone válido</translation>
@@ -781,7 +774,6 @@
 <translation id="8041089156583427627">Enviar comentários</translation>
 <translation id="8041940743680923270">Utilizar predefinição global (Perguntar)</translation>
 <translation id="8088680233425245692">Falha ao ver o artigo.</translation>
-<translation id="8089520772729574115">menos de 1 MB</translation>
 <translation id="8091372947890762290">Ativação pendente no servidor</translation>
 <translation id="8118489163946903409">Método de pagamento</translation>
 <translation id="8131740175452115882">Confirmar</translation>
@@ -816,7 +808,7 @@
 <translation id="8412145213513410671">Falhas (<ph name="CRASH_COUNT" />)</translation>
 <translation id="8412392972487953978">Tem de introduzir a mesma frase de acesso duas vezes.</translation>
 <translation id="8428213095426709021">Definições</translation>
-<translation id="8433057134996913067">Esta opção termina a sessão na maioria dos Websites.</translation>
+<translation id="8433057134996913067">Esta opção termina a sessão na maioria dos Sites.</translation>
 <translation id="8437238597147034694">&amp;Anular movimentação</translation>
 <translation id="8466379296835108687">{COUNT,plural, =1{1 cartão de crédito}one{# credit cards}other{# cartões de crédito}}</translation>
 <translation id="8483780878231876732">Para utilizar cartões da sua Conta Google, inicie sessão no Chrome.</translation>
@@ -836,7 +828,7 @@
 <translation id="8725066075913043281">Tentar novamente</translation>
 <translation id="8728672262656704056">Está anónimo</translation>
 <translation id="8730621377337864115">Concluído</translation>
-<translation id="8738058698779197622">Para estabelecer uma ligação segura, o relógio tem de ser definido corretamente. Isto deve-se ao facto de os certificados que os Websites utilizam para se identificarem serem apenas válidos para períodos de tempo específicos. Uma vez que o relógio do seu dispositivo está incorreto, o Chromium não consegue validar estes certificados.</translation>
+<translation id="8738058698779197622">Para estabelecer uma ligação segura, o relógio tem de ser definido corretamente. Isto deve-se ao facto de os certificados que os Sites utilizam para se identificarem serem apenas válidos para períodos de tempo específicos. Uma vez que o relógio do seu dispositivo está incorreto, o Chromium não consegue validar estes certificados.</translation>
 <translation id="8740359287975076522">Não foi possível encontrar o &lt;abbr id="dnsDefinition"&gt;endereço DNS&lt;/abbr&gt; de <ph name="HOST_NAME" />. Estamos a diagnosticar o problema.</translation>
 <translation id="8759274551635299824">Este cartão expirou</translation>
 <translation id="8761567432415473239">A Navegação Segura do Google <ph name="BEGIN_LINK" />encontrou programas prejudiciais<ph name="END_LINK" /> recentemente em <ph name="SITE" />.</translation>
diff --git a/components/strings/components_strings_ro.xtb b/components/strings/components_strings_ro.xtb
index 80418a3..4c9a4ae 100644
--- a/components/strings/components_strings_ro.xtb
+++ b/components/strings/components_strings_ro.xtb
@@ -220,7 +220,6 @@
 <translation id="2826760142808435982">Conexiunea este criptată și autentificată utilizând <ph name="CIPHER" /> și folosește <ph name="KX" /> ca mecanism de schimb al cheii.</translation>
 <translation id="2835170189407361413">Golește formularul</translation>
 <translation id="2889159643044928134">Nu reîncărca</translation>
-<translation id="2900469785430194048">Google Chrome nu a avut suficientă memorie la afișarea paginii web.</translation>
 <translation id="2909946352844186028">A fost detectată o schimbare a rețelei.</translation>
 <translation id="2916038427272391327">închide celelalte programe;</translation>
 <translation id="2922350208395188000">Certificatul serverului nu poate fi verificat.</translation>
@@ -243,7 +242,6 @@
 <translation id="3024663005179499861">Tip de politică greșit</translation>
 <translation id="3032412215588512954">Dorești să reîncarci acest site?</translation>
 <translation id="3037605927509011580">Of, nu mai merge!</translation>
-<translation id="3040955737384246924">{COUNT,plural, =0{cel puțin un element pe dispozitivele sincronizate}=1{un element (și mai multe pe dispozitivele sincronizate)}few{# elemente (și mai multe pe dispozitivele sincronizate)}other{# de elemente (și mai multe pe dispozitivele sincronizate)}}</translation>
 <translation id="3041612393474885105">Informații despre certificat</translation>
 <translation id="3063697135517575841">Momentan, Chrome nu a putut confirma cardul. Încearcă din nou mai târziu.</translation>
 <translation id="3064966200440839136">Vei părăsi modul incognito pentru a plăti folosind o aplicație externă. Continui?</translation>
@@ -337,7 +335,6 @@
 <translation id="3681007416295224113">Informații despre certificat</translation>
 <translation id="3690164694835360974">Conectarea nu este securizată</translation>
 <translation id="3693415264595406141">Parolă:</translation>
-<translation id="3696411085566228381">niciuna</translation>
 <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation>
 <translation id="370665806235115550">Se încarcă…</translation>
 <translation id="3712624925041724820">Licențe epuizate</translation>
@@ -385,7 +382,6 @@
 <translation id="4171400957073367226">Semnătură de verificare nevalidă</translation>
 <translation id="4196861286325780578">&amp;Repetați mutarea</translation>
 <translation id="4203896806696719780"><ph name="BEGIN_LINK" />să verifici configurarea pentru firewall și antivirus;<ph name="END_LINK" /></translation>
-<translation id="4206349416402437184">{COUNT,plural, =0{niciuna}=1{1 aplicație ($1)}=2{2 aplicații ($1, $2)}few{# aplicații ($1, $2, $3)}other{# de aplicații ($1, $2, $3)}}</translation>
 <translation id="4220128509585149162">Blocări</translation>
 <translation id="4226937834893929579"><ph name="BEGIN_LINK" />Rulează Diagnostice rețea<ph name="END_LINK" />.</translation>
 <translation id="4250431568374086873">Conexiunea la acest site nu este complet sigură</translation>
@@ -469,7 +465,6 @@
 <translation id="5045550434625856497">Parolă incorectă</translation>
 <translation id="5056549851600133418">Articole pentru tine</translation>
 <translation id="5070335125961472645"><ph name="BEGIN_LINK" />să verifici adresa proxy-ului;<ph name="END_LINK" /></translation>
-<translation id="5076731569460970710">{COUNT,plural, =0{Niciun cookie}=1{1 site folosește cookie-uri. }few{# site-uri folosesc cookie-uri. }other{# de site-uri folosesc cookie-uri. }}</translation>
 <translation id="5087286274860437796">Momentan, certificatul serverului este nevalid.</translation>
 <translation id="5087580092889165836">Adaugă un card</translation>
 <translation id="5089810972385038852">Stat</translation>
@@ -601,7 +596,6 @@
 <translation id="6358450015545214790">Ce înseamnă acestea?</translation>
 <translation id="6386120369904791316">{COUNT,plural, =1{o altă sugestie}few{alte # sugestii}other{alte # de sugestii}}</translation>
 <translation id="6387478394221739770">Doriți să utilizați funcții Chrome noi și interesante? Încercați canalul nostru beta de la chrome.com/beta.</translation>
-<translation id="6389758589412724634">Chromium nu a avut suficientă memorie la afișarea paginii web.</translation>
 <translation id="6404511346730675251">Modificați marcajul</translation>
 <translation id="6410264514553301377">Introdu data de expirare și codul CVC pentru <ph name="CREDIT_CARD" /></translation>
 <translation id="6414888972213066896">Ți-ai întrebat părintele dacă poți accesa acest site</translation>
@@ -624,7 +618,6 @@
 <translation id="6556915248009097796">Expirat în <ph name="EXPIRATION_DATE_ABBR" />, folosit ultima dată pe <ph name="LAST_USED_DATE_NO_DETAIL" /></translation>
 <translation id="6563469144985748109">Administratorul nu l-a aprobat încă</translation>
 <translation id="6569060085658103619">Se afișează pagina unei extensii</translation>
-<translation id="6593753688552673085">mai puțin de <ph name="UPPER_ESTIMATE" /></translation>
 <translation id="6596325263575161958">Opțiuni de criptare</translation>
 <translation id="662080504995468778">Rămâi pe pagină</translation>
 <translation id="6626291197371920147">Adaugă un număr de card valid</translation>
@@ -636,7 +629,6 @@
 <translation id="6710594484020273272">&lt;Introdu termenul de căutare&gt;</translation>
 <translation id="6711464428925977395">A apărut o problemă la serverul proxy sau adresa nu este corectă.</translation>
 <translation id="6727102863431372879">Setează</translation>
-<translation id="6731320287533051140">{COUNT,plural, =0{niciuna}=1{1 element}few{# elemente}other{# de elemente}}</translation>
 <translation id="674375294223700098">Eroare de certificat de server necunoscută.</translation>
 <translation id="6753269504797312559">Valoarea politicii</translation>
 <translation id="6757797048963528358">Dispozitivul este inactiv.</translation>
@@ -742,6 +734,7 @@
 <translation id="7669271284792375604">Atacatorii de pe acest site pot încerca să te înșele pentru a instala programe care dăunează experienței de navigare (de exemplu, schimbând pagina de pornire sau afișând anunțuri suplimentare pe site-urile pe care le accesezi).</translation>
 <translation id="7674629440242451245">Doriți să utilizați funcții Chrome noi și interesante? Încercați canalul nostru pentru dezvoltatori, de la chrome.com/dev.</translation>
 <translation id="7682287625158474539">Expediere</translation>
+<translation id="7701040980221191251">Niciuna</translation>
 <translation id="7704050614460855821"><ph name="BEGIN_LINK" />Accesați <ph name="SITE" /> (nesigur)<ph name="END_LINK" /></translation>
 <translation id="7714464543167945231">Certificat</translation>
 <translation id="7716424297397655342">Acest site nu poate fi încărcat din memoria cache</translation>
@@ -781,7 +774,6 @@
 <translation id="8041089156583427627">Trimiteți feedback</translation>
 <translation id="8041940743680923270">Utilizați setarea prestabilită la nivel global (Întrebați)</translation>
 <translation id="8088680233425245692">Articolul nu a fost vizualizat.</translation>
-<translation id="8089520772729574115">mai puțin de 1 MB</translation>
 <translation id="8091372947890762290">Se așteaptă activarea pe server</translation>
 <translation id="8118489163946903409">Metodă de plată</translation>
 <translation id="8131740175452115882">Confirmați</translation>
diff --git a/components/strings/components_strings_ru.xtb b/components/strings/components_strings_ru.xtb
index 262d60a..ee6a4f3 100644
--- a/components/strings/components_strings_ru.xtb
+++ b/components/strings/components_strings_ru.xtb
@@ -220,7 +220,6 @@
 <translation id="2826760142808435982">Соединение зашифровано и проверено с помощью <ph name="CIPHER" />. В качестве механизма обмена ключами используется <ph name="KX" />.</translation>
 <translation id="2835170189407361413">Очистить форму</translation>
 <translation id="2889159643044928134">Не обновлять</translation>
-<translation id="2900469785430194048">Chrome не хватает памяти для показа этой страницы.</translation>
 <translation id="2909946352844186028">Похоже, вы подключились к другой сети.</translation>
 <translation id="2916038427272391327">Закройте другие программы.</translation>
 <translation id="2922350208395188000">Не удается проверить сертификат сервера.</translation>
@@ -243,7 +242,6 @@
 <translation id="3024663005179499861">Неверный тип политики</translation>
 <translation id="3032412215588512954">Обновить эту страницу?</translation>
 <translation id="3037605927509011580">Опаньки...</translation>
-<translation id="3040955737384246924">{COUNT,plural, =0{по меньшей мере 1 запись на синхронизируемых устройствах}=1{1 запись (не считая данных на синхронизируемых устройствах)}one{# запись (не считая данных на синхронизируемых устройствах)}few{# записи (не считая данных на синхронизируемых устройствах)}many{# записей (не считая данных на синхронизируемых устройствах)}other{# записей (не считая данных на синхронизируемых устройствах)}}</translation>
 <translation id="3041612393474885105">Данные сертификата</translation>
 <translation id="3063697135517575841">Не удалось подтвердить данные карты. Повторите попытку позже.</translation>
 <translation id="3064966200440839136">Вы выйдете из режима инкогнито, чтобы произвести оплату во внешнем приложении. Продолжить?</translation>
@@ -336,7 +334,6 @@
 <translation id="3681007416295224113">Данные сертификата</translation>
 <translation id="3690164694835360974">Небезопасный вход</translation>
 <translation id="3693415264595406141">Пароль:</translation>
-<translation id="3696411085566228381">нет</translation>
 <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation>
 <translation id="370665806235115550">Загрузка...</translation>
 <translation id="3712624925041724820">Недостаточно лицензий</translation>
@@ -384,7 +381,6 @@
 <translation id="4171400957073367226">Подтверждающая подпись недействительна</translation>
 <translation id="4196861286325780578">&amp;Повторить перемещение</translation>
 <translation id="4203896806696719780"><ph name="BEGIN_LINK" />Проверьте настройки брандмауэра и антивирусного ПО<ph name="END_LINK" />.</translation>
-<translation id="4206349416402437184">{COUNT,plural, =0{нет}=1{1 приложение ($1)}=2{2 приложения ($1 и $2)}one{# приложение ($1, $2, $3)}few{# приложения ($1, $2, $3)}many{# приложений ($1, $2, $3)}other{# приложения ($1, $2, $3)}}</translation>
 <translation id="4220128509585149162">Завершение работы программы</translation>
 <translation id="4226937834893929579"><ph name="BEGIN_LINK" />Выполните диагностику сети<ph name="END_LINK" />.</translation>
 <translation id="4250431568374086873">Подключение к сайту защищено не полностью</translation>
@@ -468,7 +464,6 @@
 <translation id="5045550434625856497">Неправильный пароль</translation>
 <translation id="5056549851600133418">Статьи для вас</translation>
 <translation id="5070335125961472645"><ph name="BEGIN_LINK" />Проверьте адрес прокси-сервера<ph name="END_LINK" />.</translation>
-<translation id="5076731569460970710">{COUNT,plural, =0{Нет файлов cookie.}=1{1 сайт использует файлы cookie. }one{# сайт использует файлы cookie. }few{# сайта используют файлы cookie. }many{# сайтов используют файлы cookie. }other{# сайта используют файлы cookie. }}</translation>
 <translation id="5087286274860437796">Сертификат сервера не действителен в настоящее время.</translation>
 <translation id="5087580092889165836">Добавить карту</translation>
 <translation id="5089810972385038852">Штат</translation>
@@ -600,7 +595,6 @@
 <translation id="6358450015545214790">Что это значит?</translation>
 <translation id="6386120369904791316">{COUNT,plural, =1{ещё 1 вариант}one{ещё # вариант}few{ещё # варианта}many{ещё # вариантов}other{ещё # варианта}}</translation>
 <translation id="6387478394221739770">Хотите быть в курсе новинок Chrome? Выберите бета-канал на странице "chrome.com/beta".</translation>
-<translation id="6389758589412724634">Chromium не хватает памяти для показа этой страницы.</translation>
 <translation id="6404511346730675251">Изменить закладку</translation>
 <translation id="6410264514553301377">Введите срок действия и CVC-код карты <ph name="CREDIT_CARD" /></translation>
 <translation id="6414888972213066896">Запрос на просмотр сайта отправлен вашему родителю</translation>
@@ -623,7 +617,6 @@
 <translation id="6556915248009097796">Срок действия: <ph name="EXPIRATION_DATE_ABBR" />, последний раз использовалась <ph name="LAST_USED_DATE_NO_DETAIL" /></translation>
 <translation id="6563469144985748109">Ещё не одобрено администратором</translation>
 <translation id="6569060085658103619">Вы просматриваете страницу расширения</translation>
-<translation id="6593753688552673085">менее <ph name="UPPER_ESTIMATE" /></translation>
 <translation id="6596325263575161958">Параметры шифрования</translation>
 <translation id="662080504995468778">Остаться</translation>
 <translation id="6626291197371920147">Введите номер действующей карты</translation>
@@ -635,7 +628,6 @@
 <translation id="6710594484020273272">&lt;Введите поисковый запрос&gt;</translation>
 <translation id="6711464428925977395">На прокси-сервере возникла проблема или адрес указан неверно.</translation>
 <translation id="6727102863431372879">Установить</translation>
-<translation id="6731320287533051140">{COUNT,plural, =0{нет}=1{1 запись}one{# запись}few{# записи}many{# записей}other{# записи}}</translation>
 <translation id="674375294223700098">Неизвестная ошибка сертификата сервера.</translation>
 <translation id="6753269504797312559">Значение правила</translation>
 <translation id="6757797048963528358">Устройство находится в спящем режиме.</translation>
@@ -741,6 +733,7 @@
 <translation id="7669271284792375604">Посещение этого сайта может привести к установке вредоносного ПО, которое будет мешать работе браузера (например, меняя стартовую страницу или показывая дополнительную рекламу на сайтах).</translation>
 <translation id="7674629440242451245">Хотите быть в курсе новинок Chrome? Выберите канал обновления для разработчиков на странице "chrome.com/dev".</translation>
 <translation id="7682287625158474539">Адрес доставки</translation>
+<translation id="7701040980221191251">Нет</translation>
 <translation id="7704050614460855821"><ph name="BEGIN_LINK" />Перейти на сайт <ph name="SITE" /> (небезопасно)<ph name="END_LINK" /></translation>
 <translation id="7714464543167945231">Сертификат</translation>
 <translation id="7716424297397655342">Не удалось загрузить сайт из кеша</translation>
@@ -780,7 +773,6 @@
 <translation id="8041089156583427627">Отправить отзыв</translation>
 <translation id="8041940743680923270">Использовать глобальный параметр по умолчанию (спрашивать)</translation>
 <translation id="8088680233425245692">Не удалось показать статью</translation>
-<translation id="8089520772729574115">менее 1 МБ</translation>
 <translation id="8091372947890762290">Активация управления устройствами не завершена</translation>
 <translation id="8118489163946903409">Способ оплаты</translation>
 <translation id="8131740175452115882">Подтвердить</translation>
diff --git a/components/strings/components_strings_sk.xtb b/components/strings/components_strings_sk.xtb
index b6a6a09..2858989 100644
--- a/components/strings/components_strings_sk.xtb
+++ b/components/strings/components_strings_sk.xtb
@@ -220,7 +220,6 @@
 <translation id="2826760142808435982">Pripojenie je šifrované pomocou štandardu <ph name="CIPHER" /> a používa mechanizmus výmeny kľúčov <ph name="KX" />.</translation>
 <translation id="2835170189407361413">Vymazať formulár</translation>
 <translation id="2889159643044928134">Nenačítať znova</translation>
-<translation id="2900469785430194048">Pri pokuse o zobrazenie tejto webovej stránky došlo miesto v pamäti prehliadača Google Chrome.</translation>
 <translation id="2909946352844186028">Zistila sa zmena siete.</translation>
 <translation id="2916038427272391327">Zavrite ostatné programy</translation>
 <translation id="2922350208395188000">Certifikát servera sa nedá overiť.</translation>
@@ -243,7 +242,6 @@
 <translation id="3024663005179499861">Chybný typ pravidla</translation>
 <translation id="3032412215588512954">Chcete tento web načítať znova?</translation>
 <translation id="3037605927509011580">Aj, chyba!</translation>
-<translation id="3040955737384246924">{COUNT,plural, =0{aspoň jedna položka v synchronizovaných zariadeniach}=1{1 položka (a ďalšie v synchronizovaných zariadeniach)}few{# položky (a ďalšie v synchronizovaných zariadeniach)}many{# položky (a ďalšie v synchronizovaných zariadeniach)}other{# položiek (a ďalšie v synchronizovaných zariadeniach)}}</translation>
 <translation id="3041612393474885105">Informácie o certifikáte</translation>
 <translation id="3063697135517575841">Chromu sa nepodarilo overiť vašu kartu. Skúste to znova neskôr.</translation>
 <translation id="3064966200440839136">Ak zaplatíte pomocou externej aplikácie, opustíte režim inkognito. Chcete pokračovať?</translation>
@@ -333,7 +331,6 @@
 <translation id="3681007416295224113">Informácie o certifikáte</translation>
 <translation id="3690164694835360974">Prihlásenie nie je zabezpečené</translation>
 <translation id="3693415264595406141">Heslo:</translation>
-<translation id="3696411085566228381">žiadne</translation>
 <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation>
 <translation id="370665806235115550">Načítava sa...</translation>
 <translation id="3712624925041724820">Vyčerpané licencie</translation>
@@ -381,7 +378,6 @@
 <translation id="4171400957073367226">Nesprávny overovací podpis</translation>
 <translation id="4196861286325780578">&amp;Znova presunúť</translation>
 <translation id="4203896806696719780"><ph name="BEGIN_LINK" />Skontrolovať konfiguráciu brány firewall a antivírusového softvéru<ph name="END_LINK" /></translation>
-<translation id="4206349416402437184">{COUNT,plural, =0{žiadne}=1{1 aplikácia ($1)}=2{2 aplikácie ($1, $2)}few{# aplikácie ($1, $2, $3)}many{# aplikácie ($1, $2, $3)}other{# aplikácií ($1, $2, $3)}}</translation>
 <translation id="4220128509585149162">Zlyhania</translation>
 <translation id="4226937834893929579"><ph name="BEGIN_LINK" />Skúste spustiť nástroj Diagnostika siete<ph name="END_LINK" />.</translation>
 <translation id="4250431568374086873">Vaše pripojenie k tomuto webu nie je úplne zabezpečené</translation>
@@ -465,7 +461,6 @@
 <translation id="5045550434625856497">Nesprávne heslo</translation>
 <translation id="5056549851600133418">Články pre vás</translation>
 <translation id="5070335125961472645"><ph name="BEGIN_LINK" />Skontrolovať adresu proxy servera<ph name="END_LINK" /></translation>
-<translation id="5076731569460970710">{COUNT,plural, =0{Žiadne súbory cookie}=1{1 web používa súbory cookie. }few{# weby používajú súbory cookie. }many{# webu používa súbory cookie. }other{# webov používa súbory cookie. }}</translation>
 <translation id="5087286274860437796">Certifikát servera je momentálne neplatný</translation>
 <translation id="5087580092889165836">Pridať kartu</translation>
 <translation id="5089810972385038852">Štát</translation>
@@ -596,7 +591,6 @@
 <translation id="6358450015545214790">Čo znamenajú tieto položky?</translation>
 <translation id="6386120369904791316">{COUNT,plural, =1{1 ďalší návrh}few{# ďalšie návrhy}many{# ďalšieho návrhu}other{# ďalších návrhov}}</translation>
 <translation id="6387478394221739770">Máte záujem o skvelé nové funkcie prehliadača Chrome? Vyskúšajte verziu beta na stránke chrome.com/beta.</translation>
-<translation id="6389758589412724634">Pri pokuse o zobrazenie tejto webovej stránky došlo miesto v pamäti prehliadača Google Chromium.</translation>
 <translation id="6404511346730675251">Upraviť záložku</translation>
 <translation id="6410264514553301377">Zadajte dátum vypršania platnosti a kód CVC karty <ph name="CREDIT_CARD" /></translation>
 <translation id="6414888972213066896">Opýtali ste sa svojho rodiča, či môžete navštíviť tento web</translation>
@@ -619,7 +613,6 @@
 <translation id="6556915248009097796">Platnosť do <ph name="EXPIRATION_DATE_ABBR" />, naposledy použité <ph name="LAST_USED_DATE_NO_DETAIL" /></translation>
 <translation id="6563469144985748109">Váš správca to zatiaľ neschválil</translation>
 <translation id="6569060085658103619">Prezeráte si stránku s rozšíreniami</translation>
-<translation id="6593753688552673085">menej ako <ph name="UPPER_ESTIMATE" /></translation>
 <translation id="6596325263575161958">Možnosti šifrovania</translation>
 <translation id="662080504995468778">Zostať</translation>
 <translation id="6626291197371920147">Pridanie platného čísla karty</translation>
@@ -631,7 +624,6 @@
 <translation id="6710594484020273272">&lt;Zadajte hľadaný výraz&gt;</translation>
 <translation id="6711464428925977395">Vyskytol sa problém s proxy serverom alebo je adresa nesprávna.</translation>
 <translation id="6727102863431372879">Nastaviť</translation>
-<translation id="6731320287533051140">{COUNT,plural, =0{žiadne}=1{1 položka}few{# položky}many{# položky}other{# položiek}}</translation>
 <translation id="674375294223700098">Neznáma chyba spôsobená certifikátom servera.</translation>
 <translation id="6753269504797312559">Hodnota pravidla</translation>
 <translation id="6757797048963528358">Vaše zariadenie prešlo do režimu spánku.</translation>
@@ -737,6 +729,7 @@
 <translation id="7669271284792375604">Útočníci na tomto webe sa vás môžu pokúsiť podvodom presvedčiť, aby ste si nainštalovali programy poškodzujúce vaše prostredie prehliadania (napríklad zmenou domovskej stránky alebo zobrazovaním ďalších reklám na weboch, ktoré navštevujete).</translation>
 <translation id="7674629440242451245">Máte záujem o skvelé nové funkcie prehliadača Chrome? Vyskúšajte verziu pre vývojárov na stránke chrome.com/dev.</translation>
 <translation id="7682287625158474539">Dodacia</translation>
+<translation id="7701040980221191251">Žiadne</translation>
 <translation id="7704050614460855821"><ph name="BEGIN_LINK" />Prejsť na stránky <ph name="SITE" /> (nebezpečné)<ph name="END_LINK" /></translation>
 <translation id="7714464543167945231">Certifikát</translation>
 <translation id="7716424297397655342">Tento web nie je možné načítať z vyrovnávacej pamäte</translation>
@@ -776,7 +769,6 @@
 <translation id="8041089156583427627">Odoslať spätnú väzbu</translation>
 <translation id="8041940743680923270">Použiť predvolené všeobecné nastavenie (Opýtať sa)</translation>
 <translation id="8088680233425245692">Článok sa nepodarilo zobraziť.</translation>
-<translation id="8089520772729574115">menej ako 1 MB</translation>
 <translation id="8091372947890762290">Aktivácia čaká na server</translation>
 <translation id="8118489163946903409">Spôsob platby</translation>
 <translation id="8131740175452115882">Potvrdiť</translation>
diff --git a/components/strings/components_strings_sl.xtb b/components/strings/components_strings_sl.xtb
index cc962ac..e1da8f6 100644
--- a/components/strings/components_strings_sl.xtb
+++ b/components/strings/components_strings_sl.xtb
@@ -220,7 +220,6 @@
 <translation id="2826760142808435982">Za šifriranje in preverjanje pristnosti povezave se uporablja <ph name="CIPHER" />, kot mehanizem za izmenjavo ključev pa <ph name="KX" />.</translation>
 <translation id="2835170189407361413">Počisti obrazec</translation>
 <translation id="2889159643044928134">Ne naloži znova</translation>
-<translation id="2900469785430194048">Google Chromu je med poskusom prikazovanja te spletne strani zmanjkalo pomnilnika.</translation>
 <translation id="2909946352844186028">Zaznana je bila sprememba omrežja.</translation>
 <translation id="2916038427272391327">Zaprite druge programe</translation>
 <translation id="2922350208395188000">Potrdila strežnika ni mogoče preveriti.</translation>
@@ -243,7 +242,6 @@
 <translation id="3024663005179499861">Napačna vrsta pravilnika</translation>
 <translation id="3032412215588512954">Ali želite znova naložiti to spletno mesto?</translation>
 <translation id="3037605927509011580">Ti šment!</translation>
-<translation id="3040955737384246924">{COUNT,plural, =0{vsaj en element v sinhroniziranih napravah}=1{1 element (in več v sinhroniziranih napravah)}one{# element (in več v sinhroniziranih napravah)}two{# elementa (in več v sinhroniziranih napravah)}few{# elementi (in več v sinhroniziranih napravah)}other{# elementov (in več v sinhroniziranih napravah)}}</translation>
 <translation id="3041612393474885105">Informacije o potrdilu</translation>
 <translation id="3063697135517575841">Chrome trenutno ni mogel potrditi vaše kartice. Poskusite znova pozneje.</translation>
 <translation id="3064966200440839136">Zaradi plačila v zunanji aplikaciji boste zapustili način brez beleženja zgodovine. Želite nadaljevati?</translation>
@@ -337,7 +335,6 @@
 <translation id="3681007416295224113">Informacije o potrdilu</translation>
 <translation id="3690164694835360974">Prijava ni varna</translation>
 <translation id="3693415264595406141">Geslo:</translation>
-<translation id="3696411085566228381">brez</translation>
 <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation>
 <translation id="370665806235115550">Nalaganje ...</translation>
 <translation id="3712624925041724820">Ni dovolj licenc</translation>
@@ -385,7 +382,6 @@
 <translation id="4171400957073367226">Neveljavni podpis za preverjanje</translation>
 <translation id="4196861286325780578">&amp;Uveljavi premik</translation>
 <translation id="4203896806696719780"><ph name="BEGIN_LINK" />preveriti požarni zid in konfiguracije protivirusnega programa<ph name="END_LINK" /></translation>
-<translation id="4206349416402437184">{COUNT,plural, =0{nič}=1{1 aplikacija ($1)}=2{2 aplikaciji ($1, $2)}one{# aplikacija ($1, $2, $3)}two{# aplikaciji ($1, $2, $3)}few{# aplikacije ($1, $2, $3)}other{# aplikacij ($1, $2, $3)}}</translation>
 <translation id="4220128509585149162">Zrušitve</translation>
 <translation id="4226937834893929579"><ph name="BEGIN_LINK" />Poskušajte zagnati orodje za omrežno diagnostiko<ph name="END_LINK" />.</translation>
 <translation id="4250431568374086873">Povezava s tem mestom ni povsem varna.</translation>
@@ -469,7 +465,6 @@
 <translation id="5045550434625856497">Nepravilno geslo</translation>
 <translation id="5056549851600133418">Članki za vas</translation>
 <translation id="5070335125961472645"><ph name="BEGIN_LINK" />preveriti naslov strežnika proxy<ph name="END_LINK" /></translation>
-<translation id="5076731569460970710">{COUNT,plural, =0{Brez piškotkov}=1{1 spletno mesto uporablja piškotke. }one{# spletno mesto uporablja piškotke. }two{# spletni mesti uporabljata piškotke. }few{# spletna mesta uporabljajo piškotke. }other{# spletnih mest uporablja piškotke. }}</translation>
 <translation id="5087286274860437796">Potrdilo strežnika trenutno ni veljavno.</translation>
 <translation id="5087580092889165836">Dodaj kartico</translation>
 <translation id="5089810972385038852">Zvezna država</translation>
@@ -601,7 +596,6 @@
 <translation id="6358450015545214790">Več o teh nastavitvah</translation>
 <translation id="6386120369904791316">{COUNT,plural, =1{in še 1 predlog}one{in še # predlog}two{in še # predloga}few{in še # predlogi}other{in še # predlogov}}</translation>
 <translation id="6387478394221739770">Vas zanimajo super nove funkcije Chroma? Preskusite naš kanal za različice beta na chrome.com/beta.</translation>
-<translation id="6389758589412724634">Chromiumu je med poskusom prikazovanja te spletne strani zmanjkalo pomnilnika.</translation>
 <translation id="6404511346730675251">Uredi zaznamek</translation>
 <translation id="6410264514553301377">Vnesite datum poteka veljavnosti in kodo CVC za kartico <ph name="CREDIT_CARD" /></translation>
 <translation id="6414888972213066896">Starša si vprašal(-a), ali smeš obiskati to spletno mesto</translation>
@@ -624,7 +618,6 @@
 <translation id="6556915248009097796">Datum poteka: <ph name="EXPIRATION_DATE_ABBR" />, zadnja uporaba: <ph name="LAST_USED_DATE_NO_DETAIL" /></translation>
 <translation id="6563469144985748109">Skrbnik še ni odobril</translation>
 <translation id="6569060085658103619">Ogledujete si stran razširitve</translation>
-<translation id="6593753688552673085">manj kot <ph name="UPPER_ESTIMATE" /></translation>
 <translation id="6596325263575161958">Možnosti šifriranja</translation>
 <translation id="662080504995468778">Ostani</translation>
 <translation id="6626291197371920147">Dodajanje veljavne številke kartice</translation>
@@ -636,7 +629,6 @@
 <translation id="6710594484020273272">&lt;Vnesite iskalno poizvedbo&gt;</translation>
 <translation id="6711464428925977395">Nekaj je narobe s strežnikom proxy ali pa naslov ni pravilen.</translation>
 <translation id="6727102863431372879">Nastavi</translation>
-<translation id="6731320287533051140">{COUNT,plural, =0{nič}=1{1 element}one{# element}two{# elementa}few{# elementi}other{# elementov}}</translation>
 <translation id="674375294223700098">Neznana napaka potrdila strežnika.</translation>
 <translation id="6753269504797312559">Vrednost pravilnika</translation>
 <translation id="6757797048963528358">Naprava je preklopila v stanje pripravljenosti.</translation>
@@ -742,6 +734,7 @@
 <translation id="7669271284792375604">Napadalci na tem spletnem mestu vas bodo morda poskusili zavesti, da bi namestili programe, ki škodljivo vplivajo na brskanje (na primer tako, da spremenijo vašo domačo stran ali na spletnih mestih, ki jih obiščete, prikazujejo dodatne oglase).</translation>
 <translation id="7674629440242451245">Vas zanimajo super nove funkcije Chroma? Preskusite naš kanal za razvijalce na chrome.com/dev.</translation>
 <translation id="7682287625158474539">Pošiljanje</translation>
+<translation id="7701040980221191251">Brez</translation>
 <translation id="7704050614460855821"><ph name="BEGIN_LINK" />Nadaljuj na spletno mesto <ph name="SITE" /> (ni varno)<ph name="END_LINK" /></translation>
 <translation id="7714464543167945231">Potrdilo</translation>
 <translation id="7716424297397655342">Tega spletnega mesta ni mogoče naložiti iz predpomnilnika</translation>
@@ -781,7 +774,6 @@
 <translation id="8041089156583427627">Pošlji povratne informacije</translation>
 <translation id="8041940743680923270">Uporabi globalno privzeto (Vprašaj)</translation>
 <translation id="8088680233425245692">Članka si ni bilo mogoče ogledati.</translation>
-<translation id="8089520772729574115">manj kot 1 MB</translation>
 <translation id="8091372947890762290">Čakanje na aktivacijo v strežniku</translation>
 <translation id="8118489163946903409">Plačilno sredstvo</translation>
 <translation id="8131740175452115882">Potrdi</translation>
diff --git a/components/strings/components_strings_sr.xtb b/components/strings/components_strings_sr.xtb
index 75a17e3d..f6e49a2 100644
--- a/components/strings/components_strings_sr.xtb
+++ b/components/strings/components_strings_sr.xtb
@@ -220,7 +220,6 @@
 <translation id="2826760142808435982">Веза је шифрована и њена аутентичност је потврђена помоћу <ph name="CIPHER" /> и користи <ph name="KX" /> као механизам за размену шифара.</translation>
 <translation id="2835170189407361413">Обриши образац</translation>
 <translation id="2889159643044928134">Не учитавај поново</translation>
-<translation id="2900469785430194048">Google Chrome-у је понестало меморије док је покушавао да прикаже ову веб-страницу.</translation>
 <translation id="2909946352844186028">Откривена је промена на мрежи.</translation>
 <translation id="2916038427272391327">Затворите друге програме</translation>
 <translation id="2922350208395188000">Није могуће проверити сертификат сервера.</translation>
@@ -243,7 +242,6 @@
 <translation id="3024663005179499861">Погрешан тип смерница</translation>
 <translation id="3032412215588512954">Желите ли поново да учитате овај сат?</translation>
 <translation id="3037605927509011580">О, не!</translation>
-<translation id="3040955737384246924">{COUNT,plural, =0{најмање 1 ставка на синхронизованим уређајима}=1{1 ставка (и још ставки на синхронизованим уређајима)}one{# ставка (и још ставки на синхронизованим уређајима)}few{# ставке (и још ставки на синхронизованим уређајима)}other{# ставки (и још ставки на синхронизованим уређајима)}}</translation>
 <translation id="3041612393474885105">Информације о сертификату</translation>
 <translation id="3063697135517575841">Chrome није успео да потврди картицу. Пробајте поново касније.</translation>
 <translation id="3064966200440839136">Напустићете режим без архивирања да бисте платили у спољној апликацији. Желите ли да наставите?</translation>
@@ -337,7 +335,6 @@
 <translation id="3681007416295224113">Информације о сертификату</translation>
 <translation id="3690164694835360974">Пријављивање није безбедно</translation>
 <translation id="3693415264595406141">Лозинка:</translation>
-<translation id="3696411085566228381">ништа</translation>
 <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation>
 <translation id="370665806235115550">Учитава се...</translation>
 <translation id="3712624925041724820">Нема више лиценци</translation>
@@ -385,7 +382,6 @@
 <translation id="4171400957073367226">Неисправан потпис за верификацију</translation>
 <translation id="4196861286325780578">&amp;Понови премештање</translation>
 <translation id="4203896806696719780"><ph name="BEGIN_LINK" />да проверите конфигурацију заштитног зида и антивируса<ph name="END_LINK" /></translation>
-<translation id="4206349416402437184">{COUNT,plural, =0{ниједна}=1{1 апликација ($1)}=2{2 апликације ($1, $2)}one{# апликација ($1, $2, $3)}few{# апликације ($1, $2, $3)}other{# апликација ($1, $2, $3)}}</translation>
 <translation id="4220128509585149162">Отказивања</translation>
 <translation id="4226937834893929579"><ph name="BEGIN_LINK" />Покушајте да покренете дијагностику мреже<ph name="END_LINK" />.</translation>
 <translation id="4250431568374086873">Веза са овим сајтом није потпуно безбедна</translation>
@@ -469,7 +465,6 @@
 <translation id="5045550434625856497">Неисправна лозинка</translation>
 <translation id="5056549851600133418">Чланци за вас</translation>
 <translation id="5070335125961472645"><ph name="BEGIN_LINK" />да проверите адресу проксија<ph name="END_LINK" /></translation>
-<translation id="5076731569460970710">{COUNT,plural, =0{Нема колачића}=1{1 сајт користи колачиће. }one{# сајт користи колачиће. }few{# сајта користе колачиће. }other{# сајтова користи колачиће. }}</translation>
 <translation id="5087286274860437796">Сертификат сервера тренутно није важећи.</translation>
 <translation id="5087580092889165836">Додај картицу</translation>
 <translation id="5089810972385038852">Држава</translation>
@@ -600,7 +595,6 @@
 <translation id="6358450015545214790">Шта ово значи?</translation>
 <translation id="6386120369904791316">{COUNT,plural, =1{још 1 предлог}one{још # предлог}few{још # предлога}other{још # предлога}}</translation>
 <translation id="6387478394221739770">Интересују вас нове занимљиве Chrome функције? Испробајте бета канал на chrome.com/beta.</translation>
-<translation id="6389758589412724634">Chromium-у је понестало меморије док је покушавао да прикаже ову веб-страницу.</translation>
 <translation id="6404511346730675251">Измена обележивача</translation>
 <translation id="6410264514553301377">Унесите датум истека и CVC за картицу <ph name="CREDIT_CARD" /></translation>
 <translation id="6414888972213066896">Питао/ла си родитеља да ли смеш да посетиш овај сајт</translation>
@@ -623,7 +617,6 @@
 <translation id="6556915248009097796">Истиче: <ph name="EXPIRATION_DATE_ABBR" />, последњи пут коришћено: <ph name="LAST_USED_DATE_NO_DETAIL" /></translation>
 <translation id="6563469144985748109">Менаџер га још увек није одобрио</translation>
 <translation id="6569060085658103619">Прегледате страницу додатка.</translation>
-<translation id="6593753688552673085">мање од <ph name="UPPER_ESTIMATE" /></translation>
 <translation id="6596325263575161958">Опције шифровања</translation>
 <translation id="662080504995468778">Не затварај</translation>
 <translation id="6626291197371920147">Додајте важећи број картице</translation>
@@ -635,7 +628,6 @@
 <translation id="6710594484020273272">&lt;Унесите термин за претрагу&gt;</translation>
 <translation id="6711464428925977395">Нешто није у реду са прокси сервером или је адреса нетачна.</translation>
 <translation id="6727102863431372879">Постави</translation>
-<translation id="6731320287533051140">{COUNT,plural, =0{ниједна}=1{1 ставка}one{# ставка}few{# ставке}other{# ставки}}</translation>
 <translation id="674375294223700098">Непозната грешка сертификата сервера.</translation>
 <translation id="6753269504797312559">Вредност смерница</translation>
 <translation id="6757797048963528358">Уређај је прешао у режим спавања.</translation>
@@ -741,6 +733,7 @@
 <translation id="7669271284792375604">Нападачи на овом сајту могу да покушају да вас преваре да бисте инсталирали програме који штете доживљају прегледања (на пример, тако што мењају почетну страницу или приказују додатне огласе на сајтовима које посећујете).</translation>
 <translation id="7674629440242451245">Интересују вас нове занимљиве Chrome функције? Испробајте програмерски канал на chrome.com/dev.</translation>
 <translation id="7682287625158474539">Испорука</translation>
+<translation id="7701040980221191251">Ниједна</translation>
 <translation id="7704050614460855821"><ph name="BEGIN_LINK" />Настави на <ph name="SITE" /> (није безбедно)<ph name="END_LINK" /></translation>
 <translation id="7714464543167945231">Сертификат</translation>
 <translation id="7716424297397655342">Није могуће учитати овај сајт из кеша</translation>
@@ -780,7 +773,6 @@
 <translation id="8041089156583427627">Пошаљи повратне информације</translation>
 <translation id="8041940743680923270">Користи глобалну подразумевану вредност (Питај)</translation>
 <translation id="8088680233425245692">Прегледање чланка није успело.</translation>
-<translation id="8089520772729574115">мање од 1 MB</translation>
 <translation id="8091372947890762290">Активација је на чекању на серверу</translation>
 <translation id="8118489163946903409">Начин плаћања</translation>
 <translation id="8131740175452115882">Потврди</translation>
diff --git a/components/strings/components_strings_sv.xtb b/components/strings/components_strings_sv.xtb
index 30c1d5f8..2b40667 100644
--- a/components/strings/components_strings_sv.xtb
+++ b/components/strings/components_strings_sv.xtb
@@ -220,7 +220,6 @@
 <translation id="2826760142808435982">Anslutningen är krypterad och verifieras med <ph name="CIPHER" /> och använder <ph name="KX" /> som nyckelutbytesmekanism.</translation>
 <translation id="2835170189407361413">Rensa formuläret</translation>
 <translation id="2889159643044928134">Läs inte in sidan igen</translation>
-<translation id="2900469785430194048">Minnet tog slut när den här webbsidan skulle visas i Google Chrome.</translation>
 <translation id="2909946352844186028">En nätverksförändring upptäcktes.</translation>
 <translation id="2916038427272391327">Stäng andra program</translation>
 <translation id="2922350208395188000">Servercertifikatet kan inte kontrolleras.</translation>
@@ -243,7 +242,6 @@
 <translation id="3024663005179499861">Felaktig policytyp</translation>
 <translation id="3032412215588512954">Vill du läsa in den här webbplatsen igen?</translation>
 <translation id="3037605927509011580">Oj, ett fel har uppstått!</translation>
-<translation id="3040955737384246924">{COUNT,plural, =0{minst 1 objekt på synkroniserade enheter}=1{1 objekt (och fler på synkroniserade enheter)}other{# objekt (och fler på synkroniserade enheter)}}</translation>
 <translation id="3041612393474885105">Certifikatinformation</translation>
 <translation id="3063697135517575841">Det gick inte att bekräfta kortet. Försök igen senare.</translation>
 <translation id="3064966200440839136">Om du betalar i ett externt program sker inte det i inkognitoläge. Vill du fortsätta?</translation>
@@ -337,7 +335,6 @@
 <translation id="3681007416295224113">Certifikatinformation</translation>
 <translation id="3690164694835360974">Osäker inloggning</translation>
 <translation id="3693415264595406141">Lösenord:</translation>
-<translation id="3696411085566228381">ingen</translation>
 <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation>
 <translation id="370665806235115550">Läser in...</translation>
 <translation id="3712624925041724820">Licenserna har tagit slut</translation>
@@ -385,7 +382,6 @@
 <translation id="4171400957073367226">Felaktig verifieringssignatur</translation>
 <translation id="4196861286325780578">&amp;Gör om Flytta</translation>
 <translation id="4203896806696719780"><ph name="BEGIN_LINK" />kontrollera konfigureringarna för brandväggen och antivirusprogram<ph name="END_LINK" /></translation>
-<translation id="4206349416402437184">{COUNT,plural, =0{inga}=1{1 app ($1)}=2{2 appar ($1, $2)}other{# appar ($1, $2, $3)}}</translation>
 <translation id="4220128509585149162">Kraschar</translation>
 <translation id="4226937834893929579"><ph name="BEGIN_LINK" />Testa att köra nätverksdiagnostik<ph name="END_LINK" />.</translation>
 <translation id="4250431568374086873">Anslutningen till den här webbplatsen är inte helt säker</translation>
@@ -469,7 +465,6 @@
 <translation id="5045550434625856497">Felaktigt lösenord</translation>
 <translation id="5056549851600133418">Artiklar för dig</translation>
 <translation id="5070335125961472645"><ph name="BEGIN_LINK" />kontrollera proxyadressen<ph name="END_LINK" /></translation>
-<translation id="5076731569460970710">{COUNT,plural, =0{Inga cookies}=1{Cookies används på 1 webbplats. }other{Cookies används på # webbplatser. }}</translation>
 <translation id="5087286274860437796">Servercertifikatet är inte giltigt för närvarande.</translation>
 <translation id="5087580092889165836">Lägg till kort</translation>
 <translation id="5089810972385038852">Delstat</translation>
@@ -601,7 +596,6 @@
 <translation id="6358450015545214790">Vad innebär dessa?</translation>
 <translation id="6386120369904791316">{COUNT,plural, =1{1 annat förslag}other{# andra förslag}}</translation>
 <translation id="6387478394221739770">Är du intresserad av häftiga nya funktioner i Chrome? Pröva vår betakanal på chrome.com/beta.</translation>
-<translation id="6389758589412724634">Minnet tog slut när den här webbsidan skulle visas i Chromium.</translation>
 <translation id="6404511346730675251">Redigera bokmärke</translation>
 <translation id="6410264514553301377">Ange utgångsdatum och CVC-kod för <ph name="CREDIT_CARD" /></translation>
 <translation id="6414888972213066896">Du har frågat en förälder om lov att besöka den här webbplatsen.</translation>
@@ -624,7 +618,6 @@
 <translation id="6556915248009097796">Giltigt till: <ph name="EXPIRATION_DATE_ABBR" />, användes senast den <ph name="LAST_USED_DATE_NO_DETAIL" /></translation>
 <translation id="6563469144985748109">Den ansvarige har inte godkänt den ännu</translation>
 <translation id="6569060085658103619">Du visar en tilläggssida</translation>
-<translation id="6593753688552673085">mindre än <ph name="UPPER_ESTIMATE" /></translation>
 <translation id="6596325263575161958">Krypteringsalternativ</translation>
 <translation id="662080504995468778">Stanna kvar</translation>
 <translation id="6626291197371920147">Lägg till ett giltigt kortnummer</translation>
@@ -636,7 +629,6 @@
 <translation id="6710594484020273272">&lt;Ange sökterm&gt;</translation>
 <translation id="6711464428925977395">Något är fel med proxyservern eller så är adressen felaktig.</translation>
 <translation id="6727102863431372879">Ange</translation>
-<translation id="6731320287533051140">{COUNT,plural, =0{inga}=1{1 objekt}other{# objekt}}</translation>
 <translation id="674375294223700098">Fel - okänt servercertifikat.</translation>
 <translation id="6753269504797312559">Policyvärde</translation>
 <translation id="6757797048963528358">Enheten gick i viloläge.</translation>
@@ -742,6 +734,7 @@
 <translation id="7669271284792375604">Angripare på den här webbplatsen kan försöka lura dig att installera program som skadar din webbupplevelse (till exempel genom att byta ut din startsida eller visa extra annonser på webbplatser som du besöker).</translation>
 <translation id="7674629440242451245">Är du intresserad av häftiga nya funktioner i Chrome? Pröva vår utvecklarkanal på chrome.com/dev.</translation>
 <translation id="7682287625158474539">Frakt</translation>
+<translation id="7701040980221191251">Inget</translation>
 <translation id="7704050614460855821"><ph name="BEGIN_LINK" />Fortsätt till <ph name="SITE" /> (osäkert)<ph name="END_LINK" /></translation>
 <translation id="7714464543167945231">Certifikat</translation>
 <translation id="7716424297397655342">Det går inte att läsa in webbplatsen från cachelagringen</translation>
@@ -781,7 +774,6 @@
 <translation id="8041089156583427627">Skicka feedback</translation>
 <translation id="8041940743680923270">Använd global standardinställning (Fråga)</translation>
 <translation id="8088680233425245692">Det gick inte att visa artikeln.</translation>
-<translation id="8089520772729574115">mindre än 1 MB</translation>
 <translation id="8091372947890762290">Aktiveringen väntar på servern</translation>
 <translation id="8118489163946903409">Betalningsmetod</translation>
 <translation id="8131740175452115882">Bekräfta</translation>
diff --git a/components/strings/components_strings_sw.xtb b/components/strings/components_strings_sw.xtb
index e368bac..5977c5ca 100644
--- a/components/strings/components_strings_sw.xtb
+++ b/components/strings/components_strings_sw.xtb
@@ -220,7 +220,6 @@
 <translation id="2826760142808435982">Muunganisho umesimbwa kwa njia fiche na kuthibitishwa kupitia <ph name="CIPHER" /> na unatumia <ph name="KX" /> kama utaratibu msingi wa ubadilishaji.</translation>
 <translation id="2835170189407361413">Futa fomu</translation>
 <translation id="2889159643044928134">Usipakie Upya</translation>
-<translation id="2900469785430194048">Nafasi ya kuhifadhi kwenye Google Chrome iliisha ilipokuwa ikijaribu kuonyesha ukurasa huu wa wavuti.</translation>
 <translation id="2909946352844186028">Mabadiliko ya mtandao yamegunduliwa.</translation>
 <translation id="2916038427272391327">Funga programu nyingine</translation>
 <translation id="2922350208395188000">Cheti cha seva hakiwezi kukaguliwa.</translation>
@@ -243,7 +242,6 @@
 <translation id="3024663005179499861">Aina mbaya ya sera</translation>
 <translation id="3032412215588512954">Ungependa kupakia upya tovuti hii?</translation>
 <translation id="3037605927509011580">Lo!</translation>
-<translation id="3040955737384246924">{COUNT,plural, =0{angalau kipengee 1 kwenye vifaa vilivyosawazishwa}=1{Kipengee 1 (na zaidi kwenye vifaa vilivyosawazishwa)}other{Vipengee # (na zaidi kwenye vifaa vilivyosawazishwa)}}</translation>
 <translation id="3041612393474885105">Maelezo ya Cheti</translation>
 <translation id="3063697135517575841">Chrome haikuweza kuthibitisha kadi yako wakati huu. Tafadhali jaribu tena baadaye.</translation>
 <translation id="3064966200440839136">Inaacha hali fiche ili kulipa kupitia programu ya nje. Je, ungependa kuendelea?</translation>
@@ -295,7 +293,7 @@
 <translation id="3377188786107721145">Hitilafu ya kuchanganua sera</translation>
 <translation id="3380365263193509176">Hitilafu isiyojulikana</translation>
 <translation id="3380864720620200369">Kitambulisho cha Mteja:</translation>
-<translation id="3391030046425686457">Anwani ya uwasilishaji</translation>
+<translation id="3391030046425686457">Mahali pa kupeleka</translation>
 <translation id="3395827396354264108">Mbinu ya kuchukua</translation>
 <translation id="3422248202833853650">Jaribu kuondoka kwenye programu nyingine ili upate nafasi zaidi.</translation>
 <translation id="3422472998109090673"><ph name="HOST_NAME" /> haiwezi kufikiwa kwa sasa.</translation>
@@ -337,7 +335,6 @@
 <translation id="3681007416295224113">Maelezo ya cheti</translation>
 <translation id="3690164694835360974">Kuingia katika akaunti si salama</translation>
 <translation id="3693415264595406141">Nenosiri:</translation>
-<translation id="3696411085566228381">hamna</translation>
 <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation>
 <translation id="370665806235115550">Inapakia...</translation>
 <translation id="3712624925041724820">Leseni zimekwisha</translation>
@@ -385,7 +382,6 @@
 <translation id="4171400957073367226">Sahihi mbaya ya uthibitishaji</translation>
 <translation id="4196861286325780578">Rudia hatua</translation>
 <translation id="4203896806696719780"><ph name="BEGIN_LINK" />Kuangalia mipangilio ya kinga-mtandao na kinga-virusi<ph name="END_LINK" /></translation>
-<translation id="4206349416402437184">{COUNT,plural, =0{hamna}=1{Programu 1 ($1)}=2{Programu 2 ($1, $2)}other{Programu # ($1, $2, $3)}}</translation>
 <translation id="4220128509585149162">Mivurugo</translation>
 <translation id="4226937834893929579"><ph name="BEGIN_LINK" />Jaribu kutumia zana ya Kuchunguza Mtandao<ph name="END_LINK" />.</translation>
 <translation id="4250431568374086873">Muunganisho wako kwenye tovuti hii si salama kabisa</translation>
@@ -417,7 +413,7 @@
 <translation id="4522570452068850558">Maelezo</translation>
 <translation id="4552089082226364758">Mmweko</translation>
 <translation id="4558551763791394412">Jaribu kuzima viendelezi vyako.</translation>
-<translation id="457875822857220463">Uwasilishaji</translation>
+<translation id="457875822857220463">Usafirishaji</translation>
 <translation id="4587425331216688090">Ungependa kuondoa anwani kutoka kwenye Chrome?</translation>
 <translation id="4592951414987517459">Muunganisho wako kwenye <ph name="DOMAIN" /> umesimbwa kwa njia fiche kwa kutumia mipangilio ya kriptografia ya kisasa.</translation>
 <translation id="4594403342090139922">Tendua Kufuta</translation>
@@ -446,7 +442,7 @@
 <translation id="4816492930507672669">Sawazisha kwenye ukurasa</translation>
 <translation id="483020001682031208">Hakuna Kurasa za Wavuti kila Mahali za kuonyesha</translation>
 <translation id="4850886885716139402">Mwonekano</translation>
-<translation id="4854362297993841467">Mbinu hii ya kuwasilisha haipatikani. Jaribu mbinu tofauti.</translation>
+<translation id="4854362297993841467">Njia hii ya kusafirisha haitumiki. Jaribu njia tofauti.</translation>
 <translation id="4858792381671956233">Umewaomba wazazi wako ruhusa ya kuutembelea ukurasa huu.</translation>
 <translation id="4880827082731008257">Tafuta katika historia</translation>
 <translation id="4895877746940133817"><ph name="TYPE_1" />, <ph name="TYPE_2" />, <ph name="TYPE_3" /></translation>
@@ -469,7 +465,6 @@
 <translation id="5045550434625856497">Nenosiri lisilo sahihi</translation>
 <translation id="5056549851600133418">Makala kwa ajili yako</translation>
 <translation id="5070335125961472645"><ph name="BEGIN_LINK" />Kuangalia anwani mbadala<ph name="END_LINK" /></translation>
-<translation id="5076731569460970710">{COUNT,plural, =0{Hamna vidakuzi}=1{Tovuti 1 inatumia vidakuzi. }other{Tovuti # zinatumia vidakuzi. }}</translation>
 <translation id="5087286274860437796">Cheti cha seva si sahihi kwa sasa.</translation>
 <translation id="5087580092889165836">Ongeza kadi</translation>
 <translation id="5089810972385038852">Jimbo</translation>
@@ -538,7 +533,7 @@
 <translation id="5720705177508910913">Mtumiaji wa sasa</translation>
 <translation id="5732392974455271431">Wazazi wako wanaweza kukuondolea kizuizi</translation>
 <translation id="5763042198335101085">Andika anwani sahihi ya barua pepe</translation>
-<translation id="5765072501007116331">Chagua anwani ili uone mbinu za kuwasilisha na mahitaji</translation>
+<translation id="5765072501007116331">Chagua mahali ili uone njia za kusafirisha na mahitaji</translation>
 <translation id="5778550464785688721">Udhibiti kamili wa vifaa vya MIDI</translation>
 <translation id="5784606427469807560">Kulikuwa na tatizo wakati wa kuthibitisha kadi yako. Angalia muunganisho wako wa intaneti kisha ujaribu tena.</translation>
 <translation id="5785756445106461925">Mbali na hayo, ukurasa huu una rasilimali nyingine zisizo salama. Rasilimali hizi zinaweza kuangaliwa na watu wengine wanaosafiri, na zinaweza kurekebishwa na mvamizi kubadilisha mwonekano wa ukurasa.</translation>
@@ -601,7 +596,6 @@
 <translation id="6358450015545214790">Je, hii inamaanisha nini?</translation>
 <translation id="6386120369904791316">{COUNT,plural, =1{Pendekezo jingine 1}other{Mapendekezo mengine #}}</translation>
 <translation id="6387478394221739770">Unavutiwa na vipengee vipya vizuri vya Chrome? Jaribu kituo chetu cha beta katika chrome.com/beta.</translation>
-<translation id="6389758589412724634">Nafasi ya kuhifadhi kwenye Chromium iliisha ilipokuwa ikijaribu kuonyesha ukurasa huu wa wavuti.</translation>
 <translation id="6404511346730675251">Badilisha alamisho</translation>
 <translation id="6410264514553301377">Weka tarehe ya mwisho wa matumizi na CVC ya <ph name="CREDIT_CARD" /></translation>
 <translation id="6414888972213066896">Umewaomba wazazi wako ruhusa ya kuitembelea tovuti hii</translation>
@@ -624,7 +618,6 @@
 <translation id="6556915248009097796">Muda wa kutumika utakwisha: <ph name="EXPIRATION_DATE_ABBR" />, mara ya mwisho ilitumika <ph name="LAST_USED_DATE_NO_DETAIL" /></translation>
 <translation id="6563469144985748109">Msimamizi wako bado hajaiidhinisha</translation>
 <translation id="6569060085658103619">Unaangalia ukurasa wa kiendelezi</translation>
-<translation id="6593753688552673085">chini ya <ph name="UPPER_ESTIMATE" /></translation>
 <translation id="6596325263575161958">Chaguo za usimbaji fiche</translation>
 <translation id="662080504995468778">Usiondoke</translation>
 <translation id="6626291197371920147">Ongeza nambari sahihi ya kadi</translation>
@@ -636,7 +629,6 @@
 <translation id="6710594484020273272">&lt;Andika neno unalotaka kutafuta&gt;</translation>
 <translation id="6711464428925977395">Kuna hitilafu katika seva mbadala, au anwani siyo sahihi.</translation>
 <translation id="6727102863431372879">Weka</translation>
-<translation id="6731320287533051140">{COUNT,plural, =0{hamna}=1{Kipengee 1}other{Vipengee #}}</translation>
 <translation id="674375294223700098">Hitilafu isiyojulikana ya cheti cha seva.</translation>
 <translation id="6753269504797312559">Thamani ya sera</translation>
 <translation id="6757797048963528358">Kifaa chako kiko katika hali tuli.</translation>
@@ -672,7 +664,7 @@
 <translation id="7090678807593890770">Tafuta <ph name="LINK" /> kwenye Google</translation>
 <translation id="7119414471315195487">Funga vichupo au programu nyingine</translation>
 <translation id="7129409597930077180">Haiwezi kusafirisha kwenda kwenye anwani hii. Chagua anwani tofauti.</translation>
-<translation id="7138472120740807366">Mbinu ya kuwasilisha</translation>
+<translation id="7138472120740807366">Njia ya kusafirisha</translation>
 <translation id="7139724024395191329">Emirate</translation>
 <translation id="7155487117670177674">Malipo si salama</translation>
 <translation id="7179921470347911571">Zindua upya Sasa</translation>
@@ -742,6 +734,7 @@
 <translation id="7669271284792375604">Wavamizi kwenye tovuti hii wanaweza kujaribu kukulaghai kusakinisha programu zinazoathiri hali yako ya kuvinjari (kwa mfano, kwa kubadilisha ukurasa wako wa kwanza au kwa kuonyesha matangazo ya ziada kwenye tovuti unazotembelea).</translation>
 <translation id="7674629440242451245">Unavutiwa na vipengee vipya vizuri vya Chrome? Jaribu kituo chetu cha dev katika chrome.com/dev.</translation>
 <translation id="7682287625158474539">Anwani ya Kufikishia</translation>
+<translation id="7701040980221191251">Hamna</translation>
 <translation id="7704050614460855821"><ph name="BEGIN_LINK" />Nenda kwenye <ph name="SITE" /> (isiyo salama)<ph name="END_LINK" /></translation>
 <translation id="7714464543167945231">Cheti</translation>
 <translation id="7716424297397655342">Faili hii haiwezi kupakiwa kutoka akiba</translation>
@@ -781,7 +774,6 @@
 <translation id="8041089156583427627">Tuma Maoni</translation>
 <translation id="8041940743680923270">Tumia chaguo-msingi la duniani (Uliza)</translation>
 <translation id="8088680233425245692">Haikufaulu kuangalia makala.</translation>
-<translation id="8089520772729574115">chini ya MB 1</translation>
 <translation id="8091372947890762290">Uwashaji unasubiri kwenye seva</translation>
 <translation id="8118489163946903409">Njia ya kulipa</translation>
 <translation id="8131740175452115882">Thibitisha</translation>
diff --git a/components/strings/components_strings_ta.xtb b/components/strings/components_strings_ta.xtb
index f49364f4..355d9b0 100644
--- a/components/strings/components_strings_ta.xtb
+++ b/components/strings/components_strings_ta.xtb
@@ -220,7 +220,6 @@
 <translation id="2826760142808435982">இந்த இணைப்பு <ph name="CIPHER" /> ஐப் பயன்படுத்தி குறியாக்கப்பட்டது, அங்கீகரிக்கப்பட்டது, ஒரு முக்கிய பரிமாற்ற செயல்முறையாக <ph name="KX" /> ஐப் பயன்படுத்துகிறது.</translation>
 <translation id="2835170189407361413">படிவத்தை அழி</translation>
 <translation id="2889159643044928134">மீண்டும் ஏற்ற வேண்டாம்</translation>
-<translation id="2900469785430194048">நினைவகப் பற்றாக்குறையினால், Google Chrome இந்த இணையப்பக்கத்தைக் காட்டவில்லை.</translation>
 <translation id="2909946352844186028">பிணைய மாற்றம் கண்டறியப்பட்டது.</translation>
 <translation id="2916038427272391327">பிற நிரல்களை மூடவும்</translation>
 <translation id="2922350208395188000">சேவையகச் சான்றிதழை சோதிக்க முடியவில்லை.</translation>
@@ -243,7 +242,6 @@
 <translation id="3024663005179499861">தவறான கொள்கை வகை</translation>
 <translation id="3032412215588512954">தளத்தை மீண்டும் ஏற்றவா?</translation>
 <translation id="3037605927509011580">அச்சச்சோ!</translation>
-<translation id="3040955737384246924">{COUNT,plural, =0{ஒத்திசைத்த சாதனங்களில் குறைந்தது 1 உருப்படி உள்ளது}=1{1 உருப்படி (ஒத்திசைத்த சாதனங்களில் இதற்கு மேல் உள்ளன)}other{# உருப்படிகள் (ஒத்திசைத்த சாதனங்களில் இதற்கு மேல் உள்ளன)}}</translation>
 <translation id="3041612393474885105">சான்றிதழ் தகவல்</translation>
 <translation id="3063697135517575841">இப்போது உங்கள் கார்டை உறுதிசெய்ய முடியவில்லை. பிறகு முயலவும்.</translation>
 <translation id="3064966200440839136">வெளிப்புறப் பயன்பாட்டின் மூலம் பணத்தை செலுத்த, மறைநிலையிலிருந்து வெளியேறுகிறீர்கள். தொடரவா?</translation>
@@ -334,7 +332,6 @@
 <translation id="3681007416295224113">சான்றிதழ் தகவல்</translation>
 <translation id="3690164694835360974">உள்நுழைவது பாதுகாப்பானது அல்ல</translation>
 <translation id="3693415264595406141">கடவுச்சொல்:</translation>
-<translation id="3696411085566228381">எதுவுமில்லை</translation>
 <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation>
 <translation id="370665806235115550">ஏற்றுகிறது…</translation>
 <translation id="3712624925041724820">உரிமம் முடிந்தது</translation>
@@ -382,7 +379,6 @@
 <translation id="4171400957073367226">தவறான சரிபார்ப்பு கையொப்பம்</translation>
 <translation id="4196861286325780578">&amp;நகர்த்தலை மீண்டும் செய்</translation>
 <translation id="4203896806696719780"><ph name="BEGIN_LINK" />ஃபயர்வால் மற்றும் ஆண்டிவைரஸ் உள்ளமைவைச் சரிபார்த்தல்<ph name="END_LINK" /></translation>
-<translation id="4206349416402437184">{COUNT,plural, =0{பயன்பாடுகள் இல்லை}=1{1 பயன்பாடு ($1)}=2{2 பயன்பாடுகள் ($1, $2)}other{# பயன்பாடுகள் ($1, $2, $3)}}</translation>
 <translation id="4220128509585149162">செயலிழப்புகள்</translation>
 <translation id="4226937834893929579"><ph name="BEGIN_LINK" />நெட்வொர்க் டயக்னஸ்டிக்ஸ் கருவியை இயக்கவும்<ph name="END_LINK" />.</translation>
 <translation id="4250431568374086873">இந்தத் தளத்திற்கான உங்கள் இணைப்பு, முழுப் பாதுகாப்புடன் இல்லை</translation>
@@ -466,7 +462,6 @@
 <translation id="5045550434625856497">தவறான கடவுச்சொல்</translation>
 <translation id="5056549851600133418">உங்களுக்கான கட்டுரைகள்</translation>
 <translation id="5070335125961472645"><ph name="BEGIN_LINK" />ப்ராக்ஸி முகவரியைச் சரிபார்த்தல்<ph name="END_LINK" /></translation>
-<translation id="5076731569460970710">{COUNT,plural, =0{குக்கீகள் எதுவுமில்லை}=1{குக்கீகளை ஒரு தளம் பயன்படுத்துகிறது. }other{குக்கீகளை # தளங்கள் பயன்படுத்துகின்றன. }}</translation>
 <translation id="5087286274860437796">தற்போது சேவையகத்தின் சான்றிதழ் செல்லுபடியாகாது.</translation>
 <translation id="5087580092889165836">கார்டைச் சேர்</translation>
 <translation id="5089810972385038852">மாநிலம்</translation>
@@ -597,7 +592,6 @@
 <translation id="6358450015545214790">இவற்றின் பொருள் என்ன?</translation>
 <translation id="6386120369904791316">{COUNT,plural, =1{மேலும் 1 பரிந்துரை}other{மேலும் # பரிந்துரைகள்}}</translation>
 <translation id="6387478394221739770">புதிய Chrome அம்சங்களில் ஆர்வம் உள்ளதா? chrome.com/beta இல் எங்களுடைய பீட்டா அலைவரிசையை முயற்சிக்கவும்.</translation>
-<translation id="6389758589412724634">நினைவகப் பற்றாக்குறையினால், Chromium இந்த இணையப்பக்கத்தைக் காட்டவில்லை.</translation>
 <translation id="6404511346730675251">புக்மார்க்குகளைத் திருத்து</translation>
 <translation id="6410264514553301377"><ph name="CREDIT_CARD" />க்கான காலாவதித் தேதியையும் CVC எண்ணையும் உள்ளிடவும்</translation>
 <translation id="6414888972213066896">இந்தத் தளத்தைப் பார்வையிடலாமா என, நீங்கள் பெற்றோரிடம் கேட்டுள்ளீர்கள்</translation>
@@ -620,7 +614,6 @@
 <translation id="6556915248009097796">காலாவதி: <ph name="EXPIRATION_DATE_ABBR" />, கடைசியாகப் பயன்படுத்தியது: <ph name="LAST_USED_DATE_NO_DETAIL" /></translation>
 <translation id="6563469144985748109">இன்னும் உங்கள் நிர்வாகி அனுமதிக்கவில்லை</translation>
 <translation id="6569060085658103619">நீட்டிப்புப் பக்கத்தைப் பார்க்கிறீர்கள்</translation>
-<translation id="6593753688552673085"><ph name="UPPER_ESTIMATE" />க்கும் குறைவாக உள்ளது</translation>
 <translation id="6596325263575161958">குறியாக்க விருப்பங்கள்</translation>
 <translation id="662080504995468778">வேண்டாம்</translation>
 <translation id="6626291197371920147">சரியான கார்டு எண்ணைச் சேர்க்கவும்</translation>
@@ -632,7 +625,6 @@
 <translation id="6710594484020273272">&lt;தேடல் வார்த்தையை உள்ளிடுக&gt;</translation>
 <translation id="6711464428925977395">ப்ராக்ஸி சர்வரில் ஏதோ தவறு உள்ளது அல்லது முகவரி தவறாக உள்ளது.</translation>
 <translation id="6727102863431372879">அமை</translation>
-<translation id="6731320287533051140">{COUNT,plural, =0{உருப்படிகள் இல்லை}=1{1 உருப்படி}other{# உருப்படிகள்}}</translation>
 <translation id="674375294223700098">தெரியாத சேவையகச் சான்றிதழ் பிழை.</translation>
 <translation id="6753269504797312559">கொள்கை மதிப்பு</translation>
 <translation id="6757797048963528358">உங்கள் சாதனம் உறக்கநிலைக்குச் சென்றது.</translation>
@@ -738,6 +730,7 @@
 <translation id="7669271284792375604">இந்தத் தளத்தில் உள்ள ஹேக்கர்கள், உங்களை ஏமாற்றி (எடுத்துக்காட்டாக, உங்கள் முகப்புப் பக்கத்தை மாற்றுவது அல்லது நீங்கள் பார்வையிடும் தளங்களில் கூடுதல் விளம்பரங்களைக் காட்டுவது), உங்கள் உலாவல் அனுபவத்தைப் பாதிக்கக்கூடிய நிரல்களை நிறுவ வைக்கலாம்.</translation>
 <translation id="7674629440242451245">புதிய Chrome அம்சங்களில் ஆர்வமாக உள்ளீர்களா? chrome.com/dev இல் எங்களுடைய dev சேனலை முயற்சிக்கவும்.</translation>
 <translation id="7682287625158474539">ஷிப்பிங்</translation>
+<translation id="7701040980221191251">எதுவுமில்லை</translation>
 <translation id="7704050614460855821"><ph name="BEGIN_LINK" /><ph name="SITE" /> (பாதுகாப்பற்ற தளம்) க்குச் செல்லவும்<ph name="END_LINK" /></translation>
 <translation id="7714464543167945231">சான்றிதழ்</translation>
 <translation id="7716424297397655342">தற்காலிகச் சேமிப்பிலிருந்து இந்தத் தளத்தை ஏற்ற முடியவில்லை</translation>
@@ -777,7 +770,6 @@
 <translation id="8041089156583427627">கருத்துத் தெரிவிக்கவும்</translation>
 <translation id="8041940743680923270">முழுமையான இயல்புநிலையைப் பயன்படுத்து (கேள்)</translation>
 <translation id="8088680233425245692">கட்டுரையைக் காட்டுவதில் தோல்வி.</translation>
-<translation id="8089520772729574115">1 மெ.பை. க்கும் குறைவாக உள்ளது</translation>
 <translation id="8091372947890762290">சேவையகத்தில் செயலாக்கம் நிலுவையிலுள்ளது</translation>
 <translation id="8118489163946903409">கட்டண முறை</translation>
 <translation id="8131740175452115882">உறுதிப்படுத்து</translation>
diff --git a/components/strings/components_strings_te.xtb b/components/strings/components_strings_te.xtb
index d93ff13..d70ef6f 100644
--- a/components/strings/components_strings_te.xtb
+++ b/components/strings/components_strings_te.xtb
@@ -220,10 +220,10 @@
 <translation id="2826760142808435982"><ph name="CIPHER" />ను ఉపయోగించి కనెక్షన్ గుప్తీకరించబడింది మరియు ప్రామాణీకరించబడింది మరియు <ph name="KX" />ను కీలకమైన పరివర్తన విధానంగా ఉపయోగిస్తుంది.</translation>
 <translation id="2835170189407361413">ఫారమ్‌ను తుడిచివేయి</translation>
 <translation id="2889159643044928134">మళ్లీ లోడ్ చేయవద్దు</translation>
-<translation id="2900469785430194048">Google Chrome ఈ వెబ్‌పేజీని ప్రదర్శించడానికి ప్రయత్నిస్తున్నప్పుడు మెమరీ అయిపోయింది.</translation>
 <translation id="2909946352844186028">నెట్‌వర్క్ మార్పు గుర్తించబడింది.</translation>
 <translation id="2916038427272391327">ఇతర ప్రోగ్రామ్‌లను మూసివేయండి</translation>
 <translation id="2922350208395188000">సర్వర్ యొక్క ప్రమాణపత్రం తనిఖీ చెయ్యబడదు.</translation>
+<translation id="2928905813689894207">బిల్లింగ్ చిరునామా</translation>
 <translation id="2941952326391522266">ఈ సర్వర్ <ph name="DOMAIN" /> అని నిరూపించుకోలేకపోయింది; దీని భద్రతా ప్రమాణపత్రం <ph name="DOMAIN2" /> నుండి జారీ చేయబడింది. ఇది తప్పుగా కాన్ఫిగర్ చేయడం వలన లేదా దాడిచేసే వ్యక్తి మీ కనెక్షన్‌కి అంతరాయం కలిగించడం వలన జరిగి ఉండవచ్చు.</translation>
 <translation id="2948083400971632585">మీరు సెట్టింగ్‌ల పేజీ నుండి కనెక్షన్ కోసం కాన్ఫిగర్ చేయబడిన ఏ ప్రాక్సీలను అయినా నిలిపివేయవచ్చు.</translation>
 <translation id="2955913368246107853">కనుగొను పట్టీని మూసివేయి</translation>
@@ -238,10 +238,10 @@
 <translation id="3005723025932146533">సేవ్ చేయబడిన కాపీని చూపు</translation>
 <translation id="3008447029300691911"><ph name="CREDIT_CARD" /> కార్డ్ CVCని నమోదు చేయండి. మీరు నిర్ధారించిన తర్వాత, మీ కార్డ్ వివరాలు ఈ సైట్‌తో భాగస్వామ్యం చేయబడతాయి.</translation>
 <translation id="3010559122411665027">జాబితా నమోదు "<ph name="ENTRY_INDEX" />": <ph name="ERROR" /></translation>
+<translation id="301521992641321250">స్వయంచాలకంగా బ్లాక్ చేయబడింది</translation>
 <translation id="3024663005179499861">చెల్లని విధాన రకం</translation>
 <translation id="3032412215588512954">మీరు ఈ సైట్‌ను మళ్లీ లోడ్ చేయాలనుకుంటున్నారా?</translation>
 <translation id="3037605927509011580">ఆవ్, స్నాప్!</translation>
-<translation id="3040955737384246924">{COUNT,plural, =0{సమకాలీకరించిన పరికరాల్లో కనీసం 1 అంశం}=1{1 అంశం (మరియు సమకాలీకరించిన పరికరాల్లో మరిన్ని)}other{# అంశాలు (మరియు సమకాలీకరించిన పరికరాల్లో మరిన్ని)}}</translation>
 <translation id="3041612393474885105">సర్టిఫికెట్ సమాచారం</translation>
 <translation id="3063697135517575841">Chrome ప్రస్తుతం మీ కార్డ్‌ను నిర్ధారించలేకపోయింది. దయచేసి తర్వాత మళ్లీ ప్రయత్నించండి.</translation>
 <translation id="3064966200440839136">బాహ్య అనువర్తనం ద్వారా చెల్లించడానికి అజ్ఞాత మోడ్ నుండి నిష్క్రమిస్తోంది. కొనసాగించాలా?</translation>
@@ -335,7 +335,6 @@
 <translation id="3681007416295224113">సర్టిఫికెట్ సమాచారం</translation>
 <translation id="3690164694835360974">లాగిన్ సురక్షితం కాదు</translation>
 <translation id="3693415264595406141">పాస్‌వర్డ్:</translation>
-<translation id="3696411085566228381">ఏదీ కాదు</translation>
 <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation>
 <translation id="370665806235115550">లోడ్ అవుతోంది...</translation>
 <translation id="3712624925041724820">లైసెన్స్‌లు అయిపోయాయి</translation>
@@ -383,7 +382,6 @@
 <translation id="4171400957073367226">ధృవీకరణ సంతకం చెల్లదు</translation>
 <translation id="4196861286325780578">&amp;తరలించడాన్ని పునరావృతం చేయి</translation>
 <translation id="4203896806696719780"><ph name="BEGIN_LINK" />ఫైర్‌వాల్ మరియు యాంటీవైరస్ కాన్ఫిగరేషన్‌లను తనిఖీ చేయడం<ph name="END_LINK" /></translation>
-<translation id="4206349416402437184">{COUNT,plural, =0{ఏదీ లేదు}=1{1 అనువర్తనం ($1)}=2{2 అనువర్తనాలు ($1, $2)}other{# అనువర్తనాలు ($1, $2, $3)}}</translation>
 <translation id="4220128509585149162">క్రాష్‌లు</translation>
 <translation id="4226937834893929579"><ph name="BEGIN_LINK" />నెట్‌వర్క్ సమస్య విశ్లేషణలను అమలు చేయడం ప్రయత్నించండి<ph name="END_LINK" />.</translation>
 <translation id="4250431568374086873">ఈ సైట్‌కి మీ కనెక్షన్ పూర్తి స్థాయిలో సురక్షితంగా లేదు</translation>
@@ -467,7 +465,6 @@
 <translation id="5045550434625856497">సరికాని పాస్‌వర్డ్</translation>
 <translation id="5056549851600133418">మీ కోసం కథనాలు</translation>
 <translation id="5070335125961472645"><ph name="BEGIN_LINK" />ప్రాక్సీ చిరునామాను తనిఖీ చేయడం<ph name="END_LINK" /></translation>
-<translation id="5076731569460970710">{COUNT,plural, =0{కుక్కీలు లేవు}=1{1 సైట్ కుక్కీలను ఉపయోగిస్తోంది. }other{# సైట్‌లు కుక్కీలను ఉపయోగిస్తున్నాయి. }}</translation>
 <translation id="5087286274860437796">ప్రస్తుతం సర్వర్ ప్రమాణపత్రం చెల్లదు.</translation>
 <translation id="5087580092889165836">కార్డ్‌ను జోడించు</translation>
 <translation id="5089810972385038852">రాష్ట్రం</translation>
@@ -574,6 +571,7 @@
 <translation id="6165508094623778733">మరింత తెలుసుకోండి</translation>
 <translation id="6169916984152623906">‌ఇప్పుడు మీరు వ్యక్తిగతంగా బ్రౌజ్ చేయవచ్చు మరియు ఈ పరికరాన్ని ఉపయోగించే ఇతర వ్యక్తులకు మీ కార్యాచరణ కనిపించదు. అయినప్పటికీ, డౌన్‌లోడ్‌లు మరియు బుక్‌మార్క్‌లు సేవ్ చేయబడతాయి.</translation>
 <translation id="6177128806592000436">ఈ సైట్‌కి మీ కనెక్షన్ సురక్షితంగా లేదు</translation>
+<translation id="6184817833369986695">(బృందం: <ph name="UPDATE_COHORT_NAME" />)</translation>
 <translation id="6203231073485539293">మీ ఇంటర్నెట్ కనెక్షన్‌ను తనిఖీ చేయండి</translation>
 <translation id="6218753634732582820">Chromium నుండి చిరునామాను తీసివేయాలా?</translation>
 <translation id="6221345481584921695">Google సురక్షిత బ్రౌజింగ్ ఇటీవల <ph name="BEGIN_LINK" />లో <ph name="END_LINK" />మాల్వేర్ గుర్తించింది<ph name="SITE" />. సాధారణంగా సురక్షితమైన వెబ్‌సైట్‌‌లకు కూడా కొన్నిసార్లు మాల్వేర్ సోకుతుంది. ఇటువంటి హానికరమైన కంటెంట్ మాల్వేర్ పంపిణీదారుగా ప్రసిద్ధిగాంచిన <ph name="SUBRESOURCE_HOST" /> నుండి సంక్రమిస్తుంది.</translation>
@@ -598,7 +596,6 @@
 <translation id="6358450015545214790">దీని అర్ధం ఏమిటి?</translation>
 <translation id="6386120369904791316">{COUNT,plural, =1{1 ఇతర సూచన}other{# ఇతర సూచనలు}}</translation>
 <translation id="6387478394221739770">అద్భుతమైన క్రొత్త Chrome లక్షణాల పట్ల ఆసక్తిగా ఉన్నారా? chrome.com/betaలో మా బీటా ఛానెల్‌ను ప్రయత్నించండి.</translation>
-<translation id="6389758589412724634">Chromium ఈ వెబ్‌పేజీని ప్రదర్శించడానికి ప్రయత్నిస్తున్నప్పుడు మెమరీ అయిపోయింది.</translation>
 <translation id="6404511346730675251">బుక్‌మార్క్‌ను సవరించు</translation>
 <translation id="6410264514553301377"><ph name="CREDIT_CARD" /> గడువు ముగింపు తేదీ మరియు CVCని నమోదు చేయండి</translation>
 <translation id="6414888972213066896">మీరు ఈ సైట్‌ని సందర్శించడానికి అనుమతించమని కోరుతూ మీ తల్లి/తండ్రికి అభ్యర్థన పంపారు</translation>
@@ -621,7 +618,6 @@
 <translation id="6556915248009097796">గడువు ముగింపు: <ph name="EXPIRATION_DATE_ABBR" />, చివరిగా ఉపయోగించినది <ph name="LAST_USED_DATE_NO_DETAIL" /></translation>
 <translation id="6563469144985748109">మీ నిర్వాహకుడు దీన్ని ఇంకా ఆమోదించలేదు</translation>
 <translation id="6569060085658103619">మీరు పొడిగింపు పేజీని వీక్షిస్తున్నారు</translation>
-<translation id="6593753688552673085"><ph name="UPPER_ESTIMATE" /> కంటే తక్కువ</translation>
 <translation id="6596325263575161958">గుప్తీకరణ ఎంపికలు</translation>
 <translation id="662080504995468778">ఇందులోనే ఉంచు</translation>
 <translation id="6626291197371920147">చెల్లుబాటయ్యే కార్డ్ నంబర్‌ను జోడించండి</translation>
@@ -633,7 +629,6 @@
 <translation id="6710594484020273272">&lt;శోధన పదాన్ని టైప్ చేయండి&gt;</translation>
 <translation id="6711464428925977395">ప్రాక్సీ సర్వర్‌లో ఏదో తప్పు ఉంది లేదా చిరునామా సరైనది కాదు.</translation>
 <translation id="6727102863431372879">సెట్ చెయ్యి</translation>
-<translation id="6731320287533051140">{COUNT,plural, =0{ఏదీ లేదు}=1{1 అంశం}other{# అంశాలు}}</translation>
 <translation id="674375294223700098">తెలియని సర్వర్ ప్రమాణపత్రం లోపం.</translation>
 <translation id="6753269504797312559">విధానం విలువ</translation>
 <translation id="6757797048963528358">మీ పరికరం నిద్రావస్థకి వెళ్లింది.</translation>
@@ -676,6 +671,7 @@
 <translation id="7180611975245234373">రీఫ్రెష్ చేయి</translation>
 <translation id="7182878459783632708">విధానాలను సెట్ చేయలేదు</translation>
 <translation id="7186367841673660872">ఈ పేజీ<ph name="ORIGINAL_LANGUAGE" />నుండి<ph name="LANGUAGE_LANGUAGE" />కు అనువదించబడింది</translation>
+<translation id="7192203810768312527"><ph name="SIZE" />ని ఖాళీ చేస్తుంది. మీ తదుపరి సందర్శనలో కొన్ని సైట్‌లు మరింత నెమ్మదిగా లోడ్ కావచ్చు.</translation>
 <translation id="719464814642662924">వీసా</translation>
 <translation id="7210863904660874423"><ph name="HOST_NAME" /> భద్రతా ప్రమాణాలకు కట్టుబడి లేదు.</translation>
 <translation id="721197778055552897">ఈ సమస్య గురించి <ph name="BEGIN_LINK" />మరింత తెలుసుకోండి <ph name="END_LINK" />.</translation>
@@ -738,6 +734,7 @@
 <translation id="7669271284792375604">ఈ సైట్‌లోని దాడి చేసేవారు మీ బ్రౌజింగ్ అనుభవానికి (ఉదాహరణకు, మీ హోమ్ పేజీని మార్చడం లేదా మీరు సందర్శించే సైట్‌ల్లో అదనపు ప్రకటనలను చూపడం ద్వారా) హాని కలిగించే ప్రోగ్రామ్‌లను ఇన్‌స్టాల్ చేసే విధంగా మిమ్మల్ని మోసగించడానికి ప్రయత్నించవచ్చు.</translation>
 <translation id="7674629440242451245">అద్భుతమైన క్రొత్త Chrome లక్షణాల పట్ల ఆసక్తిగా ఉన్నారా? chrome.com/devలో మా డెవలపర్ ఛానెల్‌ను ప్రయత్నించండి.</translation>
 <translation id="7682287625158474539">ఓడ రవాణా</translation>
+<translation id="7701040980221191251">ఏదీ కాదు</translation>
 <translation id="7704050614460855821"><ph name="BEGIN_LINK" /><ph name="SITE" />కి కొనసాగించండి (అసురక్షితం)<ph name="END_LINK" /></translation>
 <translation id="7714464543167945231">సర్టిఫికెట్</translation>
 <translation id="7716424297397655342">కాష్ నుండి ఈ సైట్‌ను లోడ్ చేయలేకపోయాము</translation>
@@ -777,7 +774,6 @@
 <translation id="8041089156583427627">ప్రతిస్పందనను పంపండి</translation>
 <translation id="8041940743680923270">సార్వజనీన డిఫాల్ట్‌ను ఉపయోగించు (అడుగు)</translation>
 <translation id="8088680233425245692">కథనాన్ని వీక్షించడంలో విఫలమైంది.</translation>
-<translation id="8089520772729574115">1 MB కంటే తక్కువ</translation>
 <translation id="8091372947890762290">సక్రియం సర్వర్‌లో పెండింగ్‌లో ఉంది</translation>
 <translation id="8118489163946903409">చెల్లింపు పద్ధతి</translation>
 <translation id="8131740175452115882">నిర్ధారించు</translation>
diff --git a/components/strings/components_strings_th.xtb b/components/strings/components_strings_th.xtb
index 49978fc..48a7f73 100644
--- a/components/strings/components_strings_th.xtb
+++ b/components/strings/components_strings_th.xtb
@@ -67,7 +67,7 @@
 <translation id="1517433312004943670">ต้องระบุหมายเลขโทรศัพท์</translation>
 <translation id="1519264250979466059">วันที่สร้าง</translation>
 <translation id="153384715582417236">เสร็จเรียบร้อย</translation>
-<translation id="1549470594296187301">ต้องเปิดใช้ JavaScript เพื่อใช้คุณลักษณะนี้</translation>
+<translation id="1549470594296187301">ต้องเปิดใช้ JavaScript เพื่อใช้ฟีเจอร์นี้</translation>
 <translation id="1555130319947370107">สีน้ำเงิน</translation>
 <translation id="1559528461873125649">ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว</translation>
 <translation id="1583429793053364125">มีสิ่งผิดปกติเกิดขึ้นในขณะที่แสดงหน้าเว็บนี้</translation>
@@ -220,7 +220,6 @@
 <translation id="2826760142808435982">การเชื่อมต่อถูกเข้ารหัสและรับรองความถูกต้องโดยใช้ <ph name="CIPHER" /> และใช้ <ph name="KX" /> เป็นกลไกการแลกเปลี่ยนคีย์</translation>
 <translation id="2835170189407361413">ล้างฟอร์ม</translation>
 <translation id="2889159643044928134">อย่าโหลดซ้ำ</translation>
-<translation id="2900469785430194048">Google Chrome หน่วยความจำเต็มเมื่อพยายามแสดงหน้าเว็บนี้</translation>
 <translation id="2909946352844186028">ตรวจพบการเปลี่ยนแปลงเครือข่าย</translation>
 <translation id="2916038427272391327">ปิดโปรแกรมอื่นๆ</translation>
 <translation id="2922350208395188000">ไม่สามารถตรวจสอบใบรับรองของเซิร์ฟเวอร์</translation>
@@ -243,7 +242,6 @@
 <translation id="3024663005179499861">ประเภทนโยบายไม่ถูกต้อง</translation>
 <translation id="3032412215588512954">คุณต้องการโหลดเว็บไซต์นี้ซ้ำใช่ไหม</translation>
 <translation id="3037605927509011580">แย่จัง!</translation>
-<translation id="3040955737384246924">{COUNT,plural, =0{อย่างน้อย 1 รายการบนอุปกรณ์ที่ซิงค์}=1{1 รายการ (และมากกว่าบนอุปกรณ์ที่ซิงค์)}other{# รายการ (และมากกว่าบนอุปกรณ์ที่ซิงค์)}}</translation>
 <translation id="3041612393474885105">ข้อมูลในใบรับรอง</translation>
 <translation id="3063697135517575841">Chrome ไม่สามารถยืนยันบัตรของคุณได้ในขณะนี้ โปรดลองอีกครั้งในภายหลัง</translation>
 <translation id="3064966200440839136">ออกจากโหมดไม่ระบุตัวตนเพื่อชำระเงินผ่านแอปพลิเคชันภายนอก ดำเนินการต่อไหม</translation>
@@ -328,7 +326,7 @@
 <translation id="3623476034248543066">แสดงค่า</translation>
 <translation id="3630155396527302611">หากโปรแกรมอยู่ในรายการที่ได้รับอนุญาตให้เข้าถึงเครือข่ายอยู่แล้ว
       ลองนำโปรแกรมออกจากรายการและเพิ่มกลับเข้าไปใหม่</translation>
-<translation id="3648607100222897006">คุณลักษณะทดลองเหล่านี้อาจมีการเปลี่ยนแปลง เสียหาย หรือยกเลิกไปได้ตลอดเวลา เราไม่รับประกันใดๆ เกี่ยวกับสิ่งที่อาจเกิดขึ้นทั้งสิ้นหากคุณเปิดใช้การทดลองรายการใดรายการหนึ่งนี้ เบราว์เซอร์ของคุณอาจพังโดยไม่มีสัญญาณเตือน ยิ่งไปกว่านั้น เบราว์เซอร์อาจลบข้อมูลทั้งหมดของคุณได้ หรือการรักษาความปลอดภัยและความเป็นส่วนตัวของคุณอาจโดนคุกคามโดยไม่คาดคิด การทดลองใดๆ ที่คุณเปิดใช้งานจะเปิดใช้สำหรับผู้ใช้ทุกคนที่ใช้เบราว์เซอร์นี้ด้วย โปรดดำเนินการด้วยความระมัดระวัง</translation>
+<translation id="3648607100222897006">ฟีเจอร์ทดลองเหล่านี้อาจมีการเปลี่ยนแปลง เสียหาย หรือยกเลิกไปได้ตลอดเวลา เราไม่รับประกันใดๆ เกี่ยวกับสิ่งที่อาจเกิดขึ้นทั้งสิ้นหากคุณเปิดใช้การทดลองรายการใดรายการหนึ่งนี้ เบราว์เซอร์ของคุณอาจพังโดยไม่มีสัญญาณเตือน ยิ่งไปกว่านั้น เบราว์เซอร์อาจลบข้อมูลทั้งหมดของคุณได้ หรือการรักษาความปลอดภัยและความเป็นส่วนตัวของคุณอาจโดนคุกคามโดยไม่คาดคิด การทดลองใดๆ ที่คุณเปิดใช้งานจะเปิดใช้สำหรับผู้ใช้ทุกคนที่ใช้เบราว์เซอร์นี้ด้วย โปรดดำเนินการด้วยความระมัดระวัง</translation>
 <translation id="3650584904733503804">การตรวจสอบสำเร็จ</translation>
 <translation id="3655670868607891010">หากคุณเห็นข้อความนี้บ่อยๆ ให้ลองไปที่ <ph name="HELP_LINK" /></translation>
 <translation id="3658742229777143148">การแก้ไข</translation>
@@ -337,7 +335,6 @@
 <translation id="3681007416295224113">ข้อมูลในใบรับรอง</translation>
 <translation id="3690164694835360974">การเข้าสู่ระบบไม่ปลอดภัย</translation>
 <translation id="3693415264595406141">รหัสผ่าน:</translation>
-<translation id="3696411085566228381">ไม่มี</translation>
 <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation>
 <translation id="370665806235115550">กำลังโหลด ...</translation>
 <translation id="3712624925041724820">ใบอนุญาตหมด</translation>
@@ -385,7 +382,6 @@
 <translation id="4171400957073367226">ลายเซ็นยืนยันไม่ถูกต้อง</translation>
 <translation id="4196861286325780578">&amp;ทำซ้ำการย้าย</translation>
 <translation id="4203896806696719780"><ph name="BEGIN_LINK" />ตรวจสอบไฟร์วอลล์และการกำหนดค่าการป้องกันไวรัส<ph name="END_LINK" /></translation>
-<translation id="4206349416402437184">{COUNT,plural, =0{ไม่มี}=1{1 แอป ($1)}=2{2 แอป ($1, $2)}other{# แอป ($1, $2, $3)}}</translation>
 <translation id="4220128509585149162">การขัดข้อง</translation>
 <translation id="4226937834893929579"><ph name="BEGIN_LINK" />ลองเรียกใช้การวินิจฉัยเครือข่าย<ph name="END_LINK" /></translation>
 <translation id="4250431568374086873">การเชื่อมต่อกับเว็บไซต์นี้ไม่ปลอดภัยโดยสมบูรณ์</translation>
@@ -469,7 +465,6 @@
 <translation id="5045550434625856497">รหัสผ่านไม่ถูกต้อง</translation>
 <translation id="5056549851600133418">บทความสำหรับคุณ</translation>
 <translation id="5070335125961472645"><ph name="BEGIN_LINK" />ตรวจสอบที่อยู่พร็อกซี<ph name="END_LINK" /></translation>
-<translation id="5076731569460970710">{COUNT,plural, =0{ไม่มีคุกกี้}=1{1 เว็บไซต์ใช้คุกกี้ }other{# เว็บไซต์ใช้คุกกี้ }}</translation>
 <translation id="5087286274860437796">ใบรับรองของเซิร์ฟเวอร์ไม่สามารถใช้ได้ในขณะนี้</translation>
 <translation id="5087580092889165836">เพิ่มบัตร</translation>
 <translation id="5089810972385038852">รัฐ</translation>
@@ -600,8 +595,7 @@
 <translation id="6355080345576803305">การลบล้างเซสชันสาธารณะ</translation>
 <translation id="6358450015545214790">นี่หมายถึงอะไร</translation>
 <translation id="6386120369904791316">{COUNT,plural, =1{อีก 1 คำแนะนำ}other{อีก # คำแนะนำ}}</translation>
-<translation id="6387478394221739770">หากสนใจในคุณลักษณะสุดเจ๋งของ Chrome ใหม่ ลองใช้เวอร์ชันเบต้าของเราที่ chrome.com/beta</translation>
-<translation id="6389758589412724634">Chromium หน่วยความจำเต็มเมื่อพยายามแสดงหน้าเว็บนี้</translation>
+<translation id="6387478394221739770">หากสนใจในฟีเจอร์สุดเจ๋งของ Chrome ใหม่ ลองใช้เวอร์ชันเบต้าของเราที่ chrome.com/beta</translation>
 <translation id="6404511346730675251">แก้ไขบุ๊กมาร์ก</translation>
 <translation id="6410264514553301377">ป้อนวันหมดอายุและ CVC ของ <ph name="CREDIT_CARD" /></translation>
 <translation id="6414888972213066896">คุณถามผู้ปกครองแล้วว่าสามารถเข้าชมเว็บไซต์นี้ได้ไหม</translation>
@@ -624,7 +618,6 @@
 <translation id="6556915248009097796">วันที่หมดอายุ: <ph name="EXPIRATION_DATE_ABBR" /> ใช้ล่าสุดเมื่อ <ph name="LAST_USED_DATE_NO_DETAIL" /></translation>
 <translation id="6563469144985748109">ผู้จัดการยังไม่ได้อนุมัติเว็บไซต์นี้</translation>
 <translation id="6569060085658103619">คุณกำลังดูหน้าส่วนขยาย</translation>
-<translation id="6593753688552673085">น้อยกว่า <ph name="UPPER_ESTIMATE" /></translation>
 <translation id="6596325263575161958">ตัวเลือกการเข้ารหัส</translation>
 <translation id="662080504995468778">อยู่ต่อ</translation>
 <translation id="6626291197371920147">เพิ่มหมายเลขบัตรที่ถูกต้อง</translation>
@@ -636,7 +629,6 @@
 <translation id="6710594484020273272">&lt;พิมพ์ข้อความค้นหา&gt;</translation>
 <translation id="6711464428925977395">พร็อกซีเซิร์ฟเวอร์ผิดปกติหรือที่อยู่ไม่ถูกต้อง</translation>
 <translation id="6727102863431372879">ตั้งค่า</translation>
-<translation id="6731320287533051140">{COUNT,plural, =0{ไม่มี}=1{1 รายการ}other{# รายการ}}</translation>
 <translation id="674375294223700098">ข้อผิดพลาดใบรับรองของเซิร์ฟเวอร์ที่ไม่รู้จัก</translation>
 <translation id="6753269504797312559">ค่านโยบาย</translation>
 <translation id="6757797048963528358">อุปกรณ์ของคุณเข้าสู่โหมดสลีปแล้ว</translation>
@@ -740,8 +732,9 @@
 <translation id="7667346355482952095">โทเค็นนโยบายที่ส่งกลับว่างเปล่าหรือไม่ตรงกับโทเค็นปัจจุบัน</translation>
 <translation id="7668654391829183341">อุปกรณ์ที่ไม่รู้จัก</translation>
 <translation id="7669271284792375604">ผู้โจมตีเว็บไซต์นี้อาจพยายามหลอกล่อให้คุณติดตั้งโปรแกรมที่เป็นอันตรายต่อประสบการณ์การท่องเว็บของคุณ (ตัวอย่างเช่น โดยการเปลี่ยนแปลงหน้าแรกหรือแสดงโฆษณาเพิ่มเติมในเว็บไซต์ที่คุณเข้าชม)</translation>
-<translation id="7674629440242451245">หากสนใจในคุณลักษณะใหม่ๆ สุดเจ๋งของ Chrome ลองใช้เวอร์ชันที่กำลังพัฒนาของเราที่ chrome.com/dev</translation>
+<translation id="7674629440242451245">หากสนใจในฟีเจอร์ใหม่ๆ สุดเจ๋งของ Chrome ลองใช้เวอร์ชันที่กำลังพัฒนาของเราที่ chrome.com/dev</translation>
 <translation id="7682287625158474539">จัดส่ง</translation>
+<translation id="7701040980221191251">ไม่มี</translation>
 <translation id="7704050614460855821"><ph name="BEGIN_LINK" />ไปยัง <ph name="SITE" /> (ไม่ปลอดภัย)<ph name="END_LINK" /></translation>
 <translation id="7714464543167945231">ใบรับรอง</translation>
 <translation id="7716424297397655342">ไม่สามารถโหลดเว็บไซต์นี้จากแคช</translation>
@@ -781,7 +774,6 @@
 <translation id="8041089156583427627">ส่งความคิดเห็น</translation>
 <translation id="8041940743680923270">ใช้ค่าเริ่มต้นสากล (ถาม)</translation>
 <translation id="8088680233425245692">การดูบทความล้มเหลว</translation>
-<translation id="8089520772729574115">ไม่ถึง 1 MB</translation>
 <translation id="8091372947890762290">กำลังรอการเปิดใช้งานบนเซิร์ฟเวอร์</translation>
 <translation id="8118489163946903409">วิธีการชำระเงิน</translation>
 <translation id="8131740175452115882">ยืนยัน</translation>
diff --git a/components/strings/components_strings_tr.xtb b/components/strings/components_strings_tr.xtb
index 150b914..232a5289 100644
--- a/components/strings/components_strings_tr.xtb
+++ b/components/strings/components_strings_tr.xtb
@@ -220,7 +220,6 @@
 <translation id="2826760142808435982">Bağlantı <ph name="CIPHER" /> kullanılarak şifrelenmiş ve kimliği doğrulanmıştır. Anahtar değişim mekanizması olarak <ph name="KX" /> kullanılır.</translation>
 <translation id="2835170189407361413">Formu temizle</translation>
 <translation id="2889159643044928134">Yeniden Yükleme</translation>
-<translation id="2900469785430194048">Bu web sayfası görüntülenmeye çalışılırken Google Chrome'da bellek kalmadı.</translation>
 <translation id="2909946352844186028">Bir ağ değişikliği algılandı.</translation>
 <translation id="2916038427272391327">Diğer programları kapatın</translation>
 <translation id="2922350208395188000">Sunucunun sertifikası kontrol edilemiyor.</translation>
@@ -243,7 +242,6 @@
 <translation id="3024663005179499861">Yanlış politika türü</translation>
 <translation id="3032412215588512954">Bu siteyi yeniden yüklemek istiyor musunuz?</translation>
 <translation id="3037605927509011580">Hay aksi!</translation>
-<translation id="3040955737384246924">{COUNT,plural, =0{senkronize edilmiş cihazlarda en az 1 öğe}=1{1 öğe (ve senkronize edilmiş cihazlarda daha fazlası)}other{# öğe (ve senkronize edilmiş cihazlarda daha fazlası)}}</translation>
 <translation id="3041612393474885105">Sertifika Bilgileri</translation>
 <translation id="3063697135517575841">Chrome şu anda kartınızı onaylayamıyor. Lütfen daha sonra tekrar deneyin.</translation>
 <translation id="3064966200440839136">Harici bir uygulama üzerinden ödeme gerçekleştirmek için gizli moddan çıkılacak. Devam edilsin mi?</translation>
@@ -337,7 +335,6 @@
 <translation id="3681007416295224113">Sertifika bilgileri</translation>
 <translation id="3690164694835360974">Giriş yapma işlemi güvenli değil</translation>
 <translation id="3693415264595406141">Şifre:</translation>
-<translation id="3696411085566228381">yok</translation>
 <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation>
 <translation id="370665806235115550">Yükleniyor...</translation>
 <translation id="3712624925041724820">Lisanslar bitti</translation>
@@ -385,7 +382,6 @@
 <translation id="4171400957073367226">Geçersiz doğrulama imzası</translation>
 <translation id="4196861286325780578">Taşımayı &amp;yeniden yap</translation>
 <translation id="4203896806696719780"><ph name="BEGIN_LINK" />Güvenlik duvarı ve virüsten korunma yapılandırmalarını kontrol etme<ph name="END_LINK" /></translation>
-<translation id="4206349416402437184">{COUNT,plural, =0{yok}=1{1 uygulama ($1)}=2{2 uygulama ($1, $2)}other{# uygulama ($1, $2, $3)}}</translation>
 <translation id="4220128509585149162">Kilitlenmeler</translation>
 <translation id="4226937834893929579"><ph name="BEGIN_LINK" />Ağ Teşhislerini çalıştırmayı deneyin<ph name="END_LINK" />.</translation>
 <translation id="4250431568374086873">Bu siteye bağlantınız tam olarak güvenli değil</translation>
@@ -469,7 +465,6 @@
 <translation id="5045550434625856497">Hatalı parola</translation>
 <translation id="5056549851600133418">Size uygun makaleler</translation>
 <translation id="5070335125961472645"><ph name="BEGIN_LINK" />Proxy adresini kontrol etme<ph name="END_LINK" /></translation>
-<translation id="5076731569460970710">{COUNT,plural, =0{Çerez yok}=1{1 site çerez kullanıyor. }other{# site çerez kullanıyor. }}</translation>
 <translation id="5087286274860437796">Sunucu sertifikası şu anda geçerli değil.</translation>
 <translation id="5087580092889165836">Kart ekle</translation>
 <translation id="5089810972385038852">Eyalet</translation>
@@ -601,7 +596,6 @@
 <translation id="6358450015545214790">Bunlar ne anlama geliyor?</translation>
 <translation id="6386120369904791316">{COUNT,plural, =1{1 öneri daha}other{# öneri daha}}</translation>
 <translation id="6387478394221739770">Chrome'daki etkileyici, yeni özellikler ilginizi çekiyor mu? chrome.com/beta adresinden beta kanalımızı deneyin.</translation>
-<translation id="6389758589412724634">Bu web sayfası görüntülenmeye çalışılırken Chromium'da bellek kalmadı.</translation>
 <translation id="6404511346730675251">Yer işaretini düzenle</translation>
 <translation id="6410264514553301377"><ph name="CREDIT_CARD" /> numaralı kartın son kullanma tarihini ve CVC kodunu girin</translation>
 <translation id="6414888972213066896">Ebeveyninize bu siteyi ziyaret etmenizin uygun olup olmadığını sordunuz</translation>
@@ -624,7 +618,6 @@
 <translation id="6556915248009097796">Son kullanım tarihi: <ph name="EXPIRATION_DATE_ABBR" />, son kullanıldığı tarih: <ph name="LAST_USED_DATE_NO_DETAIL" /></translation>
 <translation id="6563469144985748109">Yöneticiniz henüz onaylamadı</translation>
 <translation id="6569060085658103619">Bir uzantı sayfası görüntülüyorsunuz</translation>
-<translation id="6593753688552673085"><ph name="UPPER_ESTIMATE" />'tan az</translation>
 <translation id="6596325263575161958">Şifreleme seçenekleri</translation>
 <translation id="662080504995468778">Kal</translation>
 <translation id="6626291197371920147">Geçerli kart numarası ekle</translation>
@@ -636,7 +629,6 @@
 <translation id="6710594484020273272">&lt;Arama terimini yazın&gt;</translation>
 <translation id="6711464428925977395">Proxy sunucusunda bir sorun var veya adres yanlış.</translation>
 <translation id="6727102863431372879">Ayarla</translation>
-<translation id="6731320287533051140">{COUNT,plural, =0{yok}=1{1 öğe}other{# öğe}}</translation>
 <translation id="674375294223700098">Bilinmeyen sunucu sertifikası hatası.</translation>
 <translation id="6753269504797312559">Politika değeri</translation>
 <translation id="6757797048963528358">Cihazınız uyku moduna geçti.</translation>
@@ -742,6 +734,7 @@
 <translation id="7669271284792375604">Bu sitedeki saldırganlar web'e göz atma deneyiminize zarar veren programlar yüklemeniz için sizi kandırmayı (örneğin ana sayfanızı değiştirerek ya da ziyaret ettiğiniz sitelerde ek reklamlar görüntüleyerek) deneyebilir.</translation>
 <translation id="7674629440242451245">Chrome'daki etkileyici, yeni özellikler ilginizi çekiyor mu? chrome.com/dev adresinden geliştirici kanalımızı deneyin.</translation>
 <translation id="7682287625158474539">Sevkiyat</translation>
+<translation id="7701040980221191251">Yok</translation>
 <translation id="7704050614460855821"><ph name="BEGIN_LINK" /><ph name="SITE" /> sitesine ilerle (güvenli değil)<ph name="END_LINK" /></translation>
 <translation id="7714464543167945231">Sertifika</translation>
 <translation id="7716424297397655342">Bu site önbellekten yüklenemiyor</translation>
@@ -781,7 +774,6 @@
 <translation id="8041089156583427627">Görüş bildirin</translation>
 <translation id="8041940743680923270">Genel varsayılanı kullan (Sor)</translation>
 <translation id="8088680233425245692">Makale görüntülenemedi.</translation>
-<translation id="8089520772729574115">1 MB'tan az</translation>
 <translation id="8091372947890762290">Etkinleştirme sunucuda bekliyor</translation>
 <translation id="8118489163946903409">Ödeme yöntemi</translation>
 <translation id="8131740175452115882">Onayla</translation>
diff --git a/components/strings/components_strings_uk.xtb b/components/strings/components_strings_uk.xtb
index 9f0ccd2a..934ab9d 100644
--- a/components/strings/components_strings_uk.xtb
+++ b/components/strings/components_strings_uk.xtb
@@ -220,7 +220,6 @@
 <translation id="2826760142808435982">З’єднання зашифровано й автентифіковано з використанням шифру <ph name="CIPHER" /> і використовує механізм обміну ключами <ph name="KX" />.</translation>
 <translation id="2835170189407361413">Очистити форму</translation>
 <translation id="2889159643044928134">Не оновлювати</translation>
-<translation id="2900469785430194048">Недостатньо пам’яті Google Chrome, щоб показати цю веб-сторінку.</translation>
 <translation id="2909946352844186028">Виявлено зміну в мережі.</translation>
 <translation id="2916038427272391327">Закрийте інші програми</translation>
 <translation id="2922350208395188000">Сертифікат сервера неможливо перевірити.</translation>
@@ -243,7 +242,6 @@
 <translation id="3024663005179499861">Неправильний тип правила</translation>
 <translation id="3032412215588512954">Оновити цей сайт?</translation>
 <translation id="3037605927509011580">От халепа!</translation>
-<translation id="3040955737384246924">{COUNT,plural, =0{щонайменше 1 запис на синхронізованих пристроях}=1{1 запис (і більше на синхронізованих пристроях)}one{# запис (і більше на синхронізованих пристроях)}few{# записи (і більше на синхронізованих пристроях)}many{# записів (і більше на синхронізованих пристроях)}other{# запису (і більше на синхронізованих пристроях)}}</translation>
 <translation id="3041612393474885105">Інформація про сертифікат</translation>
 <translation id="3063697135517575841">Chrome не вдалося підтвердити дані вашої картки. Спробуйте пізніше.</translation>
 <translation id="3064966200440839136">Щоб оплатити в зовнішньому додатку, ви вийдете з режиму анонімного перегляду. Продовжити?</translation>
@@ -337,7 +335,6 @@
 <translation id="3681007416295224113">Інформація про сертифікат</translation>
 <translation id="3690164694835360974">Вхід не захищено</translation>
 <translation id="3693415264595406141">Пароль:</translation>
-<translation id="3696411085566228381">немає</translation>
 <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation>
 <translation id="370665806235115550">Завантаження...</translation>
 <translation id="3712624925041724820">Ліцензії вичерпано</translation>
@@ -385,7 +382,6 @@
 <translation id="4171400957073367226">Недійсний підпис для підтвердження</translation>
 <translation id="4196861286325780578">&amp;Повторити переміщення</translation>
 <translation id="4203896806696719780"><ph name="BEGIN_LINK" />перевірити конфігурацію брандмауера й антивірусної програми<ph name="END_LINK" /></translation>
-<translation id="4206349416402437184">{COUNT,plural, =0{немає}=1{1 додаток ($1)}=2{2 додатки ($1, $2)}one{# додаток ($1, $2, $3)}few{# додатки ($1, $2, $3)}many{# додатків ($1, $2, $3)}other{# додатка ($1, $2, $3)}}</translation>
 <translation id="4220128509585149162">Збої в роботі</translation>
 <translation id="4226937834893929579"><ph name="BEGIN_LINK" />Проведіть діагностику мережі<ph name="END_LINK" />.</translation>
 <translation id="4250431568374086873">Ваше з’єднання з цим сайтом не повністю захищене</translation>
@@ -469,7 +465,6 @@
 <translation id="5045550434625856497">Неправильний пароль</translation>
 <translation id="5056549851600133418">Статті для вас</translation>
 <translation id="5070335125961472645"><ph name="BEGIN_LINK" />перевірити адресу проксі-сервера<ph name="END_LINK" /></translation>
-<translation id="5076731569460970710">{COUNT,plural, =0{Немає файлів cookie}=1{1 сайт використовує файли cookie. }one{# сайт використовує файли cookie. }few{# сайти використовують файли cookie. }many{# сайтів використовують файли cookie. }other{# сайту використовує файли cookie. }}</translation>
 <translation id="5087286274860437796">Сертифікат сервера зараз недійсний.</translation>
 <translation id="5087580092889165836">Додати картку</translation>
 <translation id="5089810972385038852">Штат</translation>
@@ -601,7 +596,6 @@
 <translation id="6358450015545214790">Що це означає?</translation>
 <translation id="6386120369904791316">{COUNT,plural, =1{і ще 1 пропозиція}one{і ще # пропозиція}few{і ще # пропозиції}many{і ще # пропозицій}other{і ще # пропозиції}}</translation>
 <translation id="6387478394221739770">Хочете спробувати нові цікаві функції Chrome? Завантажте бета-версію зі сторінки chrome.com/beta.</translation>
-<translation id="6389758589412724634">Недостатньо пам’яті Chromium, щоб показати цю веб-сторінку.</translation>
 <translation id="6404511346730675251">Редагувати закладку</translation>
 <translation id="6410264514553301377">Введіть дату закінчення терміну дії та код CVC картки <ph name="CREDIT_CARD" /></translation>
 <translation id="6414888972213066896">Ви надіслали одному з батьків запит на перегляд цього сайту</translation>
@@ -624,7 +618,6 @@
 <translation id="6556915248009097796">Востаннє використано <ph name="LAST_USED_DATE_NO_DETAIL" />, діє до <ph name="EXPIRATION_DATE_ABBR" /></translation>
 <translation id="6563469144985748109">Адміністратор ще не схвалив його</translation>
 <translation id="6569060085658103619">Ви переглядаєте сторінку розширень</translation>
-<translation id="6593753688552673085">менше <ph name="UPPER_ESTIMATE" /></translation>
 <translation id="6596325263575161958">Параметри шифрування</translation>
 <translation id="662080504995468778">Залишитися</translation>
 <translation id="6626291197371920147">Додати дійсний номер картки</translation>
@@ -636,7 +629,6 @@
 <translation id="6710594484020273272">&lt;Введіть пошуковий термін&gt;</translation>
 <translation id="6711464428925977395">Помилка проксі-сервера або неправильна адреса.</translation>
 <translation id="6727102863431372879">Встановити</translation>
-<translation id="6731320287533051140">{COUNT,plural, =0{немає}=1{1 запис}one{# запис}few{# записи}many{# записів}other{# запису}}</translation>
 <translation id="674375294223700098">Помилка "Невідомий сертифікат сервера".</translation>
 <translation id="6753269504797312559">Значення правила</translation>
 <translation id="6757797048963528358">Ваш пристрій перейшов у режим сну.</translation>
@@ -742,6 +734,7 @@
 <translation id="7669271284792375604">Зловмисники на цьому сайті можуть обманом змусити вас установити програми, які погіршують роботу в Інтернеті (наприклад, змінюють вашу домашню сторінку або показують додаткову рекламу на сайтах, які ви відвідуєте).</translation>
 <translation id="7674629440242451245">Хочете спробувати нові цікаві функції Chrome? Завантажте версію для розробників зі сторінки chrome.com/dev.</translation>
 <translation id="7682287625158474539">Адреса для надсилання</translation>
+<translation id="7701040980221191251">Немає</translation>
 <translation id="7704050614460855821"><ph name="BEGIN_LINK" />Перейти на сайт <ph name="SITE" /> (небезпечно)<ph name="END_LINK" /></translation>
 <translation id="7714464543167945231">Сертифікат</translation>
 <translation id="7716424297397655342">Не вдається завантажити цей сайт із кешу</translation>
@@ -781,7 +774,6 @@
 <translation id="8041089156583427627">Надіслати відгук</translation>
 <translation id="8041940743680923270">Використовувати глобальне налаштування за умовчанням (Запитувати)</translation>
 <translation id="8088680233425245692">Не вдалося переглянути статтю.</translation>
-<translation id="8089520772729574115">менше 1 Мб</translation>
 <translation id="8091372947890762290">Активація очікує на сервері</translation>
 <translation id="8118489163946903409">Спосіб оплати</translation>
 <translation id="8131740175452115882">Підтвердити</translation>
diff --git a/components/strings/components_strings_vi.xtb b/components/strings/components_strings_vi.xtb
index 25fbf94f..1dff477 100644
--- a/components/strings/components_strings_vi.xtb
+++ b/components/strings/components_strings_vi.xtb
@@ -220,7 +220,6 @@
 <translation id="2826760142808435982">Kết nối được mã hóa và xác thực bằng <ph name="CIPHER" /> đồng thời sử dụng <ph name="KX" /> làm cơ chế trao đổi chính.</translation>
 <translation id="2835170189407361413">Xóa biểu mẫu</translation>
 <translation id="2889159643044928134">Không tải lại</translation>
-<translation id="2900469785430194048">Google Chrome đã hết bộ nhớ khi cố gắng hiển thị trang web này.</translation>
 <translation id="2909946352844186028">Đã phát hiện thấy thay đổi mạng.</translation>
 <translation id="2916038427272391327">Đóng các chương trình khác</translation>
 <translation id="2922350208395188000">Không thể kiểm tra chứng chỉ của máy chủ.</translation>
@@ -243,7 +242,6 @@
 <translation id="3024663005179499861">Loại chính sách sai</translation>
 <translation id="3032412215588512954">Bạn có muốn tải lại trang web này không?</translation>
 <translation id="3037605927509011580">Ôi, hỏng! </translation>
-<translation id="3040955737384246924">{COUNT,plural, =0{ít nhất 1 mục trên các thiết bị đã đồng bộ hóa}=1{1 mục (và nhiều mục khác trên các thiết bị đã đồng bộ hóa)}other{# mục (và nhiều mục khác trên các thiết bị đã đồng bộ hóa)}}</translation>
 <translation id="3041612393474885105">Thông tin Chứng chỉ</translation>
 <translation id="3063697135517575841">Chrome không thể xác nhận thẻ của bạn tại thời điểm này. Vui lòng thử lại sau.</translation>
 <translation id="3064966200440839136">Rời khỏi chế độ ẩn danh để thanh toán qua một ứng dụng bên ngoài. Tiếp tục?</translation>
@@ -337,7 +335,6 @@
 <translation id="3681007416295224113">Thông tin chứng chỉ</translation>
 <translation id="3690164694835360974">Đăng nhập không an toàn</translation>
 <translation id="3693415264595406141">Mật khẩu:</translation>
-<translation id="3696411085566228381">không có</translation>
 <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation>
 <translation id="370665806235115550">Đang tải...</translation>
 <translation id="3712624925041724820">Giấy phép không đủ</translation>
@@ -385,7 +382,6 @@
 <translation id="4171400957073367226">Chữ ký xác minh không hợp lệ</translation>
 <translation id="4196861286325780578">&amp;Làm lại di chuyển</translation>
 <translation id="4203896806696719780"><ph name="BEGIN_LINK" />Kiểm tra tường lửa và cấu hình diệt vi-rút<ph name="END_LINK" /></translation>
-<translation id="4206349416402437184">{COUNT,plural, =0{không có gì}=1{1 ứng dụng ($1)}=2{2 ứng dụng ($1, $2)}other{# ứng dụng ($1, $2, $3)}}</translation>
 <translation id="4220128509585149162">Sự cố</translation>
 <translation id="4226937834893929579"><ph name="BEGIN_LINK" />Thử chạy Chẩn đoán mạng<ph name="END_LINK" />.</translation>
 <translation id="4250431568374086873">Kết nối của bạn tới trang web này không đủ an toàn</translation>
@@ -469,7 +465,6 @@
 <translation id="5045550434625856497">Mật khẩu sai</translation>
 <translation id="5056549851600133418">Bài viết dành cho bạn</translation>
 <translation id="5070335125961472645"><ph name="BEGIN_LINK" />Kiểm tra địa chỉ proxy<ph name="END_LINK" /></translation>
-<translation id="5076731569460970710">{COUNT,plural, =0{Không có cookie}=1{1 trang web sử dụng cookie. }other{# trang web sử dụng cookie. }}</translation>
 <translation id="5087286274860437796">Chứng chỉ của máy chủ không hợp lệ tại thời điểm này.</translation>
 <translation id="5087580092889165836">Thêm thẻ</translation>
 <translation id="5089810972385038852">Tiểu bang</translation>
@@ -601,7 +596,6 @@
 <translation id="6358450015545214790">Những phần này có ý nghĩa gì?</translation>
 <translation id="6386120369904791316">{COUNT,plural, =1{1 đề xuất khác}other{# đề xuất khác}}</translation>
 <translation id="6387478394221739770">Bạn quan tâm đến các tính năng mới thú vị của Chrome? Hãy dùng thử kênh thử nghiệm beta của chúng tôi tại chrome.com/beta.</translation>
-<translation id="6389758589412724634">Chromium đã hết bộ nhớ khi cố gắng hiển thị trang web này.</translation>
 <translation id="6404511346730675251">Chỉnh sửa dấu trang</translation>
 <translation id="6410264514553301377">Nhập ngày hết hạn và CVC cho <ph name="CREDIT_CARD" /></translation>
 <translation id="6414888972213066896">Bạn đã hỏi cha mẹ mình xem có thể truy cập vào trang này hay không</translation>
@@ -624,7 +618,6 @@
 <translation id="6556915248009097796">Hết hạn: <ph name="EXPIRATION_DATE_ABBR" />, sử dụng lần cuối: <ph name="LAST_USED_DATE_NO_DETAIL" /></translation>
 <translation id="6563469144985748109">Người quản lý của bạn chưa phê duyệt trang web</translation>
 <translation id="6569060085658103619">Bạn đang xem trang tiện ích</translation>
-<translation id="6593753688552673085">dưới <ph name="UPPER_ESTIMATE" /></translation>
 <translation id="6596325263575161958">Tùy chọn mã hóa</translation>
 <translation id="662080504995468778">Ở lại</translation>
 <translation id="6626291197371920147">Thêm số thẻ hợp lệ</translation>
@@ -636,7 +629,6 @@
 <translation id="6710594484020273272">&lt;Nhập cụm từ tìm kiếm&gt;</translation>
 <translation id="6711464428925977395">Đã xảy ra sự cố với máy chủ proxy hoặc địa chỉ không chính xác.</translation>
 <translation id="6727102863431372879">Đặt</translation>
-<translation id="6731320287533051140">{COUNT,plural, =0{không có gì}=1{1 mục}other{# mục}}</translation>
 <translation id="674375294223700098">Lỗi chứng chỉ máy chủ không xác định.</translation>
 <translation id="6753269504797312559">Giá trị chính sách</translation>
 <translation id="6757797048963528358">Thiết bị của bạn đã chuyển sang chế độ ngủ.</translation>
@@ -742,6 +734,7 @@
 <translation id="7669271284792375604">Những kẻ tấn công trên trang web này có thể đánh lừa bạn cài đặt các chương trình ảnh hưởng đến trải nghiệm duyệt web của bạn (ví dụ: bằng cách thay đổi trang chủ của bạn hoặc hiển thị thêm quảng cáo trên các trang web bạn truy cập).</translation>
 <translation id="7674629440242451245">Bạn quan tâm đến các tính năng mới thú vị của Chrome? Hãy dùng thử kênh nhà phát triển của chúng tôi tại chrome.com/dev.</translation>
 <translation id="7682287625158474539">Địa chỉ gửi hàng</translation>
+<translation id="7701040980221191251">Không</translation>
 <translation id="7704050614460855821"><ph name="BEGIN_LINK" />Tiếp tục truy cập <ph name="SITE" /> (không an toàn)<ph name="END_LINK" /></translation>
 <translation id="7714464543167945231">Chứng chỉ</translation>
 <translation id="7716424297397655342">Không thể tải trang web này từ bộ nhớ cache</translation>
@@ -781,7 +774,6 @@
 <translation id="8041089156583427627">Gửi phản hồi</translation>
 <translation id="8041940743680923270">Sử dụng cài đặt mặc định chung (Hỏi)</translation>
 <translation id="8088680233425245692">Không xem được bài viết.</translation>
-<translation id="8089520772729574115">dưới 1 MB</translation>
 <translation id="8091372947890762290">Kích hoạt đang chờ xử lý trên máy chủ</translation>
 <translation id="8118489163946903409">Phương thức thanh toán</translation>
 <translation id="8131740175452115882">Xác nhận</translation>
diff --git a/components/strings/components_strings_zh-CN.xtb b/components/strings/components_strings_zh-CN.xtb
index aba43f5..ae38a02e 100644
--- a/components/strings/components_strings_zh-CN.xtb
+++ b/components/strings/components_strings_zh-CN.xtb
@@ -220,7 +220,6 @@
 <translation id="2826760142808435982">该连接使用 <ph name="CIPHER" /> 进行加密和身份验证,并使用 <ph name="KX" /> 作为密钥交换机制。</translation>
 <translation id="2835170189407361413">清除表单</translation>
 <translation id="2889159643044928134">不重新加载</translation>
-<translation id="2900469785430194048">Google Chrome 在尝试显示此网页时内存不足。</translation>
 <translation id="2909946352844186028">检测到了网络变化。</translation>
 <translation id="2916038427272391327">关闭其他程序</translation>
 <translation id="2922350208395188000">无法核实服务器证书。</translation>
@@ -243,7 +242,6 @@
 <translation id="3024663005179499861">策略类型有误</translation>
 <translation id="3032412215588512954">要重新加载该网站吗?</translation>
 <translation id="3037605927509011580">喔唷,崩溃啦!</translation>
-<translation id="3040955737384246924">{COUNT,plural, =0{在已同步的设备上至少有 1 项内容}=1{1 项内容(在已同步的设备上还有更多内容)}other{# 项内容(在已同步的设备上还有更多内容)}}</translation>
 <translation id="3041612393474885105">证书信息</translation>
 <translation id="3063697135517575841">Chrome 目前无法确认您的信用卡,请稍后重试。</translation>
 <translation id="3064966200440839136">将要退出隐身模式,以便通过外部应用付款。是否继续?</translation>
@@ -334,7 +332,6 @@
 <translation id="3681007416295224113">证书信息</translation>
 <translation id="3690164694835360974">登录方式不安全</translation>
 <translation id="3693415264595406141">密码:</translation>
-<translation id="3696411085566228381">无</translation>
 <translation id="3704609568417268905"><ph name="TIME" /> - <ph name="BOOKMARKED" /> - <ph name="TITLE" /> - <ph name="DOMAIN" /></translation>
 <translation id="370665806235115550">正在加载...</translation>
 <translation id="3712624925041724820">许可已用尽</translation>
@@ -382,7 +379,6 @@
 <translation id="4171400957073367226">验证签名无效</translation>
 <translation id="4196861286325780578">恢复移动(&amp;R)</translation>
 <translation id="4203896806696719780"><ph name="BEGIN_LINK" />检查防火墙和防病毒配置<ph name="END_LINK" /></translation>
-<translation id="4206349416402437184">{COUNT,plural, =0{无}=1{1 个应用 ($1)}=2{2 个应用($1、$2)}other{# 个应用($1、$2,$3)}}</translation>
 <translation id="4220128509585149162">崩溃</translation>
 <translation id="4226937834893929579"><ph name="BEGIN_LINK" />尝试运行网络诊断<ph name="END_LINK" />。</translation>
 <translation id="4250431568374086873">您与此网站之间建立的连接并非完全安全</translation>
@@ -466,7 +462,6 @@
 <translation id="5045550434625856497">密码不正确</translation>
 <translation id="5056549851600133418">为您推荐的文章</translation>
 <translation id="5070335125961472645"><ph name="BEGIN_LINK" />检查代理服务器地址<ph name="END_LINK" /></translation>
-<translation id="5076731569460970710">{COUNT,plural, =0{没有 Cookie}=1{1 个网站使用 Cookie。}other{# 个网站使用 Cookie。}}</translation>
 <translation id="5087286274860437796">服务器的证书目前无效。</translation>
 <translation id="5087580092889165836">添加新卡</translation>
 <translation id="5089810972385038852">州</translation>
@@ -597,7 +592,6 @@
 <translation id="6358450015545214790">这分别意味着什么?</translation>
 <translation id="6386120369904791316">{COUNT,plural, =1{1 条其他建议}other{# 条其他建议}}</translation>
 <translation id="6387478394221739770">想试试超酷的 Chrome 新功能?欢迎访问 chrome.com/beta,试用我们的测试版!</translation>
-<translation id="6389758589412724634">Chromium 在尝试显示此网页时内存不足。</translation>
 <translation id="6404511346730675251">修改书签</translation>
 <translation id="6410264514553301377">请输入“<ph name="CREDIT_CARD" />”的到期日期和银行卡验证码 (CVC)</translation>
 <translation id="6414888972213066896">您已向父亲/母亲发送请求,询问其是否允许您访问此网站</translation>
@@ -620,7 +614,6 @@
 <translation id="6556915248009097796">到期日期:<ph name="EXPIRATION_DATE_ABBR" />;上次使用日期:<ph name="LAST_USED_DATE_NO_DETAIL" /></translation>
 <translation id="6563469144985748109">您的管理员尚未批准此网站</translation>
 <translation id="6569060085658103619">您正在查看扩展程序页面</translation>
-<translation id="6593753688552673085">不到 <ph name="UPPER_ESTIMATE" /></translation>
 <translation id="6596325263575161958">加密选项</translation>
 <translation id="662080504995468778">留下</translation>
 <translation id="6626291197371920147">添加有效的卡号</translation>
@@ -632,7 +625,6 @@
 <translation id="6710594484020273272">&lt;输入搜索字词&gt;</translation>
 <translation id="6711464428925977395">代理服务器出现问题,或者地址有误。</translation>
 <translation id="6727102863431372879">设置</translation>
-<translation id="6731320287533051140">{COUNT,plural, =0{无}=1{1 项内容}other{# 项内容}}</translation>
 <translation id="674375294223700098">未知的服务器证书错误。</translation>
 <translation id="6753269504797312559">政策值</translation>
 <translation id="6757797048963528358">您的设备已进入休眠模式。</translation>
@@ -738,6 +730,7 @@
 <translation id="7669271284792375604">此网站上的攻击者可能会试图诱骗您安装有损浏览体验的程序(例如:通过更改您的主页或在您访问的网站上显示额外的广告)。</translation>
 <translation id="7674629440242451245">想试试超酷的 Chrome 新功能?欢迎访问 chrome.com/dev,试用我们的测试版!</translation>
 <translation id="7682287625158474539">送货地址</translation>
+<translation id="7701040980221191251">无</translation>
 <translation id="7704050614460855821"><ph name="BEGIN_LINK" />继续前往<ph name="SITE" />(不安全)<ph name="END_LINK" /></translation>
 <translation id="7714464543167945231">证书</translation>
 <translation id="7716424297397655342">无法从缓存中加载此网站</translation>
@@ -777,7 +770,6 @@
 <translation id="8041089156583427627">发送反馈</translation>
 <translation id="8041940743680923270">使用全局默认设置(询问)</translation>
 <translation id="8088680233425245692">无法查看文章。</translation>
-<translation id="8089520772729574115">小于 1 MB</translation>
 <translation id="8091372947890762290">正等待在服务器上激活</translation>
 <translation id="8118489163946903409">付款方式</translation>
 <translation id="8131740175452115882">确认</translation>
diff --git a/components/strings/components_strings_zh-TW.xtb b/components/strings/components_strings_zh-TW.xtb
index 88404f1e..5593ea3 100644
--- a/components/strings/components_strings_zh-TW.xtb
+++ b/components/strings/components_strings_zh-TW.xtb
@@ -220,7 +220,6 @@
 <translation id="2826760142808435982">連線採用 <ph name="CIPHER" /> 加密,並設有 <ph name="KX" /> 金鑰交換機制。</translation>
 <translation id="2835170189407361413">清除表單</translation>
 <translation id="2889159643044928134">不要重新載入</translation>
-<translation id="2900469785430194048">Google Chrome 嘗試顯示這個網頁時用盡了記憶體。</translation>
 <translation id="2909946352844186028">系統偵測到網路變更。</translation>
 <translation id="2916038427272391327">關閉其他程式</translation>
 <translation id="2922350208395188000">無法檢查伺服器憑證。</translation>
@@ -243,7 +242,6 @@
 <translation id="3024663005179499861">政策類型有誤</translation>
 <translation id="3032412215588512954">您要重新載入這個網站嗎?</translation>
 <translation id="3037605927509011580">糟糕!</translation>
-<translation id="3040955737384246924">{COUNT,plural, =0{在已同步的裝置上至少有 1 個項目}=1{1 個項目 (在已同步的裝置上還有更多項目)}other{# 個項目 (在已同步的裝置上還有更多項目)}}</translation>
 <translation id="3041612393474885105">憑證資訊</translation>
 <translation id="3063697135517575841">Chrome 目前無法驗證您的信用卡,請稍後再試。</translation>
 <translation id="3064966200440839136">即將離開無痕模式,改為使用外部應用程式付款,要繼續嗎?</translation>
@@ -337,7 +335,6 @@
 <translation id="3681007416295224113">憑證資訊</translation>
 <translation id="3690164694835360974">登入行為不安全</translation>
 <translation id="3693415264595406141">密碼:</translation>
-<translation id="3696411085566228381">無</translation>
 <translation id="3704609568417268905"><ph name="TIME" />,<ph name="BOOKMARKED" />,<ph name="TITLE" />,<ph name="DOMAIN" /></translation>
 <translation id="370665806235115550">載入中…</translation>
 <translation id="3712624925041724820">授權已用盡</translation>
@@ -385,7 +382,6 @@
 <translation id="4171400957073367226">驗證簽名無效</translation>
 <translation id="4196861286325780578">重做移動(&amp;R)</translation>
 <translation id="4203896806696719780"><ph name="BEGIN_LINK" />檢查防火牆和防毒軟體設定<ph name="END_LINK" /></translation>
-<translation id="4206349416402437184">{COUNT,plural, =0{無}=1{1 個應用程式 ($1)}=2{2 個應用程式 ($1、$2)}other{# 個應用程式 ($1、$2、$3)}}</translation>
 <translation id="4220128509585149162">當機</translation>
 <translation id="4226937834893929579"><ph name="BEGIN_LINK" />嘗試執行網路診斷<ph name="END_LINK" />。</translation>
 <translation id="4250431568374086873">你與這個網站的連線可能有安全漏洞</translation>
@@ -469,7 +465,6 @@
 <translation id="5045550434625856497">密碼不正確</translation>
 <translation id="5056549851600133418">為您推薦的文章</translation>
 <translation id="5070335125961472645"><ph name="BEGIN_LINK" />檢查 Proxy 位址<ph name="END_LINK" /></translation>
-<translation id="5076731569460970710">{COUNT,plural, =0{沒有任何 Cookie}=1{1 個網站會使用 Cookie。}other{# 個網站會使用 Cookie。}}</translation>
 <translation id="5087286274860437796">伺服器憑證目前無效。</translation>
 <translation id="5087580092889165836">新增信用卡</translation>
 <translation id="5089810972385038852">州</translation>
@@ -601,7 +596,6 @@
 <translation id="6358450015545214790">我需要進一步資訊</translation>
 <translation id="6386120369904791316">{COUNT,plural, =1{以及另外 1 個建議項目}other{以及另外 # 個建議項目}}</translation>
 <translation id="6387478394221739770">想搶先試用酷炫的 Chrome 新功能嗎?請前往 chrome.com/beta 安裝測試版。</translation>
-<translation id="6389758589412724634">Chromium 嘗試顯示這個網頁時用盡了記憶體。</translation>
 <translation id="6404511346730675251">編輯書籤</translation>
 <translation id="6410264514553301377">輸入 <ph name="CREDIT_CARD" /> 的到期日和信用卡安全碼</translation>
 <translation id="6414888972213066896">你已詢問家長是否同意你造訪這個網站</translation>
@@ -624,7 +618,6 @@
 <translation id="6556915248009097796">到期日:<ph name="EXPIRATION_DATE_ABBR" />,上次使用日期:<ph name="LAST_USED_DATE_NO_DETAIL" /></translation>
 <translation id="6563469144985748109">你的管理員尚未核准這個網站</translation>
 <translation id="6569060085658103619">目前顯示的是擴充功能頁面</translation>
-<translation id="6593753688552673085">不到 <ph name="UPPER_ESTIMATE" /></translation>
 <translation id="6596325263575161958">加密選項</translation>
 <translation id="662080504995468778">不離開</translation>
 <translation id="6626291197371920147">新增有效的信用卡號碼</translation>
@@ -636,7 +629,6 @@
 <translation id="6710594484020273272">&lt;輸入搜尋字詞&gt;</translation>
 <translation id="6711464428925977395">Proxy 伺服器發生錯誤,或是位址不正確。</translation>
 <translation id="6727102863431372879">設定</translation>
-<translation id="6731320287533051140">{COUNT,plural, =0{無}=1{1 個項目}other{# 個項目}}</translation>
 <translation id="674375294223700098">不明的伺服器憑證錯誤。</translation>
 <translation id="6753269504797312559">政策值</translation>
 <translation id="6757797048963528358">您的裝置已進入睡眠模式。</translation>
@@ -742,6 +734,7 @@
 <translation id="7669271284792375604">攻擊者可能會試圖透過這個網站誘使你安裝對瀏覽體驗有害 (例如變更你的首頁,或是在你造訪的網站上顯示多餘的廣告) 的程式。</translation>
 <translation id="7674629440242451245">想搶先試用酷炫的 Chrome 新功能嗎?請前往 chrome.com/dev 安裝開發人員版。</translation>
 <translation id="7682287625158474539">寄送地址</translation>
+<translation id="7701040980221191251">無</translation>
 <translation id="7704050614460855821"><ph name="BEGIN_LINK" />繼續前往 <ph name="SITE" /> 網站 (不安全)<ph name="END_LINK" /></translation>
 <translation id="7714464543167945231">憑證</translation>
 <translation id="7716424297397655342">無法從快取載入這個網站</translation>
@@ -781,7 +774,6 @@
 <translation id="8041089156583427627">提供意見</translation>
 <translation id="8041940743680923270">使用全域預設值 (要求確認)</translation>
 <translation id="8088680233425245692">無法查看文章。</translation>
-<translation id="8089520772729574115">不到 1 MB</translation>
 <translation id="8091372947890762290">尚未在伺服器上啟動</translation>
 <translation id="8118489163946903409">付款方式</translation>
 <translation id="8131740175452115882">確認</translation>
diff --git a/components/ukm/BUILD.gn b/components/ukm/BUILD.gn
index ab5807f..35160d05 100644
--- a/components/ukm/BUILD.gn
+++ b/components/ukm/BUILD.gn
@@ -41,6 +41,23 @@
   ]
 }
 
+static_library("ukm_interface") {
+  sources = [
+    "ukm_interface.cc",
+    "ukm_interface.h",
+  ]
+
+  public_deps = [
+    "//base",
+    "//components/ukm/public/interfaces",
+  ]
+
+  deps = [
+    ":ukm",
+    "//mojo/public/cpp/bindings",
+  ]
+}
+
 # Helper library for observing signals that we need to clear any local data.
 static_library("observers") {
   sources = [
diff --git a/components/ukm/public/BUILD.gn b/components/ukm/public/BUILD.gn
index 1383752..a791444 100644
--- a/components/ukm/public/BUILD.gn
+++ b/components/ukm/public/BUILD.gn
@@ -6,6 +6,8 @@
 
 component("public") {
   sources = [
+    "mojo_ukm_recorder.cc",
+    "mojo_ukm_recorder.h",
     "ukm_entry_builder.cc",
     "ukm_entry_builder.h",
     "ukm_export.h",
diff --git a/components/ukm/public/mojo_ukm_recorder.cc b/components/ukm/public/mojo_ukm_recorder.cc
new file mode 100644
index 0000000..8d5af8f9
--- /dev/null
+++ b/components/ukm/public/mojo_ukm_recorder.cc
@@ -0,0 +1,24 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/ukm/public/mojo_ukm_recorder.h"
+
+#include "base/memory/ptr_util.h"
+
+namespace ukm {
+
+MojoUkmRecorder::MojoUkmRecorder(mojom::UkmRecorderInterfacePtr interface)
+    : interface_(std::move(interface)) {}
+MojoUkmRecorder::~MojoUkmRecorder() = default;
+
+void MojoUkmRecorder::UpdateSourceURL(SourceId source_id, const GURL& url) {
+  DCHECK(false);
+  // Not implemented yet, currently a no-op.
+}
+
+void MojoUkmRecorder::AddEntry(mojom::UkmEntryPtr entry) {
+  interface_->AddEntry(std::move(entry));
+}
+
+}  // namespace ukm
diff --git a/components/ukm/public/mojo_ukm_recorder.h b/components/ukm/public/mojo_ukm_recorder.h
new file mode 100644
index 0000000..de959b31
--- /dev/null
+++ b/components/ukm/public/mojo_ukm_recorder.h
@@ -0,0 +1,44 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_UKM_PUBLIC_MOJO_UKM_RECORDER_H_
+#define COMPONENTS_UKM_PUBLIC_MOJO_UKM_RECORDER_H_
+
+#include "components/ukm/public/interfaces/ukm_interface.mojom.h"
+#include "components/ukm/public/ukm_recorder.h"
+
+namespace ukm {
+
+/**
+ * A helper wrapper that lets UKM data be recorded on other processes with the
+ * same interface that is used in the browser process.
+ *
+ * Usage Example:
+ *
+ *  ukm::mojom::UkmRecorderInterfacePtr interface;
+ *  content::RenderThread::Get()->GetConnector()->BindInterface(
+ *      content::mojom::kBrowserServiceName, mojo::MakeRequest(&interface));
+ *  ukm::MojoUkmRecorder recorder(std::move(interface));
+ *  std::unique_ptr<ukm::UkmEntryBuilder> builder =
+ *      recorder.GetEntryBuilder(coordination_unit_id, "MyEvent");
+ *  builder->AddMetric("MyMetric", metric_value);
+ */
+class MojoUkmRecorder : public UkmRecorder {
+ public:
+  MojoUkmRecorder(mojom::UkmRecorderInterfacePtr interface);
+  ~MojoUkmRecorder() override;
+
+ private:
+  // UkmRecorder:
+  void UpdateSourceURL(SourceId source_id, const GURL& url) override;
+  void AddEntry(mojom::UkmEntryPtr entry) override;
+
+  mojom::UkmRecorderInterfacePtr interface_;
+
+  DISALLOW_COPY_AND_ASSIGN(MojoUkmRecorder);
+};
+
+}  // namespace ukm
+
+#endif  // COMPONENTS_UKM_PUBLIC_MOJO_UKM_RECORDER_H_
diff --git a/components/ukm/ukm_interface.cc b/components/ukm/ukm_interface.cc
new file mode 100644
index 0000000..d89f6134
--- /dev/null
+++ b/components/ukm/ukm_interface.cc
@@ -0,0 +1,30 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/ukm/ukm_interface.h"
+
+#include "base/memory/ptr_util.h"
+#include "components/ukm/public/ukm_recorder.h"
+#include "mojo/public/cpp/bindings/strong_binding.h"
+
+namespace ukm {
+
+UkmInterface::UkmInterface(UkmRecorder* ukm_recorder)
+    : ukm_recorder_(ukm_recorder) {}
+
+UkmInterface::~UkmInterface() = default;
+
+// static
+void UkmInterface::Create(UkmRecorder* ukm_recorder,
+                          const service_manager::BindSourceInfo& source_info,
+                          mojom::UkmRecorderInterfaceRequest request) {
+  mojo::MakeStrongBinding(base::MakeUnique<UkmInterface>(ukm_recorder),
+                          std::move(request));
+}
+
+void UkmInterface::AddEntry(mojom::UkmEntryPtr ukm_entry) {
+  ukm_recorder_->AddEntry(std::move(ukm_entry));
+}
+
+}  // namespace ukm
diff --git a/components/ukm/ukm_interface.h b/components/ukm/ukm_interface.h
new file mode 100644
index 0000000..2f536fc
--- /dev/null
+++ b/components/ukm/ukm_interface.h
@@ -0,0 +1,38 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_UKM_UKM_INTERFACE_H_
+#define COMPONENTS_UKM_UKM_INTERFACE_H_
+
+#include "components/ukm/public/interfaces/ukm_interface.mojom.h"
+
+namespace service_manager {
+struct BindSourceInfo;
+}
+
+namespace ukm {
+
+class UkmRecorder;
+
+class UkmInterface : public mojom::UkmRecorderInterface {
+ public:
+  explicit UkmInterface(UkmRecorder* ukm_recorder);
+  ~UkmInterface() override;
+
+  static void Create(UkmRecorder* ukm_recorder,
+                     const service_manager::BindSourceInfo& source_info,
+                     mojom::UkmRecorderInterfaceRequest request);
+
+ private:
+  // ukm::mojom::UkmRecorderInterface:
+  void AddEntry(mojom::UkmEntryPtr entry) override;
+
+  UkmRecorder* ukm_recorder_;
+
+  DISALLOW_COPY_AND_ASSIGN(UkmInterface);
+};
+
+}  // namespace ukm
+
+#endif  // COMPONENTS_UKM_UKM_INTERFACE_H_
diff --git a/components/update_client/component.cc b/components/update_client/component.cc
index dec191d..a63b5cd 100644
--- a/components/update_client/component.cc
+++ b/components/update_client/component.cc
@@ -95,9 +95,11 @@
     InstallOnBlockingTaskRunnerCompleteCallback callback) {
   DCHECK(blocking_task_runner->RunsTasksOnCurrentThread());
 
+  DCHECK(base::DirectoryExists(unpack_path));
   const auto result = DoInstallOnBlockingTaskRunner(
       main_task_runner, blocking_task_runner, unpack_path, fingerprint,
       installer, callback);
+  base::DeleteFile(unpack_path, true);
 
   const ErrorCategory error_category =
       result.error ? ErrorCategory::kInstallError : ErrorCategory::kErrorNone;
diff --git a/components/update_client/test_installer.cc b/components/update_client/test_installer.cc
index 3232bd6..7a003dbf 100644
--- a/components/update_client/test_installer.cc
+++ b/components/update_client/test_installer.cc
@@ -10,12 +10,21 @@
 #include "base/files/file_util.h"
 #include "base/values.h"
 #include "components/update_client/update_client_errors.h"
+#include "testing/gtest/include/gtest/gtest.h"
 
 namespace update_client {
 
 TestInstaller::TestInstaller() : error_(0), install_count_(0) {
 }
 
+TestInstaller::~TestInstaller() {
+  // The unpack path is deleted unconditionally by the component state code,
+  // which is driving this installer. Therefore, the unpack path must not
+  // exist when this object is destroyed.
+  if (!unpack_path_.empty())
+    EXPECT_FALSE(base::DirectoryExists(unpack_path_));
+}
+
 void TestInstaller::OnUpdateError(int error) {
   error_ = error;
 }
@@ -24,8 +33,8 @@
     const base::DictionaryValue& manifest,
     const base::FilePath& unpack_path) {
   ++install_count_;
-  if (!base::DeleteFile(unpack_path, true))
-    return Result(InstallError::GENERIC_ERROR);
+
+  unpack_path_ = unpack_path;
 
   return Result(InstallError::NONE);
 }
@@ -35,9 +44,6 @@
   return false;
 }
 
-TestInstaller::~TestInstaller() {
-}
-
 bool TestInstaller::Uninstall() {
   return false;
 }
diff --git a/components/update_client/test_installer.h b/components/update_client/test_installer.h
index 1b5bea0..473772e 100644
--- a/components/update_client/test_installer.h
+++ b/components/update_client/test_installer.h
@@ -42,6 +42,10 @@
 
   int error_;
   int install_count_;
+
+ private:
+  // Contains the |unpack_path| argument of the Install call.
+  base::FilePath unpack_path_;
 };
 
 // A ReadOnlyTestInstaller is an installer that knows about files in an existing
diff --git a/components/update_client/update_client_unittest.cc b/components/update_client/update_client_unittest.cc
index 73e9e9d..fae978c 100644
--- a/components/update_client/update_client_unittest.cc
+++ b/components/update_client/update_client_unittest.cc
@@ -1370,13 +1370,24 @@
                  bool(const std::string& file, base::FilePath* installed_file));
     MOCK_METHOD0(Uninstall, bool());
 
-    static void OnInstall(const base::DictionaryValue& manifest,
-                          const base::FilePath& unpack_path) {
-      base::DeleteFile(unpack_path, true);
+    void OnInstall(const base::DictionaryValue& manifest,
+                   const base::FilePath& unpack_path) {
+      unpack_path_ = unpack_path;
+      EXPECT_TRUE(base::DirectoryExists(unpack_path_));
     }
 
    protected:
-    ~MockInstaller() override {}
+    ~MockInstaller() override {
+      // The unpack path is deleted unconditionally by the component state code,
+      // which is driving this installer. Therefore, the unpack path must not
+      // exist when this object is destroyed.
+      if (!unpack_path_.empty())
+        EXPECT_FALSE(base::DirectoryExists(unpack_path_));
+    }
+
+   private:
+    // Contains the |unpack_path| argument of the Install call.
+    base::FilePath unpack_path_;
   };
 
   class DataCallbackFake {
@@ -1389,7 +1400,7 @@
       EXPECT_CALL(*installer, OnUpdateError(_)).Times(0);
       EXPECT_CALL(*installer, Install(_, _))
           .WillOnce(
-              DoAll(Invoke(MockInstaller::OnInstall),
+              DoAll(Invoke(installer.get(), &MockInstaller::OnInstall),
                     Return(CrxInstaller::Result(InstallError::GENERIC_ERROR))));
       EXPECT_CALL(*installer, GetInstalledFile(_, _)).Times(0);
       EXPECT_CALL(*installer, Uninstall()).Times(0);
diff --git a/components/viz/frame_sinks/gpu_compositor_frame_sink.cc b/components/viz/frame_sinks/gpu_compositor_frame_sink.cc
index a2b6007..bcb2441 100644
--- a/components/viz/frame_sinks/gpu_compositor_frame_sink.cc
+++ b/components/viz/frame_sinks/gpu_compositor_frame_sink.cc
@@ -34,11 +34,7 @@
                  base::Unretained(this)));
 }
 
-GpuCompositorFrameSink::~GpuCompositorFrameSink() {}
-
-void GpuCompositorFrameSink::EvictCurrentSurface() {
-  support_->EvictCurrentSurface();
-}
+GpuCompositorFrameSink::~GpuCompositorFrameSink() = default;
 
 void GpuCompositorFrameSink::SetNeedsBeginFrame(bool needs_begin_frame) {
   support_->SetNeedsBeginFrame(needs_begin_frame);
diff --git a/components/viz/frame_sinks/gpu_compositor_frame_sink.h b/components/viz/frame_sinks/gpu_compositor_frame_sink.h
index 83cbf2f2..962425ca 100644
--- a/components/viz/frame_sinks/gpu_compositor_frame_sink.h
+++ b/components/viz/frame_sinks/gpu_compositor_frame_sink.h
@@ -37,7 +37,6 @@
   ~GpuCompositorFrameSink() override;
 
   // cc::mojom::MojoCompositorFrameSink:
-  void EvictCurrentSurface() override;
   void SetNeedsBeginFrame(bool needs_begin_frame) override;
   void SubmitCompositorFrame(const cc::LocalSurfaceId& local_surface_id,
                              cc::CompositorFrame frame) override;
diff --git a/components/viz/frame_sinks/gpu_root_compositor_frame_sink.cc b/components/viz/frame_sinks/gpu_root_compositor_frame_sink.cc
index 9156032b..0fd4bfa5 100644
--- a/components/viz/frame_sinks/gpu_root_compositor_frame_sink.cc
+++ b/components/viz/frame_sinks/gpu_root_compositor_frame_sink.cc
@@ -74,10 +74,6 @@
   display_->SetLocalSurfaceId(local_surface_id, scale_factor);
 }
 
-void GpuRootCompositorFrameSink::EvictCurrentSurface() {
-  support_->EvictCurrentSurface();
-}
-
 void GpuRootCompositorFrameSink::SetNeedsBeginFrame(bool needs_begin_frame) {
   support_->SetNeedsBeginFrame(needs_begin_frame);
 }
diff --git a/components/viz/frame_sinks/gpu_root_compositor_frame_sink.h b/components/viz/frame_sinks/gpu_root_compositor_frame_sink.h
index 18df306..8d566abb 100644
--- a/components/viz/frame_sinks/gpu_root_compositor_frame_sink.h
+++ b/components/viz/frame_sinks/gpu_root_compositor_frame_sink.h
@@ -55,7 +55,6 @@
                          float scale_factor) override;
 
   // cc::mojom::MojoCompositorFrameSink:
-  void EvictCurrentSurface() override;
   void SetNeedsBeginFrame(bool needs_begin_frame) override;
   void SubmitCompositorFrame(const cc::LocalSurfaceId& local_surface_id,
                              cc::CompositorFrame frame) override;
diff --git a/content/browser/appcache/appcache_job.cc b/content/browser/appcache/appcache_job.cc
index 27a5897..271553f 100644
--- a/content/browser/appcache/appcache_job.cc
+++ b/content/browser/appcache/appcache_job.cc
@@ -32,7 +32,9 @@
   return job;
 }
 
-AppCacheJob::~AppCacheJob() {}
+AppCacheJob::~AppCacheJob() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+}
 
 base::WeakPtr<AppCacheJob> AppCacheJob::GetWeakPtr() {
   return weak_factory_.GetWeakPtr();
diff --git a/content/browser/appcache/appcache_job.h b/content/browser/appcache/appcache_job.h
index bc7a14b..e43bb121 100644
--- a/content/browser/appcache/appcache_job.h
+++ b/content/browser/appcache/appcache_job.h
@@ -9,8 +9,8 @@
 
 #include "base/logging.h"
 #include "base/memory/weak_ptr.h"
+#include "base/sequence_checker.h"
 #include "base/strings/string16.h"
-#include "base/threading/non_thread_safe.h"
 #include "content/common/content_export.h"
 #include "url/gurl.h"
 
@@ -33,9 +33,7 @@
 // Subclasses implement this interface to wrap custom job objects like
 // URLRequestJob, URLLoaderJob, etc to ensure that these dependencies stay out
 // of the AppCache code.
-class CONTENT_EXPORT AppCacheJob
-    : NON_EXPORTED_BASE(public base::NonThreadSafe),
-      public base::SupportsWeakPtr<AppCacheJob> {
+class CONTENT_EXPORT AppCacheJob : public base::SupportsWeakPtr<AppCacheJob> {
  public:
   // Callback that will be invoked before the request is restarted. The caller
   // can use this opportunity to grab state from the job to determine how it
@@ -111,6 +109,8 @@
  protected:
   AppCacheJob();
 
+  SEQUENCE_CHECKER(sequence_checker_);
+
   base::WeakPtrFactory<AppCacheJob> weak_factory_;
 
   DISALLOW_COPY_AND_ASSIGN(AppCacheJob);
diff --git a/content/browser/appcache/appcache_request.cc b/content/browser/appcache/appcache_request.cc
index 62c6d74e8..6fc31ec 100644
--- a/content/browser/appcache/appcache_request.cc
+++ b/content/browser/appcache/appcache_request.cc
@@ -8,6 +8,10 @@
 
 namespace content {
 
+AppCacheRequest::~AppCacheRequest() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+}
+
 // static
 bool AppCacheRequest::IsSchemeAndMethodSupportedForAppCache(
     const AppCacheRequest* request) {
diff --git a/content/browser/appcache/appcache_request.h b/content/browser/appcache/appcache_request.h
index ce727c5..4e14d65 100644
--- a/content/browser/appcache/appcache_request.h
+++ b/content/browser/appcache/appcache_request.h
@@ -6,8 +6,8 @@
 #define CONTENT_BROWSER_APPCACHE_APPCACHE_REQUEST_H_
 
 #include "base/logging.h"
+#include "base/sequence_checker.h"
 #include "base/strings/string16.h"
-#include "base/threading/non_thread_safe.h"
 #include "content/common/content_export.h"
 #include "url/gurl.h"
 
@@ -21,10 +21,9 @@
 // Interface for an AppCache request. Subclasses implement this interface to
 // wrap custom request objects like URLRequest, etc to ensure that these
 // dependencies stay out of the AppCache code.
-class CONTENT_EXPORT AppCacheRequest
-    : NON_EXPORTED_BASE(public base::NonThreadSafe) {
+class CONTENT_EXPORT AppCacheRequest {
  public:
-  virtual ~AppCacheRequest() {}
+  virtual ~AppCacheRequest();
 
   // The URL for this request.
   virtual const GURL& GetURL() const = 0;
@@ -73,6 +72,8 @@
   // GetURLRequest() and GetResourceRequest() should return valid results.
   virtual ResourceRequest* GetResourceRequest();
 
+  SEQUENCE_CHECKER(sequence_checker_);
+
   DISALLOW_COPY_AND_ASSIGN(AppCacheRequest);
 };
 
diff --git a/content/browser/child_process_security_policy_impl.h b/content/browser/child_process_security_policy_impl.h
index 165d4d3bf..e99599a 100644
--- a/content/browser/child_process_security_policy_impl.h
+++ b/content/browser/child_process_security_policy_impl.h
@@ -95,12 +95,15 @@
   // Returns if |child_id| can read all of the |files|.
   bool CanReadAllFiles(int child_id, const std::vector<base::FilePath>& files);
 
+  // Validate that |child_id| in |file_system_context| is allowed to access
+  // data in the POST body specified by |body|.  Can be called on any thread.
+  bool CanReadRequestBody(int child_id,
+                          const storage::FileSystemContext* file_system_context,
+                          const scoped_refptr<ResourceRequestBodyImpl>& body);
+
   // Validate that the renderer process for |site_instance| is allowed to access
   // data in the POST body specified by |body|.  Has to be called on the UI
   // thread.
-  // TODO(lukasza): Remove code duplication - the method below should be reused
-  // by RenderFrameHostImpl::OnBeginNavigation and
-  // ResourceDispatcherHostImpl::ShouldServiceRequest.
   bool CanReadRequestBody(SiteInstance* site_instance,
                           const scoped_refptr<ResourceRequestBodyImpl>& body);
 
@@ -277,12 +280,6 @@
       const std::string& filesystem_id,
       int permission);
 
-  // Validate that |child_id| in |file_system_context| is allowed to access
-  // data in the POST body specified by |body|.  Can be called on any thread.
-  bool CanReadRequestBody(int child_id,
-                          const storage::FileSystemContext* file_system_context,
-                          const scoped_refptr<ResourceRequestBodyImpl>& body);
-
   // You must acquire this lock before reading or writing any members of this
   // class.  You must not block while holding this lock.
   base::Lock lock_;
diff --git a/content/browser/devtools/protocol/devtools_protocol_browsertest.cc b/content/browser/devtools/protocol/devtools_protocol_browsertest.cc
index 72a3068..6c9033f 100644
--- a/content/browser/devtools/protocol/devtools_protocol_browsertest.cc
+++ b/content/browser/devtools/protocol/devtools_protocol_browsertest.cc
@@ -781,7 +781,7 @@
   PlaceAndCaptureBox(kFrameSize, gfx::Size(100, 200), 0.5);
 
   // Ensure that content outside the emulated frame is painted, too.
-  PlaceAndCaptureBox(kFrameSize, gfx::Size(10, 10000), 1.0);
+  PlaceAndCaptureBox(kFrameSize, gfx::Size(10, 8192), 1.0);
 }
 
 // Verifies that setDefaultBackgroundColor and captureScreenshot support a
diff --git a/content/browser/frame_host/render_frame_host_impl.cc b/content/browser/frame_host/render_frame_host_impl.cc
index 7e28d33..c5c6b04 100644
--- a/content/browser/frame_host/render_frame_host_impl.cc
+++ b/content/browser/frame_host/render_frame_host_impl.cc
@@ -2208,7 +2208,8 @@
   BeginNavigationParams validated_begin_params = begin_params;
   GetProcess()->FilterURL(true, &validated_begin_params.searchable_form_url);
 
-  if (!ValidateUploadParams(validated_params)) {
+  if (!ChildProcessSecurityPolicyImpl::GetInstance()->CanReadRequestBody(
+          GetSiteInstance(), validated_params.post_data)) {
     bad_message::ReceivedBadMessage(GetProcess(),
                                     bad_message::RFH_ILLEGAL_UPLOAD_PARAMS);
     return;
@@ -4007,36 +4008,6 @@
   }
 }
 
-bool RenderFrameHostImpl::ValidateUploadParams(
-    const CommonNavigationParams& common_params) {
-  if (!common_params.post_data.get())
-    return true;
-
-  // Check if the renderer is permitted to upload the requested files.
-  const std::vector<ResourceRequestBodyImpl::Element>* uploads =
-      common_params.post_data->elements();
-  std::vector<ResourceRequestBodyImpl::Element>::const_iterator iter;
-  ChildProcessSecurityPolicyImpl* security_policy =
-      ChildProcessSecurityPolicyImpl::GetInstance();
-  for (iter = uploads->begin(); iter != uploads->end(); ++iter) {
-    if (iter->type() == ResourceRequestBodyImpl::Element::TYPE_FILE &&
-        !security_policy->CanReadFile(GetProcess()->GetID(), iter->path())) {
-      return false;
-    }
-    if (iter->type() ==
-        ResourceRequestBodyImpl::Element::TYPE_FILE_FILESYSTEM) {
-      StoragePartition* storage_partition = BrowserContext::GetStoragePartition(
-          GetSiteInstance()->GetBrowserContext(), GetSiteInstance());
-      storage::FileSystemURL url =
-          storage_partition->GetFileSystemContext()->CrackURL(
-              iter->filesystem_url());
-      if (!security_policy->CanReadFileSystemFile(GetProcess()->GetID(), url))
-        return false;
-    }
-  }
-  return true;
-}
-
 #if defined(OS_ANDROID)
 
 class RenderFrameHostImpl::JavaInterfaceProvider
diff --git a/content/browser/frame_host/render_frame_host_impl.h b/content/browser/frame_host/render_frame_host_impl.h
index 7e7ca69f..af85a4e8 100644
--- a/content/browser/frame_host/render_frame_host_impl.h
+++ b/content/browser/frame_host/render_frame_host_impl.h
@@ -949,10 +949,6 @@
   // to |url|.
   void SetLastCommittedSiteUrl(const GURL& url);
 
-  // Ensures that the upload parameters sent by the renderer process are
-  // valid and any files specified are allowed for access.
-  bool ValidateUploadParams(const CommonNavigationParams& common_params);
-
   // For now, RenderFrameHosts indirectly keep RenderViewHosts alive via a
   // refcount that calls Shutdown when it reaches zero.  This allows each
   // RenderFrameHostManager to just care about RenderFrameHosts, while ensuring
diff --git a/content/browser/indexed_db/indexed_db_transaction.cc b/content/browser/indexed_db/indexed_db_transaction.cc
index 904a284..5fe8767 100644
--- a/content/browser/indexed_db/indexed_db_transaction.cc
+++ b/content/browser/indexed_db/indexed_db_transaction.cc
@@ -8,6 +8,7 @@
 #include "base/location.h"
 #include "base/logging.h"
 #include "base/memory/ptr_util.h"
+#include "base/metrics/histogram_macros.h"
 #include "base/single_thread_task_runner.h"
 #include "base/stl_util.h"
 #include "base/strings/utf_string_conversions.h"
@@ -36,6 +37,41 @@
   DCHECK(status.ok());
 }
 
+// Used for UMA metrics - do not change values.
+enum UmaIDBException {
+  UmaIDBExceptionUnknownError = 0,
+  UmaIDBExceptionConstraintError = 1,
+  UmaIDBExceptionDataError = 2,
+  UmaIDBExceptionVersionError = 3,
+  UmaIDBExceptionAbortError = 4,
+  UmaIDBExceptionQuotaError = 5,
+  UmaIDBExceptionTimeoutError = 6,
+  UmaIDBExceptionExclusiveMaxValue = 7
+};
+
+// Used for UMA metrics - do not change mappings.
+UmaIDBException ExceptionCodeToUmaEnum(uint16_t code) {
+  switch (code) {
+    case blink::kWebIDBDatabaseExceptionUnknownError:
+      return UmaIDBExceptionUnknownError;
+    case blink::kWebIDBDatabaseExceptionConstraintError:
+      return UmaIDBExceptionConstraintError;
+    case blink::kWebIDBDatabaseExceptionDataError:
+      return UmaIDBExceptionDataError;
+    case blink::kWebIDBDatabaseExceptionVersionError:
+      return UmaIDBExceptionVersionError;
+    case blink::kWebIDBDatabaseExceptionAbortError:
+      return UmaIDBExceptionAbortError;
+    case blink::kWebIDBDatabaseExceptionQuotaError:
+      return UmaIDBExceptionQuotaError;
+    case blink::kWebIDBDatabaseExceptionTimeoutError:
+      return UmaIDBExceptionTimeoutError;
+    default:
+      NOTREACHED();
+  }
+  return UmaIDBExceptionUnknownError;
+}
+
 }  // namespace
 
 IndexedDBTransaction::TaskQueue::TaskQueue() {}
@@ -152,6 +188,10 @@
   if (state_ == FINISHED)
     return;
 
+  UMA_HISTOGRAM_ENUMERATION("WebCore.IndexedDB.TransactionAbortReason",
+                            ExceptionCodeToUmaEnum(error.code()),
+                            UmaIDBExceptionExclusiveMaxValue);
+
   timeout_timer_.Stop();
 
   state_ = FINISHED;
diff --git a/content/browser/loader/resource_dispatcher_host_impl.cc b/content/browser/loader/resource_dispatcher_host_impl.cc
index c1985545..849b8ee 100644
--- a/content/browser/loader/resource_dispatcher_host_impl.cc
+++ b/content/browser/loader/resource_dispatcher_host_impl.cc
@@ -2663,30 +2663,13 @@
   }
 
   // Check if the renderer is permitted to upload the requested files.
-  if (request_data.request_body.get()) {
-    const std::vector<ResourceRequestBodyImpl::Element>* uploads =
-        request_data.request_body->elements();
-    std::vector<ResourceRequestBodyImpl::Element>::const_iterator iter;
-    for (iter = uploads->begin(); iter != uploads->end(); ++iter) {
-      if (iter->type() == ResourceRequestBodyImpl::Element::TYPE_FILE &&
-          !policy->CanReadFile(child_id, iter->path())) {
-        NOTREACHED() << "Denied unauthorized upload of "
-                     << iter->path().value();
-        return false;
-      }
-      if (iter->type() ==
-          ResourceRequestBodyImpl::Element::TYPE_FILE_FILESYSTEM) {
-        storage::FileSystemURL url =
-            requester_info->file_system_context()->CrackURL(
-                iter->filesystem_url());
-        if (!policy->CanReadFileSystemFile(child_id, url)) {
-          NOTREACHED() << "Denied unauthorized upload of "
-                       << iter->filesystem_url().spec();
-          return false;
-        }
-      }
-    }
+  if (!policy->CanReadRequestBody(child_id,
+                                  requester_info->file_system_context(),
+                                  request_data.request_body)) {
+    NOTREACHED() << "Denied unauthorized upload";
+    return false;
   }
+
   return true;
 }
 
diff --git a/content/browser/renderer_host/input/synthetic_gesture_controller.cc b/content/browser/renderer_host/input/synthetic_gesture_controller.cc
index f6503e8..3c5dcdc 100644
--- a/content/browser/renderer_host/input/synthetic_gesture_controller.cc
+++ b/content/browser/renderer_host/input/synthetic_gesture_controller.cc
@@ -40,27 +40,6 @@
     StartGesture(*pending_gesture_queue_.FrontGesture());
 }
 
-void SyntheticGestureController::RequestBeginFrame() {
-  DCHECK(!dispatch_timer_.IsRunning());
-  delegate_->RequestBeginFrameForSynthesizedInput(
-      base::BindOnce(&SyntheticGestureController::OnBeginFrame,
-                     weak_ptr_factory_.GetWeakPtr()));
-}
-
-void SyntheticGestureController::OnBeginFrame() {
-  // In order to make sure we get consistent results across runs, we attempt to
-  // start the timer at a fixed offset from the vsync. Starting the timer
-  // shortly after a begin-frame is likely to produce latency close to the worst
-  // cases. We feel 2 milliseconds is a good offset for this.
-  constexpr base::TimeDelta kSynthesizedDispatchDelay =
-      base::TimeDelta::FromMilliseconds(2);
-  base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
-      FROM_HERE,
-      base::BindOnce(&SyntheticGestureController::StartTimer,
-                     weak_ptr_factory_.GetWeakPtr()),
-      kSynthesizedDispatchDelay);
-}
-
 void SyntheticGestureController::StartTimer() {
   // TODO(sad): Change the interval to allow sending multiple events per begin
   // frame.
@@ -111,7 +90,7 @@
                            "SyntheticGestureController::running",
                            &gesture);
   if (!dispatch_timer_.IsRunning())
-    RequestBeginFrame();
+    StartTimer();
 }
 
 void SyntheticGestureController::StopGesture(
diff --git a/content/browser/renderer_host/input/synthetic_gesture_controller.h b/content/browser/renderer_host/input/synthetic_gesture_controller.h
index 1762300..280c077b 100644
--- a/content/browser/renderer_host/input/synthetic_gesture_controller.h
+++ b/content/browser/renderer_host/input/synthetic_gesture_controller.h
@@ -57,10 +57,7 @@
  private:
   friend class SyntheticGestureControllerTestBase;
 
-  void RequestBeginFrame();
-  void OnBeginFrame();
   void StartTimer();
-
   void StartGesture(const SyntheticGesture& gesture);
   void StopGesture(const SyntheticGesture& gesture,
                    const OnGestureCompleteCallback& completion_callback,
diff --git a/content/browser/renderer_host/media/video_capture_gpu_jpeg_decoder.cc b/content/browser/renderer_host/media/video_capture_gpu_jpeg_decoder.cc
index dc8a7eb2..0bf2749f 100644
--- a/content/browser/renderer_host/media/video_capture_gpu_jpeg_decoder.cc
+++ b/content/browser/renderer_host/media/video_capture_gpu_jpeg_decoder.cc
@@ -36,7 +36,7 @@
       decoder_status_(INIT_PENDING) {}
 
 VideoCaptureGpuJpegDecoder::~VideoCaptureGpuJpegDecoder() {
-  DCHECK(CalledOnValidThread());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   // |decoder_| guarantees no more JpegDecodeAccelerator::Client callbacks
   // on IO thread after deletion.
@@ -48,7 +48,7 @@
 }
 
 void VideoCaptureGpuJpegDecoder::Initialize() {
-  DCHECK(CalledOnValidThread());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   base::AutoLock lock(lock_);
   bool is_platform_supported =
@@ -77,7 +77,7 @@
 
 VideoCaptureGpuJpegDecoder::STATUS VideoCaptureGpuJpegDecoder::GetStatus()
     const {
-  DCHECK(CalledOnValidThread());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   base::AutoLock lock(lock_);
   return decoder_status_;
 }
@@ -89,7 +89,7 @@
     base::TimeTicks reference_time,
     base::TimeDelta timestamp,
     media::VideoCaptureDevice::Client::Buffer out_buffer) {
-  DCHECK(CalledOnValidThread());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(decoder_);
 
   TRACE_EVENT_ASYNC_BEGIN0("jpeg", "VideoCaptureGpuJpegDecoder decoding",
@@ -243,7 +243,7 @@
 void VideoCaptureGpuJpegDecoder::FinishInitialization(
     scoped_refptr<gpu::GpuChannelHost> gpu_channel_host) {
   TRACE_EVENT0("gpu", "VideoCaptureGpuJpegDecoder::FinishInitialization");
-  DCHECK(CalledOnValidThread());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   base::AutoLock lock(lock_);
   if (!gpu_channel_host) {
     LOG(ERROR) << "Failed to establish GPU channel for JPEG decoder";
diff --git a/content/browser/renderer_host/media/video_capture_gpu_jpeg_decoder.h b/content/browser/renderer_host/media/video_capture_gpu_jpeg_decoder.h
index ebe57c7d..04ef6ca 100644
--- a/content/browser/renderer_host/media/video_capture_gpu_jpeg_decoder.h
+++ b/content/browser/renderer_host/media/video_capture_gpu_jpeg_decoder.h
@@ -15,6 +15,7 @@
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
 #include "base/memory/weak_ptr.h"
+#include "base/sequence_checker.h"
 #include "base/single_thread_task_runner.h"
 #include "base/threading/thread.h"
 #include "content/common/content_export.h"
@@ -37,7 +38,6 @@
 class CONTENT_EXPORT VideoCaptureGpuJpegDecoder
     : public media::VideoCaptureJpegDecoder,
       public media::JpegDecodeAccelerator::Client,
-      public base::NonThreadSafe,
       public base::SupportsWeakPtr<VideoCaptureGpuJpegDecoder> {
  public:
   // |decode_done_cb| is called on the IO thread when decode succeed. This can
@@ -114,6 +114,8 @@
 
   STATUS decoder_status_;
 
+  SEQUENCE_CHECKER(sequence_checker_);
+
   DISALLOW_COPY_AND_ASSIGN(VideoCaptureGpuJpegDecoder);
 };
 
diff --git a/content/browser/renderer_host/render_widget_host_impl.h b/content/browser/renderer_host/render_widget_host_impl.h
index ae8a9e7..1b77386 100644
--- a/content/browser/renderer_host/render_widget_host_impl.h
+++ b/content/browser/renderer_host/render_widget_host_impl.h
@@ -592,7 +592,6 @@
   void SubmitCompositorFrame(const cc::LocalSurfaceId& local_surface_id,
                              cc::CompositorFrame frame) override;
   void DidNotProduceFrame(const cc::BeginFrameAck& ack) override;
-  void EvictCurrentSurface() override {}
 
  protected:
   // ---------------------------------------------------------------------------
diff --git a/content/public/android/java/src/org/chromium/content_public/browser/ActionModeCallbackHelper.java b/content/public/android/java/src/org/chromium/content_public/browser/ActionModeCallbackHelper.java
index 3a8d5fe..8f06e68 100644
--- a/content/public/android/java/src/org/chromium/content_public/browser/ActionModeCallbackHelper.java
+++ b/content/public/android/java/src/org/chromium/content_public/browser/ActionModeCallbackHelper.java
@@ -10,6 +10,7 @@
 import android.view.Menu;
 import android.view.MenuItem;
 import android.view.View;
+import android.webkit.WebSettings;
 
 import org.chromium.content.browser.SelectionPopupController;
 
@@ -23,11 +24,9 @@
     /** Google search doesn't support requests slightly larger than this. */
     public static final int MAX_SEARCH_QUERY_LENGTH = 1000;
 
-    // TODO(hush): Use these constants from android.webkit.WebSettings, when they are made
-    // available. crbug.com/546762.
-    public static final int MENU_ITEM_SHARE = 1 << 0;
-    public static final int MENU_ITEM_WEB_SEARCH = 1 << 1;
-    public static final int MENU_ITEM_PROCESS_TEXT = 1 << 2;
+    public static final int MENU_ITEM_SHARE = WebSettings.MENU_ITEM_SHARE;
+    public static final int MENU_ITEM_WEB_SEARCH = WebSettings.MENU_ITEM_WEB_SEARCH;
+    public static final int MENU_ITEM_PROCESS_TEXT = WebSettings.MENU_ITEM_PROCESS_TEXT;
 
     public static final EmptyActionCallback EMPTY_CALLBACK = new EmptyActionCallback();
 
diff --git a/content/renderer/BUILD.gn b/content/renderer/BUILD.gn
index e2c77ee..3373c12 100644
--- a/content/renderer/BUILD.gn
+++ b/content/renderer/BUILD.gn
@@ -233,6 +233,8 @@
     "media/cdm/ppapi_decryptor.h",
     "media/cdm/render_cdm_factory.cc",
     "media/cdm/render_cdm_factory.h",
+    "media/media_factory.cc",
+    "media/media_factory.h",
     "media/media_permission_dispatcher.cc",
     "media/media_permission_dispatcher.h",
     "media/midi_message_filter.cc",
@@ -437,6 +439,7 @@
     "//components/metrics",
     "//components/metrics:single_sample_metrics",
     "//components/payments/mojom:mojom_payment_app",
+    "//components/ukm/public",
     "//components/url_formatter",
     "//components/variations",
     "//components/viz/client",
diff --git a/content/renderer/DEPS b/content/renderer/DEPS
index 93126e84..54e6e7b 100644
--- a/content/renderer/DEPS
+++ b/content/renderer/DEPS
@@ -6,6 +6,7 @@
   "+components/metrics:single_sample_metrics",
   "+components/payments",
   "+components/scheduler",
+  "+components/ukm/public",
   "+components/url_formatter",
   "+components/variations",
   "+components/viz/client",
diff --git a/content/renderer/devtools/devtools_agent.cc b/content/renderer/devtools/devtools_agent.cc
index a9b2b59..b995c0d 100644
--- a/content/renderer/devtools/devtools_agent.cc
+++ b/content/renderer/devtools/devtools_agent.cc
@@ -12,8 +12,8 @@
 #include "base/lazy_instance.h"
 #include "base/message_loop/message_loop.h"
 #include "base/run_loop.h"
+#include "base/sequence_checker.h"
 #include "base/strings/string_number_conversions.h"
-#include "base/threading/non_thread_safe.h"
 #include "base/trace_event/trace_event.h"
 #include "content/common/devtools_messages.h"
 #include "content/common/frame_messages.h"
@@ -46,13 +46,14 @@
 const char kPageGetAppManifest[] = "Page.getAppManifest";
 
 class WebKitClientMessageLoopImpl
-    : public WebDevToolsAgentClient::WebKitClientMessageLoop,
-      public base::NonThreadSafe {
+    : public WebDevToolsAgentClient::WebKitClientMessageLoop {
  public:
   WebKitClientMessageLoopImpl() = default;
-  ~WebKitClientMessageLoopImpl() override { DCHECK(CalledOnValidThread()); }
+  ~WebKitClientMessageLoopImpl() override {
+    DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  }
   void Run() override {
-    DCHECK(CalledOnValidThread());
+    DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
     base::RunLoop* const previous_run_loop = run_loop_;
     base::RunLoop run_loop;
@@ -65,7 +66,7 @@
     run_loop_ = previous_run_loop;
   }
   void QuitNow() override {
-    DCHECK(CalledOnValidThread());
+    DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
     DCHECK(run_loop_);
 
     run_loop_->Quit();
@@ -73,6 +74,8 @@
 
  private:
   base::RunLoop* run_loop_ = nullptr;
+
+  SEQUENCE_CHECKER(sequence_checker_);
 };
 
 typedef std::map<int, DevToolsAgent*> IdToAgentMap;
diff --git a/content/renderer/media/media_factory.cc b/content/renderer/media/media_factory.cc
new file mode 100644
index 0000000..efeba89b
--- /dev/null
+++ b/content/renderer/media/media_factory.cc
@@ -0,0 +1,502 @@
+// Copyright 2017 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/renderer/media/media_factory.h"
+
+#include "base/command_line.h"
+#include "base/memory/ptr_util.h"
+#include "base/metrics/field_trial_params.h"
+#include "base/threading/thread_task_runner_handle.h"
+#include "build/buildflag.h"
+#include "content/public/common/content_client.h"
+#include "content/public/renderer/content_renderer_client.h"
+#include "content/renderer/media/audio_device_factory.h"
+#include "content/renderer/media/media_stream_renderer_factory_impl.h"
+#include "content/renderer/media/render_media_log.h"
+#include "content/renderer/media/renderer_webmediaplayer_delegate.h"
+#include "content/renderer/media/web_media_element_source_utils.h"
+#include "content/renderer/media/webmediaplayer_ms.h"
+#include "content/renderer/render_frame_impl.h"
+#include "content/renderer/render_thread_impl.h"
+#include "content/renderer/render_view_impl.h"
+#include "media/base/decoder_factory.h"
+#include "media/base/media_switches.h"
+#include "media/base/renderer_factory_selector.h"
+#include "media/base/surface_manager.h"
+#include "media/blink/webencryptedmediaclient_impl.h"
+#include "media/blink/webmediaplayer_impl.h"
+#include "media/filters/context_3d.h"
+#include "media/renderers/default_renderer_factory.h"
+#include "mojo/public/cpp/bindings/associated_interface_ptr.h"
+#include "services/service_manager/public/cpp/interface_provider.h"
+#include "services/ui/public/cpp/gpu/context_provider_command_buffer.h"
+#include "third_party/WebKit/public/web/WebKit.h"
+#include "third_party/WebKit/public/web/WebLocalFrame.h"
+
+#if defined(OS_ANDROID)
+#include "content/renderer/media/android/media_player_renderer_client_factory.h"
+#include "content/renderer/media/android/renderer_media_player_manager.h"
+#include "content/renderer/media/android/renderer_surface_view_manager.h"
+#include "content/renderer/media/android/stream_texture_wrapper_impl.h"
+#include "media/base/android/media_codec_util.h"
+#include "media/base/media.h"
+#endif
+
+#if BUILDFLAG(ENABLE_MOJO_MEDIA)
+#include "content/renderer/media/media_interface_provider.h"
+#endif
+
+#if BUILDFLAG(ENABLE_MOJO_CDM)
+#include "media/mojo/clients/mojo_cdm_factory.h"  // nogncheck
+#endif
+
+#if BUILDFLAG(ENABLE_MOJO_RENDERER)
+#include "media/mojo/clients/mojo_renderer_factory.h"  // nogncheck
+#endif
+
+#if BUILDFLAG(ENABLE_MOJO_AUDIO_DECODER) || BUILDFLAG(ENABLE_MOJO_VIDEO_DECODER)
+#include "media/mojo/clients/mojo_decoder_factory.h"  // nogncheck
+#endif
+
+#if BUILDFLAG(ENABLE_MEDIA_REMOTING)
+#include "media/remoting/courier_renderer_factory.h"    // nogncheck
+#include "media/remoting/remoting_cdm_controller.h"     // nogncheck
+#include "media/remoting/remoting_cdm_factory.h"        // nogncheck
+#include "media/remoting/renderer_controller.h"         // nogncheck
+#include "media/remoting/shared_session.h"              // nogncheck
+#include "media/remoting/sink_availability_observer.h"  // nogncheck
+#endif
+
+#if BUILDFLAG(ENABLE_PEPPER_CDMS)
+#include "content/renderer/media/cdm/pepper_cdm_wrapper_impl.h"
+#include "content/renderer/media/cdm/render_cdm_factory.h"
+#endif
+
+namespace content {
+
+MediaFactory::MediaFactory(
+    RenderFrameImpl* render_frame,
+    media::RequestRoutingTokenCallback request_routing_token_cb)
+    : render_frame_(render_frame),
+      request_routing_token_cb_(std::move(request_routing_token_cb)) {}
+
+MediaFactory::~MediaFactory() {}
+
+void MediaFactory::SetupMojo() {
+  // Only do setup once.
+  DCHECK(!remote_interfaces_);
+
+  remote_interfaces_ = render_frame_->GetRemoteInterfaces();
+  DCHECK(remote_interfaces_);
+
+#if BUILDFLAG(ENABLE_MEDIA_REMOTING)
+  // Create the SinkAvailabilityObserver to monitor the remoting sink
+  // availablity.
+  media::mojom::RemotingSourcePtr remoting_source;
+  auto remoting_source_request = mojo::MakeRequest(&remoting_source);
+  media::mojom::RemoterPtr remoter;
+  GetRemoterFactory()->Create(std::move(remoting_source),
+                              mojo::MakeRequest(&remoter));
+  remoting_sink_observer_ =
+      base::MakeUnique<media::remoting::SinkAvailabilityObserver>(
+          std::move(remoting_source_request), std::move(remoter));
+#endif  // BUILDFLAG(ENABLE_MEDIA_REMOTING)
+}
+
+media::Context3D GetSharedMainThreadContext3D(
+    scoped_refptr<ui::ContextProviderCommandBuffer> provider) {
+  if (!provider)
+    return media::Context3D();
+  return media::Context3D(provider->ContextGL(), provider->GrContext());
+}
+
+#if defined(OS_ANDROID)
+// Returns true if the MediaPlayerRenderer should be used for playback, false
+// if the default renderer should be used instead.
+//
+// Note that HLS and MP4 detection are pre-redirect and path-based. It is
+// possible to load such a URL and find different content.
+bool UseMediaPlayerRenderer(const GURL& url) {
+  // Always use the default renderer for playing blob URLs.
+  if (url.SchemeIsBlob())
+    return false;
+
+  // The default renderer does not support HLS.
+  if (media::MediaCodecUtil::IsHLSURL(url))
+    return true;
+
+  // Don't use the default renderer if the container likely contains a codec we
+  // can't decode in software and platform decoders are not available.
+  if (!media::HasPlatformDecoderSupport()) {
+    // Assume that "mp4" means H264. Without platform decoder support we cannot
+    // play it with the default renderer so use MediaPlayerRenderer.
+    // http://crbug.com/642988.
+    if (base::ToLowerASCII(url.spec()).find("mp4") != std::string::npos)
+      return true;
+  }
+
+  // Indicates if the Android MediaPlayer should be used instead of WMPI.
+  if (GetContentClient()->renderer()->ShouldUseMediaPlayerForURL(url))
+    return true;
+
+  // Otherwise, use the default renderer.
+  return false;
+}
+#endif  // defined(OS_ANDROID)
+
+blink::WebMediaPlayer* MediaFactory::CreateMediaPlayer(
+    const blink::WebMediaPlayerSource& source,
+    blink::WebMediaPlayerClient* client,
+    blink::WebMediaPlayerEncryptedMediaClient* encrypted_client,
+    blink::WebContentDecryptionModule* initial_cdm,
+    const blink::WebString& sink_id) {
+  blink::WebLocalFrame* web_frame = render_frame_->GetWebFrame();
+  blink::WebSecurityOrigin security_origin =
+      render_frame_->GetWebFrame()->GetSecurityOrigin();
+  blink::WebMediaStream web_stream =
+      GetWebMediaStreamFromWebMediaPlayerSource(source);
+  if (!web_stream.IsNull())
+    return CreateWebMediaPlayerForMediaStream(client, sink_id, security_origin,
+                                              web_frame);
+
+  // If |source| was not a MediaStream, it must be a URL.
+  // TODO(guidou): Fix this when support for other srcObject types is added.
+  DCHECK(source.IsURL());
+  blink::WebURL url = source.GetAsURL();
+
+  RenderThreadImpl* render_thread = RenderThreadImpl::current();
+  // Render thread may not exist in tests, returning nullptr if it does not.
+  if (!render_thread)
+    return nullptr;
+
+  scoped_refptr<media::SwitchableAudioRendererSink> audio_renderer_sink =
+      AudioDeviceFactory::NewSwitchableAudioRendererSink(
+          AudioDeviceFactory::kSourceMediaElement,
+          render_frame_->GetRoutingID(), 0, sink_id.Utf8(), security_origin);
+  // We need to keep a reference to the context provider (see crbug.com/610527)
+  // but media/ can't depend on cc/, so for now, just keep a reference in the
+  // callback.
+  // TODO(piman): replace media::Context3D to scoped_refptr<ContextProvider> in
+  // media/ once ContextProvider is in gpu/.
+  media::WebMediaPlayerParams::Context3DCB context_3d_cb = base::Bind(
+      &GetSharedMainThreadContext3D,
+      RenderThreadImpl::current()->SharedMainThreadContextProvider());
+
+  const WebPreferences webkit_preferences =
+      render_frame_->GetWebkitPreferences();
+  bool embedded_media_experience_enabled = false;
+  bool use_media_player_renderer = false;
+#if defined(OS_ANDROID)
+  use_media_player_renderer = UseMediaPlayerRenderer(url);
+  if (!use_media_player_renderer && !media_surface_manager_)
+    media_surface_manager_ = new RendererSurfaceViewManager(render_frame_);
+  embedded_media_experience_enabled =
+      webkit_preferences.embedded_media_experience_enabled;
+#endif  // defined(OS_ANDROID)
+
+  base::TimeDelta max_keyframe_distance_to_disable_background_video =
+      base::TimeDelta::FromMilliseconds(base::GetFieldTrialParamByFeatureAsInt(
+          media::kBackgroundVideoTrackOptimization, "max_keyframe_distance_ms",
+          base::TimeDelta::FromSeconds(10).InMilliseconds()));
+  base::TimeDelta max_keyframe_distance_to_disable_background_video_mse =
+      base::TimeDelta::FromMilliseconds(base::GetFieldTrialParamByFeatureAsInt(
+          media::kBackgroundVideoTrackOptimization,
+          "max_keyframe_distance_media_source_ms",
+          base::TimeDelta::FromSeconds(10).InMilliseconds()));
+
+  // This must be created for every new WebMediaPlayer, each instance generates
+  // a new player id which is used to collate logs on the browser side.
+  std::unique_ptr<media::MediaLog> media_log(
+      new RenderMediaLog(url::Origin(security_origin).GetURL()));
+
+  base::WeakPtr<media::MediaObserver> media_observer;
+
+  auto factory_selector =
+      CreateRendererFactorySelector(media_log.get(), use_media_player_renderer,
+                                    GetDecoderFactory(), &media_observer);
+
+  if (!url_index_.get() || url_index_->frame() != web_frame)
+    url_index_.reset(new media::UrlIndex(web_frame));
+
+  std::unique_ptr<media::WebMediaPlayerParams> params(
+      new media::WebMediaPlayerParams(
+          std::move(media_log),
+          base::Bind(&ContentRendererClient::DeferMediaLoad,
+                     base::Unretained(GetContentClient()->renderer()),
+                     static_cast<RenderFrame*>(render_frame_),
+                     GetWebMediaPlayerDelegate()->has_played_media()),
+          audio_renderer_sink, render_thread->GetMediaThreadTaskRunner(),
+          render_thread->GetWorkerTaskRunner(),
+          render_thread->compositor_task_runner(), context_3d_cb,
+          base::Bind(&v8::Isolate::AdjustAmountOfExternalAllocatedMemory,
+                     base::Unretained(blink::MainThreadIsolate())),
+          initial_cdm, media_surface_manager_, request_routing_token_cb_,
+          media_observer, max_keyframe_distance_to_disable_background_video,
+          max_keyframe_distance_to_disable_background_video_mse,
+          webkit_preferences.enable_instant_source_buffer_gc,
+          GetContentClient()->renderer()->AllowMediaSuspend(),
+          embedded_media_experience_enabled));
+
+  media::WebMediaPlayerImpl* media_player = new media::WebMediaPlayerImpl(
+      web_frame, client, encrypted_client, GetWebMediaPlayerDelegate(),
+      std::move(factory_selector), url_index_, std::move(params));
+
+#if defined(OS_ANDROID)  // WMPI_CAST
+  media_player->SetMediaPlayerManager(GetMediaPlayerManager());
+  media_player->SetDeviceScaleFactor(
+      render_frame_->render_view()->GetDeviceScaleFactor());
+#endif  // defined(OS_ANDROID)
+
+  return media_player;
+}
+
+blink::WebEncryptedMediaClient* MediaFactory::EncryptedMediaClient() {
+  if (!web_encrypted_media_client_) {
+    web_encrypted_media_client_.reset(new media::WebEncryptedMediaClientImpl(
+        // base::Unretained(this) is safe because WebEncryptedMediaClientImpl
+        // is destructed before |this|, and does not give away ownership of the
+        // callback.
+        base::Bind(&MediaFactory::AreSecureCodecsSupported,
+                   base::Unretained(this)),
+        GetCdmFactory(), render_frame_->GetMediaPermission(),
+        new RenderMediaLog(
+            url::Origin(render_frame_->GetWebFrame()->GetSecurityOrigin())
+                .GetURL())));
+  }
+  return web_encrypted_media_client_.get();
+}
+
+std::unique_ptr<media::RendererFactorySelector>
+MediaFactory::CreateRendererFactorySelector(
+    media::MediaLog* media_log,
+    bool use_media_player,
+    media::DecoderFactory* decoder_factory,
+    base::WeakPtr<media::MediaObserver>* out_media_observer) {
+  RenderThreadImpl* render_thread = RenderThreadImpl::current();
+  // Render thread may not exist in tests, returning nullptr if it does not.
+  if (!render_thread)
+    return nullptr;
+
+  auto factory_selector = base::MakeUnique<media::RendererFactorySelector>();
+
+#if defined(OS_ANDROID)
+  DCHECK(remote_interfaces_);
+
+  // The only MojoRendererService that is registered at the RenderFrameHost
+  // level uses the MediaPlayerRenderer as its underlying media::Renderer.
+  auto mojo_media_player_renderer_factory =
+      base::MakeUnique<media::MojoRendererFactory>(
+          media::MojoRendererFactory::GetGpuFactoriesCB(),
+          remote_interfaces_->get());
+
+  // Always give |factory_selector| a MediaPlayerRendererClient factory. WMPI
+  // might fallback to it if the final redirected URL is an HLS url.
+  factory_selector->AddFactory(
+      media::RendererFactorySelector::FactoryType::MEDIA_PLAYER,
+      base::MakeUnique<MediaPlayerRendererClientFactory>(
+          render_thread->compositor_task_runner(),
+          std::move(mojo_media_player_renderer_factory),
+          base::Bind(&StreamTextureWrapperImpl::Create,
+                     render_thread->EnableStreamTextureCopy(),
+                     render_thread->GetStreamTexureFactory(),
+                     base::ThreadTaskRunnerHandle::Get())));
+
+  factory_selector->SetUseMediaPlayer(use_media_player);
+#endif  // defined(OS_ANDROID)
+
+  bool use_mojo_renderer_factory = false;
+#if BUILDFLAG(ENABLE_MOJO_RENDERER)
+#if BUILDFLAG(ENABLE_RUNTIME_MEDIA_RENDERER_SELECTION)
+  use_mojo_renderer_factory =
+      !base::CommandLine::ForCurrentProcess()->HasSwitch(
+          switches::kDisableMojoRenderer);
+#else
+  use_mojo_renderer_factory = true;
+#endif  // BUILDFLAG(ENABLE_RUNTIME_MEDIA_RENDERER_SELECTION)
+  if (use_mojo_renderer_factory) {
+    factory_selector->AddFactory(
+        media::RendererFactorySelector::FactoryType::MOJO,
+        base::MakeUnique<media::MojoRendererFactory>(
+            base::Bind(&RenderThreadImpl::GetGpuFactories,
+                       base::Unretained(render_thread)),
+            GetMediaInterfaceProvider()));
+
+    factory_selector->SetBaseFactoryType(
+        media::RendererFactorySelector::FactoryType::MOJO);
+  }
+#endif  // BUILDFLAG(ENABLE_MOJO_RENDERER)
+
+  if (!use_mojo_renderer_factory) {
+    factory_selector->AddFactory(
+        media::RendererFactorySelector::FactoryType::DEFAULT,
+        base::MakeUnique<media::DefaultRendererFactory>(
+            media_log, decoder_factory,
+            base::Bind(&RenderThreadImpl::GetGpuFactories,
+                       base::Unretained(render_thread))));
+
+    factory_selector->SetBaseFactoryType(
+        media::RendererFactorySelector::FactoryType::DEFAULT);
+  }
+
+#if BUILDFLAG(ENABLE_MEDIA_REMOTING)
+  media::mojom::RemotingSourcePtr remoting_source;
+  auto remoting_source_request = mojo::MakeRequest(&remoting_source);
+  media::mojom::RemoterPtr remoter;
+  GetRemoterFactory()->Create(std::move(remoting_source),
+                              mojo::MakeRequest(&remoter));
+  using RemotingController = media::remoting::RendererController;
+  std::unique_ptr<RemotingController> remoting_controller(
+      new RemotingController(new media::remoting::SharedSession(
+          std::move(remoting_source_request), std::move(remoter))));
+  base::WeakPtr<media::MediaObserver> media_observer =
+      remoting_controller->GetWeakPtr();
+
+  auto courier_factory =
+      base::MakeUnique<media::remoting::CourierRendererFactory>(
+          std::move(remoting_controller));
+
+  // base::Unretained is safe here because |factory_selector| owns
+  // |courier_factory|.
+  factory_selector->SetQueryIsRemotingActiveCB(
+      base::Bind(&media::remoting::CourierRendererFactory::IsRemotingActive,
+                 base::Unretained(courier_factory.get())));
+
+  factory_selector->AddFactory(
+      media::RendererFactorySelector::FactoryType::COURIER,
+      std::move(courier_factory));
+#endif
+
+  return factory_selector;
+}
+
+blink::WebMediaPlayer* MediaFactory::CreateWebMediaPlayerForMediaStream(
+    blink::WebMediaPlayerClient* client,
+    const blink::WebString& sink_id,
+    const blink::WebSecurityOrigin& security_origin,
+    blink::WebLocalFrame* frame) {
+#if BUILDFLAG(ENABLE_WEBRTC)
+  RenderThreadImpl* const render_thread = RenderThreadImpl::current();
+
+  scoped_refptr<base::SingleThreadTaskRunner> compositor_task_runner =
+      render_thread->compositor_task_runner();
+  if (!compositor_task_runner.get())
+    compositor_task_runner = base::ThreadTaskRunnerHandle::Get();
+
+  return new WebMediaPlayerMS(
+      frame, client, GetWebMediaPlayerDelegate(),
+      base::MakeUnique<RenderMediaLog>(url::Origin(security_origin).GetURL()),
+      CreateMediaStreamRendererFactory(), render_thread->GetIOTaskRunner(),
+      compositor_task_runner, render_thread->GetMediaThreadTaskRunner(),
+      render_thread->GetWorkerTaskRunner(), render_thread->GetGpuFactories(),
+      sink_id, security_origin);
+#else
+  return NULL;
+#endif  // BUILDFLAG(ENABLE_WEBRTC)
+}
+
+media::RendererWebMediaPlayerDelegate*
+MediaFactory::GetWebMediaPlayerDelegate() {
+  if (!media_player_delegate_) {
+    media_player_delegate_ =
+        new media::RendererWebMediaPlayerDelegate(render_frame_);
+  }
+  return media_player_delegate_;
+}
+
+std::unique_ptr<MediaStreamRendererFactory>
+MediaFactory::CreateMediaStreamRendererFactory() {
+  std::unique_ptr<MediaStreamRendererFactory> factory =
+      GetContentClient()->renderer()->CreateMediaStreamRendererFactory();
+  if (factory.get())
+    return factory;
+#if BUILDFLAG(ENABLE_WEBRTC)
+  return std::unique_ptr<MediaStreamRendererFactory>(
+      new MediaStreamRendererFactoryImpl());
+#else
+  return std::unique_ptr<MediaStreamRendererFactory>(
+      static_cast<MediaStreamRendererFactory*>(NULL));
+#endif
+}
+
+media::DecoderFactory* MediaFactory::GetDecoderFactory() {
+#if BUILDFLAG(ENABLE_MOJO_AUDIO_DECODER) || BUILDFLAG(ENABLE_MOJO_VIDEO_DECODER)
+  if (!decoder_factory_) {
+    decoder_factory_.reset(
+        new media::MojoDecoderFactory(GetMediaInterfaceProvider()));
+  }
+#endif
+  return decoder_factory_.get();
+}
+
+#if defined(OS_ANDROID)
+RendererMediaPlayerManager* MediaFactory::GetMediaPlayerManager() {
+  if (!media_player_manager_)
+    media_player_manager_ = new RendererMediaPlayerManager(render_frame_);
+  return media_player_manager_;
+}
+#endif  // defined(OS_ANDROID)
+
+#if BUILDFLAG(ENABLE_MEDIA_REMOTING)
+media::mojom::RemoterFactory* MediaFactory::GetRemoterFactory() {
+  if (!remoter_factory_) {
+    DCHECK(remote_interfaces_);
+    remote_interfaces_->GetInterface(&remoter_factory_);
+  }
+  return remoter_factory_.get();
+}
+#endif
+
+bool MediaFactory::AreSecureCodecsSupported() {
+#if defined(OS_ANDROID)
+  // Hardware-secure codecs are only supported if secure surfaces are enabled.
+  return render_frame_->GetRendererPreferences()
+      .use_video_overlay_for_embedded_encrypted_video;
+#else
+  return false;
+#endif  // defined(OS_ANDROID)
+}
+
+media::CdmFactory* MediaFactory::GetCdmFactory() {
+  blink::WebLocalFrame* web_frame = render_frame_->GetWebFrame();
+  DCHECK(web_frame);
+
+  if (cdm_factory_)
+    return cdm_factory_.get();
+
+#if BUILDFLAG(ENABLE_PEPPER_CDMS)
+  static_assert(BUILDFLAG(ENABLE_MOJO_CDM),
+                "Mojo CDM should always be enabled when PPAPI CDM is enabled");
+  if (base::FeatureList::IsEnabled(media::kMojoCdm)) {
+    cdm_factory_.reset(new media::MojoCdmFactory(GetMediaInterfaceProvider()));
+  } else {
+    cdm_factory_.reset(new RenderCdmFactory(
+        base::Bind(&PepperCdmWrapperImpl::Create, web_frame)));
+  }
+#elif BUILDFLAG(ENABLE_MOJO_CDM)
+  cdm_factory_.reset(new media::MojoCdmFactory(GetMediaInterfaceProvider()));
+#endif  // BUILDFLAG(ENABLE_PEPPER_CDMS)
+
+#if BUILDFLAG(ENABLE_MEDIA_REMOTING)
+  cdm_factory_.reset(new media::remoting::RemotingCdmFactory(
+      std::move(cdm_factory_), GetRemoterFactory(),
+      std::move(remoting_sink_observer_)));
+#endif  // BUILDFLAG(ENABLE_MEDIA_REMOTING)
+
+  return cdm_factory_.get();
+}
+
+#if BUILDFLAG(ENABLE_MOJO_MEDIA)
+service_manager::mojom::InterfaceProvider*
+MediaFactory::GetMediaInterfaceProvider() {
+  if (!media_interface_provider_) {
+    DCHECK(remote_interfaces_);
+    media_interface_provider_.reset(
+        new MediaInterfaceProvider(remote_interfaces_));
+  }
+
+  return media_interface_provider_.get();
+}
+#endif  // BUILDFLAG(ENABLE_MOJO_MEDIA)
+
+}  // namespace content
\ No newline at end of file
diff --git a/content/renderer/media/media_factory.h b/content/renderer/media/media_factory.h
new file mode 100644
index 0000000..eeb6854
--- /dev/null
+++ b/content/renderer/media/media_factory.h
@@ -0,0 +1,203 @@
+// Copyright 2017 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_RENDERER_MEDIA_MEDIA_FACTORY_H_
+#define CONTENT_RENDERER_MEDIA_MEDIA_FACTORY_H_
+
+#include <memory>
+
+#include "base/memory/linked_ptr.h"
+#include "base/memory/weak_ptr.h"
+#include "build/buildflag.h"
+#include "media/base/renderer_factory_selector.h"
+#include "media/base/routing_token_callback.h"
+#include "media/blink/url_index.h"
+#include "media/media_features.h"
+#include "media/mojo/features.h"
+#include "media/mojo/interfaces/remoting.mojom.h"
+#include "third_party/WebKit/public/platform/WebMediaPlayerSource.h"
+#include "third_party/WebKit/public/platform/WebSecurityOrigin.h"
+#include "third_party/WebKit/public/platform/WebSetSinkIdCallbacks.h"
+#include "third_party/WebKit/public/platform/WebString.h"
+#include "url/gurl.h"
+
+namespace blink {
+class WebContentDecryptionModule;
+class WebEncryptedMediaClient;
+class WebLocalFrame;
+class WebMediaPlayer;
+class WebMediaPlayerClient;
+class WebMediaPlayerEncryptedMediaClient;
+}
+
+namespace media {
+class CdmFactory;
+class DecoderFactory;
+class MediaLog;
+class MediaObserver;
+class RendererWebMediaPlayerDelegate;
+class SurfaceManager;
+class WebEncryptedMediaClientImpl;
+#if defined(OS_ANDROID)
+class RendererMediaPlayerManager;
+#endif
+namespace remoting {
+class SinkAvailabilityObserver;
+}
+}
+
+namespace service_manager {
+class InterfaceProvider;
+namespace mojom {
+class InterfaceProvider;
+}
+}
+
+namespace content {
+
+class RenderFrameImpl;
+class MediaInterfaceProvider;
+class MediaStreamRendererFactory;
+
+#if defined(OS_ANDROID)
+class RendererMediaPlayerManager;
+#endif
+
+// Assist to RenderFrameImpl in creating various media clients.
+class MediaFactory {
+ public:
+  // Create a MediaFactory to assist the |render_frame| with media tasks.
+  // |request_routing_token_cb| bound to |render_frame| IPC functions for
+  // obtaining overlay tokens.
+  MediaFactory(RenderFrameImpl* render_frame,
+               media::RequestRoutingTokenCallback request_routing_token_cb);
+  ~MediaFactory();
+
+  // Instruct MediaFactory to establish Mojo channels as needed to perform its
+  // factory duties. This should be called by RenderFrameImpl as soon as its own
+  // interface provider is bound.
+  void SetupMojo();
+
+  // Creates a new WebMediaPlayer for the given |source| (either a stream or
+  // URL). All pointers other than |initial_cdm| are required to be non-null.
+  // The created player serves and is directed by the |client| (e.g.
+  // HTMLMediaElement). The |encrypted_client| will be used to establish
+  // means of decryption for encrypted content. |initial_cdm| should point
+  // to a ContentDecryptionModule if MediaKeys have been provided to the
+  // |encrypted_client| (otherwise null). |sink_id|, when not empty, identifies
+  // the audio sink to use for this player (see HTMLMediaElement.sinkId).
+  blink::WebMediaPlayer* CreateMediaPlayer(
+      const blink::WebMediaPlayerSource& source,
+      blink::WebMediaPlayerClient* client,
+      blink::WebMediaPlayerEncryptedMediaClient* encrypted_client,
+      blink::WebContentDecryptionModule* initial_cdm,
+      const blink::WebString& sink_id);
+
+  // Provides an EncryptedMediaClient to connect blink's EME layer to media's
+  // implementation of requestMediaKeySystemAccess. Will always return the same
+  // client whose lifetime is tied to this Factory (same as the RenderFrame).
+  blink::WebEncryptedMediaClient* EncryptedMediaClient();
+
+ private:
+  std::unique_ptr<media::RendererFactorySelector> CreateRendererFactorySelector(
+      media::MediaLog* media_log,
+      bool use_media_player,
+      media::DecoderFactory* decoder_factory,
+      base::WeakPtr<media::MediaObserver>* out_media_observer);
+
+  blink::WebMediaPlayer* CreateWebMediaPlayerForMediaStream(
+      blink::WebMediaPlayerClient* client,
+      const blink::WebString& sink_id,
+      const blink::WebSecurityOrigin& security_origin,
+      blink::WebLocalFrame* frame);
+
+  // Returns the media delegate for WebMediaPlayer usage.  If
+  // |media_player_delegate_| is NULL, one is created.
+  media::RendererWebMediaPlayerDelegate* GetWebMediaPlayerDelegate();
+
+  // Creates a MediaStreamRendererFactory used for creating audio and video
+  // renderers for WebMediaPlayerMS.
+  std::unique_ptr<MediaStreamRendererFactory>
+  CreateMediaStreamRendererFactory();
+
+  media::DecoderFactory* GetDecoderFactory();
+
+#if defined(OS_ANDROID)
+  RendererMediaPlayerManager* GetMediaPlayerManager();
+#endif
+
+#if BUILDFLAG(ENABLE_MEDIA_REMOTING)
+  media::mojom::RemoterFactory* GetRemoterFactory();
+#endif
+
+  bool AreSecureCodecsSupported();
+
+  media::CdmFactory* GetCdmFactory();
+
+#if BUILDFLAG(ENABLE_MOJO_MEDIA)
+  service_manager::mojom::InterfaceProvider* GetMediaInterfaceProvider();
+
+  // The media interface provider attached to this frame, lazily initialized.
+  std::unique_ptr<MediaInterfaceProvider> media_interface_provider_;
+#endif
+
+  // The render frame we're helping. RenderFrameImpl owns this factory, so the
+  // pointer will always be valid.
+  RenderFrameImpl* render_frame_;
+
+  // Injected callback for requesting overlay routing tokens.
+  media::RequestRoutingTokenCallback request_routing_token_cb_;
+
+  // Handy pointer to RenderFrame's remote interfaces. Null until SetupMojo().
+  // Lifetime matches that of the owning |render_frame_|. Will always be valid
+  // once assigned.
+  service_manager::InterfaceProvider* remote_interfaces_ = nullptr;
+
+#if defined(OS_ANDROID)
+  // Manages media players and sessions in this render frame for communicating
+  // with the real media player and sessions in the browser process.
+  // Lifetime is tied to the RenderFrame via the RenderFrameObserver interface.
+  // NOTE: This currently only being used in the case where we are casting. See
+  // also WebMediaPlayerCast (renderer side) and RemoteMediaPlayerManager
+  // (browser side).
+  RendererMediaPlayerManager* media_player_manager_ = nullptr;
+#endif
+
+  // Handles requests for SurfaceViews for MediaPlayers.
+  // Lifetime is tied to the RenderFrame via the RenderFrameObserver interface.
+  media::SurfaceManager* media_surface_manager_ = nullptr;
+
+  // Manages play, pause notifications for WebMediaPlayer implementations; its
+  // lifetime is tied to the RenderFrame via the RenderFrameObserver interface.
+  media::RendererWebMediaPlayerDelegate* media_player_delegate_ = nullptr;
+
+  // The CDM and decoder factory attached to this frame, lazily initialized.
+  std::unique_ptr<media::DecoderFactory> decoder_factory_;
+  std::unique_ptr<media::CdmFactory> cdm_factory_;
+
+  // Media resource cache, lazily initialized.
+  linked_ptr<media::UrlIndex> url_index_;
+
+  // EncryptedMediaClient attached to this frame; lazily initialized.
+  std::unique_ptr<media::WebEncryptedMediaClientImpl>
+      web_encrypted_media_client_;
+
+#if BUILDFLAG(ENABLE_MEDIA_REMOTING)
+  // Lazy-bound pointer to the RemoterFactory service in the browser
+  // process. Always use the GetRemoterFactory() accessor instead of this.
+  media::mojom::RemoterFactoryPtr remoter_factory_;
+
+  // An observer for the remoting sink availability that is used by
+  // media::RemotingCdmFactory to initialize media::RemotingSourceImpl. Created
+  // in the constructor of RenderFrameImpl to make sure
+  // media::RemotingSourceImpl be intialized with correct availability info.
+  // Own by media::RemotingCdmFactory after it is created.
+  std::unique_ptr<media::remoting::SinkAvailabilityObserver>
+      remoting_sink_observer_;
+#endif
+};
+
+}  // namespace content
+
+#endif  // CONTENT_RENDERER_MEDIA_MEDIA_FACTORY_H_
\ No newline at end of file
diff --git a/content/renderer/mus/renderer_window_tree_client.cc b/content/renderer/mus/renderer_window_tree_client.cc
index 8603074..20dc7d93 100644
--- a/content/renderer/mus/renderer_window_tree_client.cc
+++ b/content/renderer/mus/renderer_window_tree_client.cc
@@ -152,6 +152,11 @@
     const base::Optional<cc::LocalSurfaceId>& local_surface_id) {
 }
 
+void RendererWindowTreeClient::OnWindowTransformChanged(
+    ui::Id window_id,
+    const gfx::Transform& old_transform,
+    const gfx::Transform& new_transform) {}
+
 void RendererWindowTreeClient::OnClientAreaChanged(
     uint32_t window_id,
     const gfx::Insets& new_client_area,
diff --git a/content/renderer/mus/renderer_window_tree_client.h b/content/renderer/mus/renderer_window_tree_client.h
index f6937f743..271d162 100644
--- a/content/renderer/mus/renderer_window_tree_client.h
+++ b/content/renderer/mus/renderer_window_tree_client.h
@@ -88,6 +88,9 @@
       const gfx::Rect& old_bounds,
       const gfx::Rect& new_bounds,
       const base::Optional<cc::LocalSurfaceId>& local_frame_id) override;
+  void OnWindowTransformChanged(ui::Id window_id,
+                                const gfx::Transform& old_transform,
+                                const gfx::Transform& new_transform) override;
   void OnClientAreaChanged(
       uint32_t window_id,
       const gfx::Insets& new_client_area,
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc
index 8d9e7c0d..a6ebbfb0 100644
--- a/content/renderer/render_frame_impl.cc
+++ b/content/renderer/render_frame_impl.cc
@@ -120,12 +120,7 @@
 #include "content/renderer/media/media_devices_listener_impl.h"
 #include "content/renderer/media/media_permission_dispatcher.h"
 #include "content/renderer/media/media_stream_dispatcher.h"
-#include "content/renderer/media/media_stream_renderer_factory_impl.h"
-#include "content/renderer/media/render_media_log.h"
-#include "content/renderer/media/renderer_webmediaplayer_delegate.h"
 #include "content/renderer/media/user_media_client_impl.h"
-#include "content/renderer/media/web_media_element_source_utils.h"
-#include "content/renderer/media/webmediaplayer_ms.h"
 #include "content/renderer/mojo/blink_connector_js_wrapper.h"
 #include "content/renderer/mojo/blink_interface_registry_impl.h"
 #include "content/renderer/mojo/interface_provider_js_wrapper.h"
@@ -157,20 +152,7 @@
 #include "gin/modules/console.h"
 #include "gin/modules/module_registry.h"
 #include "gin/modules/timer.h"
-#include "media/audio/audio_output_device.h"
-#include "media/base/audio_renderer_mixer_input.h"
-#include "media/base/cdm_factory.h"
-#include "media/base/decoder_factory.h"
-#include "media/base/media.h"
-#include "media/base/media_log.h"
-#include "media/base/media_switches.h"
-#include "media/base/renderer_factory_selector.h"
-#include "media/blink/url_index.h"
-#include "media/blink/webencryptedmediaclient_impl.h"
-#include "media/blink/webmediaplayer_impl.h"
-#include "media/media_features.h"
-#include "media/renderers/default_renderer_factory.h"
-#include "media/renderers/gpu_video_accelerator_factories.h"
+#include "media/blink/webmediaplayer_util.h"
 #include "mojo/edk/js/core.h"
 #include "mojo/edk/js/support.h"
 #include "net/base/data_url.h"
@@ -199,6 +181,7 @@
 #include "third_party/WebKit/public/platform/WebURLError.h"
 #include "third_party/WebKit/public/platform/WebURLResponse.h"
 #include "third_party/WebKit/public/platform/WebVector.h"
+#include "third_party/WebKit/public/platform/modules/permissions/permission.mojom.h"
 #include "third_party/WebKit/public/platform/modules/serviceworker/WebServiceWorkerNetworkProvider.h"
 #include "third_party/WebKit/public/platform/scheduler/renderer/renderer_scheduler.h"
 #include "third_party/WebKit/public/web/WebColorSuggestion.h"
@@ -250,45 +233,9 @@
 #include <cpu-features.h>
 
 #include "content/renderer/java/gin_java_bridge_dispatcher.h"
-#include "content/renderer/media/android/media_player_renderer_client_factory.h"
-#include "content/renderer/media/android/renderer_media_player_manager.h"
-#include "content/renderer/media/android/renderer_surface_view_manager.h"
-#include "content/renderer/media/android/stream_texture_factory.h"
-#include "content/renderer/media/android/stream_texture_wrapper_impl.h"
-#include "media/base/android/media_codec_util.h"
 #include "third_party/WebKit/public/platform/WebFloatPoint.h"
 #endif
 
-#if BUILDFLAG(ENABLE_PEPPER_CDMS)
-#include "content/renderer/media/cdm/pepper_cdm_wrapper_impl.h"
-#include "content/renderer/media/cdm/render_cdm_factory.h"
-#endif
-
-#if BUILDFLAG(ENABLE_MOJO_MEDIA)
-#include "content/renderer/media/media_interface_provider.h"
-#endif
-
-#if BUILDFLAG(ENABLE_MOJO_CDM)
-#include "media/mojo/clients/mojo_cdm_factory.h"  // nogncheck
-#endif
-
-#if BUILDFLAG(ENABLE_MOJO_RENDERER)
-#include "media/mojo/clients/mojo_renderer_factory.h"  // nogncheck
-#endif
-
-#if BUILDFLAG(ENABLE_MOJO_AUDIO_DECODER) || BUILDFLAG(ENABLE_MOJO_VIDEO_DECODER)
-#include "media/mojo/clients/mojo_decoder_factory.h"  // nogncheck
-#endif
-
-#if BUILDFLAG(ENABLE_MEDIA_REMOTING)
-#include "media/remoting/courier_renderer_factory.h"      // nogncheck
-#include "media/remoting/remoting_cdm_controller.h"       // nogncheck
-#include "media/remoting/remoting_cdm_factory.h"          // nogncheck
-#include "media/remoting/renderer_controller.h"           // nogncheck
-#include "media/remoting/shared_session.h"                // nogncheck
-#include "media/remoting/sink_availability_observer.h"    // nogncheck
-#endif
-
 using base::Time;
 using base::TimeDelta;
 using blink::WebCachePolicy;
@@ -575,13 +522,6 @@
       should_check_main_world_csp);
 }
 
-media::Context3D GetSharedMainThreadContext3D(
-    scoped_refptr<ui::ContextProviderCommandBuffer> provider) {
-  if (!provider)
-    return media::Context3D();
-  return media::Context3D(provider->ContextGL(), provider->GrContext());
-}
-
 WebFrameLoadType ReloadFrameLoadTypeFor(
     FrameMsg_Navigate_Type::Value navigation_type) {
   switch (navigation_type) {
@@ -731,40 +671,6 @@
   return save_status;
 }
 
-#if defined(OS_ANDROID)
-// Returns true if the MediaPlayerRenderer should be used for playback, false
-// if the default renderer should be used instead.
-//
-// Note that HLS and MP4 detection are pre-redirect and path-based. It is
-// possible to load such a URL and find different content.
-bool UseMediaPlayerRenderer(const GURL& url) {
-  // Always use the default renderer for playing blob URLs.
-  if (url.SchemeIsBlob())
-    return false;
-
-  // The default renderer does not support HLS.
-  if (media::MediaCodecUtil::IsHLSURL(url))
-    return true;
-
-  // Don't use the default renderer if the container likely contains a codec we
-  // can't decode in software and platform decoders are not available.
-  if (!media::HasPlatformDecoderSupport()) {
-    // Assume that "mp4" means H264. Without platform decoder support we cannot
-    // play it with the default renderer so use MediaPlayerRenderer.
-    // http://crbug.com/642988.
-    if (base::ToLowerASCII(url.spec()).find("mp4") != std::string::npos)
-      return true;
-  }
-
-  // Indicates if the Android MediaPlayer should be used instead of WMPI.
-  if (GetContentClient()->renderer()->ShouldUseMediaPlayerForURL(url))
-    return true;
-
-  // Otherwise, use the default renderer.
-  return false;
-}
-#endif  // defined(OS_ANDROID)
-
 double ConvertToBlinkTime(const base::TimeTicks& time_ticks) {
   return (time_ticks - base::TimeTicks()).InSecondsF();
 }
@@ -1226,17 +1132,12 @@
       selection_range_(gfx::Range::InvalidRange()),
       handling_select_range_(false),
       web_user_media_client_(NULL),
-#if defined(OS_ANDROID)
-      media_player_manager_(NULL),
-#endif
-      media_surface_manager_(nullptr),
       devtools_agent_(nullptr),
       presentation_dispatcher_(NULL),
       push_messaging_client_(NULL),
       screen_orientation_dispatcher_(NULL),
       manifest_manager_(NULL),
       render_accessibility_(NULL),
-      media_player_delegate_(NULL),
       previews_state_(PREVIEWS_UNSPECIFIED),
       effective_connection_type_(
           blink::WebEffectiveConnectionType::kTypeUnknown),
@@ -1252,6 +1153,9 @@
       host_zoom_binding_(this),
       frame_bindings_control_binding_(this),
       has_accessed_initial_document_(false),
+      media_factory_(this,
+                     base::Bind(&RenderFrameImpl::RequestOverlayRoutingToken,
+                                base::Unretained(this))),
       weak_factory_(this) {
   interface_registry_ = base::MakeUnique<service_manager::BinderRegistry>();
   service_manager::mojom::InterfaceProviderPtr remote_interfaces;
@@ -1263,6 +1167,9 @@
   blink_interface_registry_.reset(
       new BlinkInterfaceRegistryImpl(interface_registry_->GetWeakPtr()));
 
+  // Must call after binding our own remote interfaces.
+  media_factory_.SetupMojo();
+
   std::pair<RoutingIDFrameMap::iterator, bool> result =
       g_routing_id_frame_map.Get().insert(std::make_pair(routing_id_, this));
   CHECK(result.second) << "Inserting a duplicate item.";
@@ -1283,19 +1190,6 @@
 #endif
 
   manifest_manager_ = new ManifestManager(this);
-
-#if BUILDFLAG(ENABLE_MEDIA_REMOTING)
-  // Create the SinkAvailabilityObserver to monitor the remoting sink
-  // availablity.
-  media::mojom::RemotingSourcePtr remoting_source;
-  auto remoting_source_request = mojo::MakeRequest(&remoting_source);
-  media::mojom::RemoterPtr remoter;
-  GetRemoterFactory()->Create(std::move(remoting_source),
-                              mojo::MakeRequest(&remoter));
-  remoting_sink_observer_ =
-      base::MakeUnique<media::remoting::SinkAvailabilityObserver>(
-          std::move(remoting_source_request), std::move(remoter));
-#endif  // BUILDFLAG(ENABLE_MEDIA_REMOTING)
 }
 
 mojom::FrameHostAssociatedPtr RenderFrameImpl::GetFrameHost() {
@@ -2587,6 +2481,10 @@
   return render_view_->GetWebkitPreferences();
 }
 
+const RendererPreferences& RenderFrameImpl::GetRendererPreferences() const {
+  return render_view_->renderer_preferences();
+}
+
 int RenderFrameImpl::ShowContextMenu(ContextMenuClient* client,
                                      const ContextMenuParams& params) {
   DCHECK(client);  // A null client means "internal" when we issue callbacks.
@@ -2922,183 +2820,8 @@
     WebMediaPlayerEncryptedMediaClient* encrypted_client,
     WebContentDecryptionModule* initial_cdm,
     const blink::WebString& sink_id) {
-  blink::WebSecurityOrigin security_origin = frame_->GetSecurityOrigin();
-  blink::WebMediaStream web_stream =
-      GetWebMediaStreamFromWebMediaPlayerSource(source);
-  if (!web_stream.IsNull())
-    return CreateWebMediaPlayerForMediaStream(client, sink_id, security_origin);
-
-  // If |source| was not a MediaStream, it must be a URL.
-  // TODO(guidou): Fix this when support for other srcObject types is added.
-  DCHECK(source.IsURL());
-  blink::WebURL url = source.GetAsURL();
-
-  RenderThreadImpl* render_thread = RenderThreadImpl::current();
-  // Render thread may not exist in tests, returning nullptr if it does not.
-  if (!render_thread)
-    return nullptr;
-
-  scoped_refptr<media::SwitchableAudioRendererSink> audio_renderer_sink =
-      AudioDeviceFactory::NewSwitchableAudioRendererSink(
-          AudioDeviceFactory::kSourceMediaElement, routing_id_, 0,
-          sink_id.Utf8(), security_origin);
-  // We need to keep a reference to the context provider (see crbug.com/610527)
-  // but media/ can't depend on cc/, so for now, just keep a reference in the
-  // callback.
-  // TODO(piman): replace media::Context3D to scoped_refptr<ContextProvider> in
-  // media/ once ContextProvider is in gpu/.
-  media::WebMediaPlayerParams::Context3DCB context_3d_cb = base::Bind(
-      &GetSharedMainThreadContext3D,
-      RenderThreadImpl::current()->SharedMainThreadContextProvider());
-
-  bool embedded_media_experience_enabled = false;
-#if defined(OS_ANDROID)
-  if (!UseMediaPlayerRenderer(url) && !media_surface_manager_)
-    media_surface_manager_ = new RendererSurfaceViewManager(this);
-  embedded_media_experience_enabled =
-      GetWebkitPreferences().embedded_media_experience_enabled;
-#endif  // defined(OS_ANDROID)
-
-#if BUILDFLAG(ENABLE_MEDIA_REMOTING)
-  media::mojom::RemotingSourcePtr remoting_source;
-  auto remoting_source_request = mojo::MakeRequest(&remoting_source);
-  media::mojom::RemoterPtr remoter;
-  GetRemoterFactory()->Create(std::move(remoting_source),
-                              mojo::MakeRequest(&remoter));
-  using RemotingController = media::remoting::RendererController;
-  std::unique_ptr<RemotingController> remoting_controller(
-      new RemotingController(new media::remoting::SharedSession(
-          std::move(remoting_source_request), std::move(remoter))));
-  base::WeakPtr<media::MediaObserver> media_observer =
-      remoting_controller->GetWeakPtr();
-#else
-  base::WeakPtr<media::MediaObserver> media_observer = nullptr;
-#endif
-
-  base::TimeDelta max_keyframe_distance_to_disable_background_video =
-      base::TimeDelta::FromMilliseconds(base::GetFieldTrialParamByFeatureAsInt(
-          media::kBackgroundVideoTrackOptimization, "max_keyframe_distance_ms",
-          base::TimeDelta::FromSeconds(10).InMilliseconds()));
-  base::TimeDelta max_keyframe_distance_to_disable_background_video_mse =
-      base::TimeDelta::FromMilliseconds(base::GetFieldTrialParamByFeatureAsInt(
-          media::kBackgroundVideoTrackOptimization,
-          "max_keyframe_distance_media_source_ms",
-          base::TimeDelta::FromSeconds(10).InMilliseconds()));
-
-  // This must be created for every new WebMediaPlayer, each instance generates
-  // a new player id which is used to collate logs on the browser side.
-  std::unique_ptr<media::MediaLog> media_log(
-      new RenderMediaLog(url::Origin(security_origin).GetURL()));
-
-  auto factory_selector = base::MakeUnique<media::RendererFactorySelector>();
-
-#if defined(OS_ANDROID)
-  // The only MojoRendererService that is registered at the RenderFrameHost
-  // level uses the MediaPlayerRenderer as its underlying media::Renderer.
-  auto mojo_media_player_renderer_factory =
-      base::MakeUnique<media::MojoRendererFactory>(
-          media::MojoRendererFactory::GetGpuFactoriesCB(),
-          GetRemoteInterfaces()->get());
-
-  // Always give |factory_selector| a MediaPlayerRendererClient factory. WMPI
-  // might fallback to it if the final redirected URL is an HLS url.
-  factory_selector->AddFactory(
-      media::RendererFactorySelector::FactoryType::MEDIA_PLAYER,
-      base::MakeUnique<MediaPlayerRendererClientFactory>(
-          render_thread->compositor_task_runner(),
-          std::move(mojo_media_player_renderer_factory),
-          base::Bind(&StreamTextureWrapperImpl::Create,
-                     render_thread->EnableStreamTextureCopy(),
-                     render_thread->GetStreamTexureFactory(),
-                     base::ThreadTaskRunnerHandle::Get())));
-
-  factory_selector->SetUseMediaPlayer(UseMediaPlayerRenderer(url));
-#endif  // defined(OS_ANDROID)
-
-  bool use_mojo_renderer_factory = false;
-#if BUILDFLAG(ENABLE_MOJO_RENDERER)
-#if BUILDFLAG(ENABLE_RUNTIME_MEDIA_RENDERER_SELECTION)
-  use_mojo_renderer_factory =
-      !base::CommandLine::ForCurrentProcess()->HasSwitch(
-          switches::kDisableMojoRenderer);
-#else
-  use_mojo_renderer_factory = true;
-#endif  // BUILDFLAG(ENABLE_RUNTIME_MEDIA_RENDERER_SELECTION)
-  if (use_mojo_renderer_factory) {
-    factory_selector->AddFactory(
-        media::RendererFactorySelector::FactoryType::MOJO,
-        base::MakeUnique<media::MojoRendererFactory>(
-            base::Bind(&RenderThreadImpl::GetGpuFactories,
-                       base::Unretained(render_thread)),
-            GetMediaInterfaceProvider()));
-
-    factory_selector->SetBaseFactoryType(
-        media::RendererFactorySelector::FactoryType::MOJO);
-  }
-#endif  // BUILDFLAG(ENABLE_MOJO_RENDERER)
-
-  if (!use_mojo_renderer_factory) {
-    factory_selector->AddFactory(
-        media::RendererFactorySelector::FactoryType::DEFAULT,
-        base::MakeUnique<media::DefaultRendererFactory>(
-            media_log.get(), GetDecoderFactory(),
-            base::Bind(&RenderThreadImpl::GetGpuFactories,
-                       base::Unretained(render_thread))));
-
-    factory_selector->SetBaseFactoryType(
-        media::RendererFactorySelector::FactoryType::DEFAULT);
-  }
-
-#if BUILDFLAG(ENABLE_MEDIA_REMOTING)
-  auto courier_factory =
-      base::MakeUnique<media::remoting::CourierRendererFactory>(
-          std::move(remoting_controller));
-
-  // base::Unretained is safe here because |factory_selector| owns
-  // |courier_factory|.
-  factory_selector->SetQueryIsRemotingActiveCB(
-      base::Bind(&media::remoting::CourierRendererFactory::IsRemotingActive,
-                 base::Unretained(courier_factory.get())));
-
-  factory_selector->AddFactory(
-      media::RendererFactorySelector::FactoryType::COURIER,
-      std::move(courier_factory));
-#endif
-
-  if (!url_index_.get() || url_index_->frame() != frame_)
-    url_index_.reset(new media::UrlIndex(frame_));
-
-  std::unique_ptr<media::WebMediaPlayerParams> params(
-      new media::WebMediaPlayerParams(
-          std::move(media_log),
-          base::Bind(&ContentRendererClient::DeferMediaLoad,
-                     base::Unretained(GetContentClient()->renderer()),
-                     static_cast<RenderFrame*>(this),
-                     GetWebMediaPlayerDelegate()->has_played_media()),
-          audio_renderer_sink, render_thread->GetMediaThreadTaskRunner(),
-          render_thread->GetWorkerTaskRunner(),
-          render_thread->compositor_task_runner(), context_3d_cb,
-          base::Bind(&v8::Isolate::AdjustAmountOfExternalAllocatedMemory,
-                     base::Unretained(blink::MainThreadIsolate())),
-          initial_cdm, media_surface_manager_,
-          base::Bind(&RenderFrameImpl::RequestOverlayRoutingToken,
-                     base::Unretained(this)),
-          media_observer, max_keyframe_distance_to_disable_background_video,
-          max_keyframe_distance_to_disable_background_video_mse,
-          GetWebkitPreferences().enable_instant_source_buffer_gc,
-          GetContentClient()->renderer()->AllowMediaSuspend(),
-          embedded_media_experience_enabled));
-
-  media::WebMediaPlayerImpl* media_player = new media::WebMediaPlayerImpl(
-      frame_, client, encrypted_client, GetWebMediaPlayerDelegate(),
-      std::move(factory_selector), url_index_, std::move(params));
-
-#if defined(OS_ANDROID)  // WMPI_CAST
-  media_player->SetMediaPlayerManager(GetMediaPlayerManager());
-  media_player->SetDeviceScaleFactor(render_view_->GetDeviceScaleFactor());
-#endif  // defined(OS_ANDROID)
-
-  return media_player;
+  return media_factory_.CreateMediaPlayer(source, client, encrypted_client,
+                                          initial_cdm, sink_id);
 }
 
 std::unique_ptr<blink::WebApplicationCacheHost>
@@ -4800,17 +4523,7 @@
 }
 
 blink::WebEncryptedMediaClient* RenderFrameImpl::EncryptedMediaClient() {
-  if (!web_encrypted_media_client_) {
-    web_encrypted_media_client_.reset(new media::WebEncryptedMediaClientImpl(
-        // base::Unretained(this) is safe because WebEncryptedMediaClientImpl
-        // is destructed before |this|, and does not give away ownership of the
-        // callback.
-        base::Bind(&RenderFrameImpl::AreSecureCodecsSupported,
-                   base::Unretained(this)),
-        GetCdmFactory(), GetMediaPermission(),
-        new RenderMediaLog(url::Origin(frame_->GetSecurityOrigin()).GetURL())));
-  }
-  return web_encrypted_media_client_.get();
+  return media_factory_.EncryptedMediaClient();
 }
 
 blink::WebString RenderFrameImpl::UserAgentOverride() {
@@ -6458,45 +6171,6 @@
 #endif
 }
 
-WebMediaPlayer* RenderFrameImpl::CreateWebMediaPlayerForMediaStream(
-    WebMediaPlayerClient* client,
-    const WebString& sink_id,
-    const WebSecurityOrigin& security_origin) {
-#if BUILDFLAG(ENABLE_WEBRTC)
-  RenderThreadImpl* const render_thread = RenderThreadImpl::current();
-
-  scoped_refptr<base::SingleThreadTaskRunner> compositor_task_runner =
-      render_thread->compositor_task_runner();
-  if (!compositor_task_runner.get())
-    compositor_task_runner = base::ThreadTaskRunnerHandle::Get();
-
-  return new WebMediaPlayerMS(
-      frame_, client, GetWebMediaPlayerDelegate(),
-      base::MakeUnique<RenderMediaLog>(url::Origin(security_origin).GetURL()),
-      CreateRendererFactory(), render_thread->GetIOTaskRunner(),
-      compositor_task_runner, render_thread->GetMediaThreadTaskRunner(),
-      render_thread->GetWorkerTaskRunner(), render_thread->GetGpuFactories(),
-      sink_id, security_origin);
-#else
-  return NULL;
-#endif  // BUILDFLAG(ENABLE_WEBRTC)
-}
-
-std::unique_ptr<MediaStreamRendererFactory>
-RenderFrameImpl::CreateRendererFactory() {
-  std::unique_ptr<MediaStreamRendererFactory> factory =
-      GetContentClient()->renderer()->CreateMediaStreamRendererFactory();
-  if (factory.get())
-    return factory;
-#if BUILDFLAG(ENABLE_WEBRTC)
-  return std::unique_ptr<MediaStreamRendererFactory>(
-      new MediaStreamRendererFactoryImpl());
-#else
-  return std::unique_ptr<MediaStreamRendererFactory>(
-      static_cast<MediaStreamRendererFactory*>(NULL));
-#endif
-}
-
 void RenderFrameImpl::PrepareRenderViewForNavigation(
     const GURL& url,
     const RequestNavigationParams& request_params) {
@@ -6819,14 +6493,6 @@
   pending_navigation_params_.reset();
 }
 
-#if defined(OS_ANDROID)
-RendererMediaPlayerManager* RenderFrameImpl::GetMediaPlayerManager() {
-  if (!media_player_manager_)
-    media_player_manager_ = new RendererMediaPlayerManager(this);
-  return media_player_manager_;
-}
-#endif  // defined(OS_ANDROID)
-
 media::MediaPermission* RenderFrameImpl::GetMediaPermission() {
   if (!media_permission_dispatcher_) {
     media_permission_dispatcher_.reset(new MediaPermissionDispatcher(base::Bind(
@@ -6836,74 +6502,6 @@
   return media_permission_dispatcher_.get();
 }
 
-#if BUILDFLAG(ENABLE_MOJO_MEDIA)
-service_manager::mojom::InterfaceProvider*
-RenderFrameImpl::GetMediaInterfaceProvider() {
-  if (!media_interface_provider_) {
-    media_interface_provider_.reset(
-        new MediaInterfaceProvider(GetRemoteInterfaces()));
-  }
-
-  return media_interface_provider_.get();
-}
-#endif  // BUILDFLAG(ENABLE_MOJO_MEDIA)
-
-bool RenderFrameImpl::AreSecureCodecsSupported() {
-#if defined(OS_ANDROID)
-  // Hardware-secure codecs are only supported if secure surfaces are enabled.
-  return render_view_->renderer_preferences_
-      .use_video_overlay_for_embedded_encrypted_video;
-#else
-  return false;
-#endif  // defined(OS_ANDROID)
-}
-
-#if BUILDFLAG(ENABLE_MEDIA_REMOTING)
-media::mojom::RemoterFactory* RenderFrameImpl::GetRemoterFactory() {
-  if (!remoter_factory_)
-    GetRemoteInterfaces()->GetInterface(&remoter_factory_);
-  return remoter_factory_.get();
-}
-#endif
-
-media::CdmFactory* RenderFrameImpl::GetCdmFactory() {
-  DCHECK(frame_);
-
-  if (cdm_factory_)
-    return cdm_factory_.get();
-
-#if BUILDFLAG(ENABLE_PEPPER_CDMS)
-  static_assert(BUILDFLAG(ENABLE_MOJO_CDM),
-                "Mojo CDM should always be enabled when PPAPI CDM is enabled");
-  if (base::FeatureList::IsEnabled(media::kMojoCdm)) {
-    cdm_factory_.reset(new media::MojoCdmFactory(GetMediaInterfaceProvider()));
-  } else {
-    cdm_factory_.reset(new RenderCdmFactory(
-        base::Bind(&PepperCdmWrapperImpl::Create, frame_)));
-  }
-#elif BUILDFLAG(ENABLE_MOJO_CDM)
-  cdm_factory_.reset(new media::MojoCdmFactory(GetMediaInterfaceProvider()));
-#endif  // BUILDFLAG(ENABLE_PEPPER_CDMS)
-
-#if BUILDFLAG(ENABLE_MEDIA_REMOTING)
-  cdm_factory_.reset(new media::remoting::RemotingCdmFactory(
-      std::move(cdm_factory_), GetRemoterFactory(),
-      std::move(remoting_sink_observer_)));
-#endif  // BUILDFLAG(ENABLE_MEDIA_REMOTING)
-
-  return cdm_factory_.get();
-}
-
-media::DecoderFactory* RenderFrameImpl::GetDecoderFactory() {
-#if BUILDFLAG(ENABLE_MOJO_AUDIO_DECODER) || BUILDFLAG(ENABLE_MOJO_VIDEO_DECODER)
-  if (!decoder_factory_) {
-    decoder_factory_.reset(
-        new media::MojoDecoderFactory(GetMediaInterfaceProvider()));
-  }
-#endif
-  return decoder_factory_.get();
-}
-
 #if BUILDFLAG(ENABLE_PLUGINS)
 void RenderFrameImpl::HandlePepperImeCommit(const base::string16& text) {
   if (text.empty())
@@ -6973,13 +6571,6 @@
   host_zoom_binding_.Bind(std::move(request));
 }
 
-media::RendererWebMediaPlayerDelegate*
-RenderFrameImpl::GetWebMediaPlayerDelegate() {
-  if (!media_player_delegate_)
-    media_player_delegate_ = new media::RendererWebMediaPlayerDelegate(this);
-  return media_player_delegate_;
-}
-
 void RenderFrameImpl::CheckIfAudioSinkExistsAndIsAuthorized(
     const blink::WebString& sink_id,
     const blink::WebSecurityOrigin& security_origin,
@@ -6987,7 +6578,7 @@
   media::OutputDeviceStatusCB callback =
       media::ConvertToOutputDeviceStatusCB(web_callbacks);
   callback.Run(AudioDeviceFactory::GetOutputDeviceInfo(
-                   routing_id_, 0, sink_id.Utf8(), security_origin)
+                   GetRoutingID(), 0, sink_id.Utf8(), security_origin)
                    .device_status());
 }
 
diff --git a/content/renderer/render_frame_impl.h b/content/renderer/render_frame_impl.h
index 169b4ba..aecba8d 100644
--- a/content/renderer/render_frame_impl.h
+++ b/content/renderer/render_frame_impl.h
@@ -20,7 +20,6 @@
 #include "base/gtest_prod_util.h"
 #include "base/id_map.h"
 #include "base/macros.h"
-#include "base/memory/linked_ptr.h"
 #include "base/memory/ref_counted.h"
 #include "base/memory/weak_ptr.h"
 #include "base/observer_list.h"
@@ -43,19 +42,17 @@
 #include "content/public/common/javascript_dialog_type.h"
 #include "content/public/common/previews_state.h"
 #include "content/public/common/referrer.h"
+#include "content/public/common/renderer_preferences.h"
 #include "content/public/common/request_context_type.h"
 #include "content/public/common/stop_find_action.h"
 #include "content/public/renderer/render_frame.h"
 #include "content/renderer/frame_blame_context.h"
+#include "content/renderer/media/media_factory.h"
 #include "content/renderer/mojo/blink_interface_provider_impl.h"
 #include "content/renderer/renderer_webcookiejar_impl.h"
 #include "ipc/ipc_message.h"
 #include "ipc/ipc_platform_file.h"
 #include "media/base/routing_token_callback.h"
-#include "media/blink/webmediaplayer_delegate.h"
-#include "media/blink/webmediaplayer_params.h"
-#include "media/mojo/features.h"
-#include "media/mojo/interfaces/remoting.mojom.h"
 #include "mojo/public/cpp/bindings/associated_binding.h"
 #include "mojo/public/cpp/bindings/binding.h"
 #include "mojo/public/cpp/bindings/binding_set.h"
@@ -88,10 +85,6 @@
 #include "content/renderer/pepper/plugin_power_saver_helper.h"
 #endif
 
-#if defined(OS_ANDROID)
-#include "content/renderer/media/android/renderer_media_player_manager.h"
-#endif
-
 struct FrameMsg_CommitDataNetworkService_Params;
 struct FrameMsg_MixedContentFound_Params;
 struct FrameMsg_PostMessage_Params;
@@ -117,19 +110,8 @@
 }
 
 namespace media {
-class CdmFactory;
-class DecoderFactory;
 class MediaPermission;
-class RendererWebMediaPlayerDelegate;
-class SurfaceManager;
-class UrlIndex;
-class WebEncryptedMediaClientImpl;
-
-namespace remoting {
-class SinkAvailabilityObserver;
-}  // namespace remoting
-
-}  // namespace media
+}
 
 namespace service_manager {
 class BinderRegistry;
@@ -151,17 +133,14 @@
 class ExternalPopupMenu;
 class HistoryEntry;
 class ManifestManager;
-class MediaInterfaceProvider;
-class MediaStreamDispatcher;
-class MediaStreamRendererFactory;
 class MediaPermissionDispatcher;
+class MediaStreamDispatcher;
 class NavigationState;
 class PepperPluginInstanceImpl;
 class PresentationDispatcher;
 class PushMessagingClient;
 class RelatedAppsFetcher;
 class RenderAccessibilityImpl;
-class RendererMediaPlayerManager;
 class RendererPpapiHost;
 class RenderFrameObserver;
 class RenderViewImpl;
@@ -769,6 +748,8 @@
   void OnSetPepperVolume(int32_t pp_instance, double volume);
 #endif  // ENABLE_PLUGINS
 
+  const RendererPreferences& GetRendererPreferences() const;
+
 #if defined(OS_MACOSX)
   void OnCopyToFindPboard();
 #endif
@@ -1050,14 +1031,6 @@
   // |web_user_media_client_| will remain NULL.
   void InitializeUserMediaClient();
 
-  blink::WebMediaPlayer* CreateWebMediaPlayerForMediaStream(
-      blink::WebMediaPlayerClient* client,
-      const blink::WebString& sink_id,
-      const blink::WebSecurityOrigin& security_origin);
-
-  // Creates a factory object used for creating audio and video renderers.
-  std::unique_ptr<MediaStreamRendererFactory> CreateRendererFactory();
-
   // Does preparation for the navigation to |url|.
   void PrepareRenderViewForNavigation(
       const GURL& url,
@@ -1102,23 +1075,8 @@
                              bool was_within_same_page,
                              bool content_initiated);
 
-#if defined(OS_ANDROID)
-  RendererMediaPlayerManager* GetMediaPlayerManager();
-#endif
-
   bool AreSecureCodecsSupported();
 
-#if BUILDFLAG(ENABLE_MOJO_MEDIA)
-  service_manager::mojom::InterfaceProvider* GetMediaInterfaceProvider();
-#endif
-
-#if BUILDFLAG(ENABLE_MEDIA_REMOTING)
-  media::mojom::RemoterFactory* GetRemoterFactory();
-#endif
-
-  media::CdmFactory* GetCdmFactory();
-  media::DecoderFactory* GetDecoderFactory();
-
 #if BUILDFLAG(ENABLE_PLUGINS)
   void HandlePepperImeCommit(const base::string16& text);
 #endif  // ENABLE_PLUGINS
@@ -1131,10 +1089,6 @@
 
   void OnHostZoomClientRequest(mojom::HostZoomAssociatedRequest request);
 
-  // Returns the media delegate for WebMediaPlayer usage.  If
-  // |media_player_delegate_| is NULL, one is created.
-  media::RendererWebMediaPlayerDelegate* GetWebMediaPlayerDelegate();
-
   // Called to get the WebPlugin to handle find requests in the document.
   // Returns nullptr if there is no such WebPlugin.
   blink::WebPlugin* GetWebPluginForFind();
@@ -1301,49 +1255,9 @@
   // Destroyed via the RenderFrameObserver::OnDestruct() mechanism.
   UserMediaClientImpl* web_user_media_client_;
 
-  // EncryptedMediaClient attached to this frame; lazily initialized.
-  std::unique_ptr<media::WebEncryptedMediaClientImpl>
-      web_encrypted_media_client_;
-
   // The media permission dispatcher attached to this frame.
   std::unique_ptr<MediaPermissionDispatcher> media_permission_dispatcher_;
 
-#if BUILDFLAG(ENABLE_MOJO_MEDIA)
-  // The media interface provider attached to this frame, lazily initialized.
-  std::unique_ptr<MediaInterfaceProvider> media_interface_provider_;
-#endif
-
-#if defined(OS_ANDROID)
-  // Manages all media players and sessions in this render frame for
-  // communicating with the real media player and sessions in the
-  // browser process. It's okay to use raw pointers since they're both
-  // RenderFrameObservers.
-  RendererMediaPlayerManager* media_player_manager_;
-#endif
-
-  media::SurfaceManager* media_surface_manager_;
-
-#if BUILDFLAG(ENABLE_MEDIA_REMOTING)
-  // Lazy-bound pointer to the RemoterFactory service in the browser
-  // process. Always use the GetRemoterFactory() accessor instead of this.
-  media::mojom::RemoterFactoryPtr remoter_factory_;
-
-  // An observer for the remoting sink availability that is used by
-  // media::RemotingCdmFactory to initialize media::RemotingSourceImpl. Created
-  // in the constructor of RenderFrameImpl to make sure
-  // media::RemotingSourceImpl be intialized with correct availability info.
-  // Own by media::RemotingCdmFactory after it is created.
-  std::unique_ptr<media::remoting::SinkAvailabilityObserver>
-      remoting_sink_observer_;
-#endif
-
-  // The CDM and decoder factory attached to this frame, lazily initialized.
-  std::unique_ptr<media::CdmFactory> cdm_factory_;
-  std::unique_ptr<media::DecoderFactory> decoder_factory_;
-
-  // Media resource cache, lazily initialized.
-  linked_ptr<media::UrlIndex> url_index_;
-
   // The devtools agent for this frame; only created for main frame and
   // local roots.
   DevToolsAgent* devtools_agent_;
@@ -1385,10 +1299,6 @@
 
   std::unique_ptr<RelatedAppsFetcher> related_apps_fetcher_;
 
-  // Manages play, pause notifications for WebMediaPlayer implementations; its
-  // lifetime is tied to the RenderFrame via the RenderFrameObserver interface.
-  media::RendererWebMediaPlayerDelegate* media_player_delegate_;
-
   // The PreviewsState of this RenderFrame that indicates which Previews can
   // be used. The PreviewsState is a bitmask of potentially several Previews
   // optimizations.
@@ -1452,6 +1362,9 @@
   // Indicates whether |didAccessInitialDocument| was called.
   bool has_accessed_initial_document_;
 
+  // Creates various media clients.
+  MediaFactory media_factory_;
+
   AssociatedInterfaceRegistryImpl associated_interfaces_;
   std::unique_ptr<AssociatedInterfaceProviderImpl>
       remote_associated_interfaces_;
diff --git a/content/test/fuzzer/fuzzer_support.cc b/content/test/fuzzer/fuzzer_support.cc
index b46e295b..eb767e6 100644
--- a/content/test/fuzzer/fuzzer_support.cc
+++ b/content/test/fuzzer/fuzzer_support.cc
@@ -8,12 +8,9 @@
 
 #include "base/feature_list.h"
 #include "base/i18n/icu_util.h"
-#include "content/common/navigation_params.h"
-#include "content/renderer/render_view_impl.h"
-#include "content/test/test_render_frame.h"
+#include "base/memory/ptr_util.h"
 #include "gin/v8_initializer.h"
 #include "third_party/WebKit/public/platform/WebRuntimeFeatures.h"
-#include "third_party/WebKit/public/web/WebLocalFrame.h"
 
 namespace content {
 
@@ -29,17 +26,20 @@
   blink::WebRuntimeFeatures::EnableExperimentalFeatures(true);
   blink::WebRuntimeFeatures::EnableTestOnlyFeatures(true);
 
+#ifdef V8_USE_EXTERNAL_STARTUP_DATA
   gin::V8Initializer::LoadV8Snapshot();
   gin::V8Initializer::LoadV8Natives();
+#endif
   gin::IsolateHolder::Initialize(gin::IsolateHolder::kStrictMode,
                                  gin::IsolateHolder::kStableV8Extras,
                                  gin::ArrayBufferAllocator::SharedInstance());
 
-  adapter.reset(new RenderViewTestAdapter());
+  adapter = base::MakeUnique<RenderViewTestAdapter>();
   adapter->SetUp();
 }
 
 Env::~Env() {
   LOG(FATAL) << "NOT SUPPORTED";
 }
+
 }  // namespace content
diff --git a/content/test/fuzzer/fuzzer_support.h b/content/test/fuzzer/fuzzer_support.h
index 106fd8b..978a509 100644
--- a/content/test/fuzzer/fuzzer_support.h
+++ b/content/test/fuzzer/fuzzer_support.h
@@ -17,6 +17,7 @@
 class RenderViewTestAdapter : public RenderViewTest {
  public:
   RenderViewTestAdapter() : RenderViewTest() {}
+
   void TestBody() override {}
   // make SetUp visible.
   void SetUp() override;
@@ -33,6 +34,7 @@
 struct Env {
   Env();
   ~Env();
+
   base::AtExitManager at_exit;
   std::unique_ptr<RenderViewTestAdapter> adapter;
 };
diff --git a/docs/updating_clang.md b/docs/updating_clang.md
index 407c221..d412d3a 100644
--- a/docs/updating_clang.md
+++ b/docs/updating_clang.md
@@ -16,6 +16,8 @@
         gs://chromium-browser-clang/$x/clang-$rev.tgz ; \
     gsutil cp -n -a public-read gs://chromium-browser-clang-staging/$x/llvmobjdump-$rev.tgz \
         gs://chromium-browser-clang/$x/llvmobjdump-$rev.tgz ; \
+    gsutil cp -n -a public-read gs://chromium-browser-clang-staging/$x/translation_unit-$rev.tgz \
+        gs://chromium-browser-clang/$x/translation_unit-$rev.tgz ; \
     done
 $ gsutil cp -n -a public-read gs://chromium-browser-clang-staging/Linux_x64/llvmgold-$rev.tgz \
     gs://chromium-browser-clang/Linux_x64/llvmgold-$rev.tgz
diff --git a/extensions/renderer/api_bindings_system_unittest.cc b/extensions/renderer/api_bindings_system_unittest.cc
index d4da67c..30c5d1c 100644
--- a/extensions/renderer/api_bindings_system_unittest.cc
+++ b/extensions/renderer/api_bindings_system_unittest.cc
@@ -297,7 +297,6 @@
     const char kTestCall[] = "obj.simpleFunc(2)";
     CallFunctionOnObject(context, beta_api, kTestCall);
     ValidateLastRequest("beta.simpleFunc", "[2]");
-    EXPECT_EQ(-1, last_request()->request_id);
     reset_last_request();
   }
 }
diff --git a/extensions/renderer/api_request_handler.cc b/extensions/renderer/api_request_handler.cc
index 1110eee..42f78dc 100644
--- a/extensions/renderer/api_request_handler.cc
+++ b/extensions/renderer/api_request_handler.cc
@@ -10,6 +10,7 @@
 #include "base/values.h"
 #include "content/public/child/v8_value_converter.h"
 #include "gin/converter.h"
+#include "gin/data_object_builder.h"
 #include "third_party/WebKit/public/web/WebScopedUserGesture.h"
 #include "third_party/WebKit/public/web/WebUserGestureIndicator.h"
 
@@ -57,6 +58,19 @@
                                     binding::RequestThread thread) {
   auto request = base::MakeUnique<Request>();
 
+  // The request id is primarily used in the renderer to associate an API
+  // request with the associated callback, but it's also used in the browser as
+  // an identifier for the extension function (e.g. by the pageCapture API).
+  // TODO(devlin): We should probably fix this, since the request id is only
+  // unique per-isolate, rather than globally.
+  // TODO(devlin): We could *probably* get away with just using an integer
+  // here, but it's a little less foolproof. How slow is GenerateGUID? Should
+  // we use that instead? It means updating the IPC
+  // (ExtensionHostMsg_Request).
+  // base::UnguessableToken is another good option.
+  int request_id = next_request_id_++;
+  request->request_id = request_id;
+
   if (!custom_callback.IsEmpty() || !callback.IsEmpty()) {
     v8::Isolate* isolate = context->GetIsolate();
     // In the JS bindings, custom callbacks are called with the arguments of
@@ -69,9 +83,10 @@
       // properties for callback, callbackSchema, args, stack, id, and
       // customCallback. Of those, it appears that we only use stack, args, and
       // id (since callback is curried in separately). We may be able to update
-      // bindings to get away from some of those. For now, just pass in an empty
-      // object (most APIs don't rely on it).
-      v8::Local<v8::Object> request = v8::Object::New(isolate);
+      // bindings to get away from some of those. For now, just pass in an
+      // object with the request id.
+      v8::Local<v8::Object> request =
+          gin::DataObjectBuilder(isolate).Set("id", request_id).Build();
       v8::Local<v8::Value> callback_to_pass = callback;
       if (callback_to_pass.IsEmpty())
         callback_to_pass = v8::Undefined(isolate);
@@ -80,16 +95,9 @@
       callback = custom_callback;
     }
 
-    // TODO(devlin): We could *probably* get away with just using an integer
-    // here, but it's a little less foolproof. How slow is GenerateGUID? Should
-    // we use that instead? It means updating the IPC
-    // (ExtensionHostMsg_Request).
-    // base::UnguessableToken is another good option.
-    request->request_id = next_request_id_++;
     request->has_callback = true;
     pending_requests_.insert(std::make_pair(
-        request->request_id,
-        PendingRequest(isolate, callback, context, callback_args)));
+        request_id, PendingRequest(isolate, callback, context, callback_args)));
   }
 
   request->has_user_gesture =
@@ -98,9 +106,8 @@
   request->method_name = method;
   request->thread = thread;
 
-  int id = request->request_id;
   send_request_.Run(std::move(request), context);
-  return id;
+  return request_id;
 }
 
 void APIRequestHandler::CompleteRequest(int request_id,
diff --git a/extensions/renderer/api_request_handler_unittest.cc b/extensions/renderer/api_request_handler_unittest.cc
index 594e53f..e646a98 100644
--- a/extensions/renderer/api_request_handler_unittest.cc
+++ b/extensions/renderer/api_request_handler_unittest.cc
@@ -6,6 +6,7 @@
 #include "base/bind.h"
 #include "base/memory/ptr_util.h"
 #include "base/optional.h"
+#include "base/strings/stringprintf.h"
 #include "base/values.h"
 #include "extensions/renderer/api_binding_test.h"
 #include "extensions/renderer/api_binding_test_util.h"
@@ -92,6 +93,13 @@
             GetStringPropertyFromObject(context->Global(), context, "result"));
 
   EXPECT_TRUE(request_handler.GetPendingRequestIdsForTesting().empty());
+
+  request_id = request_handler.StartRequest(
+      context, kMethod, base::MakeUnique<base::ListValue>(),
+      v8::Local<v8::Function>(), v8::Local<v8::Function>(),
+      binding::RequestThread::UI);
+  EXPECT_NE(-1, request_id);
+  request_handler.CompleteRequest(request_id, base::ListValue(), std::string());
 }
 
 // Tests that trying to run non-existent or invalided requests is a no-op.
@@ -220,7 +228,8 @@
   ASSERT_TRUE(gin::Converter<ArgumentList>::FromV8(isolate(), result, &args));
   ASSERT_EQ(5u, args.size());
   EXPECT_EQ("\"method\"", V8ToString(args[0], context));
-  EXPECT_EQ("{}", V8ToString(args[1], context));
+  EXPECT_EQ(base::StringPrintf("{\"id\":%d}", request_id),
+            V8ToString(args[1], context));
   EXPECT_EQ(callback, args[2]);
   EXPECT_EQ("\"response\"", V8ToString(args[3], context));
   EXPECT_EQ("\"arguments\"", V8ToString(args[4], context));
@@ -261,7 +270,8 @@
   ASSERT_TRUE(gin::Converter<ArgumentList>::FromV8(isolate(), result, &args));
   ASSERT_EQ(3u, args.size());
   EXPECT_EQ("\"method\"", V8ToString(args[0], context));
-  EXPECT_EQ("{}", V8ToString(args[1], context));
+  EXPECT_EQ(base::StringPrintf("{\"id\":%d}", request_id),
+            V8ToString(args[1], context));
   EXPECT_TRUE(args[2]->IsUndefined());
 
   EXPECT_TRUE(request_handler.GetPendingRequestIdsForTesting().empty());
diff --git a/extensions/renderer/content_setting.cc b/extensions/renderer/content_setting.cc
index ffa0858..b21f729 100644
--- a/extensions/renderer/content_setting.cc
+++ b/extensions/renderer/content_setting.cc
@@ -109,20 +109,6 @@
 }
 
 void ContentSetting::Set(gin::Arguments* arguments) {
-  v8::Isolate* isolate = arguments->isolate();
-  v8::HandleScope handle_scope(isolate);
-  v8::Local<v8::Context> context = arguments->GetHolderCreationContext();
-
-  v8::Local<v8::Value> value = arguments->PeekNext();
-  // The set schema included in the Schema object is generic, since it varies
-  // per-setting. However, this is only ever for a single setting, so we can
-  // enforce the types more thoroughly.
-  std::string error;
-  if (!value.IsEmpty() && !argument_spec_.ParseArgument(
-                              context, value, *type_refs_, nullptr, &error)) {
-    arguments->ThrowTypeError("Invalid invocation");
-    return;
-  }
   HandleFunction("set", arguments);
 }
 
@@ -149,7 +135,7 @@
   if (!type_refs_->GetTypeMethodSignature(full_name)->ParseArgumentsToJSON(
           context, argument_list, *type_refs_, &converted_arguments, &callback,
           &error)) {
-    arguments->ThrowTypeError("Invalid invocation");
+    arguments->ThrowTypeError("Invalid invocation: " + error);
     return;
   }
 
@@ -178,6 +164,21 @@
     return;
   }
 
+  if (method_name == "set") {
+    v8::Local<v8::Value> value = argument_list[0];
+    // The set schema included in the Schema object is generic, since it varies
+    // per-setting. However, this is only ever for a single setting, so we can
+    // enforce the types more thoroughly.
+    // Note: we do this *after* checking if the setting is deprecated, since
+    // this validation will fail for deprecated settings.
+    std::string error;
+    if (!value.IsEmpty() && !argument_spec_.ParseArgument(
+                                context, value, *type_refs_, nullptr, &error)) {
+      arguments->ThrowTypeError("Invalid invocation: " + error);
+      return;
+    }
+  }
+
   converted_arguments->Insert(0u, base::MakeUnique<base::Value>(pref_name_));
   request_handler_->StartRequest(
       context, "contentSettings." + method_name, std::move(converted_arguments),
diff --git a/headless/lib/headless_content_main_delegate.cc b/headless/lib/headless_content_main_delegate.cc
index 28a708b..8d061cff 100644
--- a/headless/lib/headless_content_main_delegate.cc
+++ b/headless/lib/headless_content_main_delegate.cc
@@ -180,9 +180,9 @@
     breakpad::InitCrashReporter(process_type);
 #elif defined(OS_MACOSX)
   crash_reporter::InitializeCrashpad(process_type.empty(), process_type);
-// Avoid adding this dependency in Windows Chrome component build, since
+// Avoid adding this dependency in Windows Chrome non component builds, since
 // crashpad is already enabled.
-// TODO(dvallet): Ideally we would also want to avoid this for component build.
+// TODO(dvallet): Ideally we would also want to avoid this for component builds.
 #elif defined(OS_WIN) && !defined(CHROME_MULTIPLE_DLL)
   crash_reporter::InitializeCrashpadWithEmbeddedHandler(process_type.empty(),
                                                         process_type, "");
diff --git a/infra/config/cq.cfg b/infra/config/cq.cfg
index 2412a3e..1421b2b5 100644
--- a/infra/config/cq.cfg
+++ b/infra/config/cq.cfg
@@ -38,7 +38,7 @@
       # https://chromium.googlesource.com/chromium/src/+/infra/config/cr-buildbucket.cfg
       builders {
         name: "LUCI linux_chromium_rel_ng"
-        experiment_percentage: 5
+        experiment_percentage: 10
       }
       builders {
         name: "LUCI mac_chromium_rel_ng"
diff --git a/ios/BUILD.gn b/ios/BUILD.gn
index 2ab6c244..874b62d 100644
--- a/ios/BUILD.gn
+++ b/ios/BUILD.gn
@@ -51,6 +51,7 @@
       "//ios/chrome/test:all_tests",
       "//ios/chrome/test/earl_grey:all_tests",
       "//ios/clean/chrome/test:all_tests",
+      "//ios/components:all_tests",
       "//ios/net:all_tests",
       "//ios/showcase:all_tests",
       "//ios/testing:all_tests",
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_es.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_es.xtb
index 613e266..56c56e1 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_es.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_es.xtb
@@ -19,14 +19,14 @@
 <translation id="3473048256428424907">Activar el escáner de QR de Chromium</translation>
 <translation id="3805899903892079518">Chromium no puede acceder a tus fotos y vídeos (para permitirlo, ve a Ajustes de iOS &gt; Privacidad &gt; Fotos).</translation>
 <translation id="418271229036116702">Inicia sesión en Chromium para ver las pestañas de tus otros dispositivos.</translation>
-<translation id="4241912885070669028">Estás cerrando sesión en una cuenta administrada por <ph name="SIGNOUT_MANAGED_DOMAIN" />. Tus datos de Chromium se eliminarán de este dispositivo, pero permanecerán en tu cuenta de Google.</translation>
+<translation id="4241912885070669028">Estás cerrando sesión en una cuenta gestionada por <ph name="SIGNOUT_MANAGED_DOMAIN" />. Tus datos de Chromium se eliminarán de este dispositivo, pero permanecerán en tu cuenta de Google.</translation>
 <translation id="4555020257205549924">Si esta función está activada, Chromium ofrecerá la posibilidad de traducir páginas escritas en otros idiomas con el Traductor de Google. <ph name="BEGIN_LINK" />Más información<ph name="END_LINK" /></translation>
 <translation id="4787850887676698916">Aquí aparecerán las pestañas que hayas abierto en Chromium en otros dispositivos.</translation>
 <translation id="495292094137889840">Empezar a usar el escáner de QR de Chromium</translation>
 <translation id="5231355151045086930">Cerrar sesión en Chromium</translation>
 <translation id="5416919929805616771">¿Te gusta Chromium? <ph name="BEGIN_LINK" />Valora esta aplicación<ph name="END_LINK" /></translation>
 <translation id="5862307444128926510">Te damos la bienvenida a Chromium</translation>
-<translation id="5945387852661427312">Estás iniciando sesión con una cuenta administrada por <ph name="DOMAIN" /> y vas a otorgar a su administrador el control sobre tus datos de Chromium. Tus datos se vincularán de forma permanente a esta cuenta. Al cerrar sesión en Chromium, tus datos se eliminarán de este dispositivo, pero permanecerán almacenados en tu cuenta de Google.</translation>
+<translation id="5945387852661427312">Estás iniciando sesión con una cuenta gestionada por <ph name="DOMAIN" /> y vas a otorgar a su administrador el control sobre tus datos de Chromium. Tus datos se vincularán de forma permanente a esta cuenta. Al cerrar sesión en Chromium, tus datos se eliminarán de este dispositivo, pero permanecerán almacenados en tu cuenta de Google.</translation>
 <translation id="6068866989048414399">Condiciones de Servicio de Chromium</translation>
 <translation id="6268381023930128611">¿Cerrar sesión en Chromium?</translation>
 <translation id="6424492062988593837">Chromium sigue mejorando. Hay una nueva versión disponible.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_th.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_th.xtb
index f06298b..c12c9ae 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_th.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_th.xtb
@@ -6,7 +6,7 @@
 <translation id="1472013873724362412">บัญชีของคุณไม่ทำงานใน Chromium โปรดติดต่อผู้ดูแลระบบโดเมนหรือใช้บัญชี Google ปกติเพื่อลงชื่อเข้าใช้</translation>
 <translation id="1736662517232558588">ล้างข้อมูล Chromium แล้ว</translation>
 <translation id="1838412507805038478">Chromium ยืนยันว่า <ph name="ISSUER" /> ได้ออกใบรับรองของเว็บไซต์นี้</translation>
-<translation id="1843424232666537147">Chromium มีคุณลักษณะที่ช่วยให้คุณสามารถจัดการข้อมูลอินเทอร์เน็ตและระดับความเร็วที่คุณสามารถใช้ในการโหลดหน้าเว็บ
+<translation id="1843424232666537147">Chromium มีฟีเจอร์ที่ช่วยให้คุณสามารถจัดการข้อมูลอินเทอร์เน็ตและระดับความเร็วที่คุณสามารถใช้ในการโหลดหน้าเว็บ
 <ph name="BEGIN_LINK" />เรียนรู้เพิ่มเติม<ph name="END_LINK" /></translation>
 <translation id="2075400798887076382">เข้าถึงแท็บที่คุณเปิดไว้ในคอมพิวเตอร์ได้ที่นี่ เพียงเปิด Chromium ในคอมพิวเตอร์ของคุณ ไปที่เมนู แล้วเลือก “ลงชื่อเข้าใช้ Chromium…”</translation>
 <translation id="2168108852149185974">ส่วนเสริมบางรายการทำให้ Chromium ขัดข้อง โปรดถอนการติดตั้ง:</translation>
@@ -20,7 +20,7 @@
 <translation id="3805899903892079518">Chromium ไม่มีสิทธิ์เข้าถึงรูปภาพหรือวิดีโอของคุณ เปิดใช้การเข้าถึงได้ในการตั้งค่า iOS &gt; ความเป็นส่วนตัว &gt; รูปภาพ</translation>
 <translation id="418271229036116702">ลงชื่อเข้าใช้ Chromium เพื่อรับแท็บจากอุปกรณ์เครื่องอื่นๆ ของคุณ</translation>
 <translation id="4241912885070669028">คุณกำลังออกจากระบบบัญชีที่จัดการโดย <ph name="SIGNOUT_MANAGED_DOMAIN" /> การออกจากระบบจะลบข้อมูล Chromium ของคุณออกจากอุปกรณ์เครื่องนี้ แต่ข้อมูลจะยังคงอยู่ในบัญชี Google</translation>
-<translation id="4555020257205549924">เมื่อเปิดคุณลักษณะนี้ Chromium จะเสนอให้แปลหน้าต่างๆ ที่เขียนด้วยภาษาอื่นโดยใช้ Google แปลภาษา <ph name="BEGIN_LINK" />เรียนรู้เพิ่มเติม<ph name="END_LINK" /></translation>
+<translation id="4555020257205549924">เมื่อเปิดฟีเจอร์นี้ Chromium จะเสนอให้แปลหน้าต่างๆ ที่เขียนด้วยภาษาอื่นโดยใช้ Google แปลภาษา <ph name="BEGIN_LINK" />เรียนรู้เพิ่มเติม<ph name="END_LINK" /></translation>
 <translation id="4787850887676698916">แท็บที่คุณเปิดไว้ใน Chromium ในอุปกรณ์เครื่องอื่นๆ จะปรากฏที่นี่</translation>
 <translation id="495292094137889840">เริ่มใช้โปรแกรมสแกนโค้ด QR ของ Chromium</translation>
 <translation id="5231355151045086930">ออกจากระบบ Chromium</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_es.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_es.xtb
index 77c1569..7d9aac3e 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_es.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_es.xtb
@@ -26,7 +26,7 @@
 <translation id="4248297594476034182">Inicia sesión en Chrome para ver tus pestañas en todos tus dispositivos.</translation>
 <translation id="424864128008805179">¿Cerrar sesión en Chrome?</translation>
 <translation id="4523886039239821078">Algunos complementos hacen que Chrome falle. Desinstálalos.</translation>
-<translation id="4615174829807303908">Estás cerrando sesión en una cuenta administrada por <ph name="SIGNOUT_MANAGED_DOMAIN" />. Se van a eliminar tus datos de Chrome de este dispositivo, pero van a permanecer en tu cuenta de Google.</translation>
+<translation id="4615174829807303908">Estás cerrando sesión en una cuenta gestionada por <ph name="SIGNOUT_MANAGED_DOMAIN" />. Se van a eliminar tus datos de Chrome de este dispositivo, pero van a permanecer en tu cuenta de Google.</translation>
 <translation id="5389212809648216794">Google Chrome no puede utilizar la cámara porque la está usando otra aplicación</translation>
 <translation id="5566557026214762153">Al usar esta aplicación, aceptas las <ph name="BEGIN_LINK" />Condiciones de Servicio<ph name="END_LINK" /> de Chrome.</translation>
 <translation id="5639704535586432836">Abre Ajustes &gt; Privacidad &gt; Cámara &gt; Google Chrome y activa la cámara.</translation>
@@ -36,7 +36,7 @@
 <ph name="BEGIN_LINK" />Más información<ph name="END_LINK" /></translation>
 <translation id="6573431926118603307">Aquí aparecen las pestañas que hayas abierto en Chrome en otros dispositivos.</translation>
 <translation id="6600954340915313787">Copiada a Chrome</translation>
-<translation id="6648150602980899529">Estás iniciando sesión con una cuenta administrada por <ph name="DOMAIN" />, lo que significa que vas a proporcionar a su administrador el control sobre tus datos de Chrome. Los datos se van a vincular de forma permanente a esta cuenta. Si cierras sesión en Chrome, se eliminarán los datos de este dispositivo pero permanecerán almacenados en tu cuenta de Google.</translation>
+<translation id="6648150602980899529">Estás iniciando sesión con una cuenta gestionada por <ph name="DOMAIN" />, lo que significa que vas a proporcionar a su administrador el control sobre tus datos de Chrome. Los datos se van a vincular de forma permanente a esta cuenta. Si cierras sesión en Chrome, se eliminarán los datos de este dispositivo pero permanecerán almacenados en tu cuenta de Google.</translation>
 <translation id="690638524486313356">Condiciones de Servicio de Google Chrome</translation>
 <translation id="7165736900384873061">Empezar a usar el escáner de QR de Google Chrome</translation>
 <translation id="7172660552945675509">Consejo: <ph name="BEGIN_LINK" />Mueve Chrome a tu Dock<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_th.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_th.xtb
index c6e00af..8a8ac17 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_th.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_th.xtb
@@ -6,7 +6,7 @@
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="2147651015520127414">Chrome ยืนยันว่า <ph name="ISSUER" /> ได้ออกใบรับรองของเว็บไซต์นี้</translation>
 <translation id="2334084861041072223">ลิขสิทธิ์ <ph name="YEAR" /> Google Inc. สงวนลิขสิทธิ์</translation>
-<translation id="2347208864470321755">เมื่อเปิดคุณลักษณะนี้ Chrome จะเสนอให้แปลหน้าต่างๆ ที่เขียนด้วยภาษาอื่นโดยใช้ Google แปลภาษา <ph name="BEGIN_LINK" />เรียนรู้เพิ่มเติม<ph name="END_LINK" /></translation>
+<translation id="2347208864470321755">เมื่อเปิดฟีเจอร์นี้ Chrome จะเสนอให้แปลหน้าต่างๆ ที่เขียนด้วยภาษาอื่นโดยใช้ Google แปลภาษา <ph name="BEGIN_LINK" />เรียนรู้เพิ่มเติม<ph name="END_LINK" /></translation>
 <translation id="2441696206556358796">ในการบันทึกรูปภาพ ให้แตะการตั้งค่าเพื่ออนุญาตให้ Chrome ใช้รูปภาพ</translation>
 <translation id="2576431527583832481">Chrome พัฒนาใหม่! มีรุ่นใหม่ให้ใช้งานแล้ว</translation>
 <translation id="257708665678654955">คุณต้องการให้ Google Chrome เสนอการแปลหน้าภาษา<ph name="LANGUAGE_NAME" />จากเว็บไซต์นี้ในครั้งถัดไปไหม</translation>
@@ -32,7 +32,7 @@
 <translation id="5639704535586432836">เปิดการตั้งค่า &gt; ความเป็นส่วนตัว &gt; กล้อง &gt; Google Chrome เพื่อเปิดกล้องถ่ายรูป</translation>
 <translation id="5642200033778930880">Google Chrome ไม่สามารถใช้กล้องถ่ายรูปในโหมด Split View</translation>
 <translation id="5703130498371792817">หากคุณชอบ Chrome โปรด<ph name="BEGIN_LINK" />ให้คะแนนแอปนี้<ph name="END_LINK" /></translation>
-<translation id="6036420186814142909">Google Chrome มีคุณลักษณะที่ช่วยให้คุณสามารถจัดการข้อมูลอินเทอร์เน็ตและระดับความเร็วที่คุณสามารถใช้ในการโหลดหน้าเว็บ
+<translation id="6036420186814142909">Google Chrome มีฟีเจอร์ที่ช่วยให้คุณสามารถจัดการข้อมูลอินเทอร์เน็ตและระดับความเร็วที่คุณสามารถใช้ในการโหลดหน้าเว็บ
 <ph name="BEGIN_LINK" />เรียนรู้เพิ่มเติม<ph name="END_LINK" /></translation>
 <translation id="6573431926118603307">แท็บที่คุณเปิดไว้ใน Chrome ในอุปกรณ์เครื่องอื่นๆ จะปรากฏที่นี่</translation>
 <translation id="6600954340915313787">คัดลอกไปยัง Chrome แล้ว</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ar.xtb b/ios/chrome/app/strings/resources/ios_strings_ar.xtb
index ed701db..e2bcf2dc 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ar.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ar.xtb
@@ -166,7 +166,7 @@
 <translation id="4121993058175073134">لإرسال بيانات تصدير الشبكة، الرجاء تهيئة حساب بريدك الإلكتروني في التطبيق "الإعدادات".</translation>
 <translation id="4124987746317609294">النطاق الزمني</translation>
 <translation id="4172051516777682613">الإظهار دائمًا</translation>
-<translation id="418156467088430727">عرض إصدار بلا اتصال بالإنترنت في علامة تبويب جديدة</translation>
+<translation id="418156467088430727">عرض إصدار بلا إنترنت في علامة تبويب جديدة</translation>
 <translation id="424315890655130736">إدخال عبارة المرور</translation>
 <translation id="4272631900155121838">لمسح رمز الاستجابة السريعة ضوئيًا، يمكنك تمكين الكاميرا من الإعدادات</translation>
 <translation id="4281844954008187215">شروط الخدمة</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ca.xtb b/ios/chrome/app/strings/resources/ios_strings_ca.xtb
index 3cb6c7a0..32f3621c 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ca.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ca.xtb
@@ -166,7 +166,7 @@
 <translation id="4121993058175073134">Definiu el vostre compte de correu electrònic a l'aplicació Configuració per enviar dades d'exportació de xarxa.</translation>
 <translation id="4124987746317609294">Interval de temps</translation>
 <translation id="4172051516777682613">Mostra sempre</translation>
-<translation id="418156467088430727">Mostra la versió sense connexió en una pestanya nova</translation>
+<translation id="418156467088430727">Mostra versió sense connexió en una pestanya nova</translation>
 <translation id="424315890655130736">Introduïu la frase de contrasenya</translation>
 <translation id="4272631900155121838">Per poder escanejar un codi QR, activa la càmera a la configuració</translation>
 <translation id="4281844954008187215">Termes i condicions</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_cs.xtb b/ios/chrome/app/strings/resources/ios_strings_cs.xtb
index 59666bf..fb0dc07 100644
--- a/ios/chrome/app/strings/resources/ios_strings_cs.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_cs.xtb
@@ -166,7 +166,7 @@
 <translation id="4121993058175073134">Chcete-li odesílat data nástroje net-export, nakonfigurujte e-mailový účet v aplikaci Nastavení.</translation>
 <translation id="4124987746317609294">Časové období</translation>
 <translation id="4172051516777682613">Vždy zobrazovat</translation>
-<translation id="418156467088430727">Zobrazit offline verzi stránky Nová karta</translation>
+<translation id="418156467088430727">Zobrazit offline verzi na nové kartě</translation>
 <translation id="424315890655130736">Zadání heslové fráze</translation>
 <translation id="4272631900155121838">Chcete-li naskenovat QR kód, povolte v nastavení fotoaparát</translation>
 <translation id="4281844954008187215">Smluvní podmínky</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_da.xtb b/ios/chrome/app/strings/resources/ios_strings_da.xtb
index d2bc6ae..093675e 100644
--- a/ios/chrome/app/strings/resources/ios_strings_da.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_da.xtb
@@ -166,7 +166,7 @@
 <translation id="4121993058175073134">For at sende oplysninger om nettoeksporten skal du konfigurere din e-mailkonto i appen Indstillinger.</translation>
 <translation id="4124987746317609294">Tidsinterval</translation>
 <translation id="4172051516777682613">Vis altid</translation>
-<translation id="418156467088430727">Se ofllineversion på en ny fane</translation>
+<translation id="418156467088430727">Se offlineversion på en ny fane</translation>
 <translation id="424315890655130736">Angiv adgangssætning</translation>
 <translation id="4272631900155121838">Aktivér kameraet i Indstillinger for at scanne en QR-kode</translation>
 <translation id="4281844954008187215">Servicevilkår</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_es.xtb b/ios/chrome/app/strings/resources/ios_strings_es.xtb
index ff9a524e..7a5fe06 100644
--- a/ios/chrome/app/strings/resources/ios_strings_es.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_es.xtb
@@ -55,7 +55,7 @@
 <translation id="1886928167269928266">El origen de los tiempos</translation>
 <translation id="1911619930368729126">Subir a Google Drive</translation>
 <translation id="1941314575388338491">Toca dos veces para copiar.</translation>
-<translation id="1952728750904661634">Inicia sesión con una cuenta administrada</translation>
+<translation id="1952728750904661634">Inicia sesión con una cuenta gestionada</translation>
 <translation id="1974060860693918893">Configuración avanzada</translation>
 <translation id="1989112275319619282">Examinar</translation>
 <translation id="2068952045031577364">La semana pasada</translation>
@@ -400,7 +400,7 @@
 <translation id="9100610230175265781">Se debe introducir una frase de contraseña</translation>
 <translation id="9148126808321036104">Volver a iniciar sesión</translation>
 <translation id="9157836665414082580">Quitar cuadros de diálogo</translation>
-<translation id="9188680907066685419">Cierra sesión en la cuenta administrada</translation>
+<translation id="9188680907066685419">Cierra sesión en la cuenta gestionada</translation>
 <translation id="9203116392574189331">Handoff</translation>
 <translation id="9223358826628549784">Informe sobre fallos enviado.</translation>
 <translation id="935490618240037774">Tus marcadores, historial, contraseñas y otros ajustes se sincronizarán con tu cuenta de Google para que puedas utilizarlos en todos tus dispositivos.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fr.xtb b/ios/chrome/app/strings/resources/ios_strings_fr.xtb
index c22ab496..4c42e55 100644
--- a/ios/chrome/app/strings/resources/ios_strings_fr.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_fr.xtb
@@ -166,7 +166,7 @@
 <translation id="4121993058175073134">Configurez compte mess. dans appli Paramètres pour envoyer données net-export.</translation>
 <translation id="4124987746317609294">Période</translation>
 <translation id="4172051516777682613">Toujours afficher</translation>
-<translation id="418156467088430727">Afficher la version hors connexion dans un nouvel onglet</translation>
+<translation id="418156467088430727">Afficher version hors connexion dans nouvel onglet</translation>
 <translation id="424315890655130736">Saisir la phrase secrète</translation>
 <translation id="4272631900155121838">Pour scanner un code QR, activez l'appareil photo depuis les paramètres</translation>
 <translation id="4281844954008187215">Conditions d'utilisation</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_kn.xtb b/ios/chrome/app/strings/resources/ios_strings_kn.xtb
index ef2e9fc..eea65f7f 100644
--- a/ios/chrome/app/strings/resources/ios_strings_kn.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_kn.xtb
@@ -166,7 +166,7 @@
 <translation id="4121993058175073134">ಒಟ್ಟು ರಫ್ತು ಡೇಟಾ ಕಳುಹಿಸಲು, ದಯವಿಟ್ಟು ನಿಮ್ಮ ಇಮೇಲ್ ಖಾತೆಯನ್ನು ಸೆಟ್ಟಿಂಗ್‌‌ಗಳ ಅಪ್ಲಿಕೇಶನ್‌‌ನಲ್ಲಿ ಕಾನ್ಫಿಗರ್ ಮಾಡಿ.</translation>
 <translation id="4124987746317609294">ಸಮಯ ವ್ಯಾಪ್ತಿ</translation>
 <translation id="4172051516777682613">ಯಾವಾಗಲೂ ತೋರಿಸು</translation>
-<translation id="418156467088430727">ಹೊಸ ಟ್ಯಾಬ್‌ನಲ್ಲಿ ಆಫ್‌ಲೈನ್ ಆವೃತ್ತಿಯನ್ನು ವೀಕ್ಷಿಸಿ</translation>
+<translation id="418156467088430727">ಆಫ್‌ಲೈನ್ ಆವೃತ್ತಿಯನ್ನು ಹೊಸ ಟ್ಯಾಬ್‌ನಲ್ಲಿ ವೀಕ್ಷಿಸಿ</translation>
 <translation id="424315890655130736">ಪಾಸ್‌ಫ್ರೇಸ್ ನಮೂದಿಸಿ</translation>
 <translation id="4272631900155121838">QR ಕೋಡ್ ಅನ್ನು ಸ್ಕ್ಯಾನ್ ಮಾಡಲು, ಸೆಟ್ಟಿಂಗ್‌ಗಳಿಂದ ಕ್ಯಾಮರಾವನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ</translation>
 <translation id="4281844954008187215">ಸೇವೆಯ ನಿಯಮಗಳು</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb b/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb
index aeabe51..493978e 100644
--- a/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb
@@ -38,7 +38,7 @@
 <translation id="1580783302095112590">Correio enviado.</translation>
 <translation id="1646446875146297738">Se ativar a funcionalidade "Não monitorizar", será incluído um pedido no seu tráfego de navegação. Os possíveis efeitos dependerão da resposta ao pedido por parte de um Website e da forma como o pedido é interpretado.
 
-Por exemplo, alguns Websites poderão mostrar anúncios que não sejam baseados noutros Websites visitados por si como resposta a este pedido. Muitos Websites continuarão a recolher e utilizar os seus dados de navegação com o objetivo de melhorar a segurança, fornecer conteúdos, serviços, anúncios e recomendações nos seus Websites e gerar estatísticas de relatórios. <ph name="BEGIN_LINK" />Saiba mais<ph name="END_LINK" /></translation>
+Por exemplo, alguns Sites poderão mostrar anúncios que não sejam baseados noutros Sites visitados por si como resposta a este pedido. Muitos Sites continuarão a recolher e utilizar os seus dados de navegação com o objetivo de melhorar a segurança, fornecer conteúdos, serviços, anúncios e recomendações nos seus Sites e gerar estatísticas de relatórios. <ph name="BEGIN_LINK" />Saiba mais<ph name="END_LINK" /></translation>
 <translation id="1657011748321897393">A partilha falhou porque não está ligado à rede.</translation>
 <translation id="165877110639533037">Sem separadores abertos</translation>
 <translation id="1687475363370981210">Marcar tudo como lido</translation>
@@ -140,7 +140,7 @@
 <translation id="3567664240939803299">Pretende que o Google Smart Lock guarde a palavra-passe p/ este site?</translation>
 <translation id="3588820906588687999">Abrir imagem num novo separador</translation>
 <translation id="3603009562372709545">Copiar URL do Link</translation>
-<translation id="360480449234699036">Saiba mais acerca dos tópicos nos Websites sem sair da página. A funcionalidade Tocar para pesquisar envia uma palavra e o respetivo contexto circundante para a Pesquisa Google, que devolve definições, imagens, resultados da pesquisa e outros detalhes.
+<translation id="360480449234699036">Saiba mais acerca dos tópicos nos Sites sem sair da página. A funcionalidade Tocar para pesquisar envia uma palavra e o respetivo contexto circundante para a Pesquisa Google, que devolve definições, imagens, resultados da pesquisa e outros detalhes.
 
 Para ajustar o termo de pesquisa, prima continuamente para selecionar. Para refinar a sua pesquisa, deslize lentamente o painel totalmente para cima e toque na caixa de pesquisa.</translation>
 <translation id="3607167657931203000">Dados de preenchimento automático</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sr.xtb b/ios/chrome/app/strings/resources/ios_strings_sr.xtb
index 59e7b34ef..e459645 100644
--- a/ios/chrome/app/strings/resources/ios_strings_sr.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_sr.xtb
@@ -166,7 +166,7 @@
 <translation id="4121993058175073134">За слање података нето извоза подесите налог е-поште у апликацији Подешавања.</translation>
 <translation id="4124987746317609294">Временски опсег</translation>
 <translation id="4172051516777682613">Увек прикажи</translation>
-<translation id="418156467088430727">Прикажи офлајн верзију у новој картици</translation>
+<translation id="418156467088430727">Прикажи офлајн верзију на новој картици</translation>
 <translation id="424315890655130736">Унесите приступну фразу</translation>
 <translation id="4272631900155121838">Да бисте скенирали QR кôд, омогућите камеру у подешавањима</translation>
 <translation id="4281844954008187215">Услови коришћења услуге</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sw.xtb b/ios/chrome/app/strings/resources/ios_strings_sw.xtb
index 25f68be..2e46dcb 100644
--- a/ios/chrome/app/strings/resources/ios_strings_sw.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_sw.xtb
@@ -166,7 +166,7 @@
 <translation id="4121993058175073134">Ili kutuma data ya uhamishaji nje ya mtandao, tafadhali sanidi akaunti yako ya barua pepe katika programu ya Mipangilio.</translation>
 <translation id="4124987746317609294">Masafa ya Muda</translation>
 <translation id="4172051516777682613">Onyesha kila mara</translation>
-<translation id="418156467088430727">Angalia Toleo la Nje ya Mtandao katika Kichupo Kipya</translation>
+<translation id="418156467088430727">Tazama Toleo la Nje ya Mtandao ktk Kichupo Kipya</translation>
 <translation id="424315890655130736">Weka Kauli ya Siri</translation>
 <translation id="4272631900155121838">Ili kuchanganua msimbo wa QR, washa kamera kwenye mipangilio</translation>
 <translation id="4281844954008187215">Sheria na Masharti</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_th.xtb b/ios/chrome/app/strings/resources/ios_strings_th.xtb
index cb76210..71e6be6 100644
--- a/ios/chrome/app/strings/resources/ios_strings_th.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_th.xtb
@@ -352,7 +352,7 @@
 <translation id="8076014560081431679">การตั้งค่าเว็บไซต์ที่บันทึกไว้จะไม่ถูกลบและอาจส่งผลกับลักษณะการท่องเว็บของคุณ <ph name="BEGIN_LINK" />เรียนรู้เพิ่มเติม<ph name="END_LINK" /></translation>
 <translation id="8080028325999236607">ปิดแท็บทั้งหมด</translation>
 <translation id="8108697784695284144">คัดลอกรหัสผ่านแล้ว</translation>
-<translation id="8137558756159375272">แตะเพื่อค้นหาจะส่งคำที่เลือกและหน้าปัจจุบันเป็นบริบทไปยัง Google Search คุณสามารถปิดคุณลักษณะนี้ใน<ph name="BEGIN_LINK" />การตั้งค่า<ph name="END_LINK" /></translation>
+<translation id="8137558756159375272">แตะเพื่อค้นหาจะส่งคำที่เลือกและหน้าปัจจุบันเป็นบริบทไปยัง Google Search คุณสามารถปิดฟีเจอร์นี้ใน<ph name="BEGIN_LINK" />การตั้งค่า<ph name="END_LINK" /></translation>
 <translation id="8205564605687841303">ยกเลิก</translation>
 <translation id="8225985093977202398">รูปภาพและไฟล์ที่แคชไว้</translation>
 <translation id="8261506727792406068">ลบ</translation>
diff --git a/ios/chrome/browser/BUILD.gn b/ios/chrome/browser/BUILD.gn
index a881c45e..f178f43a 100644
--- a/ios/chrome/browser/BUILD.gn
+++ b/ios/chrome/browser/BUILD.gn
@@ -115,6 +115,7 @@
     "//ios/chrome/browser/browser_state",
     "//ios/chrome/browser/sync/glue",
     "//ios/chrome/common",
+    "//ios/components/io_thread",
     "//ios/net",
     "//ios/public/provider/chrome/browser",
     "//ios/public/provider/chrome/browser/voice",
diff --git a/ios/chrome/browser/DEPS b/ios/chrome/browser/DEPS
index b318bf2..dec0debc 100644
--- a/ios/chrome/browser/DEPS
+++ b/ios/chrome/browser/DEPS
@@ -93,6 +93,7 @@
   "+crypto",
   "+google_apis",
   "+ios/chrome/app",
+  "+ios/components/io_thread",
   "+ios/net",
   "+ios/public/provider/chrome",
   "+ios/public/provider/components",
diff --git a/ios/chrome/browser/ios_chrome_io_thread.h b/ios/chrome/browser/ios_chrome_io_thread.h
index bd1207f..ae48424 100644
--- a/ios/chrome/browser/ios_chrome_io_thread.h
+++ b/ios/chrome/browser/ios_chrome_io_thread.h
@@ -5,229 +5,29 @@
 #ifndef IOS_CHROME_BROWSER_IOS_CHROME_IO_THREAD_H_
 #define IOS_CHROME_BROWSER_IOS_CHROME_IO_THREAD_H_
 
-#include <stddef.h>
-#include <stdint.h>
-
-#include <map>
 #include <memory>
-#include <set>
-#include <string>
-#include <vector>
 
-#include "base/compiler_specific.h"
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/memory/weak_ptr.h"
-#include "base/time/time.h"
-#include "components/prefs/pref_member.h"
-#include "components/ssl_config/ssl_config_service_manager.h"
-#include "ios/web/public/web_thread_delegate.h"
-#include "net/base/network_change_notifier.h"
-#include "net/http/http_network_session.h"
+#include "ios/components/io_thread/ios_io_thread.h"
 
-class PrefProxyConfigTracker;
 class PrefService;
-class SystemURLRequestContextGetter;
-
-namespace net {
-class CTPolicyEnforcer;
-class CertVerifier;
-class ChannelIDService;
-class CookieStore;
-class CTVerifier;
-class HostResolver;
-class HttpAuthHandlerFactory;
-class HttpAuthPreferences;
-class HttpServerProperties;
-class HttpTransactionFactory;
-class HttpUserAgentSettings;
-class NetworkDelegate;
-class NetworkQualityEstimator;
-class ProxyConfigService;
-class ProxyService;
-class SSLConfigService;
-class TransportSecurityState;
-class URLRequestContext;
-class URLRequestContextGetter;
-class URLRequestJobFactory;
-}  // namespace net
 
 namespace net_log {
 class ChromeNetLog;
 }  // namespace net_log
 
-class SystemURLRequestContextGetter;
-
 // Contains state associated with, initialized and cleaned up on, and
 // primarily used on, the IO thread.
-//
-// If you are looking to interact with the IO thread (e.g. post tasks
-// to it or check if it is the current thread), see web::WebThread.
-class IOSChromeIOThread : public web::WebThreadDelegate {
+class IOSChromeIOThread : public io_thread::IOSIOThread {
  public:
-  struct Globals {
-    template <typename T>
-    class Optional {
-     public:
-      Optional() : set_(false) {}
-
-      void set(T value) {
-        set_ = true;
-        value_ = value;
-      }
-      void CopyToIfSet(T* value) const {
-        if (set_) {
-          *value = value_;
-        }
-      }
-
-     private:
-      bool set_;
-      T value_;
-    };
-
-    class SystemRequestContextLeakChecker {
-     public:
-      explicit SystemRequestContextLeakChecker(Globals* globals);
-      ~SystemRequestContextLeakChecker();
-
-     private:
-      Globals* const globals_;
-    };
-
-    Globals();
-    ~Globals();
-
-    // The "system" NetworkDelegate, used for BrowserState-agnostic network
-    // events.
-    std::unique_ptr<net::NetworkDelegate> system_network_delegate;
-    std::unique_ptr<net::HostResolver> host_resolver;
-    std::unique_ptr<net::CertVerifier> cert_verifier;
-    // The ChannelIDService must outlive the HttpTransactionFactory.
-    std::unique_ptr<net::ChannelIDService> system_channel_id_service;
-    // This TransportSecurityState doesn't load or save any state. It's only
-    // used to enforce pinning for system requests and will only use built-in
-    // pins.
-    std::unique_ptr<net::TransportSecurityState> transport_security_state;
-    std::unique_ptr<net::CTVerifier> cert_transparency_verifier;
-    scoped_refptr<net::SSLConfigService> ssl_config_service;
-    std::unique_ptr<net::HttpAuthPreferences> http_auth_preferences;
-    std::unique_ptr<net::HttpAuthHandlerFactory> http_auth_handler_factory;
-    std::unique_ptr<net::HttpServerProperties> http_server_properties;
-    std::unique_ptr<net::ProxyService> system_proxy_service;
-    std::unique_ptr<net::HttpNetworkSession> system_http_network_session;
-    std::unique_ptr<net::HttpTransactionFactory>
-        system_http_transaction_factory;
-    std::unique_ptr<net::URLRequestJobFactory> system_url_request_job_factory;
-    std::unique_ptr<net::URLRequestContext> system_request_context;
-    SystemRequestContextLeakChecker system_request_context_leak_checker;
-    std::unique_ptr<net::CookieStore> system_cookie_store;
-    std::unique_ptr<net::HttpUserAgentSettings> http_user_agent_settings;
-    std::unique_ptr<net::NetworkQualityEstimator> network_quality_estimator;
-    std::unique_ptr<net::CTPolicyEnforcer> ct_policy_enforcer;
-  };
-
-  // |net_log| must either outlive the IOSChromeIOThread or be NULL.
   IOSChromeIOThread(PrefService* local_state, net_log::ChromeNetLog* net_log);
-
   ~IOSChromeIOThread() override;
 
-  // Can only be called on the IO thread.
-  Globals* globals();
-
-  // Allows overriding Globals in tests where IOSChromeIOThread::Init() and
-  // IOSChromeIOThread::CleanUp() are not called.  This allows for injecting
-  // mocks into IOSChromeIOThread global objects.
-  void SetGlobalsForTesting(Globals* globals);
-
-  net_log::ChromeNetLog* net_log();
-
-  // Handles changing to On The Record mode, discarding confidential data.
-  void ChangedToOnTheRecord();
-
-  // Returns a getter for the URLRequestContext.  Only called on the UI thread.
-  net::URLRequestContextGetter* system_url_request_context_getter();
-
-  // Clears the host cache.  Intended to be used to prevent exposing recently
-  // visited sites on about:net-internals/#dns and about:dns pages.  Must be
-  // called on the IO thread.
-  void ClearHostCache();
-
-  const net::HttpNetworkSession::Params& NetworkSessionParams() const;
-
-  base::TimeTicks creation_time() const;
+ protected:
+  // io_thread::IOSIOThread overrides
+  std::unique_ptr<net::NetworkDelegate> CreateSystemNetworkDelegate() override;
+  std::string GetChannelString() const override;
 
  private:
-  // Provide SystemURLRequestContextGetter with access to
-  // InitSystemRequestContext().
-  friend class SystemURLRequestContextGetter;
-
-  // WebThreadDelegate implementation, runs on the IO thread.
-  // This handles initialization and destruction of state that must
-  // live on the IO thread.
-  void Init() override;
-  void CleanUp() override;
-
-  // Global state must be initialized on the IO thread, then this
-  // method must be invoked on the UI thread.
-  void InitSystemRequestContext();
-
-  // Lazy initialization of system request context for
-  // SystemURLRequestContextGetter. To be called on IO thread only
-  // after global state has been initialized on the IO thread, and
-  // SystemRequestContext state has been initialized on the UI thread.
-  void InitSystemRequestContextOnIOThread();
-
-  void CreateDefaultAuthHandlerFactory();
-
-  // Returns an SSLConfigService instance.
-  net::SSLConfigService* GetSSLConfigService();
-
-  void ChangedToOnTheRecordOnIOThread();
-
-  static net::URLRequestContext* ConstructSystemRequestContext(
-      Globals* globals,
-      const net::HttpNetworkSession::Params& params,
-      net::NetLog* net_log);
-
-  // The NetLog is owned by the application context, to allow logging from other
-  // threads during shutdown, but is used most frequently on the IO thread.
-  net_log::ChromeNetLog* net_log_;
-
-  // These member variables are basically global, but their lifetimes are tied
-  // to the IOSChromeIOThread.  IOSChromeIOThread owns them all, despite not
-  // using scoped_ptr. This is because the destructor of IOSChromeIOThread runs
-  // on the wrong thread.  All member variables should be deleted in CleanUp().
-
-  // These member variables are initialized in Init() and do not change for the
-  // lifetime of the IO thread.
-
-  Globals* globals_;
-
-  net::HttpNetworkSession::Params params_;
-
-  // Observer that logs network changes to the ChromeNetLog.
-  class LoggingNetworkChangeObserver;
-  std::unique_ptr<LoggingNetworkChangeObserver> network_change_observer_;
-
-  // This is an instance of the default SSLConfigServiceManager for the current
-  // platform and it gets SSL preferences from local_state object.
-  std::unique_ptr<ssl_config::SSLConfigServiceManager>
-      ssl_config_service_manager_;
-
-  // These member variables are initialized by a task posted to the IO thread,
-  // which gets posted by calling certain member functions of IOSChromeIOThread.
-  std::unique_ptr<net::ProxyConfigService> system_proxy_config_service_;
-
-  std::unique_ptr<PrefProxyConfigTracker> pref_proxy_config_tracker_;
-
-  scoped_refptr<SystemURLRequestContextGetter>
-      system_url_request_context_getter_;
-
-  const base::TimeTicks creation_time_;
-
-  base::WeakPtrFactory<IOSChromeIOThread> weak_factory_;
-
   DISALLOW_COPY_AND_ASSIGN(IOSChromeIOThread);
 };
 
diff --git a/ios/chrome/browser/ios_chrome_io_thread.mm b/ios/chrome/browser/ios_chrome_io_thread.mm
index 9508c67..1d6a4875 100644
--- a/ios/chrome/browser/ios_chrome_io_thread.mm
+++ b/ios/chrome/browser/ios_chrome_io_thread.mm
@@ -4,574 +4,27 @@
 
 #include "ios/chrome/browser/ios_chrome_io_thread.h"
 
-#include <stddef.h>
-
-#include <utility>
-#include <vector>
-
-#include "base/bind.h"
-#include "base/bind_helpers.h"
-#include "base/command_line.h"
-#include "base/compiler_specific.h"
-#include "base/debug/leak_tracker.h"
-#include "base/environment.h"
-#include "base/logging.h"
-#include "base/macros.h"
 #include "base/memory/ptr_util.h"
-#include "base/metrics/field_trial.h"
-#include "base/single_thread_task_runner.h"
-#include "base/stl_util.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/strings/string_split.h"
-#include "base/strings/string_util.h"
-#include "base/threading/sequenced_worker_pool.h"
-#include "base/threading/thread.h"
-#include "base/time/time.h"
-#include "base/trace_event/trace_event.h"
-#include "components/net_log/chrome_net_log.h"
-#include "components/network_session_configurator/network_session_configurator.h"
-#include "components/prefs/pref_service.h"
-#include "components/proxy_config/ios/proxy_service_factory.h"
-#include "components/proxy_config/pref_proxy_config_tracker.h"
-#include "components/variations/variations_associated_data.h"
-#include "components/version_info/version_info.h"
-#include "ios/chrome/browser/chrome_switches.h"
-#include "ios/chrome/browser/net/cookie_util.h"
 #include "ios/chrome/browser/net/ios_chrome_network_delegate.h"
 #include "ios/chrome/common/channel_info.h"
-#include "ios/web/public/user_agent.h"
-#include "ios/web/public/web_client.h"
-#include "ios/web/public/web_thread.h"
-#include "net/base/sdch_manager.h"
-#include "net/cert/cert_verifier.h"
-#include "net/cert/ct_known_logs.h"
-#include "net/cert/ct_log_verifier.h"
-#include "net/cert/ct_policy_enforcer.h"
-#include "net/cert/ct_verifier.h"
-#include "net/cert/multi_log_ct_verifier.h"
-#include "net/cert/multi_threaded_cert_verifier.h"
-#include "net/cookies/cookie_monster.h"
-#include "net/cookies/cookie_store.h"
-#include "net/dns/host_cache.h"
-#include "net/dns/host_resolver.h"
-#include "net/dns/mapped_host_resolver.h"
-#include "net/http/http_auth_filter.h"
-#include "net/http/http_auth_handler_factory.h"
-#include "net/http/http_auth_preferences.h"
-#include "net/http/http_network_layer.h"
-#include "net/http/http_server_properties_impl.h"
-#include "net/log/net_log_event_type.h"
-#include "net/nqe/external_estimate_provider.h"
-#include "net/nqe/network_quality_estimator.h"
-#include "net/proxy/proxy_config_service.h"
-#include "net/proxy/proxy_script_fetcher_impl.h"
-#include "net/proxy/proxy_service.h"
-#include "net/socket/tcp_client_socket.h"
-#include "net/spdy/chromium/spdy_session.h"
-#include "net/ssl/channel_id_service.h"
-#include "net/ssl/default_channel_id_store.h"
-#include "net/url_request/data_protocol_handler.h"
-#include "net/url_request/file_protocol_handler.h"
-#include "net/url_request/static_http_user_agent_settings.h"
-#include "net/url_request/url_request_context.h"
-#include "net/url_request/url_request_context_builder.h"
-#include "net/url_request/url_request_context_getter.h"
-#include "net/url_request/url_request_job_factory_impl.h"
-#include "url/url_constants.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
 #endif
 
-// The IOSChromeIOThread object must outlive any tasks posted to the IO thread
-// before the Quit task, so base::Bind() calls are not refcounted.
-
-namespace {
-
-const char kSupportedAuthSchemes[] = "basic,digest,ntlm";
-
-// Field trial for network quality estimator. Seeds RTT and downstream
-// throughput observations with values that correspond to the connection type
-// determined by the operating system.
-const char kNetworkQualityEstimatorFieldTrialName[] = "NetworkQualityEstimator";
-
-// Used for the "system" URLRequestContext.
-class SystemURLRequestContext : public net::URLRequestContext {
- public:
-  SystemURLRequestContext() {
-  }
-
- private:
-  ~SystemURLRequestContext() override {
-    AssertNoURLRequests();
-  }
-};
-
-std::unique_ptr<net::HostResolver> CreateGlobalHostResolver(
-    net::NetLog* net_log) {
-  TRACE_EVENT0("startup", "IOSChromeIOThread::CreateGlobalHostResolver");
-  const base::CommandLine& command_line =
-      *base::CommandLine::ForCurrentProcess();
-
-  std::unique_ptr<net::HostResolver> global_host_resolver =
-      net::HostResolver::CreateSystemResolver(net::HostResolver::Options(),
-                                              net_log);
-
-  // If hostname remappings were specified on the command-line, layer these
-  // rules on top of the real host resolver. This allows forwarding all requests
-  // through a designated test server.
-  if (!command_line.HasSwitch(switches::kIOSHostResolverRules))
-    return global_host_resolver;
-
-  std::unique_ptr<net::MappedHostResolver> remapped_resolver(
-      new net::MappedHostResolver(std::move(global_host_resolver)));
-  remapped_resolver->SetRulesFromString(
-      command_line.GetSwitchValueASCII(switches::kIOSHostResolverRules));
-  // TODO(crbug.com/703565): remove std::move() once Xcode 9.0+ is required.
-  return std::move(remapped_resolver);
-}
-
-int GetSwitchValueAsInt(const base::CommandLine& command_line,
-                        const std::string& switch_name) {
-  int value;
-  if (!base::StringToInt(command_line.GetSwitchValueASCII(switch_name),
-                         &value)) {
-    return 0;
-  }
-  return value;
-}
-
-}  // namespace
-
-class IOSChromeIOThread::LoggingNetworkChangeObserver
-    : public net::NetworkChangeNotifier::IPAddressObserver,
-      public net::NetworkChangeNotifier::ConnectionTypeObserver,
-      public net::NetworkChangeNotifier::NetworkChangeObserver {
- public:
-  // |net_log| must remain valid throughout our lifetime.
-  explicit LoggingNetworkChangeObserver(net::NetLog* net_log)
-      : net_log_(net_log) {
-    net::NetworkChangeNotifier::AddIPAddressObserver(this);
-    net::NetworkChangeNotifier::AddConnectionTypeObserver(this);
-    net::NetworkChangeNotifier::AddNetworkChangeObserver(this);
-  }
-
-  ~LoggingNetworkChangeObserver() override {
-    net::NetworkChangeNotifier::RemoveIPAddressObserver(this);
-    net::NetworkChangeNotifier::RemoveConnectionTypeObserver(this);
-    net::NetworkChangeNotifier::RemoveNetworkChangeObserver(this);
-  }
-
-  // NetworkChangeNotifier::IPAddressObserver implementation.
-  void OnIPAddressChanged() override {
-    VLOG(1) << "Observed a change to the network IP addresses";
-
-    net_log_->AddGlobalEntry(
-        net::NetLogEventType::NETWORK_IP_ADDRESSES_CHANGED);
-  }
-
-  // NetworkChangeNotifier::ConnectionTypeObserver implementation.
-  void OnConnectionTypeChanged(
-      net::NetworkChangeNotifier::ConnectionType type) override {
-    std::string type_as_string =
-        net::NetworkChangeNotifier::ConnectionTypeToString(type);
-
-    VLOG(1) << "Observed a change to network connectivity state "
-            << type_as_string;
-
-    net_log_->AddGlobalEntry(
-        net::NetLogEventType::NETWORK_CONNECTIVITY_CHANGED,
-        net::NetLog::StringCallback("new_connection_type", &type_as_string));
-  }
-
-  // NetworkChangeNotifier::NetworkChangeObserver implementation.
-  void OnNetworkChanged(
-      net::NetworkChangeNotifier::ConnectionType type) override {
-    std::string type_as_string =
-        net::NetworkChangeNotifier::ConnectionTypeToString(type);
-
-    VLOG(1) << "Observed a network change to state " << type_as_string;
-
-    net_log_->AddGlobalEntry(
-        net::NetLogEventType::NETWORK_CHANGED,
-        net::NetLog::StringCallback("new_connection_type", &type_as_string));
-  }
-
- private:
-  net::NetLog* net_log_;
-  DISALLOW_COPY_AND_ASSIGN(LoggingNetworkChangeObserver);
-};
-
-class SystemURLRequestContextGetter : public net::URLRequestContextGetter {
- public:
-  explicit SystemURLRequestContextGetter(IOSChromeIOThread* io_thread);
-
-  // Implementation for net::UrlRequestContextGetter.
-  net::URLRequestContext* GetURLRequestContext() override;
-  scoped_refptr<base::SingleThreadTaskRunner> GetNetworkTaskRunner()
-      const override;
-
-  // Tells the getter that the URLRequestContext is about to be shut down.
-  void Shutdown();
-
- protected:
-  ~SystemURLRequestContextGetter() override;
-
- private:
-  IOSChromeIOThread* io_thread_;  // Weak pointer, owned by ApplicationContext.
-  scoped_refptr<base::SingleThreadTaskRunner> network_task_runner_;
-
-  base::debug::LeakTracker<SystemURLRequestContextGetter> leak_tracker_;
-};
-
-SystemURLRequestContextGetter::SystemURLRequestContextGetter(
-    IOSChromeIOThread* io_thread)
-    : io_thread_(io_thread),
-      network_task_runner_(
-          web::WebThread::GetTaskRunnerForThread(web::WebThread::IO)) {}
-
-SystemURLRequestContextGetter::~SystemURLRequestContextGetter() {}
-
-net::URLRequestContext* SystemURLRequestContextGetter::GetURLRequestContext() {
-  DCHECK_CURRENTLY_ON(web::WebThread::IO);
-  if (!io_thread_)
-    return nullptr;
-  DCHECK(io_thread_->globals()->system_request_context.get());
-
-  return io_thread_->globals()->system_request_context.get();
-}
-
-scoped_refptr<base::SingleThreadTaskRunner>
-SystemURLRequestContextGetter::GetNetworkTaskRunner() const {
-  return network_task_runner_;
-}
-
-void SystemURLRequestContextGetter::Shutdown() {
-  DCHECK_CURRENTLY_ON(web::WebThread::IO);
-  io_thread_ = nullptr;
-  NotifyContextShuttingDown();
-}
-
-IOSChromeIOThread::Globals::SystemRequestContextLeakChecker::
-    SystemRequestContextLeakChecker(Globals* globals)
-    : globals_(globals) {
-  DCHECK(globals_);
-}
-
-IOSChromeIOThread::Globals::SystemRequestContextLeakChecker::
-    ~SystemRequestContextLeakChecker() {
-  if (globals_->system_request_context.get())
-    globals_->system_request_context->AssertNoURLRequests();
-}
-
-IOSChromeIOThread::Globals::Globals()
-    : system_request_context_leak_checker(this) {}
-
-IOSChromeIOThread::Globals::~Globals() {}
-
-// |local_state| is passed in explicitly in order to (1) reduce implicit
-// dependencies and (2) make IOSChromeIOThread more flexible for testing.
 IOSChromeIOThread::IOSChromeIOThread(PrefService* local_state,
                                      net_log::ChromeNetLog* net_log)
-    : net_log_(net_log),
-      globals_(nullptr),
-      creation_time_(base::TimeTicks::Now()),
-      weak_factory_(this) {
-  pref_proxy_config_tracker_ =
-      ProxyServiceFactory::CreatePrefProxyConfigTrackerOfLocalState(
-          local_state);
+    : IOSIOThread(local_state, net_log) {
   IOSChromeNetworkDelegate::InitializePrefsOnUIThread(nullptr, local_state);
-  ssl_config_service_manager_.reset(
-      ssl_config::SSLConfigServiceManager::CreateDefaultManager(
-          local_state,
-          web::WebThread::GetTaskRunnerForThread(web::WebThread::IO)));
-
-  web::WebThread::SetDelegate(web::WebThread::IO, this);
 }
 
-IOSChromeIOThread::~IOSChromeIOThread() {
-  // This isn't needed for production code, but in tests, IOSChromeIOThread may
-  // be multiply constructed.
-  web::WebThread::SetDelegate(web::WebThread::IO, nullptr);
+IOSChromeIOThread::~IOSChromeIOThread() = default;
 
-  pref_proxy_config_tracker_->DetachFromPrefService();
-  DCHECK(!globals_);
+std::unique_ptr<net::NetworkDelegate>
+IOSChromeIOThread::CreateSystemNetworkDelegate() {
+  return base::MakeUnique<IOSChromeNetworkDelegate>();
 }
 
-IOSChromeIOThread::Globals* IOSChromeIOThread::globals() {
-  DCHECK_CURRENTLY_ON(web::WebThread::IO);
-  return globals_;
-}
-
-void IOSChromeIOThread::SetGlobalsForTesting(Globals* globals) {
-  DCHECK_CURRENTLY_ON(web::WebThread::IO);
-  DCHECK(!globals || !globals_);
-  globals_ = globals;
-}
-
-net_log::ChromeNetLog* IOSChromeIOThread::net_log() {
-  return net_log_;
-}
-
-void IOSChromeIOThread::ChangedToOnTheRecord() {
-  DCHECK_CURRENTLY_ON(web::WebThread::UI);
-  web::WebThread::PostTask(
-      web::WebThread::IO, FROM_HERE,
-      base::Bind(&IOSChromeIOThread::ChangedToOnTheRecordOnIOThread,
-                 base::Unretained(this)));
-}
-
-net::URLRequestContextGetter*
-IOSChromeIOThread::system_url_request_context_getter() {
-  DCHECK_CURRENTLY_ON(web::WebThread::UI);
-  if (!system_url_request_context_getter_.get()) {
-    InitSystemRequestContext();
-  }
-  return system_url_request_context_getter_.get();
-}
-
-void IOSChromeIOThread::Init() {
-  TRACE_EVENT0("startup", "IOSChromeIOThread::Init");
-  DCHECK_CURRENTLY_ON(web::WebThread::IO);
-
-  const base::CommandLine& command_line =
-      *base::CommandLine::ForCurrentProcess();
-
-  DCHECK(!globals_);
-  globals_ = new Globals;
-
-  // Add an observer that will emit network change events to the ChromeNetLog.
-  // Assuming NetworkChangeNotifier dispatches in FIFO order, we should be
-  // logging the network change before other IO thread consumers respond to it.
-  network_change_observer_.reset(new LoggingNetworkChangeObserver(net_log_));
-
-  // Setup the HistogramWatcher to run on the IO thread.
-  net::NetworkChangeNotifier::InitHistogramWatcher();
-
-  std::unique_ptr<IOSChromeNetworkDelegate> chrome_network_delegate(
-      new IOSChromeNetworkDelegate());
-
-  globals_->system_network_delegate = std::move(chrome_network_delegate);
-  globals_->host_resolver = CreateGlobalHostResolver(net_log_);
-
-  std::map<std::string, std::string> network_quality_estimator_params;
-  variations::GetVariationParams(kNetworkQualityEstimatorFieldTrialName,
-                                 &network_quality_estimator_params);
-
-  std::unique_ptr<net::ExternalEstimateProvider> external_estimate_provider;
-  // Pass ownership.
-  globals_->network_quality_estimator.reset(new net::NetworkQualityEstimator(
-      std::move(external_estimate_provider), network_quality_estimator_params,
-      net_log_));
-
-  globals_->cert_verifier = net::CertVerifier::CreateDefault();
-
-  globals_->transport_security_state.reset(new net::TransportSecurityState());
-
-  std::vector<scoped_refptr<const net::CTLogVerifier>> ct_logs(
-      net::ct::CreateLogVerifiersForKnownLogs());
-
-  net::MultiLogCTVerifier* ct_verifier = new net::MultiLogCTVerifier();
-  globals_->cert_transparency_verifier.reset(ct_verifier);
-  // Add built-in logs
-  ct_verifier->AddLogs(ct_logs);
-
-  globals_->ct_policy_enforcer.reset(new net::CTPolicyEnforcer());
-
-  globals_->ssl_config_service = GetSSLConfigService();
-
-  CreateDefaultAuthHandlerFactory();
-  globals_->http_server_properties.reset(new net::HttpServerPropertiesImpl());
-  // In-memory cookie store.
-  globals_->system_cookie_store.reset(new net::CookieMonster(nullptr, nullptr));
-  // In-memory channel ID store.
-  globals_->system_channel_id_service.reset(
-      new net::ChannelIDService(new net::DefaultChannelIDStore(nullptr)));
-  globals_->system_cookie_store->SetChannelIDServiceID(
-      globals_->system_channel_id_service->GetUniqueID());
-  globals_->http_user_agent_settings.reset(new net::StaticHttpUserAgentSettings(
-      std::string(),
-      web::GetWebClient()->GetUserAgent(web::UserAgentType::MOBILE)));
-  if (command_line.HasSwitch(switches::kIOSTestingFixedHttpPort)) {
-    params_.testing_fixed_http_port =
-        GetSwitchValueAsInt(command_line, switches::kIOSTestingFixedHttpPort);
-  }
-  if (command_line.HasSwitch(switches::kIOSTestingFixedHttpsPort)) {
-    params_.testing_fixed_https_port =
-        GetSwitchValueAsInt(command_line, switches::kIOSTestingFixedHttpsPort);
-  }
-
-  params_.ignore_certificate_errors = false;
-  params_.enable_user_alternate_protocol_ports = false;
-
-  std::string quic_user_agent_id = ::GetChannelString();
-  if (!quic_user_agent_id.empty())
-    quic_user_agent_id.push_back(' ');
-  quic_user_agent_id.append(
-      version_info::GetProductNameAndVersionForUserAgent());
-  quic_user_agent_id.push_back(' ');
-  quic_user_agent_id.append(web::BuildOSCpuInfo());
-
-  network_session_configurator::ParseFieldTrials(
-      /*is_quic_force_disabled=*/false,
-      /*is_quic_force_enabled=*/false, quic_user_agent_id, &params_);
-
-  // InitSystemRequestContext turns right around and posts a task back
-  // to the IO thread, so we can't let it run until we know the IO
-  // thread has started.
-  //
-  // Note that since we are at WebThread::Init time, the UI thread
-  // is blocked waiting for the thread to start.  Therefore, posting
-  // this task to the main thread's message loop here is guaranteed to
-  // get it onto the message loop while the IOSChromeIOThread object still
-  // exists.  However, the message might not be processed on the UI
-  // thread until after IOSChromeIOThread is gone, so use a weak pointer.
-  web::WebThread::PostTask(
-      web::WebThread::UI, FROM_HERE,
-      base::Bind(&IOSChromeIOThread::InitSystemRequestContext,
-                 weak_factory_.GetWeakPtr()));
-}
-
-void IOSChromeIOThread::CleanUp() {
-  system_url_request_context_getter_->Shutdown();
-  system_url_request_context_getter_ = nullptr;
-
-  // Release objects that the net::URLRequestContext could have been pointing
-  // to.
-
-  // Shutdown the HistogramWatcher on the IO thread.
-  net::NetworkChangeNotifier::ShutdownHistogramWatcher();
-
-  // This must be reset before the ChromeNetLog is destroyed.
-  network_change_observer_.reset();
-
-  system_proxy_config_service_.reset();
-
-  delete globals_;
-  globals_ = nullptr;
-
-  base::debug::LeakTracker<SystemURLRequestContextGetter>::CheckForLeaks();
-}
-
-void IOSChromeIOThread::CreateDefaultAuthHandlerFactory() {
-  std::vector<std::string> supported_schemes =
-      base::SplitString(kSupportedAuthSchemes, ",", base::TRIM_WHITESPACE,
-                        base::SPLIT_WANT_NONEMPTY);
-  globals_->http_auth_preferences.reset(
-      new net::HttpAuthPreferences(supported_schemes, std::string()));
-  globals_->http_auth_handler_factory =
-      net::HttpAuthHandlerRegistryFactory::Create(
-          globals_->http_auth_preferences.get(), globals_->host_resolver.get());
-}
-
-void IOSChromeIOThread::ClearHostCache() {
-  DCHECK_CURRENTLY_ON(web::WebThread::IO);
-
-  net::HostCache* host_cache = globals_->host_resolver->GetHostCache();
-  if (host_cache)
-    host_cache->clear();
-}
-
-const net::HttpNetworkSession::Params& IOSChromeIOThread::NetworkSessionParams()
-    const {
-  return params_;
-}
-
-base::TimeTicks IOSChromeIOThread::creation_time() const {
-  return creation_time_;
-}
-
-net::SSLConfigService* IOSChromeIOThread::GetSSLConfigService() {
-  return ssl_config_service_manager_->Get();
-}
-
-void IOSChromeIOThread::ChangedToOnTheRecordOnIOThread() {
-  DCHECK_CURRENTLY_ON(web::WebThread::IO);
-
-  // Clear the host cache to avoid showing entries from the OTR session
-  // in about:net-internals.
-  ClearHostCache();
-}
-
-void IOSChromeIOThread::InitSystemRequestContext() {
-  if (system_url_request_context_getter_.get())
-    return;
-  // If we're in unit_tests, IOSChromeIOThread may not be run.
-  if (!web::WebThread::IsMessageLoopValid(web::WebThread::IO))
-    return;
-  system_proxy_config_service_ = ProxyServiceFactory::CreateProxyConfigService(
-      pref_proxy_config_tracker_.get());
-
-  system_url_request_context_getter_ = new SystemURLRequestContextGetter(this);
-  // Safe to post an unretained this pointer, since IOSChromeIOThread is
-  // guaranteed to outlive the IO WebThread.
-  web::WebThread::PostTask(
-      web::WebThread::IO, FROM_HERE,
-      base::Bind(&IOSChromeIOThread::InitSystemRequestContextOnIOThread,
-                 base::Unretained(this)));
-}
-
-void IOSChromeIOThread::InitSystemRequestContextOnIOThread() {
-  DCHECK_CURRENTLY_ON(web::WebThread::IO);
-  DCHECK(!globals_->system_proxy_service.get());
-  DCHECK(system_proxy_config_service_.get());
-
-  globals_->system_proxy_service = ProxyServiceFactory::CreateProxyService(
-      net_log_, nullptr, globals_->system_network_delegate.get(),
-      std::move(system_proxy_config_service_), true /* quick_check_enabled */);
-
-  globals_->system_request_context.reset(
-      ConstructSystemRequestContext(globals_, params_, net_log_));
-}
-
-net::URLRequestContext* IOSChromeIOThread::ConstructSystemRequestContext(
-    IOSChromeIOThread::Globals* globals,
-    const net::HttpNetworkSession::Params& params,
-    net::NetLog* net_log) {
-  net::URLRequestContext* context = new SystemURLRequestContext;
-  context->set_net_log(net_log);
-  context->set_host_resolver(globals->host_resolver.get());
-  context->set_cert_verifier(globals->cert_verifier.get());
-  context->set_transport_security_state(
-      globals->transport_security_state.get());
-  context->set_cert_transparency_verifier(
-      globals->cert_transparency_verifier.get());
-  context->set_ssl_config_service(globals->ssl_config_service.get());
-  context->set_http_auth_handler_factory(
-      globals->http_auth_handler_factory.get());
-  context->set_proxy_service(globals->system_proxy_service.get());
-  context->set_ct_policy_enforcer(globals->ct_policy_enforcer.get());
-
-  net::URLRequestJobFactoryImpl* system_job_factory =
-      new net::URLRequestJobFactoryImpl();
-  // Data URLs are always loaded through the system request context on iOS
-  // (due to UIWebView limitations).
-  bool set_protocol = system_job_factory->SetProtocolHandler(
-      url::kDataScheme, base::MakeUnique<net::DataProtocolHandler>());
-  DCHECK(set_protocol);
-  globals->system_url_request_job_factory.reset(system_job_factory);
-  context->set_job_factory(globals->system_url_request_job_factory.get());
-
-  context->set_cookie_store(globals->system_cookie_store.get());
-  context->set_channel_id_service(globals->system_channel_id_service.get());
-  context->set_network_delegate(globals->system_network_delegate.get());
-  context->set_http_user_agent_settings(
-      globals->http_user_agent_settings.get());
-  context->set_network_quality_estimator(
-      globals->network_quality_estimator.get());
-
-  context->set_http_server_properties(globals->http_server_properties.get());
-
-  net::HttpNetworkSession::Params system_params(params);
-  net::URLRequestContextBuilder::SetHttpNetworkSessionComponents(
-      context, &system_params);
-
-  globals->system_http_network_session.reset(
-      new net::HttpNetworkSession(system_params));
-  globals->system_http_transaction_factory.reset(
-      new net::HttpNetworkLayer(globals->system_http_network_session.get()));
-  context->set_http_transaction_factory(
-      globals->system_http_transaction_factory.get());
-
-  return context;
+std::string IOSChromeIOThread::GetChannelString() const {
+  return ::GetChannelString();
 }
diff --git a/ios/chrome/browser/native_app_launcher/BUILD.gn b/ios/chrome/browser/native_app_launcher/BUILD.gn
index 76ecaa68..e81b5cd 100644
--- a/ios/chrome/browser/native_app_launcher/BUILD.gn
+++ b/ios/chrome/browser/native_app_launcher/BUILD.gn
@@ -82,6 +82,7 @@
 }
 
 source_set("unit_tests_internal") {
+  configs += [ "//build/config/compiler:enable_arc" ]
   testonly = true
   sources = [
     "native_app_navigation_controller_unittest.mm",
diff --git a/ios/chrome/browser/native_app_launcher/native_app_navigation_controller_unittest.mm b/ios/chrome/browser/native_app_launcher/native_app_navigation_controller_unittest.mm
index a703114..0607c780 100644
--- a/ios/chrome/browser/native_app_launcher/native_app_navigation_controller_unittest.mm
+++ b/ios/chrome/browser/native_app_launcher/native_app_navigation_controller_unittest.mm
@@ -5,7 +5,6 @@
 #include <memory>
 
 #include "base/bind.h"
-#include "base/mac/scoped_nsobject.h"
 #include "base/memory/ptr_util.h"
 #include "base/metrics/user_metrics.h"
 #include "base/strings/utf_string_conversions.h"
@@ -20,6 +19,10 @@
 #include "ios/public/provider/chrome/browser/test_chrome_browser_provider.h"
 #import "testing/gtest_mac.h"
 
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
 @interface NativeAppNavigationController (Testing)
 - (void)recordInfobarDisplayedOfType:(NativeAppControllerType)type
                     onLinkNavigation:(BOOL)isLinkNavigation;
@@ -32,7 +35,7 @@
 class FakeChromeBrowserProvider : public ios::TestChromeBrowserProvider {
  public:
   FakeChromeBrowserProvider(FakeNativeAppWhitelistManager* fake_manager) {
-    manager_.reset([fake_manager retain]);
+    manager_ = fake_manager;
   }
   ~FakeChromeBrowserProvider() override {}
 
@@ -41,15 +44,15 @@
   }
 
  private:
-  base::scoped_nsprotocol<id<NativeAppWhitelistManager>> manager_;
+  id<NativeAppWhitelistManager> manager_;
 };
 
 class NativeAppNavigationControllerTest : public ChromeWebTest {
  protected:
   void SetUp() override {
     ChromeWebTest::SetUp();
-    controller_.reset(
-        [[NativeAppNavigationController alloc] initWithWebState:web_state()]);
+    controller_ =
+        [[NativeAppNavigationController alloc] initWithWebState:web_state()];
 
     action_callback_ =
         base::Bind(&NativeAppNavigationControllerTest::OnUserAction,
@@ -78,7 +81,7 @@
     handler_called_counter_ = 0;
   }
 
-  base::scoped_nsobject<NativeAppNavigationController> controller_;
+  NativeAppNavigationController* controller_;
 
   // The callback to invoke when an action is recorded.
   base::ActionCallback action_callback_;
@@ -125,11 +128,10 @@
 
   // Set up fake metadata.
   FakeNativeAppWhitelistManager* fakeManager =
-      [[[FakeNativeAppWhitelistManager alloc] init] autorelease];
+      [[FakeNativeAppWhitelistManager alloc] init];
   IOSChromeScopedTestingChromeBrowserProvider provider(
       base::MakeUnique<FakeChromeBrowserProvider>(fakeManager));
-  FakeNativeAppMetadata* metadata =
-      [[[FakeNativeAppMetadata alloc] init] autorelease];
+  FakeNativeAppMetadata* metadata = [[FakeNativeAppMetadata alloc] init];
   fakeManager.metadata = metadata;
   metadata.appName = @"App";
   metadata.appId = @"App-ID";
@@ -162,30 +164,28 @@
   NSString* const kYoutubeAppName = @"Youtube";
   NSString* const kYoutubeAppId = @"2";
 
-  base::scoped_nsobject<InstallationNotifier> installationNotifier(
-      [[InstallationNotifier alloc] init]);
+  InstallationNotifier* installationNotifier =
+      [[InstallationNotifier alloc] init];
 
   FakeNativeAppWhitelistManager* fakeManager =
-      [[[FakeNativeAppWhitelistManager alloc] init] autorelease];
+      [[FakeNativeAppWhitelistManager alloc] init];
   IOSChromeScopedTestingChromeBrowserProvider provider(
       base::MakeUnique<FakeChromeBrowserProvider>(fakeManager));
 
-  base::scoped_nsobject<FakeNativeAppMetadata> metadataMaps(
-      [[FakeNativeAppMetadata alloc] init]);
+  FakeNativeAppMetadata* metadataMaps = [[FakeNativeAppMetadata alloc] init];
   [metadataMaps setAppName:kMapsAppName];
   [metadataMaps setAppId:kMapsAppId];
-  ASSERT_TRUE(metadataMaps.get());
+  ASSERT_TRUE(metadataMaps);
   NSString* appIdMaps = [metadataMaps appId];
   NSNotification* notificationMaps =
       [NSNotification notificationWithName:kMapsAppName
                                     object:installationNotifier];
 
-  base::scoped_nsobject<FakeNativeAppMetadata> metadataYouTube(
-      [[FakeNativeAppMetadata alloc] init]);
+  FakeNativeAppMetadata* metadataYouTube = [[FakeNativeAppMetadata alloc] init];
   [metadataYouTube setAppName:kYoutubeAppName];
   [metadataYouTube setAppId:kYoutubeAppId];
 
-  ASSERT_TRUE(metadataYouTube.get());
+  ASSERT_TRUE(metadataYouTube);
   NSString* appIdYouTube = [metadataYouTube appId];
   NSNotification* notificationYouTube =
       [NSNotification notificationWithName:kYoutubeAppName
diff --git a/ios/chrome/browser/native_app_launcher/native_app_navigation_util_unittest.mm b/ios/chrome/browser/native_app_launcher/native_app_navigation_util_unittest.mm
index b36ae902..a651a2fb 100644
--- a/ios/chrome/browser/native_app_launcher/native_app_navigation_util_unittest.mm
+++ b/ios/chrome/browser/native_app_launcher/native_app_navigation_util_unittest.mm
@@ -11,6 +11,10 @@
 #include "ui/base/page_transition_types.h"
 #include "url/gurl.h"
 
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
 // Tests the implementation of IsLinkNavigation(). The function being tested
 // uses public NavigationManager interfaces and can be tested by using
 // TestNavigationManager that implements the same interface.
diff --git a/ios/chrome/browser/translate/BUILD.gn b/ios/chrome/browser/translate/BUILD.gn
index 91045af..244fef7 100644
--- a/ios/chrome/browser/translate/BUILD.gn
+++ b/ios/chrome/browser/translate/BUILD.gn
@@ -52,6 +52,7 @@
 }
 
 source_set("unit_tests") {
+  configs += [ "//build/config/compiler:enable_arc" ]
   testonly = true
   sources = [
     "js_language_detection_manager_unittest.mm",
diff --git a/ios/chrome/browser/translate/js_language_detection_manager_unittest.mm b/ios/chrome/browser/translate/js_language_detection_manager_unittest.mm
index a1db1f8..6a7e10fb 100644
--- a/ios/chrome/browser/translate/js_language_detection_manager_unittest.mm
+++ b/ios/chrome/browser/translate/js_language_detection_manager_unittest.mm
@@ -10,7 +10,6 @@
 #include <vector>
 
 #include "base/bind.h"
-#include "base/mac/scoped_nsobject.h"
 #import "base/test/ios/wait_util.h"
 #include "base/values.h"
 #import "ios/chrome/browser/web/chrome_web_test.h"
@@ -21,18 +20,21 @@
 #include "testing/gtest/include/gtest/gtest.h"
 #include "testing/gtest_mac.h"
 
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
 namespace {
 
 const char kExpectedLanguage[] = "Foo";
 
 // Returns an NSString filled with the char 'a' of length |length|.
 NSString* GetLongString(NSUInteger length) {
-  base::scoped_nsobject<NSMutableData> data(
-      [[NSMutableData alloc] initWithLength:length]);
+  NSMutableData* data = [[NSMutableData alloc] initWithLength:length];
   memset([data mutableBytes], 'a', length);
   NSString* long_string =
       [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
-  return [long_string autorelease];
+  return long_string;
 }
 
 }  // namespace
@@ -42,9 +44,9 @@
  protected:
   void SetUp() override {
     ChromeWebTest::SetUp();
-    manager_.reset(static_cast<JsLanguageDetectionManager*>(
-        [[web_state()->GetJSInjectionReceiver()
-            instanceOfClass:[JsLanguageDetectionManager class]] retain]));
+    manager_ = static_cast<JsLanguageDetectionManager*>(
+        [web_state()->GetJSInjectionReceiver()
+            instanceOfClass:[JsLanguageDetectionManager class]]);
     ASSERT_TRUE(manager_);
   }
 
@@ -92,14 +94,14 @@
   // Verifies if |__gCrWeb.languageDetection.getTextContent| correctly extracts
   // the text content from an HTML page.
   void ExpectTextContent(NSString* expected_text_content) {
-    base::scoped_nsobject<NSString> script([[NSString alloc]
+    NSString* script = [[NSString alloc]
         initWithFormat:
             @"__gCrWeb.languageDetection.getTextContent(document.body, %lu);",
-            language_detection::kMaxIndexChars]);
+            language_detection::kMaxIndexChars];
     InjectJsAndVerify(script, expected_text_content);
   }
 
-  base::scoped_nsobject<JsLanguageDetectionManager> manager_;
+  JsLanguageDetectionManager* manager_;
 };
 
 // Tests that |hasBeenInjected| returns YES after |inject| call.
@@ -125,10 +127,10 @@
 
 // Tests correctness of |document.documentElement.lang| attribute.
 TEST_F(JsLanguageDetectionManagerTest, HtmlLang) {
-  base::scoped_nsobject<NSString> html;
+  NSString* html;
   // Non-empty attribute.
-  html.reset([[NSString alloc]
-      initWithFormat:@"<html lang='%s'></html>", kExpectedLanguage]);
+  html = [[NSString alloc]
+      initWithFormat:@"<html lang='%s'></html>", kExpectedLanguage];
   LoadHtmlAndInject(html);
   ExpectHtmlLang(@(kExpectedLanguage));
 
@@ -137,8 +139,8 @@
   ExpectHtmlLang(@"");
 
   // Test with mixed case.
-  html.reset([[NSString alloc]
-      initWithFormat:@"<html lAnG='%s'></html>", kExpectedLanguage]);
+  html = [[NSString alloc]
+      initWithFormat:@"<html lAnG='%s'></html>", kExpectedLanguage];
   LoadHtmlAndInject(html);
   ExpectHtmlLang(@(kExpectedLanguage));
 }
@@ -148,23 +150,23 @@
   // No content language.
   LoadHtmlAndInject(@"<html></html>");
   ExpectHttpContentLanguage(@"");
-  base::scoped_nsobject<NSString> html;
+  NSString* html;
 
   // Some content language.
-  html.reset(([[NSString alloc]
+  html = ([[NSString alloc]
       initWithFormat:@"<html><head>"
                       "<meta http-equiv='content-language' content='%s'>"
                       "</head></html>",
-                     kExpectedLanguage]));
+                     kExpectedLanguage]);
   LoadHtmlAndInject(html);
   ExpectHttpContentLanguage(@(kExpectedLanguage));
 
   // Test with mixed case.
-  html.reset(([[NSString alloc]
+  html = ([[NSString alloc]
       initWithFormat:@"<html><head>"
                       "<meta http-equiv='cOnTenT-lAngUAge' content='%s'>"
                       "</head></html>",
-                     kExpectedLanguage]));
+                     kExpectedLanguage]);
   LoadHtmlAndInject(html);
   ExpectHttpContentLanguage(@(kExpectedLanguage));
 }
@@ -218,19 +220,18 @@
 TEST_F(JsLanguageDetectionManagerTest, LongTextContent) {
   // Very long string.
   NSUInteger kLongStringLength = language_detection::kMaxIndexChars - 5;
-  base::scoped_nsobject<NSMutableString> long_string(
-      [GetLongString(kLongStringLength) mutableCopy]);
+  NSMutableString* long_string = [GetLongString(kLongStringLength) mutableCopy];
   [long_string appendString:@" b cdefghijklmnopqrstuvwxyz"];
 
   // The string should be cut at the last whitespace, after the 'b' character.
-  base::scoped_nsobject<NSString> html([[NSString alloc]
-      initWithFormat:@"<html><body>%@</html></body>", long_string.get()]);
+  NSString* html = [[NSString alloc]
+      initWithFormat:@"<html><body>%@</html></body>", long_string];
   LoadHtmlAndInject(html);
 
-  base::scoped_nsobject<NSString> script([[NSString alloc]
+  NSString* script = [[NSString alloc]
       initWithFormat:
           @"__gCrWeb.languageDetection.getTextContent(document.body, %lu);",
-          language_detection::kMaxIndexChars]);
+          language_detection::kMaxIndexChars];
   NSString* result = web::ExecuteJavaScript(manager_, script);
   EXPECT_EQ(language_detection::kMaxIndexChars, [result length]);
 }
diff --git a/ios/components/BUILD.gn b/ios/components/BUILD.gn
new file mode 100644
index 0000000..03fb2b9
--- /dev/null
+++ b/ios/components/BUILD.gn
@@ -0,0 +1,33 @@
+# Copyright 2017 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("//ios/build/config.gni")
+import("//testing/test.gni")
+
+# All tests needs to be listed in that target to be built as part of
+# "gn_all" target (i.e. by the bots).
+group("all_tests") {
+  testonly = true
+  deps = [
+    ":ios_components_unittests",
+  ]
+}
+
+# To add a unit test to this target, make a "unit_tests" source_set in your
+# component (it's important to use a source_set instead of a static library or
+# no tests will run) and add a reference here. You can add more than one unit
+# test target if convenient.
+test("ios_components_unittests") {
+  # Add only ":unit_tests" dependencies here. If your tests have dependencies
+  # (this would at least include the component itself), they should be on the
+  # test source set and not here.
+
+  deps = [
+    "//base",
+    "//base/test:run_all_unittests",
+    "//ios/components/io_thread:unit_tests",
+  ]
+
+  assert_no_deps = ios_assert_no_deps
+}
diff --git a/ios/components/DEPS b/ios/components/DEPS
new file mode 100644
index 0000000..4ebdb4ea
--- /dev/null
+++ b/ios/components/DEPS
@@ -0,0 +1,12 @@
+include_rules = [
+  # Do not add ios/chrome/ or ios/web_view as an allowed include. Please see
+  # ios/components/README.
+  "-ios",
+  "+ios/testing",
+  "+ios/web/public",
+
+  # Individual components must explicitly declare their dependencies
+  # on other components. Cycles in the dependency graph within
+  # components/ are not allowed.
+  "-components",
+]
diff --git a/ios/components/README.md b/ios/components/README.md
new file mode 100644
index 0000000..8d81c853
--- /dev/null
+++ b/ios/components/README.md
@@ -0,0 +1,12 @@
+This directory is for features that are intended for reuse. For example, code
+that is shared between multiple embedders of ios/web like ios/web_view and
+ios/chrome. This means that components must not depend on either ios/web_view or
+ios/chrome.
+
+Code which can be shared across Chrome on all platforms should go in
+//components (which also supports iOS specific sources).
+
+Code in a component should be placed in a namespace corresponding to
+the name of the component; e.g. for a component living in
+//components/foo, code in that component should be in the foo::
+namespace.
diff --git a/ios/components/io_thread/BUILD.gn b/ios/components/io_thread/BUILD.gn
new file mode 100644
index 0000000..a02fef14
--- /dev/null
+++ b/ios/components/io_thread/BUILD.gn
@@ -0,0 +1,48 @@
+# Copyright 2017 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.
+
+component("io_thread") {
+  configs += [ "//build/config/compiler:enable_arc" ]
+
+  deps = [
+    "//base",
+    "//components/net_log",
+    "//components/network_session_configurator",
+    "//components/prefs",
+    "//components/proxy_config",
+    "//components/proxy_config/ios",
+    "//components/ssl_config",
+    "//components/variations",
+    "//components/version_info",
+    "//ios/web",
+    "//ios/web:user_agent",
+    "//net",
+  ]
+
+  sources = [
+    "ios_io_thread.h",
+    "ios_io_thread.mm",
+  ]
+}
+
+source_set("unit_tests") {
+  configs += [ "//build/config/compiler:enable_arc" ]
+  testonly = true
+  sources = [
+    "ios_io_thread_unittest.mm",
+  ]
+  deps = [
+    ":io_thread",
+    "//base",
+    "//components/prefs",
+    "//components/prefs:test_support",
+    "//components/proxy_config",
+    "//components/ssl_config",
+    "//ios/web",
+    "//ios/web:test_support",
+    "//net",
+    "//net:test_support",
+    "//testing/gtest",
+  ]
+}
diff --git a/ios/components/io_thread/DEPS b/ios/components/io_thread/DEPS
new file mode 100644
index 0000000..18ba547
--- /dev/null
+++ b/ios/components/io_thread/DEPS
@@ -0,0 +1,11 @@
+include_rules = [
+  "+components/net_log",
+  "+components/network_session_configurator",
+  "+components/prefs",
+  "+components/proxy_config",
+  "+components/ssl_config",
+  "+components/variations",
+  "+components/version_info",
+  "+ios/web/public",
+  "+net",
+]
diff --git a/ios/components/io_thread/ios_io_thread.h b/ios/components/io_thread/ios_io_thread.h
new file mode 100644
index 0000000..88958608
--- /dev/null
+++ b/ios/components/io_thread/ios_io_thread.h
@@ -0,0 +1,249 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef IOS_COMPONENTS_IO_THREAD_IOS_IO_THREAD_H_
+#define IOS_COMPONENTS_IO_THREAD_IOS_IO_THREAD_H_
+
+#include <stddef.h>
+#include <stdint.h>
+
+#include <map>
+#include <memory>
+#include <set>
+#include <string>
+#include <vector>
+
+#include "base/compiler_specific.h"
+#include "base/macros.h"
+#include "base/memory/ref_counted.h"
+#include "base/memory/weak_ptr.h"
+#include "base/time/time.h"
+#include "components/prefs/pref_member.h"
+#include "components/ssl_config/ssl_config_service_manager.h"
+#include "ios/web/public/web_thread_delegate.h"
+#include "net/base/network_change_notifier.h"
+#include "net/http/http_network_session.h"
+
+class PrefProxyConfigTracker;
+class PrefService;
+
+namespace net {
+class CTPolicyEnforcer;
+class CertVerifier;
+class ChannelIDService;
+class CookieStore;
+class CTVerifier;
+class HostResolver;
+class HttpAuthHandlerFactory;
+class HttpAuthPreferences;
+class HttpServerProperties;
+class HttpTransactionFactory;
+class HttpUserAgentSettings;
+class NetworkDelegate;
+class NetworkQualityEstimator;
+class ProxyConfigService;
+class ProxyService;
+class SSLConfigService;
+class TransportSecurityState;
+class URLRequestContext;
+class URLRequestContextGetter;
+class URLRequestJobFactory;
+}  // namespace net
+
+namespace net_log {
+class ChromeNetLog;
+}  // namespace net_log
+
+namespace io_thread {
+
+class SystemURLRequestContextGetter;
+
+// Contains state associated with, initialized and cleaned up on, and
+// primarily used on, the IO thread.
+//
+// If you are looking to interact with the IO thread (e.g. post tasks
+// to it or check if it is the current thread), see web::WebThread.
+class IOSIOThread : public web::WebThreadDelegate {
+ public:
+  struct Globals {
+    template <typename T>
+    class Optional {
+     public:
+      Optional() : set_(false) {}
+
+      void set(T value) {
+        set_ = true;
+        value_ = value;
+      }
+      void CopyToIfSet(T* value) const {
+        if (set_) {
+          *value = value_;
+        }
+      }
+
+     private:
+      bool set_;
+      T value_;
+    };
+
+    class SystemRequestContextLeakChecker {
+     public:
+      explicit SystemRequestContextLeakChecker(Globals* globals);
+      ~SystemRequestContextLeakChecker();
+
+     private:
+      Globals* const globals_;
+    };
+
+    Globals();
+    ~Globals();
+
+    // The "system" NetworkDelegate, used for BrowserState-agnostic network
+    // events.
+    std::unique_ptr<net::NetworkDelegate> system_network_delegate;
+    std::unique_ptr<net::HostResolver> host_resolver;
+    std::unique_ptr<net::CertVerifier> cert_verifier;
+    // The ChannelIDService must outlive the HttpTransactionFactory.
+    std::unique_ptr<net::ChannelIDService> system_channel_id_service;
+    // This TransportSecurityState doesn't load or save any state. It's only
+    // used to enforce pinning for system requests and will only use built-in
+    // pins.
+    std::unique_ptr<net::TransportSecurityState> transport_security_state;
+    std::unique_ptr<net::CTVerifier> cert_transparency_verifier;
+    scoped_refptr<net::SSLConfigService> ssl_config_service;
+    std::unique_ptr<net::HttpAuthPreferences> http_auth_preferences;
+    std::unique_ptr<net::HttpAuthHandlerFactory> http_auth_handler_factory;
+    std::unique_ptr<net::HttpServerProperties> http_server_properties;
+    std::unique_ptr<net::ProxyService> system_proxy_service;
+    std::unique_ptr<net::HttpNetworkSession> system_http_network_session;
+    std::unique_ptr<net::HttpTransactionFactory>
+        system_http_transaction_factory;
+    std::unique_ptr<net::URLRequestJobFactory> system_url_request_job_factory;
+    std::unique_ptr<net::URLRequestContext> system_request_context;
+    SystemRequestContextLeakChecker system_request_context_leak_checker;
+    std::unique_ptr<net::CookieStore> system_cookie_store;
+    std::unique_ptr<net::HttpUserAgentSettings> http_user_agent_settings;
+    std::unique_ptr<net::NetworkQualityEstimator> network_quality_estimator;
+    std::unique_ptr<net::CTPolicyEnforcer> ct_policy_enforcer;
+  };
+
+  // |net_log| must either outlive the IOSIOThread or be NULL.
+  IOSIOThread(PrefService* local_state, net_log::ChromeNetLog* net_log);
+  ~IOSIOThread() override;
+
+  // Can only be called on the IO thread.
+  Globals* globals();
+
+  // Allows overriding Globals in tests where IOSIOThread::Init() and
+  // IOSIOThread::CleanUp() are not called.  This allows for injecting mocks
+  // into IOSIOThread global objects.
+  void SetGlobalsForTesting(Globals* globals);
+
+  net_log::ChromeNetLog* net_log();
+
+  // Handles changing to On The Record mode, discarding confidential data.
+  void ChangedToOnTheRecord();
+
+  // Returns a getter for the URLRequestContext.  Only called on the UI thread.
+  net::URLRequestContextGetter* system_url_request_context_getter();
+
+  // Clears the host cache.  Intended to be used to prevent exposing recently
+  // visited sites on about:net-internals/#dns and about:dns pages.  Must be
+  // called on the IO thread.
+  void ClearHostCache();
+
+  const net::HttpNetworkSession::Params& NetworkSessionParams() const;
+
+  base::TimeTicks creation_time() const;
+
+ protected:
+  // A string describing the current application version. For example: "stable"
+  // or "dev". An empty string is an acceptable value. This string is used to
+  // build the user agent id for QUIC.
+  virtual std::string GetChannelString() const = 0;
+
+  // Subclasses must return a NetworkDelegate to be used for
+  // BrowserState-agnostic network events.
+  virtual std::unique_ptr<net::NetworkDelegate>
+  CreateSystemNetworkDelegate() = 0;
+
+ private:
+  // Provide SystemURLRequestContextGetter with access to
+  // InitSystemRequestContext().
+  friend class SystemURLRequestContextGetter;
+
+  // WebThreadDelegate implementation, runs on the IO thread.
+  // This handles initialization and destruction of state that must
+  // live on the IO thread.
+  void Init() override;
+  void CleanUp() override;
+
+  // Global state must be initialized on the IO thread, then this
+  // method must be invoked on the UI thread.
+  void InitSystemRequestContext();
+
+  // Lazy initialization of system request context for
+  // SystemURLRequestContextGetter. To be called on IO thread only
+  // after global state has been initialized on the IO thread, and
+  // SystemRequestContext state has been initialized on the UI thread.
+  void InitSystemRequestContextOnIOThread();
+
+  // Sets up HttpAuthPreferences and HttpAuthHandlerFactory on Globals.
+  void CreateDefaultAuthHandlerFactory();
+
+  // Returns an SSLConfigService instance.
+  net::SSLConfigService* GetSSLConfigService();
+
+  // Discards confidental data. To be called on IO thread only.
+  void ChangedToOnTheRecordOnIOThread();
+
+  static net::URLRequestContext* ConstructSystemRequestContext(
+      Globals* globals,
+      const net::HttpNetworkSession::Params& params,
+      net::NetLog* net_log);
+
+  // The NetLog is owned by the application context, to allow logging from other
+  // threads during shutdown, but is used most frequently on the IO thread.
+  net_log::ChromeNetLog* net_log_;
+
+  // These member variables are basically global, but their lifetimes are tied
+  // to the IOSIOThread.  IOSIOThread owns them all, despite not using
+  // scoped_ptr. This is because the destructor of IOSIOThread runs on the
+  // wrong thread.  All member variables should be deleted in CleanUp().
+
+  // These member variables are initialized in Init() and do not change for the
+  // lifetime of the IO thread.
+
+  Globals* globals_;
+
+  net::HttpNetworkSession::Params params_;
+
+  // Observer that logs network changes to the ChromeNetLog.
+  class LoggingNetworkChangeObserver;
+  std::unique_ptr<LoggingNetworkChangeObserver> network_change_observer_;
+
+  // This is an instance of the default SSLConfigServiceManager for the current
+  // platform and it gets SSL preferences from local_state object.
+  std::unique_ptr<ssl_config::SSLConfigServiceManager>
+      ssl_config_service_manager_;
+
+  // These member variables are initialized by a task posted to the IO thread,
+  // which gets posted by calling certain member functions of IOSIOThread.
+  std::unique_ptr<net::ProxyConfigService> system_proxy_config_service_;
+
+  std::unique_ptr<PrefProxyConfigTracker> pref_proxy_config_tracker_;
+
+  scoped_refptr<SystemURLRequestContextGetter>
+      system_url_request_context_getter_;
+
+  const base::TimeTicks creation_time_;
+
+  base::WeakPtrFactory<IOSIOThread> weak_factory_;
+
+  DISALLOW_COPY_AND_ASSIGN(IOSIOThread);
+};
+
+}  // namespace io_thread
+
+#endif  // IOS_COMPONENTS_IO_THREAD_IO_THREAD_H_
diff --git a/ios/components/io_thread/ios_io_thread.mm b/ios/components/io_thread/ios_io_thread.mm
new file mode 100644
index 0000000..59b6047
--- /dev/null
+++ b/ios/components/io_thread/ios_io_thread.mm
@@ -0,0 +1,530 @@
+// Copyright 2017 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 "ios/components/io_thread/ios_io_thread.h"
+
+#include <stddef.h>
+
+#include <utility>
+#include <vector>
+
+#include "base/bind.h"
+#include "base/bind_helpers.h"
+#include "base/compiler_specific.h"
+#include "base/debug/leak_tracker.h"
+#include "base/environment.h"
+#include "base/logging.h"
+#include "base/macros.h"
+#include "base/memory/ptr_util.h"
+#include "base/metrics/field_trial.h"
+#include "base/stl_util.h"
+#include "base/strings/string_number_conversions.h"
+#include "base/strings/string_split.h"
+#include "base/strings/string_util.h"
+#include "base/threading/sequenced_worker_pool.h"
+#include "base/threading/thread.h"
+#include "base/time/time.h"
+#include "base/trace_event/trace_event.h"
+#include "components/net_log/chrome_net_log.h"
+#include "components/network_session_configurator/network_session_configurator.h"
+#include "components/prefs/pref_service.h"
+#include "components/proxy_config/ios/proxy_service_factory.h"
+#include "components/proxy_config/pref_proxy_config_tracker.h"
+#include "components/variations/variations_associated_data.h"
+#include "components/version_info/version_info.h"
+#include "ios/web/public/user_agent.h"
+#include "ios/web/public/web_client.h"
+#include "ios/web/public/web_thread.h"
+#include "net/base/sdch_manager.h"
+#include "net/cert/cert_verifier.h"
+#include "net/cert/ct_known_logs.h"
+#include "net/cert/ct_log_verifier.h"
+#include "net/cert/ct_policy_enforcer.h"
+#include "net/cert/ct_verifier.h"
+#include "net/cert/multi_log_ct_verifier.h"
+#include "net/cert/multi_threaded_cert_verifier.h"
+#include "net/cookies/cookie_monster.h"
+#include "net/cookies/cookie_store.h"
+#include "net/dns/host_cache.h"
+#include "net/dns/host_resolver.h"
+#include "net/http/http_auth_filter.h"
+#include "net/http/http_auth_handler_factory.h"
+#include "net/http/http_auth_preferences.h"
+#include "net/http/http_network_layer.h"
+#include "net/http/http_server_properties_impl.h"
+#include "net/log/net_log_event_type.h"
+#include "net/nqe/external_estimate_provider.h"
+#include "net/nqe/network_quality_estimator.h"
+#include "net/proxy/proxy_config_service.h"
+#include "net/proxy/proxy_script_fetcher_impl.h"
+#include "net/proxy/proxy_service.h"
+#include "net/socket/tcp_client_socket.h"
+#include "net/spdy/chromium/spdy_session.h"
+#include "net/ssl/channel_id_service.h"
+#include "net/ssl/default_channel_id_store.h"
+#include "net/url_request/data_protocol_handler.h"
+#include "net/url_request/file_protocol_handler.h"
+#include "net/url_request/static_http_user_agent_settings.h"
+#include "net/url_request/url_request_context.h"
+#include "net/url_request/url_request_context_builder.h"
+#include "net/url_request/url_request_context_getter.h"
+#include "net/url_request/url_request_job_factory_impl.h"
+#include "url/url_constants.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+// The IOSIOThread object must outlive any tasks posted to the IO thread
+// before the Quit task, so base::Bind() calls are not refcounted.
+
+namespace io_thread {
+
+namespace {
+
+const char kSupportedAuthSchemes[] = "basic,digest,ntlm";
+
+// Field trial for network quality estimator. Seeds RTT and downstream
+// throughput observations with values that correspond to the connection type
+// determined by the operating system.
+const char kNetworkQualityEstimatorFieldTrialName[] = "NetworkQualityEstimator";
+
+}  // namespace
+
+// Used for the "system" URLRequestContext.
+class SystemURLRequestContext : public net::URLRequestContext {
+ public:
+  SystemURLRequestContext() = default;
+
+ private:
+  ~SystemURLRequestContext() override { AssertNoURLRequests(); }
+};
+
+std::unique_ptr<net::HostResolver> CreateGlobalHostResolver(
+    net::NetLog* net_log) {
+  TRACE_EVENT0("startup", "IOSIOThread::CreateGlobalHostResolver");
+
+  std::unique_ptr<net::HostResolver> global_host_resolver =
+      net::HostResolver::CreateSystemResolver(net::HostResolver::Options(),
+                                              net_log);
+
+  return global_host_resolver;
+}
+
+class IOSIOThread::LoggingNetworkChangeObserver
+    : public net::NetworkChangeNotifier::IPAddressObserver,
+      public net::NetworkChangeNotifier::ConnectionTypeObserver,
+      public net::NetworkChangeNotifier::NetworkChangeObserver {
+ public:
+  // |net_log| must remain valid throughout our lifetime.
+  explicit LoggingNetworkChangeObserver(net::NetLog* net_log)
+      : net_log_(net_log) {
+    net::NetworkChangeNotifier::AddIPAddressObserver(this);
+    net::NetworkChangeNotifier::AddConnectionTypeObserver(this);
+    net::NetworkChangeNotifier::AddNetworkChangeObserver(this);
+  }
+
+  ~LoggingNetworkChangeObserver() override {
+    net::NetworkChangeNotifier::RemoveIPAddressObserver(this);
+    net::NetworkChangeNotifier::RemoveConnectionTypeObserver(this);
+    net::NetworkChangeNotifier::RemoveNetworkChangeObserver(this);
+  }
+
+  // NetworkChangeNotifier::IPAddressObserver implementation.
+  void OnIPAddressChanged() override {
+    VLOG(1) << "Observed a change to the network IP addresses";
+
+    net_log_->AddGlobalEntry(
+        net::NetLogEventType::NETWORK_IP_ADDRESSES_CHANGED);
+  }
+
+  // NetworkChangeNotifier::ConnectionTypeObserver implementation.
+  void OnConnectionTypeChanged(
+      net::NetworkChangeNotifier::ConnectionType type) override {
+    std::string type_as_string =
+        net::NetworkChangeNotifier::ConnectionTypeToString(type);
+
+    VLOG(1) << "Observed a change to network connectivity state "
+            << type_as_string;
+
+    net_log_->AddGlobalEntry(
+        net::NetLogEventType::NETWORK_CONNECTIVITY_CHANGED,
+        net::NetLog::StringCallback("new_connection_type", &type_as_string));
+  }
+
+  // NetworkChangeNotifier::NetworkChangeObserver implementation.
+  void OnNetworkChanged(
+      net::NetworkChangeNotifier::ConnectionType type) override {
+    std::string type_as_string =
+        net::NetworkChangeNotifier::ConnectionTypeToString(type);
+
+    VLOG(1) << "Observed a network change to state " << type_as_string;
+
+    net_log_->AddGlobalEntry(
+        net::NetLogEventType::NETWORK_CHANGED,
+        net::NetLog::StringCallback("new_connection_type", &type_as_string));
+  }
+
+ private:
+  net::NetLog* net_log_;
+  DISALLOW_COPY_AND_ASSIGN(LoggingNetworkChangeObserver);
+};
+
+class SystemURLRequestContextGetter : public net::URLRequestContextGetter {
+ public:
+  explicit SystemURLRequestContextGetter(IOSIOThread* io_thread);
+
+  // Implementation for net::UrlRequestContextGetter.
+  net::URLRequestContext* GetURLRequestContext() override;
+  scoped_refptr<base::SingleThreadTaskRunner> GetNetworkTaskRunner()
+      const override;
+
+  // Tells the getter that the URLRequestContext is about to be shut down.
+  void Shutdown();
+
+ protected:
+  ~SystemURLRequestContextGetter() override;
+
+ private:
+  IOSIOThread* io_thread_;  // Weak pointer, owned by ApplicationContext.
+  scoped_refptr<base::SingleThreadTaskRunner> network_task_runner_;
+
+  base::debug::LeakTracker<SystemURLRequestContextGetter> leak_tracker_;
+};
+
+SystemURLRequestContextGetter::SystemURLRequestContextGetter(
+    IOSIOThread* io_thread)
+    : io_thread_(io_thread),
+      network_task_runner_(
+          web::WebThread::GetTaskRunnerForThread(web::WebThread::IO)) {}
+
+SystemURLRequestContextGetter::~SystemURLRequestContextGetter() {}
+
+net::URLRequestContext* SystemURLRequestContextGetter::GetURLRequestContext() {
+  DCHECK_CURRENTLY_ON(web::WebThread::IO);
+  if (!io_thread_)
+    return nullptr;
+  DCHECK(io_thread_->globals()->system_request_context.get());
+
+  return io_thread_->globals()->system_request_context.get();
+}
+
+scoped_refptr<base::SingleThreadTaskRunner>
+SystemURLRequestContextGetter::GetNetworkTaskRunner() const {
+  return network_task_runner_;
+}
+
+void SystemURLRequestContextGetter::Shutdown() {
+  DCHECK_CURRENTLY_ON(web::WebThread::IO);
+  io_thread_ = nullptr;
+  NotifyContextShuttingDown();
+}
+
+IOSIOThread::Globals::SystemRequestContextLeakChecker::
+    SystemRequestContextLeakChecker(Globals* globals)
+    : globals_(globals) {
+  DCHECK(globals_);
+}
+
+IOSIOThread::Globals::SystemRequestContextLeakChecker::
+    ~SystemRequestContextLeakChecker() {
+  if (globals_->system_request_context.get())
+    globals_->system_request_context->AssertNoURLRequests();
+}
+
+IOSIOThread::Globals::Globals() : system_request_context_leak_checker(this) {}
+
+IOSIOThread::Globals::~Globals() {}
+
+// |local_state| is passed in explicitly in order to (1) reduce implicit
+// dependencies and (2) make IOSIOThread more flexible for testing.
+IOSIOThread::IOSIOThread(PrefService* local_state,
+                         net_log::ChromeNetLog* net_log)
+    : net_log_(net_log),
+      globals_(nullptr),
+      creation_time_(base::TimeTicks::Now()),
+      weak_factory_(this) {
+  pref_proxy_config_tracker_ =
+      ProxyServiceFactory::CreatePrefProxyConfigTrackerOfLocalState(
+          local_state);
+  ssl_config_service_manager_.reset(
+      ssl_config::SSLConfigServiceManager::CreateDefaultManager(
+          local_state,
+          web::WebThread::GetTaskRunnerForThread(web::WebThread::IO)));
+
+  web::WebThread::SetDelegate(web::WebThread::IO, this);
+}
+
+IOSIOThread::~IOSIOThread() {
+  // This isn't needed for production code, but in tests, IOSIOThread may
+  // be multiply constructed.
+  web::WebThread::SetDelegate(web::WebThread::IO, nullptr);
+
+  pref_proxy_config_tracker_->DetachFromPrefService();
+  DCHECK(!globals_);
+}
+
+IOSIOThread::Globals* IOSIOThread::globals() {
+  DCHECK_CURRENTLY_ON(web::WebThread::IO);
+  return globals_;
+}
+
+void IOSIOThread::SetGlobalsForTesting(Globals* globals) {
+  DCHECK_CURRENTLY_ON(web::WebThread::IO);
+  DCHECK(!globals || !globals_);
+  globals_ = globals;
+}
+
+net_log::ChromeNetLog* IOSIOThread::net_log() {
+  return net_log_;
+}
+
+void IOSIOThread::ChangedToOnTheRecord() {
+  DCHECK_CURRENTLY_ON(web::WebThread::UI);
+  web::WebThread::PostTask(
+      web::WebThread::IO, FROM_HERE,
+      base::Bind(&IOSIOThread::ChangedToOnTheRecordOnIOThread,
+                 base::Unretained(this)));
+}
+
+net::URLRequestContextGetter* IOSIOThread::system_url_request_context_getter() {
+  DCHECK_CURRENTLY_ON(web::WebThread::UI);
+  if (!system_url_request_context_getter_.get()) {
+    InitSystemRequestContext();
+  }
+  return system_url_request_context_getter_.get();
+}
+
+void IOSIOThread::Init() {
+  TRACE_EVENT0("startup", "IOSIOThread::Init");
+  DCHECK_CURRENTLY_ON(web::WebThread::IO);
+
+  DCHECK(!globals_);
+  globals_ = new Globals;
+
+  // Add an observer that will emit network change events to the ChromeNetLog.
+  // Assuming NetworkChangeNotifier dispatches in FIFO order, we should be
+  // logging the network change before other IO thread consumers respond to it.
+  network_change_observer_.reset(new LoggingNetworkChangeObserver(net_log_));
+
+  // Setup the HistogramWatcher to run on the IO thread.
+  net::NetworkChangeNotifier::InitHistogramWatcher();
+
+  globals_->system_network_delegate = CreateSystemNetworkDelegate();
+  globals_->host_resolver = CreateGlobalHostResolver(net_log_);
+
+  std::map<std::string, std::string> network_quality_estimator_params;
+  variations::GetVariationParams(kNetworkQualityEstimatorFieldTrialName,
+                                 &network_quality_estimator_params);
+
+  std::unique_ptr<net::ExternalEstimateProvider> external_estimate_provider;
+  // Pass ownership.
+  globals_->network_quality_estimator.reset(new net::NetworkQualityEstimator(
+      std::move(external_estimate_provider), network_quality_estimator_params,
+      net_log_));
+
+  globals_->cert_verifier = net::CertVerifier::CreateDefault();
+
+  globals_->transport_security_state.reset(new net::TransportSecurityState());
+
+  std::vector<scoped_refptr<const net::CTLogVerifier>> ct_logs(
+      net::ct::CreateLogVerifiersForKnownLogs());
+
+  net::MultiLogCTVerifier* ct_verifier = new net::MultiLogCTVerifier();
+  globals_->cert_transparency_verifier.reset(ct_verifier);
+  // Add built-in logs
+  ct_verifier->AddLogs(ct_logs);
+
+  globals_->ct_policy_enforcer.reset(new net::CTPolicyEnforcer());
+
+  globals_->ssl_config_service = GetSSLConfigService();
+
+  CreateDefaultAuthHandlerFactory();
+  globals_->http_server_properties.reset(new net::HttpServerPropertiesImpl());
+  // In-memory cookie store.
+  globals_->system_cookie_store.reset(new net::CookieMonster(nullptr, nullptr));
+  // In-memory channel ID store.
+  globals_->system_channel_id_service.reset(
+      new net::ChannelIDService(new net::DefaultChannelIDStore(nullptr)));
+  globals_->system_cookie_store->SetChannelIDServiceID(
+      globals_->system_channel_id_service->GetUniqueID());
+  globals_->http_user_agent_settings.reset(new net::StaticHttpUserAgentSettings(
+      std::string(),
+      web::GetWebClient()->GetUserAgent(web::UserAgentType::MOBILE)));
+
+  params_.ignore_certificate_errors = false;
+  params_.enable_user_alternate_protocol_ports = false;
+
+  std::string quic_user_agent_id = GetChannelString();
+  if (!quic_user_agent_id.empty())
+    quic_user_agent_id.push_back(' ');
+  quic_user_agent_id.append(
+      version_info::GetProductNameAndVersionForUserAgent());
+  quic_user_agent_id.push_back(' ');
+  quic_user_agent_id.append(web::BuildOSCpuInfo());
+
+  network_session_configurator::ParseFieldTrials(
+      /*is_quic_force_disabled=*/false,
+      /*is_quic_force_enabled=*/false, quic_user_agent_id, &params_);
+
+  // InitSystemRequestContext turns right around and posts a task back
+  // to the IO thread, so we can't let it run until we know the IO
+  // thread has started.
+  //
+  // Note that since we are at WebThread::Init time, the UI thread
+  // is blocked waiting for the thread to start.  Therefore, posting
+  // this task to the main thread's message loop here is guaranteed to
+  // get it onto the message loop while the IOSIOThread object still
+  // exists.  However, the message might not be processed on the UI
+  // thread until after IOSIOThread is gone, so use a weak pointer.
+  web::WebThread::PostTask(web::WebThread::UI, FROM_HERE,
+                           base::Bind(&IOSIOThread::InitSystemRequestContext,
+                                      weak_factory_.GetWeakPtr()));
+}
+
+void IOSIOThread::CleanUp() {
+  system_url_request_context_getter_->Shutdown();
+  system_url_request_context_getter_ = nullptr;
+
+  // Release objects that the net::URLRequestContext could have been pointing
+  // to.
+
+  // Shutdown the HistogramWatcher on the IO thread.
+  net::NetworkChangeNotifier::ShutdownHistogramWatcher();
+
+  // This must be reset before the ChromeNetLog is destroyed.
+  network_change_observer_.reset();
+
+  system_proxy_config_service_.reset();
+
+  delete globals_;
+  globals_ = nullptr;
+
+  base::debug::LeakTracker<SystemURLRequestContextGetter>::CheckForLeaks();
+}
+
+void IOSIOThread::CreateDefaultAuthHandlerFactory() {
+  std::vector<std::string> supported_schemes =
+      base::SplitString(kSupportedAuthSchemes, ",", base::TRIM_WHITESPACE,
+                        base::SPLIT_WANT_NONEMPTY);
+  globals_->http_auth_preferences.reset(
+      new net::HttpAuthPreferences(supported_schemes, std::string()));
+  globals_->http_auth_handler_factory =
+      net::HttpAuthHandlerRegistryFactory::Create(
+          globals_->http_auth_preferences.get(), globals_->host_resolver.get());
+}
+
+void IOSIOThread::ClearHostCache() {
+  DCHECK_CURRENTLY_ON(web::WebThread::IO);
+
+  net::HostCache* host_cache = globals_->host_resolver->GetHostCache();
+  if (host_cache)
+    host_cache->clear();
+}
+
+const net::HttpNetworkSession::Params& IOSIOThread::NetworkSessionParams()
+    const {
+  return params_;
+}
+
+base::TimeTicks IOSIOThread::creation_time() const {
+  return creation_time_;
+}
+
+net::SSLConfigService* IOSIOThread::GetSSLConfigService() {
+  return ssl_config_service_manager_->Get();
+}
+
+void IOSIOThread::ChangedToOnTheRecordOnIOThread() {
+  DCHECK_CURRENTLY_ON(web::WebThread::IO);
+
+  // Clear the host cache to avoid showing entries from the OTR session
+  // in about:net-internals.
+  ClearHostCache();
+}
+
+void IOSIOThread::InitSystemRequestContext() {
+  if (system_url_request_context_getter_.get())
+    return;
+  // If we're in unit_tests, IOSIOThread may not be run.
+  if (!web::WebThread::IsMessageLoopValid(web::WebThread::IO))
+    return;
+  system_proxy_config_service_ = ProxyServiceFactory::CreateProxyConfigService(
+      pref_proxy_config_tracker_.get());
+
+  system_url_request_context_getter_ = new SystemURLRequestContextGetter(this);
+  // Safe to post an unretained this pointer, since IOSIOThread is
+  // guaranteed to outlive the IO WebThread.
+  web::WebThread::PostTask(
+      web::WebThread::IO, FROM_HERE,
+      base::Bind(&IOSIOThread::InitSystemRequestContextOnIOThread,
+                 base::Unretained(this)));
+}
+
+void IOSIOThread::InitSystemRequestContextOnIOThread() {
+  DCHECK_CURRENTLY_ON(web::WebThread::IO);
+  DCHECK(!globals_->system_proxy_service.get());
+  DCHECK(system_proxy_config_service_.get());
+
+  globals_->system_proxy_service = ProxyServiceFactory::CreateProxyService(
+      net_log_, nullptr, globals_->system_network_delegate.get(),
+      std::move(system_proxy_config_service_), true /* quick_check_enabled */);
+
+  globals_->system_request_context.reset(
+      ConstructSystemRequestContext(globals_, params_, net_log_));
+}
+
+net::URLRequestContext* IOSIOThread::ConstructSystemRequestContext(
+    IOSIOThread::Globals* globals,
+    const net::HttpNetworkSession::Params& params,
+    net::NetLog* net_log) {
+  net::URLRequestContext* context = new SystemURLRequestContext;
+  context->set_net_log(net_log);
+  context->set_host_resolver(globals->host_resolver.get());
+  context->set_cert_verifier(globals->cert_verifier.get());
+  context->set_transport_security_state(
+      globals->transport_security_state.get());
+  context->set_cert_transparency_verifier(
+      globals->cert_transparency_verifier.get());
+  context->set_ssl_config_service(globals->ssl_config_service.get());
+  context->set_http_auth_handler_factory(
+      globals->http_auth_handler_factory.get());
+  context->set_proxy_service(globals->system_proxy_service.get());
+  context->set_ct_policy_enforcer(globals->ct_policy_enforcer.get());
+
+  net::URLRequestJobFactoryImpl* system_job_factory =
+      new net::URLRequestJobFactoryImpl();
+  // Data URLs are always loaded through the system request context on iOS
+  // (due to UIWebView limitations).
+  bool set_protocol = system_job_factory->SetProtocolHandler(
+      url::kDataScheme, base::MakeUnique<net::DataProtocolHandler>());
+  DCHECK(set_protocol);
+  globals->system_url_request_job_factory.reset(system_job_factory);
+  context->set_job_factory(globals->system_url_request_job_factory.get());
+
+  context->set_cookie_store(globals->system_cookie_store.get());
+  context->set_channel_id_service(globals->system_channel_id_service.get());
+  context->set_network_delegate(globals->system_network_delegate.get());
+  context->set_http_user_agent_settings(
+      globals->http_user_agent_settings.get());
+  context->set_network_quality_estimator(
+      globals->network_quality_estimator.get());
+
+  context->set_http_server_properties(globals->http_server_properties.get());
+
+  net::HttpNetworkSession::Params system_params(params);
+  net::URLRequestContextBuilder::SetHttpNetworkSessionComponents(
+      context, &system_params);
+
+  globals->system_http_network_session.reset(
+      new net::HttpNetworkSession(system_params));
+  globals->system_http_transaction_factory.reset(
+      new net::HttpNetworkLayer(globals->system_http_network_session.get()));
+  context->set_http_transaction_factory(
+      globals->system_http_transaction_factory.get());
+
+  return context;
+}
+
+}  // namespace io_thread
diff --git a/ios/components/io_thread/ios_io_thread_unittest.mm b/ios/components/io_thread/ios_io_thread_unittest.mm
new file mode 100644
index 0000000..a01ab20
--- /dev/null
+++ b/ios/components/io_thread/ios_io_thread_unittest.mm
@@ -0,0 +1,81 @@
+// Copyright 2017 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 "ios/components/io_thread/ios_io_thread.h"
+
+#include "base/message_loop/message_loop.h"
+#include "base/run_loop.h"
+#include "components/prefs/pref_registry_simple.h"
+#include "components/prefs/pref_service.h"
+#include "components/prefs/pref_service_factory.h"
+#include "components/prefs/testing_pref_store.h"
+#include "components/proxy_config/pref_proxy_config_tracker_impl.h"
+#include "components/ssl_config/ssl_config_service_manager.h"
+#include "ios/web/public/test/test_web_thread.h"
+#include "net/test/url_request/url_request_failed_job.h"
+#include "net/url_request/url_request_filter.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "testing/gtest_mac.h"
+#include "testing/platform_test.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+namespace {
+
+// A concrete implementation of IOThread for testing.
+class TestIOThread : public io_thread::IOSIOThread {
+ public:
+  TestIOThread(PrefService* local_state, net_log::ChromeNetLog* net_log)
+      : IOSIOThread(local_state, net_log) {}
+  ~TestIOThread() override {}
+
+  // Dummy implementations of virtual methods.
+  std::unique_ptr<net::NetworkDelegate> CreateSystemNetworkDelegate() override {
+    return nullptr;
+  }
+  std::string GetChannelString() const override { return std::string(); }
+};
+
+}  // namespace
+
+class IOSIOThreadTest : public PlatformTest {
+ public:
+  IOSIOThreadTest()
+      : loop_(base::MessageLoop::TYPE_IO),
+        ui_thread_(web::WebThread::UI, &loop_),
+        io_thread_(web::WebThread::IO, &loop_) {
+    net::URLRequestFailedJob::AddUrlHandler();
+  }
+
+  ~IOSIOThreadTest() override {
+    net::URLRequestFilter::GetInstance()->ClearHandlers();
+  }
+
+ private:
+  base::MessageLoop loop_;
+  web::TestWebThread ui_thread_;
+  web::TestWebThread io_thread_;
+};
+
+// Tests the creation of an IOSIOThread and verifies that it returns a system
+// url request context.
+TEST_F(IOSIOThreadTest, AssertSystemUrlRequestContext) {
+  PrefServiceFactory pref_service_factory;
+  pref_service_factory.set_user_prefs(
+      make_scoped_refptr(new TestingPrefStore()));
+
+  scoped_refptr<PrefRegistrySimple> pref_registry = new PrefRegistrySimple;
+  PrefProxyConfigTrackerImpl::RegisterPrefs(pref_registry.get());
+  ssl_config::SSLConfigServiceManager::RegisterPrefs(pref_registry.get());
+
+  std::unique_ptr<PrefService> pref_service(
+      pref_service_factory.Create(pref_registry.get()));
+
+  std::unique_ptr<TestIOThread> test_io_thread(
+      new TestIOThread(pref_service.get(), nullptr));
+
+  ASSERT_TRUE(test_io_thread->system_url_request_context_getter());
+}
diff --git a/ios/public/provider/chrome/browser/BUILD.gn b/ios/public/provider/chrome/browser/BUILD.gn
index d28965c5..3084d52 100644
--- a/ios/public/provider/chrome/browser/BUILD.gn
+++ b/ios/public/provider/chrome/browser/BUILD.gn
@@ -6,6 +6,7 @@
 import("//ios/public/provider/chrome/browser/build_config.gni")
 
 source_set("browser") {
+  configs += [ "//build/config/compiler:enable_arc" ]
   sources = [
     "chrome_browser_provider.h",
     "chrome_browser_provider.mm",
@@ -20,6 +21,7 @@
 }
 
 source_set("test_support") {
+  configs += [ "//build/config/compiler:enable_arc" ]
   testonly = true
   sources = [
     "test_chrome_browser_provider.h",
diff --git a/ios/public/provider/chrome/browser/chrome_browser_provider.mm b/ios/public/provider/chrome/browser/chrome_browser_provider.mm
index 906ac74b..eabcc7c 100644
--- a/ios/public/provider/chrome/browser/chrome_browser_provider.mm
+++ b/ios/public/provider/chrome/browser/chrome_browser_provider.mm
@@ -9,6 +9,10 @@
 #include "base/logging.h"
 #include "components/metrics/metrics_provider.h"
 
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
 namespace ios {
 
 namespace {
diff --git a/ios/public/provider/chrome/browser/geolocation_updater_provider.mm b/ios/public/provider/chrome/browser/geolocation_updater_provider.mm
index 02f7070..a10dcc1 100644
--- a/ios/public/provider/chrome/browser/geolocation_updater_provider.mm
+++ b/ios/public/provider/chrome/browser/geolocation_updater_provider.mm
@@ -4,6 +4,10 @@
 
 #import "ios/public/provider/chrome/browser/geolocation_updater_provider.h"
 
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
 namespace ios {
 
 GeolocationUpdaterProvider::GeolocationUpdaterProvider() {
diff --git a/ios/public/provider/chrome/browser/test_chrome_browser_provider.mm b/ios/public/provider/chrome/browser/test_chrome_browser_provider.mm
index a4cebae..b61186e 100644
--- a/ios/public/provider/chrome/browser/test_chrome_browser_provider.mm
+++ b/ios/public/provider/chrome/browser/test_chrome_browser_provider.mm
@@ -7,7 +7,6 @@
 #import <UIKit/UIKit.h>
 
 #include "base/logging.h"
-#include "base/mac/scoped_nsobject.h"
 #include "base/memory/ptr_util.h"
 #include "ios/public/provider/chrome/browser/distribution/test_app_distribution_provider.h"
 #include "ios/public/provider/chrome/browser/images/test_branded_image_provider.h"
@@ -20,6 +19,10 @@
 #import "ios/public/provider/chrome/browser/voice/test_voice_search_provider.h"
 #import "ios/public/provider/chrome/browser/voice/voice_search_language.h"
 
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
 namespace ios {
 
 TestChromeBrowserProvider::TestChromeBrowserProvider()
diff --git a/ios/public/provider/chrome/browser/test_chrome_provider_initializer.mm b/ios/public/provider/chrome/browser/test_chrome_provider_initializer.mm
index 60455c1..1d7c4686 100644
--- a/ios/public/provider/chrome/browser/test_chrome_provider_initializer.mm
+++ b/ios/public/provider/chrome/browser/test_chrome_provider_initializer.mm
@@ -7,6 +7,10 @@
 #include "ios/public/provider/chrome/browser/test_chrome_browser_provider.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
 namespace ios {
 
 TestChromeProviderInitializer::TestChromeProviderInitializer() {
diff --git a/ios/web/navigation/navigation_manager_util.h b/ios/web/navigation/navigation_manager_util.h
index 0c22977..2c565a6 100644
--- a/ios/web/navigation/navigation_manager_util.h
+++ b/ios/web/navigation/navigation_manager_util.h
@@ -13,6 +13,12 @@
 class NavigationItem;
 class NavigationManager;
 
+// Returns transient, committed or pending navigation item with given
+// |unique_id| or null if item is not found. Item's unique id is retrieved via
+// GetUniqueID method.
+NavigationItem* GetItemWithUniqueID(NavigationManager* navigation_manager,
+                                    int unique_id);
+
 // Returns committed navigation item with given |unique_id| or null if item
 // is not found or it is pending or transient. Item's unique id is retrieved
 // via GetUniqueID method.
diff --git a/ios/web/navigation/navigation_manager_util.mm b/ios/web/navigation/navigation_manager_util.mm
index 296aa29..812d863 100644
--- a/ios/web/navigation/navigation_manager_util.mm
+++ b/ios/web/navigation/navigation_manager_util.mm
@@ -13,6 +13,19 @@
 
 namespace web {
 
+NavigationItem* GetItemWithUniqueID(NavigationManager* navigation_manager,
+                                    int unique_id) {
+  NavigationItem* transient_item = navigation_manager->GetTransientItem();
+  if (transient_item && transient_item->GetUniqueID() == unique_id)
+    return transient_item;
+
+  NavigationItem* pending_item = navigation_manager->GetPendingItem();
+  if (pending_item && pending_item->GetUniqueID() == unique_id)
+    return pending_item;
+
+  return GetCommittedItemWithUniqueID(navigation_manager, unique_id);
+}
+
 NavigationItem* GetCommittedItemWithUniqueID(
     NavigationManager* navigation_manager,
     int unique_id) {
diff --git a/ios/web/navigation/navigation_manager_util_unittest.mm b/ios/web/navigation/navigation_manager_util_unittest.mm
index da2297a..1b26ca6b 100644
--- a/ios/web/navigation/navigation_manager_util_unittest.mm
+++ b/ios/web/navigation/navigation_manager_util_unittest.mm
@@ -34,8 +34,8 @@
   TestBrowserState browser_state_;
 };
 
-// Tests GetCommittedItemWithUniqueID and GetCommittedItemIndexWithUniqueID
-// functions.
+// Tests GetCommittedItemWithUniqueID, GetCommittedItemIndexWithUniqueID and
+// GetItemWithUniqueID functions.
 TEST_F(NavigationManagerUtilTest, GetCommittedItemWithUniqueID) {
   // Start with NavigationManager that only has a pending item.
   manager_.AddPendingItem(
@@ -45,16 +45,26 @@
   NavigationItem* item = manager_.GetPendingItem();
   int unique_id = item->GetUniqueID();
   EXPECT_FALSE(GetCommittedItemWithUniqueID(&manager_, unique_id));
+  EXPECT_EQ(item, GetItemWithUniqueID(&manager_, unique_id));
   EXPECT_EQ(-1, GetCommittedItemIndexWithUniqueID(&manager_, unique_id));
 
   // Commit that pending item.
   [controller_ commitPendingItem];
   EXPECT_EQ(item, GetCommittedItemWithUniqueID(&manager_, unique_id));
+  EXPECT_EQ(item, GetItemWithUniqueID(&manager_, unique_id));
   EXPECT_EQ(0, GetCommittedItemIndexWithUniqueID(&manager_, unique_id));
 
   // Remove committed item.
   manager_.RemoveItemAtIndex(0);
   EXPECT_FALSE(GetCommittedItemWithUniqueID(&manager_, unique_id));
+  EXPECT_FALSE(GetItemWithUniqueID(&manager_, unique_id));
+  EXPECT_EQ(-1, GetCommittedItemIndexWithUniqueID(&manager_, unique_id));
+
+  // Add transient item.
+  [controller_ addTransientItemWithURL:GURL("http://chromium.org")];
+  item = manager_.GetTransientItem();
+  EXPECT_FALSE(GetCommittedItemWithUniqueID(&manager_, unique_id));
+  EXPECT_EQ(item, GetItemWithUniqueID(&manager_, unique_id));
   EXPECT_EQ(-1, GetCommittedItemIndexWithUniqueID(&manager_, unique_id));
 }
 
diff --git a/ios/web/web_state/ui/crw_web_controller.mm b/ios/web/web_state/ui/crw_web_controller.mm
index 9cbcf0d..ccd31a0 100644
--- a/ios/web/web_state/ui/crw_web_controller.mm
+++ b/ios/web/web_state/ui/crw_web_controller.mm
@@ -4423,20 +4423,11 @@
                           : WKNavigationResponsePolicyCancel);
 }
 
-// TODO(stuartmorgan): Move all the guesswork around these states out of the
-// superclass, and wire these up to the remaining methods.
 - (void)webView:(WKWebView*)webView
     didStartProvisionalNavigation:(WKNavigation*)navigation {
   [_navigationStates setState:web::WKNavigationState::STARTED
                 forNavigation:navigation];
 
-  if (navigation &&
-      ![[_navigationStates lastAddedNavigation] isEqual:navigation]) {
-    // |navigation| is not the latest navigation and will be cancelled.
-    // Ignore |navigation| as a new navigation will start soon.
-    return;
-  }
-
   GURL webViewURL = net::GURLWithNSURL(webView.URL);
   if (webViewURL.is_empty()) {
     // May happen on iOS9, however in didCommitNavigation: callback the URL
@@ -4444,38 +4435,52 @@
     webViewURL = GURL(url::kAboutBlankURL);
   }
 
-  // Intercept renderer-initiated navigations. If this navigation has not yet
-  // been registered, do so. loadPhase check is necessary because
-  // lastRegisteredRequestURL may be the same as the webViewURL on a new tab
-  // created by window.open (default is about::blank).
-  if (_lastRegisteredRequestURL != webViewURL ||
-      self.loadPhase != web::LOAD_REQUESTED) {
-    // Reset current WebUI if one exists.
-    [self clearWebUI];
+  web::NavigationContextImpl* context =
+      [_navigationStates contextForNavigation:navigation];
+  if (context) {
+    // This is already seen and registered navigation.
+
+    if (context->GetUrl() != webViewURL) {
+      // Update last seen URL because it may be changed by WKWebView (f.e. by
+      // performing characters escaping).
+      web::NavigationItem* item = web::GetItemWithUniqueID(
+          self.navigationManagerImpl, context->GetNavigationItemUniqueID());
+      if (item) {
+        item->SetVirtualURL(webViewURL);
+        item->SetURL(webViewURL);
+      }
+
+      _lastRegisteredRequestURL = webViewURL;
+    }
+    return;
+  }
+
+  // This is renderer-initiated navigation which was not seen before and should
+  // be registered.
+
+  [self clearWebUI];
+
+  if (web::GetWebClient()->IsAppSpecificURL(webViewURL)) {
     // Restart app specific URL loads to properly capture state.
     // TODO(crbug.com/546347): Extract necessary tasks for app specific URL
     // navigation rather than restarting the load.
-    if (web::GetWebClient()->IsAppSpecificURL(webViewURL)) {
-      // Renderer-initiated loads of WebUI can be done only from other WebUI
-      // pages. WebUI pages may have increased power and using the same web
-      // process (which may potentially be controller by an attacker) is
-      // dangerous.
-      if (web::GetWebClient()->IsAppSpecificURL(_documentURL)) {
-        [self abortLoad];
-        NavigationManager::WebLoadParams params(webViewURL);
-        [self loadWithParams:params];
-      }
-      return;
-    } else {
-      std::unique_ptr<web::NavigationContextImpl> navigationContext =
-          [self registerLoadRequestForURL:webViewURL];
-      [_navigationStates setContext:std::move(navigationContext)
-                      forNavigation:navigation];
+
+    // Renderer-initiated loads of WebUI can be done only from other WebUI
+    // pages. WebUI pages may have increased power and using the same web
+    // process (which may potentially be controller by an attacker) is
+    // dangerous.
+    if (web::GetWebClient()->IsAppSpecificURL(_documentURL)) {
+      [self abortLoad];
+      NavigationManager::WebLoadParams params(webViewURL);
+      [self loadWithParams:params];
     }
+    return;
   }
 
-  // Ensure the URL is registered and loadPhase is as expected.
-  DCHECK(_lastRegisteredRequestURL == webViewURL);
+  std::unique_ptr<web::NavigationContextImpl> navigationContext =
+      [self registerLoadRequestForURL:webViewURL];
+  [_navigationStates setContext:std::move(navigationContext)
+                  forNavigation:navigation];
   DCHECK(self.loadPhase == web::LOAD_REQUESTED);
 }
 
diff --git a/media/base/media_switches.cc b/media/base/media_switches.cc
index 9d59baa..aad4a7e 100644
--- a/media/base/media_switches.cc
+++ b/media/base/media_switches.cc
@@ -229,7 +229,7 @@
 
 // CanPlayThrough issued according to standard.
 const base::Feature kSpecCompliantCanPlayThrough{
-    "CanPlayThrough", base::FEATURE_DISABLED_BY_DEFAULT};
+    "SpecCompliantCanPlayThrough", base::FEATURE_DISABLED_BY_DEFAULT};
 
 // Use shared block-based buffering for media.
 const base::Feature kUseNewMediaCache{"use-new-media-cache",
diff --git a/native_client_sdk/doc_generated/c-api-beta.html b/native_client_sdk/doc_generated/c-api-beta.html
index be85048..e0cf31a 100644
--- a/native_client_sdk/doc_generated/c-api-beta.html
+++ b/native_client_sdk/doc_generated/c-api-beta.html
@@ -1,9 +1,17 @@
 {{+bindTo:partials.standard_nacl_article}}
 
-<span class="target" id="c-api-beta"><span id="pepper-beta-c-index"></span></span><section id="pepper-c-api-reference-beta">
+<span class="target" id="c-api-beta"><span id="pepper-beta-c-index"></span></span><b><font color="#cc0000">
+NOTE:
+Deprecation of the technologies described here has been announced
+for platforms other than ChromeOS.<br/>
+Please visit our
+<a href="/native-client/migration">migration guide</a>
+for details.
+</font></b>
+<hr/><section id="pepper-c-api-reference-beta">
 <h1 id="pepper-c-api-reference-beta">Pepper C API Reference (Beta)</h1>
-<p>This page lists the C API for Pepper 49. Apps that use this API can
-run in Chrome 49 or higher.</p>
+<p>This page lists the C API for Pepper 59. Apps that use this API can
+run in Chrome 59 or higher.</p>
 <h2 id="interfaces"><a class="reference external" href="pepper_beta/c/group___interfaces.html">Interfaces</a></h2>
 <blockquote>
 <div><ul class="small-gap">
@@ -20,7 +28,7 @@
 <li><a class="reference external" href="pepper_beta/c/struct_p_p_b___file_system__1__0.html">PPB_FileSystem</a></li>
 <li><a class="reference external" href="pepper_beta/c/struct_p_p_b___fullscreen__1__0.html">PPB_Fullscreen</a></li>
 <li><a class="reference external" href="pepper_beta/c/struct_p_p_b___gamepad__1__0.html">PPB_Gamepad</a></li>
-<li><a class="reference external" href="pepper_beta/c/struct_p_p_b___graphics2_d__1__1.html">PPB_Graphics2D</a></li>
+<li><a class="reference external" href="pepper_beta/c/struct_p_p_b___graphics2_d__1__2.html">PPB_Graphics2D</a></li>
 <li><a class="reference external" href="pepper_beta/c/struct_p_p_b___graphics3_d__1__0.html">PPB_Graphics3D</a></li>
 <li><a class="reference external" href="pepper_beta/c/struct_p_p_b___host_resolver__1__0.html">PPB_HostResolver</a></li>
 <li><a class="reference external" href="pepper_beta/c/struct_p_p_b___i_m_e_input_event__1__0.html">PPB_IMEInputEvent</a></li>
@@ -70,6 +78,7 @@
 <li><a class="reference external" href="pepper_beta/c/struct_p_p_b___video_encoder__0__2.html">PPB_VideoEncoder</a></li>
 <li><a class="reference external" href="pepper_beta/c/struct_p_p_b___video_frame__0__1.html">PPB_VideoFrame</a></li>
 <li><a class="reference external" href="pepper_beta/c/struct_p_p_b___view__1__2.html">PPB_View</a></li>
+<li><a class="reference external" href="pepper_beta/c/struct_p_p_b___vpn_provider__0__1.html">PPB_VpnProvider</a></li>
 <li><a class="reference external" href="pepper_beta/c/struct_p_p_b___web_socket__1__0.html">PPB_WebSocket</a></li>
 <li><a class="reference external" href="pepper_beta/c/struct_p_p_b___wheel_input_event__1__0.html">PPB_WheelInputEvent</a></li>
 <li><a class="reference external" href="pepper_beta/c/struct_p_p_p___graphics3_d__1__0.html">PPP_Graphics3D</a></li>
@@ -186,6 +195,7 @@
 <li><a class="reference external" href="pepper_beta/c/ppb__video__encoder_8h.html">ppb_video_encoder.h</a></li>
 <li><a class="reference external" href="pepper_beta/c/ppb__video__frame_8h.html">ppb_video_frame.h</a></li>
 <li><a class="reference external" href="pepper_beta/c/ppb__view_8h.html">ppb_view.h</a></li>
+<li><a class="reference external" href="pepper_beta/c/ppb__vpn__provider_8h.html">ppb_vpn_provider.h</a></li>
 <li><a class="reference external" href="pepper_beta/c/ppb__websocket_8h.html">ppb_websocket.h</a></li>
 <li><a class="reference external" href="pepper_beta/c/ppp_8h.html">ppp.h</a></li>
 <li><a class="reference external" href="pepper_beta/c/ppp__graphics__3d_8h.html">ppp_graphics_3d.h</a></li>
diff --git a/native_client_sdk/doc_generated/c-api-dev.html b/native_client_sdk/doc_generated/c-api-dev.html
index 603e0e4..d4991ad 100644
--- a/native_client_sdk/doc_generated/c-api-dev.html
+++ b/native_client_sdk/doc_generated/c-api-dev.html
@@ -1,9 +1,17 @@
 {{+bindTo:partials.standard_nacl_article}}
 
-<span class="target" id="c-api-dev"><span id="pepper-dev-c-index"></span></span><section id="pepper-c-api-reference-dev">
+<span class="target" id="c-api-dev"><span id="pepper-dev-c-index"></span></span><b><font color="#cc0000">
+NOTE:
+Deprecation of the technologies described here has been announced
+for platforms other than ChromeOS.<br/>
+Please visit our
+<a href="/native-client/migration">migration guide</a>
+for details.
+</font></b>
+<hr/><section id="pepper-c-api-reference-dev">
 <h1 id="pepper-c-api-reference-dev">Pepper C API Reference (Dev)</h1>
-<p>This page lists the C API for Pepper 50. Apps that use this API can
-run in Chrome 50 or higher.</p>
+<p>This page lists the C API for Pepper 60. Apps that use this API can
+run in Chrome 60 or higher.</p>
 <h2 id="interfaces"><a class="reference external" href="pepper_dev/c/group___interfaces.html">Interfaces</a></h2>
 <blockquote>
 <div><ul class="small-gap">
@@ -20,7 +28,7 @@
 <li><a class="reference external" href="pepper_dev/c/struct_p_p_b___file_system__1__0.html">PPB_FileSystem</a></li>
 <li><a class="reference external" href="pepper_dev/c/struct_p_p_b___fullscreen__1__0.html">PPB_Fullscreen</a></li>
 <li><a class="reference external" href="pepper_dev/c/struct_p_p_b___gamepad__1__0.html">PPB_Gamepad</a></li>
-<li><a class="reference external" href="pepper_dev/c/struct_p_p_b___graphics2_d__1__1.html">PPB_Graphics2D</a></li>
+<li><a class="reference external" href="pepper_dev/c/struct_p_p_b___graphics2_d__1__2.html">PPB_Graphics2D</a></li>
 <li><a class="reference external" href="pepper_dev/c/struct_p_p_b___graphics3_d__1__0.html">PPB_Graphics3D</a></li>
 <li><a class="reference external" href="pepper_dev/c/struct_p_p_b___host_resolver__1__0.html">PPB_HostResolver</a></li>
 <li><a class="reference external" href="pepper_dev/c/struct_p_p_b___i_m_e_input_event__1__0.html">PPB_IMEInputEvent</a></li>
@@ -70,6 +78,7 @@
 <li><a class="reference external" href="pepper_dev/c/struct_p_p_b___video_encoder__0__2.html">PPB_VideoEncoder</a></li>
 <li><a class="reference external" href="pepper_dev/c/struct_p_p_b___video_frame__0__1.html">PPB_VideoFrame</a></li>
 <li><a class="reference external" href="pepper_dev/c/struct_p_p_b___view__1__2.html">PPB_View</a></li>
+<li><a class="reference external" href="pepper_dev/c/struct_p_p_b___vpn_provider__0__1.html">PPB_VpnProvider</a></li>
 <li><a class="reference external" href="pepper_dev/c/struct_p_p_b___web_socket__1__0.html">PPB_WebSocket</a></li>
 <li><a class="reference external" href="pepper_dev/c/struct_p_p_b___wheel_input_event__1__0.html">PPB_WheelInputEvent</a></li>
 <li><a class="reference external" href="pepper_dev/c/struct_p_p_p___graphics3_d__1__0.html">PPP_Graphics3D</a></li>
@@ -186,6 +195,7 @@
 <li><a class="reference external" href="pepper_dev/c/ppb__video__encoder_8h.html">ppb_video_encoder.h</a></li>
 <li><a class="reference external" href="pepper_dev/c/ppb__video__frame_8h.html">ppb_video_frame.h</a></li>
 <li><a class="reference external" href="pepper_dev/c/ppb__view_8h.html">ppb_view.h</a></li>
+<li><a class="reference external" href="pepper_dev/c/ppb__vpn__provider_8h.html">ppb_vpn_provider.h</a></li>
 <li><a class="reference external" href="pepper_dev/c/ppb__websocket_8h.html">ppb_websocket.h</a></li>
 <li><a class="reference external" href="pepper_dev/c/ppp_8h.html">ppp.h</a></li>
 <li><a class="reference external" href="pepper_dev/c/ppp__graphics__3d_8h.html">ppp_graphics_3d.h</a></li>
diff --git a/native_client_sdk/doc_generated/c-api.html b/native_client_sdk/doc_generated/c-api.html
index 71132b3..c177770 100644
--- a/native_client_sdk/doc_generated/c-api.html
+++ b/native_client_sdk/doc_generated/c-api.html
@@ -1,9 +1,17 @@
 {{+bindTo:partials.standard_nacl_article}}
 
-<span class="target" id="c-api"><span id="pepper-stable-c-index"></span></span><section id="pepper-c-api-reference-stable">
+<span class="target" id="c-api"><span id="pepper-stable-c-index"></span></span><b><font color="#cc0000">
+NOTE:
+Deprecation of the technologies described here has been announced
+for platforms other than ChromeOS.<br/>
+Please visit our
+<a href="/native-client/migration">migration guide</a>
+for details.
+</font></b>
+<hr/><section id="pepper-c-api-reference-stable">
 <h1 id="pepper-c-api-reference-stable">Pepper C API Reference (Stable)</h1>
-<p>This page lists the C API for Pepper 48. Apps that use this API can
-run in Chrome 48 or higher.</p>
+<p>This page lists the C API for Pepper 58. Apps that use this API can
+run in Chrome 58 or higher.</p>
 <h2 id="interfaces"><a class="reference external" href="pepper_stable/c/group___interfaces.html">Interfaces</a></h2>
 <blockquote>
 <div><ul class="small-gap">
@@ -20,7 +28,7 @@
 <li><a class="reference external" href="pepper_stable/c/struct_p_p_b___file_system__1__0.html">PPB_FileSystem</a></li>
 <li><a class="reference external" href="pepper_stable/c/struct_p_p_b___fullscreen__1__0.html">PPB_Fullscreen</a></li>
 <li><a class="reference external" href="pepper_stable/c/struct_p_p_b___gamepad__1__0.html">PPB_Gamepad</a></li>
-<li><a class="reference external" href="pepper_stable/c/struct_p_p_b___graphics2_d__1__1.html">PPB_Graphics2D</a></li>
+<li><a class="reference external" href="pepper_stable/c/struct_p_p_b___graphics2_d__1__2.html">PPB_Graphics2D</a></li>
 <li><a class="reference external" href="pepper_stable/c/struct_p_p_b___graphics3_d__1__0.html">PPB_Graphics3D</a></li>
 <li><a class="reference external" href="pepper_stable/c/struct_p_p_b___host_resolver__1__0.html">PPB_HostResolver</a></li>
 <li><a class="reference external" href="pepper_stable/c/struct_p_p_b___i_m_e_input_event__1__0.html">PPB_IMEInputEvent</a></li>
@@ -70,6 +78,7 @@
 <li><a class="reference external" href="pepper_stable/c/struct_p_p_b___video_encoder__0__2.html">PPB_VideoEncoder</a></li>
 <li><a class="reference external" href="pepper_stable/c/struct_p_p_b___video_frame__0__1.html">PPB_VideoFrame</a></li>
 <li><a class="reference external" href="pepper_stable/c/struct_p_p_b___view__1__2.html">PPB_View</a></li>
+<li><a class="reference external" href="pepper_stable/c/struct_p_p_b___vpn_provider__0__1.html">PPB_VpnProvider</a></li>
 <li><a class="reference external" href="pepper_stable/c/struct_p_p_b___web_socket__1__0.html">PPB_WebSocket</a></li>
 <li><a class="reference external" href="pepper_stable/c/struct_p_p_b___wheel_input_event__1__0.html">PPB_WheelInputEvent</a></li>
 <li><a class="reference external" href="pepper_stable/c/struct_p_p_p___graphics3_d__1__0.html">PPP_Graphics3D</a></li>
@@ -186,6 +195,7 @@
 <li><a class="reference external" href="pepper_stable/c/ppb__video__encoder_8h.html">ppb_video_encoder.h</a></li>
 <li><a class="reference external" href="pepper_stable/c/ppb__video__frame_8h.html">ppb_video_frame.h</a></li>
 <li><a class="reference external" href="pepper_stable/c/ppb__view_8h.html">ppb_view.h</a></li>
+<li><a class="reference external" href="pepper_stable/c/ppb__vpn__provider_8h.html">ppb_vpn_provider.h</a></li>
 <li><a class="reference external" href="pepper_stable/c/ppb__websocket_8h.html">ppb_websocket.h</a></li>
 <li><a class="reference external" href="pepper_stable/c/ppp_8h.html">ppp.h</a></li>
 <li><a class="reference external" href="pepper_stable/c/ppp__graphics__3d_8h.html">ppp_graphics_3d.h</a></li>
diff --git a/native_client_sdk/doc_generated/cds2014/cpp.html b/native_client_sdk/doc_generated/cds2014/cpp.html
index a676895..702ce6e7 100644
--- a/native_client_sdk/doc_generated/cds2014/cpp.html
+++ b/native_client_sdk/doc_generated/cds2014/cpp.html
@@ -1,7 +1,15 @@
 {{+bindTo:partials.standard_nacl_article}}
 
-<section id="a-saga-of-fire-and-water-codelab">
-<span id="cds2014-cpp"></span><h1 id="a-saga-of-fire-and-water-codelab"><span id="cds2014-cpp"></span>A Saga of Fire and Water - Codelab</h1>
+<b><font color="#cc0000">
+NOTE:
+Deprecation of the technologies described here has been announced
+for platforms other than ChromeOS.<br/>
+Please visit our
+<a href="/native-client/migration">migration guide</a>
+for details.
+</font></b>
+<hr/><section id="a-saga-of-fire-and-water-codelab">
+<h1 id="a-saga-of-fire-and-water-codelab">A Saga of Fire and Water - Codelab</h1>
 <h2 id="introduction">Introduction</h2>
 <p>Learn the basics of using PPAPI to do 2D graphics from
 a C++ program running in Native Client.
diff --git a/native_client_sdk/doc_generated/cds2014/index.html b/native_client_sdk/doc_generated/cds2014/index.html
index 0ec289e7..6c69d80 100644
--- a/native_client_sdk/doc_generated/cds2014/index.html
+++ b/native_client_sdk/doc_generated/cds2014/index.html
@@ -1,7 +1,15 @@
 {{+bindTo:partials.standard_nacl_article}}
 
-<section id="chrome-dev-summit-2014-native-client-codelabs">
-<span id="cds2014"></span><h1 id="chrome-dev-summit-2014-native-client-codelabs"><span id="cds2014"></span>Chrome Dev Summit 2014 - Native Client Codelabs</h1>
+<b><font color="#cc0000">
+NOTE:
+Deprecation of the technologies described here has been announced
+for platforms other than ChromeOS.<br/>
+Please visit our
+<a href="/native-client/migration">migration guide</a>
+for details.
+</font></b>
+<hr/><section id="chrome-dev-summit-2014-native-client-codelabs">
+<h1 id="chrome-dev-summit-2014-native-client-codelabs">Chrome Dev Summit 2014 - Native Client Codelabs</h1>
 <h2 id="a-crossroads">A Crossroads</h2>
 <p>For your coding pleasure, we have two codelabs.
 Depending on your interests and prior experience,
diff --git a/native_client_sdk/doc_generated/cds2014/python.html b/native_client_sdk/doc_generated/cds2014/python.html
index 59f80a5c..b089771 100644
--- a/native_client_sdk/doc_generated/cds2014/python.html
+++ b/native_client_sdk/doc_generated/cds2014/python.html
@@ -1,7 +1,15 @@
 {{+bindTo:partials.standard_nacl_article}}
 
-<section id="what-a-difference-python-makes-codelab">
-<span id="cds2014-python"></span><h1 id="what-a-difference-python-makes-codelab"><span id="cds2014-python"></span>What a Difference Python Makes - Codelab</h1>
+<b><font color="#cc0000">
+NOTE:
+Deprecation of the technologies described here has been announced
+for platforms other than ChromeOS.<br/>
+Please visit our
+<a href="/native-client/migration">migration guide</a>
+for details.
+</font></b>
+<hr/><section id="what-a-difference-python-makes-codelab">
+<h1 id="what-a-difference-python-makes-codelab">What a Difference Python Makes - Codelab</h1>
 <h2 id="introduction">Introduction</h2>
 <p>Learn how you can use client-side Python on your webpage.
 Use the python <a href="https://docs.python.org/2/library/difflib.html"
diff --git a/native_client_sdk/doc_generated/community/index.html b/native_client_sdk/doc_generated/community/index.html
index 9f7cfb67..6bafc10 100644
--- a/native_client_sdk/doc_generated/community/index.html
+++ b/native_client_sdk/doc_generated/community/index.html
@@ -1,7 +1,15 @@
 {{+bindTo:partials.standard_nacl_article}}
 
-<section id="community">
-<span id="id1"></span><h1 id="community"><span id="id1"></span>Community</h1>
+<b><font color="#cc0000">
+NOTE:
+Deprecation of the technologies described here has been announced
+for platforms other than ChromeOS.<br/>
+Please visit our
+<a href="/native-client/migration">migration guide</a>
+for details.
+</font></b>
+<hr/><section id="id1">
+<h1 id="id1">Community</h1>
 <p>This section contains pages related to the Native Client <em>community</em> - both
 <strong>implementors</strong> (contributors to the <a class="reference external" href="https://code.google.com/p/nativeclient/">open-source Native Client project</a>) and
 <strong>developers</strong>, who use Native Client to develop web applications.</p>
diff --git a/native_client_sdk/doc_generated/community/security-contest/contest-announcement.html b/native_client_sdk/doc_generated/community/security-contest/contest-announcement.html
index 69c32f1..31f78b4 100644
--- a/native_client_sdk/doc_generated/community/security-contest/contest-announcement.html
+++ b/native_client_sdk/doc_generated/community/security-contest/contest-announcement.html
@@ -1,7 +1,15 @@
 {{+bindTo:partials.standard_nacl_article}}
 
-<section id="native-client-security-contest">
-<span id="contest-announcement"></span><h1 id="native-client-security-contest"><span id="contest-announcement"></span>Native Client Security Contest</h1>
+<b><font color="#cc0000">
+NOTE:
+Deprecation of the technologies described here has been announced
+for platforms other than ChromeOS.<br/>
+Please visit our
+<a href="/native-client/migration">migration guide</a>
+for details.
+</font></b>
+<hr/><section id="native-client-security-contest">
+<h1 id="native-client-security-contest">Native Client Security Contest</h1>
 <div class="contents local" id="contents" style="display: none">
 <ul class="small-gap">
 <li><a class="reference internal" href="#what-it-is" id="id1">What it is</a></li>
diff --git a/native_client_sdk/doc_generated/community/security-contest/contest-faq.html b/native_client_sdk/doc_generated/community/security-contest/contest-faq.html
index 2c782401..212684e 100644
--- a/native_client_sdk/doc_generated/community/security-contest/contest-faq.html
+++ b/native_client_sdk/doc_generated/community/security-contest/contest-faq.html
@@ -1,7 +1,15 @@
 {{+bindTo:partials.standard_nacl_article}}
 
-<section id="security-contest-faq">
-<span id="contest-faq"></span><h1 id="security-contest-faq"><span id="contest-faq"></span>Security Contest FAQ</h1>
+<b><font color="#cc0000">
+NOTE:
+Deprecation of the technologies described here has been announced
+for platforms other than ChromeOS.<br/>
+Please visit our
+<a href="/native-client/migration">migration guide</a>
+for details.
+</font></b>
+<hr/><section id="security-contest-faq">
+<h1 id="security-contest-faq">Security Contest FAQ</h1>
 <aside class="caution">
 The Native Client Security Contest has ended&#8212;check out the
 <a class="reference internal" href="/native-client/community/security-contest/index.html#contest-winners"><em>winning submissions</em></a>.  We welcome your
diff --git a/native_client_sdk/doc_generated/community/security-contest/contest-terms.html b/native_client_sdk/doc_generated/community/security-contest/contest-terms.html
index a42926e..b80c641 100644
--- a/native_client_sdk/doc_generated/community/security-contest/contest-terms.html
+++ b/native_client_sdk/doc_generated/community/security-contest/contest-terms.html
@@ -1,7 +1,15 @@
 {{+bindTo:partials.standard_nacl_article}}
 
-<section id="security-contest-terms-and-conditions">
-<span id="contest-terms"></span><h1 id="security-contest-terms-and-conditions"><span id="contest-terms"></span>Security Contest Terms and Conditions</h1>
+<b><font color="#cc0000">
+NOTE:
+Deprecation of the technologies described here has been announced
+for platforms other than ChromeOS.<br/>
+Please visit our
+<a href="/native-client/migration">migration guide</a>
+for details.
+</font></b>
+<hr/><section id="security-contest-terms-and-conditions">
+<h1 id="security-contest-terms-and-conditions">Security Contest Terms and Conditions</h1>
 <aside class="caution">
 The Native Client Security Contest has ended&#8212;check out the
 <a class="reference internal" href="/native-client/community/security-contest/index.html#contest-winners"><em>winning submissions</em></a>.  We welcome your
diff --git a/native_client_sdk/doc_generated/community/security-contest/index.html b/native_client_sdk/doc_generated/community/security-contest/index.html
index 2ebe1d8..f33d95d 100644
--- a/native_client_sdk/doc_generated/community/security-contest/index.html
+++ b/native_client_sdk/doc_generated/community/security-contest/index.html
@@ -1,7 +1,15 @@
 {{+bindTo:partials.standard_nacl_article}}
 
-<section id="security-contest-archive">
-<span id="contest-archive"></span><h1 id="security-contest-archive"><span id="contest-archive"></span>Security Contest Archive</h1>
+<b><font color="#cc0000">
+NOTE:
+Deprecation of the technologies described here has been announced
+for platforms other than ChromeOS.<br/>
+Please visit our
+<a href="/native-client/migration">migration guide</a>
+for details.
+</font></b>
+<hr/><section id="security-contest-archive">
+<h1 id="security-contest-archive">Security Contest Archive</h1>
 <div class="contents local" id="contents" style="display: none">
 <ul class="small-gap">
 <li><a class="reference internal" href="#contest-overview" id="id2">Contest overview</a></li>
diff --git a/native_client_sdk/doc_generated/cpp-api-beta.html b/native_client_sdk/doc_generated/cpp-api-beta.html
index 8a556731..005402d 100644
--- a/native_client_sdk/doc_generated/cpp-api-beta.html
+++ b/native_client_sdk/doc_generated/cpp-api-beta.html
@@ -1,9 +1,17 @@
 {{+bindTo:partials.standard_nacl_article}}
 
-<span class="target" id="cpp-api-beta"><span id="pepper-beta-cpp-index"></span></span><section id="pepper-c-api-reference-beta">
+<span class="target" id="cpp-api-beta"><span id="pepper-beta-cpp-index"></span></span><b><font color="#cc0000">
+NOTE:
+Deprecation of the technologies described here has been announced
+for platforms other than ChromeOS.<br/>
+Please visit our
+<a href="/native-client/migration">migration guide</a>
+for details.
+</font></b>
+<hr/><section id="pepper-c-api-reference-beta">
 <h1 id="pepper-c-api-reference-beta">Pepper C++ API Reference (Beta)</h1>
-<p>This page lists the C++ API for Pepper 49. Apps that use this API can
-run in Chrome 49 or higher.</p>
+<p>This page lists the C++ API for Pepper 59. Apps that use this API can
+run in Chrome 59 or higher.</p>
 <h2 id="classes"><a class="reference external" href="pepper_beta/cpp/inherits.html">Classes</a></h2>
 <blockquote>
 <div><ul class="small-gap">
@@ -68,6 +76,7 @@
 <li><a class="reference external" href="pepper_beta/cpp/classpp_1_1_video_encoder.html">VideoEncoder</a></li>
 <li><a class="reference external" href="pepper_beta/cpp/classpp_1_1_video_frame.html">VideoFrame</a></li>
 <li><a class="reference external" href="pepper_beta/cpp/classpp_1_1_view.html">View</a></li>
+<li><a class="reference external" href="pepper_beta/cpp/classpp_1_1_vpn_provider.html">VpnProvider</a></li>
 <li><a class="reference external" href="pepper_beta/cpp/classpp_1_1_web_socket.html">WebSocket</a></li>
 <li><a class="reference external" href="pepper_beta/cpp/classpp_1_1_wheel_input_event.html">WheelInputEvent</a></li>
 <li><a class="reference external" href="pepper_beta/cpp/classpp_1_1internal_1_1_directory_entry_array_output_adapter_with_storage.html">Internal::DirectoryEntryArrayOutputAdapterWithStorage</a></li>
@@ -132,6 +141,7 @@
 <li><a class="reference external" href="pepper_beta/cpp/video__encoder_8h.html">video_encoder.h</a></li>
 <li><a class="reference external" href="pepper_beta/cpp/video__frame_8h.html">video_frame.h</a></li>
 <li><a class="reference external" href="pepper_beta/cpp/view_8h.html">view.h</a></li>
+<li><a class="reference external" href="pepper_beta/cpp/vpn__provider_8h.html">vpn_provider.h</a></li>
 <li><a class="reference external" href="pepper_beta/cpp/websocket_8h.html">websocket.h</a></li>
 </ul>
 </div></blockquote>
diff --git a/native_client_sdk/doc_generated/cpp-api-dev.html b/native_client_sdk/doc_generated/cpp-api-dev.html
index a3b6118..23b29e7 100644
--- a/native_client_sdk/doc_generated/cpp-api-dev.html
+++ b/native_client_sdk/doc_generated/cpp-api-dev.html
@@ -1,9 +1,17 @@
 {{+bindTo:partials.standard_nacl_article}}
 
-<span class="target" id="cpp-api-dev"><span id="pepper-dev-cpp-index"></span></span><section id="pepper-c-api-reference-dev">
+<span class="target" id="cpp-api-dev"><span id="pepper-dev-cpp-index"></span></span><b><font color="#cc0000">
+NOTE:
+Deprecation of the technologies described here has been announced
+for platforms other than ChromeOS.<br/>
+Please visit our
+<a href="/native-client/migration">migration guide</a>
+for details.
+</font></b>
+<hr/><section id="pepper-c-api-reference-dev">
 <h1 id="pepper-c-api-reference-dev">Pepper C++ API Reference (Dev)</h1>
-<p>This page lists the C++ API for Pepper 50. Apps that use this API can
-run in Chrome 50 or higher.</p>
+<p>This page lists the C++ API for Pepper 60. Apps that use this API can
+run in Chrome 60 or higher.</p>
 <h2 id="classes"><a class="reference external" href="pepper_dev/cpp/inherits.html">Classes</a></h2>
 <blockquote>
 <div><ul class="small-gap">
@@ -68,6 +76,7 @@
 <li><a class="reference external" href="pepper_dev/cpp/classpp_1_1_video_encoder.html">VideoEncoder</a></li>
 <li><a class="reference external" href="pepper_dev/cpp/classpp_1_1_video_frame.html">VideoFrame</a></li>
 <li><a class="reference external" href="pepper_dev/cpp/classpp_1_1_view.html">View</a></li>
+<li><a class="reference external" href="pepper_dev/cpp/classpp_1_1_vpn_provider.html">VpnProvider</a></li>
 <li><a class="reference external" href="pepper_dev/cpp/classpp_1_1_web_socket.html">WebSocket</a></li>
 <li><a class="reference external" href="pepper_dev/cpp/classpp_1_1_wheel_input_event.html">WheelInputEvent</a></li>
 <li><a class="reference external" href="pepper_dev/cpp/classpp_1_1internal_1_1_directory_entry_array_output_adapter_with_storage.html">Internal::DirectoryEntryArrayOutputAdapterWithStorage</a></li>
@@ -132,6 +141,7 @@
 <li><a class="reference external" href="pepper_dev/cpp/video__encoder_8h.html">video_encoder.h</a></li>
 <li><a class="reference external" href="pepper_dev/cpp/video__frame_8h.html">video_frame.h</a></li>
 <li><a class="reference external" href="pepper_dev/cpp/view_8h.html">view.h</a></li>
+<li><a class="reference external" href="pepper_dev/cpp/vpn__provider_8h.html">vpn_provider.h</a></li>
 <li><a class="reference external" href="pepper_dev/cpp/websocket_8h.html">websocket.h</a></li>
 </ul>
 </div></blockquote>
diff --git a/native_client_sdk/doc_generated/cpp-api.html b/native_client_sdk/doc_generated/cpp-api.html
index 18ddb8a..4d49d84d9 100644
--- a/native_client_sdk/doc_generated/cpp-api.html
+++ b/native_client_sdk/doc_generated/cpp-api.html
@@ -1,9 +1,17 @@
 {{+bindTo:partials.standard_nacl_article}}
 
-<span class="target" id="cpp-api"><span id="pepper-stable-cpp-index"></span></span><section id="pepper-c-api-reference-stable">
+<span class="target" id="cpp-api"><span id="pepper-stable-cpp-index"></span></span><b><font color="#cc0000">
+NOTE:
+Deprecation of the technologies described here has been announced
+for platforms other than ChromeOS.<br/>
+Please visit our
+<a href="/native-client/migration">migration guide</a>
+for details.
+</font></b>
+<hr/><section id="pepper-c-api-reference-stable">
 <h1 id="pepper-c-api-reference-stable">Pepper C++ API Reference (Stable)</h1>
-<p>This page lists the C++ API for Pepper 48. Apps that use this API can
-run in Chrome 48 or higher.</p>
+<p>This page lists the C++ API for Pepper 58. Apps that use this API can
+run in Chrome 58 or higher.</p>
 <h2 id="classes"><a class="reference external" href="pepper_stable/cpp/inherits.html">Classes</a></h2>
 <blockquote>
 <div><ul class="small-gap">
@@ -68,6 +76,7 @@
 <li><a class="reference external" href="pepper_stable/cpp/classpp_1_1_video_encoder.html">VideoEncoder</a></li>
 <li><a class="reference external" href="pepper_stable/cpp/classpp_1_1_video_frame.html">VideoFrame</a></li>
 <li><a class="reference external" href="pepper_stable/cpp/classpp_1_1_view.html">View</a></li>
+<li><a class="reference external" href="pepper_stable/cpp/classpp_1_1_vpn_provider.html">VpnProvider</a></li>
 <li><a class="reference external" href="pepper_stable/cpp/classpp_1_1_web_socket.html">WebSocket</a></li>
 <li><a class="reference external" href="pepper_stable/cpp/classpp_1_1_wheel_input_event.html">WheelInputEvent</a></li>
 <li><a class="reference external" href="pepper_stable/cpp/classpp_1_1internal_1_1_directory_entry_array_output_adapter_with_storage.html">Internal::DirectoryEntryArrayOutputAdapterWithStorage</a></li>
@@ -132,6 +141,7 @@
 <li><a class="reference external" href="pepper_stable/cpp/video__encoder_8h.html">video_encoder.h</a></li>
 <li><a class="reference external" href="pepper_stable/cpp/video__frame_8h.html">video_frame.h</a></li>
 <li><a class="reference external" href="pepper_stable/cpp/view_8h.html">view.h</a></li>
+<li><a class="reference external" href="pepper_stable/cpp/vpn__provider_8h.html">vpn_provider.h</a></li>
 <li><a class="reference external" href="pepper_stable/cpp/websocket_8h.html">websocket.h</a></li>
 </ul>
 </div></blockquote>
diff --git a/native_client_sdk/doc_generated/devguide/coding/3D-graphics.html b/native_client_sdk/doc_generated/devguide/coding/3D-graphics.html
index c2b49f81..272b8a1 100644
--- a/native_client_sdk/doc_generated/devguide/coding/3D-graphics.html
+++ b/native_client_sdk/doc_generated/devguide/coding/3D-graphics.html
@@ -1,7 +1,15 @@
 {{+bindTo:partials.standard_nacl_article}}
 
-<section id="d-graphics">
-<span id="devguide-coding-3d-graphics"></span><h1 id="d-graphics"><span id="devguide-coding-3d-graphics"></span>3D Graphics</h1>
+<b><font color="#cc0000">
+NOTE:
+Deprecation of the technologies described here has been announced
+for platforms other than ChromeOS.<br/>
+Please visit our
+<a href="/native-client/migration">migration guide</a>
+for details.
+</font></b>
+<hr/><section id="d-graphics">
+<h1 id="d-graphics">3D Graphics</h1>
 <p>Native Client applications use the <a class="reference external" href="http://en.wikipedia.org/wiki/OpenGL_ES">OpenGL ES 2.0</a> API for 3D rendering. This document
 describes how to call the OpenGL ES 2.0 interface in a Native Client module and
 how to build an efficient rendering loop. It also explains how to validate GPU
diff --git a/native_client_sdk/doc_generated/devguide/coding/application-structure.html b/native_client_sdk/doc_generated/devguide/coding/application-structure.html
index f53fd4e..2ce113a4 100644
--- a/native_client_sdk/doc_generated/devguide/coding/application-structure.html
+++ b/native_client_sdk/doc_generated/devguide/coding/application-structure.html
@@ -1,7 +1,15 @@
 {{+bindTo:partials.standard_nacl_article}}
 
-<section id="application-structure">
-<span id="devcycle-application-structure"></span><h1 id="application-structure"><span id="devcycle-application-structure"></span>Application Structure</h1>
+<b><font color="#cc0000">
+NOTE:
+Deprecation of the technologies described here has been announced
+for platforms other than ChromeOS.<br/>
+Please visit our
+<a href="/native-client/migration">migration guide</a>
+for details.
+</font></b>
+<hr/><section id="application-structure">
+<h1 id="application-structure">Application Structure</h1>
 <div class="contents local" id="contents" style="display: none">
 <ul class="small-gap">
 <li><a class="reference internal" href="#application-components" id="id1">Application components</a></li>
diff --git a/native_client_sdk/doc_generated/devguide/coding/audio.html b/native_client_sdk/doc_generated/devguide/coding/audio.html
index 6177b5c1..cbdb7d4 100644
--- a/native_client_sdk/doc_generated/devguide/coding/audio.html
+++ b/native_client_sdk/doc_generated/devguide/coding/audio.html
@@ -1,7 +1,15 @@
 {{+bindTo:partials.standard_nacl_article}}
 
-<section id="audio">
-<span id="devguide-coding-audio"></span><h1 id="audio"><span id="devguide-coding-audio"></span>Audio</h1>
+<b><font color="#cc0000">
+NOTE:
+Deprecation of the technologies described here has been announced
+for platforms other than ChromeOS.<br/>
+Please visit our
+<a href="/native-client/migration">migration guide</a>
+for details.
+</font></b>
+<hr/><section id="audio">
+<h1 id="audio">Audio</h1>
 <div class="contents local" id="contents" style="display: none">
 <ul class="small-gap">
 <li><a class="reference internal" href="#reference-information" id="id1">Reference information</a></li>
diff --git a/native_client_sdk/doc_generated/devguide/coding/file-io.html b/native_client_sdk/doc_generated/devguide/coding/file-io.html
index 571415f..6288691 100644
--- a/native_client_sdk/doc_generated/devguide/coding/file-io.html
+++ b/native_client_sdk/doc_generated/devguide/coding/file-io.html
@@ -1,7 +1,15 @@
 {{+bindTo:partials.standard_nacl_article}}
 
-<section id="file-i-o">
-<span id="devguide-coding-fileio"></span><h1 id="file-i-o"><span id="devguide-coding-fileio"></span>File I/O</h1>
+<b><font color="#cc0000">
+NOTE:
+Deprecation of the technologies described here has been announced
+for platforms other than ChromeOS.<br/>
+Please visit our
+<a href="/native-client/migration">migration guide</a>
+for details.
+</font></b>
+<hr/><section id="file-i-o">
+<h1 id="file-i-o">File I/O</h1>
 <div class="contents local" id="contents" style="display: none">
 <ul class="small-gap">
 <li><a class="reference internal" href="#introduction" id="id2">Introduction</a></li>
diff --git a/native_client_sdk/doc_generated/devguide/coding/index.html b/native_client_sdk/doc_generated/devguide/coding/index.html
index 376f505..a2ff8e4 100644
--- a/native_client_sdk/doc_generated/devguide/coding/index.html
+++ b/native_client_sdk/doc_generated/devguide/coding/index.html
@@ -1,7 +1,15 @@
 {{+bindTo:partials.standard_nacl_article}}
 
-<section id="coding-your-application">
-<span id="coding"></span><h1 id="coding-your-application"><span id="coding"></span>Coding Your Application</h1>
+<b><font color="#cc0000">
+NOTE:
+Deprecation of the technologies described here has been announced
+for platforms other than ChromeOS.<br/>
+Please visit our
+<a href="/native-client/migration">migration guide</a>
+for details.
+</font></b>
+<hr/><section id="coding-your-application">
+<h1 id="coding-your-application">Coding Your Application</h1>
 <p>This section of the Developer&#8217;s Guide describes important concepts that would be
 useful to understand in order to code your application&#8212;e.g., how an
 application is structured, and how to use the Pepper APIs.</p>
diff --git a/native_client_sdk/doc_generated/devguide/coding/message-system.html b/native_client_sdk/doc_generated/devguide/coding/message-system.html
index f3013ae..87975e9 100644
--- a/native_client_sdk/doc_generated/devguide/coding/message-system.html
+++ b/native_client_sdk/doc_generated/devguide/coding/message-system.html
@@ -1,7 +1,15 @@
 {{+bindTo:partials.standard_nacl_article}}
 
-<section id="messaging-system">
-<span id="message-system"></span><h1 id="messaging-system"><span id="message-system"></span>Messaging System</h1>
+<b><font color="#cc0000">
+NOTE:
+Deprecation of the technologies described here has been announced
+for platforms other than ChromeOS.<br/>
+Please visit our
+<a href="/native-client/migration">migration guide</a>
+for details.
+</font></b>
+<hr/><section id="messaging-system">
+<h1 id="messaging-system">Messaging System</h1>
 <div class="contents local" id="contents" style="display: none">
 <ul class="small-gap">
 <li><a class="reference internal" href="#reference-information" id="id2">Reference information</a></li>
diff --git a/native_client_sdk/doc_generated/devguide/coding/nacl_io.html b/native_client_sdk/doc_generated/devguide/coding/nacl_io.html
index 238cead..ea6a8c23 100644
--- a/native_client_sdk/doc_generated/devguide/coding/nacl_io.html
+++ b/native_client_sdk/doc_generated/devguide/coding/nacl_io.html
@@ -1,7 +1,15 @@
 {{+bindTo:partials.standard_nacl_article}}
 
-<section id="the-nacl-io-library">
-<span id="nacl-io"></span><h1 id="the-nacl-io-library"><span id="nacl-io"></span>The nacl_io Library</h1>
+<b><font color="#cc0000">
+NOTE:
+Deprecation of the technologies described here has been announced
+for platforms other than ChromeOS.<br/>
+Please visit our
+<a href="/native-client/migration">migration guide</a>
+for details.
+</font></b>
+<hr/><section id="the-nacl-io-library">
+<h1 id="the-nacl-io-library">The nacl_io Library</h1>
 <div class="contents local" id="contents" style="display: none">
 <ul class="small-gap">
 <li><a class="reference internal" href="#introduction" id="id1">Introduction</a></li>
diff --git a/native_client_sdk/doc_generated/devguide/coding/native-client-modules.html b/native_client_sdk/doc_generated/devguide/coding/native-client-modules.html
index a429187..f719bd1 100644
--- a/native_client_sdk/doc_generated/devguide/coding/native-client-modules.html
+++ b/native_client_sdk/doc_generated/devguide/coding/native-client-modules.html
@@ -1,7 +1,15 @@
 {{+bindTo:partials.standard_nacl_article}}
 
-<section id="native-client-modules">
-<span id="devcycle-native-client-modules"></span><h1 id="native-client-modules"><span id="devcycle-native-client-modules"></span>Native Client Modules</h1>
+<b><font color="#cc0000">
+NOTE:
+Deprecation of the technologies described here has been announced
+for platforms other than ChromeOS.<br/>
+Please visit our
+<a href="/native-client/migration">migration guide</a>
+for details.
+</font></b>
+<hr/><section id="native-client-modules">
+<h1 id="native-client-modules">Native Client Modules</h1>
 <p>This document describes the classes and functions that you need to implement in
 a Native Client module in order for Chrome to load, initialize, and run it.  The
 requirements are the same regardless of whether or not the module uses PNaCl,
diff --git a/native_client_sdk/doc_generated/devguide/coding/progress-events.html b/native_client_sdk/doc_generated/devguide/coding/progress-events.html
index 70adb6cf..8cf6869 100644
--- a/native_client_sdk/doc_generated/devguide/coding/progress-events.html
+++ b/native_client_sdk/doc_generated/devguide/coding/progress-events.html
@@ -1,7 +1,15 @@
 {{+bindTo:partials.standard_nacl_article}}
 
-<section id="progress-events">
-<span id="devcycle-progress-events"></span><h1 id="progress-events"><span id="devcycle-progress-events"></span>Progress Events</h1>
+<b><font color="#cc0000">
+NOTE:
+Deprecation of the technologies described here has been announced
+for platforms other than ChromeOS.<br/>
+Please visit our
+<a href="/native-client/migration">migration guide</a>
+for details.
+</font></b>
+<hr/><section id="progress-events">
+<h1 id="progress-events">Progress Events</h1>
 <div class="contents local" id="contents" style="display: none">
 <ul class="small-gap">
 <li><a class="reference internal" href="#module-loading-and-progress-events" id="id3">Module loading and progress events</a></li>
diff --git a/native_client_sdk/doc_generated/devguide/coding/url-loading.html b/native_client_sdk/doc_generated/devguide/coding/url-loading.html
index 895dc004..4d035f8 100644
--- a/native_client_sdk/doc_generated/devguide/coding/url-loading.html
+++ b/native_client_sdk/doc_generated/devguide/coding/url-loading.html
@@ -1,7 +1,15 @@
 {{+bindTo:partials.standard_nacl_article}}
 
-<section id="url-loading">
-<span id="devguide-coding-url-loading"></span><h1 id="url-loading"><span id="devguide-coding-url-loading"></span>URL Loading</h1>
+<b><font color="#cc0000">
+NOTE:
+Deprecation of the technologies described here has been announced
+for platforms other than ChromeOS.<br/>
+Please visit our
+<a href="/native-client/migration">migration guide</a>
+for details.
+</font></b>
+<hr/><section id="url-loading">
+<h1 id="url-loading">URL Loading</h1>
 <div class="contents local" id="contents" style="display: none">
 <ul class="small-gap">
 <li><a class="reference internal" href="#introduction" id="id1">Introduction</a></li>
diff --git a/native_client_sdk/doc_generated/devguide/coding/view-focus-input-events.html b/native_client_sdk/doc_generated/devguide/coding/view-focus-input-events.html
index 2b32e79e..59e2e77db 100644
--- a/native_client_sdk/doc_generated/devguide/coding/view-focus-input-events.html
+++ b/native_client_sdk/doc_generated/devguide/coding/view-focus-input-events.html
@@ -1,7 +1,15 @@
 {{+bindTo:partials.standard_nacl_article}}
 
-<section id="view-change-focus-and-input-events">
-<span id="view-focus-input-events"></span><h1 id="view-change-focus-and-input-events"><span id="view-focus-input-events"></span>View Change, Focus, and Input Events</h1>
+<b><font color="#cc0000">
+NOTE:
+Deprecation of the technologies described here has been announced
+for platforms other than ChromeOS.<br/>
+Please visit our
+<a href="/native-client/migration">migration guide</a>
+for details.
+</font></b>
+<hr/><section id="view-change-focus-and-input-events">
+<h1 id="view-change-focus-and-input-events">View Change, Focus, and Input Events</h1>
 <div class="contents local" id="contents" style="display: none">
 <ul class="small-gap">
 <li><a class="reference internal" href="#overview" id="id2">Overview</a></li>
diff --git a/native_client_sdk/doc_generated/devguide/devcycle/building.html b/native_client_sdk/doc_generated/devguide/devcycle/building.html
index 5a6118f..5c6a5ff 100644
--- a/native_client_sdk/doc_generated/devguide/devcycle/building.html
+++ b/native_client_sdk/doc_generated/devguide/devcycle/building.html
@@ -1,7 +1,15 @@
 {{+bindTo:partials.standard_nacl_article}}
 
-<section id="building">
-<span id="devcycle-building"></span><h1 id="building"><span id="devcycle-building"></span>Building</h1>
+<b><font color="#cc0000">
+NOTE:
+Deprecation of the technologies described here has been announced
+for platforms other than ChromeOS.<br/>
+Please visit our
+<a href="/native-client/migration">migration guide</a>
+for details.
+</font></b>
+<hr/><section id="building">
+<h1 id="building">Building</h1>
 <div class="contents local" id="table-of-contents" style="display: none">
 <p class="topic-title first">Table Of Contents</p>
 <ul class="small-gap">
diff --git a/native_client_sdk/doc_generated/devguide/devcycle/debugging.html b/native_client_sdk/doc_generated/devguide/devcycle/debugging.html
index 300dffc9..89e4f63 100644
--- a/native_client_sdk/doc_generated/devguide/devcycle/debugging.html
+++ b/native_client_sdk/doc_generated/devguide/devcycle/debugging.html
@@ -1,7 +1,15 @@
 {{+bindTo:partials.standard_nacl_article}}
 
-<section id="debugging">
-<span id="devcycle-debugging"></span><h1 id="debugging"><span id="devcycle-debugging"></span>Debugging</h1>
+<b><font color="#cc0000">
+NOTE:
+Deprecation of the technologies described here has been announced
+for platforms other than ChromeOS.<br/>
+Please visit our
+<a href="/native-client/migration">migration guide</a>
+for details.
+</font></b>
+<hr/><section id="debugging">
+<h1 id="debugging">Debugging</h1>
 <p>This document describes tools and techniques you can use to debug, monitor,
 and measure your application&#8217;s performance.</p>
 <div class="contents local" id="table-of-contents" style="display: none">
diff --git a/native_client_sdk/doc_generated/devguide/devcycle/dynamic-loading.html b/native_client_sdk/doc_generated/devguide/devcycle/dynamic-loading.html
index c486fb6..70e209f 100644
--- a/native_client_sdk/doc_generated/devguide/devcycle/dynamic-loading.html
+++ b/native_client_sdk/doc_generated/devguide/devcycle/dynamic-loading.html
@@ -1,6 +1,14 @@
 {{+bindTo:partials.standard_nacl_article}}
 
-<section id="dynamic-linking-and-loading-with-glibc">
+<b><font color="#cc0000">
+NOTE:
+Deprecation of the technologies described here has been announced
+for platforms other than ChromeOS.<br/>
+Please visit our
+<a href="/native-client/migration">migration guide</a>
+for details.
+</font></b>
+<hr/><section id="dynamic-linking-and-loading-with-glibc">
 <h1 id="dynamic-linking-and-loading-with-glibc">Dynamic Linking and Loading with glibc</h1>
 <div class="contents local" id="contents" style="display: none">
 <ul class="small-gap">
diff --git a/native_client_sdk/doc_generated/devguide/devcycle/index.html b/native_client_sdk/doc_generated/devguide/devcycle/index.html
index 348decc..4b8409a3 100644
--- a/native_client_sdk/doc_generated/devguide/devcycle/index.html
+++ b/native_client_sdk/doc_generated/devguide/devcycle/index.html
@@ -1,7 +1,15 @@
 {{+bindTo:partials.standard_nacl_article}}
 
-<section id="development-cycle">
-<span id="devcycle"></span><h1 id="development-cycle"><span id="devcycle"></span>Development Cycle</h1>
+<b><font color="#cc0000">
+NOTE:
+Deprecation of the technologies described here has been announced
+for platforms other than ChromeOS.<br/>
+Please visit our
+<a href="/native-client/migration">migration guide</a>
+for details.
+</font></b>
+<hr/><section id="development-cycle">
+<h1 id="development-cycle">Development Cycle</h1>
 <p>This section of the Developer&#8217;s Guide provides information about how to
 compile, run, and debug Native Client applications.</p>
 </section>
diff --git a/native_client_sdk/doc_generated/devguide/devcycle/running.html b/native_client_sdk/doc_generated/devguide/devcycle/running.html
index c501a36..1bf19cf 100644
--- a/native_client_sdk/doc_generated/devguide/devcycle/running.html
+++ b/native_client_sdk/doc_generated/devguide/devcycle/running.html
@@ -1,7 +1,15 @@
 {{+bindTo:partials.standard_nacl_article}}
 
-<section id="running">
-<span id="devcycle-running"></span><h1 id="running"><span id="devcycle-running"></span>Running</h1>
+<b><font color="#cc0000">
+NOTE:
+Deprecation of the technologies described here has been announced
+for platforms other than ChromeOS.<br/>
+Please visit our
+<a href="/native-client/migration">migration guide</a>
+for details.
+</font></b>
+<hr/><section id="running">
+<h1 id="running">Running</h1>
 <div class="contents local" id="contents" style="display: none">
 <ul class="small-gap">
 <li><a class="reference internal" href="#introduction" id="id6">Introduction</a></li>
diff --git a/native_client_sdk/doc_generated/devguide/devcycle/vs-addin.html b/native_client_sdk/doc_generated/devguide/devcycle/vs-addin.html
index e4fd5d7..b556194 100644
--- a/native_client_sdk/doc_generated/devguide/devcycle/vs-addin.html
+++ b/native_client_sdk/doc_generated/devguide/devcycle/vs-addin.html
@@ -1,7 +1,15 @@
 {{+bindTo:partials.standard_nacl_article}}
 
-<section id="debugging-with-visual-studio">
-<span id="devcycle-vs-addin"></span><h1 id="debugging-with-visual-studio"><span id="devcycle-vs-addin"></span>Debugging with Visual Studio</h1>
+<b><font color="#cc0000">
+NOTE:
+Deprecation of the technologies described here has been announced
+for platforms other than ChromeOS.<br/>
+Please visit our
+<a href="/native-client/migration">migration guide</a>
+for details.
+</font></b>
+<hr/><section id="debugging-with-visual-studio">
+<h1 id="debugging-with-visual-studio">Debugging with Visual Studio</h1>
 <div class="contents local" id="table-of-contents" style="display: none">
 <p class="topic-title first">Table Of Contents</p>
 <ul class="small-gap">
diff --git a/native_client_sdk/doc_generated/devguide/distributing.html b/native_client_sdk/doc_generated/devguide/distributing.html
index e6eaf520..a090b87 100644
--- a/native_client_sdk/doc_generated/devguide/distributing.html
+++ b/native_client_sdk/doc_generated/devguide/distributing.html
@@ -1,7 +1,15 @@
 {{+bindTo:partials.standard_nacl_article}}
 
-<section id="distributing-your-application">
-<span id="distributing"></span><h1 id="distributing-your-application"><span id="distributing"></span>Distributing Your Application</h1>
+<b><font color="#cc0000">
+NOTE:
+Deprecation of the technologies described here has been announced
+for platforms other than ChromeOS.<br/>
+Please visit our
+<a href="/native-client/migration">migration guide</a>
+for details.
+</font></b>
+<hr/><section id="distributing-your-application">
+<h1 id="distributing-your-application">Distributing Your Application</h1>
 <div class="contents local" id="contents" style="display: none">
 <ul class="small-gap">
 <li><a class="reference internal" href="#portable-native-client" id="id2">Portable Native Client</a></li>
diff --git a/native_client_sdk/doc_generated/devguide/index.html b/native_client_sdk/doc_generated/devguide/index.html
index ad96c72..39603d2 100644
--- a/native_client_sdk/doc_generated/devguide/index.html
+++ b/native_client_sdk/doc_generated/devguide/index.html
@@ -1,7 +1,15 @@
 {{+bindTo:partials.standard_nacl_article}}
 
-<section id="developer-s-guide">
-<span id="devguide-index"></span><h1 id="developer-s-guide"><span id="devguide-index"></span>Developer&#8217;s Guide</h1>
+<b><font color="#cc0000">
+NOTE:
+Deprecation of the technologies described here has been announced
+for platforms other than ChromeOS.<br/>
+Please visit our
+<a href="/native-client/migration">migration guide</a>
+for details.
+</font></b>
+<hr/><section id="developer-s-guide">
+<h1 id="developer-s-guide">Developer&#8217;s Guide</h1>
 <p>The Native Client Developer&#8217;s Guide includes practical information you need to
 get your development cycle up and running (e.g., how to compile and test-run
 your application), as well as important concepts you need to understand in order
diff --git a/native_client_sdk/doc_generated/devguide/tutorial/index.html b/native_client_sdk/doc_generated/devguide/tutorial/index.html
index a2b529a..f4d116f 100644
--- a/native_client_sdk/doc_generated/devguide/tutorial/index.html
+++ b/native_client_sdk/doc_generated/devguide/tutorial/index.html
@@ -1,7 +1,15 @@
 {{+bindTo:partials.standard_nacl_article}}
 
-<section id="tutorial">
-<span id="devguide-tutorial-index"></span><h1 id="tutorial"><span id="devguide-tutorial-index"></span>Tutorial</h1>
+<b><font color="#cc0000">
+NOTE:
+Deprecation of the technologies described here has been announced
+for platforms other than ChromeOS.<br/>
+Please visit our
+<a href="/native-client/migration">migration guide</a>
+for details.
+</font></b>
+<hr/><section id="tutorial">
+<h1 id="tutorial">Tutorial</h1>
 <p>This section contains a multi-part tutorial that explains how to get started
 developing applications with Native Client.</p>
 <ul class="small-gap">
diff --git a/native_client_sdk/doc_generated/devguide/tutorial/tutorial-part1.html b/native_client_sdk/doc_generated/devguide/tutorial/tutorial-part1.html
index 83e692ce..6182c002 100644
--- a/native_client_sdk/doc_generated/devguide/tutorial/tutorial-part1.html
+++ b/native_client_sdk/doc_generated/devguide/tutorial/tutorial-part1.html
@@ -1,7 +1,15 @@
 {{+bindTo:partials.standard_nacl_article}}
 
-<section id="c-tutorial-getting-started-part-1">
-<span id="tutorial"></span><h1 id="c-tutorial-getting-started-part-1"><span id="tutorial"></span>C++ Tutorial: Getting Started (Part 1)</h1>
+<b><font color="#cc0000">
+NOTE:
+Deprecation of the technologies described here has been announced
+for platforms other than ChromeOS.<br/>
+Please visit our
+<a href="/native-client/migration">migration guide</a>
+for details.
+</font></b>
+<hr/><section id="c-tutorial-getting-started-part-1">
+<h1 id="c-tutorial-getting-started-part-1">C++ Tutorial: Getting Started (Part 1)</h1>
 <div class="contents local" id="contents" style="display: none">
 <ul class="small-gap">
 <li><p class="first"><a class="reference internal" href="#overview" id="id1">Overview</a></p>
diff --git a/native_client_sdk/doc_generated/devguide/tutorial/tutorial-part2.html b/native_client_sdk/doc_generated/devguide/tutorial/tutorial-part2.html
index 02e3dce..2778a3e6 100644
--- a/native_client_sdk/doc_generated/devguide/tutorial/tutorial-part2.html
+++ b/native_client_sdk/doc_generated/devguide/tutorial/tutorial-part2.html
@@ -1,7 +1,15 @@
 {{+bindTo:partials.standard_nacl_article}}
 
-<section id="c-tutorial-getting-started-part-2">
-<span id="tutorial2"></span><h1 id="c-tutorial-getting-started-part-2"><span id="tutorial2"></span>C++ Tutorial: Getting Started (Part 2)</h1>
+<b><font color="#cc0000">
+NOTE:
+Deprecation of the technologies described here has been announced
+for platforms other than ChromeOS.<br/>
+Please visit our
+<a href="/native-client/migration">migration guide</a>
+for details.
+</font></b>
+<hr/><section id="c-tutorial-getting-started-part-2">
+<h1 id="c-tutorial-getting-started-part-2">C++ Tutorial: Getting Started (Part 2)</h1>
 <div class="contents local" id="contents" style="display: none">
 <ul class="small-gap">
 <li><a class="reference internal" href="#overview" id="id1">Overview</a></li>
diff --git a/native_client_sdk/doc_generated/faq.html b/native_client_sdk/doc_generated/faq.html
index 8c158e26..3327da9c 100644
--- a/native_client_sdk/doc_generated/faq.html
+++ b/native_client_sdk/doc_generated/faq.html
@@ -1,6 +1,14 @@
 {{+bindTo:partials.standard_nacl_article}}
 
-<section id="frequently-asked-questions">
+<b><font color="#cc0000">
+NOTE:
+Deprecation of the technologies described here has been announced
+for platforms other than ChromeOS.<br/>
+Please visit our
+<a href="/native-client/migration">migration guide</a>
+for details.
+</font></b>
+<hr/><section id="frequently-asked-questions">
 <h1 id="frequently-asked-questions">Frequently Asked Questions</h1>
 <div class="contents local" id="contents" style="display: none">
 <ul class="small-gap">
diff --git a/native_client_sdk/doc_generated/glossary.html b/native_client_sdk/doc_generated/glossary.html
index 0fc2865..2c15b173 100644
--- a/native_client_sdk/doc_generated/glossary.html
+++ b/native_client_sdk/doc_generated/glossary.html
@@ -1,7 +1,15 @@
 {{+bindTo:partials.standard_nacl_article}}
 
-<section id="glossary">
-<span id="id1"></span><h1 id="glossary"><span id="id1"></span>Glossary</h1>
+<b><font color="#cc0000">
+NOTE:
+Deprecation of the technologies described here has been announced
+for platforms other than ChromeOS.<br/>
+Please visit our
+<a href="/native-client/migration">migration guide</a>
+for details.
+</font></b>
+<hr/><section id="id1">
+<h1 id="id1">Glossary</h1>
 <p>This glossary defines terms and names commonly used throughout the Native Client
 documentation.</p>
 <dl class="docutils">
diff --git a/native_client_sdk/doc_generated/help.html b/native_client_sdk/doc_generated/help.html
index c459fe09..f8afc8bd 100644
--- a/native_client_sdk/doc_generated/help.html
+++ b/native_client_sdk/doc_generated/help.html
@@ -1,7 +1,15 @@
 {{+bindTo:partials.standard_nacl_article}}
 
-<section id="help-with-nacl">
-<span id="help"></span><h1 id="help-with-nacl"><span id="help"></span>Help with NaCl</h1>
+<b><font color="#cc0000">
+NOTE:
+Deprecation of the technologies described here has been announced
+for platforms other than ChromeOS.<br/>
+Please visit our
+<a href="/native-client/migration">migration guide</a>
+for details.
+</font></b>
+<hr/><section id="help-with-nacl">
+<h1 id="help-with-nacl">Help with NaCl</h1>
 <p>Check the documentation resources below for help with common issues and
 problems. For additional questions, reach out to the Native Client
 community in the forums below. You can also <a class="reference internal" href="#report-issue"><em>report new issues</em></a> using the Native Client issue tracker.</p>
diff --git a/native_client_sdk/doc_generated/index.html b/native_client_sdk/doc_generated/index.html
index 13ab20a..0712db95 100644
--- a/native_client_sdk/doc_generated/index.html
+++ b/native_client_sdk/doc_generated/index.html
@@ -1,6 +1,14 @@
 {{+bindTo:partials.standard_nacl_article}}
 
-<section id="welcome-to-native-client">
+<b><font color="#cc0000">
+NOTE:
+Deprecation of the technologies described here has been announced
+for platforms other than ChromeOS.<br/>
+Please visit our
+<a href="/native-client/migration">migration guide</a>
+for details.
+</font></b>
+<hr/><section id="welcome-to-native-client">
 <h1 id="welcome-to-native-client">Welcome to Native Client</h1>
 <div id="home">
 <div class="pull-quote">To get the SDK and<br/>installation instructions<br/>
diff --git a/native_client_sdk/doc_generated/io2014.html b/native_client_sdk/doc_generated/io2014.html
index a596726..be037ae4 100644
--- a/native_client_sdk/doc_generated/io2014.html
+++ b/native_client_sdk/doc_generated/io2014.html
@@ -1,7 +1,15 @@
 {{+bindTo:partials.standard_nacl_article}}
 
-<section id="building-a-nacl-app">
-<span id="io2014"></span><h1 id="building-a-nacl-app"><span id="io2014"></span>Building a NaCl App</h1>
+<b><font color="#cc0000">
+NOTE:
+Deprecation of the technologies described here has been announced
+for platforms other than ChromeOS.<br/>
+Please visit our
+<a href="/native-client/migration">migration guide</a>
+for details.
+</font></b>
+<hr/><section id="building-a-nacl-app">
+<h1 id="building-a-nacl-app">Building a NaCl App</h1>
 <h2 id="in-the-browser">In the browser!</h2>
 <p>Follow along with Brad Nelson&#8217;s Google I/O 2014 talk.
 Explore our new in-browser development environment and debugger.</p>
diff --git a/native_client_sdk/doc_generated/migration/index.html b/native_client_sdk/doc_generated/migration/index.html
new file mode 100644
index 0000000..5e9d8f58
--- /dev/null
+++ b/native_client_sdk/doc_generated/migration/index.html
@@ -0,0 +1,5483 @@
+{{+bindTo:partials.standard_nacl_article}}
+
+<section id="webassembly-migration-guide">
+<span id="migration"></span><h1 id="webassembly-migration-guide"><span id="migration"></span>WebAssembly Migration Guide</h1>
+<h2 id="p-nacl-deprecation-announcements">(P)NaCl Deprecation Announcements</h2>
+<p>Given the momentum of cross-browser WebAssembly support, we plan to focus our
+native code efforts on WebAssembly going forward and plan to remove support for
+PNaCl in Q1 2018 (except for Chrome Apps). We believe that the vibrant
+ecosystem around <a class="reference external" href="http://webassembly.org">WebAssembly</a>
+makes it a better fit for new and existing high-performance
+web apps and that usage of PNaCl is sufficiently low to warrant deprecation.</p>
+<p>We also recently announced the deprecation Q1 2018 of
+<a class="reference external" href="https://blog.chromium.org/2016/08/from-chrome-apps-to-web.html">Chrome Apps</a>
+outside of ChromeOS.</p>
+<h2 id="toolchain-migration">Toolchain Migration</h2>
+<p>For the majority of (P)NaCl uses cases we recommend transitioning
+from the NaCl SDK to <a class="reference external" href="http://webassembly.org/getting-started/developers-guide/">Emscripten</a>.
+Migration is likely to be reasonably straightforward
+if your application is portable to Linux, uses
+<a class="reference external" href="https://www.libsdl.org/">SDL</a>, or POSIX APIs.
+While direct support for NaCl / Pepper APIs in not available,
+we&#8217;ve attempted to list Web API equivalents.
+For more challenging porting cases, please reach out on
+<a class="reference external" href="mailto:native-client-discuss&#37;&#52;&#48;googlegroups&#46;com">native-client-discuss<span>&#64;</span>googlegroups<span>&#46;</span>com</a></p>
+<h2 id="api-migration">API Migration</h2>
+<p>We&#8217;ve outlined here the status of Web Platform substitutes for each
+of the APIs exposed to (P)NaCl.
+Additionally, the table lists the library or option in Emscripten
+that offers the closest substitute.</p>
+<p>We expect to add shared memory threads support to WebAssembly in 2017,
+as threads are crucial to matching (P)NaCl&#8217;s most interesting use
+cases. Migration items which assume forthcoming threads support
+are marked below. If your application&#8217;s flow control relies heavily on blocking
+APIs, you may also find threads support is required for convenient porting.</p>
+<p>While we&#8217;ve tried to be accurate in this table,
+there are no doubt errors or omissions.
+If you encounter one, please reach out to us on
+<a class="reference external" href="mailto:native-client-discuss&#37;&#52;&#48;googlegroups&#46;com">native-client-discuss<span>&#64;</span>googlegroups<span>&#46;</span>com</a></p>
+<h2 id="ppapi">PPAPI</h2>
+<table>
+</table>
+<h3>PPB_Audio</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Create </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td style="font-size: 11px; padding: 5px;">SDL (partial) </td>
+    <td bgcolor="#ffeecc" style="font-size: 11px; padding: 5px;">GAP (partial) - AudioWorkletNode ROUGHLY equivalent</td>
+    <td style="font-size: 11px; padding: 5px;">Still being standardized. </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetCurrentConfig </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">AudioContext.* (gets back settings passed in) </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">StartPlayback </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">AudioBufferSourceNode.start </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">StopPlayback </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">AudioBufferSourceNode.stop </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_AudioBuffer</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetTimestamp </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">AudioBufferSourceNode.start (parameter) </td>
+    <td style="font-size: 11px; padding: 5px;">Passed in each time instead of attached to the buffer. </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">SetTimestamp </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">AudioBufferSourceNode.start (parameter) </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetSampleRate </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">AudioBuffer.sampleRate </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetSampleSize </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - WebAudio only uses 32-bit float, PPAPI does 16-bit int.</td>
+    <td style="font-size: 11px; padding: 5px;">PPAPI theoretically supports multiple sampling sizes. In practice, it only supports 16-bit samples. Unfortunately, developers have requested 16-bit sample sizes to save on memory use. </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetNumberOfChannels </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">AudioBuffer.numberOfChannels </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetDataBuffer </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">AudioBuffer.getChannelData </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetBufferSize </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">AudioBuffer.length </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_AudioConfig</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">CreateStereo16Bit </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - Only 32-bit float samples supported</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetSampleRate </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">AudioContext.sampleRate </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetSampleFrameCount </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">AudioBuffer.length </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">RecommendSampleRate </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">AudioContext.sampleRate (from default construct) </td>
+    <td style="font-size: 11px; padding: 5px;">An AudioContext will have the preferred sampling rate by default. </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">RecommendSampleFrameCount </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No mechanism to get a recomended buffer size.</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_Console</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Log </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">utime </td>
+    <td style="font-size: 11px; padding: 5px;">console.log/warn/error/... </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">LogWithSource </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">PPAPI provides a way to override the source filename and line number in a console message. 
+(Though JS API provides way to style text). </td>
+  </tr>
+
+</table>
+<h3>PPB_Core</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">getTime </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">utime </td>
+    <td style="font-size: 11px; padding: 5px;">new Date().getTime() </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">getTimeTicks </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">utime </td>
+    <td style="font-size: 11px; padding: 5px;">new Date().getTime() </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">IsMainThread </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">window.document !== undefined </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">CallOnMainThread </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">Worker.postMessage + Atomics.wait </td>
+    <td style="font-size: 11px; padding: 5px;">Equivalent synchronization can be built. </td>
+  </tr>
+
+</table>
+<h3>PPB_FileIO</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Create </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">FS (partial) </td>
+    <td style="font-size: 11px; padding: 5px;">FileReader / FileWrite (Entry.createReader / Entry.createWriter) </td>
+    <td style="font-size: 11px; padding: 5px;">Create and open are used differently, but the pieces are of equal power. </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Open </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">FS (partial) </td>
+    <td style="font-size: 11px; padding: 5px;">FileReader / FileWrite (Entry.createReader / Entry.createWriter) </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Query </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">FS (partial) </td>
+    <td style="font-size: 11px; padding: 5px;">Entry.getMetadata </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Touch </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">FS (partial) </td>
+    <td bgcolor="#ffeecc" style="font-size: 11px; padding: 5px;">GAP (partial) - No direct equivalent, but no access time either.</td>
+    <td style="font-size: 11px; padding: 5px;">Modify time can be bumped by writing. </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Read </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">FS (partial) </td>
+    <td style="font-size: 11px; padding: 5px;">Entry.getFile + Blob.slice + FileReader.getBinaryData </td>
+    <td style="font-size: 11px; padding: 5px;">Note, this API requires an extra copy to get a read into linear memory, and may be worse than that if Blob slices are not optimizes to use mmap. </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Write </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">FS (partial) </td>
+    <td style="font-size: 11px; padding: 5px;">FileWriter.seek + FileWriter.write 'write*' Events </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">SetLength </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">FS (partial) </td>
+    <td style="font-size: 11px; padding: 5px;">FileWriter.truncate + 'write*' Events </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Flush </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent, no way to flush.</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Close </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">FS (partial) </td>
+    <td style="font-size: 11px; padding: 5px;">No equivalent, open files and directories are implicitly closed. </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">ReadToArray </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent.</td>
+    <td style="font-size: 11px; padding: 5px;">Allows multiple subrange reads in parallel. </td>
+  </tr>
+
+</table>
+<h3>PPB_FileRef</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Create </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">FS (partial) </td>
+    <td style="font-size: 11px; padding: 5px;">Entry.getFile(..., {create:true}) </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetFileSystemType </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">FS (partial) </td>
+    <td style="font-size: 11px; padding: 5px;">FileSystem.type </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetName </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">FS (partial) </td>
+    <td style="font-size: 11px; padding: 5px;">Entry.name </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetPath </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">FS (partial) </td>
+    <td style="font-size: 11px; padding: 5px;">Entry.fullPath </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetParent </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">FS (partial) </td>
+    <td style="font-size: 11px; padding: 5px;">Entry.getParent </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">MakeDirectory </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">FS (partial) </td>
+    <td style="font-size: 11px; padding: 5px;">Entry.getDirectory(..., {create:true}) </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Touch </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">FS (partial) </td>
+    <td bgcolor="#ffeecc" style="font-size: 11px; padding: 5px;">GAP (partial) - No direct equivalent, but no access time either.</td>
+    <td style="font-size: 11px; padding: 5px;">Modify time can be bumped by writing. </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Delete </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">FS (partial) </td>
+    <td style="font-size: 11px; padding: 5px;">Entry.remove </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Rename </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">FS (partial) </td>
+    <td style="font-size: 11px; padding: 5px;">Entry.moveTo </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Query </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">Entry.getMetadata </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - JS API has file size and last modified date, but doesn't have creation date and last accessed date.</td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">ReadDirectoryEntries </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">FS (partial) </td>
+    <td style="font-size: 11px; padding: 5px;">Directory.readEntries </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_FileSystem</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Create </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">FS (partial) </td>
+    <td style="font-size: 11px; padding: 5px;">window.requestFileSystem </td>
+    <td style="font-size: 11px; padding: 5px;">JS API does both in one step </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Open </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">window.requestFileSystem </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - Filesystems API is chrome only. IndexedDB has additional performance limitations around subrange writes.</td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetType </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">FileSystem.type </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_Fullscreen</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">IsFullScreen </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">html5.h </td>
+    <td style="font-size: 11px; padding: 5px;">Document.fullscreenEnabled </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">SetFullscreen </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">html5.h </td>
+    <td style="font-size: 11px; padding: 5px;">Document.requestFullscreen </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetScreenSize </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">html5.h </td>
+    <td style="font-size: 11px; padding: 5px;">Document.exitFullscreen </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_Gamepad</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Sample </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">Gamepad.* </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - PPAPI exposes a timestamp value, but the JS API doesn't provide this (though it is spec'd).</td>
+  </tr>
+
+</table>
+<h3>PPB_Graphics2D</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Create </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">Canvas.getContext('2d') </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Describe </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">Canvas.clientWidth + Canvas.clientHeight </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PaintImageData </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">CanvasRenderingContext2d.putImageData </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Scroll </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">CanvasRenderingContext2d.scrollIntoView </td>
+    <td bgcolor="#ffeecc" style="font-size: 11px; padding: 5px;">GAP (partial) - Not an exact match (might have to resort to getImageData + putImageData which will be slow). Not a cross-browser standard.</td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">ReplaceContents </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">CanvasRenderingContext2d.drawImage </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Flush </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - Only returning to the event loop triggers the flush.</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">SetScale </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">CanvasRenderingContext2d.scale </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetScale </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">CanvasRenderingContext2d.currentTransform </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">SetLayerTransform </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">CanvasRenderingContext2d.setTransform
+CanvasRenderingContext2d.scale
+CanvasRenderingContext2d.translate </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_Graphics3D</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetAttribMaxValue </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - Canvas.getContext lets you set booleans requesting depth / stencil buffers of certain sizes, but does not have a way to query what's possible (or get anything other than on or off for each)</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Create </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">Canvas.getContext </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetAttribs </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">WebGLRenderingContext.getContextAttributes </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">SetAttribs </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">Canvas.getContext(.., OPTIONS) </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetError </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">WebGLRenderingContext.getError </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">ResizeBuffers </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">Canvas.width = w; Canvas.height = h; </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">SwapBuffers </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No way to explicitly flip a frame, must return to the event loop.</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_ImageData</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetNativeImageDataFormat </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">ImageData mandates RGBA order </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">IsImageDataFormatSupported </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">ImageData mandates RGBA order </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Create </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">CanvasRenderingContext2d.createImageData </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Describe </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">ImageData never has a stride </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Map </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">ImageData.data </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Unmap </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">ImageData.data </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_InputEvent</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">RequestInputEvents </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">No direct equivalent </td>
+    <td style="font-size: 11px; padding: 5px;">The lack of this feature is probably less relevant as JS / Wasm runs on the main thread and can more cheaply filter events without incurring a cross process round-trip. </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">RequestFilteringInputEvents </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">mouse* key* wheel* touch* composition* Events </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;"> </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">Element.addEventListener </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">ClearInputEventRequest </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">Element.removeEventListener </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetType </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">Event class descendants </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetTimeStamp </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">Event.timeStamp </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetModifiers </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">*Event.altKey/shiftKey/metaKey/ctrlKey </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_MouseInputEvent</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Create </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">MouseEvent </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetButton </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">MouseEvent.button </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetPosition </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">MouseEvent.client*/page*/offset* </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetClickCount </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">dblclick' vs 'mousedown' Events </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetMovement </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">MouseEvent.movement* </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_WheelInputEvent</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Create </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">WheelEvent </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetDelta </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">WheelEvent.delta* </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetTicks </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - deltaMode kinda of contains this info, but incompletely.</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetScrollByPage </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - deltaMode kinda of contains this info, but incompletely.</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_KeyboardInputEvent</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Create </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">KeyboardEvent </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetKeyCode </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">KeyboardEvent.keyCode </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetCharacterText </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">KeyboardEvent.key </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetCode </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">KeyboardEvent.code </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_TouchInputEvent</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Create </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">TouchEvent </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">AddTouchPoint </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">TouchEvent.touches.push </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetTouchCount </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">TouchEvent.touches.length </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetTouchByIndex </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">TouchEvent.touches[i] </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetTouchById </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">Touch.indentifer (to figure this out yourself) </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_IMEInputEvent</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Create </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">CompositionEvent </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetText </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">CompositionEvent.data </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetSegmentNumber </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No direct equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetSegmentOffset </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No direct equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetTargetSegment </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No direct equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetSelection </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No direct equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_Instance</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">BindGraphics </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">Canvas.getContext (moot as binding is automatic). </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">IsFullFrame </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent to mime type handlers.</td>
+    <td style="font-size: 11px; padding: 5px;">NaCl apps can be registered to handle a particular mime type and own the whole document. </td>
+  </tr>
+
+</table>
+<h3>PPB_MediaStreamAudioTrack</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Configure </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetAttrib </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">MediaStreamSettings.channelCount </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;"> </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">MediaStreamSettings.sampleSize </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;"> </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">MediaStreamSettings.sampleRate </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;"> </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - no equivalent to PP_MEDIASTREAMAUDIOTRACK_ATTRIB_BUFFERS</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;"> </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - no equivalent to PP_MEDIASTREAMAUDIOTRACK_ATTRIB_DURATION</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetId </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">MediaStream.id </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">HasEnded </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">MediaStream.ended </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetBuffer </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">RecycleBuffer </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Close </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_MediaStreamVideoTrack</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Create </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;">Ability to create synthetic stream. </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Configure </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetAttrib </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">MediaStreamSettings.width </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;"> </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">MediaStreamSettings.height </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;"> </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - no equivalent to PP_MEDIASTREAMVIDEOTRACK_ATTRIB_BUFFERED_FRAMES</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;"> </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - no equivalent to PP_MEDIASTREAMVIDEOTRACK_ATTRIB_FORMAT</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetId </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">MediaStream.id </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">HasEnded </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">MediaStream.ended </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetFrame </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">RecycleFrame </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Close </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetEmptyFrame </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PutFrame </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_MessageLoop</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Create </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">N/A </td>
+    <td style="font-size: 11px; padding: 5px;">Mostly moot, workers get an implicit event loop. </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetForMainThread </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">N/A </td>
+    <td style="font-size: 11px; padding: 5px;">Mostly moot, workers get an implicit event loop. </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetCurrent </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">N/A </td>
+    <td style="font-size: 11px; padding: 5px;">Mostly moot, workers get an implicit event loop. </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">AttachToCurrentThread </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">N/A </td>
+    <td style="font-size: 11px; padding: 5px;">Mostly moot, workers get an implicit event loop. </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Run </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">N/A </td>
+    <td style="font-size: 11px; padding: 5px;">Mostly moot, workers get an implicit event loop. </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PostWork </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">N/A </td>
+    <td style="font-size: 11px; padding: 5px;">Mostly moot, workers get an implicit event loop. </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PostQuit </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">N/A </td>
+    <td style="font-size: 11px; padding: 5px;">Mostly moot, workers get an implicit event loop. </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_Messaging</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PostMessage </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">N/A </td>
+    <td style="font-size: 11px; padding: 5px;">Window.postMessage </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">RegisterMessageHandler </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">N/A </td>
+    <td style="font-size: 11px; padding: 5px;">Window.addEventListener </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">UnregisterMessageHandler </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">N/A </td>
+    <td style="font-size: 11px; padding: 5px;">Window.removeEventListener </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_MouseCursor</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">SetCursor </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">Element.style.cursor </td>
+    <td style="font-size: 11px; padding: 5px;">Same set of stock cursors are supported.
+Custom cursors can be done with url(..).
+Dynamic custom cursors can be done with data URIs.
+CSS3 supports specifying the hotspot. </td>
+  </tr>
+
+</table>
+<h3>PPB_MouseLock</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">LockMouse </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">Element.requestPointerLock </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">UnlockMouse </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">Element.exitPointerLock </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_OpenGLES2</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Several Methods </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">OpenGLES </td>
+    <td style="font-size: 11px; padding: 5px;">Close to WebGL 1.0 in functionality. </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;"> </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - Without offscreen canvas, rendering must be done on the main thread.</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_TextInputController</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">SetTextInputType </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent hints to browser about canvas containing input.</td>
+    <td style="font-size: 11px; padding: 5px;">Some developers would like to either be able to hint in this fashion, or preferrably the ability to intercept and display IME events / output inline inside a canvas. </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">UpdateCaretPosition </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent hints to browser about canvas containing input.</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">CancelCompositionText </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent hints to browser about canvas containing input.</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">UpdateSurroundingText </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent hints to browser about canvas containing input.</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_URLLoader</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Create </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">new XMLHttpRequest(); </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Open </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">XMLHttpRequest.open </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">FollowRedirect </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">Request.redirect </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;"> </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No XMLHTTPRequest equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetUploadProgress </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">XMLHttpRequest 'progress' Event </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;"> </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No Fetch API equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetDownloadProgress </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">XMLHttpRequest 'progress' Event </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;"> </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No Fetch API equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetResponseInfo </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">XMLHttpRequest.getAllResponseHeaders </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;"> </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">Fetch Response.* </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">ReadResponseBody </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">XMLHttpRequest.response </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;"> </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">Body.* (Response is a Body) </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">FinishStreamingToFile </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No direct equivalent</td>
+    <td style="font-size: 11px; padding: 5px;">XMLHttpRequest and Fetch both assume streaming to memory, rather than directly to a storage. </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Close </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">XMLHttpRequest.abort </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;"> </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No Fetch API equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_URLRequestInfo</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Create </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">XMLHttpRequest </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;"> </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">Fetch Request </td>
+    <td style="font-size: 11px; padding: 5px;">No way to stream to a file. </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">SetProperty </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No direct equivalent for XMLHttpRequest</td>
+    <td style="font-size: 11px; padding: 5px;">XMLHttpRequest doesn't provide direct ways to per-request limit following redirects, stream to a file, set referrer or credentials policy. </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;"> </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">Request.* </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">AppendDataToBody </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">XMLHttpRequest.send </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - Both must have the whole body, rather than a chunk.</td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;"> </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">fetch(.., options:body) </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">AppendFileToBody </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No direct equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;"> </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">N/A </td>
+    <td style="font-size: 11px; padding: 5px;">&lt;form&gt; </td>
+    <td style="font-size: 11px; padding: 5px;">You can also read with FileReader and upload, but that's more like AppendDataToBody </td>
+  </tr>
+
+</table>
+<h3>PPB_URLResponseInfo</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetProperty </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">XMLHttpRequest.getAllResponseHeaders + others </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;"> </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">Fetch Response.* </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetBodyAsFileRef </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">Fetch Response (Body) .blob() </td>
+    <td style="font-size: 11px; padding: 5px;">Assumes storage layer optimizes transfer. </td>
+  </tr>
+
+</table>
+<h3>PPB_Var</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">VarFromUtf8 </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">TextDecoder.decode </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">VarToUtf8 </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">TextEncoder.encode </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">VarFromResource </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">N/A </td>
+    <td style="font-size: 11px; padding: 5px;">N/A </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">VarToResource </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">N/A </td>
+    <td style="font-size: 11px; padding: 5px;">N/A </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_VarArray</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Get </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">Array[i] </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Set </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">Array[i] = x </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetLength </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">Array.length </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">SetLength </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">Array.length = n </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_VarArrayBuffer</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Create </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">new ArrayBuffer(n) </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">ByteLength </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">ArrayBuffer.byteLength </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Map </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No direct equivalent</td>
+    <td style="font-size: 11px; padding: 5px;">Asm.js / Wasm modules are unable to map regions of an ArrayBuffer other than their single linear memory heap.
+Future multiple memories or memory mapping might improve this. </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Unmap </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No direct equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_VarDictionary</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Create </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">{} </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Get </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">&lt;Object&gt;[i] </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Set </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">&lt;Object&gt;[i] = x </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Delete </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">delete &lt;Object&gt;[i] </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">HasKey </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">x in &lt;Object&gt; </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetKeys </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">for (k in &lt;Object&gt;) {} </td>
+    <td style="font-size: 11px; padding: 5px;">No literal equivalent, but it can be built. </td>
+  </tr>
+
+</table>
+<h3>PPB_VideoDecoder</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Create </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Initialize </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Decode </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetPicture </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">RecyclePicture </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Flush </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Reset </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_VideoEncoder</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Create </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;">Overlap with MediaRecorder API, but not exact. </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetSupportedProfiles </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Initialize </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetFramesRequired </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetFrameCodedSize </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetVideoFrame </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Encode </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetBitstreamBuffer </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">RecycleBitstreamBuffer </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">RequestEncodingParametersChange </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Close </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_VideoFrame</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetTimestamp </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">SetTimestamp </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetFormat </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetSize </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetDataBuffer </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetDataBufferSize </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_View</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetRect </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">Element.getBoundingClientRect </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">IsFullscreen </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">Document.fullScreenEnabled </td>
+    <td style="font-size: 11px; padding: 5px;">Pertains to document instead of just single element. </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">IsVisible </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">IntersectionObserver </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">IsPageVisible </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">document.visibilityState </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetClipRect </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">IntersectionObserver </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetDeviceScale </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">window.devicePixelRatio </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetCSSScale </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">&lt;Element&gt;.getBoundingClientRect().width / &lt;Element&gt;.offsetWidth </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetScrollOffset </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">&lt;Element&gt;.scrollTop / &lt;Element&gt;.scrollLeft </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_WebSocket</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Create </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">WebSocket.WebSocket </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Connect </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">WebSocket.WebSocket(url, ...)
+WebSocket 'open' Event </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Close </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">WebSocket.close </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">ReceiveMessage </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">WebSocket 'message' Event
+WebSocket 'error' Event
+WebSocket 'close' Event </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">SendMessage </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">WebSocket.send </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetBufferedAmount </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">WebSocket.bufferedAmount </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetCloseCode </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">CloseEvent.code </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetCloseReason </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">CloseEvent.reason </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetCloseWasClean </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">CloseEvent.wasClean </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetExtensions </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">WebSocket.extensions </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetProtocol </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">WebSocket.protocol </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetReadyState </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">WebSocket.readyState </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetURL </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">WebSocket.url </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPP_Graphics3D</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Graphics3DContextLost </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">Canvas 'webglcontextlost' Event </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPP_InputEvent</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">HandleInputEvent </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">Element.addEventListener </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPP_Instance</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">DidCreate </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">N/A </td>
+    <td style="font-size: 11px; padding: 5px;">&lt;Element&gt;[key] </td>
+    <td style="font-size: 11px; padding: 5px;">General DOM access lets you fish out tag attributes </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">DidDestroy </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">N/A </td>
+    <td style="font-size: 11px; padding: 5px;">N/A </td>
+    <td style="font-size: 11px; padding: 5px;">Not triggered for NaCl </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">DidChangeView </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">N/A </td>
+    <td style="font-size: 11px; padding: 5px;">Element 'resize' Event </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">DidChangeFocus </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">N/A </td>
+    <td style="font-size: 11px; padding: 5px;">Element 'focus', 'focusin', 'focusout' Events </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">HandleDocumentLoad </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">N/A </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No way to register as a mime type handler</td>
+    <td style="font-size: 11px; padding: 5px;">NaCl modules via apps + a manifest entry can be set up to handle particular mime types. </td>
+  </tr>
+
+</table>
+<h3>PPP_MessageHandler</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">HandleMessage </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">MessagePort 'message' Event
+Window 'message' Event </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">HandleBlockingMessage </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">N/A </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No direct equivalent</td>
+    <td style="font-size: 11px; padding: 5px;">Similar synchronization can be done off main thread with Atomics.wait. This was added to support emulation of synchronous plugin APIs. </td>
+  </tr>
+
+</table>
+<h3>PPP_Messaging</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">HandleMessage </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">MessagePort 'message' Event
+Window 'message' Event </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPP_MouseLock</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">MouseLockLost </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">Element 'pointerlockchange', 'pointerlockerror' Events </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h2 id="irt">IRT</h2>
+<table>
+</table>
+<h3>PPB_Audio</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Create </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td style="font-size: 11px; padding: 5px;">SDL (partial) </td>
+    <td bgcolor="#ffeecc" style="font-size: 11px; padding: 5px;">GAP (partial) - AudioWorkletNode ROUGHLY equivalent</td>
+    <td style="font-size: 11px; padding: 5px;">Still being standardized. </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetCurrentConfig </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">AudioContext.* (gets back settings passed in) </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">StartPlayback </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">AudioBufferSourceNode.start </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">StopPlayback </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">AudioBufferSourceNode.stop </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_AudioBuffer</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetTimestamp </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">AudioBufferSourceNode.start (parameter) </td>
+    <td style="font-size: 11px; padding: 5px;">Passed in each time instead of attached to the buffer. </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">SetTimestamp </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">AudioBufferSourceNode.start (parameter) </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetSampleRate </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">AudioBuffer.sampleRate </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetSampleSize </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - WebAudio only uses 32-bit float, PPAPI does 16-bit int.</td>
+    <td style="font-size: 11px; padding: 5px;">PPAPI theoretically supports multiple sampling sizes. In practice, it only supports 16-bit samples. Unfortunately, developers have requested 16-bit sample sizes to save on memory use. </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetNumberOfChannels </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">AudioBuffer.numberOfChannels </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetDataBuffer </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">AudioBuffer.getChannelData </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetBufferSize </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">AudioBuffer.length </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_AudioConfig</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">CreateStereo16Bit </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - Only 32-bit float samples supported</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetSampleRate </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">AudioContext.sampleRate </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetSampleFrameCount </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">AudioBuffer.length </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">RecommendSampleRate </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">AudioContext.sampleRate (from default construct) </td>
+    <td style="font-size: 11px; padding: 5px;">An AudioContext will have the preferred sampling rate by default. </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">RecommendSampleFrameCount </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No mechanism to get a recomended buffer size.</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_Console</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Log </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">utime </td>
+    <td style="font-size: 11px; padding: 5px;">console.log/warn/error/... </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">LogWithSource </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">PPAPI provides a way to override the source filename and line number in a console message. 
+(Though JS API provides way to style text). </td>
+  </tr>
+
+</table>
+<h3>PPB_Core</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">getTime </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">utime </td>
+    <td style="font-size: 11px; padding: 5px;">new Date().getTime() </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">getTimeTicks </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">utime </td>
+    <td style="font-size: 11px; padding: 5px;">new Date().getTime() </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">IsMainThread </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">window.document !== undefined </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">CallOnMainThread </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">Worker.postMessage + Atomics.wait </td>
+    <td style="font-size: 11px; padding: 5px;">Equivalent synchronization can be built. </td>
+  </tr>
+
+</table>
+<h3>PPB_FileIO</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Create </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">FS (partial) </td>
+    <td style="font-size: 11px; padding: 5px;">FileReader / FileWrite (Entry.createReader / Entry.createWriter) </td>
+    <td style="font-size: 11px; padding: 5px;">Create and open are used differently, but the pieces are of equal power. </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Open </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">FS (partial) </td>
+    <td style="font-size: 11px; padding: 5px;">FileReader / FileWrite (Entry.createReader / Entry.createWriter) </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Query </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">FS (partial) </td>
+    <td style="font-size: 11px; padding: 5px;">Entry.getMetadata </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Touch </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">FS (partial) </td>
+    <td bgcolor="#ffeecc" style="font-size: 11px; padding: 5px;">GAP (partial) - No direct equivalent, but no access time either.</td>
+    <td style="font-size: 11px; padding: 5px;">Modify time can be bumped by writing. </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Read </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">FS (partial) </td>
+    <td style="font-size: 11px; padding: 5px;">Entry.getFile + Blob.slice + FileReader.getBinaryData </td>
+    <td style="font-size: 11px; padding: 5px;">Note, this API requires an extra copy to get a read into linear memory, and may be worse than that if Blob slices are not optimizes to use mmap. </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Write </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">FS (partial) </td>
+    <td style="font-size: 11px; padding: 5px;">FileWriter.seek + FileWriter.write 'write*' Events </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">SetLength </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">FS (partial) </td>
+    <td style="font-size: 11px; padding: 5px;">FileWriter.truncate + 'write*' Events </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Flush </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent, no way to flush.</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Close </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">FS (partial) </td>
+    <td style="font-size: 11px; padding: 5px;">No equivalent, open files and directories are implicitly closed. </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">ReadToArray </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent.</td>
+    <td style="font-size: 11px; padding: 5px;">Allows multiple subrange reads in parallel. </td>
+  </tr>
+
+</table>
+<h3>PPB_FileRef</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Create </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">FS (partial) </td>
+    <td style="font-size: 11px; padding: 5px;">Entry.getFile(..., {create:true}) </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetFileSystemType </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">FS (partial) </td>
+    <td style="font-size: 11px; padding: 5px;">FileSystem.type </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetName </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">FS (partial) </td>
+    <td style="font-size: 11px; padding: 5px;">Entry.name </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetPath </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">FS (partial) </td>
+    <td style="font-size: 11px; padding: 5px;">Entry.fullPath </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetParent </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">FS (partial) </td>
+    <td style="font-size: 11px; padding: 5px;">Entry.getParent </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">MakeDirectory </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">FS (partial) </td>
+    <td style="font-size: 11px; padding: 5px;">Entry.getDirectory(..., {create:true}) </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Touch </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">FS (partial) </td>
+    <td bgcolor="#ffeecc" style="font-size: 11px; padding: 5px;">GAP (partial) - No direct equivalent, but no access time either.</td>
+    <td style="font-size: 11px; padding: 5px;">Modify time can be bumped by writing. </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Delete </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">FS (partial) </td>
+    <td style="font-size: 11px; padding: 5px;">Entry.remove </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Rename </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">FS (partial) </td>
+    <td style="font-size: 11px; padding: 5px;">Entry.moveTo </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Query </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">Entry.getMetadata </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - JS API has file size and last modified date, but doesn't have creation date and last accessed date.</td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">ReadDirectoryEntries </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">FS (partial) </td>
+    <td style="font-size: 11px; padding: 5px;">Directory.readEntries </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_FileSystem</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Create </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">FS (partial) </td>
+    <td style="font-size: 11px; padding: 5px;">window.requestFileSystem </td>
+    <td style="font-size: 11px; padding: 5px;">JS API does both in one step </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Open </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">window.requestFileSystem </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - Filesystems API is chrome only. IndexedDB has additional performance limitations around subrange writes.</td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetType </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">FileSystem.type </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_Fullscreen</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">IsFullScreen </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">html5.h </td>
+    <td style="font-size: 11px; padding: 5px;">Document.fullscreenEnabled </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">SetFullscreen </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">html5.h </td>
+    <td style="font-size: 11px; padding: 5px;">Document.requestFullscreen </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetScreenSize </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">html5.h </td>
+    <td style="font-size: 11px; padding: 5px;">Document.exitFullscreen </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_Gamepad</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Sample </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">Gamepad.* </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - PPAPI exposes a timestamp value, but the JS API doesn't provide this (though it is spec'd).</td>
+  </tr>
+
+</table>
+<h3>PPB_Graphics2D</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Create </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">Canvas.getContext('2d') </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Describe </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">Canvas.clientWidth + Canvas.clientHeight </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PaintImageData </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">CanvasRenderingContext2d.putImageData </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Scroll </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">CanvasRenderingContext2d.scrollIntoView </td>
+    <td bgcolor="#ffeecc" style="font-size: 11px; padding: 5px;">GAP (partial) - Not an exact match (might have to resort to getImageData + putImageData which will be slow). Not a cross-browser standard.</td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">ReplaceContents </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">CanvasRenderingContext2d.drawImage </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Flush </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - Only returning to the event loop triggers the flush.</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">SetScale </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">CanvasRenderingContext2d.scale </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetScale </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">CanvasRenderingContext2d.currentTransform </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">SetLayerTransform </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">CanvasRenderingContext2d.setTransform
+CanvasRenderingContext2d.scale
+CanvasRenderingContext2d.translate </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_Graphics3D</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetAttribMaxValue </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - Canvas.getContext lets you set booleans requesting depth / stencil buffers of certain sizes, but does not have a way to query what's possible (or get anything other than on or off for each)</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Create </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">Canvas.getContext </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetAttribs </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">WebGLRenderingContext.getContextAttributes </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">SetAttribs </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">Canvas.getContext(.., OPTIONS) </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetError </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">WebGLRenderingContext.getError </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">ResizeBuffers </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">Canvas.width = w; Canvas.height = h; </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">SwapBuffers </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No way to explicitly flip a frame, must return to the event loop.</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_ImageData</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetNativeImageDataFormat </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">ImageData mandates RGBA order </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">IsImageDataFormatSupported </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">ImageData mandates RGBA order </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Create </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">CanvasRenderingContext2d.createImageData </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Describe </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">ImageData never has a stride </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Map </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">ImageData.data </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Unmap </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">ImageData.data </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_InputEvent</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">RequestInputEvents </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">No direct equivalent </td>
+    <td style="font-size: 11px; padding: 5px;">The lack of this feature is probably less relevant as JS / Wasm runs on the main thread and can more cheaply filter events without incurring a cross process round-trip. </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">RequestFilteringInputEvents </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">mouse* key* wheel* touch* composition* Events </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;"> </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">Element.addEventListener </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">ClearInputEventRequest </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">Element.removeEventListener </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetType </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">Event class descendants </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetTimeStamp </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">Event.timeStamp </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetModifiers </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">*Event.altKey/shiftKey/metaKey/ctrlKey </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_MouseInputEvent</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Create </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">MouseEvent </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetButton </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">MouseEvent.button </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetPosition </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">MouseEvent.client*/page*/offset* </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetClickCount </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">dblclick' vs 'mousedown' Events </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetMovement </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">MouseEvent.movement* </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_WheelInputEvent</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Create </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">WheelEvent </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetDelta </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">WheelEvent.delta* </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetTicks </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - deltaMode kinda of contains this info, but incompletely.</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetScrollByPage </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - deltaMode kinda of contains this info, but incompletely.</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_KeyboardInputEvent</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Create </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">KeyboardEvent </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetKeyCode </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">KeyboardEvent.keyCode </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetCharacterText </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">KeyboardEvent.key </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetCode </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">KeyboardEvent.code </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_TouchInputEvent</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Create </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">TouchEvent </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">AddTouchPoint </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">TouchEvent.touches.push </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetTouchCount </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">TouchEvent.touches.length </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetTouchByIndex </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">TouchEvent.touches[i] </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetTouchById </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">Touch.indentifer (to figure this out yourself) </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_IMEInputEvent</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Create </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">CompositionEvent </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetText </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">CompositionEvent.data </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetSegmentNumber </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No direct equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetSegmentOffset </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No direct equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetTargetSegment </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No direct equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetSelection </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No direct equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_Instance</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">BindGraphics </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">Canvas.getContext (moot as binding is automatic). </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">IsFullFrame </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent to mime type handlers.</td>
+    <td style="font-size: 11px; padding: 5px;">NaCl apps can be registered to handle a particular mime type and own the whole document. </td>
+  </tr>
+
+</table>
+<h3>PPB_MediaStreamAudioTrack</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Configure </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetAttrib </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">MediaStreamSettings.channelCount </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;"> </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">MediaStreamSettings.sampleSize </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;"> </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">MediaStreamSettings.sampleRate </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;"> </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - no equivalent to PP_MEDIASTREAMAUDIOTRACK_ATTRIB_BUFFERS</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;"> </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - no equivalent to PP_MEDIASTREAMAUDIOTRACK_ATTRIB_DURATION</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetId </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">MediaStream.id </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">HasEnded </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">MediaStream.ended </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetBuffer </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">RecycleBuffer </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Close </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_MediaStreamVideoTrack</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Create </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;">Ability to create synthetic stream. </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Configure </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetAttrib </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">MediaStreamSettings.width </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;"> </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">MediaStreamSettings.height </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;"> </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - no equivalent to PP_MEDIASTREAMVIDEOTRACK_ATTRIB_BUFFERED_FRAMES</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;"> </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - no equivalent to PP_MEDIASTREAMVIDEOTRACK_ATTRIB_FORMAT</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetId </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">MediaStream.id </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">HasEnded </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">MediaStream.ended </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetFrame </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">RecycleFrame </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Close </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetEmptyFrame </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PutFrame </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_MessageLoop</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Create </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">N/A </td>
+    <td style="font-size: 11px; padding: 5px;">Mostly moot, workers get an implicit event loop. </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetForMainThread </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">N/A </td>
+    <td style="font-size: 11px; padding: 5px;">Mostly moot, workers get an implicit event loop. </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetCurrent </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">N/A </td>
+    <td style="font-size: 11px; padding: 5px;">Mostly moot, workers get an implicit event loop. </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">AttachToCurrentThread </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">N/A </td>
+    <td style="font-size: 11px; padding: 5px;">Mostly moot, workers get an implicit event loop. </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Run </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">N/A </td>
+    <td style="font-size: 11px; padding: 5px;">Mostly moot, workers get an implicit event loop. </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PostWork </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">N/A </td>
+    <td style="font-size: 11px; padding: 5px;">Mostly moot, workers get an implicit event loop. </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PostQuit </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">N/A </td>
+    <td style="font-size: 11px; padding: 5px;">Mostly moot, workers get an implicit event loop. </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_Messaging</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PostMessage </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">N/A </td>
+    <td style="font-size: 11px; padding: 5px;">Window.postMessage </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">RegisterMessageHandler </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">N/A </td>
+    <td style="font-size: 11px; padding: 5px;">Window.addEventListener </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">UnregisterMessageHandler </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">N/A </td>
+    <td style="font-size: 11px; padding: 5px;">Window.removeEventListener </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_MouseCursor</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">SetCursor </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">Element.style.cursor </td>
+    <td style="font-size: 11px; padding: 5px;">Same set of stock cursors are supported.
+Custom cursors can be done with url(..).
+Dynamic custom cursors can be done with data URIs.
+CSS3 supports specifying the hotspot. </td>
+  </tr>
+
+</table>
+<h3>PPB_MouseLock</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">LockMouse </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">Element.requestPointerLock </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">UnlockMouse </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">Element.exitPointerLock </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_OpenGLES2</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Several Methods </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">OpenGLES </td>
+    <td style="font-size: 11px; padding: 5px;">Close to WebGL 1.0 in functionality. </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;"> </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - Without offscreen canvas, rendering must be done on the main thread.</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_TextInputController</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">SetTextInputType </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent hints to browser about canvas containing input.</td>
+    <td style="font-size: 11px; padding: 5px;">Some developers would like to either be able to hint in this fashion, or preferrably the ability to intercept and display IME events / output inline inside a canvas. </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">UpdateCaretPosition </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent hints to browser about canvas containing input.</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">CancelCompositionText </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent hints to browser about canvas containing input.</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">UpdateSurroundingText </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent hints to browser about canvas containing input.</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_URLLoader</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Create </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">new XMLHttpRequest(); </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Open </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">XMLHttpRequest.open </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">FollowRedirect </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">Request.redirect </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;"> </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No XMLHTTPRequest equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetUploadProgress </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">XMLHttpRequest 'progress' Event </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;"> </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No Fetch API equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetDownloadProgress </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">XMLHttpRequest 'progress' Event </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;"> </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No Fetch API equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetResponseInfo </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">XMLHttpRequest.getAllResponseHeaders </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;"> </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">Fetch Response.* </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">ReadResponseBody </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">XMLHttpRequest.response </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;"> </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">Body.* (Response is a Body) </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">FinishStreamingToFile </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No direct equivalent</td>
+    <td style="font-size: 11px; padding: 5px;">XMLHttpRequest and Fetch both assume streaming to memory, rather than directly to a storage. </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Close </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">XMLHttpRequest.abort </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;"> </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No Fetch API equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_URLRequestInfo</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Create </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">XMLHttpRequest </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;"> </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">Fetch Request </td>
+    <td style="font-size: 11px; padding: 5px;">No way to stream to a file. </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">SetProperty </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No direct equivalent for XMLHttpRequest</td>
+    <td style="font-size: 11px; padding: 5px;">XMLHttpRequest doesn't provide direct ways to per-request limit following redirects, stream to a file, set referrer or credentials policy. </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;"> </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">Request.* </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">AppendDataToBody </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">XMLHttpRequest.send </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - Both must have the whole body, rather than a chunk.</td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;"> </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">fetch(.., options:body) </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">AppendFileToBody </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No direct equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;"> </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">N/A </td>
+    <td style="font-size: 11px; padding: 5px;">&lt;form&gt; </td>
+    <td style="font-size: 11px; padding: 5px;">You can also read with FileReader and upload, but that's more like AppendDataToBody </td>
+  </tr>
+
+</table>
+<h3>PPB_URLResponseInfo</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetProperty </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">XMLHttpRequest.getAllResponseHeaders + others </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;"> </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">Fetch Response.* </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetBodyAsFileRef </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">Fetch Response (Body) .blob() </td>
+    <td style="font-size: 11px; padding: 5px;">Assumes storage layer optimizes transfer. </td>
+  </tr>
+
+</table>
+<h3>PPB_Var</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">VarFromUtf8 </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">TextDecoder.decode </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">VarToUtf8 </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">TextEncoder.encode </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">VarFromResource </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">N/A </td>
+    <td style="font-size: 11px; padding: 5px;">N/A </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">VarToResource </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">N/A </td>
+    <td style="font-size: 11px; padding: 5px;">N/A </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_VarArray</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Get </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">Array[i] </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Set </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">Array[i] = x </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetLength </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">Array.length </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">SetLength </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">Array.length = n </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_VarArrayBuffer</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Create </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">new ArrayBuffer(n) </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">ByteLength </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">ArrayBuffer.byteLength </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Map </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No direct equivalent</td>
+    <td style="font-size: 11px; padding: 5px;">Asm.js / Wasm modules are unable to map regions of an ArrayBuffer other than their single linear memory heap.
+Future multiple memories or memory mapping might improve this. </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Unmap </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No direct equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_VarDictionary</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Create </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">{} </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Get </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">&lt;Object&gt;[i] </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Set </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">&lt;Object&gt;[i] = x </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Delete </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">delete &lt;Object&gt;[i] </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">HasKey </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">x in &lt;Object&gt; </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetKeys </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">for (k in &lt;Object&gt;) {} </td>
+    <td style="font-size: 11px; padding: 5px;">No literal equivalent, but it can be built. </td>
+  </tr>
+
+</table>
+<h3>PPB_VideoDecoder</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Create </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Initialize </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Decode </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetPicture </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">RecyclePicture </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Flush </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Reset </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_VideoEncoder</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Create </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;">Overlap with MediaRecorder API, but not exact. </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetSupportedProfiles </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Initialize </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetFramesRequired </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetFrameCodedSize </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetVideoFrame </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Encode </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetBitstreamBuffer </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">RecycleBitstreamBuffer </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">RequestEncodingParametersChange </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Close </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_VideoFrame</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetTimestamp </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">SetTimestamp </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetFormat </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetSize </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetDataBuffer </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetDataBufferSize </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_View</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetRect </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">Element.getBoundingClientRect </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">IsFullscreen </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">Document.fullScreenEnabled </td>
+    <td style="font-size: 11px; padding: 5px;">Pertains to document instead of just single element. </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">IsVisible </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">IntersectionObserver </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">IsPageVisible </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">document.visibilityState </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetClipRect </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">IntersectionObserver </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetDeviceScale </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">window.devicePixelRatio </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetCSSScale </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">&lt;Element&gt;.getBoundingClientRect().width / &lt;Element&gt;.offsetWidth </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetScrollOffset </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">&lt;Element&gt;.scrollTop / &lt;Element&gt;.scrollLeft </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_WebSocket</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Create </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">WebSocket.WebSocket </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Connect </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">WebSocket.WebSocket(url, ...)
+WebSocket 'open' Event </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Close </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">WebSocket.close </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">ReceiveMessage </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">WebSocket 'message' Event
+WebSocket 'error' Event
+WebSocket 'close' Event </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">SendMessage </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">WebSocket.send </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetBufferedAmount </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">WebSocket.bufferedAmount </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetCloseCode </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">CloseEvent.code </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetCloseReason </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">CloseEvent.reason </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetCloseWasClean </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">CloseEvent.wasClean </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetExtensions </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">WebSocket.extensions </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetProtocol </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">WebSocket.protocol </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetReadyState </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">WebSocket.readyState </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetURL </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">WebSocket.url </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPP_Graphics3D</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Graphics3DContextLost </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">Canvas 'webglcontextlost' Event </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPP_InputEvent</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">HandleInputEvent </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">Element.addEventListener </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPP_Instance</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">DidCreate </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">N/A </td>
+    <td style="font-size: 11px; padding: 5px;">&lt;Element&gt;[key] </td>
+    <td style="font-size: 11px; padding: 5px;">General DOM access lets you fish out tag attributes </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">DidDestroy </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">N/A </td>
+    <td style="font-size: 11px; padding: 5px;">N/A </td>
+    <td style="font-size: 11px; padding: 5px;">Not triggered for NaCl </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">DidChangeView </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">N/A </td>
+    <td style="font-size: 11px; padding: 5px;">Element 'resize' Event </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">DidChangeFocus </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">N/A </td>
+    <td style="font-size: 11px; padding: 5px;">Element 'focus', 'focusin', 'focusout' Events </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">HandleDocumentLoad </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">N/A </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No way to register as a mime type handler</td>
+    <td style="font-size: 11px; padding: 5px;">NaCl modules via apps + a manifest entry can be set up to handle particular mime types. </td>
+  </tr>
+
+</table>
+<h3>PPP_MessageHandler</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">HandleMessage </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">MessagePort 'message' Event
+Window 'message' Event </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">HandleBlockingMessage </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">N/A </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No direct equivalent</td>
+    <td style="font-size: 11px; padding: 5px;">Similar synchronization can be done off main thread with Atomics.wait. This was added to support emulation of synchronous plugin APIs. </td>
+  </tr>
+
+</table>
+<h3>PPP_Messaging</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">HandleMessage </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">MessagePort 'message' Event
+Window 'message' Event </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPP_MouseLock</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">MouseLockLost </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">Element 'pointerlockchange', 'pointerlockerror' Events </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h2 id="ppapi-apps">PPAPI (Apps)</h2>
+<table>
+</table>
+<h3>PPB_HostResolver</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Create </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffeecc" style="font-size: 11px; padding: 5px;">GAP (partial) - No direct equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Resolve </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffeecc" style="font-size: 11px; padding: 5px;">GAP (partial) - No direct equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetCanonicalName </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffeecc" style="font-size: 11px; padding: 5px;">GAP (partial) - No direct equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetNetAddressCount </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffeecc" style="font-size: 11px; padding: 5px;">GAP (partial) - No direct equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetNetAddress </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffeecc" style="font-size: 11px; padding: 5px;">GAP (partial) - No direct equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_NetAddress</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">CreateFromIPv4Address </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffeecc" style="font-size: 11px; padding: 5px;">GAP (partial) - No direct equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">CreateFromIPv6Address </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffeecc" style="font-size: 11px; padding: 5px;">GAP (partial) - No direct equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetFamily </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffeecc" style="font-size: 11px; padding: 5px;">GAP (partial) - No direct equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">DescribeAsString </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffeecc" style="font-size: 11px; padding: 5px;">GAP (partial) - No direct equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">DescribeAsIPv4Address </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffeecc" style="font-size: 11px; padding: 5px;">GAP (partial) - No direct equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">DescribeAsIPv6Address </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffeecc" style="font-size: 11px; padding: 5px;">GAP (partial) - No direct equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_NetworkList</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetCount </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No direct equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetName </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No direct equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetType </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No direct equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetState </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No direct equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetIpAddress </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No direct equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetDisplayName </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No direct equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetMTU </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No direct equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_NetworkMonitor</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Create </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No direct equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">UpdateNetworkList </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No direct equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_NetworkProxy</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetProxyForURL </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No direct equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_TCPSocket</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Create </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">chrome.sockets.tcp.create </td>
+    <td style="font-size: 11px; padding: 5px;">WebSockets / WebRTC closest practical equivalent on open Web. </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;"> </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">chrome.sockets.tcpServer.create </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Bind </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">chrome.sockets.tcpServer.create </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Connect </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">chrome.sockets.tcp.connect </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetLocalAddress </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">chrome.sockets.udp.SocketInfo </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetRemoteAddress </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">chrome.sockets.udp.SocketInfo </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Read </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">onReceive* Events </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Write </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">chrome.sockets.tcp.send </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Listen </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">chrome.sockets.tcpServer.listen </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Accept </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">onAccept* Events </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Close </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">chrome.sockets.tcp.close </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;"> </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">chrome.sockets.tcpServer.close </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">SetOption </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">chrome.sockets.tcp.update </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;"> </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">chrome.sockets.tcpServer.update </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_UDPSocket</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Create </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">chrome.sockets.udp.create </td>
+    <td bgcolor="#ffeecc" style="font-size: 11px; padding: 5px;">GAP (partial) - WebRTC closest practical open Web equivalent</td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Bind </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">chrome.sockets.udp.bind </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetBoundAddress </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">chrome.sockets.udp.SocketInfo </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">RecvFrom </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">onReceive* Events </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">SendTo </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">chrome.sockets.udp.send </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Close </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">chrome.sockets.udp.close </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">SetOption </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">chrome.sockets.udp.update </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">JoinGroup </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">chrome.sockets.udp.joinGroup </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">LeaveGroup </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">chrome.sockets.udp.leaveGroup </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+</section>
+
+{{/partials.standard_nacl_article}}
diff --git a/native_client_sdk/doc_generated/nacl-and-pnacl.html b/native_client_sdk/doc_generated/nacl-and-pnacl.html
index f88487c..f5b76ab9 100644
--- a/native_client_sdk/doc_generated/nacl-and-pnacl.html
+++ b/native_client_sdk/doc_generated/nacl-and-pnacl.html
@@ -1,7 +1,15 @@
 {{+bindTo:partials.standard_nacl_article}}
 
-<section id="nacl-and-pnacl">
-<span id="id1"></span><h1 id="nacl-and-pnacl"><span id="id1"></span>NaCl and PNaCl</h1>
+<b><font color="#cc0000">
+NOTE:
+Deprecation of the technologies described here has been announced
+for platforms other than ChromeOS.<br/>
+Please visit our
+<a href="/native-client/migration">migration guide</a>
+for details.
+</font></b>
+<hr/><section id="id1">
+<h1 id="id1">NaCl and PNaCl</h1>
 <p>This document describes the differences between <strong>Native Client</strong> and
 <strong>Portable Native Client</strong>, and provides recommendations for when to use each.</p>
 <div class="contents local" id="contents" style="display: none">
diff --git a/native_client_sdk/doc_generated/nacldev.html b/native_client_sdk/doc_generated/nacldev.html
index 8ca68112..2b070b69 100644
--- a/native_client_sdk/doc_generated/nacldev.html
+++ b/native_client_sdk/doc_generated/nacldev.html
@@ -1,7 +1,15 @@
 {{+bindTo:partials.standard_nacl_article}}
 
-<section id="nacl-dev-environment">
-<span id="nacldev"></span><h1 id="nacl-dev-environment"><span id="nacldev"></span>NaCl Dev Environment</h1>
+<b><font color="#cc0000">
+NOTE:
+Deprecation of the technologies described here has been announced
+for platforms other than ChromeOS.<br/>
+Please visit our
+<a href="/native-client/migration">migration guide</a>
+for details.
+</font></b>
+<hr/><section id="nacl-dev-environment">
+<h1 id="nacl-dev-environment">NaCl Dev Environment</h1>
 <h2 id="feature-status">Feature Status</h2>
 <p>Here is a summary of feature status. We hope to overcome these limitations
 in the near future:</p>
diff --git a/native_client_sdk/doc_generated/overview.html b/native_client_sdk/doc_generated/overview.html
index bf037b6d..f77d25e 100644
--- a/native_client_sdk/doc_generated/overview.html
+++ b/native_client_sdk/doc_generated/overview.html
@@ -1,7 +1,15 @@
 {{+bindTo:partials.standard_nacl_article}}
 
-<section id="technical-overview">
-<span id="overview"></span><h1 id="technical-overview"><span id="overview"></span>Technical Overview</h1>
+<b><font color="#cc0000">
+NOTE:
+Deprecation of the technologies described here has been announced
+for platforms other than ChromeOS.<br/>
+Please visit our
+<a href="/native-client/migration">migration guide</a>
+for details.
+</font></b>
+<hr/><section id="technical-overview">
+<h1 id="technical-overview">Technical Overview</h1>
 <div class="contents local" id="contents" style="display: none">
 <ul class="small-gap">
 <li><a class="reference internal" href="#why-use-native-client" id="id7">Why use Native Client?</a></li>
diff --git a/native_client_sdk/doc_generated/pepper_beta/c/globals_defs.html b/native_client_sdk/doc_generated/pepper_beta/c/globals_defs.html
index b08950b1..46088eb 100644
--- a/native_client_sdk/doc_generated/pepper_beta/c/globals_defs.html
+++ b/native_client_sdk/doc_generated/pepper_beta/c/globals_defs.html
@@ -85,8 +85,8 @@
 <li>PPB_GRAPHICS_2D_INTERFACE
 : <a class="el" href="ppb__graphics__2d_8h.html#ab4930fe7aea6b403503d5cc748824b0d">ppb_graphics_2d.h</a>
 </li>
-<li>PPB_GRAPHICS_2D_INTERFACE_1_1
-: <a class="el" href="ppb__graphics__2d_8h.html#ad9792b60ca6ce77f3925be8d60e06640">ppb_graphics_2d.h</a>
+<li>PPB_GRAPHICS_2D_INTERFACE_1_2
+: <a class="el" href="ppb__graphics__2d_8h.html#a8991520a54fc032adae6e8de92d0e0c5">ppb_graphics_2d.h</a>
 </li>
 <li>PPB_GRAPHICS_3D_INTERFACE
 : <a class="el" href="ppb__graphics__3d_8h.html#a3ba3c80f5959aca6bdef2584a2ceb55e">ppb_graphics_3d.h</a>
@@ -331,6 +331,9 @@
 <li>PPB_VIEW_INTERFACE_1_2
 : <a class="el" href="ppb__view_8h.html#a5cdcf0cc190c3ad8c47904939c519a85">ppb_view.h</a>
 </li>
+<li>PPB_VPNPROVIDER_INTERFACE_0_1
+: <a class="el" href="ppb__vpn__provider_8h.html#adc236058517f438cdd43d61c8948de69">ppb_vpn_provider.h</a>
+</li>
 <li>PPB_WEBSOCKET_INTERFACE
 : <a class="el" href="ppb__websocket_8h.html#a6d56a012c9350b4cc4e55b668d3fbe75">ppb_websocket.h</a>
 </li>
diff --git a/native_client_sdk/doc_generated/pepper_beta/c/group___enums.html b/native_client_sdk/doc_generated/pepper_beta/c/group___enums.html
index f5d7907..80d38a7 100644
--- a/native_client_sdk/doc_generated/pepper_beta/c/group___enums.html
+++ b/native_client_sdk/doc_generated/pepper_beta/c/group___enums.html
@@ -244,7 +244,9 @@
 <a class="el" href="group___enums.html#gga21b811ac0484a214a8751aa3e1c959d9a493ca598187014e2356cd7a5ba8cdffd">PP_INPUTEVENT_MODIFIER_NUMLOCKKEY</a> =  1 &lt;&lt; 10, 
 <a class="el" href="group___enums.html#gga21b811ac0484a214a8751aa3e1c959d9a8295bfc8067c06a17ccfc5fb6a992e17">PP_INPUTEVENT_MODIFIER_ISLEFT</a> =  1 &lt;&lt; 11, 
 <br />
-&#160;&#160;<a class="el" href="group___enums.html#gga21b811ac0484a214a8751aa3e1c959d9a348f43efaf61edbefd83346428c5b122">PP_INPUTEVENT_MODIFIER_ISRIGHT</a> =  1 &lt;&lt; 12
+&#160;&#160;<a class="el" href="group___enums.html#gga21b811ac0484a214a8751aa3e1c959d9a348f43efaf61edbefd83346428c5b122">PP_INPUTEVENT_MODIFIER_ISRIGHT</a> =  1 &lt;&lt; 12, 
+<a class="el" href="group___enums.html#gga21b811ac0484a214a8751aa3e1c959d9a970ad827a7240093ec57f1a3a7aea692">PP_INPUTEVENT_MODIFIER_ISPEN</a> =  1 &lt;&lt; 13, 
+<a class="el" href="group___enums.html#gga21b811ac0484a214a8751aa3e1c959d9a3367f08ba940a67d0098a59093582ef1">PP_INPUTEVENT_MODIFIER_ISERASER</a> =  1 &lt;&lt; 14
 <br />
  }</td></tr>
 <tr><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#ga25113f3c8d33e863fd38b3f70f8a5e6e">PP_InputEvent_MouseButton</a> { <a class="el" href="group___enums.html#gga25113f3c8d33e863fd38b3f70f8a5e6eaa2d4e499d6c23ef45381a89612e654d9">PP_INPUTEVENT_MOUSEBUTTON_NONE</a> =  -1, 
@@ -1155,6 +1157,10 @@
 </td></tr>
 <tr><td valign="top"><em><a class="anchor" id="gga21b811ac0484a214a8751aa3e1c959d9a348f43efaf61edbefd83346428c5b122"></a><!-- doxytag: member="PP_INPUTEVENT_MODIFIER_ISRIGHT" ref="gga21b811ac0484a214a8751aa3e1c959d9a348f43efaf61edbefd83346428c5b122" args="" -->PP_INPUTEVENT_MODIFIER_ISRIGHT</em>&nbsp;</td><td>
 </td></tr>
+<tr><td valign="top"><em><a class="anchor" id="gga21b811ac0484a214a8751aa3e1c959d9a970ad827a7240093ec57f1a3a7aea692"></a><!-- doxytag: member="PP_INPUTEVENT_MODIFIER_ISPEN" ref="gga21b811ac0484a214a8751aa3e1c959d9a970ad827a7240093ec57f1a3a7aea692" args="" -->PP_INPUTEVENT_MODIFIER_ISPEN</em>&nbsp;</td><td>
+</td></tr>
+<tr><td valign="top"><em><a class="anchor" id="gga21b811ac0484a214a8751aa3e1c959d9a3367f08ba940a67d0098a59093582ef1"></a><!-- doxytag: member="PP_INPUTEVENT_MODIFIER_ISERASER" ref="gga21b811ac0484a214a8751aa3e1c959d9a3367f08ba940a67d0098a59093582ef1" args="" -->PP_INPUTEVENT_MODIFIER_ISERASER</em>&nbsp;</td><td>
+</td></tr>
 </table>
 </dd>
 </dl>
diff --git a/native_client_sdk/doc_generated/pepper_beta/c/group___interfaces.html b/native_client_sdk/doc_generated/pepper_beta/c/group___interfaces.html
index 72f88bb..4a04f9f 100644
--- a/native_client_sdk/doc_generated/pepper_beta/c/group___interfaces.html
+++ b/native_client_sdk/doc_generated/pepper_beta/c/group___interfaces.html
@@ -35,8 +35,8 @@
 <tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The <code>PPB_Fullscreen</code> interface is implemented by the browser.  <a href="struct_p_p_b___fullscreen__1__0.html#details">More...</a><br /></td></tr>
 <tr><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___gamepad__1__0.html">PPB_Gamepad</a></td></tr>
 <tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The <code>PPB_Gamepad</code> interface allows retrieving data from gamepad/joystick devices that are connected to the system.  <a href="struct_p_p_b___gamepad__1__0.html#details">More...</a><br /></td></tr>
-<tr><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___graphics2_d__1__1.html">PPB_Graphics2D</a></td></tr>
-<tr><td class="mdescLeft">&#160;</td><td class="mdescRight"><code>PPB_Graphics2D</code> defines the interface for a 2D graphics context.  <a href="struct_p_p_b___graphics2_d__1__1.html#details">More...</a><br /></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___graphics2_d__1__2.html">PPB_Graphics2D</a></td></tr>
+<tr><td class="mdescLeft">&#160;</td><td class="mdescRight"><code>PPB_Graphics2D</code> defines the interface for a 2D graphics context.  <a href="struct_p_p_b___graphics2_d__1__2.html#details">More...</a><br /></td></tr>
 <tr><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___graphics3_d__1__0.html">PPB_Graphics3D</a></td></tr>
 <tr><td class="mdescLeft">&#160;</td><td class="mdescRight"><code>PPB_Graphics3D</code> defines the interface for a 3D graphics context.  <a href="struct_p_p_b___graphics3_d__1__0.html#details">More...</a><br /></td></tr>
 <tr><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___host_resolver__1__0.html">PPB_HostResolver</a></td></tr>
@@ -116,6 +116,8 @@
 <tr><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_frame__0__1.html">PPB_VideoFrame</a></td></tr>
 <tr><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___view__1__2.html">PPB_View</a></td></tr>
 <tr><td class="mdescLeft">&#160;</td><td class="mdescRight"><code>PPB_View</code> represents the state of the view of an instance.  <a href="struct_p_p_b___view__1__2.html#details">More...</a><br /></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___vpn_provider__0__1.html">PPB_VpnProvider</a></td></tr>
+<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Use the <code>PPB_VpnProvider</code> interface to implement a VPN client.  <a href="struct_p_p_b___vpn_provider__0__1.html#details">More...</a><br /></td></tr>
 <tr><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___web_socket__1__0.html">PPB_WebSocket</a></td></tr>
 <tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The <code>PPB_WebSocket</code> interface provides bi-directional, full-duplex, communications over a single TCP socket.  <a href="struct_p_p_b___web_socket__1__0.html#details">More...</a><br /></td></tr>
 <tr><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_p___graphics3_d__1__0.html">PPP_Graphics3D</a></td></tr>
@@ -141,7 +143,7 @@
 <tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___file_system__1__0.html">PPB_FileSystem</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#gae5ad593b6aff864c6bd0acc09d6cc5e9">PPB_FileSystem</a></td></tr>
 <tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___fullscreen__1__0.html">PPB_Fullscreen</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#ga965dcf552ef79d1a41e0c24db2cf5c3c">PPB_Fullscreen</a></td></tr>
 <tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___gamepad__1__0.html">PPB_Gamepad</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#ga57baea75086a666a92489da807f16f2a">PPB_Gamepad</a></td></tr>
-<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___graphics2_d__1__1.html">PPB_Graphics2D</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#gaf9f8348d3315d8bb014b401f733ebdb6">PPB_Graphics2D</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___graphics2_d__1__2.html">PPB_Graphics2D</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#gae81de3c5ca761162254ed217693050ba">PPB_Graphics2D</a></td></tr>
 <tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___graphics3_d__1__0.html">PPB_Graphics3D</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#ga2865870b49481aae8ed416c06c58a7c0">PPB_Graphics3D</a></td></tr>
 <tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___host_resolver__1__0.html">PPB_HostResolver</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#ga72b9bd04eeace0c69f4e454b7cc4e440">PPB_HostResolver</a></td></tr>
 <tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___image_data__1__0.html">PPB_ImageData</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#ga17e05bbe7da0d6d7b61b6f78c5913c37">PPB_ImageData</a></td></tr>
@@ -317,12 +319,12 @@
 <div class="memdoc">
 </div>
 </div>
-<a class="anchor" id="gaf9f8348d3315d8bb014b401f733ebdb6"></a><!-- doxytag: member="ppb_graphics_2d.h::PPB_Graphics2D" ref="gaf9f8348d3315d8bb014b401f733ebdb6" args="" -->
+<a class="anchor" id="gae81de3c5ca761162254ed217693050ba"></a><!-- doxytag: member="ppb_graphics_2d.h::PPB_Graphics2D" ref="gae81de3c5ca761162254ed217693050ba" args="" -->
 <div class="memitem">
 <div class="memproto">
 <table class="memname">
 <tr>
-<td class="memname">typedef struct <a class="el" href="struct_p_p_b___graphics2_d__1__1.html">PPB_Graphics2D</a> <a class="el" href="group___interfaces.html#gaf9f8348d3315d8bb014b401f733ebdb6">PPB_Graphics2D</a></td>
+<td class="memname">typedef struct <a class="el" href="struct_p_p_b___graphics2_d__1__2.html">PPB_Graphics2D</a> <a class="el" href="group___interfaces.html#gae81de3c5ca761162254ed217693050ba">PPB_Graphics2D</a></td>
 </tr>
 </table>
 </div>
diff --git a/native_client_sdk/doc_generated/pepper_beta/c/jquery.js b/native_client_sdk/doc_generated/pepper_beta/c/jquery.js
new file mode 100644
index 0000000..90b3a2b
--- /dev/null
+++ b/native_client_sdk/doc_generated/pepper_beta/c/jquery.js
@@ -0,0 +1,64 @@
+/*
+ * jQuery JavaScript Library v1.3.2
+ * http://jquery.com/
+ *
+ * Copyright (c) 2009 John Resig
+ * Dual licensed under the MIT and GPL licenses.
+ * http://docs.jquery.com/License
+ *
+ * Date: 2009-02-19 17:34:21 -0500 (Thu, 19 Feb 2009)
+ * Revision: 6246
+ */
+(function(){var l=this,g,y=l.jQuery,p=l.$,o=l.jQuery=l.$=function(E,F){return new o.fn.init(E,F)},D=/^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/,f=/^.[^:#\[\.,]*$/;o.fn=o.prototype={init:function(E,H){E=E||document;if(E.nodeType){this[0]=E;this.length=1;this.context=E;return this}if(typeof E==="string"){var G=D.exec(E);if(G&&(G[1]||!H)){if(G[1]){E=o.clean([G[1]],H)}else{var I=document.getElementById(G[3]);if(I&&I.id!=G[3]){return o().find(E)}var F=o(I||[]);F.context=document;F.selector=E;return F}}else{return o(H).find(E)}}else{if(o.isFunction(E)){return o(document).ready(E)}}if(E.selector&&E.context){this.selector=E.selector;this.context=E.context}return this.setArray(o.isArray(E)?E:o.makeArray(E))},selector:"",jquery:"1.3.2",size:function(){return this.length},get:function(E){return E===g?Array.prototype.slice.call(this):this[E]},pushStack:function(F,H,E){var G=o(F);G.prevObject=this;G.context=this.context;if(H==="find"){G.selector=this.selector+(this.selector?" ":"")+E}else{if(H){G.selector=this.selector+"."+H+"("+E+")"}}return G},setArray:function(E){this.length=0;Array.prototype.push.apply(this,E);return this},each:function(F,E){return o.each(this,F,E)},index:function(E){return o.inArray(E&&E.jquery?E[0]:E,this)},attr:function(F,H,G){var E=F;if(typeof F==="string"){if(H===g){return this[0]&&o[G||"attr"](this[0],F)}else{E={};E[F]=H}}return this.each(function(I){for(F in E){o.attr(G?this.style:this,F,o.prop(this,E[F],G,I,F))}})},css:function(E,F){if((E=="width"||E=="height")&&parseFloat(F)<0){F=g}return this.attr(E,F,"curCSS")},text:function(F){if(typeof F!=="object"&&F!=null){return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(F))}var E="";o.each(F||this,function(){o.each(this.childNodes,function(){if(this.nodeType!=8){E+=this.nodeType!=1?this.nodeValue:o.fn.text([this])}})});return E},wrapAll:function(E){if(this[0]){var F=o(E,this[0].ownerDocument).clone();if(this[0].parentNode){F.insertBefore(this[0])}F.map(function(){var G=this;while(G.firstChild){G=G.firstChild}return G}).append(this)}return this},wrapInner:function(E){return this.each(function(){o(this).contents().wrapAll(E)})},wrap:function(E){return this.each(function(){o(this).wrapAll(E)})},append:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.appendChild(E)}})},prepend:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.insertBefore(E,this.firstChild)}})},before:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this)})},after:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this.nextSibling)})},end:function(){return this.prevObject||o([])},push:[].push,sort:[].sort,splice:[].splice,find:function(E){if(this.length===1){var F=this.pushStack([],"find",E);F.length=0;o.find(E,this[0],F);return F}else{return this.pushStack(o.unique(o.map(this,function(G){return o.find(E,G)})),"find",E)}},clone:function(G){var E=this.map(function(){if(!o.support.noCloneEvent&&!o.isXMLDoc(this)){var I=this.outerHTML;if(!I){var J=this.ownerDocument.createElement("div");J.appendChild(this.cloneNode(true));I=J.innerHTML}return o.clean([I.replace(/ jQuery\d+="(?:\d+|null)"/g,"").replace(/^\s*/,"")])[0]}else{return this.cloneNode(true)}});if(G===true){var H=this.find("*").andSelf(),F=0;E.find("*").andSelf().each(function(){if(this.nodeName!==H[F].nodeName){return}var I=o.data(H[F],"events");for(var K in I){for(var J in I[K]){o.event.add(this,K,I[K][J],I[K][J].data)}}F++})}return E},filter:function(E){return this.pushStack(o.isFunction(E)&&o.grep(this,function(G,F){return E.call(G,F)})||o.multiFilter(E,o.grep(this,function(F){return F.nodeType===1})),"filter",E)},closest:function(E){var G=o.expr.match.POS.test(E)?o(E):null,F=0;return this.map(function(){var H=this;while(H&&H.ownerDocument){if(G?G.index(H)>-1:o(H).is(E)){o.data(H,"closest",F);return H}H=H.parentNode;F++}})},not:function(E){if(typeof E==="string"){if(f.test(E)){return this.pushStack(o.multiFilter(E,this,true),"not",E)}else{E=o.multiFilter(E,this)}}var F=E.length&&E[E.length-1]!==g&&!E.nodeType;return this.filter(function(){return F?o.inArray(this,E)<0:this!=E})},add:function(E){return this.pushStack(o.unique(o.merge(this.get(),typeof E==="string"?o(E):o.makeArray(E))))},is:function(E){return !!E&&o.multiFilter(E,this).length>0},hasClass:function(E){return !!E&&this.is("."+E)},val:function(K){if(K===g){var E=this[0];if(E){if(o.nodeName(E,"option")){return(E.attributes.value||{}).specified?E.value:E.text}if(o.nodeName(E,"select")){var I=E.selectedIndex,L=[],M=E.options,H=E.type=="select-one";if(I<0){return null}for(var F=H?I:0,J=H?I+1:M.length;F<J;F++){var G=M[F];if(G.selected){K=o(G).val();if(H){return K}L.push(K)}}return L}return(E.value||"").replace(/\r/g,"")}return g}if(typeof K==="number"){K+=""}return this.each(function(){if(this.nodeType!=1){return}if(o.isArray(K)&&/radio|checkbox/.test(this.type)){this.checked=(o.inArray(this.value,K)>=0||o.inArray(this.name,K)>=0)}else{if(o.nodeName(this,"select")){var N=o.makeArray(K);o("option",this).each(function(){this.selected=(o.inArray(this.value,N)>=0||o.inArray(this.text,N)>=0)});if(!N.length){this.selectedIndex=-1}}else{this.value=K}}})},html:function(E){return E===g?(this[0]?this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g,""):null):this.empty().append(E)},replaceWith:function(E){return this.after(E).remove()},eq:function(E){return this.slice(E,+E+1)},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments),"slice",Array.prototype.slice.call(arguments).join(","))},map:function(E){return this.pushStack(o.map(this,function(G,F){return E.call(G,F,G)}))},andSelf:function(){return this.add(this.prevObject)},domManip:function(J,M,L){if(this[0]){var I=(this[0].ownerDocument||this[0]).createDocumentFragment(),F=o.clean(J,(this[0].ownerDocument||this[0]),I),H=I.firstChild;if(H){for(var G=0,E=this.length;G<E;G++){L.call(K(this[G],H),this.length>1||G>0?I.cloneNode(true):I)}}if(F){o.each(F,z)}}return this;function K(N,O){return M&&o.nodeName(N,"table")&&o.nodeName(O,"tr")?(N.getElementsByTagName("tbody")[0]||N.appendChild(N.ownerDocument.createElement("tbody"))):N}}};o.fn.init.prototype=o.fn;function z(E,F){if(F.src){o.ajax({url:F.src,async:false,dataType:"script"})}else{o.globalEval(F.text||F.textContent||F.innerHTML||"")}if(F.parentNode){F.parentNode.removeChild(F)}}function e(){return +new Date}o.extend=o.fn.extend=function(){var J=arguments[0]||{},H=1,I=arguments.length,E=false,G;if(typeof J==="boolean"){E=J;J=arguments[1]||{};H=2}if(typeof J!=="object"&&!o.isFunction(J)){J={}}if(I==H){J=this;--H}for(;H<I;H++){if((G=arguments[H])!=null){for(var F in G){var K=J[F],L=G[F];if(J===L){continue}if(E&&L&&typeof L==="object"&&!L.nodeType){J[F]=o.extend(E,K||(L.length!=null?[]:{}),L)}else{if(L!==g){J[F]=L}}}}}return J};var b=/z-?index|font-?weight|opacity|zoom|line-?height/i,q=document.defaultView||{},s=Object.prototype.toString;o.extend({noConflict:function(E){l.$=p;if(E){l.jQuery=y}return o},isFunction:function(E){return s.call(E)==="[object Function]"},isArray:function(E){return s.call(E)==="[object Array]"},isXMLDoc:function(E){return E.nodeType===9&&E.documentElement.nodeName!=="HTML"||!!E.ownerDocument&&o.isXMLDoc(E.ownerDocument)},globalEval:function(G){if(G&&/\S/.test(G)){var F=document.getElementsByTagName("head")[0]||document.documentElement,E=document.createElement("script");E.type="text/javascript";if(o.support.scriptEval){E.appendChild(document.createTextNode(G))}else{E.text=G}F.insertBefore(E,F.firstChild);F.removeChild(E)}},nodeName:function(F,E){return F.nodeName&&F.nodeName.toUpperCase()==E.toUpperCase()},each:function(G,K,F){var E,H=0,I=G.length;if(F){if(I===g){for(E in G){if(K.apply(G[E],F)===false){break}}}else{for(;H<I;){if(K.apply(G[H++],F)===false){break}}}}else{if(I===g){for(E in G){if(K.call(G[E],E,G[E])===false){break}}}else{for(var J=G[0];H<I&&K.call(J,H,J)!==false;J=G[++H]){}}}return G},prop:function(H,I,G,F,E){if(o.isFunction(I)){I=I.call(H,F)}return typeof I==="number"&&G=="curCSS"&&!b.test(E)?I+"px":I},className:{add:function(E,F){o.each((F||"").split(/\s+/),function(G,H){if(E.nodeType==1&&!o.className.has(E.className,H)){E.className+=(E.className?" ":"")+H}})},remove:function(E,F){if(E.nodeType==1){E.className=F!==g?o.grep(E.className.split(/\s+/),function(G){return !o.className.has(F,G)}).join(" "):""}},has:function(F,E){return F&&o.inArray(E,(F.className||F).toString().split(/\s+/))>-1}},swap:function(H,G,I){var E={};for(var F in G){E[F]=H.style[F];H.style[F]=G[F]}I.call(H);for(var F in G){H.style[F]=E[F]}},css:function(H,F,J,E){if(F=="width"||F=="height"){var L,G={position:"absolute",visibility:"hidden",display:"block"},K=F=="width"?["Left","Right"]:["Top","Bottom"];function I(){L=F=="width"?H.offsetWidth:H.offsetHeight;if(E==="border"){return}o.each(K,function(){if(!E){L-=parseFloat(o.curCSS(H,"padding"+this,true))||0}if(E==="margin"){L+=parseFloat(o.curCSS(H,"margin"+this,true))||0}else{L-=parseFloat(o.curCSS(H,"border"+this+"Width",true))||0}})}if(H.offsetWidth!==0){I()}else{o.swap(H,G,I)}return Math.max(0,Math.round(L))}return o.curCSS(H,F,J)},curCSS:function(I,F,G){var L,E=I.style;if(F=="opacity"&&!o.support.opacity){L=o.attr(E,"opacity");return L==""?"1":L}if(F.match(/float/i)){F=w}if(!G&&E&&E[F]){L=E[F]}else{if(q.getComputedStyle){if(F.match(/float/i)){F="float"}F=F.replace(/([A-Z])/g,"-$1").toLowerCase();var M=q.getComputedStyle(I,null);if(M){L=M.getPropertyValue(F)}if(F=="opacity"&&L==""){L="1"}}else{if(I.currentStyle){var J=F.replace(/\-(\w)/g,function(N,O){return O.toUpperCase()});L=I.currentStyle[F]||I.currentStyle[J];if(!/^\d+(px)?$/i.test(L)&&/^\d/.test(L)){var H=E.left,K=I.runtimeStyle.left;I.runtimeStyle.left=I.currentStyle.left;E.left=L||0;L=E.pixelLeft+"px";E.left=H;I.runtimeStyle.left=K}}}}return L},clean:function(F,K,I){K=K||document;if(typeof K.createElement==="undefined"){K=K.ownerDocument||K[0]&&K[0].ownerDocument||document}if(!I&&F.length===1&&typeof F[0]==="string"){var H=/^<(\w+)\s*\/?>$/.exec(F[0]);if(H){return[K.createElement(H[1])]}}var G=[],E=[],L=K.createElement("div");o.each(F,function(P,S){if(typeof S==="number"){S+=""}if(!S){return}if(typeof S==="string"){S=S.replace(/(<(\w+)[^>]*?)\/>/g,function(U,V,T){return T.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?U:V+"></"+T+">"});var O=S.replace(/^\s+/,"").substring(0,10).toLowerCase();var Q=!O.indexOf("<opt")&&[1,"<select multiple='multiple'>","</select>"]||!O.indexOf("<leg")&&[1,"<fieldset>","</fieldset>"]||O.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"<table>","</table>"]||!O.indexOf("<tr")&&[2,"<table><tbody>","</tbody></table>"]||(!O.indexOf("<td")||!O.indexOf("<th"))&&[3,"<table><tbody><tr>","</tr></tbody></table>"]||!O.indexOf("<col")&&[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"]||!o.support.htmlSerialize&&[1,"div<div>","</div>"]||[0,"",""];L.innerHTML=Q[1]+S+Q[2];while(Q[0]--){L=L.lastChild}if(!o.support.tbody){var R=/<tbody/i.test(S),N=!O.indexOf("<table")&&!R?L.firstChild&&L.firstChild.childNodes:Q[1]=="<table>"&&!R?L.childNodes:[];for(var M=N.length-1;M>=0;--M){if(o.nodeName(N[M],"tbody")&&!N[M].childNodes.length){N[M].parentNode.removeChild(N[M])}}}if(!o.support.leadingWhitespace&&/^\s/.test(S)){L.insertBefore(K.createTextNode(S.match(/^\s*/)[0]),L.firstChild)}S=o.makeArray(L.childNodes)}if(S.nodeType){G.push(S)}else{G=o.merge(G,S)}});if(I){for(var J=0;G[J];J++){if(o.nodeName(G[J],"script")&&(!G[J].type||G[J].type.toLowerCase()==="text/javascript")){E.push(G[J].parentNode?G[J].parentNode.removeChild(G[J]):G[J])}else{if(G[J].nodeType===1){G.splice.apply(G,[J+1,0].concat(o.makeArray(G[J].getElementsByTagName("script"))))}I.appendChild(G[J])}}return E}return G},attr:function(J,G,K){if(!J||J.nodeType==3||J.nodeType==8){return g}var H=!o.isXMLDoc(J),L=K!==g;G=H&&o.props[G]||G;if(J.tagName){var F=/href|src|style/.test(G);if(G=="selected"&&J.parentNode){J.parentNode.selectedIndex}if(G in J&&H&&!F){if(L){if(G=="type"&&o.nodeName(J,"input")&&J.parentNode){throw"type property can't be changed"}J[G]=K}if(o.nodeName(J,"form")&&J.getAttributeNode(G)){return J.getAttributeNode(G).nodeValue}if(G=="tabIndex"){var I=J.getAttributeNode("tabIndex");return I&&I.specified?I.value:J.nodeName.match(/(button|input|object|select|textarea)/i)?0:J.nodeName.match(/^(a|area)$/i)&&J.href?0:g}return J[G]}if(!o.support.style&&H&&G=="style"){return o.attr(J.style,"cssText",K)}if(L){J.setAttribute(G,""+K)}var E=!o.support.hrefNormalized&&H&&F?J.getAttribute(G,2):J.getAttribute(G);return E===null?g:E}if(!o.support.opacity&&G=="opacity"){if(L){J.zoom=1;J.filter=(J.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(K)+""=="NaN"?"":"alpha(opacity="+K*100+")")}return J.filter&&J.filter.indexOf("opacity=")>=0?(parseFloat(J.filter.match(/opacity=([^)]*)/)[1])/100)+"":""}G=G.replace(/-([a-z])/ig,function(M,N){return N.toUpperCase()});if(L){J[G]=K}return J[G]},trim:function(E){return(E||"").replace(/^\s+|\s+$/g,"")},makeArray:function(G){var E=[];if(G!=null){var F=G.length;if(F==null||typeof G==="string"||o.isFunction(G)||G.setInterval){E[0]=G}else{while(F){E[--F]=G[F]}}}return E},inArray:function(G,H){for(var E=0,F=H.length;E<F;E++){if(H[E]===G){return E}}return -1},merge:function(H,E){var F=0,G,I=H.length;if(!o.support.getAll){while((G=E[F++])!=null){if(G.nodeType!=8){H[I++]=G}}}else{while((G=E[F++])!=null){H[I++]=G}}return H},unique:function(K){var F=[],E={};try{for(var G=0,H=K.length;G<H;G++){var J=o.data(K[G]);if(!E[J]){E[J]=true;F.push(K[G])}}}catch(I){F=K}return F},grep:function(F,J,E){var G=[];for(var H=0,I=F.length;H<I;H++){if(!E!=!J(F[H],H)){G.push(F[H])}}return G},map:function(E,J){var F=[];for(var G=0,H=E.length;G<H;G++){var I=J(E[G],G);if(I!=null){F[F.length]=I}}return F.concat.apply([],F)}});var C=navigator.userAgent.toLowerCase();o.browser={version:(C.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[0,"0"])[1],safari:/webkit/.test(C),opera:/opera/.test(C),msie:/msie/.test(C)&&!/opera/.test(C),mozilla:/mozilla/.test(C)&&!/(compatible|webkit)/.test(C)};o.each({parent:function(E){return E.parentNode},parents:function(E){return o.dir(E,"parentNode")},next:function(E){return o.nth(E,2,"nextSibling")},prev:function(E){return o.nth(E,2,"previousSibling")},nextAll:function(E){return o.dir(E,"nextSibling")},prevAll:function(E){return o.dir(E,"previousSibling")},siblings:function(E){return o.sibling(E.parentNode.firstChild,E)},children:function(E){return o.sibling(E.firstChild)},contents:function(E){return o.nodeName(E,"iframe")?E.contentDocument||E.contentWindow.document:o.makeArray(E.childNodes)}},function(E,F){o.fn[E]=function(G){var H=o.map(this,F);if(G&&typeof G=="string"){H=o.multiFilter(G,H)}return this.pushStack(o.unique(H),E,G)}});o.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(E,F){o.fn[E]=function(G){var J=[],L=o(G);for(var K=0,H=L.length;K<H;K++){
+var I=(K>0?this.clone(true):this).get();o.fn[F].apply(o(L[K]),I);J=J.concat(I)}return this.pushStack(J,E,G)}});o.each({removeAttr:function(E){o.attr(this,E,"");if(this.nodeType==1){this.removeAttribute(E)}},addClass:function(E){o.className.add(this,E)},removeClass:function(E){o.className.remove(this,E)},toggleClass:function(F,E){if(typeof E!=="boolean"){E=!o.className.has(this,F)}o.className[E?"add":"remove"](this,F)},remove:function(E){if(!E||o.filter(E,[this]).length){o("*",this).add([this]).each(function(){o.event.remove(this);o.removeData(this)});if(this.parentNode){this.parentNode.removeChild(this)}}},empty:function(){o(this).children().remove();while(this.firstChild){this.removeChild(this.firstChild)}}},function(E,F){o.fn[E]=function(){return this.each(F,arguments)}});function j(E,F){return E[0]&&parseInt(o.curCSS(E[0],F,true),10)||0}var h="jQuery"+e(),v=0,A={};o.extend({cache:{},data:function(F,E,G){F=F==l?A:F;var H=F[h];if(!H){H=F[h]=++v}if(E&&!o.cache[H]){o.cache[H]={}}if(G!==g){o.cache[H][E]=G}return E?o.cache[H][E]:H},removeData:function(F,E){F=F==l?A:F;var H=F[h];if(E){if(o.cache[H]){delete o.cache[H][E];E="";for(E in o.cache[H]){break}if(!E){o.removeData(F)}}}else{try{delete F[h]}catch(G){if(F.removeAttribute){F.removeAttribute(h)}}delete o.cache[H]}},queue:function(F,E,H){if(F){E=(E||"fx")+"queue";var G=o.data(F,E);if(!G||o.isArray(H)){G=o.data(F,E,o.makeArray(H))}else{if(H){G.push(H)}}}return G},dequeue:function(H,G){var E=o.queue(H,G),F=E.shift();if(!G||G==="fx"){F=E[0]}if(F!==g){F.call(H)}}});o.fn.extend({data:function(E,G){var H=E.split(".");H[1]=H[1]?"."+H[1]:"";if(G===g){var F=this.triggerHandler("getData"+H[1]+"!",[H[0]]);if(F===g&&this.length){F=o.data(this[0],E)}return F===g&&H[1]?this.data(H[0]):F}else{return this.trigger("setData"+H[1]+"!",[H[0],G]).each(function(){o.data(this,E,G)})}},removeData:function(E){return this.each(function(){o.removeData(this,E)})},queue:function(E,F){if(typeof E!=="string"){F=E;E="fx"}if(F===g){return o.queue(this[0],E)}return this.each(function(){var G=o.queue(this,E,F);if(E=="fx"&&G.length==1){G[0].call(this)}})},dequeue:function(E){return this.each(function(){o.dequeue(this,E)})}});
+/*
+ * Sizzle CSS Selector Engine - v0.9.3
+ *  Copyright 2009, The Dojo Foundation
+ *  Released under the MIT, BSD, and GPL Licenses.
+ *  More information: http://sizzlejs.com/
+ */
+(function(){var R=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?/g,L=0,H=Object.prototype.toString;var F=function(Y,U,ab,ac){ab=ab||[];U=U||document;if(U.nodeType!==1&&U.nodeType!==9){return[]}if(!Y||typeof Y!=="string"){return ab}var Z=[],W,af,ai,T,ad,V,X=true;R.lastIndex=0;while((W=R.exec(Y))!==null){Z.push(W[1]);if(W[2]){V=RegExp.rightContext;break}}if(Z.length>1&&M.exec(Y)){if(Z.length===2&&I.relative[Z[0]]){af=J(Z[0]+Z[1],U)}else{af=I.relative[Z[0]]?[U]:F(Z.shift(),U);while(Z.length){Y=Z.shift();if(I.relative[Y]){Y+=Z.shift()}af=J(Y,af)}}}else{var ae=ac?{expr:Z.pop(),set:E(ac)}:F.find(Z.pop(),Z.length===1&&U.parentNode?U.parentNode:U,Q(U));af=F.filter(ae.expr,ae.set);if(Z.length>0){ai=E(af)}else{X=false}while(Z.length){var ah=Z.pop(),ag=ah;if(!I.relative[ah]){ah=""}else{ag=Z.pop()}if(ag==null){ag=U}I.relative[ah](ai,ag,Q(U))}}if(!ai){ai=af}if(!ai){throw"Syntax error, unrecognized expression: "+(ah||Y)}if(H.call(ai)==="[object Array]"){if(!X){ab.push.apply(ab,ai)}else{if(U.nodeType===1){for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&(ai[aa]===true||ai[aa].nodeType===1&&K(U,ai[aa]))){ab.push(af[aa])}}}else{for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&ai[aa].nodeType===1){ab.push(af[aa])}}}}}else{E(ai,ab)}if(V){F(V,U,ab,ac);if(G){hasDuplicate=false;ab.sort(G);if(hasDuplicate){for(var aa=1;aa<ab.length;aa++){if(ab[aa]===ab[aa-1]){ab.splice(aa--,1)}}}}}return ab};F.matches=function(T,U){return F(T,null,null,U)};F.find=function(aa,T,ab){var Z,X;if(!aa){return[]}for(var W=0,V=I.order.length;W<V;W++){var Y=I.order[W],X;if((X=I.match[Y].exec(aa))){var U=RegExp.leftContext;if(U.substr(U.length-1)!=="\\"){X[1]=(X[1]||"").replace(/\\/g,"");Z=I.find[Y](X,T,ab);if(Z!=null){aa=aa.replace(I.match[Y],"");break}}}}if(!Z){Z=T.getElementsByTagName("*")}return{set:Z,expr:aa}};F.filter=function(ad,ac,ag,W){var V=ad,ai=[],aa=ac,Y,T,Z=ac&&ac[0]&&Q(ac[0]);while(ad&&ac.length){for(var ab in I.filter){if((Y=I.match[ab].exec(ad))!=null){var U=I.filter[ab],ah,af;T=false;if(aa==ai){ai=[]}if(I.preFilter[ab]){Y=I.preFilter[ab](Y,aa,ag,ai,W,Z);if(!Y){T=ah=true}else{if(Y===true){continue}}}if(Y){for(var X=0;(af=aa[X])!=null;X++){if(af){ah=U(af,Y,X,aa);var ae=W^!!ah;if(ag&&ah!=null){if(ae){T=true}else{aa[X]=false}}else{if(ae){ai.push(af);T=true}}}}}if(ah!==g){if(!ag){aa=ai}ad=ad.replace(I.match[ab],"");if(!T){return[]}break}}}if(ad==V){if(T==null){throw"Syntax error, unrecognized expression: "+ad}else{break}}V=ad}return aa};var I=F.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF_-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF_-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*_-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF_-]|\\.)+)(?:\((['"]*)((?:\([^\)]+\)|[^\2\(\)]*)+)\2\))?/},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(T){return T.getAttribute("href")}},relative:{"+":function(aa,T,Z){var X=typeof T==="string",ab=X&&!/\W/.test(T),Y=X&&!ab;if(ab&&!Z){T=T.toUpperCase()}for(var W=0,V=aa.length,U;W<V;W++){if((U=aa[W])){while((U=U.previousSibling)&&U.nodeType!==1){}aa[W]=Y||U&&U.nodeName===T?U||false:U===T}}if(Y){F.filter(T,aa,true)}},">":function(Z,U,aa){var X=typeof U==="string";if(X&&!/\W/.test(U)){U=aa?U:U.toUpperCase();for(var V=0,T=Z.length;V<T;V++){var Y=Z[V];if(Y){var W=Y.parentNode;Z[V]=W.nodeName===U?W:false}}}else{for(var V=0,T=Z.length;V<T;V++){var Y=Z[V];if(Y){Z[V]=X?Y.parentNode:Y.parentNode===U}}if(X){F.filter(U,Z,true)}}},"":function(W,U,Y){var V=L++,T=S;if(!U.match(/\W/)){var X=U=Y?U:U.toUpperCase();T=P}T("parentNode",U,V,W,X,Y)},"~":function(W,U,Y){var V=L++,T=S;if(typeof U==="string"&&!U.match(/\W/)){var X=U=Y?U:U.toUpperCase();T=P}T("previousSibling",U,V,W,X,Y)}},find:{ID:function(U,V,W){if(typeof V.getElementById!=="undefined"&&!W){var T=V.getElementById(U[1]);return T?[T]:[]}},NAME:function(V,Y,Z){if(typeof Y.getElementsByName!=="undefined"){var U=[],X=Y.getElementsByName(V[1]);for(var W=0,T=X.length;W<T;W++){if(X[W].getAttribute("name")===V[1]){U.push(X[W])}}return U.length===0?null:U}},TAG:function(T,U){return U.getElementsByTagName(T[1])}},preFilter:{CLASS:function(W,U,V,T,Z,aa){W=" "+W[1].replace(/\\/g,"")+" ";if(aa){return W}for(var X=0,Y;(Y=U[X])!=null;X++){if(Y){if(Z^(Y.className&&(" "+Y.className+" ").indexOf(W)>=0)){if(!V){T.push(Y)}}else{if(V){U[X]=false}}}}return false},ID:function(T){return T[1].replace(/\\/g,"")},TAG:function(U,T){for(var V=0;T[V]===false;V++){}return T[V]&&Q(T[V])?U[1]:U[1].toUpperCase()},CHILD:function(T){if(T[1]=="nth"){var U=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(T[2]=="even"&&"2n"||T[2]=="odd"&&"2n+1"||!/\D/.test(T[2])&&"0n+"+T[2]||T[2]);T[2]=(U[1]+(U[2]||1))-0;T[3]=U[3]-0}T[0]=L++;return T},ATTR:function(X,U,V,T,Y,Z){var W=X[1].replace(/\\/g,"");if(!Z&&I.attrMap[W]){X[1]=I.attrMap[W]}if(X[2]==="~="){X[4]=" "+X[4]+" "}return X},PSEUDO:function(X,U,V,T,Y){if(X[1]==="not"){if(X[3].match(R).length>1||/^\w/.test(X[3])){X[3]=F(X[3],null,null,U)}else{var W=F.filter(X[3],U,V,true^Y);if(!V){T.push.apply(T,W)}return false}}else{if(I.match.POS.test(X[0])||I.match.CHILD.test(X[0])){return true}}return X},POS:function(T){T.unshift(true);return T}},filters:{enabled:function(T){return T.disabled===false&&T.type!=="hidden"},disabled:function(T){return T.disabled===true},checked:function(T){return T.checked===true},selected:function(T){T.parentNode.selectedIndex;return T.selected===true},parent:function(T){return !!T.firstChild},empty:function(T){return !T.firstChild},has:function(V,U,T){return !!F(T[3],V).length},header:function(T){return/h\d/i.test(T.nodeName)},text:function(T){return"text"===T.type},radio:function(T){return"radio"===T.type},checkbox:function(T){return"checkbox"===T.type},file:function(T){return"file"===T.type},password:function(T){return"password"===T.type},submit:function(T){return"submit"===T.type},image:function(T){return"image"===T.type},reset:function(T){return"reset"===T.type},button:function(T){return"button"===T.type||T.nodeName.toUpperCase()==="BUTTON"},input:function(T){return/input|select|textarea|button/i.test(T.nodeName)}},setFilters:{first:function(U,T){return T===0},last:function(V,U,T,W){return U===W.length-1},even:function(U,T){return T%2===0},odd:function(U,T){return T%2===1},lt:function(V,U,T){return U<T[3]-0},gt:function(V,U,T){return U>T[3]-0},nth:function(V,U,T){return T[3]-0==U},eq:function(V,U,T){return T[3]-0==U}},filter:{PSEUDO:function(Z,V,W,aa){var U=V[1],X=I.filters[U];if(X){return X(Z,W,V,aa)}else{if(U==="contains"){return(Z.textContent||Z.innerText||"").indexOf(V[3])>=0}else{if(U==="not"){var Y=V[3];for(var W=0,T=Y.length;W<T;W++){if(Y[W]===Z){return false}}return true}}}},CHILD:function(T,W){var Z=W[1],U=T;switch(Z){case"only":case"first":while(U=U.previousSibling){if(U.nodeType===1){return false}}if(Z=="first"){return true}U=T;case"last":while(U=U.nextSibling){if(U.nodeType===1){return false}}return true;case"nth":var V=W[2],ac=W[3];if(V==1&&ac==0){return true}var Y=W[0],ab=T.parentNode;if(ab&&(ab.sizcache!==Y||!T.nodeIndex)){var X=0;for(U=ab.firstChild;U;U=U.nextSibling){if(U.nodeType===1){U.nodeIndex=++X}}ab.sizcache=Y}var aa=T.nodeIndex-ac;if(V==0){return aa==0}else{return(aa%V==0&&aa/V>=0)}}},ID:function(U,T){return U.nodeType===1&&U.getAttribute("id")===T},TAG:function(U,T){return(T==="*"&&U.nodeType===1)||U.nodeName===T},CLASS:function(U,T){return(" "+(U.className||U.getAttribute("class"))+" ").indexOf(T)>-1},ATTR:function(Y,W){var V=W[1],T=I.attrHandle[V]?I.attrHandle[V](Y):Y[V]!=null?Y[V]:Y.getAttribute(V),Z=T+"",X=W[2],U=W[4];return T==null?X==="!=":X==="="?Z===U:X==="*="?Z.indexOf(U)>=0:X==="~="?(" "+Z+" ").indexOf(U)>=0:!U?Z&&T!==false:X==="!="?Z!=U:X==="^="?Z.indexOf(U)===0:X==="$="?Z.substr(Z.length-U.length)===U:X==="|="?Z===U||Z.substr(0,U.length+1)===U+"-":false},POS:function(X,U,V,Y){var T=U[2],W=I.setFilters[T];if(W){return W(X,V,U,Y)}}}};var M=I.match.POS;for(var O in I.match){I.match[O]=RegExp(I.match[O].source+/(?![^\[]*\])(?![^\(]*\))/.source)}var E=function(U,T){U=Array.prototype.slice.call(U);if(T){T.push.apply(T,U);return T}return U};try{Array.prototype.slice.call(document.documentElement.childNodes)}catch(N){E=function(X,W){var U=W||[];if(H.call(X)==="[object Array]"){Array.prototype.push.apply(U,X)}else{if(typeof X.length==="number"){for(var V=0,T=X.length;V<T;V++){U.push(X[V])}}else{for(var V=0;X[V];V++){U.push(X[V])}}}return U}}var G;if(document.documentElement.compareDocumentPosition){G=function(U,T){var V=U.compareDocumentPosition(T)&4?-1:U===T?0:1;if(V===0){hasDuplicate=true}return V}}else{if("sourceIndex" in document.documentElement){G=function(U,T){var V=U.sourceIndex-T.sourceIndex;if(V===0){hasDuplicate=true}return V}}else{if(document.createRange){G=function(W,U){var V=W.ownerDocument.createRange(),T=U.ownerDocument.createRange();V.selectNode(W);V.collapse(true);T.selectNode(U);T.collapse(true);var X=V.compareBoundaryPoints(Range.START_TO_END,T);if(X===0){hasDuplicate=true}return X}}}}(function(){var U=document.createElement("form"),V="script"+(new Date).getTime();U.innerHTML="<input name='"+V+"'/>";var T=document.documentElement;T.insertBefore(U,T.firstChild);if(!!document.getElementById(V)){I.find.ID=function(X,Y,Z){if(typeof Y.getElementById!=="undefined"&&!Z){var W=Y.getElementById(X[1]);return W?W.id===X[1]||typeof W.getAttributeNode!=="undefined"&&W.getAttributeNode("id").nodeValue===X[1]?[W]:g:[]}};I.filter.ID=function(Y,W){var X=typeof Y.getAttributeNode!=="undefined"&&Y.getAttributeNode("id");return Y.nodeType===1&&X&&X.nodeValue===W}}T.removeChild(U)})();(function(){var T=document.createElement("div");T.appendChild(document.createComment(""));if(T.getElementsByTagName("*").length>0){I.find.TAG=function(U,Y){var X=Y.getElementsByTagName(U[1]);if(U[1]==="*"){var W=[];for(var V=0;X[V];V++){if(X[V].nodeType===1){W.push(X[V])}}X=W}return X}}T.innerHTML="<a href='#'></a>";if(T.firstChild&&typeof T.firstChild.getAttribute!=="undefined"&&T.firstChild.getAttribute("href")!=="#"){I.attrHandle.href=function(U){return U.getAttribute("href",2)}}})();if(document.querySelectorAll){(function(){var T=F,U=document.createElement("div");U.innerHTML="<p class='TEST'></p>";if(U.querySelectorAll&&U.querySelectorAll(".TEST").length===0){return}F=function(Y,X,V,W){X=X||document;if(!W&&X.nodeType===9&&!Q(X)){try{return E(X.querySelectorAll(Y),V)}catch(Z){}}return T(Y,X,V,W)};F.find=T.find;F.filter=T.filter;F.selectors=T.selectors;F.matches=T.matches})()}if(document.getElementsByClassName&&document.documentElement.getElementsByClassName){(function(){var T=document.createElement("div");T.innerHTML="<div class='test e'></div><div class='test'></div>";if(T.getElementsByClassName("e").length===0){return}T.lastChild.className="e";if(T.getElementsByClassName("e").length===1){return}I.order.splice(1,0,"CLASS");I.find.CLASS=function(U,V,W){if(typeof V.getElementsByClassName!=="undefined"&&!W){return V.getElementsByClassName(U[1])}}})()}function P(U,Z,Y,ad,aa,ac){var ab=U=="previousSibling"&&!ac;for(var W=0,V=ad.length;W<V;W++){var T=ad[W];if(T){if(ab&&T.nodeType===1){T.sizcache=Y;T.sizset=W}T=T[U];var X=false;while(T){if(T.sizcache===Y){X=ad[T.sizset];break}if(T.nodeType===1&&!ac){T.sizcache=Y;T.sizset=W}if(T.nodeName===Z){X=T;break}T=T[U]}ad[W]=X}}}function S(U,Z,Y,ad,aa,ac){var ab=U=="previousSibling"&&!ac;for(var W=0,V=ad.length;W<V;W++){var T=ad[W];if(T){if(ab&&T.nodeType===1){T.sizcache=Y;T.sizset=W}T=T[U];var X=false;while(T){if(T.sizcache===Y){X=ad[T.sizset];break}if(T.nodeType===1){if(!ac){T.sizcache=Y;T.sizset=W}if(typeof Z!=="string"){if(T===Z){X=true;break}}else{if(F.filter(Z,[T]).length>0){X=T;break}}}T=T[U]}ad[W]=X}}}var K=document.compareDocumentPosition?function(U,T){return U.compareDocumentPosition(T)&16}:function(U,T){return U!==T&&(U.contains?U.contains(T):true)};var Q=function(T){return T.nodeType===9&&T.documentElement.nodeName!=="HTML"||!!T.ownerDocument&&Q(T.ownerDocument)};var J=function(T,aa){var W=[],X="",Y,V=aa.nodeType?[aa]:aa;while((Y=I.match.PSEUDO.exec(T))){X+=Y[0];T=T.replace(I.match.PSEUDO,"")}T=I.relative[T]?T+"*":T;for(var Z=0,U=V.length;Z<U;Z++){F(T,V[Z],W)}return F.filter(X,W)};o.find=F;o.filter=F.filter;o.expr=F.selectors;o.expr[":"]=o.expr.filters;F.selectors.filters.hidden=function(T){return T.offsetWidth===0||T.offsetHeight===0};F.selectors.filters.visible=function(T){return T.offsetWidth>0||T.offsetHeight>0};F.selectors.filters.animated=function(T){return o.grep(o.timers,function(U){return T===U.elem}).length};o.multiFilter=function(V,T,U){if(U){V=":not("+V+")"}return F.matches(V,T)};o.dir=function(V,U){var T=[],W=V[U];while(W&&W!=document){if(W.nodeType==1){T.push(W)}W=W[U]}return T};o.nth=function(X,T,V,W){T=T||1;var U=0;for(;X;X=X[V]){if(X.nodeType==1&&++U==T){break}}return X};o.sibling=function(V,U){var T=[];for(;V;V=V.nextSibling){if(V.nodeType==1&&V!=U){T.push(V)}}return T};return;l.Sizzle=F})();o.event={add:function(I,F,H,K){if(I.nodeType==3||I.nodeType==8){return}if(I.setInterval&&I!=l){I=l}if(!H.guid){H.guid=this.guid++}if(K!==g){var G=H;H=this.proxy(G);H.data=K}var E=o.data(I,"events")||o.data(I,"events",{}),J=o.data(I,"handle")||o.data(I,"handle",function(){return typeof o!=="undefined"&&!o.event.triggered?o.event.handle.apply(arguments.callee.elem,arguments):g});J.elem=I;o.each(F.split(/\s+/),function(M,N){var O=N.split(".");N=O.shift();H.type=O.slice().sort().join(".");var L=E[N];if(o.event.specialAll[N]){o.event.specialAll[N].setup.call(I,K,O)}if(!L){L=E[N]={};if(!o.event.special[N]||o.event.special[N].setup.call(I,K,O)===false){if(I.addEventListener){I.addEventListener(N,J,false)}else{if(I.attachEvent){I.attachEvent("on"+N,J)}}}}L[H.guid]=H;o.event.global[N]=true});I=null},guid:1,global:{},remove:function(K,H,J){if(K.nodeType==3||K.nodeType==8){return}var G=o.data(K,"events"),F,E;if(G){if(H===g||(typeof H==="string"&&H.charAt(0)==".")){for(var I in G){this.remove(K,I+(H||""))}}else{if(H.type){J=H.handler;H=H.type}o.each(H.split(/\s+/),function(M,O){var Q=O.split(".");O=Q.shift();var N=RegExp("(^|\\.)"+Q.slice().sort().join(".*\\.")+"(\\.|$)");if(G[O]){if(J){delete G[O][J.guid]}else{for(var P in G[O]){if(N.test(G[O][P].type)){delete G[O][P]}}}if(o.event.specialAll[O]){o.event.specialAll[O].teardown.call(K,Q)}for(F in G[O]){break}if(!F){if(!o.event.special[O]||o.event.special[O].teardown.call(K,Q)===false){if(K.removeEventListener){K.removeEventListener(O,o.data(K,"handle"),false)}else{if(K.detachEvent){K.detachEvent("on"+O,o.data(K,"handle"))}}}F=null;delete G[O]}}})}for(F in G){break}if(!F){var L=o.data(K,"handle");if(L){L.elem=null}o.removeData(K,"events");o.removeData(K,"handle")}}},trigger:function(I,K,H,E){var G=I.type||I;if(!E){I=typeof I==="object"?I[h]?I:o.extend(o.Event(G),I):o.Event(G);if(G.indexOf("!")>=0)
+{I.type=G=G.slice(0,-1);I.exclusive=true}if(!H){I.stopPropagation();if(this.global[G]){o.each(o.cache,function(){if(this.events&&this.events[G]){o.event.trigger(I,K,this.handle.elem)}})}}if(!H||H.nodeType==3||H.nodeType==8){return g}I.result=g;I.target=H;K=o.makeArray(K);K.unshift(I)}I.currentTarget=H;var J=o.data(H,"handle");if(J){J.apply(H,K)}if((!H[G]||(o.nodeName(H,"a")&&G=="click"))&&H["on"+G]&&H["on"+G].apply(H,K)===false){I.result=false}if(!E&&H[G]&&!I.isDefaultPrevented()&&!(o.nodeName(H,"a")&&G=="click")){this.triggered=true;try{H[G]()}catch(L){}}this.triggered=false;if(!I.isPropagationStopped()){var F=H.parentNode||H.ownerDocument;if(F){o.event.trigger(I,K,F,true)}}},handle:function(K){var J,E;K=arguments[0]=o.event.fix(K||l.event);K.currentTarget=this;var L=K.type.split(".");K.type=L.shift();J=!L.length&&!K.exclusive;var I=RegExp("(^|\\.)"+L.slice().sort().join(".*\\.")+"(\\.|$)");E=(o.data(this,"events")||{})[K.type];for(var G in E){var H=E[G];if(J||I.test(H.type)){K.handler=H;K.data=H.data;var F=H.apply(this,arguments);if(F!==g){K.result=F;if(F===false){K.preventDefault();K.stopPropagation()}}if(K.isImmediatePropagationStopped()){break}}}},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(H){if(H[h]){return H}var F=H;H=o.Event(F);for(var G=this.props.length,J;G;){J=this.props[--G];H[J]=F[J]}if(!H.target){H.target=H.srcElement||document}if(H.target.nodeType==3){H.target=H.target.parentNode}if(!H.relatedTarget&&H.fromElement){H.relatedTarget=H.fromElement==H.target?H.toElement:H.fromElement}if(H.pageX==null&&H.clientX!=null){var I=document.documentElement,E=document.body;H.pageX=H.clientX+(I&&I.scrollLeft||E&&E.scrollLeft||0)-(I.clientLeft||0);H.pageY=H.clientY+(I&&I.scrollTop||E&&E.scrollTop||0)-(I.clientTop||0)}if(!H.which&&((H.charCode||H.charCode===0)?H.charCode:H.keyCode)){H.which=H.charCode||H.keyCode}if(!H.metaKey&&H.ctrlKey){H.metaKey=H.ctrlKey}if(!H.which&&H.button){H.which=(H.button&1?1:(H.button&2?3:(H.button&4?2:0)))}return H},proxy:function(F,E){E=E||function(){return F.apply(this,arguments)};E.guid=F.guid=F.guid||E.guid||this.guid++;return E},special:{ready:{setup:B,teardown:function(){}}},specialAll:{live:{setup:function(E,F){o.event.add(this,F[0],c)},teardown:function(G){if(G.length){var E=0,F=RegExp("(^|\\.)"+G[0]+"(\\.|$)");o.each((o.data(this,"events").live||{}),function(){if(F.test(this.type)){E++}});if(E<1){o.event.remove(this,G[0],c)}}}}}};o.Event=function(E){if(!this.preventDefault){return new o.Event(E)}if(E&&E.type){this.originalEvent=E;this.type=E.type}else{this.type=E}this.timeStamp=e();this[h]=true};function k(){return false}function u(){return true}o.Event.prototype={preventDefault:function(){this.isDefaultPrevented=u;var E=this.originalEvent;if(!E){return}if(E.preventDefault){E.preventDefault()}E.returnValue=false},stopPropagation:function(){this.isPropagationStopped=u;var E=this.originalEvent;if(!E){return}if(E.stopPropagation){E.stopPropagation()}E.cancelBubble=true},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=u;this.stopPropagation()},isDefaultPrevented:k,isPropagationStopped:k,isImmediatePropagationStopped:k};var a=function(F){var E=F.relatedTarget;while(E&&E!=this){try{E=E.parentNode}catch(G){E=this}}if(E!=this){F.type=F.data;o.event.handle.apply(this,arguments)}};o.each({mouseover:"mouseenter",mouseout:"mouseleave"},function(F,E){o.event.special[E]={setup:function(){o.event.add(this,F,a,E)},teardown:function(){o.event.remove(this,F,a)}}});o.fn.extend({bind:function(F,G,E){return F=="unload"?this.one(F,G,E):this.each(function(){o.event.add(this,F,E||G,E&&G)})},one:function(G,H,F){var E=o.event.proxy(F||H,function(I){o(this).unbind(I,E);return(F||H).apply(this,arguments)});return this.each(function(){o.event.add(this,G,E,F&&H)})},unbind:function(F,E){return this.each(function(){o.event.remove(this,F,E)})},trigger:function(E,F){return this.each(function(){o.event.trigger(E,F,this)})},triggerHandler:function(E,G){if(this[0]){var F=o.Event(E);F.preventDefault();F.stopPropagation();o.event.trigger(F,G,this[0]);return F.result}},toggle:function(G){var E=arguments,F=1;while(F<E.length){o.event.proxy(G,E[F++])}return this.click(o.event.proxy(G,function(H){this.lastToggle=(this.lastToggle||0)%F;H.preventDefault();return E[this.lastToggle++].apply(this,arguments)||false}))},hover:function(E,F){return this.mouseenter(E).mouseleave(F)},ready:function(E){B();if(o.isReady){E.call(document,o)}else{o.readyList.push(E)}return this},live:function(G,F){var E=o.event.proxy(F);E.guid+=this.selector+G;o(document).bind(i(G,this.selector),this.selector,E);return this},die:function(F,E){o(document).unbind(i(F,this.selector),E?{guid:E.guid+this.selector+F}:null);return this}});function c(H){var E=RegExp("(^|\\.)"+H.type+"(\\.|$)"),G=true,F=[];o.each(o.data(this,"events").live||[],function(I,J){if(E.test(J.type)){var K=o(H.target).closest(J.data)[0];if(K){F.push({elem:K,fn:J})}}});F.sort(function(J,I){return o.data(J.elem,"closest")-o.data(I.elem,"closest")});o.each(F,function(){if(this.fn.call(this.elem,H,this.fn.data)===false){return(G=false)}});return G}function i(F,E){return["live",F,E.replace(/\./g,"`").replace(/ /g,"|")].join(".")}o.extend({isReady:false,readyList:[],ready:function(){if(!o.isReady){o.isReady=true;if(o.readyList){o.each(o.readyList,function(){this.call(document,o)});o.readyList=null}o(document).triggerHandler("ready")}}});var x=false;function B(){if(x){return}x=true;if(document.addEventListener){document.addEventListener("DOMContentLoaded",function(){document.removeEventListener("DOMContentLoaded",arguments.callee,false);o.ready()},false)}else{if(document.attachEvent){document.attachEvent("onreadystatechange",function(){if(document.readyState==="complete"){document.detachEvent("onreadystatechange",arguments.callee);o.ready()}});if(document.documentElement.doScroll&&l==l.top){(function(){if(o.isReady){return}try{document.documentElement.doScroll("left")}catch(E){setTimeout(arguments.callee,0);return}o.ready()})()}}}o.event.add(l,"load",o.ready)}o.each(("blur,focus,load,resize,scroll,unload,click,dblclick,mousedown,mouseup,mousemove,mouseover,mouseout,mouseenter,mouseleave,change,select,submit,keydown,keypress,keyup,error").split(","),function(F,E){o.fn[E]=function(G){return G?this.bind(E,G):this.trigger(E)}});o(l).bind("unload",function(){for(var E in o.cache){if(E!=1&&o.cache[E].handle){o.event.remove(o.cache[E].handle.elem)}}});(function(){o.support={};var F=document.documentElement,G=document.createElement("script"),K=document.createElement("div"),J="script"+(new Date).getTime();K.style.display="none";K.innerHTML='   <link/><table></table><a href="/a" style="color:red;float:left;opacity:.5;">a</a><select><option>text</option></select><object><param/></object>';var H=K.getElementsByTagName("*"),E=K.getElementsByTagName("a")[0];if(!H||!H.length||!E){return}o.support={leadingWhitespace:K.firstChild.nodeType==3,tbody:!K.getElementsByTagName("tbody").length,objectAll:!!K.getElementsByTagName("object")[0].getElementsByTagName("*").length,htmlSerialize:!!K.getElementsByTagName("link").length,style:/red/.test(E.getAttribute("style")),hrefNormalized:E.getAttribute("href")==="/a",opacity:E.style.opacity==="0.5",cssFloat:!!E.style.cssFloat,scriptEval:false,noCloneEvent:true,boxModel:null};G.type="text/javascript";try{G.appendChild(document.createTextNode("window."+J+"=1;"))}catch(I){}F.insertBefore(G,F.firstChild);if(l[J]){o.support.scriptEval=true;delete l[J]}F.removeChild(G);if(K.attachEvent&&K.fireEvent){K.attachEvent("onclick",function(){o.support.noCloneEvent=false;K.detachEvent("onclick",arguments.callee)});K.cloneNode(true).fireEvent("onclick")}o(function(){var L=document.createElement("div");L.style.width=L.style.paddingLeft="1px";document.body.appendChild(L);o.boxModel=o.support.boxModel=L.offsetWidth===2;document.body.removeChild(L).style.display="none"})})();var w=o.support.cssFloat?"cssFloat":"styleFloat";o.props={"for":"htmlFor","class":"className","float":w,cssFloat:w,styleFloat:w,readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",tabindex:"tabIndex"};o.fn.extend({_load:o.fn.load,load:function(G,J,K){if(typeof G!=="string"){return this._load(G)}var I=G.indexOf(" ");if(I>=0){var E=G.slice(I,G.length);G=G.slice(0,I)}var H="GET";if(J){if(o.isFunction(J)){K=J;J=null}else{if(typeof J==="object"){J=o.param(J);H="POST"}}}var F=this;o.ajax({url:G,type:H,dataType:"html",data:J,complete:function(M,L){if(L=="success"||L=="notmodified"){F.html(E?o("<div/>").append(M.responseText.replace(/<script(.|\s)*?\/script>/g,"")).find(E):M.responseText)}if(K){F.each(K,[M.responseText,L,M])}}});return this},serialize:function(){return o.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?o.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password|search/i.test(this.type))}).map(function(E,F){var G=o(this).val();return G==null?null:o.isArray(G)?o.map(G,function(I,H){return{name:F.name,value:I}}):{name:F.name,value:G}}).get()}});o.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(E,F){o.fn[F]=function(G){return this.bind(F,G)}});var r=e();o.extend({get:function(E,G,H,F){if(o.isFunction(G)){H=G;G=null}return o.ajax({type:"GET",url:E,data:G,success:H,dataType:F})},getScript:function(E,F){return o.get(E,null,F,"script")},getJSON:function(E,F,G){return o.get(E,F,G,"json")},post:function(E,G,H,F){if(o.isFunction(G)){H=G;G={}}return o.ajax({type:"POST",url:E,data:G,success:H,dataType:F})},ajaxSetup:function(E){o.extend(o.ajaxSettings,E)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return l.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest()},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(M){M=o.extend(true,M,o.extend(true,{},o.ajaxSettings,M));var W,F=/=\?(&|$)/g,R,V,G=M.type.toUpperCase();if(M.data&&M.processData&&typeof M.data!=="string"){M.data=o.param(M.data)}if(M.dataType=="jsonp"){if(G=="GET"){if(!M.url.match(F)){M.url+=(M.url.match(/\?/)?"&":"?")+(M.jsonp||"callback")+"=?"}}else{if(!M.data||!M.data.match(F)){M.data=(M.data?M.data+"&":"")+(M.jsonp||"callback")+"=?"}}M.dataType="json"}if(M.dataType=="json"&&(M.data&&M.data.match(F)||M.url.match(F))){W="jsonp"+r++;if(M.data){M.data=(M.data+"").replace(F,"="+W+"$1")}M.url=M.url.replace(F,"="+W+"$1");M.dataType="script";l[W]=function(X){V=X;I();L();l[W]=g;try{delete l[W]}catch(Y){}if(H){H.removeChild(T)}}}if(M.dataType=="script"&&M.cache==null){M.cache=false}if(M.cache===false&&G=="GET"){var E=e();var U=M.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+E+"$2");M.url=U+((U==M.url)?(M.url.match(/\?/)?"&":"?")+"_="+E:"")}if(M.data&&G=="GET"){M.url+=(M.url.match(/\?/)?"&":"?")+M.data;M.data=null}if(M.global&&!o.active++){o.event.trigger("ajaxStart")}var Q=/^(\w+:)?\/\/([^\/?#]+)/.exec(M.url);if(M.dataType=="script"&&G=="GET"&&Q&&(Q[1]&&Q[1]!=location.protocol||Q[2]!=location.host)){var H=document.getElementsByTagName("head")[0];var T=document.createElement("script");T.src=M.url;if(M.scriptCharset){T.charset=M.scriptCharset}if(!W){var O=false;T.onload=T.onreadystatechange=function(){if(!O&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){O=true;I();L();T.onload=T.onreadystatechange=null;H.removeChild(T)}}}H.appendChild(T);return g}var K=false;var J=M.xhr();if(M.username){J.open(G,M.url,M.async,M.username,M.password)}else{J.open(G,M.url,M.async)}try{if(M.data){J.setRequestHeader("Content-Type",M.contentType)}if(M.ifModified){J.setRequestHeader("If-Modified-Since",o.lastModified[M.url]||"Thu, 01 Jan 1970 00:00:00 GMT")}J.setRequestHeader("X-Requested-With","XMLHttpRequest");J.setRequestHeader("Accept",M.dataType&&M.accepts[M.dataType]?M.accepts[M.dataType]+", */*":M.accepts._default)}catch(S){}if(M.beforeSend&&M.beforeSend(J,M)===false){if(M.global&&!--o.active){o.event.trigger("ajaxStop")}J.abort();return false}if(M.global){o.event.trigger("ajaxSend",[J,M])}var N=function(X){if(J.readyState==0){if(P){clearInterval(P);P=null;if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}}else{if(!K&&J&&(J.readyState==4||X=="timeout")){K=true;if(P){clearInterval(P);P=null}R=X=="timeout"?"timeout":!o.httpSuccess(J)?"error":M.ifModified&&o.httpNotModified(J,M.url)?"notmodified":"success";if(R=="success"){try{V=o.httpData(J,M.dataType,M)}catch(Z){R="parsererror"}}if(R=="success"){var Y;try{Y=J.getResponseHeader("Last-Modified")}catch(Z){}if(M.ifModified&&Y){o.lastModified[M.url]=Y}if(!W){I()}}else{o.handleError(M,J,R)}L();if(X){J.abort()}if(M.async){J=null}}}};if(M.async){var P=setInterval(N,13);if(M.timeout>0){setTimeout(function(){if(J&&!K){N("timeout")}},M.timeout)}}try{J.send(M.data)}catch(S){o.handleError(M,J,null,S)}if(!M.async){N()}function I(){if(M.success){M.success(V,R)}if(M.global){o.event.trigger("ajaxSuccess",[J,M])}}function L(){if(M.complete){M.complete(J,R)}if(M.global){o.event.trigger("ajaxComplete",[J,M])}if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}return J},handleError:function(F,H,E,G){if(F.error){F.error(H,E,G)}if(F.global){o.event.trigger("ajaxError",[H,F,G])}},active:0,httpSuccess:function(F){try{return !F.status&&location.protocol=="file:"||(F.status>=200&&F.status<300)||F.status==304||F.status==1223}catch(E){}return false},httpNotModified:function(G,E){try{var H=G.getResponseHeader("Last-Modified");return G.status==304||H==o.lastModified[E]}catch(F){}return false},httpData:function(J,H,G){var F=J.getResponseHeader("content-type"),E=H=="xml"||!H&&F&&F.indexOf("xml")>=0,I=E?J.responseXML:J.responseText;if(E&&I.documentElement.tagName=="parsererror"){throw"parsererror"}if(G&&G.dataFilter){I=G.dataFilter(I,H)}if(typeof I==="string"){if(H=="script"){o.globalEval(I)}if(H=="json"){I=l["eval"]("("+I+")")}}return I},param:function(E){var G=[];function H(I,J){G[G.length]=encodeURIComponent(I)+"="+encodeURIComponent(J)}if(o.isArray(E)||E.jquery){o.each(E,function(){H(this.name,this.value)})}else{for(var F in E){if(o.isArray(E[F])){o.each(E[F],function(){H(F,this)})}else{H(F,o.isFunction(E[F])?E[F]():E[F])}}}return G.join("&").replace(/%20/g,"+")}});var m={},n,d=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];function t(F,E){var G={};o.each(d.concat.apply([],d.slice(0,E)),function()
+{G[this]=F});return G}o.fn.extend({show:function(J,L){if(J){return this.animate(t("show",3),J,L)}else{for(var H=0,F=this.length;H<F;H++){var E=o.data(this[H],"olddisplay");this[H].style.display=E||"";if(o.css(this[H],"display")==="none"){var G=this[H].tagName,K;if(m[G]){K=m[G]}else{var I=o("<"+G+" />").appendTo("body");K=I.css("display");if(K==="none"){K="block"}I.remove();m[G]=K}o.data(this[H],"olddisplay",K)}}for(var H=0,F=this.length;H<F;H++){this[H].style.display=o.data(this[H],"olddisplay")||""}return this}},hide:function(H,I){if(H){return this.animate(t("hide",3),H,I)}else{for(var G=0,F=this.length;G<F;G++){var E=o.data(this[G],"olddisplay");if(!E&&E!=="none"){o.data(this[G],"olddisplay",o.css(this[G],"display"))}}for(var G=0,F=this.length;G<F;G++){this[G].style.display="none"}return this}},_toggle:o.fn.toggle,toggle:function(G,F){var E=typeof G==="boolean";return o.isFunction(G)&&o.isFunction(F)?this._toggle.apply(this,arguments):G==null||E?this.each(function(){var H=E?G:o(this).is(":hidden");o(this)[H?"show":"hide"]()}):this.animate(t("toggle",3),G,F)},fadeTo:function(E,G,F){return this.animate({opacity:G},E,F)},animate:function(I,F,H,G){var E=o.speed(F,H,G);return this[E.queue===false?"each":"queue"](function(){var K=o.extend({},E),M,L=this.nodeType==1&&o(this).is(":hidden"),J=this;for(M in I){if(I[M]=="hide"&&L||I[M]=="show"&&!L){return K.complete.call(this)}if((M=="height"||M=="width")&&this.style){K.display=o.css(this,"display");K.overflow=this.style.overflow}}if(K.overflow!=null){this.style.overflow="hidden"}K.curAnim=o.extend({},I);o.each(I,function(O,S){var R=new o.fx(J,K,O);if(/toggle|show|hide/.test(S)){R[S=="toggle"?L?"show":"hide":S](I)}else{var Q=S.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),T=R.cur(true)||0;if(Q){var N=parseFloat(Q[2]),P=Q[3]||"px";if(P!="px"){J.style[O]=(N||1)+P;T=((N||1)/R.cur(true))*T;J.style[O]=T+P}if(Q[1]){N=((Q[1]=="-="?-1:1)*N)+T}R.custom(T,N,P)}else{R.custom(T,S,"")}}});return true})},stop:function(F,E){var G=o.timers;if(F){this.queue([])}this.each(function(){for(var H=G.length-1;H>=0;H--){if(G[H].elem==this){if(E){G[H](true)}G.splice(H,1)}}});if(!E){this.dequeue()}return this}});o.each({slideDown:t("show",1),slideUp:t("hide",1),slideToggle:t("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(E,F){o.fn[E]=function(G,H){return this.animate(F,G,H)}});o.extend({speed:function(G,H,F){var E=typeof G==="object"?G:{complete:F||!F&&H||o.isFunction(G)&&G,duration:G,easing:F&&H||H&&!o.isFunction(H)&&H};E.duration=o.fx.off?0:typeof E.duration==="number"?E.duration:o.fx.speeds[E.duration]||o.fx.speeds._default;E.old=E.complete;E.complete=function(){if(E.queue!==false){o(this).dequeue()}if(o.isFunction(E.old)){E.old.call(this)}};return E},easing:{linear:function(G,H,E,F){return E+F*G},swing:function(G,H,E,F){return((-Math.cos(G*Math.PI)/2)+0.5)*F+E}},timers:[],fx:function(F,E,G){this.options=E;this.elem=F;this.prop=G;if(!E.orig){E.orig={}}}});o.fx.prototype={update:function(){if(this.options.step){this.options.step.call(this.elem,this.now,this)}(o.fx.step[this.prop]||o.fx.step._default)(this);if((this.prop=="height"||this.prop=="width")&&this.elem.style){this.elem.style.display="block"}},cur:function(F){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null)){return this.elem[this.prop]}var E=parseFloat(o.css(this.elem,this.prop,F));return E&&E>-10000?E:parseFloat(o.curCSS(this.elem,this.prop))||0},custom:function(I,H,G){this.startTime=e();this.start=I;this.end=H;this.unit=G||this.unit||"px";this.now=this.start;this.pos=this.state=0;var E=this;function F(J){return E.step(J)}F.elem=this.elem;if(F()&&o.timers.push(F)&&!n){n=setInterval(function(){var K=o.timers;for(var J=0;J<K.length;J++){if(!K[J]()){K.splice(J--,1)}}if(!K.length){clearInterval(n);n=g}},13)}},show:function(){this.options.orig[this.prop]=o.attr(this.elem.style,this.prop);this.options.show=true;this.custom(this.prop=="width"||this.prop=="height"?1:0,this.cur());o(this.elem).show()},hide:function(){this.options.orig[this.prop]=o.attr(this.elem.style,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(H){var G=e();if(H||G>=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var E=true;for(var F in this.options.curAnim){if(this.options.curAnim[F]!==true){E=false}}if(E){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(o.css(this.elem,"display")=="none"){this.elem.style.display="block"}}if(this.options.hide){o(this.elem).hide()}if(this.options.hide||this.options.show){for(var I in this.options.curAnim){o.attr(this.elem.style,I,this.options.orig[I])}}this.options.complete.call(this.elem)}return false}else{var J=G-this.startTime;this.state=J/this.options.duration;this.pos=o.easing[this.options.easing||(o.easing.swing?"swing":"linear")](this.state,J,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update()}return true}};o.extend(o.fx,{speeds:{slow:600,fast:200,_default:400},step:{opacity:function(E){o.attr(E.elem.style,"opacity",E.now)},_default:function(E){if(E.elem.style&&E.elem.style[E.prop]!=null){E.elem.style[E.prop]=E.now+E.unit}else{E.elem[E.prop]=E.now}}}});if(document.documentElement.getBoundingClientRect){o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}var G=this[0].getBoundingClientRect(),J=this[0].ownerDocument,F=J.body,E=J.documentElement,L=E.clientTop||F.clientTop||0,K=E.clientLeft||F.clientLeft||0,I=G.top+(self.pageYOffset||o.boxModel&&E.scrollTop||F.scrollTop)-L,H=G.left+(self.pageXOffset||o.boxModel&&E.scrollLeft||F.scrollLeft)-K;return{top:I,left:H}}}else{o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}o.offset.initialized||o.offset.initialize();var J=this[0],G=J.offsetParent,F=J,O=J.ownerDocument,M,H=O.documentElement,K=O.body,L=O.defaultView,E=L.getComputedStyle(J,null),N=J.offsetTop,I=J.offsetLeft;while((J=J.parentNode)&&J!==K&&J!==H){M=L.getComputedStyle(J,null);N-=J.scrollTop,I-=J.scrollLeft;if(J===G){N+=J.offsetTop,I+=J.offsetLeft;if(o.offset.doesNotAddBorder&&!(o.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(J.tagName))){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}F=G,G=J.offsetParent}if(o.offset.subtractsBorderForOverflowNotVisible&&M.overflow!=="visible"){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}E=M}if(E.position==="relative"||E.position==="static"){N+=K.offsetTop,I+=K.offsetLeft}if(E.position==="fixed"){N+=Math.max(H.scrollTop,K.scrollTop),I+=Math.max(H.scrollLeft,K.scrollLeft)}return{top:N,left:I}}}o.offset={initialize:function(){if(this.initialized){return}var L=document.body,F=document.createElement("div"),H,G,N,I,M,E,J=L.style.marginTop,K='<div style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;"><div></div></div><table style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;" cellpadding="0" cellspacing="0"><tr><td></td></tr></table>';M={position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"};for(E in M){F.style[E]=M[E]}F.innerHTML=K;L.insertBefore(F,L.firstChild);H=F.firstChild,G=H.firstChild,I=H.nextSibling.firstChild.firstChild;this.doesNotAddBorder=(G.offsetTop!==5);this.doesAddBorderForTableAndCells=(I.offsetTop===5);H.style.overflow="hidden",H.style.position="relative";this.subtractsBorderForOverflowNotVisible=(G.offsetTop===-5);L.style.marginTop="1px";this.doesNotIncludeMarginInBodyOffset=(L.offsetTop===0);L.style.marginTop=J;L.removeChild(F);this.initialized=true},bodyOffset:function(E){o.offset.initialized||o.offset.initialize();var G=E.offsetTop,F=E.offsetLeft;if(o.offset.doesNotIncludeMarginInBodyOffset){G+=parseInt(o.curCSS(E,"marginTop",true),10)||0,F+=parseInt(o.curCSS(E,"marginLeft",true),10)||0}return{top:G,left:F}}};o.fn.extend({position:function(){var I=0,H=0,F;if(this[0]){var G=this.offsetParent(),J=this.offset(),E=/^body|html$/i.test(G[0].tagName)?{top:0,left:0}:G.offset();J.top-=j(this,"marginTop");J.left-=j(this,"marginLeft");E.top+=j(G,"borderTopWidth");E.left+=j(G,"borderLeftWidth");F={top:J.top-E.top,left:J.left-E.left}}return F},offsetParent:function(){var E=this[0].offsetParent||document.body;while(E&&(!/^body|html$/i.test(E.tagName)&&o.css(E,"position")=="static")){E=E.offsetParent}return o(E)}});o.each(["Left","Top"],function(F,E){var G="scroll"+E;o.fn[G]=function(H){if(!this[0]){return null}return H!==g?this.each(function(){this==l||this==document?l.scrollTo(!F?H:o(l).scrollLeft(),F?H:o(l).scrollTop()):this[G]=H}):this[0]==l||this[0]==document?self[F?"pageYOffset":"pageXOffset"]||o.boxModel&&document.documentElement[G]||document.body[G]:this[0][G]}});o.each(["Height","Width"],function(I,G){var E=I?"Left":"Top",H=I?"Right":"Bottom",F=G.toLowerCase();o.fn["inner"+G]=function(){return this[0]?o.css(this[0],F,false,"padding"):null};o.fn["outer"+G]=function(K){return this[0]?o.css(this[0],F,false,K?"margin":"border"):null};var J=G.toLowerCase();o.fn[J]=function(K){return this[0]==l?document.compatMode=="CSS1Compat"&&document.documentElement["client"+G]||document.body["client"+G]:this[0]==document?Math.max(document.documentElement["client"+G],document.body["scroll"+G],document.documentElement["scroll"+G],document.body["offset"+G],document.documentElement["offset"+G]):K===g?(this.length?o.css(this[0],J):null):this.css(J,typeof K==="string"?K:K+"px")}})})();
+
+/*
+ * jQuery hashchange event - v1.3 - 7/21/2010
+ * http://benalman.com/projects/jquery-hashchange-plugin/
+ * 
+ * Copyright (c) 2010 "Cowboy" Ben Alman
+ * Dual licensed under the MIT and GPL licenses.
+ * http://benalman.com/about/license/
+ */
+(function($,e,b){var c="hashchange",h=document,f,g=$.event.special,i=h.documentMode,d="on"+c in e&&(i===b||i>7);function a(j){j=j||location.href;return"#"+j.replace(/^[^#]*#?(.*)$/,"$1")}$.fn[c]=function(j){return j?this.bind(c,j):this.trigger(c)};$.fn[c].delay=50;g[c]=$.extend(g[c],{setup:function(){if(d){return false}$(f.start)},teardown:function(){if(d){return false}$(f.stop)}});f=(function(){var j={},p,m=a(),k=function(q){return q},l=k,o=k;j.start=function(){p||n()};j.stop=function(){p&&clearTimeout(p);p=b};function n(){var r=a(),q=o(m);if(r!==m){l(m=r,q);$(e).trigger(c)}else{if(q!==m){location.href=location.href.replace(/#.*/,"")+q}}p=setTimeout(n,$.fn[c].delay)}$.browser.msie&&!d&&(function(){var q,r;j.start=function(){if(!q){r=$.fn[c].src;r=r&&r+a();q=$('<iframe tabindex="-1" title="empty"/>').hide().one("load",function(){r||l(a());n()}).attr("src",r||"javascript:0").insertAfter("body")[0].contentWindow;h.onpropertychange=function(){try{if(event.propertyName==="title"){q.document.title=h.title}}catch(s){}}}};j.stop=k;o=function(){return a(q.location.href)};l=function(v,s){var u=q.document,t=$.fn[c].domain;if(v!==s){u.title=h.title;u.open();t&&u.write('<script>document.domain="'+t+'"<\/script>');u.close();q.location.hash=v}}})();return j})()})(jQuery,this);
+/*
+ * jQuery UI 1.7.2
+ *
+ * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * http://docs.jquery.com/UI
+ */
+jQuery.ui||(function(c){var i=c.fn.remove,d=c.browser.mozilla&&(parseFloat(c.browser.version)<1.9);c.ui={version:"1.7.2",plugin:{add:function(k,l,n){var m=c.ui[k].prototype;for(var j in n){m.plugins[j]=m.plugins[j]||[];m.plugins[j].push([l,n[j]])}},call:function(j,l,k){var n=j.plugins[l];if(!n||!j.element[0].parentNode){return}for(var m=0;m<n.length;m++){if(j.options[n[m][0]]){n[m][1].apply(j.element,k)}}}},contains:function(k,j){return document.compareDocumentPosition?k.compareDocumentPosition(j)&16:k!==j&&k.contains(j)},hasScroll:function(m,k){if(c(m).css("overflow")=="hidden"){return false}var j=(k&&k=="left")?"scrollLeft":"scrollTop",l=false;if(m[j]>0){return true}m[j]=1;l=(m[j]>0);m[j]=0;return l},isOverAxis:function(k,j,l){return(k>j)&&(k<(j+l))},isOver:function(o,k,n,m,j,l){return c.ui.isOverAxis(o,n,j)&&c.ui.isOverAxis(k,m,l)},keyCode:{BACKSPACE:8,CAPS_LOCK:20,COMMA:188,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38}};if(d){var f=c.attr,e=c.fn.removeAttr,h="http://www.w3.org/2005/07/aaa",a=/^aria-/,b=/^wairole:/;c.attr=function(k,j,l){var m=l!==undefined;return(j=="role"?(m?f.call(this,k,j,"wairole:"+l):(f.apply(this,arguments)||"").replace(b,"")):(a.test(j)?(m?k.setAttributeNS(h,j.replace(a,"aaa:"),l):f.call(this,k,j.replace(a,"aaa:"))):f.apply(this,arguments)))};c.fn.removeAttr=function(j){return(a.test(j)?this.each(function(){this.removeAttributeNS(h,j.replace(a,""))}):e.call(this,j))}}c.fn.extend({remove:function(){c("*",this).add(this).each(function(){c(this).triggerHandler("remove")});return i.apply(this,arguments)},enableSelection:function(){return this.attr("unselectable","off").css("MozUserSelect","").unbind("selectstart.ui")},disableSelection:function(){return this.attr("unselectable","on").css("MozUserSelect","none").bind("selectstart.ui",function(){return false})},scrollParent:function(){var j;if((c.browser.msie&&(/(static|relative)/).test(this.css("position")))||(/absolute/).test(this.css("position"))){j=this.parents().filter(function(){return(/(relative|absolute|fixed)/).test(c.curCSS(this,"position",1))&&(/(auto|scroll)/).test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0)}else{j=this.parents().filter(function(){return(/(auto|scroll)/).test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0)}return(/fixed/).test(this.css("position"))||!j.length?c(document):j}});c.extend(c.expr[":"],{data:function(l,k,j){return !!c.data(l,j[3])},focusable:function(k){var l=k.nodeName.toLowerCase(),j=c.attr(k,"tabindex");return(/input|select|textarea|button|object/.test(l)?!k.disabled:"a"==l||"area"==l?k.href||!isNaN(j):!isNaN(j))&&!c(k)["area"==l?"parents":"closest"](":hidden").length},tabbable:function(k){var j=c.attr(k,"tabindex");return(isNaN(j)||j>=0)&&c(k).is(":focusable")}});function g(m,n,o,l){function k(q){var p=c[m][n][q]||[];return(typeof p=="string"?p.split(/,?\s+/):p)}var j=k("getter");if(l.length==1&&typeof l[0]=="string"){j=j.concat(k("getterSetter"))}return(c.inArray(o,j)!=-1)}c.widget=function(k,j){var l=k.split(".")[0];k=k.split(".")[1];c.fn[k]=function(p){var n=(typeof p=="string"),o=Array.prototype.slice.call(arguments,1);if(n&&p.substring(0,1)=="_"){return this}if(n&&g(l,k,p,o)){var m=c.data(this[0],k);return(m?m[p].apply(m,o):undefined)}return this.each(function(){var q=c.data(this,k);(!q&&!n&&c.data(this,k,new c[l][k](this,p))._init());(q&&n&&c.isFunction(q[p])&&q[p].apply(q,o))})};c[l]=c[l]||{};c[l][k]=function(o,n){var m=this;this.namespace=l;this.widgetName=k;this.widgetEventPrefix=c[l][k].eventPrefix||k;this.widgetBaseClass=l+"-"+k;this.options=c.extend({},c.widget.defaults,c[l][k].defaults,c.metadata&&c.metadata.get(o)[k],n);this.element=c(o).bind("setData."+k,function(q,p,r){if(q.target==o){return m._setData(p,r)}}).bind("getData."+k,function(q,p){if(q.target==o){return m._getData(p)}}).bind("remove",function(){return m.destroy()})};c[l][k].prototype=c.extend({},c.widget.prototype,j);c[l][k].getterSetter="option"};c.widget.prototype={_init:function(){},destroy:function(){this.element.removeData(this.widgetName).removeClass(this.widgetBaseClass+"-disabled "+this.namespace+"-state-disabled").removeAttr("aria-disabled")},option:function(l,m){var k=l,j=this;if(typeof l=="string"){if(m===undefined){return this._getData(l)}k={};k[l]=m}c.each(k,function(n,o){j._setData(n,o)})},_getData:function(j){return this.options[j]},_setData:function(j,k){this.options[j]=k;if(j=="disabled"){this.element[k?"addClass":"removeClass"](this.widgetBaseClass+"-disabled "+this.namespace+"-state-disabled").attr("aria-disabled",k)}},enable:function(){this._setData("disabled",false)},disable:function(){this._setData("disabled",true)},_trigger:function(l,m,n){var p=this.options[l],j=(l==this.widgetEventPrefix?l:this.widgetEventPrefix+l);m=c.Event(m);m.type=j;if(m.originalEvent){for(var k=c.event.props.length,o;k;){o=c.event.props[--k];m[o]=m.originalEvent[o]}}this.element.trigger(m,n);return !(c.isFunction(p)&&p.call(this.element[0],m,n)===false||m.isDefaultPrevented())}};c.widget.defaults={disabled:false};c.ui.mouse={_mouseInit:function(){var j=this;this.element.bind("mousedown."+this.widgetName,function(k){return j._mouseDown(k)}).bind("click."+this.widgetName,function(k){if(j._preventClickEvent){j._preventClickEvent=false;k.stopImmediatePropagation();return false}});if(c.browser.msie){this._mouseUnselectable=this.element.attr("unselectable");this.element.attr("unselectable","on")}this.started=false},_mouseDestroy:function(){this.element.unbind("."+this.widgetName);(c.browser.msie&&this.element.attr("unselectable",this._mouseUnselectable))},_mouseDown:function(l){l.originalEvent=l.originalEvent||{};if(l.originalEvent.mouseHandled){return}(this._mouseStarted&&this._mouseUp(l));this._mouseDownEvent=l;var k=this,m=(l.which==1),j=(typeof this.options.cancel=="string"?c(l.target).parents().add(l.target).filter(this.options.cancel).length:false);if(!m||j||!this._mouseCapture(l)){return true}this.mouseDelayMet=!this.options.delay;if(!this.mouseDelayMet){this._mouseDelayTimer=setTimeout(function(){k.mouseDelayMet=true},this.options.delay)}if(this._mouseDistanceMet(l)&&this._mouseDelayMet(l)){this._mouseStarted=(this._mouseStart(l)!==false);if(!this._mouseStarted){l.preventDefault();return true}}this._mouseMoveDelegate=function(n){return k._mouseMove(n)};this._mouseUpDelegate=function(n){return k._mouseUp(n)};c(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate);(c.browser.safari||l.preventDefault());l.originalEvent.mouseHandled=true;return true},_mouseMove:function(j){if(c.browser.msie&&!j.button){return this._mouseUp(j)}if(this._mouseStarted){this._mouseDrag(j);return j.preventDefault()}if(this._mouseDistanceMet(j)&&this._mouseDelayMet(j)){this._mouseStarted=(this._mouseStart(this._mouseDownEvent,j)!==false);(this._mouseStarted?this._mouseDrag(j):this._mouseUp(j))}return !this._mouseStarted},_mouseUp:function(j){c(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted=false;this._preventClickEvent=(j.target==this._mouseDownEvent.target);this._mouseStop(j)}return false},_mouseDistanceMet:function(j){return(Math.max(Math.abs(this._mouseDownEvent.pageX-j.pageX),Math.abs(this._mouseDownEvent.pageY-j.pageY))>=this.options.distance)},_mouseDelayMet:function(j){return this.mouseDelayMet},_mouseStart:function(j){},_mouseDrag:function(j){},_mouseStop:function(j){},_mouseCapture:function(j){return true}};c.ui.mouse.defaults={cancel:null,distance:1,delay:0}})(jQuery);;/* * jQuery UI Resizable 1.7.2
+ *
+ * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * http://docs.jquery.com/UI/Resizables
+ *
+ * Depends:
+ *	ui.core.js
+ */
+(function(c){c.widget("ui.resizable",c.extend({},c.ui.mouse,{_init:function(){var e=this,j=this.options;this.element.addClass("ui-resizable");c.extend(this,{_aspectRatio:!!(j.aspectRatio),aspectRatio:j.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:j.helper||j.ghost||j.animate?j.helper||"ui-resizable-helper":null});if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)){if(/relative/.test(this.element.css("position"))&&c.browser.opera){this.element.css({position:"relative",top:"auto",left:"auto"})}this.element.wrap(c('<div class="ui-wrapper" style="overflow: hidden;"></div>').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")}));this.element=this.element.parent().data("resizable",this.element.data("resizable"));this.elementIsWrapper=true;this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")});this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0});this.originalResizeStyle=this.originalElement.css("resize");this.originalElement.css("resize","none");this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"}));this.originalElement.css({margin:this.originalElement.css("margin")});this._proportionallyResize()}this.handles=j.handles||(!c(".ui-resizable-handle",this.element).length?"e,s,se":{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"});if(this.handles.constructor==String){if(this.handles=="all"){this.handles="n,e,s,w,se,sw,ne,nw"}var k=this.handles.split(",");this.handles={};for(var f=0;f<k.length;f++){var h=c.trim(k[f]),d="ui-resizable-"+h;var g=c('<div class="ui-resizable-handle '+d+'"></div>');if(/sw|se|ne|nw/.test(h)){g.css({zIndex:++j.zIndex})}if("se"==h){g.addClass("ui-icon ui-icon-gripsmall-diagonal-se")}this.handles[h]=".ui-resizable-"+h;this.element.append(g)}}this._renderAxis=function(p){p=p||this.element;for(var m in this.handles){if(this.handles[m].constructor==String){this.handles[m]=c(this.handles[m],this.element).show()}if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var n=c(this.handles[m],this.element),o=0;o=/sw|ne|nw|se|n|s/.test(m)?n.outerHeight():n.outerWidth();var l=["padding",/ne|nw|n/.test(m)?"Top":/se|sw|s/.test(m)?"Bottom":/^e$/.test(m)?"Right":"Left"].join("");p.css(l,o);this._proportionallyResize()}if(!c(this.handles[m]).length){continue}}};this._renderAxis(this.element);this._handles=c(".ui-resizable-handle",this.element).disableSelection();this._handles.mouseover(function(){if(!e.resizing){if(this.className){var i=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)}e.axis=i&&i[1]?i[1]:"se"}});if(j.autoHide){this._handles.hide();c(this.element).addClass("ui-resizable-autohide").hover(function(){c(this).removeClass("ui-resizable-autohide");e._handles.show()},function(){if(!e.resizing){c(this).addClass("ui-resizable-autohide");e._handles.hide()}})}this._mouseInit()},destroy:function(){this._mouseDestroy();var d=function(f){c(f).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};if(this.elementIsWrapper){d(this.element);var e=this.element;e.parent().append(this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")})).end().remove()}this.originalElement.css("resize",this.originalResizeStyle);d(this.originalElement)},_mouseCapture:function(e){var f=false;for(var d in this.handles){if(c(this.handles[d])[0]==e.target){f=true}}return this.options.disabled||!!f},_mouseStart:function(f){var i=this.options,e=this.element.position(),d=this.element;this.resizing=true;this.documentScroll={top:c(document).scrollTop(),left:c(document).scrollLeft()};if(d.is(".ui-draggable")||(/absolute/).test(d.css("position"))){d.css({position:"absolute",top:e.top,left:e.left})}if(c.browser.opera&&(/relative/).test(d.css("position"))){d.css({position:"relative",top:"auto",left:"auto"})}this._renderProxy();var j=b(this.helper.css("left")),g=b(this.helper.css("top"));if(i.containment){j+=c(i.containment).scrollLeft()||0;g+=c(i.containment).scrollTop()||0}this.offset=this.helper.offset();this.position={left:j,top:g};this.size=this._helper?{width:d.outerWidth(),height:d.outerHeight()}:{width:d.width(),height:d.height()};this.originalSize=this._helper?{width:d.outerWidth(),height:d.outerHeight()}:{width:d.width(),height:d.height()};this.originalPosition={left:j,top:g};this.sizeDiff={width:d.outerWidth()-d.width(),height:d.outerHeight()-d.height()};this.originalMousePosition={left:f.pageX,top:f.pageY};this.aspectRatio=(typeof i.aspectRatio=="number")?i.aspectRatio:((this.originalSize.width/this.originalSize.height)||1);var h=c(".ui-resizable-"+this.axis).css("cursor");c("body").css("cursor",h=="auto"?this.axis+"-resize":h);d.addClass("ui-resizable-resizing");this._propagate("start",f);return true},_mouseDrag:function(d){var g=this.helper,f=this.options,l={},p=this,i=this.originalMousePosition,m=this.axis;var q=(d.pageX-i.left)||0,n=(d.pageY-i.top)||0;var h=this._change[m];if(!h){return false}var k=h.apply(this,[d,q,n]),j=c.browser.msie&&c.browser.version<7,e=this.sizeDiff;if(this._aspectRatio||d.shiftKey){k=this._updateRatio(k,d)}k=this._respectSize(k,d);this._propagate("resize",d);g.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"});if(!this._helper&&this._proportionallyResizeElements.length){this._proportionallyResize()}this._updateCache(k);this._trigger("resize",d,this.ui());return false},_mouseStop:function(g){this.resizing=false;var h=this.options,l=this;if(this._helper){var f=this._proportionallyResizeElements,d=f.length&&(/textarea/i).test(f[0].nodeName),e=d&&c.ui.hasScroll(f[0],"left")?0:l.sizeDiff.height,j=d?0:l.sizeDiff.width;var m={width:(l.size.width-j),height:(l.size.height-e)},i=(parseInt(l.element.css("left"),10)+(l.position.left-l.originalPosition.left))||null,k=(parseInt(l.element.css("top"),10)+(l.position.top-l.originalPosition.top))||null;if(!h.animate){this.element.css(c.extend(m,{top:k,left:i}))}l.helper.height(l.size.height);l.helper.width(l.size.width);if(this._helper&&!h.animate){this._proportionallyResize()}}c("body").css("cursor","auto");this.element.removeClass("ui-resizable-resizing");this._propagate("stop",g);if(this._helper){this.helper.remove()}return false},_updateCache:function(d){var e=this.options;this.offset=this.helper.offset();if(a(d.left)){this.position.left=d.left}if(a(d.top)){this.position.top=d.top}if(a(d.height)){this.size.height=d.height}if(a(d.width)){this.size.width=d.width}},_updateRatio:function(g,f){var h=this.options,i=this.position,e=this.size,d=this.axis;if(g.height){g.width=(e.height*this.aspectRatio)}else{if(g.width){g.height=(e.width/this.aspectRatio)}}if(d=="sw"){g.left=i.left+(e.width-g.width);g.top=null}if(d=="nw"){g.top=i.top+(e.height-g.height);g.left=i.left+(e.width-g.width)}return g},_respectSize:function(k,f){var i=this.helper,h=this.options,q=this._aspectRatio||f.shiftKey,p=this.axis,s=a(k.width)&&h.maxWidth&&(h.maxWidth<k.width),l=a(k.height)&&h.maxHeight&&(h.maxHeight<k.height),g=a(k.width)&&h.minWidth&&(h.minWidth>k.width),r=a(k.height)&&h.minHeight&&(h.minHeight>k.height);if(g){k.width=h.minWidth}if(r){k.height=h.minHeight}if(s){k.width=h.maxWidth}if(l){k.height=h.maxHeight}var e=this.originalPosition.left+this.originalSize.width,n=this.position.top+this.size.height;var j=/sw|nw|w/.test(p),d=/nw|ne|n/.test(p);if(g&&j){k.left=e-h.minWidth}if(s&&j){k.left=e-h.maxWidth}if(r&&d){k.top=n-h.minHeight}if(l&&d){k.top=n-h.maxHeight}var m=!k.width&&!k.height;if(m&&!k.left&&k.top){k.top=null}else{if(m&&!k.top&&k.left){k.left=null}}return k},_proportionallyResize:function(){var j=this.options;if(!this._proportionallyResizeElements.length){return}var f=this.helper||this.element;for(var e=0;e<this._proportionallyResizeElements.length;e++){var g=this._proportionallyResizeElements[e];if(!this.borderDif){var d=[g.css("borderTopWidth"),g.css("borderRightWidth"),g.css("borderBottomWidth"),g.css("borderLeftWidth")],h=[g.css("paddingTop"),g.css("paddingRight"),g.css("paddingBottom"),g.css("paddingLeft")];this.borderDif=c.map(d,function(k,m){var l=parseInt(k,10)||0,n=parseInt(h[m],10)||0;return l+n})}if(c.browser.msie&&!(!(c(f).is(":hidden")||c(f).parents(":hidden").length))){continue}g.css({height:(f.height()-this.borderDif[0]-this.borderDif[2])||0,width:(f.width()-this.borderDif[1]-this.borderDif[3])||0})}},_renderProxy:function(){var e=this.element,h=this.options;this.elementOffset=e.offset();if(this._helper){this.helper=this.helper||c('<div style="overflow:hidden;"></div>');var d=c.browser.msie&&c.browser.version<7,f=(d?1:0),g=(d?2:-1);this.helper.addClass(this._helper).css({width:this.element.outerWidth()+g,height:this.element.outerHeight()+g,position:"absolute",left:this.elementOffset.left-f+"px",top:this.elementOffset.top-f+"px",zIndex:++h.zIndex});this.helper.appendTo("body").disableSelection()}else{this.helper=this.element}},_change:{e:function(f,e,d){return{width:this.originalSize.width+e}},w:function(g,e,d){var i=this.options,f=this.originalSize,h=this.originalPosition;return{left:h.left+e,width:f.width-e}},n:function(g,e,d){var i=this.options,f=this.originalSize,h=this.originalPosition;return{top:h.top+d,height:f.height-d}},s:function(f,e,d){return{height:this.originalSize.height+d}},se:function(f,e,d){return c.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[f,e,d]))},sw:function(f,e,d){return c.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[f,e,d]))},ne:function(f,e,d){return c.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[f,e,d]))},nw:function(f,e,d){return c.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[f,e,d]))}},_propagate:function(e,d){c.ui.plugin.call(this,e,[d,this.ui()]);(e!="resize"&&this._trigger(e,d,this.ui()))},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}));c.extend(c.ui.resizable,{version:"1.7.2",eventPrefix:"resize",defaults:{alsoResize:false,animate:false,animateDuration:"slow",animateEasing:"swing",aspectRatio:false,autoHide:false,cancel:":input,option",containment:false,delay:0,distance:1,ghost:false,grid:false,handles:"e,s,se",helper:false,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:1000}});c.ui.plugin.add("resizable","alsoResize",{start:function(e,f){var d=c(this).data("resizable"),g=d.options;_store=function(h){c(h).each(function(){c(this).data("resizable-alsoresize",{width:parseInt(c(this).width(),10),height:parseInt(c(this).height(),10),left:parseInt(c(this).css("left"),10),top:parseInt(c(this).css("top"),10)})})};if(typeof(g.alsoResize)=="object"&&!g.alsoResize.parentNode){if(g.alsoResize.length){g.alsoResize=g.alsoResize[0];_store(g.alsoResize)}else{c.each(g.alsoResize,function(h,i){_store(h)})}}else{_store(g.alsoResize)}},resize:function(f,h){var e=c(this).data("resizable"),i=e.options,g=e.originalSize,k=e.originalPosition;var j={height:(e.size.height-g.height)||0,width:(e.size.width-g.width)||0,top:(e.position.top-k.top)||0,left:(e.position.left-k.left)||0},d=function(l,m){c(l).each(function(){var p=c(this),q=c(this).data("resizable-alsoresize"),o={},n=m&&m.length?m:["width","height","top","left"];c.each(n||["width","height","top","left"],function(r,t){var s=(q[t]||0)+(j[t]||0);if(s&&s>=0){o[t]=s||null}});if(/relative/.test(p.css("position"))&&c.browser.opera){e._revertToRelativePosition=true;p.css({position:"absolute",top:"auto",left:"auto"})}p.css(o)})};if(typeof(i.alsoResize)=="object"&&!i.alsoResize.nodeType){c.each(i.alsoResize,function(l,m){d(l,m)})}else{d(i.alsoResize)}},stop:function(e,f){var d=c(this).data("resizable");if(d._revertToRelativePosition&&c.browser.opera){d._revertToRelativePosition=false;el.css({position:"relative"})}c(this).removeData("resizable-alsoresize-start")}});c.ui.plugin.add("resizable","animate",{stop:function(h,m){var n=c(this).data("resizable"),i=n.options;var g=n._proportionallyResizeElements,d=g.length&&(/textarea/i).test(g[0].nodeName),e=d&&c.ui.hasScroll(g[0],"left")?0:n.sizeDiff.height,k=d?0:n.sizeDiff.width;var f={width:(n.size.width-k),height:(n.size.height-e)},j=(parseInt(n.element.css("left"),10)+(n.position.left-n.originalPosition.left))||null,l=(parseInt(n.element.css("top"),10)+(n.position.top-n.originalPosition.top))||null;n.element.animate(c.extend(f,l&&j?{top:l,left:j}:{}),{duration:i.animateDuration,easing:i.animateEasing,step:function(){var o={width:parseInt(n.element.css("width"),10),height:parseInt(n.element.css("height"),10),top:parseInt(n.element.css("top"),10),left:parseInt(n.element.css("left"),10)};if(g&&g.length){c(g[0]).css({width:o.width,height:o.height})}n._updateCache(o);n._propagate("resize",h)}})}});c.ui.plugin.add("resizable","containment",{start:function(e,q){var s=c(this).data("resizable"),i=s.options,k=s.element;var f=i.containment,j=(f instanceof c)?f.get(0):(/parent/.test(f))?k.parent().get(0):f;if(!j){return}s.containerElement=c(j);if(/document/.test(f)||f==document){s.containerOffset={left:0,top:0};s.containerPosition={left:0,top:0};s.parentData={element:c(document),left:0,top:0,width:c(document).width(),height:c(document).height()||document.body.parentNode.scrollHeight}}else{var m=c(j),h=[];c(["Top","Right","Left","Bottom"]).each(function(p,o){h[p]=b(m.css("padding"+o))});s.containerOffset=m.offset();s.containerPosition=m.position();s.containerSize={height:(m.innerHeight()-h[3]),width:(m.innerWidth()-h[1])};var n=s.containerOffset,d=s.containerSize.height,l=s.containerSize.width,g=(c.ui.hasScroll(j,"left")?j.scrollWidth:l),r=(c.ui.hasScroll(j)?j.scrollHeight:d);s.parentData={element:j,left:n.left,top:n.top,width:g,height:r}}},resize:function(f,p){var s=c(this).data("resizable"),h=s.options,e=s.containerSize,n=s.containerOffset,l=s.size,m=s.position,q=s._aspectRatio||f.shiftKey,d={top:0,left:0},g=s.containerElement;if(g[0]!=document&&(/static/).test(g.css("position"))){d=n}if(m.left<(s._helper?n.left:0)){s.size.width=s.size.width+(s._helper?(s.position.left-n.left):(s.position.left-d.left));if(q){s.size.height=s.size.width/h.aspectRatio}s.position.left=h.helper?n.left:0}if(m.top<(s._helper?n.top:0))
+{s.size.height=s.size.height+(s._helper?(s.position.top-n.top):s.position.top);if(q){s.size.width=s.size.height*h.aspectRatio}s.position.top=s._helper?n.top:0}s.offset.left=s.parentData.left+s.position.left;s.offset.top=s.parentData.top+s.position.top;var k=Math.abs((s._helper?s.offset.left-d.left:(s.offset.left-d.left))+s.sizeDiff.width),r=Math.abs((s._helper?s.offset.top-d.top:(s.offset.top-n.top))+s.sizeDiff.height);var j=s.containerElement.get(0)==s.element.parent().get(0),i=/relative|absolute/.test(s.containerElement.css("position"));if(j&&i){k-=s.parentData.left}if(k+s.size.width>=s.parentData.width){s.size.width=s.parentData.width-k;if(q){s.size.height=s.size.width/s.aspectRatio}}if(r+s.size.height>=s.parentData.height){s.size.height=s.parentData.height-r;if(q){s.size.width=s.size.height*s.aspectRatio}}},stop:function(e,m){var p=c(this).data("resizable"),f=p.options,k=p.position,l=p.containerOffset,d=p.containerPosition,g=p.containerElement;var i=c(p.helper),q=i.offset(),n=i.outerWidth()-p.sizeDiff.width,j=i.outerHeight()-p.sizeDiff.height;if(p._helper&&!f.animate&&(/relative/).test(g.css("position"))){c(this).css({left:q.left-d.left-l.left,width:n,height:j})}if(p._helper&&!f.animate&&(/static/).test(g.css("position"))){c(this).css({left:q.left-d.left-l.left,width:n,height:j})}}});c.ui.plugin.add("resizable","ghost",{start:function(f,g){var d=c(this).data("resizable"),h=d.options,e=d.size;d.ghost=d.originalElement.clone();d.ghost.css({opacity:0.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof h.ghost=="string"?h.ghost:"");d.ghost.appendTo(d.helper)},resize:function(e,f){var d=c(this).data("resizable"),g=d.options;if(d.ghost){d.ghost.css({position:"relative",height:d.size.height,width:d.size.width})}},stop:function(e,f){var d=c(this).data("resizable"),g=d.options;if(d.ghost&&d.helper){d.helper.get(0).removeChild(d.ghost.get(0))}}});c.ui.plugin.add("resizable","grid",{resize:function(d,l){var n=c(this).data("resizable"),g=n.options,j=n.size,h=n.originalSize,i=n.originalPosition,m=n.axis,k=g._aspectRatio||d.shiftKey;g.grid=typeof g.grid=="number"?[g.grid,g.grid]:g.grid;var f=Math.round((j.width-h.width)/(g.grid[0]||1))*(g.grid[0]||1),e=Math.round((j.height-h.height)/(g.grid[1]||1))*(g.grid[1]||1);if(/^(se|s|e)$/.test(m)){n.size.width=h.width+f;n.size.height=h.height+e}else{if(/^(ne)$/.test(m)){n.size.width=h.width+f;n.size.height=h.height+e;n.position.top=i.top-e}else{if(/^(sw)$/.test(m)){n.size.width=h.width+f;n.size.height=h.height+e;n.position.left=i.left-f}else{n.size.width=h.width+f;n.size.height=h.height+e;n.position.top=i.top-e;n.position.left=i.left-f}}}}});var b=function(d){return parseInt(d,10)||0};var a=function(d){return !isNaN(parseInt(d,10))}})(jQuery);;
+/**
+ * jQuery.ScrollTo - Easy element scrolling using jQuery.
+ * Copyright (c) 2008 Ariel Flesler - aflesler(at)gmail(dot)com
+ * Licensed under GPL license (http://www.opensource.org/licenses/gpl-license.php).
+ * Date: 2/8/2008
+ * @author Ariel Flesler
+ * @version 1.3.2
+ */
+;(function($){var o=$.scrollTo=function(a,b,c){o.window().scrollTo(a,b,c)};o.defaults={axis:'y',duration:1};o.window=function(){return $($.browser.safari?'body':'html')};$.fn.scrollTo=function(l,m,n){if(typeof m=='object'){n=m;m=0}n=$.extend({},o.defaults,n);m=m||n.speed||n.duration;n.queue=n.queue&&n.axis.length>1;if(n.queue)m/=2;n.offset=j(n.offset);n.over=j(n.over);return this.each(function(){var a=this,b=$(a),t=l,c,d={},w=b.is('html,body');switch(typeof t){case'number':case'string':if(/^([+-]=)?\d+(px)?$/.test(t)){t=j(t);break}t=$(t,this);case'object':if(t.is||t.style)c=(t=$(t)).offset()}$.each(n.axis.split(''),function(i,f){var P=f=='x'?'Left':'Top',p=P.toLowerCase(),k='scroll'+P,e=a[k],D=f=='x'?'Width':'Height';if(c){d[k]=c[p]+(w?0:e-b.offset()[p]);if(n.margin){d[k]-=parseInt(t.css('margin'+P))||0;d[k]-=parseInt(t.css('border'+P+'Width'))||0}d[k]+=n.offset[p]||0;if(n.over[p])d[k]+=t[D.toLowerCase()]()*n.over[p]}else d[k]=t[p];if(/^\d+$/.test(d[k]))d[k]=d[k]<=0?0:Math.min(d[k],h(D));if(!i&&n.queue){if(e!=d[k])g(n.onAfterFirst);delete d[k]}});g(n.onAfter);function g(a){b.animate(d,m,n.easing,a&&function(){a.call(this,l)})};function h(D){var b=w?$.browser.opera?document.body:document.documentElement:a;return b['scroll'+D]-b['client'+D]}})};function j(a){return typeof a=='object'?a:{top:a,left:a}}})(jQuery);
+
diff --git a/native_client_sdk/doc_generated/pepper_beta/c/ppb__graphics__2d_8h.html b/native_client_sdk/doc_generated/pepper_beta/c/ppb__graphics__2d_8h.html
index 4a81442..84a4eb6 100644
--- a/native_client_sdk/doc_generated/pepper_beta/c/ppb__graphics__2d_8h.html
+++ b/native_client_sdk/doc_generated/pepper_beta/c/ppb__graphics__2d_8h.html
@@ -19,15 +19,15 @@
 </div><h2>
 Data Structures</h2><table class="memberdecls">
 
-<tr><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___graphics2_d__1__1.html">PPB_Graphics2D</a></td></tr>
-<tr><td class="mdescLeft">&#160;</td><td class="mdescRight"><code>PPB_Graphics2D</code> defines the interface for a 2D graphics context.  <a href="struct_p_p_b___graphics2_d__1__1.html#details">More...</a><br /></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___graphics2_d__1__2.html">PPB_Graphics2D</a></td></tr>
+<tr><td class="mdescLeft">&#160;</td><td class="mdescRight"><code>PPB_Graphics2D</code> defines the interface for a 2D graphics context.  <a href="struct_p_p_b___graphics2_d__1__2.html#details">More...</a><br /></td></tr>
 </table><h2>
 Defines</h2><table class="memberdecls">
-<tr><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ppb__graphics__2d_8h.html#ad9792b60ca6ce77f3925be8d60e06640">PPB_GRAPHICS_2D_INTERFACE</a>&#160;&#160;&#160;&quot;PPB_Graphics2D;1.1&quot;</td></tr>
-<tr><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ppb__graphics__2d_8h.html#ab4930fe7aea6b403503d5cc748824b0d">PPB_GRAPHICS_2D_INTERFACE</a>&#160;&#160;&#160;<a class="el" href="ppb__graphics__2d_8h.html#ad9792b60ca6ce77f3925be8d60e06640">PPB_GRAPHICS_2D_INTERFACE</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ppb__graphics__2d_8h.html#a8991520a54fc032adae6e8de92d0e0c5">PPB_GRAPHICS_2D_INTERFACE</a>&#160;&#160;&#160;&quot;PPB_Graphics2D;1.2&quot;</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ppb__graphics__2d_8h.html#ab4930fe7aea6b403503d5cc748824b0d">PPB_GRAPHICS_2D_INTERFACE</a>&#160;&#160;&#160;<a class="el" href="ppb__graphics__2d_8h.html#a8991520a54fc032adae6e8de92d0e0c5">PPB_GRAPHICS_2D_INTERFACE</a></td></tr>
 </table><h2>
 Typedefs</h2><table class="memberdecls">
-<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___graphics2_d__1__1.html">PPB_Graphics2D</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#gaf9f8348d3315d8bb014b401f733ebdb6">PPB_Graphics2D</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___graphics2_d__1__2.html">PPB_Graphics2D</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#gae81de3c5ca761162254ed217693050ba">PPB_Graphics2D</a></td></tr>
 </table>
 <hr /><a name="details" id="details"></a><h2>Detailed Description</h2>
 <div class="textblock"><p>Defines the <code>PPB_Graphics2D</code> struct representing a 2D graphics context within the browser. </p>
@@ -37,19 +37,19 @@
 <div class="memproto">
 <table class="memname">
 <tr>
-<td class="memname">#define <a class="el" href="ppb__graphics__2d_8h.html#ab4930fe7aea6b403503d5cc748824b0d">PPB_GRAPHICS_2D_INTERFACE</a>&#160;&#160;&#160;<a class="el" href="ppb__graphics__2d_8h.html#ad9792b60ca6ce77f3925be8d60e06640">PPB_GRAPHICS_2D_INTERFACE</a></td>
+<td class="memname">#define <a class="el" href="ppb__graphics__2d_8h.html#ab4930fe7aea6b403503d5cc748824b0d">PPB_GRAPHICS_2D_INTERFACE</a>&#160;&#160;&#160;<a class="el" href="ppb__graphics__2d_8h.html#a8991520a54fc032adae6e8de92d0e0c5">PPB_GRAPHICS_2D_INTERFACE</a></td>
 </tr>
 </table>
 </div>
 <div class="memdoc">
 </div>
 </div>
-<a class="anchor" id="ad9792b60ca6ce77f3925be8d60e06640"></a><!-- doxytag: member="ppb_graphics_2d.h::PPB_GRAPHICS_2D_INTERFACE" ref="ad9792b60ca6ce77f3925be8d60e06640" args="" -->
+<a class="anchor" id="a8991520a54fc032adae6e8de92d0e0c5"></a><!-- doxytag: member="ppb_graphics_2d.h::PPB_GRAPHICS_2D_INTERFACE" ref="a8991520a54fc032adae6e8de92d0e0c5" args="" -->
 <div class="memitem">
 <div class="memproto">
 <table class="memname">
 <tr>
-<td class="memname">#define <a class="el" href="ppb__graphics__2d_8h.html#ad9792b60ca6ce77f3925be8d60e06640">PPB_GRAPHICS_2D_INTERFACE</a>&#160;&#160;&#160;&quot;PPB_Graphics2D;1.1&quot;</td>
+<td class="memname">#define <a class="el" href="ppb__graphics__2d_8h.html#a8991520a54fc032adae6e8de92d0e0c5">PPB_GRAPHICS_2D_INTERFACE</a>&#160;&#160;&#160;&quot;PPB_Graphics2D;1.2&quot;</td>
 </tr>
 </table>
 </div>
diff --git a/native_client_sdk/doc_generated/pepper_beta/c/ppb__input__event_8h.html b/native_client_sdk/doc_generated/pepper_beta/c/ppb__input__event_8h.html
index 1312059..b80c7b30 100644
--- a/native_client_sdk/doc_generated/pepper_beta/c/ppb__input__event_8h.html
+++ b/native_client_sdk/doc_generated/pepper_beta/c/ppb__input__event_8h.html
@@ -102,7 +102,9 @@
 <a class="el" href="group___enums.html#gga21b811ac0484a214a8751aa3e1c959d9a493ca598187014e2356cd7a5ba8cdffd">PP_INPUTEVENT_MODIFIER_NUMLOCKKEY</a> =  1 &lt;&lt; 10, 
 <a class="el" href="group___enums.html#gga21b811ac0484a214a8751aa3e1c959d9a8295bfc8067c06a17ccfc5fb6a992e17">PP_INPUTEVENT_MODIFIER_ISLEFT</a> =  1 &lt;&lt; 11, 
 <br />
-&#160;&#160;<a class="el" href="group___enums.html#gga21b811ac0484a214a8751aa3e1c959d9a348f43efaf61edbefd83346428c5b122">PP_INPUTEVENT_MODIFIER_ISRIGHT</a> =  1 &lt;&lt; 12
+&#160;&#160;<a class="el" href="group___enums.html#gga21b811ac0484a214a8751aa3e1c959d9a348f43efaf61edbefd83346428c5b122">PP_INPUTEVENT_MODIFIER_ISRIGHT</a> =  1 &lt;&lt; 12, 
+<a class="el" href="group___enums.html#gga21b811ac0484a214a8751aa3e1c959d9a970ad827a7240093ec57f1a3a7aea692">PP_INPUTEVENT_MODIFIER_ISPEN</a> =  1 &lt;&lt; 13, 
+<a class="el" href="group___enums.html#gga21b811ac0484a214a8751aa3e1c959d9a3367f08ba940a67d0098a59093582ef1">PP_INPUTEVENT_MODIFIER_ISERASER</a> =  1 &lt;&lt; 14
 <br />
  }</td></tr>
 <tr><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#ga25113f3c8d33e863fd38b3f70f8a5e6e">PP_InputEvent_MouseButton</a> { <a class="el" href="group___enums.html#gga25113f3c8d33e863fd38b3f70f8a5e6eaa2d4e499d6c23ef45381a89612e654d9">PP_INPUTEVENT_MOUSEBUTTON_NONE</a> =  -1, 
diff --git a/native_client_sdk/doc_generated/pepper_beta/c/ppb__vpn__provider_8h.html b/native_client_sdk/doc_generated/pepper_beta/c/ppb__vpn__provider_8h.html
new file mode 100644
index 0000000..27e0fa7741
--- /dev/null
+++ b/native_client_sdk/doc_generated/pepper_beta/c/ppb__vpn__provider_8h.html
@@ -0,0 +1,45 @@
+{{+bindTo:partials.standard_nacl_api}}
+<h1>ppb_vpn_provider.h File Reference</h1>
+<div id="doxygen-ref">
+{{- dummy div to appease doxygen -}}
+  <div>
+<!-- Generated by Doxygen 1.7.6.1 -->
+
+
+</div>
+<!--header-->
+<div class="contents">
+<div class="textblock"><div class="dynheader">
+Include dependency graph for ppb_vpn_provider.h:</div>
+<div class="dyncontent">
+<div class="center"><img src="ppb__vpn__provider_8h__incl.png" border="0" usemap="#ppb__vpn__provider_8h" alt="" /></div>
+<map name="ppb__vpn__provider_8h" id="ppb__vpn__provider_8h">
+</map>
+</div>
+</div><h2>
+Data Structures</h2><table class="memberdecls">
+
+<tr><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___vpn_provider__0__1.html">PPB_VpnProvider</a></td></tr>
+<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Use the <code>PPB_VpnProvider</code> interface to implement a VPN client.  <a href="struct_p_p_b___vpn_provider__0__1.html#details">More...</a><br /></td></tr>
+</table><h2>
+Defines</h2><table class="memberdecls">
+<tr><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ppb__vpn__provider_8h.html#adc236058517f438cdd43d61c8948de69">PPB_VPNPROVIDER_INTERFACE</a>&#160;&#160;&#160;&quot;PPB_VpnProvider;0.1&quot; /* dev */</td></tr>
+</table>
+<hr /><a name="details" id="details"></a><h2>Detailed Description</h2>
+<div class="textblock"><p>This file defines the <code>PPB_VpnProvider</code> interface. </p>
+</div><hr /><h2>Define Documentation</h2>
+<a class="anchor" id="adc236058517f438cdd43d61c8948de69"></a><!-- doxytag: member="ppb_vpn_provider.h::PPB_VPNPROVIDER_INTERFACE" ref="adc236058517f438cdd43d61c8948de69" args="" -->
+<div class="memitem">
+<div class="memproto">
+<table class="memname">
+<tr>
+<td class="memname">#define <a class="el" href="ppb__vpn__provider_8h.html#adc236058517f438cdd43d61c8948de69">PPB_VPNPROVIDER_INTERFACE</a>&#160;&#160;&#160;&quot;PPB_VpnProvider;0.1&quot; /* dev */</td>
+</tr>
+</table>
+</div>
+<div class="memdoc">
+</div>
+</div>
+</div><!-- contents -->
+</div>
+{{/partials.standard_nacl_api}}
diff --git a/native_client_sdk/doc_generated/pepper_beta/c/ppb__vpn__provider_8h__incl.png b/native_client_sdk/doc_generated/pepper_beta/c/ppb__vpn__provider_8h__incl.png
new file mode 100644
index 0000000..8283005f
--- /dev/null
+++ b/native_client_sdk/doc_generated/pepper_beta/c/ppb__vpn__provider_8h__incl.png
Binary files differ
diff --git a/native_client_sdk/doc_generated/pepper_beta/c/struct_p_p___gamepad_sample_data.html b/native_client_sdk/doc_generated/pepper_beta/c/struct_p_p___gamepad_sample_data.html
index b198568..33332ca 100644
--- a/native_client_sdk/doc_generated/pepper_beta/c/struct_p_p___gamepad_sample_data.html
+++ b/native_client_sdk/doc_generated/pepper_beta/c/struct_p_p___gamepad_sample_data.html
@@ -19,7 +19,7 @@
 <tr><td class="memItemLeft" align="right" valign="top">double&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___gamepad_sample_data.html#af832f6af0964f9023d712712a6e3afc7">timestamp</a></td></tr>
 <tr><td class="memItemLeft" align="right" valign="top">uint16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___gamepad_sample_data.html#a0a4d0498f6beecb54628a4f1919c48e3">id</a> [128]</td></tr>
 <tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___gamepad_sample_data.html#ae955efce5fcd9de08ab8d4c7f52d0af7">connected</a></td></tr>
-<tr><td class="memItemLeft" align="right" valign="top">char&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___gamepad_sample_data.html#aad71d81059bd5880ebd79bc3b9e55cd5">unused_pad_</a> [4]</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">int8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___gamepad_sample_data.html#a6d8faab2471cbf6133481d7df6c53c3f">unused_pad_</a> [4]</td></tr>
 </table>
 <hr /><a name="details" id="details"></a><h2>Detailed Description</h2>
 <div class="textblock"><p>The data for one gamepad device. </p>
@@ -119,12 +119,12 @@
 <p>Monotonically increasing value that is incremented when the data have been updated. </p>
 </div>
 </div>
-<a class="anchor" id="aad71d81059bd5880ebd79bc3b9e55cd5"></a><!-- doxytag: member="PP_GamepadSampleData::unused_pad_" ref="aad71d81059bd5880ebd79bc3b9e55cd5" args="[4]" -->
+<a class="anchor" id="a6d8faab2471cbf6133481d7df6c53c3f"></a><!-- doxytag: member="PP_GamepadSampleData::unused_pad_" ref="a6d8faab2471cbf6133481d7df6c53c3f" args="[4]" -->
 <div class="memitem">
 <div class="memproto">
 <table class="memname">
 <tr>
-<td class="memname">char <a class="el" href="struct_p_p___gamepad_sample_data.html#aad71d81059bd5880ebd79bc3b9e55cd5">PP_GamepadSampleData::unused_pad_</a>[4]</td>
+<td class="memname">int8_t <a class="el" href="struct_p_p___gamepad_sample_data.html#a6d8faab2471cbf6133481d7df6c53c3f">PP_GamepadSampleData::unused_pad_</a>[4]</td>
 </tr>
 </table>
 </div>
diff --git a/native_client_sdk/doc_generated/pepper_beta/c/struct_p_p___gamepads_sample_data.html b/native_client_sdk/doc_generated/pepper_beta/c/struct_p_p___gamepads_sample_data.html
index 26c5f006..1783f94f 100644
--- a/native_client_sdk/doc_generated/pepper_beta/c/struct_p_p___gamepads_sample_data.html
+++ b/native_client_sdk/doc_generated/pepper_beta/c/struct_p_p___gamepads_sample_data.html
@@ -13,7 +13,7 @@
 Data Fields</h2><table class="memberdecls">
 
 <tr><td class="memItemLeft" align="right" valign="top">uint32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___gamepads_sample_data.html#abc9c0c8b20cfe0219a5ab4e38dd5a800">length</a></td></tr>
-<tr><td class="memItemLeft" align="right" valign="top">char&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___gamepads_sample_data.html#a0664781b0f25af5206d134cb04543235">unused_pad_</a> [4]</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">int8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___gamepads_sample_data.html#a8da16be21054bad05283f6cbc7ab226a">unused_pad_</a> [4]</td></tr>
 <tr><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="struct_p_p___gamepad_sample_data.html">PP_GamepadSampleData</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___gamepads_sample_data.html#ab0fa87f088fef743ba879a2f91363bfe">items</a> [4]</td></tr>
 </table>
 <hr /><a name="details" id="details"></a><h2>Detailed Description</h2>
@@ -45,12 +45,12 @@
 <p>Number of valid elements in the |items| array. </p>
 </div>
 </div>
-<a class="anchor" id="a0664781b0f25af5206d134cb04543235"></a><!-- doxytag: member="PP_GamepadsSampleData::unused_pad_" ref="a0664781b0f25af5206d134cb04543235" args="[4]" -->
+<a class="anchor" id="a8da16be21054bad05283f6cbc7ab226a"></a><!-- doxytag: member="PP_GamepadsSampleData::unused_pad_" ref="a8da16be21054bad05283f6cbc7ab226a" args="[4]" -->
 <div class="memitem">
 <div class="memproto">
 <table class="memname">
 <tr>
-<td class="memname">char <a class="el" href="struct_p_p___gamepads_sample_data.html#a0664781b0f25af5206d134cb04543235">PP_GamepadsSampleData::unused_pad_</a>[4]</td>
+<td class="memname">int8_t <a class="el" href="struct_p_p___gamepads_sample_data.html#a8da16be21054bad05283f6cbc7ab226a">PP_GamepadsSampleData::unused_pad_</a>[4]</td>
 </tr>
 </table>
 </div>
diff --git a/native_client_sdk/doc_generated/pepper_beta/c/struct_p_p___input_event___character.html b/native_client_sdk/doc_generated/pepper_beta/c/struct_p_p___input_event___character.html
index 4f3913d..17f4592 100644
--- a/native_client_sdk/doc_generated/pepper_beta/c/struct_p_p___input_event___character.html
+++ b/native_client_sdk/doc_generated/pepper_beta/c/struct_p_p___input_event___character.html
@@ -13,7 +13,7 @@
 Data Fields</h2><table class="memberdecls">
 
 <tr><td class="memItemLeft" align="right" valign="top">uint32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___input_event___character.html#a6505d006cdb0e52d39e94b540b923b9a">modifier</a></td></tr>
-<tr><td class="memItemLeft" align="right" valign="top">char&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___input_event___character.html#ac5e8c1dbf5c8ae33f22b8781ff5f1760">text</a> [5]</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">int8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___input_event___character.html#a02f4d484985b53e378df8f0281a268ba">text</a> [5]</td></tr>
 </table>
 <hr /><a name="details" id="details"></a><h2>Detailed Description</h2>
 <div class="textblock"><p>The <code><a class="el" href="struct_p_p___input_event___character.html" title="The PP_InputEvent_Character struct represents a typed character event.">PP_InputEvent_Character</a></code> struct represents a typed character event. </p>
@@ -33,12 +33,12 @@
 <p>A combination of the <code>PP_InputEvent_Modifier</code> flags. </p>
 </div>
 </div>
-<a class="anchor" id="ac5e8c1dbf5c8ae33f22b8781ff5f1760"></a><!-- doxytag: member="PP_InputEvent_Character::text" ref="ac5e8c1dbf5c8ae33f22b8781ff5f1760" args="[5]" -->
+<a class="anchor" id="a02f4d484985b53e378df8f0281a268ba"></a><!-- doxytag: member="PP_InputEvent_Character::text" ref="a02f4d484985b53e378df8f0281a268ba" args="[5]" -->
 <div class="memitem">
 <div class="memproto">
 <table class="memname">
 <tr>
-<td class="memname">char <a class="el" href="struct_p_p___input_event___character.html#ac5e8c1dbf5c8ae33f22b8781ff5f1760">PP_InputEvent_Character::text</a>[5]</td>
+<td class="memname">int8_t <a class="el" href="struct_p_p___input_event___character.html#a02f4d484985b53e378df8f0281a268ba">PP_InputEvent_Character::text</a>[5]</td>
 </tr>
 </table>
 </div>
diff --git a/native_client_sdk/doc_generated/pepper_beta/c/struct_p_p_b___graphics2_d__1__1.html b/native_client_sdk/doc_generated/pepper_beta/c/struct_p_p_b___graphics2_d__1__2.html
similarity index 71%
rename from native_client_sdk/doc_generated/pepper_beta/c/struct_p_p_b___graphics2_d__1__1.html
rename to native_client_sdk/doc_generated/pepper_beta/c/struct_p_p_b___graphics2_d__1__2.html
index ec01d7f..010a0b56 100644
--- a/native_client_sdk/doc_generated/pepper_beta/c/struct_p_p_b___graphics2_d__1__1.html
+++ b/native_client_sdk/doc_generated/pepper_beta/c/struct_p_p_b___graphics2_d__1__2.html
@@ -12,30 +12,31 @@
 <!-- doxytag: class="PPB_Graphics2D" --><h2>
 Data Fields</h2><table class="memberdecls">
 
-<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a034e6a3df2bccb119a087874e7cf18ed">Create</a> )(<a class="el" href="group___typedefs.html#ga89b662403e6a687bb914b80114c0d19d">PP_Instance</a> instance, const struct <a class="el" href="struct_p_p___size.html">PP_Size</a> *size, <a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a> is_always_opaque)</td></tr>
-<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a8d634407f71b52367901e8c807f3bb15">IsGraphics2D</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource)</td></tr>
-<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___graphics2_d__1__1.html#ae9aae546a51e35ee85688e0f80907fc3">Describe</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics_2d, struct <a class="el" href="struct_p_p___size.html">PP_Size</a> *size, <a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a> *is_always_opaque)</td></tr>
-<tr><td class="memItemLeft" align="right" valign="top">void(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a912e5704c150c4228ee4ec326e7cb1bb">PaintImageData</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics_2d, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> image_data, const struct <a class="el" href="struct_p_p___point.html">PP_Point</a> *top_left, const struct <a class="el" href="struct_p_p___rect.html">PP_Rect</a> *src_rect)</td></tr>
-<tr><td class="memItemLeft" align="right" valign="top">void(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a2242719819a82b11b0e3f71c4a19f461">Scroll</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics_2d, const struct <a class="el" href="struct_p_p___rect.html">PP_Rect</a> *clip_rect, const struct <a class="el" href="struct_p_p___point.html">PP_Point</a> *amount)</td></tr>
-<tr><td class="memItemLeft" align="right" valign="top">void(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___graphics2_d__1__1.html#ae5cfb7616fe383d9fedee88131f4b9ff">ReplaceContents</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics_2d, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> image_data)</td></tr>
-<tr><td class="memItemLeft" align="right" valign="top">int32_t(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a46607be26d07e4af31b56ef0791022fa">Flush</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics_2d, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr>
-<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___graphics2_d__1__1.html#ad809f5d73448def11577d54147fa268e">SetScale</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource, float scale)</td></tr>
-<tr><td class="memItemLeft" align="right" valign="top">float(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a9e284dc50e55e87c5367e9f081f44045">GetScale</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a10e02f41b41c26bb88398b591f06ff12">Create</a> )(<a class="el" href="group___typedefs.html#ga89b662403e6a687bb914b80114c0d19d">PP_Instance</a> instance, const struct <a class="el" href="struct_p_p___size.html">PP_Size</a> *size, <a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a> is_always_opaque)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___graphics2_d__1__2.html#acae7c38863e9997fc0eee88a54d3d60d">IsGraphics2D</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a49dcb387e7e420bdd1c22344f3f35718">Describe</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics_2d, struct <a class="el" href="struct_p_p___size.html">PP_Size</a> *size, <a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a> *is_always_opaque)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">void(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a20071a446e8d7695c697f81a449597fe">PaintImageData</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics_2d, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> image_data, const struct <a class="el" href="struct_p_p___point.html">PP_Point</a> *top_left, const struct <a class="el" href="struct_p_p___rect.html">PP_Rect</a> *src_rect)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">void(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a3f87a2d280d6d4e6b9a2679787f5de1d">Scroll</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics_2d, const struct <a class="el" href="struct_p_p___rect.html">PP_Rect</a> *clip_rect, const struct <a class="el" href="struct_p_p___point.html">PP_Point</a> *amount)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">void(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a533a03163e1617692885aca78e72905a">ReplaceContents</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics_2d, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> image_data)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">int32_t(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a65dfb539bd057e33977a78537564885e">Flush</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics_2d, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a4b16d1210b49c45edfe477396934238a">SetScale</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource, float scale)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">float(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___graphics2_d__1__2.html#aa2820c6356e60627a175942ddd265753">GetScale</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___graphics2_d__1__2.html#af7d4955738f54da9eda60e5c052bf361">SetLayerTransform</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource, float scale, const struct <a class="el" href="struct_p_p___point.html">PP_Point</a> *origin, const struct <a class="el" href="struct_p_p___point.html">PP_Point</a> *translate)</td></tr>
 </table>
 <hr /><a name="details" id="details"></a><h2>Detailed Description</h2>
 <div class="textblock"><p><code>PPB_Graphics2D</code> defines the interface for a 2D graphics context. </p>
 </div><hr /><h2>Field Documentation</h2>
-<a class="anchor" id="a034e6a3df2bccb119a087874e7cf18ed"></a><!-- doxytag: member="PPB_Graphics2D::Create" ref="a034e6a3df2bccb119a087874e7cf18ed" args=")(PP_Instance instance, const struct PP_Size *size, PP_Bool is_always_opaque)" -->
+<a class="anchor" id="a10e02f41b41c26bb88398b591f06ff12"></a><!-- doxytag: member="PPB_Graphics2D::Create" ref="a10e02f41b41c26bb88398b591f06ff12" args=")(PP_Instance instance, const struct PP_Size *size, PP_Bool is_always_opaque)" -->
 <div class="memitem">
 <div class="memproto">
 <table class="memname">
 <tr>
-<td class="memname"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(* <a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a034e6a3df2bccb119a087874e7cf18ed">PPB_Graphics2D::Create</a>)(<a class="el" href="group___typedefs.html#ga89b662403e6a687bb914b80114c0d19d">PP_Instance</a> instance, const struct <a class="el" href="struct_p_p___size.html">PP_Size</a> *size, <a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a> is_always_opaque)</td>
+<td class="memname"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(* <a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a10e02f41b41c26bb88398b591f06ff12">PPB_Graphics2D::Create</a>)(<a class="el" href="group___typedefs.html#ga89b662403e6a687bb914b80114c0d19d">PP_Instance</a> instance, const struct <a class="el" href="struct_p_p___size.html">PP_Size</a> *size, <a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a> is_always_opaque)</td>
 </tr>
 </table>
 </div>
 <div class="memdoc">
-<p><a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a034e6a3df2bccb119a087874e7cf18ed" title="Create() creates a 2D graphics context.">Create()</a> creates a 2D graphics context. </p>
+<p><a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a10e02f41b41c26bb88398b591f06ff12" title="Create() creates a 2D graphics context.">Create()</a> creates a 2D graphics context. </p>
 <p>The returned graphics context will not be bound to the module instance on creation (call BindGraphics() on the module instance to bind the returned graphics context to the module instance).</p>
 <dl class="params"><dt><b>Parameters:</b></dt><dd>
 <table class="params">
@@ -49,17 +50,17 @@
 <dl class="return"><dt><b>Returns:</b></dt><dd>A <code>PP_Resource</code> containing the 2D graphics context if successful or 0 if unsuccessful. </dd></dl>
 </div>
 </div>
-<a class="anchor" id="ae9aae546a51e35ee85688e0f80907fc3"></a><!-- doxytag: member="PPB_Graphics2D::Describe" ref="ae9aae546a51e35ee85688e0f80907fc3" args=")(PP_Resource graphics_2d, struct PP_Size *size, PP_Bool *is_always_opaque)" -->
+<a class="anchor" id="a49dcb387e7e420bdd1c22344f3f35718"></a><!-- doxytag: member="PPB_Graphics2D::Describe" ref="a49dcb387e7e420bdd1c22344f3f35718" args=")(PP_Resource graphics_2d, struct PP_Size *size, PP_Bool *is_always_opaque)" -->
 <div class="memitem">
 <div class="memproto">
 <table class="memname">
 <tr>
-<td class="memname"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(* <a class="el" href="struct_p_p_b___graphics2_d__1__1.html#ae9aae546a51e35ee85688e0f80907fc3">PPB_Graphics2D::Describe</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics_2d, struct <a class="el" href="struct_p_p___size.html">PP_Size</a> *size, <a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a> *is_always_opaque)</td>
+<td class="memname"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(* <a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a49dcb387e7e420bdd1c22344f3f35718">PPB_Graphics2D::Describe</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics_2d, struct <a class="el" href="struct_p_p___size.html">PP_Size</a> *size, <a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a> *is_always_opaque)</td>
 </tr>
 </table>
 </div>
 <div class="memdoc">
-<p><a class="el" href="struct_p_p_b___graphics2_d__1__1.html#ae9aae546a51e35ee85688e0f80907fc3" title="Describe() retrieves the configuration for the given graphics context, filling the given values (whic...">Describe()</a> retrieves the configuration for the given graphics context, filling the given values (which must not be <code>NULL</code>). </p>
+<p><a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a49dcb387e7e420bdd1c22344f3f35718" title="Describe() retrieves the configuration for the given graphics context, filling the given values (whic...">Describe()</a> retrieves the configuration for the given graphics context, filling the given values (which must not be <code>NULL</code>). </p>
 <dl class="params"><dt><b>Parameters:</b></dt><dd>
 <table class="params">
 <tr><td class="paramdir">[in]</td><td class="paramname">resource</td><td>The 2D Graphics resource. </td></tr>
@@ -71,21 +72,21 @@
 <dl class="return"><dt><b>Returns:</b></dt><dd>Returns <code>PP_TRUE</code> on success or <code>PP_FALSE</code> if the resource is invalid. The output parameters will be set to 0 on a <code>PP_FALSE</code>. </dd></dl>
 </div>
 </div>
-<a class="anchor" id="a46607be26d07e4af31b56ef0791022fa"></a><!-- doxytag: member="PPB_Graphics2D::Flush" ref="a46607be26d07e4af31b56ef0791022fa" args=")(PP_Resource graphics_2d, struct PP_CompletionCallback callback)" -->
+<a class="anchor" id="a65dfb539bd057e33977a78537564885e"></a><!-- doxytag: member="PPB_Graphics2D::Flush" ref="a65dfb539bd057e33977a78537564885e" args=")(PP_Resource graphics_2d, struct PP_CompletionCallback callback)" -->
 <div class="memitem">
 <div class="memproto">
 <table class="memname">
 <tr>
-<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a46607be26d07e4af31b56ef0791022fa">PPB_Graphics2D::Flush</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics_2d, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td>
+<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a65dfb539bd057e33977a78537564885e">PPB_Graphics2D::Flush</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics_2d, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td>
 </tr>
 </table>
 </div>
 <div class="memdoc">
-<p><a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a46607be26d07e4af31b56ef0791022fa" title="Flush() flushes any enqueued paint, scroll, and replace commands to the backing store.">Flush()</a> flushes any enqueued paint, scroll, and replace commands to the backing store. </p>
+<p><a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a65dfb539bd057e33977a78537564885e" title="Flush() flushes any enqueued paint, scroll, and replace commands to the backing store.">Flush()</a> flushes any enqueued paint, scroll, and replace commands to the backing store. </p>
 <p>This function actually executes the updates, and causes a repaint of the webpage, assuming this graphics context is bound to a module instance.</p>
-<p><a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a46607be26d07e4af31b56ef0791022fa" title="Flush() flushes any enqueued paint, scroll, and replace commands to the backing store.">Flush()</a> runs in asynchronous mode. Specify a callback function and the argument for that callback function. The callback function will be executed on the calling thread when the image has been painted to the screen. While you are waiting for a flush callback, additional calls to <a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a46607be26d07e4af31b56ef0791022fa" title="Flush() flushes any enqueued paint, scroll, and replace commands to the backing store.">Flush()</a> will fail.</p>
+<p><a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a65dfb539bd057e33977a78537564885e" title="Flush() flushes any enqueued paint, scroll, and replace commands to the backing store.">Flush()</a> runs in asynchronous mode. Specify a callback function and the argument for that callback function. The callback function will be executed on the calling thread when the image has been painted to the screen. While you are waiting for a flush callback, additional calls to <a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a65dfb539bd057e33977a78537564885e" title="Flush() flushes any enqueued paint, scroll, and replace commands to the backing store.">Flush()</a> will fail.</p>
 <p>Because the callback is executed (or thread unblocked) only when the instance's image is actually on the screen, this function provides a way to rate limit animations. By waiting until the image is on the screen before painting the next frame, you can ensure you're not flushing 2D graphics faster than the screen can be updated.</p>
-<p><b>Unbound contexts</b> If the context is not bound to a module instance, you will still get a callback. The callback will execute after <a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a46607be26d07e4af31b56ef0791022fa" title="Flush() flushes any enqueued paint, scroll, and replace commands to the backing store.">Flush()</a> returns to avoid reentrancy. The callback will not wait until anything is painted to the screen because there will be nothing on the screen. The timing of this callback is not guaranteed and may be deprioritized by the browser because it is not affecting the user experience.</p>
+<p><b>Unbound contexts</b> If the context is not bound to a module instance, you will still get a callback. The callback will execute after <a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a65dfb539bd057e33977a78537564885e" title="Flush() flushes any enqueued paint, scroll, and replace commands to the backing store.">Flush()</a> returns to avoid reentrancy. The callback will not wait until anything is painted to the screen because there will be nothing on the screen. The timing of this callback is not guaranteed and may be deprioritized by the browser because it is not affecting the user experience.</p>
 <p><b>Off-screen instances</b> If the context is bound to an instance that is currently not visible (for example, scrolled out of view) it will behave like the "unbound context" case.</p>
 <p><b>Detaching a context</b> If you detach a context from a module instance, any pending flush callbacks will be converted into the "unbound context" case.</p>
 <p><b>Released contexts</b> A callback may or may not get called even if you have released all of your references to the context. This scenario can occur if there are internal references to the context suggesting it has not been internally destroyed (for example, if it is still bound to an instance) or due to other implementation details. As a result, you should be careful to check that flush callbacks are for the context you expect and that you're capable of handling callbacks for unreferenced contexts.</p>
@@ -100,29 +101,29 @@
 <dl class="return"><dt><b>Returns:</b></dt><dd>Returns <code>PP_OK</code> on success or <code>PP_ERROR_BADRESOURCE</code> if the graphics context is invalid, <code>PP_ERROR_BADARGUMENT</code> if the callback is null and flush is being called from the main thread of the module, or <code>PP_ERROR_INPROGRESS</code> if a flush is already pending that has not issued its callback yet. In the failure case, nothing will be updated and no callback will be scheduled. </dd></dl>
 </div>
 </div>
-<a class="anchor" id="a9e284dc50e55e87c5367e9f081f44045"></a><!-- doxytag: member="PPB_Graphics2D::GetScale" ref="a9e284dc50e55e87c5367e9f081f44045" args=")(PP_Resource resource)" -->
+<a class="anchor" id="aa2820c6356e60627a175942ddd265753"></a><!-- doxytag: member="PPB_Graphics2D::GetScale" ref="aa2820c6356e60627a175942ddd265753" args=")(PP_Resource resource)" -->
 <div class="memitem">
 <div class="memproto">
 <table class="memname">
 <tr>
-<td class="memname">float(* <a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a9e284dc50e55e87c5367e9f081f44045">PPB_Graphics2D::GetScale</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource)</td>
+<td class="memname">float(* <a class="el" href="struct_p_p_b___graphics2_d__1__2.html#aa2820c6356e60627a175942ddd265753">PPB_Graphics2D::GetScale</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource)</td>
 </tr>
 </table>
 </div>
 <div class="memdoc">
 </div>
 </div>
-<a class="anchor" id="a8d634407f71b52367901e8c807f3bb15"></a><!-- doxytag: member="PPB_Graphics2D::IsGraphics2D" ref="a8d634407f71b52367901e8c807f3bb15" args=")(PP_Resource resource)" -->
+<a class="anchor" id="acae7c38863e9997fc0eee88a54d3d60d"></a><!-- doxytag: member="PPB_Graphics2D::IsGraphics2D" ref="acae7c38863e9997fc0eee88a54d3d60d" args=")(PP_Resource resource)" -->
 <div class="memitem">
 <div class="memproto">
 <table class="memname">
 <tr>
-<td class="memname"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(* <a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a8d634407f71b52367901e8c807f3bb15">PPB_Graphics2D::IsGraphics2D</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource)</td>
+<td class="memname"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(* <a class="el" href="struct_p_p_b___graphics2_d__1__2.html#acae7c38863e9997fc0eee88a54d3d60d">PPB_Graphics2D::IsGraphics2D</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource)</td>
 </tr>
 </table>
 </div>
 <div class="memdoc">
-<p><a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a8d634407f71b52367901e8c807f3bb15" title="IsGraphics2D() determines if the given resource is a valid Graphics2D.">IsGraphics2D()</a> determines if the given resource is a valid <code>Graphics2D</code>. </p>
+<p><a class="el" href="struct_p_p_b___graphics2_d__1__2.html#acae7c38863e9997fc0eee88a54d3d60d" title="IsGraphics2D() determines if the given resource is a valid Graphics2D.">IsGraphics2D()</a> determines if the given resource is a valid <code>Graphics2D</code>. </p>
 <dl class="params"><dt><b>Parameters:</b></dt><dd>
 <table class="params">
 <tr><td class="paramdir">[in]</td><td class="paramname">resource</td><td>A <code>Graphics2D</code> context resource.</td></tr>
@@ -132,18 +133,18 @@
 <dl class="return"><dt><b>Returns:</b></dt><dd>PP_TRUE if the given resource is a valid <code>Graphics2D</code>, <code>PP_FALSE</code> if it is an invalid resource or is a resource of another type. </dd></dl>
 </div>
 </div>
-<a class="anchor" id="a912e5704c150c4228ee4ec326e7cb1bb"></a><!-- doxytag: member="PPB_Graphics2D::PaintImageData" ref="a912e5704c150c4228ee4ec326e7cb1bb" args=")(PP_Resource graphics_2d, PP_Resource image_data, const struct PP_Point *top_left, const struct PP_Rect *src_rect)" -->
+<a class="anchor" id="a20071a446e8d7695c697f81a449597fe"></a><!-- doxytag: member="PPB_Graphics2D::PaintImageData" ref="a20071a446e8d7695c697f81a449597fe" args=")(PP_Resource graphics_2d, PP_Resource image_data, const struct PP_Point *top_left, const struct PP_Rect *src_rect)" -->
 <div class="memitem">
 <div class="memproto">
 <table class="memname">
 <tr>
-<td class="memname">void(* <a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a912e5704c150c4228ee4ec326e7cb1bb">PPB_Graphics2D::PaintImageData</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics_2d, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> image_data, const struct <a class="el" href="struct_p_p___point.html">PP_Point</a> *top_left, const struct <a class="el" href="struct_p_p___rect.html">PP_Rect</a> *src_rect)</td>
+<td class="memname">void(* <a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a20071a446e8d7695c697f81a449597fe">PPB_Graphics2D::PaintImageData</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics_2d, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> image_data, const struct <a class="el" href="struct_p_p___point.html">PP_Point</a> *top_left, const struct <a class="el" href="struct_p_p___rect.html">PP_Rect</a> *src_rect)</td>
 </tr>
 </table>
 </div>
 <div class="memdoc">
-<p><a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a912e5704c150c4228ee4ec326e7cb1bb" title="PaintImageData() enqueues a paint of the given image into the context.">PaintImageData()</a> enqueues a paint of the given image into the context. </p>
-<p>This function has no effect until you call <a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a46607be26d07e4af31b56ef0791022fa" title="Flush() flushes any enqueued paint, scroll, and replace commands to the backing store.">Flush()</a> As a result, what counts is the contents of the bitmap when you call <a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a46607be26d07e4af31b56ef0791022fa" title="Flush() flushes any enqueued paint, scroll, and replace commands to the backing store.">Flush()</a>, not when you call this function.</p>
+<p><a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a20071a446e8d7695c697f81a449597fe" title="PaintImageData() enqueues a paint of the given image into the context.">PaintImageData()</a> enqueues a paint of the given image into the context. </p>
+<p>This function has no effect until you call <a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a65dfb539bd057e33977a78537564885e" title="Flush() flushes any enqueued paint, scroll, and replace commands to the backing store.">Flush()</a> As a result, what counts is the contents of the bitmap when you call <a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a65dfb539bd057e33977a78537564885e" title="Flush() flushes any enqueued paint, scroll, and replace commands to the backing store.">Flush()</a>, not when you call this function.</p>
 <p>The provided image will be placed at <code>top_left</code> from the top left of the context's internal backing store. Then the pixels contained in <code>src_rect</code> will be copied into the backing store. This means that the rectangle being painted will be at <code>src_rect</code> offset by <code>top_left</code>.</p>
 <p>The <code>src_rect</code> is specified in the coordinate system of the image being painted, not the context. For the common case of copying the entire image, you may specify an empty <code>src_rect</code>.</p>
 <p>The painted area of the source bitmap must fall entirely within the context. Attempting to paint outside of the context will result in an error. However, the source bitmap may fall outside the context, as long as the <code>src_rect</code> subset of it falls entirely within the context.</p>
@@ -159,21 +160,21 @@
 </dl>
 </div>
 </div>
-<a class="anchor" id="ae5cfb7616fe383d9fedee88131f4b9ff"></a><!-- doxytag: member="PPB_Graphics2D::ReplaceContents" ref="ae5cfb7616fe383d9fedee88131f4b9ff" args=")(PP_Resource graphics_2d, PP_Resource image_data)" -->
+<a class="anchor" id="a533a03163e1617692885aca78e72905a"></a><!-- doxytag: member="PPB_Graphics2D::ReplaceContents" ref="a533a03163e1617692885aca78e72905a" args=")(PP_Resource graphics_2d, PP_Resource image_data)" -->
 <div class="memitem">
 <div class="memproto">
 <table class="memname">
 <tr>
-<td class="memname">void(* <a class="el" href="struct_p_p_b___graphics2_d__1__1.html#ae5cfb7616fe383d9fedee88131f4b9ff">PPB_Graphics2D::ReplaceContents</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics_2d, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> image_data)</td>
+<td class="memname">void(* <a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a533a03163e1617692885aca78e72905a">PPB_Graphics2D::ReplaceContents</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics_2d, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> image_data)</td>
 </tr>
 </table>
 </div>
 <div class="memdoc">
-<p><a class="el" href="struct_p_p_b___graphics2_d__1__1.html#ae5cfb7616fe383d9fedee88131f4b9ff" title="ReplaceContents() provides a slightly more efficient way to paint the entire module's image...">ReplaceContents()</a> provides a slightly more efficient way to paint the entire module's image. </p>
-<p>Normally, calling <a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a912e5704c150c4228ee4ec326e7cb1bb" title="PaintImageData() enqueues a paint of the given image into the context.">PaintImageData()</a> requires that the browser copy the pixels out of the image and into the graphics context's backing store. This function replaces the graphics context's backing store with the given image, avoiding the copy.</p>
+<p><a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a533a03163e1617692885aca78e72905a" title="ReplaceContents() provides a slightly more efficient way to paint the entire module's image...">ReplaceContents()</a> provides a slightly more efficient way to paint the entire module's image. </p>
+<p>Normally, calling <a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a20071a446e8d7695c697f81a449597fe" title="PaintImageData() enqueues a paint of the given image into the context.">PaintImageData()</a> requires that the browser copy the pixels out of the image and into the graphics context's backing store. This function replaces the graphics context's backing store with the given image, avoiding the copy.</p>
 <p>The new image must be the exact same size as this graphics context. If the new image uses a different image format than the browser's native bitmap format (use <code><a class="el" href="struct_p_p_b___image_data__1__0.html#adba78e8f9e623809b6b23419dbce4d65" title="GetNativeImageDataFormat() returns the browser's preferred format for image data.">PPB_ImageData.GetNativeImageDataFormat()</a></code> to retrieve the format), then a conversion will be done inside the browser which may slow the performance a little bit.</p>
-<p><b>Note:</b> The new image will not be painted until you call <a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a46607be26d07e4af31b56ef0791022fa" title="Flush() flushes any enqueued paint, scroll, and replace commands to the backing store.">Flush()</a>.</p>
-<p>After this call, you should take care to release your references to the image. If you paint to the image after <a class="el" href="struct_p_p_b___graphics2_d__1__1.html#ae5cfb7616fe383d9fedee88131f4b9ff" title="ReplaceContents() provides a slightly more efficient way to paint the entire module's image...">ReplaceContents()</a>, there is the possibility of significant painting artifacts because the page might use partially-rendered data when copying out of the backing store.</p>
+<p><b>Note:</b> The new image will not be painted until you call <a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a65dfb539bd057e33977a78537564885e" title="Flush() flushes any enqueued paint, scroll, and replace commands to the backing store.">Flush()</a>.</p>
+<p>After this call, you should take care to release your references to the image. If you paint to the image after <a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a533a03163e1617692885aca78e72905a" title="ReplaceContents() provides a slightly more efficient way to paint the entire module's image...">ReplaceContents()</a>, there is the possibility of significant painting artifacts because the page might use partially-rendered data when copying out of the backing store.</p>
 <p>In the case of an animation, you will want to allocate a new image for the next frame. It is best if you wait until the flush callback has executed before allocating this bitmap. This gives the browser the option of caching the previous backing store and handing it back to you (assuming the sizes match). In the optimal case, this means no bitmaps are allocated during the animation, and the backing store and "front buffer" (which the plugin is painting into) are just being swapped back and forth.</p>
 <dl class="params"><dt><b>Parameters:</b></dt><dd>
 <table class="params">
@@ -184,19 +185,19 @@
 </dl>
 </div>
 </div>
-<a class="anchor" id="a2242719819a82b11b0e3f71c4a19f461"></a><!-- doxytag: member="PPB_Graphics2D::Scroll" ref="a2242719819a82b11b0e3f71c4a19f461" args=")(PP_Resource graphics_2d, const struct PP_Rect *clip_rect, const struct PP_Point *amount)" -->
+<a class="anchor" id="a3f87a2d280d6d4e6b9a2679787f5de1d"></a><!-- doxytag: member="PPB_Graphics2D::Scroll" ref="a3f87a2d280d6d4e6b9a2679787f5de1d" args=")(PP_Resource graphics_2d, const struct PP_Rect *clip_rect, const struct PP_Point *amount)" -->
 <div class="memitem">
 <div class="memproto">
 <table class="memname">
 <tr>
-<td class="memname">void(* <a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a2242719819a82b11b0e3f71c4a19f461">PPB_Graphics2D::Scroll</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics_2d, const struct <a class="el" href="struct_p_p___rect.html">PP_Rect</a> *clip_rect, const struct <a class="el" href="struct_p_p___point.html">PP_Point</a> *amount)</td>
+<td class="memname">void(* <a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a3f87a2d280d6d4e6b9a2679787f5de1d">PPB_Graphics2D::Scroll</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics_2d, const struct <a class="el" href="struct_p_p___rect.html">PP_Rect</a> *clip_rect, const struct <a class="el" href="struct_p_p___point.html">PP_Point</a> *amount)</td>
 </tr>
 </table>
 </div>
 <div class="memdoc">
-<p><a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a2242719819a82b11b0e3f71c4a19f461" title="Scroll() enqueues a scroll of the context's backing store.">Scroll()</a> enqueues a scroll of the context's backing store. </p>
-<p>This function has no effect until you call <a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a46607be26d07e4af31b56ef0791022fa" title="Flush() flushes any enqueued paint, scroll, and replace commands to the backing store.">Flush()</a>. The data within the provided clipping rectangle will be shifted by (dx, dy) pixels.</p>
-<p>This function will result in some exposed region which will have undefined contents. The module should call <a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a912e5704c150c4228ee4ec326e7cb1bb" title="PaintImageData() enqueues a paint of the given image into the context.">PaintImageData()</a> on these exposed regions to give the correct contents.</p>
+<p><a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a3f87a2d280d6d4e6b9a2679787f5de1d" title="Scroll() enqueues a scroll of the context's backing store.">Scroll()</a> enqueues a scroll of the context's backing store. </p>
+<p>This function has no effect until you call <a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a65dfb539bd057e33977a78537564885e" title="Flush() flushes any enqueued paint, scroll, and replace commands to the backing store.">Flush()</a>. The data within the provided clipping rectangle will be shifted by (dx, dy) pixels.</p>
+<p>This function will result in some exposed region which will have undefined contents. The module should call <a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a20071a446e8d7695c697f81a449597fe" title="PaintImageData() enqueues a paint of the given image into the context.">PaintImageData()</a> on these exposed regions to give the correct contents.</p>
 <p>The scroll can be larger than the area of the clipping rectangle, which means the current image will be scrolled out of the rectangle. This scenario is not an error but will result in a no-op.</p>
 <dl class="params"><dt><b>Parameters:</b></dt><dd>
 <table class="params">
@@ -208,17 +209,41 @@
 </dl>
 </div>
 </div>
-<a class="anchor" id="ad809f5d73448def11577d54147fa268e"></a><!-- doxytag: member="PPB_Graphics2D::SetScale" ref="ad809f5d73448def11577d54147fa268e" args=")(PP_Resource resource, float scale)" -->
+<a class="anchor" id="af7d4955738f54da9eda60e5c052bf361"></a><!-- doxytag: member="PPB_Graphics2D::SetLayerTransform" ref="af7d4955738f54da9eda60e5c052bf361" args=")(PP_Resource resource, float scale, const struct PP_Point *origin, const struct PP_Point *translate)" -->
 <div class="memitem">
 <div class="memproto">
 <table class="memname">
 <tr>
-<td class="memname"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(* <a class="el" href="struct_p_p_b___graphics2_d__1__1.html#ad809f5d73448def11577d54147fa268e">PPB_Graphics2D::SetScale</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource, float scale)</td>
+<td class="memname"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(* <a class="el" href="struct_p_p_b___graphics2_d__1__2.html#af7d4955738f54da9eda60e5c052bf361">PPB_Graphics2D::SetLayerTransform</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource, float scale, const struct <a class="el" href="struct_p_p___point.html">PP_Point</a> *origin, const struct <a class="el" href="struct_p_p___point.html">PP_Point</a> *translate)</td>
 </tr>
 </table>
 </div>
 <div class="memdoc">
-<p><a class="el" href="struct_p_p_b___graphics2_d__1__1.html#ad809f5d73448def11577d54147fa268e" title="SetScale() sets the scale factor that will be applied when painting the graphics context onto the out...">SetScale()</a> sets the scale factor that will be applied when painting the graphics context onto the output device. </p>
+<p><a class="el" href="struct_p_p_b___graphics2_d__1__2.html#af7d4955738f54da9eda60e5c052bf361" title="SetLayerTransform() sets a transformation factor that will be applied for the current graphics contex...">SetLayerTransform()</a> sets a transformation factor that will be applied for the current graphics context displayed on the output device. </p>
+<p>If both SetScale and SetLayerTransform will be used, they are going to get combined for the final result.</p>
+<p>This function has no effect until you call <a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a65dfb539bd057e33977a78537564885e" title="Flush() flushes any enqueued paint, scroll, and replace commands to the backing store.">Flush()</a>.</p>
+<dl class="params"><dt><b>Parameters:</b></dt><dd>
+<table class="params">
+<tr><td class="paramdir">[in]</td><td class="paramname">scale</td><td>The scale to be applied. </td></tr>
+<tr><td class="paramdir">[in]</td><td class="paramname">origin</td><td>The origin of the scale. </td></tr>
+<tr><td class="paramdir">[in]</td><td class="paramname">translate</td><td>The translation to be applied.</td></tr>
+</table>
+</dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>Returns <code>PP_TRUE</code> on success or <code>PP_FALSE</code> if the resource is invalid or the scale factor is 0 or less. </dd></dl>
+</div>
+</div>
+<a class="anchor" id="a4b16d1210b49c45edfe477396934238a"></a><!-- doxytag: member="PPB_Graphics2D::SetScale" ref="a4b16d1210b49c45edfe477396934238a" args=")(PP_Resource resource, float scale)" -->
+<div class="memitem">
+<div class="memproto">
+<table class="memname">
+<tr>
+<td class="memname"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(* <a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a4b16d1210b49c45edfe477396934238a">PPB_Graphics2D::SetScale</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource, float scale)</td>
+</tr>
+</table>
+</div>
+<div class="memdoc">
+<p><a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a4b16d1210b49c45edfe477396934238a" title="SetScale() sets the scale factor that will be applied when painting the graphics context onto the out...">SetScale()</a> sets the scale factor that will be applied when painting the graphics context onto the output device. </p>
 <p>Typically, if rendering at device resolution is desired, the context would be created with the width and height scaled up by the view's GetDeviceScale and SetScale called with a scale of 1.0 / GetDeviceScale(). For example, if the view resource passed to DidChangeView has a rectangle of (w=200, h=100) and a device scale of 2.0, one would call Create with a size of (w=400, h=200) and then call SetScale with 0.5. One would then treat each pixel in the context as a single device pixel.</p>
 <dl class="params"><dt><b>Parameters:</b></dt><dd>
 <table class="params">
diff --git a/native_client_sdk/doc_generated/pepper_beta/c/struct_p_p_b___message_loop__1__0.html b/native_client_sdk/doc_generated/pepper_beta/c/struct_p_p_b___message_loop__1__0.html
index 67077f6..31f6705 100644
--- a/native_client_sdk/doc_generated/pepper_beta/c/struct_p_p_b___message_loop__1__0.html
+++ b/native_client_sdk/doc_generated/pepper_beta/c/struct_p_p_b___message_loop__1__0.html
@@ -212,7 +212,7 @@
 <p>Runs the thread message loop. </p>
 <p>Running the message loop is required for you to get issued completion callbacks on the thread.</p>
 <p>The message loop identified by the argument must have been previously successfully attached to the current thread.</p>
-<p>You may not run nested run loops. Since the main thread has an implicit message loop that the system runs, you may not call Run on the main thread.</p>
+<p>You may not run nested message loops. Since the main thread has an implicit message loop that the system runs, you may not call Run on the main thread.</p>
 <dl class="return"><dt><b>Returns:</b></dt><dd><ul>
 <li>PP_OK: The message loop was successfully run. Note that on success, the message loop will only exit when you call <a class="el" href="struct_p_p_b___message_loop__1__0.html#adbbdc03661c9ac41df82fffcc566603d" title="Posts a quit message to the given message loop's work queue.">PostQuit()</a>.</li>
 <li>PP_ERROR_BADRESOURCE: The given message loop resource is invalid.</li>
diff --git a/native_client_sdk/doc_generated/pepper_beta/c/struct_p_p_b___vpn_provider__0__1.html b/native_client_sdk/doc_generated/pepper_beta/c/struct_p_p_b___vpn_provider__0__1.html
new file mode 100644
index 0000000..ce4e7f5
--- /dev/null
+++ b/native_client_sdk/doc_generated/pepper_beta/c/struct_p_p_b___vpn_provider__0__1.html
@@ -0,0 +1,152 @@
+{{+bindTo:partials.standard_nacl_api}}
+<h1>PPB_VpnProvider Struct Reference</h1>
+<div id="doxygen-ref">
+{{- dummy div to appease doxygen -}}
+  <div>
+<!-- Generated by Doxygen 1.7.6.1 -->
+
+
+</div>
+<!--header-->
+<div class="contents">
+<!-- doxytag: class="PPB_VpnProvider" --><h2>
+Data Fields</h2><table class="memberdecls">
+
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___vpn_provider__0__1.html#a2ec07eb1aaf01c4e7050c198e96a8f76">Create</a> )(<a class="el" href="group___typedefs.html#ga89b662403e6a687bb914b80114c0d19d">PP_Instance</a> instance)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___vpn_provider__0__1.html#a55919d9d06bd5ecd2c8365b872e1db9f">IsVpnProvider</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">int32_t(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___vpn_provider__0__1.html#a7b925b10a83d769e6d80d22fcace7833">Bind</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> vpn_provider, struct <a class="el" href="struct_p_p___var.html">PP_Var</a> configuration_id, struct <a class="el" href="struct_p_p___var.html">PP_Var</a> configuration_name, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">int32_t(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___vpn_provider__0__1.html#a43d8ddc1da63d7ee94c26721599c34db">SendPacket</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> vpn_provider, struct <a class="el" href="struct_p_p___var.html">PP_Var</a> packet, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">int32_t(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___vpn_provider__0__1.html#a767149d43eb103ad379dddcb04d1ca22">ReceivePacket</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> vpn_provider, struct <a class="el" href="struct_p_p___var.html">PP_Var</a> *packet, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr>
+</table>
+<hr /><a name="details" id="details"></a><h2>Detailed Description</h2>
+<div class="textblock"><p>Use the <code>PPB_VpnProvider</code> interface to implement a VPN client. </p>
+<p>Important: This API is available only on Chrome OS.</p>
+<p>This interface enhances the <code>chrome.vpnProvider</code> JavaScript API by providing a high performance path for packet handling.</p>
+<p>Permissions: Apps permission <code>vpnProvider</code> is required for <code>PPB_VpnProvider.Bind()</code>.</p>
+<p>Typical usage:</p>
+<ul>
+<li>Create a <code>PPB_VpnProvider</code> instance.</li>
+<li>Register the callback for <code>PPB_VpnProvider.ReceivePacket()</code>.</li>
+<li>In the extension follow the usual workflow for configuring a VPN connection via the <code>chrome.vpnProvider</code> API until the step for notifying the connection state as "connected".</li>
+<li>Bind to the previously created connection using <code>PPB_VpnProvider.Bind()</code>.</li>
+<li>Notify the connection state as "connected" from JavaScript using <code>chrome.vpnProvider.notifyConnectionStateChanged</code>.</li>
+<li>When the steps above are completed without errors, a virtual tunnel is created to the network stack of Chrome OS. IP packets can be sent through the tunnel using <code>PPB_VpnProvider.SendPacket()</code> and any packets originating on the Chrome OS device will be received using the callback registered for <code>PPB_VpnProvider.ReceivePacket()</code>.</li>
+<li>When the user disconnects from the VPN configuration or there is an error the extension will be notfied via <code>chrome.vpnProvider.onPlatformMessage</code>. </li>
+</ul>
+</div><hr /><h2>Field Documentation</h2>
+<a class="anchor" id="a7b925b10a83d769e6d80d22fcace7833"></a><!-- doxytag: member="PPB_VpnProvider::Bind" ref="a7b925b10a83d769e6d80d22fcace7833" args=")(PP_Resource vpn_provider, struct PP_Var configuration_id, struct PP_Var configuration_name, struct PP_CompletionCallback callback)" -->
+<div class="memitem">
+<div class="memproto">
+<table class="memname">
+<tr>
+<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___vpn_provider__0__1.html#a7b925b10a83d769e6d80d22fcace7833">PPB_VpnProvider::Bind</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> vpn_provider, struct <a class="el" href="struct_p_p___var.html">PP_Var</a> configuration_id, struct <a class="el" href="struct_p_p___var.html">PP_Var</a> configuration_name, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td>
+</tr>
+</table>
+</div>
+<div class="memdoc">
+<p><a class="el" href="struct_p_p_b___vpn_provider__0__1.html#a7b925b10a83d769e6d80d22fcace7833" title="Bind() binds to an existing configuration created from JavaScript by chrome.vpnProvider.createConfig.">Bind()</a> binds to an existing configuration created from JavaScript by <code>chrome.vpnProvider.createConfig</code>. </p>
+<p>All packets will be routed via <code>SendPacket</code> and <code>ReceivePacket</code>. The user should register the callback for <code>ReceivePacket</code> before calling <code><a class="el" href="struct_p_p_b___vpn_provider__0__1.html#a7b925b10a83d769e6d80d22fcace7833" title="Bind() binds to an existing configuration created from JavaScript by chrome.vpnProvider.createConfig.">Bind()</a></code>.</p>
+<dl class="params"><dt><b>Parameters:</b></dt><dd>
+<table class="params">
+<tr><td class="paramdir">[in]</td><td class="paramname">vpn_provider</td><td>A <code>PP_Resource</code> corresponding to a VpnProvider.</td></tr>
+<tr><td class="paramdir">[in]</td><td class="paramname">configuration_id</td><td>A <code>PP_VARTYPE_STRING</code> representing the configuration id from the callback of <code>chrome.vpnProvider.createConfig</code>.</td></tr>
+<tr><td class="paramdir">[in]</td><td class="paramname">configuration_name</td><td>A <code>PP_VARTYPE_STRING</code> representing the configuration name as defined by the user when calling <code>chrome.vpnProvider.createConfig</code>.</td></tr>
+<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="struct_p_p___completion_callback.html" title="PP_CompletionCallback is a common mechanism for supporting potentially asynchronous calls in browser ...">PP_CompletionCallback</a></code> called on completion.</td></tr>
+</table>
+</dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. Returns <code>PP_ERROR_INPROGRESS</code> if a previous call to <code><a class="el" href="struct_p_p_b___vpn_provider__0__1.html#a7b925b10a83d769e6d80d22fcace7833" title="Bind() binds to an existing configuration created from JavaScript by chrome.vpnProvider.createConfig.">Bind()</a></code> has not completed. Returns <code>PP_ERROR_BADARGUMENT</code> if either <code>configuration_id</code> or <code>configuration_name</code> are not of type <code>PP_VARTYPE_STRING</code>. Returns <code>PP_ERROR_NOACCESS</code> if the caller does the have the required "vpnProvider" permission. Returns <code>PP_ERROR_FAILED</code> if <code>connection_id</code> and <code>connection_name</code> could not be matched with the existing connection, or if the plugin originates from a different extension than the one that created the connection. </dd></dl>
+</div>
+</div>
+<a class="anchor" id="a2ec07eb1aaf01c4e7050c198e96a8f76"></a><!-- doxytag: member="PPB_VpnProvider::Create" ref="a2ec07eb1aaf01c4e7050c198e96a8f76" args=")(PP_Instance instance)" -->
+<div class="memitem">
+<div class="memproto">
+<table class="memname">
+<tr>
+<td class="memname"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(* <a class="el" href="struct_p_p_b___vpn_provider__0__1.html#a2ec07eb1aaf01c4e7050c198e96a8f76">PPB_VpnProvider::Create</a>)(<a class="el" href="group___typedefs.html#ga89b662403e6a687bb914b80114c0d19d">PP_Instance</a> instance)</td>
+</tr>
+</table>
+</div>
+<div class="memdoc">
+<p><a class="el" href="struct_p_p_b___vpn_provider__0__1.html#a2ec07eb1aaf01c4e7050c198e96a8f76" title="Create() creates a VpnProvider instance.">Create()</a> creates a VpnProvider instance. </p>
+<dl class="params"><dt><b>Parameters:</b></dt><dd>
+<table class="params">
+<tr><td class="paramdir">[in]</td><td class="paramname">instance</td><td>A <code>PP_Instance</code> identifying the instance with the VpnProvider.</td></tr>
+</table>
+</dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>A <code>PP_Resource</code> corresponding to a VpnProvider if successful. </dd></dl>
+</div>
+</div>
+<a class="anchor" id="a55919d9d06bd5ecd2c8365b872e1db9f"></a><!-- doxytag: member="PPB_VpnProvider::IsVpnProvider" ref="a55919d9d06bd5ecd2c8365b872e1db9f" args=")(PP_Resource resource)" -->
+<div class="memitem">
+<div class="memproto">
+<table class="memname">
+<tr>
+<td class="memname"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(* <a class="el" href="struct_p_p_b___vpn_provider__0__1.html#a55919d9d06bd5ecd2c8365b872e1db9f">PPB_VpnProvider::IsVpnProvider</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource)</td>
+</tr>
+</table>
+</div>
+<div class="memdoc">
+<p><a class="el" href="struct_p_p_b___vpn_provider__0__1.html#a55919d9d06bd5ecd2c8365b872e1db9f" title="IsVpnProvider() determines if the provided resource is a VpnProvider instance.">IsVpnProvider()</a> determines if the provided <code>resource</code> is a VpnProvider instance. </p>
+<dl class="params"><dt><b>Parameters:</b></dt><dd>
+<table class="params">
+<tr><td class="paramdir">[in]</td><td class="paramname">resource</td><td>A <code>PP_Resource</code> corresponding to a VpnProvider.</td></tr>
+</table>
+</dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>Returns <code>PP_TRUE</code> if <code>resource</code> is a <code>PPB_VpnProvider</code>, <code>PP_FALSE</code> if the <code>resource</code> is invalid or some type other than <code>PPB_VpnProvider</code>. </dd></dl>
+</div>
+</div>
+<a class="anchor" id="a767149d43eb103ad379dddcb04d1ca22"></a><!-- doxytag: member="PPB_VpnProvider::ReceivePacket" ref="a767149d43eb103ad379dddcb04d1ca22" args=")(PP_Resource vpn_provider, struct PP_Var *packet, struct PP_CompletionCallback callback)" -->
+<div class="memitem">
+<div class="memproto">
+<table class="memname">
+<tr>
+<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___vpn_provider__0__1.html#a767149d43eb103ad379dddcb04d1ca22">PPB_VpnProvider::ReceivePacket</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> vpn_provider, struct <a class="el" href="struct_p_p___var.html">PP_Var</a> *packet, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td>
+</tr>
+</table>
+</div>
+<div class="memdoc">
+<p><a class="el" href="struct_p_p_b___vpn_provider__0__1.html#a767149d43eb103ad379dddcb04d1ca22" title="ReceivePacket() receives an IP packet from the tunnel for the VPN session.">ReceivePacket()</a> receives an IP packet from the tunnel for the VPN session. </p>
+<p>This function only returns a single packet. This function must be called at least N times to receive N packets, no matter the size of each packet. The callback should be registered before calling <code><a class="el" href="struct_p_p_b___vpn_provider__0__1.html#a7b925b10a83d769e6d80d22fcace7833" title="Bind() binds to an existing configuration created from JavaScript by chrome.vpnProvider.createConfig.">Bind()</a></code>.</p>
+<dl class="params"><dt><b>Parameters:</b></dt><dd>
+<table class="params">
+<tr><td class="paramdir">[in]</td><td class="paramname">vpn_provider</td><td>A <code>PP_Resource</code> corresponding to a VpnProvider.</td></tr>
+<tr><td class="paramdir">[out]</td><td class="paramname">packet</td><td>The received packet is copied to provided <code>packet</code>. The <code>packet</code> must remain valid until <a class="el" href="struct_p_p_b___vpn_provider__0__1.html#a767149d43eb103ad379dddcb04d1ca22" title="ReceivePacket() receives an IP packet from the tunnel for the VPN session.">ReceivePacket()</a> completes. Its received <code>PP_VarType</code> will be <code>PP_VARTYPE_ARRAY_BUFFER</code>.</td></tr>
+<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="struct_p_p___completion_callback.html" title="PP_CompletionCallback is a common mechanism for supporting potentially asynchronous calls in browser ...">PP_CompletionCallback</a></code> called on completion.</td></tr>
+</table>
+</dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. Returns <code>PP_ERROR_INPROGRESS</code> if a previous call to <code><a class="el" href="struct_p_p_b___vpn_provider__0__1.html#a767149d43eb103ad379dddcb04d1ca22" title="ReceivePacket() receives an IP packet from the tunnel for the VPN session.">ReceivePacket()</a></code> has not completed. </dd></dl>
+</div>
+</div>
+<a class="anchor" id="a43d8ddc1da63d7ee94c26721599c34db"></a><!-- doxytag: member="PPB_VpnProvider::SendPacket" ref="a43d8ddc1da63d7ee94c26721599c34db" args=")(PP_Resource vpn_provider, struct PP_Var packet, struct PP_CompletionCallback callback)" -->
+<div class="memitem">
+<div class="memproto">
+<table class="memname">
+<tr>
+<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___vpn_provider__0__1.html#a43d8ddc1da63d7ee94c26721599c34db">PPB_VpnProvider::SendPacket</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> vpn_provider, struct <a class="el" href="struct_p_p___var.html">PP_Var</a> packet, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td>
+</tr>
+</table>
+</div>
+<div class="memdoc">
+<p><a class="el" href="struct_p_p_b___vpn_provider__0__1.html#a43d8ddc1da63d7ee94c26721599c34db" title="SendPacket() sends an IP packet through the tunnel created for the VPN session.">SendPacket()</a> sends an IP packet through the tunnel created for the VPN session. </p>
+<p>This will succeed only when the VPN session is owned by the module and the connection is bound.</p>
+<dl class="params"><dt><b>Parameters:</b></dt><dd>
+<table class="params">
+<tr><td class="paramdir">[in]</td><td class="paramname">vpn_provider</td><td>A <code>PP_Resource</code> corresponding to a VpnProvider.</td></tr>
+<tr><td class="paramdir">[in]</td><td class="paramname">packet</td><td>A <code>PP_VARTYPE_ARRAY_BUFFER</code> corresponding to an IP packet to be sent to the platform.</td></tr>
+<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="struct_p_p___completion_callback.html" title="PP_CompletionCallback is a common mechanism for supporting potentially asynchronous calls in browser ...">PP_CompletionCallback</a></code> called on completion.</td></tr>
+</table>
+</dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. Returns <code>PP_ERROR_FAILED</code> if the connection is not bound. Returns <code>PP_ERROR_INPROGRESS</code> if a previous call to <code><a class="el" href="struct_p_p_b___vpn_provider__0__1.html#a43d8ddc1da63d7ee94c26721599c34db" title="SendPacket() sends an IP packet through the tunnel created for the VPN session.">SendPacket()</a></code> has not completed. Returns <code>PP_ERROR_BADARGUMENT</code> if <code>packet</code> is not of type <code>PP_VARTYPE_ARRAY_BUFFER</code>. </dd></dl>
+</div>
+</div>
+<hr />The documentation for this struct was generated from the following file:<ul>
+<li><a class="el" href="ppb__vpn__provider_8h.html">ppb_vpn_provider.h</a></li>
+</ul>
+</div><!-- contents -->
+</div>
+{{/partials.standard_nacl_api}}
diff --git a/native_client_sdk/doc_generated/pepper_beta/cpp/classpp_1_1_graphics2_d-members.html b/native_client_sdk/doc_generated/pepper_beta/cpp/classpp_1_1_graphics2_d-members.html
index 3478097e..cc23614 100644
--- a/native_client_sdk/doc_generated/pepper_beta/cpp/classpp_1_1_graphics2_d-members.html
+++ b/native_client_sdk/doc_generated/pepper_beta/cpp/classpp_1_1_graphics2_d-members.html
@@ -31,6 +31,7 @@
 <tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a555de93fdf4793f7db1183bf71d20580">Resource</a>(PP_Resource resource)</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [explicit, protected]</code></td></tr>
 <tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a907d3d6b7e292587c8cb9ff30d0a418d">Resource</a>(PassRef, PP_Resource resource)</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [protected]</code></td></tr>
 <tr class="memlist"><td><a class="el" href="classpp_1_1_graphics2_d.html#a6a4256bb84cab71909821699d7aea369">Scroll</a>(const Rect &amp;clip, const Point &amp;amount)</td><td><a class="el" href="classpp_1_1_graphics2_d.html">pp::Graphics2D</a></td><td></td></tr>
+<tr class="memlist"><td><a class="el" href="classpp_1_1_graphics2_d.html#a3babd6bb9c922a650b3c7c57d1e36d8c">SetLayerTransform</a>(float scale, const Point &amp;origin, const Point &amp;translate)</td><td><a class="el" href="classpp_1_1_graphics2_d.html">pp::Graphics2D</a></td><td></td></tr>
 <tr class="memlist"><td><a class="el" href="classpp_1_1_graphics2_d.html#a96a91958227a7e42a829033241fac6b1">SetScale</a>(float scale)</td><td><a class="el" href="classpp_1_1_graphics2_d.html">pp::Graphics2D</a></td><td></td></tr>
 <tr class="memlist"><td><a class="el" href="classpp_1_1_graphics2_d.html#ad623f80db2c0cc679619303a0c0b9eff">size</a>() const </td><td><a class="el" href="classpp_1_1_graphics2_d.html">pp::Graphics2D</a></td><td><code> [inline]</code></td></tr>
 <tr class="memlist"><td><a class="el" href="classpp_1_1_graphics2_d.html#aa40a889094d345add38f16d559ae0ebd">~Graphics2D</a>()</td><td><a class="el" href="classpp_1_1_graphics2_d.html">pp::Graphics2D</a></td><td><code> [virtual]</code></td></tr>
diff --git a/native_client_sdk/doc_generated/pepper_beta/cpp/classpp_1_1_graphics2_d.html b/native_client_sdk/doc_generated/pepper_beta/cpp/classpp_1_1_graphics2_d.html
index add8e599..c8b6d8a 100644
--- a/native_client_sdk/doc_generated/pepper_beta/cpp/classpp_1_1_graphics2_d.html
+++ b/native_client_sdk/doc_generated/pepper_beta/cpp/classpp_1_1_graphics2_d.html
@@ -34,6 +34,7 @@
 <tr><td class="memItemLeft" align="right" valign="top">int32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_graphics2_d.html#a3c1e23ad48ad62860a125d471b7664a4">Flush</a> (const <a class="el" href="classpp_1_1_completion_callback.html">CompletionCallback</a> &amp;cc)</td></tr>
 <tr><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_graphics2_d.html#a96a91958227a7e42a829033241fac6b1">SetScale</a> (float scale)</td></tr>
 <tr><td class="memItemLeft" align="right" valign="top">float&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_graphics2_d.html#a5b927eaabdd78b1a0094aa1a3695bae2">GetScale</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_graphics2_d.html#a3babd6bb9c922a650b3c7c57d1e36d8c">SetLayerTransform</a> (float scale, const <a class="el" href="classpp_1_1_point.html">Point</a> &amp;origin, const <a class="el" href="classpp_1_1_point.html">Point</a> &amp;translate)</td></tr>
 </table>
 <hr /><h2>Constructor &amp; Destructor Documentation</h2>
 <a class="anchor" id="aef2cf8f0798d4980309f9bc888a73463"></a><!-- doxytag: member="pp::Graphics2D::Graphics2D" ref="aef2cf8f0798d4980309f9bc888a73463" args="()" -->
@@ -359,6 +360,38 @@
 </dl>
 </div>
 </div>
+<a class="anchor" id="a3babd6bb9c922a650b3c7c57d1e36d8c"></a><!-- doxytag: member="pp::Graphics2D::SetLayerTransform" ref="a3babd6bb9c922a650b3c7c57d1e36d8c" args="(float scale, const Point &amp;origin, const Point &amp;translate)" -->
+<div class="memitem">
+<div class="memproto">
+<table class="memname">
+<tr>
+<td class="memname">bool <a class="el" href="classpp_1_1_graphics2_d.html#a3babd6bb9c922a650b3c7c57d1e36d8c">pp::Graphics2D::SetLayerTransform</a> </td>
+<td>(</td>
+<td class="paramtype">float&#160;</td>
+<td class="paramname"><em>scale</em>, </td>
+</tr>
+<tr>
+<td class="paramkey"></td>
+<td></td>
+<td class="paramtype">const <a class="el" href="classpp_1_1_point.html">Point</a> &amp;&#160;</td>
+<td class="paramname"><em>origin</em>, </td>
+</tr>
+<tr>
+<td class="paramkey"></td>
+<td></td>
+<td class="paramtype">const <a class="el" href="classpp_1_1_point.html">Point</a> &amp;&#160;</td>
+<td class="paramname"><em>translate</em>&#160;</td>
+</tr>
+<tr>
+<td></td>
+<td>)</td>
+<td></td><td></td>
+</tr>
+</table>
+</div>
+<div class="memdoc">
+</div>
+</div>
 <a class="anchor" id="a96a91958227a7e42a829033241fac6b1"></a><!-- doxytag: member="pp::Graphics2D::SetScale" ref="a96a91958227a7e42a829033241fac6b1" args="(float scale)" -->
 <div class="memitem">
 <div class="memproto">
diff --git a/native_client_sdk/doc_generated/pepper_beta/cpp/classpp_1_1_message_loop.html b/native_client_sdk/doc_generated/pepper_beta/cpp/classpp_1_1_message_loop.html
index fbf2203..4d250a8 100644
--- a/native_client_sdk/doc_generated/pepper_beta/cpp/classpp_1_1_message_loop.html
+++ b/native_client_sdk/doc_generated/pepper_beta/cpp/classpp_1_1_message_loop.html
@@ -306,7 +306,7 @@
 <p>Runs the thread message loop. </p>
 <p>Running the message loop is required for you to get issued completion callbacks on the thread.</p>
 <p>The message loop identified by the argument must have been previously successfully attached to the current thread.</p>
-<p>You may not run nested run loops. Since the main thread has an implicit message loop that the system runs, you may not call Run on the main thread.</p>
+<p>You may not run nested message loops. Since the main thread has an implicit message loop that the system runs, you may not call Run on the main thread.</p>
 <dl class="return"><dt><b>Returns:</b></dt><dd><ul>
 <li>PP_OK: The message loop was successfully run. Note that on success, the message loop will only exit when you call <a class="el" href="classpp_1_1_message_loop.html#a2311af860834b866076fb518ac27eab5" title="Posts a quit message to the given message loop's work queue.">PostQuit()</a>.</li>
 <li>PP_ERROR_BADRESOURCE: The given message loop resource is invalid.</li>
diff --git a/native_client_sdk/doc_generated/pepper_beta/cpp/classpp_1_1_resource.html b/native_client_sdk/doc_generated/pepper_beta/cpp/classpp_1_1_resource.html
index 9e77949..5811e35f 100644
--- a/native_client_sdk/doc_generated/pepper_beta/cpp/classpp_1_1_resource.html
+++ b/native_client_sdk/doc_generated/pepper_beta/cpp/classpp_1_1_resource.html
@@ -15,7 +15,7 @@
 <div class="dyncontent">
 <div class="center"><img src="classpp_1_1_resource__inherit__graph.png" border="0" usemap="#pp_1_1_resource_inherit__map" alt="Inheritance graph" /></div>
 <map name="pp_1_1_resource_inherit__map" id="pp_1_1_resource_inherit__map">
-<area shape="rect" id="node2" href="classpp_1_1_audio.html" title="An audio resource." alt="" coords="216,5,299,32"></area><area shape="rect" id="node3" href="classpp_1_1_audio_buffer.html" title="pp::AudioBuffer" alt="" coords="197,56,317,83"></area><area shape="rect" id="node4" href="classpp_1_1_audio_config.html" title="A 16 bit stereo AudioConfig resource." alt="" coords="196,107,319,133"></area><area shape="rect" id="node5" href="classpp_1_1_audio_encoder.html" title="Audio encoder interface." alt="" coords="190,157,325,184"></area><area shape="rect" id="node6" href="classpp_1_1_compositor.html" title="The Compositor interface is used for setting CompositorLayer layers to the Chromium compositor for co..." alt="" coords="197,208,317,235"></area><area shape="rect" id="node7" href="classpp_1_1_compositor_layer.html" title="pp::CompositorLayer" alt="" coords="180,259,335,285"></area><area shape="rect" id="node8" href="classpp_1_1_file_i_o.html" title="The FileIO class represents a regular file." alt="" coords="218,309,297,336"></area><area shape="rect" id="node9" href="classpp_1_1_file_ref.html" title='The FileRef class represents a "weak pointer" to a file in a file system.' alt="" coords="215,360,300,387"></area><area shape="rect" id="node10" href="classpp_1_1_file_system.html" title="The FileSystem class identifies the file system type associated with a file." alt="" coords="200,411,315,437"></area><area shape="rect" id="node11" href="classpp_1_1_graphics2_d.html" title="pp::Graphics2D" alt="" coords="197,461,317,488"></area><area shape="rect" id="node12" href="classpp_1_1_graphics3_d.html" title="This class represents a 3D rendering context in the browser." alt="" coords="197,512,317,539"></area><area shape="rect" id="node13" href="classpp_1_1_host_resolver.html" title="The HostResolver class supports host name resolution." alt="" coords="193,563,322,589"></area><area shape="rect" id="node14" href="classpp_1_1_image_data.html" title="pp::ImageData" alt="" coords="199,613,316,640"></area><area shape="rect" id="node15" href="classpp_1_1_input_event.html" title="This class represents an input event resource." alt="" coords="200,664,315,691"></area><area shape="rect" id="node21" href="classpp_1_1_media_stream_audio_track.html" title="The MediaStreamAudioTrack class contains methods for receiving audio buffers from a MediaStream audio..." alt="" coords="157,715,357,741"></area><area shape="rect" id="node22" href="classpp_1_1_media_stream_video_track.html" title="The MediaStreamVideoTrack class contains methods for receiving video frames from a MediaStream video ..." alt="" coords="157,765,357,792"></area><area shape="rect" id="node23" href="classpp_1_1_message_loop.html" title="A message loop allows PPAPI calls to be issued on a thread." alt="" coords="190,816,325,843"></area><area shape="rect" id="node24" href="classpp_1_1_net_address.html" title="The NetAddress class represents a network address." alt="" coords="197,867,318,893"></area><area shape="rect" id="node25" href="classpp_1_1_network_list.html" title="pp::NetworkList" alt="" coords="197,917,317,944"></area><area shape="rect" id="node26" href="classpp_1_1_network_monitor.html" title="pp::NetworkMonitor" alt="" coords="184,968,331,995"></area><area shape="rect" id="node27" href="classpp_1_1_t_c_p_socket.html" title="The TCPSocket class provides TCP socket operations." alt="" coords="201,1019,314,1045"></area><area shape="rect" id="node28" href="classpp_1_1_u_d_p_socket.html" title="The UDPSocket class provides UDP socket operations." alt="" coords="198,1069,317,1096"></area><area shape="rect" id="node29" href="classpp_1_1_u_r_l_loader.html" title="URLLoader provides an API for loading URLs." alt="" coords="200,1120,315,1147"></area><area shape="rect" id="node30" href="classpp_1_1_u_r_l_request_info.html" title="URLRequestInfo provides an API for creating and manipulating URL requests." alt="" coords="185,1171,330,1197"></area><area shape="rect" id="node31" href="classpp_1_1_u_r_l_response_info.html" title="URLResponseInfo provides an API for examining URL responses." alt="" coords="180,1221,335,1248"></area><area shape="rect" id="node32" href="classpp_1_1_video_decoder.html" title="Video decoder interface." alt="" coords="189,1272,325,1299"></area><area shape="rect" id="node33" href="classpp_1_1_video_encoder.html" title="Video encoder interface." alt="" coords="190,1323,325,1349"></area><area shape="rect" id="node34" href="classpp_1_1_video_frame.html" title="pp::VideoFrame" alt="" coords="196,1373,319,1400"></area><area shape="rect" id="node35" href="classpp_1_1_view.html" title="This class represents the state of the view for an instance and contains functions for retrieving the..." alt="" coords="220,1424,295,1451"></area><area shape="rect" id="node36" href="classpp_1_1_web_socket.html" title="The WebSocket class providing bi-directional, full-duplex, communications over a single TCP socket..." alt="" coords="199,1475,315,1501"></area><area shape="rect" id="node16" href="classpp_1_1_i_m_e_input_event.html" title="pp::IMEInputEvent" alt="" coords="424,563,560,589"></area><area shape="rect" id="node17" href="classpp_1_1_keyboard_input_event.html" title="pp::KeyboardInputEvent" alt="" coords="405,613,579,640"></area><area shape="rect" id="node18" href="classpp_1_1_mouse_input_event.html" title="This class handles mouse events." alt="" coords="414,664,570,691"></area><area shape="rect" id="node19" href="classpp_1_1_touch_input_event.html" title="pp::TouchInputEvent" alt="" coords="417,715,567,741"></area><area shape="rect" id="node20" href="classpp_1_1_wheel_input_event.html" title="pp::WheelInputEvent" alt="" coords="416,765,568,792"></area></map>
+<area shape="rect" id="node2" href="classpp_1_1_audio.html" title="An audio resource." alt="" coords="216,5,299,32"></area><area shape="rect" id="node3" href="classpp_1_1_audio_buffer.html" title="pp::AudioBuffer" alt="" coords="197,56,317,83"></area><area shape="rect" id="node4" href="classpp_1_1_audio_config.html" title="A 16 bit stereo AudioConfig resource." alt="" coords="196,107,319,133"></area><area shape="rect" id="node5" href="classpp_1_1_audio_encoder.html" title="Audio encoder interface." alt="" coords="190,157,325,184"></area><area shape="rect" id="node6" href="classpp_1_1_compositor.html" title="The Compositor interface is used for setting CompositorLayer layers to the Chromium compositor for co..." alt="" coords="197,208,317,235"></area><area shape="rect" id="node7" href="classpp_1_1_compositor_layer.html" title="pp::CompositorLayer" alt="" coords="180,259,335,285"></area><area shape="rect" id="node8" href="classpp_1_1_file_i_o.html" title="The FileIO class represents a regular file." alt="" coords="218,309,297,336"></area><area shape="rect" id="node9" href="classpp_1_1_file_ref.html" title='The FileRef class represents a "weak pointer" to a file in a file system.' alt="" coords="215,360,300,387"></area><area shape="rect" id="node10" href="classpp_1_1_file_system.html" title="The FileSystem class identifies the file system type associated with a file." alt="" coords="200,411,315,437"></area><area shape="rect" id="node11" href="classpp_1_1_graphics2_d.html" title="pp::Graphics2D" alt="" coords="197,461,317,488"></area><area shape="rect" id="node12" href="classpp_1_1_graphics3_d.html" title="This class represents a 3D rendering context in the browser." alt="" coords="197,512,317,539"></area><area shape="rect" id="node13" href="classpp_1_1_host_resolver.html" title="The HostResolver class supports host name resolution." alt="" coords="193,563,322,589"></area><area shape="rect" id="node14" href="classpp_1_1_image_data.html" title="pp::ImageData" alt="" coords="199,613,316,640"></area><area shape="rect" id="node15" href="classpp_1_1_input_event.html" title="This class represents an input event resource." alt="" coords="200,664,315,691"></area><area shape="rect" id="node21" href="classpp_1_1_media_stream_audio_track.html" title="The MediaStreamAudioTrack class contains methods for receiving audio buffers from a MediaStream audio..." alt="" coords="157,715,357,741"></area><area shape="rect" id="node22" href="classpp_1_1_media_stream_video_track.html" title="The MediaStreamVideoTrack class contains methods for receiving video frames from a MediaStream video ..." alt="" coords="157,765,357,792"></area><area shape="rect" id="node23" href="classpp_1_1_message_loop.html" title="A message loop allows PPAPI calls to be issued on a thread." alt="" coords="190,816,325,843"></area><area shape="rect" id="node24" href="classpp_1_1_net_address.html" title="The NetAddress class represents a network address." alt="" coords="197,867,318,893"></area><area shape="rect" id="node25" href="classpp_1_1_network_list.html" title="pp::NetworkList" alt="" coords="197,917,317,944"></area><area shape="rect" id="node26" href="classpp_1_1_network_monitor.html" title="pp::NetworkMonitor" alt="" coords="184,968,331,995"></area><area shape="rect" id="node27" href="classpp_1_1_t_c_p_socket.html" title="The TCPSocket class provides TCP socket operations." alt="" coords="201,1019,314,1045"></area><area shape="rect" id="node28" href="classpp_1_1_u_d_p_socket.html" title="The UDPSocket class provides UDP socket operations." alt="" coords="198,1069,317,1096"></area><area shape="rect" id="node29" href="classpp_1_1_u_r_l_loader.html" title="URLLoader provides an API for loading URLs." alt="" coords="200,1120,315,1147"></area><area shape="rect" id="node30" href="classpp_1_1_u_r_l_request_info.html" title="URLRequestInfo provides an API for creating and manipulating URL requests." alt="" coords="185,1171,330,1197"></area><area shape="rect" id="node31" href="classpp_1_1_u_r_l_response_info.html" title="URLResponseInfo provides an API for examining URL responses." alt="" coords="180,1221,335,1248"></area><area shape="rect" id="node32" href="classpp_1_1_video_decoder.html" title="Video decoder interface." alt="" coords="189,1272,325,1299"></area><area shape="rect" id="node33" href="classpp_1_1_video_encoder.html" title="Video encoder interface." alt="" coords="190,1323,325,1349"></area><area shape="rect" id="node34" href="classpp_1_1_video_frame.html" title="pp::VideoFrame" alt="" coords="196,1373,319,1400"></area><area shape="rect" id="node35" href="classpp_1_1_view.html" title="This class represents the state of the view for an instance and contains functions for retrieving the..." alt="" coords="220,1424,295,1451"></area><area shape="rect" id="node36" href="classpp_1_1_vpn_provider.html" title="The VpnProvider class enhances the chrome.vpnProvider JavaScript API by providing a high performance ..." alt="" coords="196,1475,319,1501"></area><area shape="rect" id="node37" href="classpp_1_1_web_socket.html" title="The WebSocket class providing bi-directional, full-duplex, communications over a single TCP socket..." alt="" coords="199,1525,315,1552"></area><area shape="rect" id="node16" href="classpp_1_1_i_m_e_input_event.html" title="pp::IMEInputEvent" alt="" coords="424,563,560,589"></area><area shape="rect" id="node17" href="classpp_1_1_keyboard_input_event.html" title="pp::KeyboardInputEvent" alt="" coords="405,613,579,640"></area><area shape="rect" id="node18" href="classpp_1_1_mouse_input_event.html" title="This class handles mouse events." alt="" coords="414,664,570,691"></area><area shape="rect" id="node19" href="classpp_1_1_touch_input_event.html" title="pp::TouchInputEvent" alt="" coords="417,715,567,741"></area><area shape="rect" id="node20" href="classpp_1_1_wheel_input_event.html" title="pp::WheelInputEvent" alt="" coords="416,765,568,792"></area></map>
 <center><span class="legend">[<a href="graph_legend.html">legend</a>]</span></center></div>
 <p><a href="classpp_1_1_resource-members.html">List of all members.</a></p>
 <h2>
diff --git a/native_client_sdk/doc_generated/pepper_beta/cpp/classpp_1_1_resource__inherit__graph.png b/native_client_sdk/doc_generated/pepper_beta/cpp/classpp_1_1_resource__inherit__graph.png
index 5fd5ac3..2df5ffd 100644
--- a/native_client_sdk/doc_generated/pepper_beta/cpp/classpp_1_1_resource__inherit__graph.png
+++ b/native_client_sdk/doc_generated/pepper_beta/cpp/classpp_1_1_resource__inherit__graph.png
Binary files differ
diff --git a/native_client_sdk/doc_generated/pepper_beta/cpp/classpp_1_1_vpn_provider-members.html b/native_client_sdk/doc_generated/pepper_beta/cpp/classpp_1_1_vpn_provider-members.html
new file mode 100644
index 0000000..d8f037be
--- /dev/null
+++ b/native_client_sdk/doc_generated/pepper_beta/cpp/classpp_1_1_vpn_provider-members.html
@@ -0,0 +1,33 @@
+{{+bindTo:partials.standard_nacl_api}}
+<h1>Member List</h1>
+<div id="doxygen-ref">
+{{- dummy div to appease doxygen -}}
+  <div>
+<!-- Generated by Doxygen 1.7.6.1 -->
+
+
+
+</div>
+<!--header-->
+<div class="contents">
+This is the complete list of members for <a class="el" href="classpp_1_1_vpn_provider.html">pp::VpnProvider</a>, including all inherited members.<table>
+<tr class="memlist"><td><a class="el" href="classpp_1_1_vpn_provider.html#a90d17a19973f48a31ea933325e0b61af">Bind</a>(const Var &amp;configuration_id, const Var &amp;configuration_name, const CompletionCallback &amp;callback)</td><td><a class="el" href="classpp_1_1_vpn_provider.html">pp::VpnProvider</a></td><td></td></tr>
+<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#ad4016f37d3022863ca0188acb26ac9c4">Clear</a>()</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [protected]</code></td></tr>
+<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a81b9246381bdddacca3ac25f6ded2bfd">detach</a>()</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td></td></tr>
+<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a859068e34cdc2dc0b78754c255323aa9">is_null</a>() const </td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [inline]</code></td></tr>
+<tr class="memlist"><td><a class="el" href="classpp_1_1_vpn_provider.html#a0a6b1fd0a843997fafe1bf5bed85b3b9">IsAvailable</a>()</td><td><a class="el" href="classpp_1_1_vpn_provider.html">pp::VpnProvider</a></td><td><code> [static]</code></td></tr>
+<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#aaf808a98bdaa7998d82e19514aa87423">operator=</a>(const Resource &amp;other)</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td></td></tr>
+<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a3eda014529127a818df8d5bb5ec2fdf0">PassRefFromConstructor</a>(PP_Resource resource)</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [protected]</code></td></tr>
+<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a46a6123de0b007ad3fcb6f666534ccb4">pp_resource</a>() const </td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [inline]</code></td></tr>
+<tr class="memlist"><td><a class="el" href="classpp_1_1_vpn_provider.html#a745f12bb3d3eb9bf7f29892a717caefb">ReceivePacket</a>(const CompletionCallbackWithOutput&lt; Var &gt; &amp;callback)</td><td><a class="el" href="classpp_1_1_vpn_provider.html">pp::VpnProvider</a></td><td></td></tr>
+<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a56679e93a58101c8dce5dc510811a094">Resource</a>()</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td></td></tr>
+<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#ab0f664099ca06367180f220ea7e0b831">Resource</a>(const Resource &amp;other)</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td></td></tr>
+<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a555de93fdf4793f7db1183bf71d20580">Resource</a>(PP_Resource resource)</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [explicit, protected]</code></td></tr>
+<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a907d3d6b7e292587c8cb9ff30d0a418d">Resource</a>(PassRef, PP_Resource resource)</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [protected]</code></td></tr>
+<tr class="memlist"><td><a class="el" href="classpp_1_1_vpn_provider.html#ae692340a675bcd27c756e98779efe615">SendPacket</a>(const Var &amp;packet, const CompletionCallback &amp;callback)</td><td><a class="el" href="classpp_1_1_vpn_provider.html">pp::VpnProvider</a></td><td></td></tr>
+<tr class="memlist"><td><a class="el" href="classpp_1_1_vpn_provider.html#a5d44d34828cce02849b2ade71de054f6">VpnProvider</a>(const InstanceHandle &amp;instance)</td><td><a class="el" href="classpp_1_1_vpn_provider.html">pp::VpnProvider</a></td><td><code> [explicit]</code></td></tr>
+<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a081165265e2bd8217eaa2be2aeeb3aa3">~Resource</a>()</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [virtual]</code></td></tr>
+<tr class="memlist"><td><a class="el" href="classpp_1_1_vpn_provider.html#a0ae82ce542bed9af72da27fb4c94ec42">~VpnProvider</a>()</td><td><a class="el" href="classpp_1_1_vpn_provider.html">pp::VpnProvider</a></td><td><code> [virtual]</code></td></tr>
+</table></div><!-- contents -->
+</div>
+{{/partials.standard_nacl_api}}
diff --git a/native_client_sdk/doc_generated/pepper_beta/cpp/classpp_1_1_vpn_provider.html b/native_client_sdk/doc_generated/pepper_beta/cpp/classpp_1_1_vpn_provider.html
new file mode 100644
index 0000000..d3ab36e
--- /dev/null
+++ b/native_client_sdk/doc_generated/pepper_beta/cpp/classpp_1_1_vpn_provider.html
@@ -0,0 +1,213 @@
+{{+bindTo:partials.standard_nacl_api}}
+<h1>pp::VpnProvider Class Reference</h1>
+<div id="doxygen-ref">
+{{- dummy div to appease doxygen -}}
+  <div>
+<!-- Generated by Doxygen 1.7.6.1 -->
+
+
+
+</div>
+<!--header-->
+<div class="contents">
+<!-- doxytag: class="pp::VpnProvider" --><!-- doxytag: inherits="pp::Resource" --><div class="dynheader">
+Inheritance diagram for pp::VpnProvider:</div>
+<div class="dyncontent">
+<div class="center"><img src="classpp_1_1_vpn_provider__inherit__graph.png" border="0" usemap="#pp_1_1_vpn_provider_inherit__map" alt="Inheritance graph" /></div>
+<map name="pp_1_1_vpn_provider_inherit__map" id="pp_1_1_vpn_provider_inherit__map">
+<area shape="rect" id="node2" href="classpp_1_1_resource.html" title="A reference counted module resource." alt="" coords="15,5,119,32"></area></map>
+<center><span class="legend">[<a href="graph_legend.html">legend</a>]</span></center></div>
+<p><a href="classpp_1_1_vpn_provider-members.html">List of all members.</a></p>
+<h2>
+Public Member Functions</h2><table class="memberdecls">
+
+<tr><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_vpn_provider.html#a5d44d34828cce02849b2ade71de054f6">VpnProvider</a> (const <a class="el" href="classpp_1_1_instance_handle.html">InstanceHandle</a> &amp;instance)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">virtual&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_vpn_provider.html#a0ae82ce542bed9af72da27fb4c94ec42">~VpnProvider</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">int32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_vpn_provider.html#a90d17a19973f48a31ea933325e0b61af">Bind</a> (const <a class="el" href="classpp_1_1_var.html">Var</a> &amp;configuration_id, const <a class="el" href="classpp_1_1_var.html">Var</a> &amp;configuration_name, const <a class="el" href="classpp_1_1_completion_callback.html">CompletionCallback</a> &amp;callback)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">int32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_vpn_provider.html#ae692340a675bcd27c756e98779efe615">SendPacket</a> (const <a class="el" href="classpp_1_1_var.html">Var</a> &amp;packet, const <a class="el" href="classpp_1_1_completion_callback.html">CompletionCallback</a> &amp;callback)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">int32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_vpn_provider.html#a745f12bb3d3eb9bf7f29892a717caefb">ReceivePacket</a> (const <a class="el" href="classpp_1_1_completion_callback_with_output.html">CompletionCallbackWithOutput</a>&lt; <a class="el" href="classpp_1_1_var.html">Var</a> &gt; &amp;callback)</td></tr>
+</table><h2>
+Static Public Member Functions</h2><table class="memberdecls">
+<tr><td class="memItemLeft" align="right" valign="top">static bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_vpn_provider.html#a0a6b1fd0a843997fafe1bf5bed85b3b9">IsAvailable</a> ()</td></tr>
+</table>
+<hr /><a name="details" id="details"></a><h2>Detailed Description</h2>
+<div class="textblock"><p>The <code><a class="el" href="classpp_1_1_vpn_provider.html" title="The VpnProvider class enhances the chrome.vpnProvider JavaScript API by providing a high performance ...">VpnProvider</a></code> class enhances the <code>chrome.vpnProvider</code> JavaScript API by providing a high performance path for packet handling. </p>
+<p>Permissions: Apps permission <code>vpnProvider</code> is required for <code><a class="el" href="classpp_1_1_vpn_provider.html#a90d17a19973f48a31ea933325e0b61af" title="Binds to an existing configuration created from JavaScript by chrome.vpnProvider.createConfig.">VpnProvider.Bind()</a></code>.</p>
+<p>Typical usage:</p>
+<ul>
+<li>Create a <code><a class="el" href="classpp_1_1_vpn_provider.html" title="The VpnProvider class enhances the chrome.vpnProvider JavaScript API by providing a high performance ...">VpnProvider</a></code> instance.</li>
+<li>Register the callback for <code><a class="el" href="classpp_1_1_vpn_provider.html#a745f12bb3d3eb9bf7f29892a717caefb" title="Receives an IP packet from the tunnel for the VPN session.">VpnProvider.ReceivePacket()</a></code>.</li>
+<li>In the extension follow the usual workflow for configuring a VPN connection via the <code>chrome.vpnProvider</code> API until the step for notifying the connection state as "connected".</li>
+<li>Bind to the previously created connection using <code><a class="el" href="classpp_1_1_vpn_provider.html#a90d17a19973f48a31ea933325e0b61af" title="Binds to an existing configuration created from JavaScript by chrome.vpnProvider.createConfig.">VpnProvider.Bind()</a></code>.</li>
+<li>Notify the connection state as "connected" from JavaScript using <code>chrome.vpnProvider.notifyConnectionStateChanged</code>.</li>
+<li>When the steps above are completed without errors, a virtual tunnel is created to the network stack of Chrome OS. IP packets can be sent through the tunnel using <code><a class="el" href="classpp_1_1_vpn_provider.html#ae692340a675bcd27c756e98779efe615" title="Sends an IP packet through the tunnel created for the VPN session.">VpnProvider.SendPacket()</a></code> and any packets originating on the Chrome OS device will be received using the callback registered for <code><a class="el" href="classpp_1_1_vpn_provider.html#a745f12bb3d3eb9bf7f29892a717caefb" title="Receives an IP packet from the tunnel for the VPN session.">VpnProvider.ReceivePacket()</a></code>.</li>
+<li>When the user disconnects from the VPN configuration or there is an error the extension will be notfied via <code>chrome.vpnProvider.onPlatformMessage</code>. </li>
+</ul>
+</div><hr /><h2>Constructor &amp; Destructor Documentation</h2>
+<a class="anchor" id="a5d44d34828cce02849b2ade71de054f6"></a><!-- doxytag: member="pp::VpnProvider::VpnProvider" ref="a5d44d34828cce02849b2ade71de054f6" args="(const InstanceHandle &amp;instance)" -->
+<div class="memitem">
+<div class="memproto">
+<table class="memname">
+<tr>
+<td class="memname"><a class="el" href="classpp_1_1_vpn_provider.html#a5d44d34828cce02849b2ade71de054f6">pp::VpnProvider::VpnProvider</a> </td>
+<td>(</td>
+<td class="paramtype">const <a class="el" href="classpp_1_1_instance_handle.html">InstanceHandle</a> &amp;&#160;</td>
+<td class="paramname"><em>instance</em></td><td>)</td>
+<td><code> [explicit]</code></td>
+</tr>
+</table>
+</div>
+<div class="memdoc">
+<p>Constructs a <a class="el" href="classpp_1_1_vpn_provider.html" title="The VpnProvider class enhances the chrome.vpnProvider JavaScript API by providing a high performance ...">VpnProvider</a> object. </p>
+<dl class="params"><dt><b>Parameters:</b></dt><dd>
+<table class="params">
+<tr><td class="paramdir">[in]</td><td class="paramname">instance</td><td>The instance with which this resource will be associated. </td></tr>
+</table>
+</dd>
+</dl>
+</div>
+</div>
+<a class="anchor" id="a0ae82ce542bed9af72da27fb4c94ec42"></a><!-- doxytag: member="pp::VpnProvider::~VpnProvider" ref="a0ae82ce542bed9af72da27fb4c94ec42" args="()" -->
+<div class="memitem">
+<div class="memproto">
+<table class="memname">
+<tr>
+<td class="memname">virtual <a class="el" href="classpp_1_1_vpn_provider.html#a0ae82ce542bed9af72da27fb4c94ec42">pp::VpnProvider::~VpnProvider</a> </td>
+<td>(</td>
+<td class="paramname"></td><td>)</td>
+<td><code> [virtual]</code></td>
+</tr>
+</table>
+</div>
+<div class="memdoc">
+<p>Destructs a <a class="el" href="classpp_1_1_vpn_provider.html" title="The VpnProvider class enhances the chrome.vpnProvider JavaScript API by providing a high performance ...">VpnProvider</a> object. </p>
+</div>
+</div>
+<hr /><h2>Member Function Documentation</h2>
+<a class="anchor" id="a90d17a19973f48a31ea933325e0b61af"></a><!-- doxytag: member="pp::VpnProvider::Bind" ref="a90d17a19973f48a31ea933325e0b61af" args="(const Var &amp;configuration_id, const Var &amp;configuration_name, const CompletionCallback &amp;callback)" -->
+<div class="memitem">
+<div class="memproto">
+<table class="memname">
+<tr>
+<td class="memname">int32_t <a class="el" href="classpp_1_1_vpn_provider.html#a90d17a19973f48a31ea933325e0b61af">pp::VpnProvider::Bind</a> </td>
+<td>(</td>
+<td class="paramtype">const <a class="el" href="classpp_1_1_var.html">Var</a> &amp;&#160;</td>
+<td class="paramname"><em>configuration_id</em>, </td>
+</tr>
+<tr>
+<td class="paramkey"></td>
+<td></td>
+<td class="paramtype">const <a class="el" href="classpp_1_1_var.html">Var</a> &amp;&#160;</td>
+<td class="paramname"><em>configuration_name</em>, </td>
+</tr>
+<tr>
+<td class="paramkey"></td>
+<td></td>
+<td class="paramtype">const <a class="el" href="classpp_1_1_completion_callback.html">CompletionCallback</a> &amp;&#160;</td>
+<td class="paramname"><em>callback</em>&#160;</td>
+</tr>
+<tr>
+<td></td>
+<td>)</td>
+<td></td><td></td>
+</tr>
+</table>
+</div>
+<div class="memdoc">
+<p>Binds to an existing configuration created from JavaScript by <code>chrome.vpnProvider.createConfig</code>. </p>
+<p>All packets will be routed via <code>SendPacket</code> and <code>ReceivePacket</code>. The user should register the callback for <code>ReceivePacket</code> before calling <code><a class="el" href="classpp_1_1_vpn_provider.html#a90d17a19973f48a31ea933325e0b61af" title="Binds to an existing configuration created from JavaScript by chrome.vpnProvider.createConfig.">Bind()</a></code>.</p>
+<dl class="params"><dt><b>Parameters:</b></dt><dd>
+<table class="params">
+<tr><td class="paramdir">[in]</td><td class="paramname">configuration_id</td><td>The configuration id from the callback of <code>chrome.vpnProvider.createConfig</code>. This <code><a class="el" href="classpp_1_1_var.html" title="A generic type used for passing data types between the module and the page.">Var</a></code> must be of string type.</td></tr>
+<tr><td class="paramdir">[in]</td><td class="paramname">configuration_name</td><td>The configuration name as defined by the user when calling <code>chrome.vpnProvider.createConfig</code>. This <code><a class="el" href="classpp_1_1_var.html" title="A generic type used for passing data types between the module and the page.">Var</a></code> must be of string type.</td></tr>
+<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="classpp_1_1_completion_callback.html" title="This API enables you to implement and receive callbacks when Pepper operations complete asynchronousl...">CompletionCallback</a></code> to be called on completion.</td></tr>
+</table>
+</dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code>pp_errors.h</code>. Returns <code>PP_ERROR_INPROGRESS</code> if a previous call to <code><a class="el" href="classpp_1_1_vpn_provider.html#a90d17a19973f48a31ea933325e0b61af" title="Binds to an existing configuration created from JavaScript by chrome.vpnProvider.createConfig.">Bind()</a></code> has not completed. Returns <code>PP_ERROR_BADARGUMENT</code> if the <code><a class="el" href="classpp_1_1_var.html" title="A generic type used for passing data types between the module and the page.">Var</a></code> type of either <code>configuration_id</code> or <code>configuration_name</code> is not of string type. Returns <code>PP_ERROR_NOACCESS</code> if the caller does the have the required "vpnProvider" permission. Returns <code>PP_ERROR_FAILED</code> if <code>connection_id</code> and <code>connection_name</code> could not be matched with the existing connection, or if the plugin originates from a different extension than the one that created the connection. </dd></dl>
+</div>
+</div>
+<a class="anchor" id="a0a6b1fd0a843997fafe1bf5bed85b3b9"></a><!-- doxytag: member="pp::VpnProvider::IsAvailable" ref="a0a6b1fd0a843997fafe1bf5bed85b3b9" args="()" -->
+<div class="memitem">
+<div class="memproto">
+<table class="memname">
+<tr>
+<td class="memname">static bool <a class="el" href="classpp_1_1_vpn_provider.html#a0a6b1fd0a843997fafe1bf5bed85b3b9">pp::VpnProvider::IsAvailable</a> </td>
+<td>(</td>
+<td class="paramname"></td><td>)</td>
+<td><code> [static]</code></td>
+</tr>
+</table>
+</div>
+<div class="memdoc">
+<p>Static function for determining whether the browser supports the <code><a class="el" href="classpp_1_1_vpn_provider.html" title="The VpnProvider class enhances the chrome.vpnProvider JavaScript API by providing a high performance ...">VpnProvider</a></code> interface. </p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>true if the interface is available, false otherwise. </dd></dl>
+</div>
+</div>
+<a class="anchor" id="a745f12bb3d3eb9bf7f29892a717caefb"></a><!-- doxytag: member="pp::VpnProvider::ReceivePacket" ref="a745f12bb3d3eb9bf7f29892a717caefb" args="(const CompletionCallbackWithOutput&lt; Var &gt; &amp;callback)" -->
+<div class="memitem">
+<div class="memproto">
+<table class="memname">
+<tr>
+<td class="memname">int32_t <a class="el" href="classpp_1_1_vpn_provider.html#a745f12bb3d3eb9bf7f29892a717caefb">pp::VpnProvider::ReceivePacket</a> </td>
+<td>(</td>
+<td class="paramtype">const <a class="el" href="classpp_1_1_completion_callback_with_output.html">CompletionCallbackWithOutput</a>&lt; <a class="el" href="classpp_1_1_var.html">Var</a> &gt; &amp;&#160;</td>
+<td class="paramname"><em>callback</em></td><td>)</td>
+<td></td>
+</tr>
+</table>
+</div>
+<div class="memdoc">
+<p>Receives an IP packet from the tunnel for the VPN session. </p>
+<p>This function only returns a single packet. That is, this function must be called at least N times to receive N packets, no matter the size of each packet. The callback should be registered before calling <code><a class="el" href="classpp_1_1_vpn_provider.html#a90d17a19973f48a31ea933325e0b61af" title="Binds to an existing configuration created from JavaScript by chrome.vpnProvider.createConfig.">Bind()</a></code>.</p>
+<dl class="params"><dt><b>Parameters:</b></dt><dd>
+<table class="params">
+<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="classpp_1_1_completion_callback_with_output.html" title="A CompletionCallbackWithOutput defines a completion callback that additionally stores a pointer to so...">CompletionCallbackWithOutput</a></code> to be called upon completion of ReceivePacket. It will be passed an ArrayBuffer type <code><a class="el" href="classpp_1_1_var.html" title="A generic type used for passing data types between the module and the page.">Var</a></code> containing an IP packet to be sent to the platform.</td></tr>
+</table>
+</dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code>pp_errors.h</code>. Returns <code>PP_ERROR_INPROGRESS</code> if a previous call to <code><a class="el" href="classpp_1_1_vpn_provider.html#a745f12bb3d3eb9bf7f29892a717caefb" title="Receives an IP packet from the tunnel for the VPN session.">ReceivePacket()</a></code> has not completed. </dd></dl>
+</div>
+</div>
+<a class="anchor" id="ae692340a675bcd27c756e98779efe615"></a><!-- doxytag: member="pp::VpnProvider::SendPacket" ref="ae692340a675bcd27c756e98779efe615" args="(const Var &amp;packet, const CompletionCallback &amp;callback)" -->
+<div class="memitem">
+<div class="memproto">
+<table class="memname">
+<tr>
+<td class="memname">int32_t <a class="el" href="classpp_1_1_vpn_provider.html#ae692340a675bcd27c756e98779efe615">pp::VpnProvider::SendPacket</a> </td>
+<td>(</td>
+<td class="paramtype">const <a class="el" href="classpp_1_1_var.html">Var</a> &amp;&#160;</td>
+<td class="paramname"><em>packet</em>, </td>
+</tr>
+<tr>
+<td class="paramkey"></td>
+<td></td>
+<td class="paramtype">const <a class="el" href="classpp_1_1_completion_callback.html">CompletionCallback</a> &amp;&#160;</td>
+<td class="paramname"><em>callback</em>&#160;</td>
+</tr>
+<tr>
+<td></td>
+<td>)</td>
+<td></td><td></td>
+</tr>
+</table>
+</div>
+<div class="memdoc">
+<p>Sends an IP packet through the tunnel created for the VPN session. </p>
+<p>This will succeed only when the VPN session is owned by the module and connection is bound.</p>
+<dl class="params"><dt><b>Parameters:</b></dt><dd>
+<table class="params">
+<tr><td class="paramdir">[in]</td><td class="paramname">packet</td><td>IP packet to be sent to the platform. The <code><a class="el" href="classpp_1_1_var.html" title="A generic type used for passing data types between the module and the page.">Var</a></code> must be of ArrayBuffer type.</td></tr>
+<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="classpp_1_1_completion_callback.html" title="This API enables you to implement and receive callbacks when Pepper operations complete asynchronousl...">CompletionCallback</a></code> to be called on completion.</td></tr>
+</table>
+</dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code>pp_errors.h</code>. Returns <code>PP_ERROR_FAILED</code> if the connection is not bound. Returns <code>PP_ERROR_INPROGRESS</code> if a previous call to <code><a class="el" href="classpp_1_1_vpn_provider.html#ae692340a675bcd27c756e98779efe615" title="Sends an IP packet through the tunnel created for the VPN session.">SendPacket()</a></code> has not completed. Returns <code>PP_ERROR_BADARGUMENT</code> if the <code><a class="el" href="classpp_1_1_var.html" title="A generic type used for passing data types between the module and the page.">Var</a></code> type of <code>packet</code> is not of ArrayBuffer type. </dd></dl>
+</div>
+</div>
+<hr />The documentation for this class was generated from the following file:<ul>
+<li><a class="el" href="vpn__provider_8h.html">vpn_provider.h</a></li>
+</ul>
+</div><!-- contents -->
+</div>
+{{/partials.standard_nacl_api}}
diff --git a/native_client_sdk/doc_generated/pepper_beta/cpp/classpp_1_1_vpn_provider__inherit__graph.png b/native_client_sdk/doc_generated/pepper_beta/cpp/classpp_1_1_vpn_provider__inherit__graph.png
new file mode 100644
index 0000000..b2b83f8b
--- /dev/null
+++ b/native_client_sdk/doc_generated/pepper_beta/cpp/classpp_1_1_vpn_provider__inherit__graph.png
Binary files differ
diff --git a/native_client_sdk/doc_generated/pepper_beta/cpp/inherit_graph_23.png b/native_client_sdk/doc_generated/pepper_beta/cpp/inherit_graph_23.png
index 056cffd..12c7b57 100644
--- a/native_client_sdk/doc_generated/pepper_beta/cpp/inherit_graph_23.png
+++ b/native_client_sdk/doc_generated/pepper_beta/cpp/inherit_graph_23.png
Binary files differ
diff --git a/native_client_sdk/doc_generated/pepper_beta/cpp/inherits.html b/native_client_sdk/doc_generated/pepper_beta/cpp/inherits.html
index f1a43a2c..d0e14c96 100644
--- a/native_client_sdk/doc_generated/pepper_beta/cpp/inherits.html
+++ b/native_client_sdk/doc_generated/pepper_beta/cpp/inherits.html
@@ -106,7 +106,7 @@
 </td></tr>
 <tr><td><img src="inherit_graph_23.png" border="0" alt="" usemap="#pp_1_1_resource" />
 <map name="pp_1_1_resource" id="pp_1_1_resource">
-<area shape="rect" id="node1" href="classpp_1_1_resource.html" title="A reference counted module resource." alt="" coords="5,740,109,767"></area><area shape="rect" id="node2" href="classpp_1_1_audio.html" title="An audio resource." alt="" coords="216,5,299,32"></area><area shape="rect" id="node3" href="classpp_1_1_audio_buffer.html" title="pp::AudioBuffer" alt="" coords="197,56,317,83"></area><area shape="rect" id="node4" href="classpp_1_1_audio_config.html" title="A 16 bit stereo AudioConfig resource." alt="" coords="196,107,319,133"></area><area shape="rect" id="node5" href="classpp_1_1_audio_encoder.html" title="Audio encoder interface." alt="" coords="190,157,325,184"></area><area shape="rect" id="node6" href="classpp_1_1_compositor.html" title="The Compositor interface is used for setting CompositorLayer layers to the Chromium compositor for co..." alt="" coords="197,208,317,235"></area><area shape="rect" id="node7" href="classpp_1_1_compositor_layer.html" title="pp::CompositorLayer" alt="" coords="180,259,335,285"></area><area shape="rect" id="node8" href="classpp_1_1_file_i_o.html" title="The FileIO class represents a regular file." alt="" coords="218,309,297,336"></area><area shape="rect" id="node9" href="classpp_1_1_file_ref.html" title='The FileRef class represents a "weak pointer" to a file in a file system.' alt="" coords="215,360,300,387"></area><area shape="rect" id="node10" href="classpp_1_1_file_system.html" title="The FileSystem class identifies the file system type associated with a file." alt="" coords="200,411,315,437"></area><area shape="rect" id="node11" href="classpp_1_1_graphics2_d.html" title="pp::Graphics2D" alt="" coords="197,461,317,488"></area><area shape="rect" id="node12" href="classpp_1_1_graphics3_d.html" title="This class represents a 3D rendering context in the browser." alt="" coords="197,512,317,539"></area><area shape="rect" id="node13" href="classpp_1_1_host_resolver.html" title="The HostResolver class supports host name resolution." alt="" coords="193,563,322,589"></area><area shape="rect" id="node14" href="classpp_1_1_image_data.html" title="pp::ImageData" alt="" coords="199,613,316,640"></area><area shape="rect" id="node15" href="classpp_1_1_input_event.html" title="This class represents an input event resource." alt="" coords="200,664,315,691"></area><area shape="rect" id="node21" href="classpp_1_1_media_stream_audio_track.html" title="The MediaStreamAudioTrack class contains methods for receiving audio buffers from a MediaStream audio..." alt="" coords="157,715,357,741"></area><area shape="rect" id="node22" href="classpp_1_1_media_stream_video_track.html" title="The MediaStreamVideoTrack class contains methods for receiving video frames from a MediaStream video ..." alt="" coords="157,765,357,792"></area><area shape="rect" id="node23" href="classpp_1_1_message_loop.html" title="A message loop allows PPAPI calls to be issued on a thread." alt="" coords="190,816,325,843"></area><area shape="rect" id="node24" href="classpp_1_1_net_address.html" title="The NetAddress class represents a network address." alt="" coords="197,867,318,893"></area><area shape="rect" id="node25" href="classpp_1_1_network_list.html" title="pp::NetworkList" alt="" coords="197,917,317,944"></area><area shape="rect" id="node26" href="classpp_1_1_network_monitor.html" title="pp::NetworkMonitor" alt="" coords="184,968,331,995"></area><area shape="rect" id="node27" href="classpp_1_1_t_c_p_socket.html" title="The TCPSocket class provides TCP socket operations." alt="" coords="201,1019,314,1045"></area><area shape="rect" id="node28" href="classpp_1_1_u_d_p_socket.html" title="The UDPSocket class provides UDP socket operations." alt="" coords="198,1069,317,1096"></area><area shape="rect" id="node29" href="classpp_1_1_u_r_l_loader.html" title="URLLoader provides an API for loading URLs." alt="" coords="200,1120,315,1147"></area><area shape="rect" id="node30" href="classpp_1_1_u_r_l_request_info.html" title="URLRequestInfo provides an API for creating and manipulating URL requests." alt="" coords="185,1171,330,1197"></area><area shape="rect" id="node31" href="classpp_1_1_u_r_l_response_info.html" title="URLResponseInfo provides an API for examining URL responses." alt="" coords="180,1221,335,1248"></area><area shape="rect" id="node32" href="classpp_1_1_video_decoder.html" title="Video decoder interface." alt="" coords="189,1272,325,1299"></area><area shape="rect" id="node33" href="classpp_1_1_video_encoder.html" title="Video encoder interface." alt="" coords="190,1323,325,1349"></area><area shape="rect" id="node34" href="classpp_1_1_video_frame.html" title="pp::VideoFrame" alt="" coords="196,1373,319,1400"></area><area shape="rect" id="node35" href="classpp_1_1_view.html" title="This class represents the state of the view for an instance and contains functions for retrieving the..." alt="" coords="220,1424,295,1451"></area><area shape="rect" id="node36" href="classpp_1_1_web_socket.html" title="The WebSocket class providing bi-directional, full-duplex, communications over a single TCP socket..." alt="" coords="199,1475,315,1501"></area><area shape="rect" id="node16" href="classpp_1_1_i_m_e_input_event.html" title="pp::IMEInputEvent" alt="" coords="424,563,560,589"></area><area shape="rect" id="node17" href="classpp_1_1_keyboard_input_event.html" title="pp::KeyboardInputEvent" alt="" coords="405,613,579,640"></area><area shape="rect" id="node18" href="classpp_1_1_mouse_input_event.html" title="This class handles mouse events." alt="" coords="414,664,570,691"></area><area shape="rect" id="node19" href="classpp_1_1_touch_input_event.html" title="pp::TouchInputEvent" alt="" coords="417,715,567,741"></area><area shape="rect" id="node20" href="classpp_1_1_wheel_input_event.html" title="pp::WheelInputEvent" alt="" coords="416,765,568,792"></area></map>
+<area shape="rect" id="node1" href="classpp_1_1_resource.html" title="A reference counted module resource." alt="" coords="5,765,109,792"></area><area shape="rect" id="node2" href="classpp_1_1_audio.html" title="An audio resource." alt="" coords="216,5,299,32"></area><area shape="rect" id="node3" href="classpp_1_1_audio_buffer.html" title="pp::AudioBuffer" alt="" coords="197,56,317,83"></area><area shape="rect" id="node4" href="classpp_1_1_audio_config.html" title="A 16 bit stereo AudioConfig resource." alt="" coords="196,107,319,133"></area><area shape="rect" id="node5" href="classpp_1_1_audio_encoder.html" title="Audio encoder interface." alt="" coords="190,157,325,184"></area><area shape="rect" id="node6" href="classpp_1_1_compositor.html" title="The Compositor interface is used for setting CompositorLayer layers to the Chromium compositor for co..." alt="" coords="197,208,317,235"></area><area shape="rect" id="node7" href="classpp_1_1_compositor_layer.html" title="pp::CompositorLayer" alt="" coords="180,259,335,285"></area><area shape="rect" id="node8" href="classpp_1_1_file_i_o.html" title="The FileIO class represents a regular file." alt="" coords="218,309,297,336"></area><area shape="rect" id="node9" href="classpp_1_1_file_ref.html" title='The FileRef class represents a "weak pointer" to a file in a file system.' alt="" coords="215,360,300,387"></area><area shape="rect" id="node10" href="classpp_1_1_file_system.html" title="The FileSystem class identifies the file system type associated with a file." alt="" coords="200,411,315,437"></area><area shape="rect" id="node11" href="classpp_1_1_graphics2_d.html" title="pp::Graphics2D" alt="" coords="197,461,317,488"></area><area shape="rect" id="node12" href="classpp_1_1_graphics3_d.html" title="This class represents a 3D rendering context in the browser." alt="" coords="197,512,317,539"></area><area shape="rect" id="node13" href="classpp_1_1_host_resolver.html" title="The HostResolver class supports host name resolution." alt="" coords="193,563,322,589"></area><area shape="rect" id="node14" href="classpp_1_1_image_data.html" title="pp::ImageData" alt="" coords="199,613,316,640"></area><area shape="rect" id="node15" href="classpp_1_1_input_event.html" title="This class represents an input event resource." alt="" coords="200,664,315,691"></area><area shape="rect" id="node21" href="classpp_1_1_media_stream_audio_track.html" title="The MediaStreamAudioTrack class contains methods for receiving audio buffers from a MediaStream audio..." alt="" coords="157,715,357,741"></area><area shape="rect" id="node22" href="classpp_1_1_media_stream_video_track.html" title="The MediaStreamVideoTrack class contains methods for receiving video frames from a MediaStream video ..." alt="" coords="157,765,357,792"></area><area shape="rect" id="node23" href="classpp_1_1_message_loop.html" title="A message loop allows PPAPI calls to be issued on a thread." alt="" coords="190,816,325,843"></area><area shape="rect" id="node24" href="classpp_1_1_net_address.html" title="The NetAddress class represents a network address." alt="" coords="197,867,318,893"></area><area shape="rect" id="node25" href="classpp_1_1_network_list.html" title="pp::NetworkList" alt="" coords="197,917,317,944"></area><area shape="rect" id="node26" href="classpp_1_1_network_monitor.html" title="pp::NetworkMonitor" alt="" coords="184,968,331,995"></area><area shape="rect" id="node27" href="classpp_1_1_t_c_p_socket.html" title="The TCPSocket class provides TCP socket operations." alt="" coords="201,1019,314,1045"></area><area shape="rect" id="node28" href="classpp_1_1_u_d_p_socket.html" title="The UDPSocket class provides UDP socket operations." alt="" coords="198,1069,317,1096"></area><area shape="rect" id="node29" href="classpp_1_1_u_r_l_loader.html" title="URLLoader provides an API for loading URLs." alt="" coords="200,1120,315,1147"></area><area shape="rect" id="node30" href="classpp_1_1_u_r_l_request_info.html" title="URLRequestInfo provides an API for creating and manipulating URL requests." alt="" coords="185,1171,330,1197"></area><area shape="rect" id="node31" href="classpp_1_1_u_r_l_response_info.html" title="URLResponseInfo provides an API for examining URL responses." alt="" coords="180,1221,335,1248"></area><area shape="rect" id="node32" href="classpp_1_1_video_decoder.html" title="Video decoder interface." alt="" coords="189,1272,325,1299"></area><area shape="rect" id="node33" href="classpp_1_1_video_encoder.html" title="Video encoder interface." alt="" coords="190,1323,325,1349"></area><area shape="rect" id="node34" href="classpp_1_1_video_frame.html" title="pp::VideoFrame" alt="" coords="196,1373,319,1400"></area><area shape="rect" id="node35" href="classpp_1_1_view.html" title="This class represents the state of the view for an instance and contains functions for retrieving the..." alt="" coords="220,1424,295,1451"></area><area shape="rect" id="node36" href="classpp_1_1_vpn_provider.html" title="The VpnProvider class enhances the chrome.vpnProvider JavaScript API by providing a high performance ..." alt="" coords="196,1475,319,1501"></area><area shape="rect" id="node37" href="classpp_1_1_web_socket.html" title="The WebSocket class providing bi-directional, full-duplex, communications over a single TCP socket..." alt="" coords="199,1525,315,1552"></area><area shape="rect" id="node16" href="classpp_1_1_i_m_e_input_event.html" title="pp::IMEInputEvent" alt="" coords="424,563,560,589"></area><area shape="rect" id="node17" href="classpp_1_1_keyboard_input_event.html" title="pp::KeyboardInputEvent" alt="" coords="405,613,579,640"></area><area shape="rect" id="node18" href="classpp_1_1_mouse_input_event.html" title="This class handles mouse events." alt="" coords="414,664,570,691"></area><area shape="rect" id="node19" href="classpp_1_1_touch_input_event.html" title="pp::TouchInputEvent" alt="" coords="417,715,567,741"></area><area shape="rect" id="node20" href="classpp_1_1_wheel_input_event.html" title="pp::WheelInputEvent" alt="" coords="416,765,568,792"></area></map>
 </td></tr>
 <tr><td><img src="inherit_graph_24.png" border="0" alt="" usemap="#pp_1_1_size" />
 <map name="pp_1_1_size" id="pp_1_1_size">
diff --git a/native_client_sdk/doc_generated/pepper_beta/cpp/jquery.js b/native_client_sdk/doc_generated/pepper_beta/cpp/jquery.js
new file mode 100644
index 0000000..90b3a2b
--- /dev/null
+++ b/native_client_sdk/doc_generated/pepper_beta/cpp/jquery.js
@@ -0,0 +1,64 @@
+/*
+ * jQuery JavaScript Library v1.3.2
+ * http://jquery.com/
+ *
+ * Copyright (c) 2009 John Resig
+ * Dual licensed under the MIT and GPL licenses.
+ * http://docs.jquery.com/License
+ *
+ * Date: 2009-02-19 17:34:21 -0500 (Thu, 19 Feb 2009)
+ * Revision: 6246
+ */
+(function(){var l=this,g,y=l.jQuery,p=l.$,o=l.jQuery=l.$=function(E,F){return new o.fn.init(E,F)},D=/^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/,f=/^.[^:#\[\.,]*$/;o.fn=o.prototype={init:function(E,H){E=E||document;if(E.nodeType){this[0]=E;this.length=1;this.context=E;return this}if(typeof E==="string"){var G=D.exec(E);if(G&&(G[1]||!H)){if(G[1]){E=o.clean([G[1]],H)}else{var I=document.getElementById(G[3]);if(I&&I.id!=G[3]){return o().find(E)}var F=o(I||[]);F.context=document;F.selector=E;return F}}else{return o(H).find(E)}}else{if(o.isFunction(E)){return o(document).ready(E)}}if(E.selector&&E.context){this.selector=E.selector;this.context=E.context}return this.setArray(o.isArray(E)?E:o.makeArray(E))},selector:"",jquery:"1.3.2",size:function(){return this.length},get:function(E){return E===g?Array.prototype.slice.call(this):this[E]},pushStack:function(F,H,E){var G=o(F);G.prevObject=this;G.context=this.context;if(H==="find"){G.selector=this.selector+(this.selector?" ":"")+E}else{if(H){G.selector=this.selector+"."+H+"("+E+")"}}return G},setArray:function(E){this.length=0;Array.prototype.push.apply(this,E);return this},each:function(F,E){return o.each(this,F,E)},index:function(E){return o.inArray(E&&E.jquery?E[0]:E,this)},attr:function(F,H,G){var E=F;if(typeof F==="string"){if(H===g){return this[0]&&o[G||"attr"](this[0],F)}else{E={};E[F]=H}}return this.each(function(I){for(F in E){o.attr(G?this.style:this,F,o.prop(this,E[F],G,I,F))}})},css:function(E,F){if((E=="width"||E=="height")&&parseFloat(F)<0){F=g}return this.attr(E,F,"curCSS")},text:function(F){if(typeof F!=="object"&&F!=null){return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(F))}var E="";o.each(F||this,function(){o.each(this.childNodes,function(){if(this.nodeType!=8){E+=this.nodeType!=1?this.nodeValue:o.fn.text([this])}})});return E},wrapAll:function(E){if(this[0]){var F=o(E,this[0].ownerDocument).clone();if(this[0].parentNode){F.insertBefore(this[0])}F.map(function(){var G=this;while(G.firstChild){G=G.firstChild}return G}).append(this)}return this},wrapInner:function(E){return this.each(function(){o(this).contents().wrapAll(E)})},wrap:function(E){return this.each(function(){o(this).wrapAll(E)})},append:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.appendChild(E)}})},prepend:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.insertBefore(E,this.firstChild)}})},before:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this)})},after:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this.nextSibling)})},end:function(){return this.prevObject||o([])},push:[].push,sort:[].sort,splice:[].splice,find:function(E){if(this.length===1){var F=this.pushStack([],"find",E);F.length=0;o.find(E,this[0],F);return F}else{return this.pushStack(o.unique(o.map(this,function(G){return o.find(E,G)})),"find",E)}},clone:function(G){var E=this.map(function(){if(!o.support.noCloneEvent&&!o.isXMLDoc(this)){var I=this.outerHTML;if(!I){var J=this.ownerDocument.createElement("div");J.appendChild(this.cloneNode(true));I=J.innerHTML}return o.clean([I.replace(/ jQuery\d+="(?:\d+|null)"/g,"").replace(/^\s*/,"")])[0]}else{return this.cloneNode(true)}});if(G===true){var H=this.find("*").andSelf(),F=0;E.find("*").andSelf().each(function(){if(this.nodeName!==H[F].nodeName){return}var I=o.data(H[F],"events");for(var K in I){for(var J in I[K]){o.event.add(this,K,I[K][J],I[K][J].data)}}F++})}return E},filter:function(E){return this.pushStack(o.isFunction(E)&&o.grep(this,function(G,F){return E.call(G,F)})||o.multiFilter(E,o.grep(this,function(F){return F.nodeType===1})),"filter",E)},closest:function(E){var G=o.expr.match.POS.test(E)?o(E):null,F=0;return this.map(function(){var H=this;while(H&&H.ownerDocument){if(G?G.index(H)>-1:o(H).is(E)){o.data(H,"closest",F);return H}H=H.parentNode;F++}})},not:function(E){if(typeof E==="string"){if(f.test(E)){return this.pushStack(o.multiFilter(E,this,true),"not",E)}else{E=o.multiFilter(E,this)}}var F=E.length&&E[E.length-1]!==g&&!E.nodeType;return this.filter(function(){return F?o.inArray(this,E)<0:this!=E})},add:function(E){return this.pushStack(o.unique(o.merge(this.get(),typeof E==="string"?o(E):o.makeArray(E))))},is:function(E){return !!E&&o.multiFilter(E,this).length>0},hasClass:function(E){return !!E&&this.is("."+E)},val:function(K){if(K===g){var E=this[0];if(E){if(o.nodeName(E,"option")){return(E.attributes.value||{}).specified?E.value:E.text}if(o.nodeName(E,"select")){var I=E.selectedIndex,L=[],M=E.options,H=E.type=="select-one";if(I<0){return null}for(var F=H?I:0,J=H?I+1:M.length;F<J;F++){var G=M[F];if(G.selected){K=o(G).val();if(H){return K}L.push(K)}}return L}return(E.value||"").replace(/\r/g,"")}return g}if(typeof K==="number"){K+=""}return this.each(function(){if(this.nodeType!=1){return}if(o.isArray(K)&&/radio|checkbox/.test(this.type)){this.checked=(o.inArray(this.value,K)>=0||o.inArray(this.name,K)>=0)}else{if(o.nodeName(this,"select")){var N=o.makeArray(K);o("option",this).each(function(){this.selected=(o.inArray(this.value,N)>=0||o.inArray(this.text,N)>=0)});if(!N.length){this.selectedIndex=-1}}else{this.value=K}}})},html:function(E){return E===g?(this[0]?this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g,""):null):this.empty().append(E)},replaceWith:function(E){return this.after(E).remove()},eq:function(E){return this.slice(E,+E+1)},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments),"slice",Array.prototype.slice.call(arguments).join(","))},map:function(E){return this.pushStack(o.map(this,function(G,F){return E.call(G,F,G)}))},andSelf:function(){return this.add(this.prevObject)},domManip:function(J,M,L){if(this[0]){var I=(this[0].ownerDocument||this[0]).createDocumentFragment(),F=o.clean(J,(this[0].ownerDocument||this[0]),I),H=I.firstChild;if(H){for(var G=0,E=this.length;G<E;G++){L.call(K(this[G],H),this.length>1||G>0?I.cloneNode(true):I)}}if(F){o.each(F,z)}}return this;function K(N,O){return M&&o.nodeName(N,"table")&&o.nodeName(O,"tr")?(N.getElementsByTagName("tbody")[0]||N.appendChild(N.ownerDocument.createElement("tbody"))):N}}};o.fn.init.prototype=o.fn;function z(E,F){if(F.src){o.ajax({url:F.src,async:false,dataType:"script"})}else{o.globalEval(F.text||F.textContent||F.innerHTML||"")}if(F.parentNode){F.parentNode.removeChild(F)}}function e(){return +new Date}o.extend=o.fn.extend=function(){var J=arguments[0]||{},H=1,I=arguments.length,E=false,G;if(typeof J==="boolean"){E=J;J=arguments[1]||{};H=2}if(typeof J!=="object"&&!o.isFunction(J)){J={}}if(I==H){J=this;--H}for(;H<I;H++){if((G=arguments[H])!=null){for(var F in G){var K=J[F],L=G[F];if(J===L){continue}if(E&&L&&typeof L==="object"&&!L.nodeType){J[F]=o.extend(E,K||(L.length!=null?[]:{}),L)}else{if(L!==g){J[F]=L}}}}}return J};var b=/z-?index|font-?weight|opacity|zoom|line-?height/i,q=document.defaultView||{},s=Object.prototype.toString;o.extend({noConflict:function(E){l.$=p;if(E){l.jQuery=y}return o},isFunction:function(E){return s.call(E)==="[object Function]"},isArray:function(E){return s.call(E)==="[object Array]"},isXMLDoc:function(E){return E.nodeType===9&&E.documentElement.nodeName!=="HTML"||!!E.ownerDocument&&o.isXMLDoc(E.ownerDocument)},globalEval:function(G){if(G&&/\S/.test(G)){var F=document.getElementsByTagName("head")[0]||document.documentElement,E=document.createElement("script");E.type="text/javascript";if(o.support.scriptEval){E.appendChild(document.createTextNode(G))}else{E.text=G}F.insertBefore(E,F.firstChild);F.removeChild(E)}},nodeName:function(F,E){return F.nodeName&&F.nodeName.toUpperCase()==E.toUpperCase()},each:function(G,K,F){var E,H=0,I=G.length;if(F){if(I===g){for(E in G){if(K.apply(G[E],F)===false){break}}}else{for(;H<I;){if(K.apply(G[H++],F)===false){break}}}}else{if(I===g){for(E in G){if(K.call(G[E],E,G[E])===false){break}}}else{for(var J=G[0];H<I&&K.call(J,H,J)!==false;J=G[++H]){}}}return G},prop:function(H,I,G,F,E){if(o.isFunction(I)){I=I.call(H,F)}return typeof I==="number"&&G=="curCSS"&&!b.test(E)?I+"px":I},className:{add:function(E,F){o.each((F||"").split(/\s+/),function(G,H){if(E.nodeType==1&&!o.className.has(E.className,H)){E.className+=(E.className?" ":"")+H}})},remove:function(E,F){if(E.nodeType==1){E.className=F!==g?o.grep(E.className.split(/\s+/),function(G){return !o.className.has(F,G)}).join(" "):""}},has:function(F,E){return F&&o.inArray(E,(F.className||F).toString().split(/\s+/))>-1}},swap:function(H,G,I){var E={};for(var F in G){E[F]=H.style[F];H.style[F]=G[F]}I.call(H);for(var F in G){H.style[F]=E[F]}},css:function(H,F,J,E){if(F=="width"||F=="height"){var L,G={position:"absolute",visibility:"hidden",display:"block"},K=F=="width"?["Left","Right"]:["Top","Bottom"];function I(){L=F=="width"?H.offsetWidth:H.offsetHeight;if(E==="border"){return}o.each(K,function(){if(!E){L-=parseFloat(o.curCSS(H,"padding"+this,true))||0}if(E==="margin"){L+=parseFloat(o.curCSS(H,"margin"+this,true))||0}else{L-=parseFloat(o.curCSS(H,"border"+this+"Width",true))||0}})}if(H.offsetWidth!==0){I()}else{o.swap(H,G,I)}return Math.max(0,Math.round(L))}return o.curCSS(H,F,J)},curCSS:function(I,F,G){var L,E=I.style;if(F=="opacity"&&!o.support.opacity){L=o.attr(E,"opacity");return L==""?"1":L}if(F.match(/float/i)){F=w}if(!G&&E&&E[F]){L=E[F]}else{if(q.getComputedStyle){if(F.match(/float/i)){F="float"}F=F.replace(/([A-Z])/g,"-$1").toLowerCase();var M=q.getComputedStyle(I,null);if(M){L=M.getPropertyValue(F)}if(F=="opacity"&&L==""){L="1"}}else{if(I.currentStyle){var J=F.replace(/\-(\w)/g,function(N,O){return O.toUpperCase()});L=I.currentStyle[F]||I.currentStyle[J];if(!/^\d+(px)?$/i.test(L)&&/^\d/.test(L)){var H=E.left,K=I.runtimeStyle.left;I.runtimeStyle.left=I.currentStyle.left;E.left=L||0;L=E.pixelLeft+"px";E.left=H;I.runtimeStyle.left=K}}}}return L},clean:function(F,K,I){K=K||document;if(typeof K.createElement==="undefined"){K=K.ownerDocument||K[0]&&K[0].ownerDocument||document}if(!I&&F.length===1&&typeof F[0]==="string"){var H=/^<(\w+)\s*\/?>$/.exec(F[0]);if(H){return[K.createElement(H[1])]}}var G=[],E=[],L=K.createElement("div");o.each(F,function(P,S){if(typeof S==="number"){S+=""}if(!S){return}if(typeof S==="string"){S=S.replace(/(<(\w+)[^>]*?)\/>/g,function(U,V,T){return T.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?U:V+"></"+T+">"});var O=S.replace(/^\s+/,"").substring(0,10).toLowerCase();var Q=!O.indexOf("<opt")&&[1,"<select multiple='multiple'>","</select>"]||!O.indexOf("<leg")&&[1,"<fieldset>","</fieldset>"]||O.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"<table>","</table>"]||!O.indexOf("<tr")&&[2,"<table><tbody>","</tbody></table>"]||(!O.indexOf("<td")||!O.indexOf("<th"))&&[3,"<table><tbody><tr>","</tr></tbody></table>"]||!O.indexOf("<col")&&[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"]||!o.support.htmlSerialize&&[1,"div<div>","</div>"]||[0,"",""];L.innerHTML=Q[1]+S+Q[2];while(Q[0]--){L=L.lastChild}if(!o.support.tbody){var R=/<tbody/i.test(S),N=!O.indexOf("<table")&&!R?L.firstChild&&L.firstChild.childNodes:Q[1]=="<table>"&&!R?L.childNodes:[];for(var M=N.length-1;M>=0;--M){if(o.nodeName(N[M],"tbody")&&!N[M].childNodes.length){N[M].parentNode.removeChild(N[M])}}}if(!o.support.leadingWhitespace&&/^\s/.test(S)){L.insertBefore(K.createTextNode(S.match(/^\s*/)[0]),L.firstChild)}S=o.makeArray(L.childNodes)}if(S.nodeType){G.push(S)}else{G=o.merge(G,S)}});if(I){for(var J=0;G[J];J++){if(o.nodeName(G[J],"script")&&(!G[J].type||G[J].type.toLowerCase()==="text/javascript")){E.push(G[J].parentNode?G[J].parentNode.removeChild(G[J]):G[J])}else{if(G[J].nodeType===1){G.splice.apply(G,[J+1,0].concat(o.makeArray(G[J].getElementsByTagName("script"))))}I.appendChild(G[J])}}return E}return G},attr:function(J,G,K){if(!J||J.nodeType==3||J.nodeType==8){return g}var H=!o.isXMLDoc(J),L=K!==g;G=H&&o.props[G]||G;if(J.tagName){var F=/href|src|style/.test(G);if(G=="selected"&&J.parentNode){J.parentNode.selectedIndex}if(G in J&&H&&!F){if(L){if(G=="type"&&o.nodeName(J,"input")&&J.parentNode){throw"type property can't be changed"}J[G]=K}if(o.nodeName(J,"form")&&J.getAttributeNode(G)){return J.getAttributeNode(G).nodeValue}if(G=="tabIndex"){var I=J.getAttributeNode("tabIndex");return I&&I.specified?I.value:J.nodeName.match(/(button|input|object|select|textarea)/i)?0:J.nodeName.match(/^(a|area)$/i)&&J.href?0:g}return J[G]}if(!o.support.style&&H&&G=="style"){return o.attr(J.style,"cssText",K)}if(L){J.setAttribute(G,""+K)}var E=!o.support.hrefNormalized&&H&&F?J.getAttribute(G,2):J.getAttribute(G);return E===null?g:E}if(!o.support.opacity&&G=="opacity"){if(L){J.zoom=1;J.filter=(J.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(K)+""=="NaN"?"":"alpha(opacity="+K*100+")")}return J.filter&&J.filter.indexOf("opacity=")>=0?(parseFloat(J.filter.match(/opacity=([^)]*)/)[1])/100)+"":""}G=G.replace(/-([a-z])/ig,function(M,N){return N.toUpperCase()});if(L){J[G]=K}return J[G]},trim:function(E){return(E||"").replace(/^\s+|\s+$/g,"")},makeArray:function(G){var E=[];if(G!=null){var F=G.length;if(F==null||typeof G==="string"||o.isFunction(G)||G.setInterval){E[0]=G}else{while(F){E[--F]=G[F]}}}return E},inArray:function(G,H){for(var E=0,F=H.length;E<F;E++){if(H[E]===G){return E}}return -1},merge:function(H,E){var F=0,G,I=H.length;if(!o.support.getAll){while((G=E[F++])!=null){if(G.nodeType!=8){H[I++]=G}}}else{while((G=E[F++])!=null){H[I++]=G}}return H},unique:function(K){var F=[],E={};try{for(var G=0,H=K.length;G<H;G++){var J=o.data(K[G]);if(!E[J]){E[J]=true;F.push(K[G])}}}catch(I){F=K}return F},grep:function(F,J,E){var G=[];for(var H=0,I=F.length;H<I;H++){if(!E!=!J(F[H],H)){G.push(F[H])}}return G},map:function(E,J){var F=[];for(var G=0,H=E.length;G<H;G++){var I=J(E[G],G);if(I!=null){F[F.length]=I}}return F.concat.apply([],F)}});var C=navigator.userAgent.toLowerCase();o.browser={version:(C.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[0,"0"])[1],safari:/webkit/.test(C),opera:/opera/.test(C),msie:/msie/.test(C)&&!/opera/.test(C),mozilla:/mozilla/.test(C)&&!/(compatible|webkit)/.test(C)};o.each({parent:function(E){return E.parentNode},parents:function(E){return o.dir(E,"parentNode")},next:function(E){return o.nth(E,2,"nextSibling")},prev:function(E){return o.nth(E,2,"previousSibling")},nextAll:function(E){return o.dir(E,"nextSibling")},prevAll:function(E){return o.dir(E,"previousSibling")},siblings:function(E){return o.sibling(E.parentNode.firstChild,E)},children:function(E){return o.sibling(E.firstChild)},contents:function(E){return o.nodeName(E,"iframe")?E.contentDocument||E.contentWindow.document:o.makeArray(E.childNodes)}},function(E,F){o.fn[E]=function(G){var H=o.map(this,F);if(G&&typeof G=="string"){H=o.multiFilter(G,H)}return this.pushStack(o.unique(H),E,G)}});o.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(E,F){o.fn[E]=function(G){var J=[],L=o(G);for(var K=0,H=L.length;K<H;K++){
+var I=(K>0?this.clone(true):this).get();o.fn[F].apply(o(L[K]),I);J=J.concat(I)}return this.pushStack(J,E,G)}});o.each({removeAttr:function(E){o.attr(this,E,"");if(this.nodeType==1){this.removeAttribute(E)}},addClass:function(E){o.className.add(this,E)},removeClass:function(E){o.className.remove(this,E)},toggleClass:function(F,E){if(typeof E!=="boolean"){E=!o.className.has(this,F)}o.className[E?"add":"remove"](this,F)},remove:function(E){if(!E||o.filter(E,[this]).length){o("*",this).add([this]).each(function(){o.event.remove(this);o.removeData(this)});if(this.parentNode){this.parentNode.removeChild(this)}}},empty:function(){o(this).children().remove();while(this.firstChild){this.removeChild(this.firstChild)}}},function(E,F){o.fn[E]=function(){return this.each(F,arguments)}});function j(E,F){return E[0]&&parseInt(o.curCSS(E[0],F,true),10)||0}var h="jQuery"+e(),v=0,A={};o.extend({cache:{},data:function(F,E,G){F=F==l?A:F;var H=F[h];if(!H){H=F[h]=++v}if(E&&!o.cache[H]){o.cache[H]={}}if(G!==g){o.cache[H][E]=G}return E?o.cache[H][E]:H},removeData:function(F,E){F=F==l?A:F;var H=F[h];if(E){if(o.cache[H]){delete o.cache[H][E];E="";for(E in o.cache[H]){break}if(!E){o.removeData(F)}}}else{try{delete F[h]}catch(G){if(F.removeAttribute){F.removeAttribute(h)}}delete o.cache[H]}},queue:function(F,E,H){if(F){E=(E||"fx")+"queue";var G=o.data(F,E);if(!G||o.isArray(H)){G=o.data(F,E,o.makeArray(H))}else{if(H){G.push(H)}}}return G},dequeue:function(H,G){var E=o.queue(H,G),F=E.shift();if(!G||G==="fx"){F=E[0]}if(F!==g){F.call(H)}}});o.fn.extend({data:function(E,G){var H=E.split(".");H[1]=H[1]?"."+H[1]:"";if(G===g){var F=this.triggerHandler("getData"+H[1]+"!",[H[0]]);if(F===g&&this.length){F=o.data(this[0],E)}return F===g&&H[1]?this.data(H[0]):F}else{return this.trigger("setData"+H[1]+"!",[H[0],G]).each(function(){o.data(this,E,G)})}},removeData:function(E){return this.each(function(){o.removeData(this,E)})},queue:function(E,F){if(typeof E!=="string"){F=E;E="fx"}if(F===g){return o.queue(this[0],E)}return this.each(function(){var G=o.queue(this,E,F);if(E=="fx"&&G.length==1){G[0].call(this)}})},dequeue:function(E){return this.each(function(){o.dequeue(this,E)})}});
+/*
+ * Sizzle CSS Selector Engine - v0.9.3
+ *  Copyright 2009, The Dojo Foundation
+ *  Released under the MIT, BSD, and GPL Licenses.
+ *  More information: http://sizzlejs.com/
+ */
+(function(){var R=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?/g,L=0,H=Object.prototype.toString;var F=function(Y,U,ab,ac){ab=ab||[];U=U||document;if(U.nodeType!==1&&U.nodeType!==9){return[]}if(!Y||typeof Y!=="string"){return ab}var Z=[],W,af,ai,T,ad,V,X=true;R.lastIndex=0;while((W=R.exec(Y))!==null){Z.push(W[1]);if(W[2]){V=RegExp.rightContext;break}}if(Z.length>1&&M.exec(Y)){if(Z.length===2&&I.relative[Z[0]]){af=J(Z[0]+Z[1],U)}else{af=I.relative[Z[0]]?[U]:F(Z.shift(),U);while(Z.length){Y=Z.shift();if(I.relative[Y]){Y+=Z.shift()}af=J(Y,af)}}}else{var ae=ac?{expr:Z.pop(),set:E(ac)}:F.find(Z.pop(),Z.length===1&&U.parentNode?U.parentNode:U,Q(U));af=F.filter(ae.expr,ae.set);if(Z.length>0){ai=E(af)}else{X=false}while(Z.length){var ah=Z.pop(),ag=ah;if(!I.relative[ah]){ah=""}else{ag=Z.pop()}if(ag==null){ag=U}I.relative[ah](ai,ag,Q(U))}}if(!ai){ai=af}if(!ai){throw"Syntax error, unrecognized expression: "+(ah||Y)}if(H.call(ai)==="[object Array]"){if(!X){ab.push.apply(ab,ai)}else{if(U.nodeType===1){for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&(ai[aa]===true||ai[aa].nodeType===1&&K(U,ai[aa]))){ab.push(af[aa])}}}else{for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&ai[aa].nodeType===1){ab.push(af[aa])}}}}}else{E(ai,ab)}if(V){F(V,U,ab,ac);if(G){hasDuplicate=false;ab.sort(G);if(hasDuplicate){for(var aa=1;aa<ab.length;aa++){if(ab[aa]===ab[aa-1]){ab.splice(aa--,1)}}}}}return ab};F.matches=function(T,U){return F(T,null,null,U)};F.find=function(aa,T,ab){var Z,X;if(!aa){return[]}for(var W=0,V=I.order.length;W<V;W++){var Y=I.order[W],X;if((X=I.match[Y].exec(aa))){var U=RegExp.leftContext;if(U.substr(U.length-1)!=="\\"){X[1]=(X[1]||"").replace(/\\/g,"");Z=I.find[Y](X,T,ab);if(Z!=null){aa=aa.replace(I.match[Y],"");break}}}}if(!Z){Z=T.getElementsByTagName("*")}return{set:Z,expr:aa}};F.filter=function(ad,ac,ag,W){var V=ad,ai=[],aa=ac,Y,T,Z=ac&&ac[0]&&Q(ac[0]);while(ad&&ac.length){for(var ab in I.filter){if((Y=I.match[ab].exec(ad))!=null){var U=I.filter[ab],ah,af;T=false;if(aa==ai){ai=[]}if(I.preFilter[ab]){Y=I.preFilter[ab](Y,aa,ag,ai,W,Z);if(!Y){T=ah=true}else{if(Y===true){continue}}}if(Y){for(var X=0;(af=aa[X])!=null;X++){if(af){ah=U(af,Y,X,aa);var ae=W^!!ah;if(ag&&ah!=null){if(ae){T=true}else{aa[X]=false}}else{if(ae){ai.push(af);T=true}}}}}if(ah!==g){if(!ag){aa=ai}ad=ad.replace(I.match[ab],"");if(!T){return[]}break}}}if(ad==V){if(T==null){throw"Syntax error, unrecognized expression: "+ad}else{break}}V=ad}return aa};var I=F.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF_-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF_-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*_-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF_-]|\\.)+)(?:\((['"]*)((?:\([^\)]+\)|[^\2\(\)]*)+)\2\))?/},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(T){return T.getAttribute("href")}},relative:{"+":function(aa,T,Z){var X=typeof T==="string",ab=X&&!/\W/.test(T),Y=X&&!ab;if(ab&&!Z){T=T.toUpperCase()}for(var W=0,V=aa.length,U;W<V;W++){if((U=aa[W])){while((U=U.previousSibling)&&U.nodeType!==1){}aa[W]=Y||U&&U.nodeName===T?U||false:U===T}}if(Y){F.filter(T,aa,true)}},">":function(Z,U,aa){var X=typeof U==="string";if(X&&!/\W/.test(U)){U=aa?U:U.toUpperCase();for(var V=0,T=Z.length;V<T;V++){var Y=Z[V];if(Y){var W=Y.parentNode;Z[V]=W.nodeName===U?W:false}}}else{for(var V=0,T=Z.length;V<T;V++){var Y=Z[V];if(Y){Z[V]=X?Y.parentNode:Y.parentNode===U}}if(X){F.filter(U,Z,true)}}},"":function(W,U,Y){var V=L++,T=S;if(!U.match(/\W/)){var X=U=Y?U:U.toUpperCase();T=P}T("parentNode",U,V,W,X,Y)},"~":function(W,U,Y){var V=L++,T=S;if(typeof U==="string"&&!U.match(/\W/)){var X=U=Y?U:U.toUpperCase();T=P}T("previousSibling",U,V,W,X,Y)}},find:{ID:function(U,V,W){if(typeof V.getElementById!=="undefined"&&!W){var T=V.getElementById(U[1]);return T?[T]:[]}},NAME:function(V,Y,Z){if(typeof Y.getElementsByName!=="undefined"){var U=[],X=Y.getElementsByName(V[1]);for(var W=0,T=X.length;W<T;W++){if(X[W].getAttribute("name")===V[1]){U.push(X[W])}}return U.length===0?null:U}},TAG:function(T,U){return U.getElementsByTagName(T[1])}},preFilter:{CLASS:function(W,U,V,T,Z,aa){W=" "+W[1].replace(/\\/g,"")+" ";if(aa){return W}for(var X=0,Y;(Y=U[X])!=null;X++){if(Y){if(Z^(Y.className&&(" "+Y.className+" ").indexOf(W)>=0)){if(!V){T.push(Y)}}else{if(V){U[X]=false}}}}return false},ID:function(T){return T[1].replace(/\\/g,"")},TAG:function(U,T){for(var V=0;T[V]===false;V++){}return T[V]&&Q(T[V])?U[1]:U[1].toUpperCase()},CHILD:function(T){if(T[1]=="nth"){var U=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(T[2]=="even"&&"2n"||T[2]=="odd"&&"2n+1"||!/\D/.test(T[2])&&"0n+"+T[2]||T[2]);T[2]=(U[1]+(U[2]||1))-0;T[3]=U[3]-0}T[0]=L++;return T},ATTR:function(X,U,V,T,Y,Z){var W=X[1].replace(/\\/g,"");if(!Z&&I.attrMap[W]){X[1]=I.attrMap[W]}if(X[2]==="~="){X[4]=" "+X[4]+" "}return X},PSEUDO:function(X,U,V,T,Y){if(X[1]==="not"){if(X[3].match(R).length>1||/^\w/.test(X[3])){X[3]=F(X[3],null,null,U)}else{var W=F.filter(X[3],U,V,true^Y);if(!V){T.push.apply(T,W)}return false}}else{if(I.match.POS.test(X[0])||I.match.CHILD.test(X[0])){return true}}return X},POS:function(T){T.unshift(true);return T}},filters:{enabled:function(T){return T.disabled===false&&T.type!=="hidden"},disabled:function(T){return T.disabled===true},checked:function(T){return T.checked===true},selected:function(T){T.parentNode.selectedIndex;return T.selected===true},parent:function(T){return !!T.firstChild},empty:function(T){return !T.firstChild},has:function(V,U,T){return !!F(T[3],V).length},header:function(T){return/h\d/i.test(T.nodeName)},text:function(T){return"text"===T.type},radio:function(T){return"radio"===T.type},checkbox:function(T){return"checkbox"===T.type},file:function(T){return"file"===T.type},password:function(T){return"password"===T.type},submit:function(T){return"submit"===T.type},image:function(T){return"image"===T.type},reset:function(T){return"reset"===T.type},button:function(T){return"button"===T.type||T.nodeName.toUpperCase()==="BUTTON"},input:function(T){return/input|select|textarea|button/i.test(T.nodeName)}},setFilters:{first:function(U,T){return T===0},last:function(V,U,T,W){return U===W.length-1},even:function(U,T){return T%2===0},odd:function(U,T){return T%2===1},lt:function(V,U,T){return U<T[3]-0},gt:function(V,U,T){return U>T[3]-0},nth:function(V,U,T){return T[3]-0==U},eq:function(V,U,T){return T[3]-0==U}},filter:{PSEUDO:function(Z,V,W,aa){var U=V[1],X=I.filters[U];if(X){return X(Z,W,V,aa)}else{if(U==="contains"){return(Z.textContent||Z.innerText||"").indexOf(V[3])>=0}else{if(U==="not"){var Y=V[3];for(var W=0,T=Y.length;W<T;W++){if(Y[W]===Z){return false}}return true}}}},CHILD:function(T,W){var Z=W[1],U=T;switch(Z){case"only":case"first":while(U=U.previousSibling){if(U.nodeType===1){return false}}if(Z=="first"){return true}U=T;case"last":while(U=U.nextSibling){if(U.nodeType===1){return false}}return true;case"nth":var V=W[2],ac=W[3];if(V==1&&ac==0){return true}var Y=W[0],ab=T.parentNode;if(ab&&(ab.sizcache!==Y||!T.nodeIndex)){var X=0;for(U=ab.firstChild;U;U=U.nextSibling){if(U.nodeType===1){U.nodeIndex=++X}}ab.sizcache=Y}var aa=T.nodeIndex-ac;if(V==0){return aa==0}else{return(aa%V==0&&aa/V>=0)}}},ID:function(U,T){return U.nodeType===1&&U.getAttribute("id")===T},TAG:function(U,T){return(T==="*"&&U.nodeType===1)||U.nodeName===T},CLASS:function(U,T){return(" "+(U.className||U.getAttribute("class"))+" ").indexOf(T)>-1},ATTR:function(Y,W){var V=W[1],T=I.attrHandle[V]?I.attrHandle[V](Y):Y[V]!=null?Y[V]:Y.getAttribute(V),Z=T+"",X=W[2],U=W[4];return T==null?X==="!=":X==="="?Z===U:X==="*="?Z.indexOf(U)>=0:X==="~="?(" "+Z+" ").indexOf(U)>=0:!U?Z&&T!==false:X==="!="?Z!=U:X==="^="?Z.indexOf(U)===0:X==="$="?Z.substr(Z.length-U.length)===U:X==="|="?Z===U||Z.substr(0,U.length+1)===U+"-":false},POS:function(X,U,V,Y){var T=U[2],W=I.setFilters[T];if(W){return W(X,V,U,Y)}}}};var M=I.match.POS;for(var O in I.match){I.match[O]=RegExp(I.match[O].source+/(?![^\[]*\])(?![^\(]*\))/.source)}var E=function(U,T){U=Array.prototype.slice.call(U);if(T){T.push.apply(T,U);return T}return U};try{Array.prototype.slice.call(document.documentElement.childNodes)}catch(N){E=function(X,W){var U=W||[];if(H.call(X)==="[object Array]"){Array.prototype.push.apply(U,X)}else{if(typeof X.length==="number"){for(var V=0,T=X.length;V<T;V++){U.push(X[V])}}else{for(var V=0;X[V];V++){U.push(X[V])}}}return U}}var G;if(document.documentElement.compareDocumentPosition){G=function(U,T){var V=U.compareDocumentPosition(T)&4?-1:U===T?0:1;if(V===0){hasDuplicate=true}return V}}else{if("sourceIndex" in document.documentElement){G=function(U,T){var V=U.sourceIndex-T.sourceIndex;if(V===0){hasDuplicate=true}return V}}else{if(document.createRange){G=function(W,U){var V=W.ownerDocument.createRange(),T=U.ownerDocument.createRange();V.selectNode(W);V.collapse(true);T.selectNode(U);T.collapse(true);var X=V.compareBoundaryPoints(Range.START_TO_END,T);if(X===0){hasDuplicate=true}return X}}}}(function(){var U=document.createElement("form"),V="script"+(new Date).getTime();U.innerHTML="<input name='"+V+"'/>";var T=document.documentElement;T.insertBefore(U,T.firstChild);if(!!document.getElementById(V)){I.find.ID=function(X,Y,Z){if(typeof Y.getElementById!=="undefined"&&!Z){var W=Y.getElementById(X[1]);return W?W.id===X[1]||typeof W.getAttributeNode!=="undefined"&&W.getAttributeNode("id").nodeValue===X[1]?[W]:g:[]}};I.filter.ID=function(Y,W){var X=typeof Y.getAttributeNode!=="undefined"&&Y.getAttributeNode("id");return Y.nodeType===1&&X&&X.nodeValue===W}}T.removeChild(U)})();(function(){var T=document.createElement("div");T.appendChild(document.createComment(""));if(T.getElementsByTagName("*").length>0){I.find.TAG=function(U,Y){var X=Y.getElementsByTagName(U[1]);if(U[1]==="*"){var W=[];for(var V=0;X[V];V++){if(X[V].nodeType===1){W.push(X[V])}}X=W}return X}}T.innerHTML="<a href='#'></a>";if(T.firstChild&&typeof T.firstChild.getAttribute!=="undefined"&&T.firstChild.getAttribute("href")!=="#"){I.attrHandle.href=function(U){return U.getAttribute("href",2)}}})();if(document.querySelectorAll){(function(){var T=F,U=document.createElement("div");U.innerHTML="<p class='TEST'></p>";if(U.querySelectorAll&&U.querySelectorAll(".TEST").length===0){return}F=function(Y,X,V,W){X=X||document;if(!W&&X.nodeType===9&&!Q(X)){try{return E(X.querySelectorAll(Y),V)}catch(Z){}}return T(Y,X,V,W)};F.find=T.find;F.filter=T.filter;F.selectors=T.selectors;F.matches=T.matches})()}if(document.getElementsByClassName&&document.documentElement.getElementsByClassName){(function(){var T=document.createElement("div");T.innerHTML="<div class='test e'></div><div class='test'></div>";if(T.getElementsByClassName("e").length===0){return}T.lastChild.className="e";if(T.getElementsByClassName("e").length===1){return}I.order.splice(1,0,"CLASS");I.find.CLASS=function(U,V,W){if(typeof V.getElementsByClassName!=="undefined"&&!W){return V.getElementsByClassName(U[1])}}})()}function P(U,Z,Y,ad,aa,ac){var ab=U=="previousSibling"&&!ac;for(var W=0,V=ad.length;W<V;W++){var T=ad[W];if(T){if(ab&&T.nodeType===1){T.sizcache=Y;T.sizset=W}T=T[U];var X=false;while(T){if(T.sizcache===Y){X=ad[T.sizset];break}if(T.nodeType===1&&!ac){T.sizcache=Y;T.sizset=W}if(T.nodeName===Z){X=T;break}T=T[U]}ad[W]=X}}}function S(U,Z,Y,ad,aa,ac){var ab=U=="previousSibling"&&!ac;for(var W=0,V=ad.length;W<V;W++){var T=ad[W];if(T){if(ab&&T.nodeType===1){T.sizcache=Y;T.sizset=W}T=T[U];var X=false;while(T){if(T.sizcache===Y){X=ad[T.sizset];break}if(T.nodeType===1){if(!ac){T.sizcache=Y;T.sizset=W}if(typeof Z!=="string"){if(T===Z){X=true;break}}else{if(F.filter(Z,[T]).length>0){X=T;break}}}T=T[U]}ad[W]=X}}}var K=document.compareDocumentPosition?function(U,T){return U.compareDocumentPosition(T)&16}:function(U,T){return U!==T&&(U.contains?U.contains(T):true)};var Q=function(T){return T.nodeType===9&&T.documentElement.nodeName!=="HTML"||!!T.ownerDocument&&Q(T.ownerDocument)};var J=function(T,aa){var W=[],X="",Y,V=aa.nodeType?[aa]:aa;while((Y=I.match.PSEUDO.exec(T))){X+=Y[0];T=T.replace(I.match.PSEUDO,"")}T=I.relative[T]?T+"*":T;for(var Z=0,U=V.length;Z<U;Z++){F(T,V[Z],W)}return F.filter(X,W)};o.find=F;o.filter=F.filter;o.expr=F.selectors;o.expr[":"]=o.expr.filters;F.selectors.filters.hidden=function(T){return T.offsetWidth===0||T.offsetHeight===0};F.selectors.filters.visible=function(T){return T.offsetWidth>0||T.offsetHeight>0};F.selectors.filters.animated=function(T){return o.grep(o.timers,function(U){return T===U.elem}).length};o.multiFilter=function(V,T,U){if(U){V=":not("+V+")"}return F.matches(V,T)};o.dir=function(V,U){var T=[],W=V[U];while(W&&W!=document){if(W.nodeType==1){T.push(W)}W=W[U]}return T};o.nth=function(X,T,V,W){T=T||1;var U=0;for(;X;X=X[V]){if(X.nodeType==1&&++U==T){break}}return X};o.sibling=function(V,U){var T=[];for(;V;V=V.nextSibling){if(V.nodeType==1&&V!=U){T.push(V)}}return T};return;l.Sizzle=F})();o.event={add:function(I,F,H,K){if(I.nodeType==3||I.nodeType==8){return}if(I.setInterval&&I!=l){I=l}if(!H.guid){H.guid=this.guid++}if(K!==g){var G=H;H=this.proxy(G);H.data=K}var E=o.data(I,"events")||o.data(I,"events",{}),J=o.data(I,"handle")||o.data(I,"handle",function(){return typeof o!=="undefined"&&!o.event.triggered?o.event.handle.apply(arguments.callee.elem,arguments):g});J.elem=I;o.each(F.split(/\s+/),function(M,N){var O=N.split(".");N=O.shift();H.type=O.slice().sort().join(".");var L=E[N];if(o.event.specialAll[N]){o.event.specialAll[N].setup.call(I,K,O)}if(!L){L=E[N]={};if(!o.event.special[N]||o.event.special[N].setup.call(I,K,O)===false){if(I.addEventListener){I.addEventListener(N,J,false)}else{if(I.attachEvent){I.attachEvent("on"+N,J)}}}}L[H.guid]=H;o.event.global[N]=true});I=null},guid:1,global:{},remove:function(K,H,J){if(K.nodeType==3||K.nodeType==8){return}var G=o.data(K,"events"),F,E;if(G){if(H===g||(typeof H==="string"&&H.charAt(0)==".")){for(var I in G){this.remove(K,I+(H||""))}}else{if(H.type){J=H.handler;H=H.type}o.each(H.split(/\s+/),function(M,O){var Q=O.split(".");O=Q.shift();var N=RegExp("(^|\\.)"+Q.slice().sort().join(".*\\.")+"(\\.|$)");if(G[O]){if(J){delete G[O][J.guid]}else{for(var P in G[O]){if(N.test(G[O][P].type)){delete G[O][P]}}}if(o.event.specialAll[O]){o.event.specialAll[O].teardown.call(K,Q)}for(F in G[O]){break}if(!F){if(!o.event.special[O]||o.event.special[O].teardown.call(K,Q)===false){if(K.removeEventListener){K.removeEventListener(O,o.data(K,"handle"),false)}else{if(K.detachEvent){K.detachEvent("on"+O,o.data(K,"handle"))}}}F=null;delete G[O]}}})}for(F in G){break}if(!F){var L=o.data(K,"handle");if(L){L.elem=null}o.removeData(K,"events");o.removeData(K,"handle")}}},trigger:function(I,K,H,E){var G=I.type||I;if(!E){I=typeof I==="object"?I[h]?I:o.extend(o.Event(G),I):o.Event(G);if(G.indexOf("!")>=0)
+{I.type=G=G.slice(0,-1);I.exclusive=true}if(!H){I.stopPropagation();if(this.global[G]){o.each(o.cache,function(){if(this.events&&this.events[G]){o.event.trigger(I,K,this.handle.elem)}})}}if(!H||H.nodeType==3||H.nodeType==8){return g}I.result=g;I.target=H;K=o.makeArray(K);K.unshift(I)}I.currentTarget=H;var J=o.data(H,"handle");if(J){J.apply(H,K)}if((!H[G]||(o.nodeName(H,"a")&&G=="click"))&&H["on"+G]&&H["on"+G].apply(H,K)===false){I.result=false}if(!E&&H[G]&&!I.isDefaultPrevented()&&!(o.nodeName(H,"a")&&G=="click")){this.triggered=true;try{H[G]()}catch(L){}}this.triggered=false;if(!I.isPropagationStopped()){var F=H.parentNode||H.ownerDocument;if(F){o.event.trigger(I,K,F,true)}}},handle:function(K){var J,E;K=arguments[0]=o.event.fix(K||l.event);K.currentTarget=this;var L=K.type.split(".");K.type=L.shift();J=!L.length&&!K.exclusive;var I=RegExp("(^|\\.)"+L.slice().sort().join(".*\\.")+"(\\.|$)");E=(o.data(this,"events")||{})[K.type];for(var G in E){var H=E[G];if(J||I.test(H.type)){K.handler=H;K.data=H.data;var F=H.apply(this,arguments);if(F!==g){K.result=F;if(F===false){K.preventDefault();K.stopPropagation()}}if(K.isImmediatePropagationStopped()){break}}}},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(H){if(H[h]){return H}var F=H;H=o.Event(F);for(var G=this.props.length,J;G;){J=this.props[--G];H[J]=F[J]}if(!H.target){H.target=H.srcElement||document}if(H.target.nodeType==3){H.target=H.target.parentNode}if(!H.relatedTarget&&H.fromElement){H.relatedTarget=H.fromElement==H.target?H.toElement:H.fromElement}if(H.pageX==null&&H.clientX!=null){var I=document.documentElement,E=document.body;H.pageX=H.clientX+(I&&I.scrollLeft||E&&E.scrollLeft||0)-(I.clientLeft||0);H.pageY=H.clientY+(I&&I.scrollTop||E&&E.scrollTop||0)-(I.clientTop||0)}if(!H.which&&((H.charCode||H.charCode===0)?H.charCode:H.keyCode)){H.which=H.charCode||H.keyCode}if(!H.metaKey&&H.ctrlKey){H.metaKey=H.ctrlKey}if(!H.which&&H.button){H.which=(H.button&1?1:(H.button&2?3:(H.button&4?2:0)))}return H},proxy:function(F,E){E=E||function(){return F.apply(this,arguments)};E.guid=F.guid=F.guid||E.guid||this.guid++;return E},special:{ready:{setup:B,teardown:function(){}}},specialAll:{live:{setup:function(E,F){o.event.add(this,F[0],c)},teardown:function(G){if(G.length){var E=0,F=RegExp("(^|\\.)"+G[0]+"(\\.|$)");o.each((o.data(this,"events").live||{}),function(){if(F.test(this.type)){E++}});if(E<1){o.event.remove(this,G[0],c)}}}}}};o.Event=function(E){if(!this.preventDefault){return new o.Event(E)}if(E&&E.type){this.originalEvent=E;this.type=E.type}else{this.type=E}this.timeStamp=e();this[h]=true};function k(){return false}function u(){return true}o.Event.prototype={preventDefault:function(){this.isDefaultPrevented=u;var E=this.originalEvent;if(!E){return}if(E.preventDefault){E.preventDefault()}E.returnValue=false},stopPropagation:function(){this.isPropagationStopped=u;var E=this.originalEvent;if(!E){return}if(E.stopPropagation){E.stopPropagation()}E.cancelBubble=true},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=u;this.stopPropagation()},isDefaultPrevented:k,isPropagationStopped:k,isImmediatePropagationStopped:k};var a=function(F){var E=F.relatedTarget;while(E&&E!=this){try{E=E.parentNode}catch(G){E=this}}if(E!=this){F.type=F.data;o.event.handle.apply(this,arguments)}};o.each({mouseover:"mouseenter",mouseout:"mouseleave"},function(F,E){o.event.special[E]={setup:function(){o.event.add(this,F,a,E)},teardown:function(){o.event.remove(this,F,a)}}});o.fn.extend({bind:function(F,G,E){return F=="unload"?this.one(F,G,E):this.each(function(){o.event.add(this,F,E||G,E&&G)})},one:function(G,H,F){var E=o.event.proxy(F||H,function(I){o(this).unbind(I,E);return(F||H).apply(this,arguments)});return this.each(function(){o.event.add(this,G,E,F&&H)})},unbind:function(F,E){return this.each(function(){o.event.remove(this,F,E)})},trigger:function(E,F){return this.each(function(){o.event.trigger(E,F,this)})},triggerHandler:function(E,G){if(this[0]){var F=o.Event(E);F.preventDefault();F.stopPropagation();o.event.trigger(F,G,this[0]);return F.result}},toggle:function(G){var E=arguments,F=1;while(F<E.length){o.event.proxy(G,E[F++])}return this.click(o.event.proxy(G,function(H){this.lastToggle=(this.lastToggle||0)%F;H.preventDefault();return E[this.lastToggle++].apply(this,arguments)||false}))},hover:function(E,F){return this.mouseenter(E).mouseleave(F)},ready:function(E){B();if(o.isReady){E.call(document,o)}else{o.readyList.push(E)}return this},live:function(G,F){var E=o.event.proxy(F);E.guid+=this.selector+G;o(document).bind(i(G,this.selector),this.selector,E);return this},die:function(F,E){o(document).unbind(i(F,this.selector),E?{guid:E.guid+this.selector+F}:null);return this}});function c(H){var E=RegExp("(^|\\.)"+H.type+"(\\.|$)"),G=true,F=[];o.each(o.data(this,"events").live||[],function(I,J){if(E.test(J.type)){var K=o(H.target).closest(J.data)[0];if(K){F.push({elem:K,fn:J})}}});F.sort(function(J,I){return o.data(J.elem,"closest")-o.data(I.elem,"closest")});o.each(F,function(){if(this.fn.call(this.elem,H,this.fn.data)===false){return(G=false)}});return G}function i(F,E){return["live",F,E.replace(/\./g,"`").replace(/ /g,"|")].join(".")}o.extend({isReady:false,readyList:[],ready:function(){if(!o.isReady){o.isReady=true;if(o.readyList){o.each(o.readyList,function(){this.call(document,o)});o.readyList=null}o(document).triggerHandler("ready")}}});var x=false;function B(){if(x){return}x=true;if(document.addEventListener){document.addEventListener("DOMContentLoaded",function(){document.removeEventListener("DOMContentLoaded",arguments.callee,false);o.ready()},false)}else{if(document.attachEvent){document.attachEvent("onreadystatechange",function(){if(document.readyState==="complete"){document.detachEvent("onreadystatechange",arguments.callee);o.ready()}});if(document.documentElement.doScroll&&l==l.top){(function(){if(o.isReady){return}try{document.documentElement.doScroll("left")}catch(E){setTimeout(arguments.callee,0);return}o.ready()})()}}}o.event.add(l,"load",o.ready)}o.each(("blur,focus,load,resize,scroll,unload,click,dblclick,mousedown,mouseup,mousemove,mouseover,mouseout,mouseenter,mouseleave,change,select,submit,keydown,keypress,keyup,error").split(","),function(F,E){o.fn[E]=function(G){return G?this.bind(E,G):this.trigger(E)}});o(l).bind("unload",function(){for(var E in o.cache){if(E!=1&&o.cache[E].handle){o.event.remove(o.cache[E].handle.elem)}}});(function(){o.support={};var F=document.documentElement,G=document.createElement("script"),K=document.createElement("div"),J="script"+(new Date).getTime();K.style.display="none";K.innerHTML='   <link/><table></table><a href="/a" style="color:red;float:left;opacity:.5;">a</a><select><option>text</option></select><object><param/></object>';var H=K.getElementsByTagName("*"),E=K.getElementsByTagName("a")[0];if(!H||!H.length||!E){return}o.support={leadingWhitespace:K.firstChild.nodeType==3,tbody:!K.getElementsByTagName("tbody").length,objectAll:!!K.getElementsByTagName("object")[0].getElementsByTagName("*").length,htmlSerialize:!!K.getElementsByTagName("link").length,style:/red/.test(E.getAttribute("style")),hrefNormalized:E.getAttribute("href")==="/a",opacity:E.style.opacity==="0.5",cssFloat:!!E.style.cssFloat,scriptEval:false,noCloneEvent:true,boxModel:null};G.type="text/javascript";try{G.appendChild(document.createTextNode("window."+J+"=1;"))}catch(I){}F.insertBefore(G,F.firstChild);if(l[J]){o.support.scriptEval=true;delete l[J]}F.removeChild(G);if(K.attachEvent&&K.fireEvent){K.attachEvent("onclick",function(){o.support.noCloneEvent=false;K.detachEvent("onclick",arguments.callee)});K.cloneNode(true).fireEvent("onclick")}o(function(){var L=document.createElement("div");L.style.width=L.style.paddingLeft="1px";document.body.appendChild(L);o.boxModel=o.support.boxModel=L.offsetWidth===2;document.body.removeChild(L).style.display="none"})})();var w=o.support.cssFloat?"cssFloat":"styleFloat";o.props={"for":"htmlFor","class":"className","float":w,cssFloat:w,styleFloat:w,readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",tabindex:"tabIndex"};o.fn.extend({_load:o.fn.load,load:function(G,J,K){if(typeof G!=="string"){return this._load(G)}var I=G.indexOf(" ");if(I>=0){var E=G.slice(I,G.length);G=G.slice(0,I)}var H="GET";if(J){if(o.isFunction(J)){K=J;J=null}else{if(typeof J==="object"){J=o.param(J);H="POST"}}}var F=this;o.ajax({url:G,type:H,dataType:"html",data:J,complete:function(M,L){if(L=="success"||L=="notmodified"){F.html(E?o("<div/>").append(M.responseText.replace(/<script(.|\s)*?\/script>/g,"")).find(E):M.responseText)}if(K){F.each(K,[M.responseText,L,M])}}});return this},serialize:function(){return o.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?o.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password|search/i.test(this.type))}).map(function(E,F){var G=o(this).val();return G==null?null:o.isArray(G)?o.map(G,function(I,H){return{name:F.name,value:I}}):{name:F.name,value:G}}).get()}});o.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(E,F){o.fn[F]=function(G){return this.bind(F,G)}});var r=e();o.extend({get:function(E,G,H,F){if(o.isFunction(G)){H=G;G=null}return o.ajax({type:"GET",url:E,data:G,success:H,dataType:F})},getScript:function(E,F){return o.get(E,null,F,"script")},getJSON:function(E,F,G){return o.get(E,F,G,"json")},post:function(E,G,H,F){if(o.isFunction(G)){H=G;G={}}return o.ajax({type:"POST",url:E,data:G,success:H,dataType:F})},ajaxSetup:function(E){o.extend(o.ajaxSettings,E)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return l.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest()},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(M){M=o.extend(true,M,o.extend(true,{},o.ajaxSettings,M));var W,F=/=\?(&|$)/g,R,V,G=M.type.toUpperCase();if(M.data&&M.processData&&typeof M.data!=="string"){M.data=o.param(M.data)}if(M.dataType=="jsonp"){if(G=="GET"){if(!M.url.match(F)){M.url+=(M.url.match(/\?/)?"&":"?")+(M.jsonp||"callback")+"=?"}}else{if(!M.data||!M.data.match(F)){M.data=(M.data?M.data+"&":"")+(M.jsonp||"callback")+"=?"}}M.dataType="json"}if(M.dataType=="json"&&(M.data&&M.data.match(F)||M.url.match(F))){W="jsonp"+r++;if(M.data){M.data=(M.data+"").replace(F,"="+W+"$1")}M.url=M.url.replace(F,"="+W+"$1");M.dataType="script";l[W]=function(X){V=X;I();L();l[W]=g;try{delete l[W]}catch(Y){}if(H){H.removeChild(T)}}}if(M.dataType=="script"&&M.cache==null){M.cache=false}if(M.cache===false&&G=="GET"){var E=e();var U=M.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+E+"$2");M.url=U+((U==M.url)?(M.url.match(/\?/)?"&":"?")+"_="+E:"")}if(M.data&&G=="GET"){M.url+=(M.url.match(/\?/)?"&":"?")+M.data;M.data=null}if(M.global&&!o.active++){o.event.trigger("ajaxStart")}var Q=/^(\w+:)?\/\/([^\/?#]+)/.exec(M.url);if(M.dataType=="script"&&G=="GET"&&Q&&(Q[1]&&Q[1]!=location.protocol||Q[2]!=location.host)){var H=document.getElementsByTagName("head")[0];var T=document.createElement("script");T.src=M.url;if(M.scriptCharset){T.charset=M.scriptCharset}if(!W){var O=false;T.onload=T.onreadystatechange=function(){if(!O&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){O=true;I();L();T.onload=T.onreadystatechange=null;H.removeChild(T)}}}H.appendChild(T);return g}var K=false;var J=M.xhr();if(M.username){J.open(G,M.url,M.async,M.username,M.password)}else{J.open(G,M.url,M.async)}try{if(M.data){J.setRequestHeader("Content-Type",M.contentType)}if(M.ifModified){J.setRequestHeader("If-Modified-Since",o.lastModified[M.url]||"Thu, 01 Jan 1970 00:00:00 GMT")}J.setRequestHeader("X-Requested-With","XMLHttpRequest");J.setRequestHeader("Accept",M.dataType&&M.accepts[M.dataType]?M.accepts[M.dataType]+", */*":M.accepts._default)}catch(S){}if(M.beforeSend&&M.beforeSend(J,M)===false){if(M.global&&!--o.active){o.event.trigger("ajaxStop")}J.abort();return false}if(M.global){o.event.trigger("ajaxSend",[J,M])}var N=function(X){if(J.readyState==0){if(P){clearInterval(P);P=null;if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}}else{if(!K&&J&&(J.readyState==4||X=="timeout")){K=true;if(P){clearInterval(P);P=null}R=X=="timeout"?"timeout":!o.httpSuccess(J)?"error":M.ifModified&&o.httpNotModified(J,M.url)?"notmodified":"success";if(R=="success"){try{V=o.httpData(J,M.dataType,M)}catch(Z){R="parsererror"}}if(R=="success"){var Y;try{Y=J.getResponseHeader("Last-Modified")}catch(Z){}if(M.ifModified&&Y){o.lastModified[M.url]=Y}if(!W){I()}}else{o.handleError(M,J,R)}L();if(X){J.abort()}if(M.async){J=null}}}};if(M.async){var P=setInterval(N,13);if(M.timeout>0){setTimeout(function(){if(J&&!K){N("timeout")}},M.timeout)}}try{J.send(M.data)}catch(S){o.handleError(M,J,null,S)}if(!M.async){N()}function I(){if(M.success){M.success(V,R)}if(M.global){o.event.trigger("ajaxSuccess",[J,M])}}function L(){if(M.complete){M.complete(J,R)}if(M.global){o.event.trigger("ajaxComplete",[J,M])}if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}return J},handleError:function(F,H,E,G){if(F.error){F.error(H,E,G)}if(F.global){o.event.trigger("ajaxError",[H,F,G])}},active:0,httpSuccess:function(F){try{return !F.status&&location.protocol=="file:"||(F.status>=200&&F.status<300)||F.status==304||F.status==1223}catch(E){}return false},httpNotModified:function(G,E){try{var H=G.getResponseHeader("Last-Modified");return G.status==304||H==o.lastModified[E]}catch(F){}return false},httpData:function(J,H,G){var F=J.getResponseHeader("content-type"),E=H=="xml"||!H&&F&&F.indexOf("xml")>=0,I=E?J.responseXML:J.responseText;if(E&&I.documentElement.tagName=="parsererror"){throw"parsererror"}if(G&&G.dataFilter){I=G.dataFilter(I,H)}if(typeof I==="string"){if(H=="script"){o.globalEval(I)}if(H=="json"){I=l["eval"]("("+I+")")}}return I},param:function(E){var G=[];function H(I,J){G[G.length]=encodeURIComponent(I)+"="+encodeURIComponent(J)}if(o.isArray(E)||E.jquery){o.each(E,function(){H(this.name,this.value)})}else{for(var F in E){if(o.isArray(E[F])){o.each(E[F],function(){H(F,this)})}else{H(F,o.isFunction(E[F])?E[F]():E[F])}}}return G.join("&").replace(/%20/g,"+")}});var m={},n,d=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];function t(F,E){var G={};o.each(d.concat.apply([],d.slice(0,E)),function()
+{G[this]=F});return G}o.fn.extend({show:function(J,L){if(J){return this.animate(t("show",3),J,L)}else{for(var H=0,F=this.length;H<F;H++){var E=o.data(this[H],"olddisplay");this[H].style.display=E||"";if(o.css(this[H],"display")==="none"){var G=this[H].tagName,K;if(m[G]){K=m[G]}else{var I=o("<"+G+" />").appendTo("body");K=I.css("display");if(K==="none"){K="block"}I.remove();m[G]=K}o.data(this[H],"olddisplay",K)}}for(var H=0,F=this.length;H<F;H++){this[H].style.display=o.data(this[H],"olddisplay")||""}return this}},hide:function(H,I){if(H){return this.animate(t("hide",3),H,I)}else{for(var G=0,F=this.length;G<F;G++){var E=o.data(this[G],"olddisplay");if(!E&&E!=="none"){o.data(this[G],"olddisplay",o.css(this[G],"display"))}}for(var G=0,F=this.length;G<F;G++){this[G].style.display="none"}return this}},_toggle:o.fn.toggle,toggle:function(G,F){var E=typeof G==="boolean";return o.isFunction(G)&&o.isFunction(F)?this._toggle.apply(this,arguments):G==null||E?this.each(function(){var H=E?G:o(this).is(":hidden");o(this)[H?"show":"hide"]()}):this.animate(t("toggle",3),G,F)},fadeTo:function(E,G,F){return this.animate({opacity:G},E,F)},animate:function(I,F,H,G){var E=o.speed(F,H,G);return this[E.queue===false?"each":"queue"](function(){var K=o.extend({},E),M,L=this.nodeType==1&&o(this).is(":hidden"),J=this;for(M in I){if(I[M]=="hide"&&L||I[M]=="show"&&!L){return K.complete.call(this)}if((M=="height"||M=="width")&&this.style){K.display=o.css(this,"display");K.overflow=this.style.overflow}}if(K.overflow!=null){this.style.overflow="hidden"}K.curAnim=o.extend({},I);o.each(I,function(O,S){var R=new o.fx(J,K,O);if(/toggle|show|hide/.test(S)){R[S=="toggle"?L?"show":"hide":S](I)}else{var Q=S.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),T=R.cur(true)||0;if(Q){var N=parseFloat(Q[2]),P=Q[3]||"px";if(P!="px"){J.style[O]=(N||1)+P;T=((N||1)/R.cur(true))*T;J.style[O]=T+P}if(Q[1]){N=((Q[1]=="-="?-1:1)*N)+T}R.custom(T,N,P)}else{R.custom(T,S,"")}}});return true})},stop:function(F,E){var G=o.timers;if(F){this.queue([])}this.each(function(){for(var H=G.length-1;H>=0;H--){if(G[H].elem==this){if(E){G[H](true)}G.splice(H,1)}}});if(!E){this.dequeue()}return this}});o.each({slideDown:t("show",1),slideUp:t("hide",1),slideToggle:t("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(E,F){o.fn[E]=function(G,H){return this.animate(F,G,H)}});o.extend({speed:function(G,H,F){var E=typeof G==="object"?G:{complete:F||!F&&H||o.isFunction(G)&&G,duration:G,easing:F&&H||H&&!o.isFunction(H)&&H};E.duration=o.fx.off?0:typeof E.duration==="number"?E.duration:o.fx.speeds[E.duration]||o.fx.speeds._default;E.old=E.complete;E.complete=function(){if(E.queue!==false){o(this).dequeue()}if(o.isFunction(E.old)){E.old.call(this)}};return E},easing:{linear:function(G,H,E,F){return E+F*G},swing:function(G,H,E,F){return((-Math.cos(G*Math.PI)/2)+0.5)*F+E}},timers:[],fx:function(F,E,G){this.options=E;this.elem=F;this.prop=G;if(!E.orig){E.orig={}}}});o.fx.prototype={update:function(){if(this.options.step){this.options.step.call(this.elem,this.now,this)}(o.fx.step[this.prop]||o.fx.step._default)(this);if((this.prop=="height"||this.prop=="width")&&this.elem.style){this.elem.style.display="block"}},cur:function(F){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null)){return this.elem[this.prop]}var E=parseFloat(o.css(this.elem,this.prop,F));return E&&E>-10000?E:parseFloat(o.curCSS(this.elem,this.prop))||0},custom:function(I,H,G){this.startTime=e();this.start=I;this.end=H;this.unit=G||this.unit||"px";this.now=this.start;this.pos=this.state=0;var E=this;function F(J){return E.step(J)}F.elem=this.elem;if(F()&&o.timers.push(F)&&!n){n=setInterval(function(){var K=o.timers;for(var J=0;J<K.length;J++){if(!K[J]()){K.splice(J--,1)}}if(!K.length){clearInterval(n);n=g}},13)}},show:function(){this.options.orig[this.prop]=o.attr(this.elem.style,this.prop);this.options.show=true;this.custom(this.prop=="width"||this.prop=="height"?1:0,this.cur());o(this.elem).show()},hide:function(){this.options.orig[this.prop]=o.attr(this.elem.style,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(H){var G=e();if(H||G>=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var E=true;for(var F in this.options.curAnim){if(this.options.curAnim[F]!==true){E=false}}if(E){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(o.css(this.elem,"display")=="none"){this.elem.style.display="block"}}if(this.options.hide){o(this.elem).hide()}if(this.options.hide||this.options.show){for(var I in this.options.curAnim){o.attr(this.elem.style,I,this.options.orig[I])}}this.options.complete.call(this.elem)}return false}else{var J=G-this.startTime;this.state=J/this.options.duration;this.pos=o.easing[this.options.easing||(o.easing.swing?"swing":"linear")](this.state,J,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update()}return true}};o.extend(o.fx,{speeds:{slow:600,fast:200,_default:400},step:{opacity:function(E){o.attr(E.elem.style,"opacity",E.now)},_default:function(E){if(E.elem.style&&E.elem.style[E.prop]!=null){E.elem.style[E.prop]=E.now+E.unit}else{E.elem[E.prop]=E.now}}}});if(document.documentElement.getBoundingClientRect){o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}var G=this[0].getBoundingClientRect(),J=this[0].ownerDocument,F=J.body,E=J.documentElement,L=E.clientTop||F.clientTop||0,K=E.clientLeft||F.clientLeft||0,I=G.top+(self.pageYOffset||o.boxModel&&E.scrollTop||F.scrollTop)-L,H=G.left+(self.pageXOffset||o.boxModel&&E.scrollLeft||F.scrollLeft)-K;return{top:I,left:H}}}else{o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}o.offset.initialized||o.offset.initialize();var J=this[0],G=J.offsetParent,F=J,O=J.ownerDocument,M,H=O.documentElement,K=O.body,L=O.defaultView,E=L.getComputedStyle(J,null),N=J.offsetTop,I=J.offsetLeft;while((J=J.parentNode)&&J!==K&&J!==H){M=L.getComputedStyle(J,null);N-=J.scrollTop,I-=J.scrollLeft;if(J===G){N+=J.offsetTop,I+=J.offsetLeft;if(o.offset.doesNotAddBorder&&!(o.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(J.tagName))){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}F=G,G=J.offsetParent}if(o.offset.subtractsBorderForOverflowNotVisible&&M.overflow!=="visible"){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}E=M}if(E.position==="relative"||E.position==="static"){N+=K.offsetTop,I+=K.offsetLeft}if(E.position==="fixed"){N+=Math.max(H.scrollTop,K.scrollTop),I+=Math.max(H.scrollLeft,K.scrollLeft)}return{top:N,left:I}}}o.offset={initialize:function(){if(this.initialized){return}var L=document.body,F=document.createElement("div"),H,G,N,I,M,E,J=L.style.marginTop,K='<div style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;"><div></div></div><table style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;" cellpadding="0" cellspacing="0"><tr><td></td></tr></table>';M={position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"};for(E in M){F.style[E]=M[E]}F.innerHTML=K;L.insertBefore(F,L.firstChild);H=F.firstChild,G=H.firstChild,I=H.nextSibling.firstChild.firstChild;this.doesNotAddBorder=(G.offsetTop!==5);this.doesAddBorderForTableAndCells=(I.offsetTop===5);H.style.overflow="hidden",H.style.position="relative";this.subtractsBorderForOverflowNotVisible=(G.offsetTop===-5);L.style.marginTop="1px";this.doesNotIncludeMarginInBodyOffset=(L.offsetTop===0);L.style.marginTop=J;L.removeChild(F);this.initialized=true},bodyOffset:function(E){o.offset.initialized||o.offset.initialize();var G=E.offsetTop,F=E.offsetLeft;if(o.offset.doesNotIncludeMarginInBodyOffset){G+=parseInt(o.curCSS(E,"marginTop",true),10)||0,F+=parseInt(o.curCSS(E,"marginLeft",true),10)||0}return{top:G,left:F}}};o.fn.extend({position:function(){var I=0,H=0,F;if(this[0]){var G=this.offsetParent(),J=this.offset(),E=/^body|html$/i.test(G[0].tagName)?{top:0,left:0}:G.offset();J.top-=j(this,"marginTop");J.left-=j(this,"marginLeft");E.top+=j(G,"borderTopWidth");E.left+=j(G,"borderLeftWidth");F={top:J.top-E.top,left:J.left-E.left}}return F},offsetParent:function(){var E=this[0].offsetParent||document.body;while(E&&(!/^body|html$/i.test(E.tagName)&&o.css(E,"position")=="static")){E=E.offsetParent}return o(E)}});o.each(["Left","Top"],function(F,E){var G="scroll"+E;o.fn[G]=function(H){if(!this[0]){return null}return H!==g?this.each(function(){this==l||this==document?l.scrollTo(!F?H:o(l).scrollLeft(),F?H:o(l).scrollTop()):this[G]=H}):this[0]==l||this[0]==document?self[F?"pageYOffset":"pageXOffset"]||o.boxModel&&document.documentElement[G]||document.body[G]:this[0][G]}});o.each(["Height","Width"],function(I,G){var E=I?"Left":"Top",H=I?"Right":"Bottom",F=G.toLowerCase();o.fn["inner"+G]=function(){return this[0]?o.css(this[0],F,false,"padding"):null};o.fn["outer"+G]=function(K){return this[0]?o.css(this[0],F,false,K?"margin":"border"):null};var J=G.toLowerCase();o.fn[J]=function(K){return this[0]==l?document.compatMode=="CSS1Compat"&&document.documentElement["client"+G]||document.body["client"+G]:this[0]==document?Math.max(document.documentElement["client"+G],document.body["scroll"+G],document.documentElement["scroll"+G],document.body["offset"+G],document.documentElement["offset"+G]):K===g?(this.length?o.css(this[0],J):null):this.css(J,typeof K==="string"?K:K+"px")}})})();
+
+/*
+ * jQuery hashchange event - v1.3 - 7/21/2010
+ * http://benalman.com/projects/jquery-hashchange-plugin/
+ * 
+ * Copyright (c) 2010 "Cowboy" Ben Alman
+ * Dual licensed under the MIT and GPL licenses.
+ * http://benalman.com/about/license/
+ */
+(function($,e,b){var c="hashchange",h=document,f,g=$.event.special,i=h.documentMode,d="on"+c in e&&(i===b||i>7);function a(j){j=j||location.href;return"#"+j.replace(/^[^#]*#?(.*)$/,"$1")}$.fn[c]=function(j){return j?this.bind(c,j):this.trigger(c)};$.fn[c].delay=50;g[c]=$.extend(g[c],{setup:function(){if(d){return false}$(f.start)},teardown:function(){if(d){return false}$(f.stop)}});f=(function(){var j={},p,m=a(),k=function(q){return q},l=k,o=k;j.start=function(){p||n()};j.stop=function(){p&&clearTimeout(p);p=b};function n(){var r=a(),q=o(m);if(r!==m){l(m=r,q);$(e).trigger(c)}else{if(q!==m){location.href=location.href.replace(/#.*/,"")+q}}p=setTimeout(n,$.fn[c].delay)}$.browser.msie&&!d&&(function(){var q,r;j.start=function(){if(!q){r=$.fn[c].src;r=r&&r+a();q=$('<iframe tabindex="-1" title="empty"/>').hide().one("load",function(){r||l(a());n()}).attr("src",r||"javascript:0").insertAfter("body")[0].contentWindow;h.onpropertychange=function(){try{if(event.propertyName==="title"){q.document.title=h.title}}catch(s){}}}};j.stop=k;o=function(){return a(q.location.href)};l=function(v,s){var u=q.document,t=$.fn[c].domain;if(v!==s){u.title=h.title;u.open();t&&u.write('<script>document.domain="'+t+'"<\/script>');u.close();q.location.hash=v}}})();return j})()})(jQuery,this);
+/*
+ * jQuery UI 1.7.2
+ *
+ * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * http://docs.jquery.com/UI
+ */
+jQuery.ui||(function(c){var i=c.fn.remove,d=c.browser.mozilla&&(parseFloat(c.browser.version)<1.9);c.ui={version:"1.7.2",plugin:{add:function(k,l,n){var m=c.ui[k].prototype;for(var j in n){m.plugins[j]=m.plugins[j]||[];m.plugins[j].push([l,n[j]])}},call:function(j,l,k){var n=j.plugins[l];if(!n||!j.element[0].parentNode){return}for(var m=0;m<n.length;m++){if(j.options[n[m][0]]){n[m][1].apply(j.element,k)}}}},contains:function(k,j){return document.compareDocumentPosition?k.compareDocumentPosition(j)&16:k!==j&&k.contains(j)},hasScroll:function(m,k){if(c(m).css("overflow")=="hidden"){return false}var j=(k&&k=="left")?"scrollLeft":"scrollTop",l=false;if(m[j]>0){return true}m[j]=1;l=(m[j]>0);m[j]=0;return l},isOverAxis:function(k,j,l){return(k>j)&&(k<(j+l))},isOver:function(o,k,n,m,j,l){return c.ui.isOverAxis(o,n,j)&&c.ui.isOverAxis(k,m,l)},keyCode:{BACKSPACE:8,CAPS_LOCK:20,COMMA:188,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38}};if(d){var f=c.attr,e=c.fn.removeAttr,h="http://www.w3.org/2005/07/aaa",a=/^aria-/,b=/^wairole:/;c.attr=function(k,j,l){var m=l!==undefined;return(j=="role"?(m?f.call(this,k,j,"wairole:"+l):(f.apply(this,arguments)||"").replace(b,"")):(a.test(j)?(m?k.setAttributeNS(h,j.replace(a,"aaa:"),l):f.call(this,k,j.replace(a,"aaa:"))):f.apply(this,arguments)))};c.fn.removeAttr=function(j){return(a.test(j)?this.each(function(){this.removeAttributeNS(h,j.replace(a,""))}):e.call(this,j))}}c.fn.extend({remove:function(){c("*",this).add(this).each(function(){c(this).triggerHandler("remove")});return i.apply(this,arguments)},enableSelection:function(){return this.attr("unselectable","off").css("MozUserSelect","").unbind("selectstart.ui")},disableSelection:function(){return this.attr("unselectable","on").css("MozUserSelect","none").bind("selectstart.ui",function(){return false})},scrollParent:function(){var j;if((c.browser.msie&&(/(static|relative)/).test(this.css("position")))||(/absolute/).test(this.css("position"))){j=this.parents().filter(function(){return(/(relative|absolute|fixed)/).test(c.curCSS(this,"position",1))&&(/(auto|scroll)/).test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0)}else{j=this.parents().filter(function(){return(/(auto|scroll)/).test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0)}return(/fixed/).test(this.css("position"))||!j.length?c(document):j}});c.extend(c.expr[":"],{data:function(l,k,j){return !!c.data(l,j[3])},focusable:function(k){var l=k.nodeName.toLowerCase(),j=c.attr(k,"tabindex");return(/input|select|textarea|button|object/.test(l)?!k.disabled:"a"==l||"area"==l?k.href||!isNaN(j):!isNaN(j))&&!c(k)["area"==l?"parents":"closest"](":hidden").length},tabbable:function(k){var j=c.attr(k,"tabindex");return(isNaN(j)||j>=0)&&c(k).is(":focusable")}});function g(m,n,o,l){function k(q){var p=c[m][n][q]||[];return(typeof p=="string"?p.split(/,?\s+/):p)}var j=k("getter");if(l.length==1&&typeof l[0]=="string"){j=j.concat(k("getterSetter"))}return(c.inArray(o,j)!=-1)}c.widget=function(k,j){var l=k.split(".")[0];k=k.split(".")[1];c.fn[k]=function(p){var n=(typeof p=="string"),o=Array.prototype.slice.call(arguments,1);if(n&&p.substring(0,1)=="_"){return this}if(n&&g(l,k,p,o)){var m=c.data(this[0],k);return(m?m[p].apply(m,o):undefined)}return this.each(function(){var q=c.data(this,k);(!q&&!n&&c.data(this,k,new c[l][k](this,p))._init());(q&&n&&c.isFunction(q[p])&&q[p].apply(q,o))})};c[l]=c[l]||{};c[l][k]=function(o,n){var m=this;this.namespace=l;this.widgetName=k;this.widgetEventPrefix=c[l][k].eventPrefix||k;this.widgetBaseClass=l+"-"+k;this.options=c.extend({},c.widget.defaults,c[l][k].defaults,c.metadata&&c.metadata.get(o)[k],n);this.element=c(o).bind("setData."+k,function(q,p,r){if(q.target==o){return m._setData(p,r)}}).bind("getData."+k,function(q,p){if(q.target==o){return m._getData(p)}}).bind("remove",function(){return m.destroy()})};c[l][k].prototype=c.extend({},c.widget.prototype,j);c[l][k].getterSetter="option"};c.widget.prototype={_init:function(){},destroy:function(){this.element.removeData(this.widgetName).removeClass(this.widgetBaseClass+"-disabled "+this.namespace+"-state-disabled").removeAttr("aria-disabled")},option:function(l,m){var k=l,j=this;if(typeof l=="string"){if(m===undefined){return this._getData(l)}k={};k[l]=m}c.each(k,function(n,o){j._setData(n,o)})},_getData:function(j){return this.options[j]},_setData:function(j,k){this.options[j]=k;if(j=="disabled"){this.element[k?"addClass":"removeClass"](this.widgetBaseClass+"-disabled "+this.namespace+"-state-disabled").attr("aria-disabled",k)}},enable:function(){this._setData("disabled",false)},disable:function(){this._setData("disabled",true)},_trigger:function(l,m,n){var p=this.options[l],j=(l==this.widgetEventPrefix?l:this.widgetEventPrefix+l);m=c.Event(m);m.type=j;if(m.originalEvent){for(var k=c.event.props.length,o;k;){o=c.event.props[--k];m[o]=m.originalEvent[o]}}this.element.trigger(m,n);return !(c.isFunction(p)&&p.call(this.element[0],m,n)===false||m.isDefaultPrevented())}};c.widget.defaults={disabled:false};c.ui.mouse={_mouseInit:function(){var j=this;this.element.bind("mousedown."+this.widgetName,function(k){return j._mouseDown(k)}).bind("click."+this.widgetName,function(k){if(j._preventClickEvent){j._preventClickEvent=false;k.stopImmediatePropagation();return false}});if(c.browser.msie){this._mouseUnselectable=this.element.attr("unselectable");this.element.attr("unselectable","on")}this.started=false},_mouseDestroy:function(){this.element.unbind("."+this.widgetName);(c.browser.msie&&this.element.attr("unselectable",this._mouseUnselectable))},_mouseDown:function(l){l.originalEvent=l.originalEvent||{};if(l.originalEvent.mouseHandled){return}(this._mouseStarted&&this._mouseUp(l));this._mouseDownEvent=l;var k=this,m=(l.which==1),j=(typeof this.options.cancel=="string"?c(l.target).parents().add(l.target).filter(this.options.cancel).length:false);if(!m||j||!this._mouseCapture(l)){return true}this.mouseDelayMet=!this.options.delay;if(!this.mouseDelayMet){this._mouseDelayTimer=setTimeout(function(){k.mouseDelayMet=true},this.options.delay)}if(this._mouseDistanceMet(l)&&this._mouseDelayMet(l)){this._mouseStarted=(this._mouseStart(l)!==false);if(!this._mouseStarted){l.preventDefault();return true}}this._mouseMoveDelegate=function(n){return k._mouseMove(n)};this._mouseUpDelegate=function(n){return k._mouseUp(n)};c(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate);(c.browser.safari||l.preventDefault());l.originalEvent.mouseHandled=true;return true},_mouseMove:function(j){if(c.browser.msie&&!j.button){return this._mouseUp(j)}if(this._mouseStarted){this._mouseDrag(j);return j.preventDefault()}if(this._mouseDistanceMet(j)&&this._mouseDelayMet(j)){this._mouseStarted=(this._mouseStart(this._mouseDownEvent,j)!==false);(this._mouseStarted?this._mouseDrag(j):this._mouseUp(j))}return !this._mouseStarted},_mouseUp:function(j){c(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted=false;this._preventClickEvent=(j.target==this._mouseDownEvent.target);this._mouseStop(j)}return false},_mouseDistanceMet:function(j){return(Math.max(Math.abs(this._mouseDownEvent.pageX-j.pageX),Math.abs(this._mouseDownEvent.pageY-j.pageY))>=this.options.distance)},_mouseDelayMet:function(j){return this.mouseDelayMet},_mouseStart:function(j){},_mouseDrag:function(j){},_mouseStop:function(j){},_mouseCapture:function(j){return true}};c.ui.mouse.defaults={cancel:null,distance:1,delay:0}})(jQuery);;/* * jQuery UI Resizable 1.7.2
+ *
+ * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * http://docs.jquery.com/UI/Resizables
+ *
+ * Depends:
+ *	ui.core.js
+ */
+(function(c){c.widget("ui.resizable",c.extend({},c.ui.mouse,{_init:function(){var e=this,j=this.options;this.element.addClass("ui-resizable");c.extend(this,{_aspectRatio:!!(j.aspectRatio),aspectRatio:j.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:j.helper||j.ghost||j.animate?j.helper||"ui-resizable-helper":null});if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)){if(/relative/.test(this.element.css("position"))&&c.browser.opera){this.element.css({position:"relative",top:"auto",left:"auto"})}this.element.wrap(c('<div class="ui-wrapper" style="overflow: hidden;"></div>').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")}));this.element=this.element.parent().data("resizable",this.element.data("resizable"));this.elementIsWrapper=true;this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")});this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0});this.originalResizeStyle=this.originalElement.css("resize");this.originalElement.css("resize","none");this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"}));this.originalElement.css({margin:this.originalElement.css("margin")});this._proportionallyResize()}this.handles=j.handles||(!c(".ui-resizable-handle",this.element).length?"e,s,se":{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"});if(this.handles.constructor==String){if(this.handles=="all"){this.handles="n,e,s,w,se,sw,ne,nw"}var k=this.handles.split(",");this.handles={};for(var f=0;f<k.length;f++){var h=c.trim(k[f]),d="ui-resizable-"+h;var g=c('<div class="ui-resizable-handle '+d+'"></div>');if(/sw|se|ne|nw/.test(h)){g.css({zIndex:++j.zIndex})}if("se"==h){g.addClass("ui-icon ui-icon-gripsmall-diagonal-se")}this.handles[h]=".ui-resizable-"+h;this.element.append(g)}}this._renderAxis=function(p){p=p||this.element;for(var m in this.handles){if(this.handles[m].constructor==String){this.handles[m]=c(this.handles[m],this.element).show()}if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var n=c(this.handles[m],this.element),o=0;o=/sw|ne|nw|se|n|s/.test(m)?n.outerHeight():n.outerWidth();var l=["padding",/ne|nw|n/.test(m)?"Top":/se|sw|s/.test(m)?"Bottom":/^e$/.test(m)?"Right":"Left"].join("");p.css(l,o);this._proportionallyResize()}if(!c(this.handles[m]).length){continue}}};this._renderAxis(this.element);this._handles=c(".ui-resizable-handle",this.element).disableSelection();this._handles.mouseover(function(){if(!e.resizing){if(this.className){var i=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)}e.axis=i&&i[1]?i[1]:"se"}});if(j.autoHide){this._handles.hide();c(this.element).addClass("ui-resizable-autohide").hover(function(){c(this).removeClass("ui-resizable-autohide");e._handles.show()},function(){if(!e.resizing){c(this).addClass("ui-resizable-autohide");e._handles.hide()}})}this._mouseInit()},destroy:function(){this._mouseDestroy();var d=function(f){c(f).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};if(this.elementIsWrapper){d(this.element);var e=this.element;e.parent().append(this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")})).end().remove()}this.originalElement.css("resize",this.originalResizeStyle);d(this.originalElement)},_mouseCapture:function(e){var f=false;for(var d in this.handles){if(c(this.handles[d])[0]==e.target){f=true}}return this.options.disabled||!!f},_mouseStart:function(f){var i=this.options,e=this.element.position(),d=this.element;this.resizing=true;this.documentScroll={top:c(document).scrollTop(),left:c(document).scrollLeft()};if(d.is(".ui-draggable")||(/absolute/).test(d.css("position"))){d.css({position:"absolute",top:e.top,left:e.left})}if(c.browser.opera&&(/relative/).test(d.css("position"))){d.css({position:"relative",top:"auto",left:"auto"})}this._renderProxy();var j=b(this.helper.css("left")),g=b(this.helper.css("top"));if(i.containment){j+=c(i.containment).scrollLeft()||0;g+=c(i.containment).scrollTop()||0}this.offset=this.helper.offset();this.position={left:j,top:g};this.size=this._helper?{width:d.outerWidth(),height:d.outerHeight()}:{width:d.width(),height:d.height()};this.originalSize=this._helper?{width:d.outerWidth(),height:d.outerHeight()}:{width:d.width(),height:d.height()};this.originalPosition={left:j,top:g};this.sizeDiff={width:d.outerWidth()-d.width(),height:d.outerHeight()-d.height()};this.originalMousePosition={left:f.pageX,top:f.pageY};this.aspectRatio=(typeof i.aspectRatio=="number")?i.aspectRatio:((this.originalSize.width/this.originalSize.height)||1);var h=c(".ui-resizable-"+this.axis).css("cursor");c("body").css("cursor",h=="auto"?this.axis+"-resize":h);d.addClass("ui-resizable-resizing");this._propagate("start",f);return true},_mouseDrag:function(d){var g=this.helper,f=this.options,l={},p=this,i=this.originalMousePosition,m=this.axis;var q=(d.pageX-i.left)||0,n=(d.pageY-i.top)||0;var h=this._change[m];if(!h){return false}var k=h.apply(this,[d,q,n]),j=c.browser.msie&&c.browser.version<7,e=this.sizeDiff;if(this._aspectRatio||d.shiftKey){k=this._updateRatio(k,d)}k=this._respectSize(k,d);this._propagate("resize",d);g.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"});if(!this._helper&&this._proportionallyResizeElements.length){this._proportionallyResize()}this._updateCache(k);this._trigger("resize",d,this.ui());return false},_mouseStop:function(g){this.resizing=false;var h=this.options,l=this;if(this._helper){var f=this._proportionallyResizeElements,d=f.length&&(/textarea/i).test(f[0].nodeName),e=d&&c.ui.hasScroll(f[0],"left")?0:l.sizeDiff.height,j=d?0:l.sizeDiff.width;var m={width:(l.size.width-j),height:(l.size.height-e)},i=(parseInt(l.element.css("left"),10)+(l.position.left-l.originalPosition.left))||null,k=(parseInt(l.element.css("top"),10)+(l.position.top-l.originalPosition.top))||null;if(!h.animate){this.element.css(c.extend(m,{top:k,left:i}))}l.helper.height(l.size.height);l.helper.width(l.size.width);if(this._helper&&!h.animate){this._proportionallyResize()}}c("body").css("cursor","auto");this.element.removeClass("ui-resizable-resizing");this._propagate("stop",g);if(this._helper){this.helper.remove()}return false},_updateCache:function(d){var e=this.options;this.offset=this.helper.offset();if(a(d.left)){this.position.left=d.left}if(a(d.top)){this.position.top=d.top}if(a(d.height)){this.size.height=d.height}if(a(d.width)){this.size.width=d.width}},_updateRatio:function(g,f){var h=this.options,i=this.position,e=this.size,d=this.axis;if(g.height){g.width=(e.height*this.aspectRatio)}else{if(g.width){g.height=(e.width/this.aspectRatio)}}if(d=="sw"){g.left=i.left+(e.width-g.width);g.top=null}if(d=="nw"){g.top=i.top+(e.height-g.height);g.left=i.left+(e.width-g.width)}return g},_respectSize:function(k,f){var i=this.helper,h=this.options,q=this._aspectRatio||f.shiftKey,p=this.axis,s=a(k.width)&&h.maxWidth&&(h.maxWidth<k.width),l=a(k.height)&&h.maxHeight&&(h.maxHeight<k.height),g=a(k.width)&&h.minWidth&&(h.minWidth>k.width),r=a(k.height)&&h.minHeight&&(h.minHeight>k.height);if(g){k.width=h.minWidth}if(r){k.height=h.minHeight}if(s){k.width=h.maxWidth}if(l){k.height=h.maxHeight}var e=this.originalPosition.left+this.originalSize.width,n=this.position.top+this.size.height;var j=/sw|nw|w/.test(p),d=/nw|ne|n/.test(p);if(g&&j){k.left=e-h.minWidth}if(s&&j){k.left=e-h.maxWidth}if(r&&d){k.top=n-h.minHeight}if(l&&d){k.top=n-h.maxHeight}var m=!k.width&&!k.height;if(m&&!k.left&&k.top){k.top=null}else{if(m&&!k.top&&k.left){k.left=null}}return k},_proportionallyResize:function(){var j=this.options;if(!this._proportionallyResizeElements.length){return}var f=this.helper||this.element;for(var e=0;e<this._proportionallyResizeElements.length;e++){var g=this._proportionallyResizeElements[e];if(!this.borderDif){var d=[g.css("borderTopWidth"),g.css("borderRightWidth"),g.css("borderBottomWidth"),g.css("borderLeftWidth")],h=[g.css("paddingTop"),g.css("paddingRight"),g.css("paddingBottom"),g.css("paddingLeft")];this.borderDif=c.map(d,function(k,m){var l=parseInt(k,10)||0,n=parseInt(h[m],10)||0;return l+n})}if(c.browser.msie&&!(!(c(f).is(":hidden")||c(f).parents(":hidden").length))){continue}g.css({height:(f.height()-this.borderDif[0]-this.borderDif[2])||0,width:(f.width()-this.borderDif[1]-this.borderDif[3])||0})}},_renderProxy:function(){var e=this.element,h=this.options;this.elementOffset=e.offset();if(this._helper){this.helper=this.helper||c('<div style="overflow:hidden;"></div>');var d=c.browser.msie&&c.browser.version<7,f=(d?1:0),g=(d?2:-1);this.helper.addClass(this._helper).css({width:this.element.outerWidth()+g,height:this.element.outerHeight()+g,position:"absolute",left:this.elementOffset.left-f+"px",top:this.elementOffset.top-f+"px",zIndex:++h.zIndex});this.helper.appendTo("body").disableSelection()}else{this.helper=this.element}},_change:{e:function(f,e,d){return{width:this.originalSize.width+e}},w:function(g,e,d){var i=this.options,f=this.originalSize,h=this.originalPosition;return{left:h.left+e,width:f.width-e}},n:function(g,e,d){var i=this.options,f=this.originalSize,h=this.originalPosition;return{top:h.top+d,height:f.height-d}},s:function(f,e,d){return{height:this.originalSize.height+d}},se:function(f,e,d){return c.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[f,e,d]))},sw:function(f,e,d){return c.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[f,e,d]))},ne:function(f,e,d){return c.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[f,e,d]))},nw:function(f,e,d){return c.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[f,e,d]))}},_propagate:function(e,d){c.ui.plugin.call(this,e,[d,this.ui()]);(e!="resize"&&this._trigger(e,d,this.ui()))},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}));c.extend(c.ui.resizable,{version:"1.7.2",eventPrefix:"resize",defaults:{alsoResize:false,animate:false,animateDuration:"slow",animateEasing:"swing",aspectRatio:false,autoHide:false,cancel:":input,option",containment:false,delay:0,distance:1,ghost:false,grid:false,handles:"e,s,se",helper:false,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:1000}});c.ui.plugin.add("resizable","alsoResize",{start:function(e,f){var d=c(this).data("resizable"),g=d.options;_store=function(h){c(h).each(function(){c(this).data("resizable-alsoresize",{width:parseInt(c(this).width(),10),height:parseInt(c(this).height(),10),left:parseInt(c(this).css("left"),10),top:parseInt(c(this).css("top"),10)})})};if(typeof(g.alsoResize)=="object"&&!g.alsoResize.parentNode){if(g.alsoResize.length){g.alsoResize=g.alsoResize[0];_store(g.alsoResize)}else{c.each(g.alsoResize,function(h,i){_store(h)})}}else{_store(g.alsoResize)}},resize:function(f,h){var e=c(this).data("resizable"),i=e.options,g=e.originalSize,k=e.originalPosition;var j={height:(e.size.height-g.height)||0,width:(e.size.width-g.width)||0,top:(e.position.top-k.top)||0,left:(e.position.left-k.left)||0},d=function(l,m){c(l).each(function(){var p=c(this),q=c(this).data("resizable-alsoresize"),o={},n=m&&m.length?m:["width","height","top","left"];c.each(n||["width","height","top","left"],function(r,t){var s=(q[t]||0)+(j[t]||0);if(s&&s>=0){o[t]=s||null}});if(/relative/.test(p.css("position"))&&c.browser.opera){e._revertToRelativePosition=true;p.css({position:"absolute",top:"auto",left:"auto"})}p.css(o)})};if(typeof(i.alsoResize)=="object"&&!i.alsoResize.nodeType){c.each(i.alsoResize,function(l,m){d(l,m)})}else{d(i.alsoResize)}},stop:function(e,f){var d=c(this).data("resizable");if(d._revertToRelativePosition&&c.browser.opera){d._revertToRelativePosition=false;el.css({position:"relative"})}c(this).removeData("resizable-alsoresize-start")}});c.ui.plugin.add("resizable","animate",{stop:function(h,m){var n=c(this).data("resizable"),i=n.options;var g=n._proportionallyResizeElements,d=g.length&&(/textarea/i).test(g[0].nodeName),e=d&&c.ui.hasScroll(g[0],"left")?0:n.sizeDiff.height,k=d?0:n.sizeDiff.width;var f={width:(n.size.width-k),height:(n.size.height-e)},j=(parseInt(n.element.css("left"),10)+(n.position.left-n.originalPosition.left))||null,l=(parseInt(n.element.css("top"),10)+(n.position.top-n.originalPosition.top))||null;n.element.animate(c.extend(f,l&&j?{top:l,left:j}:{}),{duration:i.animateDuration,easing:i.animateEasing,step:function(){var o={width:parseInt(n.element.css("width"),10),height:parseInt(n.element.css("height"),10),top:parseInt(n.element.css("top"),10),left:parseInt(n.element.css("left"),10)};if(g&&g.length){c(g[0]).css({width:o.width,height:o.height})}n._updateCache(o);n._propagate("resize",h)}})}});c.ui.plugin.add("resizable","containment",{start:function(e,q){var s=c(this).data("resizable"),i=s.options,k=s.element;var f=i.containment,j=(f instanceof c)?f.get(0):(/parent/.test(f))?k.parent().get(0):f;if(!j){return}s.containerElement=c(j);if(/document/.test(f)||f==document){s.containerOffset={left:0,top:0};s.containerPosition={left:0,top:0};s.parentData={element:c(document),left:0,top:0,width:c(document).width(),height:c(document).height()||document.body.parentNode.scrollHeight}}else{var m=c(j),h=[];c(["Top","Right","Left","Bottom"]).each(function(p,o){h[p]=b(m.css("padding"+o))});s.containerOffset=m.offset();s.containerPosition=m.position();s.containerSize={height:(m.innerHeight()-h[3]),width:(m.innerWidth()-h[1])};var n=s.containerOffset,d=s.containerSize.height,l=s.containerSize.width,g=(c.ui.hasScroll(j,"left")?j.scrollWidth:l),r=(c.ui.hasScroll(j)?j.scrollHeight:d);s.parentData={element:j,left:n.left,top:n.top,width:g,height:r}}},resize:function(f,p){var s=c(this).data("resizable"),h=s.options,e=s.containerSize,n=s.containerOffset,l=s.size,m=s.position,q=s._aspectRatio||f.shiftKey,d={top:0,left:0},g=s.containerElement;if(g[0]!=document&&(/static/).test(g.css("position"))){d=n}if(m.left<(s._helper?n.left:0)){s.size.width=s.size.width+(s._helper?(s.position.left-n.left):(s.position.left-d.left));if(q){s.size.height=s.size.width/h.aspectRatio}s.position.left=h.helper?n.left:0}if(m.top<(s._helper?n.top:0))
+{s.size.height=s.size.height+(s._helper?(s.position.top-n.top):s.position.top);if(q){s.size.width=s.size.height*h.aspectRatio}s.position.top=s._helper?n.top:0}s.offset.left=s.parentData.left+s.position.left;s.offset.top=s.parentData.top+s.position.top;var k=Math.abs((s._helper?s.offset.left-d.left:(s.offset.left-d.left))+s.sizeDiff.width),r=Math.abs((s._helper?s.offset.top-d.top:(s.offset.top-n.top))+s.sizeDiff.height);var j=s.containerElement.get(0)==s.element.parent().get(0),i=/relative|absolute/.test(s.containerElement.css("position"));if(j&&i){k-=s.parentData.left}if(k+s.size.width>=s.parentData.width){s.size.width=s.parentData.width-k;if(q){s.size.height=s.size.width/s.aspectRatio}}if(r+s.size.height>=s.parentData.height){s.size.height=s.parentData.height-r;if(q){s.size.width=s.size.height*s.aspectRatio}}},stop:function(e,m){var p=c(this).data("resizable"),f=p.options,k=p.position,l=p.containerOffset,d=p.containerPosition,g=p.containerElement;var i=c(p.helper),q=i.offset(),n=i.outerWidth()-p.sizeDiff.width,j=i.outerHeight()-p.sizeDiff.height;if(p._helper&&!f.animate&&(/relative/).test(g.css("position"))){c(this).css({left:q.left-d.left-l.left,width:n,height:j})}if(p._helper&&!f.animate&&(/static/).test(g.css("position"))){c(this).css({left:q.left-d.left-l.left,width:n,height:j})}}});c.ui.plugin.add("resizable","ghost",{start:function(f,g){var d=c(this).data("resizable"),h=d.options,e=d.size;d.ghost=d.originalElement.clone();d.ghost.css({opacity:0.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof h.ghost=="string"?h.ghost:"");d.ghost.appendTo(d.helper)},resize:function(e,f){var d=c(this).data("resizable"),g=d.options;if(d.ghost){d.ghost.css({position:"relative",height:d.size.height,width:d.size.width})}},stop:function(e,f){var d=c(this).data("resizable"),g=d.options;if(d.ghost&&d.helper){d.helper.get(0).removeChild(d.ghost.get(0))}}});c.ui.plugin.add("resizable","grid",{resize:function(d,l){var n=c(this).data("resizable"),g=n.options,j=n.size,h=n.originalSize,i=n.originalPosition,m=n.axis,k=g._aspectRatio||d.shiftKey;g.grid=typeof g.grid=="number"?[g.grid,g.grid]:g.grid;var f=Math.round((j.width-h.width)/(g.grid[0]||1))*(g.grid[0]||1),e=Math.round((j.height-h.height)/(g.grid[1]||1))*(g.grid[1]||1);if(/^(se|s|e)$/.test(m)){n.size.width=h.width+f;n.size.height=h.height+e}else{if(/^(ne)$/.test(m)){n.size.width=h.width+f;n.size.height=h.height+e;n.position.top=i.top-e}else{if(/^(sw)$/.test(m)){n.size.width=h.width+f;n.size.height=h.height+e;n.position.left=i.left-f}else{n.size.width=h.width+f;n.size.height=h.height+e;n.position.top=i.top-e;n.position.left=i.left-f}}}}});var b=function(d){return parseInt(d,10)||0};var a=function(d){return !isNaN(parseInt(d,10))}})(jQuery);;
+/**
+ * jQuery.ScrollTo - Easy element scrolling using jQuery.
+ * Copyright (c) 2008 Ariel Flesler - aflesler(at)gmail(dot)com
+ * Licensed under GPL license (http://www.opensource.org/licenses/gpl-license.php).
+ * Date: 2/8/2008
+ * @author Ariel Flesler
+ * @version 1.3.2
+ */
+;(function($){var o=$.scrollTo=function(a,b,c){o.window().scrollTo(a,b,c)};o.defaults={axis:'y',duration:1};o.window=function(){return $($.browser.safari?'body':'html')};$.fn.scrollTo=function(l,m,n){if(typeof m=='object'){n=m;m=0}n=$.extend({},o.defaults,n);m=m||n.speed||n.duration;n.queue=n.queue&&n.axis.length>1;if(n.queue)m/=2;n.offset=j(n.offset);n.over=j(n.over);return this.each(function(){var a=this,b=$(a),t=l,c,d={},w=b.is('html,body');switch(typeof t){case'number':case'string':if(/^([+-]=)?\d+(px)?$/.test(t)){t=j(t);break}t=$(t,this);case'object':if(t.is||t.style)c=(t=$(t)).offset()}$.each(n.axis.split(''),function(i,f){var P=f=='x'?'Left':'Top',p=P.toLowerCase(),k='scroll'+P,e=a[k],D=f=='x'?'Width':'Height';if(c){d[k]=c[p]+(w?0:e-b.offset()[p]);if(n.margin){d[k]-=parseInt(t.css('margin'+P))||0;d[k]-=parseInt(t.css('border'+P+'Width'))||0}d[k]+=n.offset[p]||0;if(n.over[p])d[k]+=t[D.toLowerCase()]()*n.over[p]}else d[k]=t[p];if(/^\d+$/.test(d[k]))d[k]=d[k]<=0?0:Math.min(d[k],h(D));if(!i&&n.queue){if(e!=d[k])g(n.onAfterFirst);delete d[k]}});g(n.onAfter);function g(a){b.animate(d,m,n.easing,a&&function(){a.call(this,l)})};function h(D){var b=w?$.browser.opera?document.body:document.documentElement:a;return b['scroll'+D]-b['client'+D]}})};function j(a){return typeof a=='object'?a:{top:a,left:a}}})(jQuery);
+
diff --git a/native_client_sdk/doc_generated/pepper_beta/cpp/namespacepp.html b/native_client_sdk/doc_generated/pepper_beta/cpp/namespacepp.html
index e888367..c003388 100644
--- a/native_client_sdk/doc_generated/pepper_beta/cpp/namespacepp.html
+++ b/native_client_sdk/doc_generated/pepper_beta/cpp/namespacepp.html
@@ -119,6 +119,8 @@
 <tr><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_video_frame.html">VideoFrame</a></td></tr>
 <tr><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_view.html">View</a></td></tr>
 <tr><td class="mdescLeft">&#160;</td><td class="mdescRight">This class represents the state of the view for an instance and contains functions for retrieving the current state of that view.  <a href="classpp_1_1_view.html#details">More...</a><br /></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_vpn_provider.html">VpnProvider</a></td></tr>
+<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The <code><a class="el" href="classpp_1_1_vpn_provider.html" title="The VpnProvider class enhances the chrome.vpnProvider JavaScript API by providing a high performance ...">VpnProvider</a></code> class enhances the <code>chrome.vpnProvider</code> JavaScript API by providing a high performance path for packet handling.  <a href="classpp_1_1_vpn_provider.html#details">More...</a><br /></td></tr>
 <tr><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_web_socket.html">WebSocket</a></td></tr>
 <tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The <code><a class="el" href="classpp_1_1_web_socket.html" title="The WebSocket class providing bi-directional, full-duplex, communications over a single TCP socket...">WebSocket</a></code> class providing bi-directional, full-duplex, communications over a single TCP socket.  <a href="classpp_1_1_web_socket.html#details">More...</a><br /></td></tr>
 <tr><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_completion_callback_factory.html">CompletionCallbackFactory</a></td></tr>
diff --git a/native_client_sdk/doc_generated/pepper_beta/cpp/vpn__provider_8h.html b/native_client_sdk/doc_generated/pepper_beta/cpp/vpn__provider_8h.html
new file mode 100644
index 0000000..9fe2c2c
--- /dev/null
+++ b/native_client_sdk/doc_generated/pepper_beta/cpp/vpn__provider_8h.html
@@ -0,0 +1,33 @@
+{{+bindTo:partials.standard_nacl_api}}
+<h1>vpn_provider.h File Reference</h1>
+<div id="doxygen-ref">
+{{- dummy div to appease doxygen -}}
+  <div>
+<!-- Generated by Doxygen 1.7.6.1 -->
+
+
+</div>
+<!--header-->
+<div class="contents">
+<div class="textblock"><div class="dynheader">
+Include dependency graph for vpn_provider.h:</div>
+<div class="dyncontent">
+<div class="center"><img src="vpn__provider_8h__incl.png" border="0" usemap="#vpn__provider_8h" alt="" /></div>
+<map name="vpn__provider_8h" id="vpn__provider_8h">
+</map>
+</div>
+</div><h2>
+Classes</h2><table class="memberdecls">
+
+<tr><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_vpn_provider.html">pp::VpnProvider</a></td></tr>
+<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The <code><a class="el" href="classpp_1_1_vpn_provider.html" title="The VpnProvider class enhances the chrome.vpnProvider JavaScript API by providing a high performance ...">VpnProvider</a></code> class enhances the <code>chrome.vpnProvider</code> JavaScript API by providing a high performance path for packet handling.  <a href="classpp_1_1_vpn_provider.html#details">More...</a><br /></td></tr>
+</table><h2>
+Namespaces</h2><table class="memberdecls">
+<tr><td class="memItemLeft" align="right" valign="top">namespace &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacepp.html">pp</a></td></tr>
+</table>
+<hr /><a name="details" id="details"></a><h2>Detailed Description</h2>
+<div class="textblock"><p>This file defines the VpnProvider interface providing a way to implement a VPN client. </p>
+<p>Important: This API is available only on Chrome OS. </p>
+</div></div><!-- contents -->
+</div>
+{{/partials.standard_nacl_api}}
diff --git a/native_client_sdk/doc_generated/pepper_beta/cpp/vpn__provider_8h__incl.png b/native_client_sdk/doc_generated/pepper_beta/cpp/vpn__provider_8h__incl.png
new file mode 100644
index 0000000..35015c16
--- /dev/null
+++ b/native_client_sdk/doc_generated/pepper_beta/cpp/vpn__provider_8h__incl.png
Binary files differ
diff --git a/native_client_sdk/doc_generated/pepper_beta/index.html b/native_client_sdk/doc_generated/pepper_beta/index.html
index b701d4b..20f1d63 100644
--- a/native_client_sdk/doc_generated/pepper_beta/index.html
+++ b/native_client_sdk/doc_generated/pepper_beta/index.html
@@ -1,9 +1,17 @@
 {{+bindTo:partials.standard_nacl_article}}
 
-<section id="pepper-api-reference-beta">
+<b><font color="#cc0000">
+NOTE:
+Deprecation of the technologies described here has been announced
+for platforms other than ChromeOS.<br/>
+Please visit our
+<a href="/native-client/migration">migration guide</a>
+for details.
+</font></b>
+<hr/><section id="pepper-api-reference-beta">
 <h1 id="pepper-api-reference-beta">Pepper API Reference (Beta)</h1>
-<p>This page lists the API for Pepper 49. Apps that use this API can
-run in Chrome 49 or higher.</p>
+<p>This page lists the API for Pepper 59. Apps that use this API can
+run in Chrome 59 or higher.</p>
 <h2 id="pepper-c-api-reference"><a class="reference internal" href="/native-client/c-api-beta.html#pepper-beta-c-index"><em>Pepper C API Reference</em></a></h2>
 <h2 id="id1"><a class="reference internal" href="/native-client/cpp-api-beta.html#pepper-beta-cpp-index"><em>Pepper C++ API Reference</em></a></h2>
 </section>
diff --git a/native_client_sdk/doc_generated/pepper_dev/c/globals_defs.html b/native_client_sdk/doc_generated/pepper_dev/c/globals_defs.html
index b08950b1..46088eb 100644
--- a/native_client_sdk/doc_generated/pepper_dev/c/globals_defs.html
+++ b/native_client_sdk/doc_generated/pepper_dev/c/globals_defs.html
@@ -85,8 +85,8 @@
 <li>PPB_GRAPHICS_2D_INTERFACE
 : <a class="el" href="ppb__graphics__2d_8h.html#ab4930fe7aea6b403503d5cc748824b0d">ppb_graphics_2d.h</a>
 </li>
-<li>PPB_GRAPHICS_2D_INTERFACE_1_1
-: <a class="el" href="ppb__graphics__2d_8h.html#ad9792b60ca6ce77f3925be8d60e06640">ppb_graphics_2d.h</a>
+<li>PPB_GRAPHICS_2D_INTERFACE_1_2
+: <a class="el" href="ppb__graphics__2d_8h.html#a8991520a54fc032adae6e8de92d0e0c5">ppb_graphics_2d.h</a>
 </li>
 <li>PPB_GRAPHICS_3D_INTERFACE
 : <a class="el" href="ppb__graphics__3d_8h.html#a3ba3c80f5959aca6bdef2584a2ceb55e">ppb_graphics_3d.h</a>
@@ -331,6 +331,9 @@
 <li>PPB_VIEW_INTERFACE_1_2
 : <a class="el" href="ppb__view_8h.html#a5cdcf0cc190c3ad8c47904939c519a85">ppb_view.h</a>
 </li>
+<li>PPB_VPNPROVIDER_INTERFACE_0_1
+: <a class="el" href="ppb__vpn__provider_8h.html#adc236058517f438cdd43d61c8948de69">ppb_vpn_provider.h</a>
+</li>
 <li>PPB_WEBSOCKET_INTERFACE
 : <a class="el" href="ppb__websocket_8h.html#a6d56a012c9350b4cc4e55b668d3fbe75">ppb_websocket.h</a>
 </li>
diff --git a/native_client_sdk/doc_generated/pepper_dev/c/group___enums.html b/native_client_sdk/doc_generated/pepper_dev/c/group___enums.html
index f5d7907..80d38a7 100644
--- a/native_client_sdk/doc_generated/pepper_dev/c/group___enums.html
+++ b/native_client_sdk/doc_generated/pepper_dev/c/group___enums.html
@@ -244,7 +244,9 @@
 <a class="el" href="group___enums.html#gga21b811ac0484a214a8751aa3e1c959d9a493ca598187014e2356cd7a5ba8cdffd">PP_INPUTEVENT_MODIFIER_NUMLOCKKEY</a> =  1 &lt;&lt; 10, 
 <a class="el" href="group___enums.html#gga21b811ac0484a214a8751aa3e1c959d9a8295bfc8067c06a17ccfc5fb6a992e17">PP_INPUTEVENT_MODIFIER_ISLEFT</a> =  1 &lt;&lt; 11, 
 <br />
-&#160;&#160;<a class="el" href="group___enums.html#gga21b811ac0484a214a8751aa3e1c959d9a348f43efaf61edbefd83346428c5b122">PP_INPUTEVENT_MODIFIER_ISRIGHT</a> =  1 &lt;&lt; 12
+&#160;&#160;<a class="el" href="group___enums.html#gga21b811ac0484a214a8751aa3e1c959d9a348f43efaf61edbefd83346428c5b122">PP_INPUTEVENT_MODIFIER_ISRIGHT</a> =  1 &lt;&lt; 12, 
+<a class="el" href="group___enums.html#gga21b811ac0484a214a8751aa3e1c959d9a970ad827a7240093ec57f1a3a7aea692">PP_INPUTEVENT_MODIFIER_ISPEN</a> =  1 &lt;&lt; 13, 
+<a class="el" href="group___enums.html#gga21b811ac0484a214a8751aa3e1c959d9a3367f08ba940a67d0098a59093582ef1">PP_INPUTEVENT_MODIFIER_ISERASER</a> =  1 &lt;&lt; 14
 <br />
  }</td></tr>
 <tr><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#ga25113f3c8d33e863fd38b3f70f8a5e6e">PP_InputEvent_MouseButton</a> { <a class="el" href="group___enums.html#gga25113f3c8d33e863fd38b3f70f8a5e6eaa2d4e499d6c23ef45381a89612e654d9">PP_INPUTEVENT_MOUSEBUTTON_NONE</a> =  -1, 
@@ -1155,6 +1157,10 @@
 </td></tr>
 <tr><td valign="top"><em><a class="anchor" id="gga21b811ac0484a214a8751aa3e1c959d9a348f43efaf61edbefd83346428c5b122"></a><!-- doxytag: member="PP_INPUTEVENT_MODIFIER_ISRIGHT" ref="gga21b811ac0484a214a8751aa3e1c959d9a348f43efaf61edbefd83346428c5b122" args="" -->PP_INPUTEVENT_MODIFIER_ISRIGHT</em>&nbsp;</td><td>
 </td></tr>
+<tr><td valign="top"><em><a class="anchor" id="gga21b811ac0484a214a8751aa3e1c959d9a970ad827a7240093ec57f1a3a7aea692"></a><!-- doxytag: member="PP_INPUTEVENT_MODIFIER_ISPEN" ref="gga21b811ac0484a214a8751aa3e1c959d9a970ad827a7240093ec57f1a3a7aea692" args="" -->PP_INPUTEVENT_MODIFIER_ISPEN</em>&nbsp;</td><td>
+</td></tr>
+<tr><td valign="top"><em><a class="anchor" id="gga21b811ac0484a214a8751aa3e1c959d9a3367f08ba940a67d0098a59093582ef1"></a><!-- doxytag: member="PP_INPUTEVENT_MODIFIER_ISERASER" ref="gga21b811ac0484a214a8751aa3e1c959d9a3367f08ba940a67d0098a59093582ef1" args="" -->PP_INPUTEVENT_MODIFIER_ISERASER</em>&nbsp;</td><td>
+</td></tr>
 </table>
 </dd>
 </dl>
diff --git a/native_client_sdk/doc_generated/pepper_dev/c/group___interfaces.html b/native_client_sdk/doc_generated/pepper_dev/c/group___interfaces.html
index 72f88bb..4a04f9f 100644
--- a/native_client_sdk/doc_generated/pepper_dev/c/group___interfaces.html
+++ b/native_client_sdk/doc_generated/pepper_dev/c/group___interfaces.html
@@ -35,8 +35,8 @@
 <tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The <code>PPB_Fullscreen</code> interface is implemented by the browser.  <a href="struct_p_p_b___fullscreen__1__0.html#details">More...</a><br /></td></tr>
 <tr><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___gamepad__1__0.html">PPB_Gamepad</a></td></tr>
 <tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The <code>PPB_Gamepad</code> interface allows retrieving data from gamepad/joystick devices that are connected to the system.  <a href="struct_p_p_b___gamepad__1__0.html#details">More...</a><br /></td></tr>
-<tr><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___graphics2_d__1__1.html">PPB_Graphics2D</a></td></tr>
-<tr><td class="mdescLeft">&#160;</td><td class="mdescRight"><code>PPB_Graphics2D</code> defines the interface for a 2D graphics context.  <a href="struct_p_p_b___graphics2_d__1__1.html#details">More...</a><br /></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___graphics2_d__1__2.html">PPB_Graphics2D</a></td></tr>
+<tr><td class="mdescLeft">&#160;</td><td class="mdescRight"><code>PPB_Graphics2D</code> defines the interface for a 2D graphics context.  <a href="struct_p_p_b___graphics2_d__1__2.html#details">More...</a><br /></td></tr>
 <tr><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___graphics3_d__1__0.html">PPB_Graphics3D</a></td></tr>
 <tr><td class="mdescLeft">&#160;</td><td class="mdescRight"><code>PPB_Graphics3D</code> defines the interface for a 3D graphics context.  <a href="struct_p_p_b___graphics3_d__1__0.html#details">More...</a><br /></td></tr>
 <tr><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___host_resolver__1__0.html">PPB_HostResolver</a></td></tr>
@@ -116,6 +116,8 @@
 <tr><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_frame__0__1.html">PPB_VideoFrame</a></td></tr>
 <tr><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___view__1__2.html">PPB_View</a></td></tr>
 <tr><td class="mdescLeft">&#160;</td><td class="mdescRight"><code>PPB_View</code> represents the state of the view of an instance.  <a href="struct_p_p_b___view__1__2.html#details">More...</a><br /></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___vpn_provider__0__1.html">PPB_VpnProvider</a></td></tr>
+<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Use the <code>PPB_VpnProvider</code> interface to implement a VPN client.  <a href="struct_p_p_b___vpn_provider__0__1.html#details">More...</a><br /></td></tr>
 <tr><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___web_socket__1__0.html">PPB_WebSocket</a></td></tr>
 <tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The <code>PPB_WebSocket</code> interface provides bi-directional, full-duplex, communications over a single TCP socket.  <a href="struct_p_p_b___web_socket__1__0.html#details">More...</a><br /></td></tr>
 <tr><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_p___graphics3_d__1__0.html">PPP_Graphics3D</a></td></tr>
@@ -141,7 +143,7 @@
 <tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___file_system__1__0.html">PPB_FileSystem</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#gae5ad593b6aff864c6bd0acc09d6cc5e9">PPB_FileSystem</a></td></tr>
 <tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___fullscreen__1__0.html">PPB_Fullscreen</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#ga965dcf552ef79d1a41e0c24db2cf5c3c">PPB_Fullscreen</a></td></tr>
 <tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___gamepad__1__0.html">PPB_Gamepad</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#ga57baea75086a666a92489da807f16f2a">PPB_Gamepad</a></td></tr>
-<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___graphics2_d__1__1.html">PPB_Graphics2D</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#gaf9f8348d3315d8bb014b401f733ebdb6">PPB_Graphics2D</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___graphics2_d__1__2.html">PPB_Graphics2D</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#gae81de3c5ca761162254ed217693050ba">PPB_Graphics2D</a></td></tr>
 <tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___graphics3_d__1__0.html">PPB_Graphics3D</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#ga2865870b49481aae8ed416c06c58a7c0">PPB_Graphics3D</a></td></tr>
 <tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___host_resolver__1__0.html">PPB_HostResolver</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#ga72b9bd04eeace0c69f4e454b7cc4e440">PPB_HostResolver</a></td></tr>
 <tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___image_data__1__0.html">PPB_ImageData</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#ga17e05bbe7da0d6d7b61b6f78c5913c37">PPB_ImageData</a></td></tr>
@@ -317,12 +319,12 @@
 <div class="memdoc">
 </div>
 </div>
-<a class="anchor" id="gaf9f8348d3315d8bb014b401f733ebdb6"></a><!-- doxytag: member="ppb_graphics_2d.h::PPB_Graphics2D" ref="gaf9f8348d3315d8bb014b401f733ebdb6" args="" -->
+<a class="anchor" id="gae81de3c5ca761162254ed217693050ba"></a><!-- doxytag: member="ppb_graphics_2d.h::PPB_Graphics2D" ref="gae81de3c5ca761162254ed217693050ba" args="" -->
 <div class="memitem">
 <div class="memproto">
 <table class="memname">
 <tr>
-<td class="memname">typedef struct <a class="el" href="struct_p_p_b___graphics2_d__1__1.html">PPB_Graphics2D</a> <a class="el" href="group___interfaces.html#gaf9f8348d3315d8bb014b401f733ebdb6">PPB_Graphics2D</a></td>
+<td class="memname">typedef struct <a class="el" href="struct_p_p_b___graphics2_d__1__2.html">PPB_Graphics2D</a> <a class="el" href="group___interfaces.html#gae81de3c5ca761162254ed217693050ba">PPB_Graphics2D</a></td>
 </tr>
 </table>
 </div>
diff --git a/native_client_sdk/doc_generated/pepper_dev/c/jquery.js b/native_client_sdk/doc_generated/pepper_dev/c/jquery.js
new file mode 100644
index 0000000..90b3a2b
--- /dev/null
+++ b/native_client_sdk/doc_generated/pepper_dev/c/jquery.js
@@ -0,0 +1,64 @@
+/*
+ * jQuery JavaScript Library v1.3.2
+ * http://jquery.com/
+ *
+ * Copyright (c) 2009 John Resig
+ * Dual licensed under the MIT and GPL licenses.
+ * http://docs.jquery.com/License
+ *
+ * Date: 2009-02-19 17:34:21 -0500 (Thu, 19 Feb 2009)
+ * Revision: 6246
+ */
+(function(){var l=this,g,y=l.jQuery,p=l.$,o=l.jQuery=l.$=function(E,F){return new o.fn.init(E,F)},D=/^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/,f=/^.[^:#\[\.,]*$/;o.fn=o.prototype={init:function(E,H){E=E||document;if(E.nodeType){this[0]=E;this.length=1;this.context=E;return this}if(typeof E==="string"){var G=D.exec(E);if(G&&(G[1]||!H)){if(G[1]){E=o.clean([G[1]],H)}else{var I=document.getElementById(G[3]);if(I&&I.id!=G[3]){return o().find(E)}var F=o(I||[]);F.context=document;F.selector=E;return F}}else{return o(H).find(E)}}else{if(o.isFunction(E)){return o(document).ready(E)}}if(E.selector&&E.context){this.selector=E.selector;this.context=E.context}return this.setArray(o.isArray(E)?E:o.makeArray(E))},selector:"",jquery:"1.3.2",size:function(){return this.length},get:function(E){return E===g?Array.prototype.slice.call(this):this[E]},pushStack:function(F,H,E){var G=o(F);G.prevObject=this;G.context=this.context;if(H==="find"){G.selector=this.selector+(this.selector?" ":"")+E}else{if(H){G.selector=this.selector+"."+H+"("+E+")"}}return G},setArray:function(E){this.length=0;Array.prototype.push.apply(this,E);return this},each:function(F,E){return o.each(this,F,E)},index:function(E){return o.inArray(E&&E.jquery?E[0]:E,this)},attr:function(F,H,G){var E=F;if(typeof F==="string"){if(H===g){return this[0]&&o[G||"attr"](this[0],F)}else{E={};E[F]=H}}return this.each(function(I){for(F in E){o.attr(G?this.style:this,F,o.prop(this,E[F],G,I,F))}})},css:function(E,F){if((E=="width"||E=="height")&&parseFloat(F)<0){F=g}return this.attr(E,F,"curCSS")},text:function(F){if(typeof F!=="object"&&F!=null){return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(F))}var E="";o.each(F||this,function(){o.each(this.childNodes,function(){if(this.nodeType!=8){E+=this.nodeType!=1?this.nodeValue:o.fn.text([this])}})});return E},wrapAll:function(E){if(this[0]){var F=o(E,this[0].ownerDocument).clone();if(this[0].parentNode){F.insertBefore(this[0])}F.map(function(){var G=this;while(G.firstChild){G=G.firstChild}return G}).append(this)}return this},wrapInner:function(E){return this.each(function(){o(this).contents().wrapAll(E)})},wrap:function(E){return this.each(function(){o(this).wrapAll(E)})},append:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.appendChild(E)}})},prepend:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.insertBefore(E,this.firstChild)}})},before:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this)})},after:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this.nextSibling)})},end:function(){return this.prevObject||o([])},push:[].push,sort:[].sort,splice:[].splice,find:function(E){if(this.length===1){var F=this.pushStack([],"find",E);F.length=0;o.find(E,this[0],F);return F}else{return this.pushStack(o.unique(o.map(this,function(G){return o.find(E,G)})),"find",E)}},clone:function(G){var E=this.map(function(){if(!o.support.noCloneEvent&&!o.isXMLDoc(this)){var I=this.outerHTML;if(!I){var J=this.ownerDocument.createElement("div");J.appendChild(this.cloneNode(true));I=J.innerHTML}return o.clean([I.replace(/ jQuery\d+="(?:\d+|null)"/g,"").replace(/^\s*/,"")])[0]}else{return this.cloneNode(true)}});if(G===true){var H=this.find("*").andSelf(),F=0;E.find("*").andSelf().each(function(){if(this.nodeName!==H[F].nodeName){return}var I=o.data(H[F],"events");for(var K in I){for(var J in I[K]){o.event.add(this,K,I[K][J],I[K][J].data)}}F++})}return E},filter:function(E){return this.pushStack(o.isFunction(E)&&o.grep(this,function(G,F){return E.call(G,F)})||o.multiFilter(E,o.grep(this,function(F){return F.nodeType===1})),"filter",E)},closest:function(E){var G=o.expr.match.POS.test(E)?o(E):null,F=0;return this.map(function(){var H=this;while(H&&H.ownerDocument){if(G?G.index(H)>-1:o(H).is(E)){o.data(H,"closest",F);return H}H=H.parentNode;F++}})},not:function(E){if(typeof E==="string"){if(f.test(E)){return this.pushStack(o.multiFilter(E,this,true),"not",E)}else{E=o.multiFilter(E,this)}}var F=E.length&&E[E.length-1]!==g&&!E.nodeType;return this.filter(function(){return F?o.inArray(this,E)<0:this!=E})},add:function(E){return this.pushStack(o.unique(o.merge(this.get(),typeof E==="string"?o(E):o.makeArray(E))))},is:function(E){return !!E&&o.multiFilter(E,this).length>0},hasClass:function(E){return !!E&&this.is("."+E)},val:function(K){if(K===g){var E=this[0];if(E){if(o.nodeName(E,"option")){return(E.attributes.value||{}).specified?E.value:E.text}if(o.nodeName(E,"select")){var I=E.selectedIndex,L=[],M=E.options,H=E.type=="select-one";if(I<0){return null}for(var F=H?I:0,J=H?I+1:M.length;F<J;F++){var G=M[F];if(G.selected){K=o(G).val();if(H){return K}L.push(K)}}return L}return(E.value||"").replace(/\r/g,"")}return g}if(typeof K==="number"){K+=""}return this.each(function(){if(this.nodeType!=1){return}if(o.isArray(K)&&/radio|checkbox/.test(this.type)){this.checked=(o.inArray(this.value,K)>=0||o.inArray(this.name,K)>=0)}else{if(o.nodeName(this,"select")){var N=o.makeArray(K);o("option",this).each(function(){this.selected=(o.inArray(this.value,N)>=0||o.inArray(this.text,N)>=0)});if(!N.length){this.selectedIndex=-1}}else{this.value=K}}})},html:function(E){return E===g?(this[0]?this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g,""):null):this.empty().append(E)},replaceWith:function(E){return this.after(E).remove()},eq:function(E){return this.slice(E,+E+1)},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments),"slice",Array.prototype.slice.call(arguments).join(","))},map:function(E){return this.pushStack(o.map(this,function(G,F){return E.call(G,F,G)}))},andSelf:function(){return this.add(this.prevObject)},domManip:function(J,M,L){if(this[0]){var I=(this[0].ownerDocument||this[0]).createDocumentFragment(),F=o.clean(J,(this[0].ownerDocument||this[0]),I),H=I.firstChild;if(H){for(var G=0,E=this.length;G<E;G++){L.call(K(this[G],H),this.length>1||G>0?I.cloneNode(true):I)}}if(F){o.each(F,z)}}return this;function K(N,O){return M&&o.nodeName(N,"table")&&o.nodeName(O,"tr")?(N.getElementsByTagName("tbody")[0]||N.appendChild(N.ownerDocument.createElement("tbody"))):N}}};o.fn.init.prototype=o.fn;function z(E,F){if(F.src){o.ajax({url:F.src,async:false,dataType:"script"})}else{o.globalEval(F.text||F.textContent||F.innerHTML||"")}if(F.parentNode){F.parentNode.removeChild(F)}}function e(){return +new Date}o.extend=o.fn.extend=function(){var J=arguments[0]||{},H=1,I=arguments.length,E=false,G;if(typeof J==="boolean"){E=J;J=arguments[1]||{};H=2}if(typeof J!=="object"&&!o.isFunction(J)){J={}}if(I==H){J=this;--H}for(;H<I;H++){if((G=arguments[H])!=null){for(var F in G){var K=J[F],L=G[F];if(J===L){continue}if(E&&L&&typeof L==="object"&&!L.nodeType){J[F]=o.extend(E,K||(L.length!=null?[]:{}),L)}else{if(L!==g){J[F]=L}}}}}return J};var b=/z-?index|font-?weight|opacity|zoom|line-?height/i,q=document.defaultView||{},s=Object.prototype.toString;o.extend({noConflict:function(E){l.$=p;if(E){l.jQuery=y}return o},isFunction:function(E){return s.call(E)==="[object Function]"},isArray:function(E){return s.call(E)==="[object Array]"},isXMLDoc:function(E){return E.nodeType===9&&E.documentElement.nodeName!=="HTML"||!!E.ownerDocument&&o.isXMLDoc(E.ownerDocument)},globalEval:function(G){if(G&&/\S/.test(G)){var F=document.getElementsByTagName("head")[0]||document.documentElement,E=document.createElement("script");E.type="text/javascript";if(o.support.scriptEval){E.appendChild(document.createTextNode(G))}else{E.text=G}F.insertBefore(E,F.firstChild);F.removeChild(E)}},nodeName:function(F,E){return F.nodeName&&F.nodeName.toUpperCase()==E.toUpperCase()},each:function(G,K,F){var E,H=0,I=G.length;if(F){if(I===g){for(E in G){if(K.apply(G[E],F)===false){break}}}else{for(;H<I;){if(K.apply(G[H++],F)===false){break}}}}else{if(I===g){for(E in G){if(K.call(G[E],E,G[E])===false){break}}}else{for(var J=G[0];H<I&&K.call(J,H,J)!==false;J=G[++H]){}}}return G},prop:function(H,I,G,F,E){if(o.isFunction(I)){I=I.call(H,F)}return typeof I==="number"&&G=="curCSS"&&!b.test(E)?I+"px":I},className:{add:function(E,F){o.each((F||"").split(/\s+/),function(G,H){if(E.nodeType==1&&!o.className.has(E.className,H)){E.className+=(E.className?" ":"")+H}})},remove:function(E,F){if(E.nodeType==1){E.className=F!==g?o.grep(E.className.split(/\s+/),function(G){return !o.className.has(F,G)}).join(" "):""}},has:function(F,E){return F&&o.inArray(E,(F.className||F).toString().split(/\s+/))>-1}},swap:function(H,G,I){var E={};for(var F in G){E[F]=H.style[F];H.style[F]=G[F]}I.call(H);for(var F in G){H.style[F]=E[F]}},css:function(H,F,J,E){if(F=="width"||F=="height"){var L,G={position:"absolute",visibility:"hidden",display:"block"},K=F=="width"?["Left","Right"]:["Top","Bottom"];function I(){L=F=="width"?H.offsetWidth:H.offsetHeight;if(E==="border"){return}o.each(K,function(){if(!E){L-=parseFloat(o.curCSS(H,"padding"+this,true))||0}if(E==="margin"){L+=parseFloat(o.curCSS(H,"margin"+this,true))||0}else{L-=parseFloat(o.curCSS(H,"border"+this+"Width",true))||0}})}if(H.offsetWidth!==0){I()}else{o.swap(H,G,I)}return Math.max(0,Math.round(L))}return o.curCSS(H,F,J)},curCSS:function(I,F,G){var L,E=I.style;if(F=="opacity"&&!o.support.opacity){L=o.attr(E,"opacity");return L==""?"1":L}if(F.match(/float/i)){F=w}if(!G&&E&&E[F]){L=E[F]}else{if(q.getComputedStyle){if(F.match(/float/i)){F="float"}F=F.replace(/([A-Z])/g,"-$1").toLowerCase();var M=q.getComputedStyle(I,null);if(M){L=M.getPropertyValue(F)}if(F=="opacity"&&L==""){L="1"}}else{if(I.currentStyle){var J=F.replace(/\-(\w)/g,function(N,O){return O.toUpperCase()});L=I.currentStyle[F]||I.currentStyle[J];if(!/^\d+(px)?$/i.test(L)&&/^\d/.test(L)){var H=E.left,K=I.runtimeStyle.left;I.runtimeStyle.left=I.currentStyle.left;E.left=L||0;L=E.pixelLeft+"px";E.left=H;I.runtimeStyle.left=K}}}}return L},clean:function(F,K,I){K=K||document;if(typeof K.createElement==="undefined"){K=K.ownerDocument||K[0]&&K[0].ownerDocument||document}if(!I&&F.length===1&&typeof F[0]==="string"){var H=/^<(\w+)\s*\/?>$/.exec(F[0]);if(H){return[K.createElement(H[1])]}}var G=[],E=[],L=K.createElement("div");o.each(F,function(P,S){if(typeof S==="number"){S+=""}if(!S){return}if(typeof S==="string"){S=S.replace(/(<(\w+)[^>]*?)\/>/g,function(U,V,T){return T.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?U:V+"></"+T+">"});var O=S.replace(/^\s+/,"").substring(0,10).toLowerCase();var Q=!O.indexOf("<opt")&&[1,"<select multiple='multiple'>","</select>"]||!O.indexOf("<leg")&&[1,"<fieldset>","</fieldset>"]||O.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"<table>","</table>"]||!O.indexOf("<tr")&&[2,"<table><tbody>","</tbody></table>"]||(!O.indexOf("<td")||!O.indexOf("<th"))&&[3,"<table><tbody><tr>","</tr></tbody></table>"]||!O.indexOf("<col")&&[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"]||!o.support.htmlSerialize&&[1,"div<div>","</div>"]||[0,"",""];L.innerHTML=Q[1]+S+Q[2];while(Q[0]--){L=L.lastChild}if(!o.support.tbody){var R=/<tbody/i.test(S),N=!O.indexOf("<table")&&!R?L.firstChild&&L.firstChild.childNodes:Q[1]=="<table>"&&!R?L.childNodes:[];for(var M=N.length-1;M>=0;--M){if(o.nodeName(N[M],"tbody")&&!N[M].childNodes.length){N[M].parentNode.removeChild(N[M])}}}if(!o.support.leadingWhitespace&&/^\s/.test(S)){L.insertBefore(K.createTextNode(S.match(/^\s*/)[0]),L.firstChild)}S=o.makeArray(L.childNodes)}if(S.nodeType){G.push(S)}else{G=o.merge(G,S)}});if(I){for(var J=0;G[J];J++){if(o.nodeName(G[J],"script")&&(!G[J].type||G[J].type.toLowerCase()==="text/javascript")){E.push(G[J].parentNode?G[J].parentNode.removeChild(G[J]):G[J])}else{if(G[J].nodeType===1){G.splice.apply(G,[J+1,0].concat(o.makeArray(G[J].getElementsByTagName("script"))))}I.appendChild(G[J])}}return E}return G},attr:function(J,G,K){if(!J||J.nodeType==3||J.nodeType==8){return g}var H=!o.isXMLDoc(J),L=K!==g;G=H&&o.props[G]||G;if(J.tagName){var F=/href|src|style/.test(G);if(G=="selected"&&J.parentNode){J.parentNode.selectedIndex}if(G in J&&H&&!F){if(L){if(G=="type"&&o.nodeName(J,"input")&&J.parentNode){throw"type property can't be changed"}J[G]=K}if(o.nodeName(J,"form")&&J.getAttributeNode(G)){return J.getAttributeNode(G).nodeValue}if(G=="tabIndex"){var I=J.getAttributeNode("tabIndex");return I&&I.specified?I.value:J.nodeName.match(/(button|input|object|select|textarea)/i)?0:J.nodeName.match(/^(a|area)$/i)&&J.href?0:g}return J[G]}if(!o.support.style&&H&&G=="style"){return o.attr(J.style,"cssText",K)}if(L){J.setAttribute(G,""+K)}var E=!o.support.hrefNormalized&&H&&F?J.getAttribute(G,2):J.getAttribute(G);return E===null?g:E}if(!o.support.opacity&&G=="opacity"){if(L){J.zoom=1;J.filter=(J.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(K)+""=="NaN"?"":"alpha(opacity="+K*100+")")}return J.filter&&J.filter.indexOf("opacity=")>=0?(parseFloat(J.filter.match(/opacity=([^)]*)/)[1])/100)+"":""}G=G.replace(/-([a-z])/ig,function(M,N){return N.toUpperCase()});if(L){J[G]=K}return J[G]},trim:function(E){return(E||"").replace(/^\s+|\s+$/g,"")},makeArray:function(G){var E=[];if(G!=null){var F=G.length;if(F==null||typeof G==="string"||o.isFunction(G)||G.setInterval){E[0]=G}else{while(F){E[--F]=G[F]}}}return E},inArray:function(G,H){for(var E=0,F=H.length;E<F;E++){if(H[E]===G){return E}}return -1},merge:function(H,E){var F=0,G,I=H.length;if(!o.support.getAll){while((G=E[F++])!=null){if(G.nodeType!=8){H[I++]=G}}}else{while((G=E[F++])!=null){H[I++]=G}}return H},unique:function(K){var F=[],E={};try{for(var G=0,H=K.length;G<H;G++){var J=o.data(K[G]);if(!E[J]){E[J]=true;F.push(K[G])}}}catch(I){F=K}return F},grep:function(F,J,E){var G=[];for(var H=0,I=F.length;H<I;H++){if(!E!=!J(F[H],H)){G.push(F[H])}}return G},map:function(E,J){var F=[];for(var G=0,H=E.length;G<H;G++){var I=J(E[G],G);if(I!=null){F[F.length]=I}}return F.concat.apply([],F)}});var C=navigator.userAgent.toLowerCase();o.browser={version:(C.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[0,"0"])[1],safari:/webkit/.test(C),opera:/opera/.test(C),msie:/msie/.test(C)&&!/opera/.test(C),mozilla:/mozilla/.test(C)&&!/(compatible|webkit)/.test(C)};o.each({parent:function(E){return E.parentNode},parents:function(E){return o.dir(E,"parentNode")},next:function(E){return o.nth(E,2,"nextSibling")},prev:function(E){return o.nth(E,2,"previousSibling")},nextAll:function(E){return o.dir(E,"nextSibling")},prevAll:function(E){return o.dir(E,"previousSibling")},siblings:function(E){return o.sibling(E.parentNode.firstChild,E)},children:function(E){return o.sibling(E.firstChild)},contents:function(E){return o.nodeName(E,"iframe")?E.contentDocument||E.contentWindow.document:o.makeArray(E.childNodes)}},function(E,F){o.fn[E]=function(G){var H=o.map(this,F);if(G&&typeof G=="string"){H=o.multiFilter(G,H)}return this.pushStack(o.unique(H),E,G)}});o.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(E,F){o.fn[E]=function(G){var J=[],L=o(G);for(var K=0,H=L.length;K<H;K++){
+var I=(K>0?this.clone(true):this).get();o.fn[F].apply(o(L[K]),I);J=J.concat(I)}return this.pushStack(J,E,G)}});o.each({removeAttr:function(E){o.attr(this,E,"");if(this.nodeType==1){this.removeAttribute(E)}},addClass:function(E){o.className.add(this,E)},removeClass:function(E){o.className.remove(this,E)},toggleClass:function(F,E){if(typeof E!=="boolean"){E=!o.className.has(this,F)}o.className[E?"add":"remove"](this,F)},remove:function(E){if(!E||o.filter(E,[this]).length){o("*",this).add([this]).each(function(){o.event.remove(this);o.removeData(this)});if(this.parentNode){this.parentNode.removeChild(this)}}},empty:function(){o(this).children().remove();while(this.firstChild){this.removeChild(this.firstChild)}}},function(E,F){o.fn[E]=function(){return this.each(F,arguments)}});function j(E,F){return E[0]&&parseInt(o.curCSS(E[0],F,true),10)||0}var h="jQuery"+e(),v=0,A={};o.extend({cache:{},data:function(F,E,G){F=F==l?A:F;var H=F[h];if(!H){H=F[h]=++v}if(E&&!o.cache[H]){o.cache[H]={}}if(G!==g){o.cache[H][E]=G}return E?o.cache[H][E]:H},removeData:function(F,E){F=F==l?A:F;var H=F[h];if(E){if(o.cache[H]){delete o.cache[H][E];E="";for(E in o.cache[H]){break}if(!E){o.removeData(F)}}}else{try{delete F[h]}catch(G){if(F.removeAttribute){F.removeAttribute(h)}}delete o.cache[H]}},queue:function(F,E,H){if(F){E=(E||"fx")+"queue";var G=o.data(F,E);if(!G||o.isArray(H)){G=o.data(F,E,o.makeArray(H))}else{if(H){G.push(H)}}}return G},dequeue:function(H,G){var E=o.queue(H,G),F=E.shift();if(!G||G==="fx"){F=E[0]}if(F!==g){F.call(H)}}});o.fn.extend({data:function(E,G){var H=E.split(".");H[1]=H[1]?"."+H[1]:"";if(G===g){var F=this.triggerHandler("getData"+H[1]+"!",[H[0]]);if(F===g&&this.length){F=o.data(this[0],E)}return F===g&&H[1]?this.data(H[0]):F}else{return this.trigger("setData"+H[1]+"!",[H[0],G]).each(function(){o.data(this,E,G)})}},removeData:function(E){return this.each(function(){o.removeData(this,E)})},queue:function(E,F){if(typeof E!=="string"){F=E;E="fx"}if(F===g){return o.queue(this[0],E)}return this.each(function(){var G=o.queue(this,E,F);if(E=="fx"&&G.length==1){G[0].call(this)}})},dequeue:function(E){return this.each(function(){o.dequeue(this,E)})}});
+/*
+ * Sizzle CSS Selector Engine - v0.9.3
+ *  Copyright 2009, The Dojo Foundation
+ *  Released under the MIT, BSD, and GPL Licenses.
+ *  More information: http://sizzlejs.com/
+ */
+(function(){var R=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?/g,L=0,H=Object.prototype.toString;var F=function(Y,U,ab,ac){ab=ab||[];U=U||document;if(U.nodeType!==1&&U.nodeType!==9){return[]}if(!Y||typeof Y!=="string"){return ab}var Z=[],W,af,ai,T,ad,V,X=true;R.lastIndex=0;while((W=R.exec(Y))!==null){Z.push(W[1]);if(W[2]){V=RegExp.rightContext;break}}if(Z.length>1&&M.exec(Y)){if(Z.length===2&&I.relative[Z[0]]){af=J(Z[0]+Z[1],U)}else{af=I.relative[Z[0]]?[U]:F(Z.shift(),U);while(Z.length){Y=Z.shift();if(I.relative[Y]){Y+=Z.shift()}af=J(Y,af)}}}else{var ae=ac?{expr:Z.pop(),set:E(ac)}:F.find(Z.pop(),Z.length===1&&U.parentNode?U.parentNode:U,Q(U));af=F.filter(ae.expr,ae.set);if(Z.length>0){ai=E(af)}else{X=false}while(Z.length){var ah=Z.pop(),ag=ah;if(!I.relative[ah]){ah=""}else{ag=Z.pop()}if(ag==null){ag=U}I.relative[ah](ai,ag,Q(U))}}if(!ai){ai=af}if(!ai){throw"Syntax error, unrecognized expression: "+(ah||Y)}if(H.call(ai)==="[object Array]"){if(!X){ab.push.apply(ab,ai)}else{if(U.nodeType===1){for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&(ai[aa]===true||ai[aa].nodeType===1&&K(U,ai[aa]))){ab.push(af[aa])}}}else{for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&ai[aa].nodeType===1){ab.push(af[aa])}}}}}else{E(ai,ab)}if(V){F(V,U,ab,ac);if(G){hasDuplicate=false;ab.sort(G);if(hasDuplicate){for(var aa=1;aa<ab.length;aa++){if(ab[aa]===ab[aa-1]){ab.splice(aa--,1)}}}}}return ab};F.matches=function(T,U){return F(T,null,null,U)};F.find=function(aa,T,ab){var Z,X;if(!aa){return[]}for(var W=0,V=I.order.length;W<V;W++){var Y=I.order[W],X;if((X=I.match[Y].exec(aa))){var U=RegExp.leftContext;if(U.substr(U.length-1)!=="\\"){X[1]=(X[1]||"").replace(/\\/g,"");Z=I.find[Y](X,T,ab);if(Z!=null){aa=aa.replace(I.match[Y],"");break}}}}if(!Z){Z=T.getElementsByTagName("*")}return{set:Z,expr:aa}};F.filter=function(ad,ac,ag,W){var V=ad,ai=[],aa=ac,Y,T,Z=ac&&ac[0]&&Q(ac[0]);while(ad&&ac.length){for(var ab in I.filter){if((Y=I.match[ab].exec(ad))!=null){var U=I.filter[ab],ah,af;T=false;if(aa==ai){ai=[]}if(I.preFilter[ab]){Y=I.preFilter[ab](Y,aa,ag,ai,W,Z);if(!Y){T=ah=true}else{if(Y===true){continue}}}if(Y){for(var X=0;(af=aa[X])!=null;X++){if(af){ah=U(af,Y,X,aa);var ae=W^!!ah;if(ag&&ah!=null){if(ae){T=true}else{aa[X]=false}}else{if(ae){ai.push(af);T=true}}}}}if(ah!==g){if(!ag){aa=ai}ad=ad.replace(I.match[ab],"");if(!T){return[]}break}}}if(ad==V){if(T==null){throw"Syntax error, unrecognized expression: "+ad}else{break}}V=ad}return aa};var I=F.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF_-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF_-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*_-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF_-]|\\.)+)(?:\((['"]*)((?:\([^\)]+\)|[^\2\(\)]*)+)\2\))?/},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(T){return T.getAttribute("href")}},relative:{"+":function(aa,T,Z){var X=typeof T==="string",ab=X&&!/\W/.test(T),Y=X&&!ab;if(ab&&!Z){T=T.toUpperCase()}for(var W=0,V=aa.length,U;W<V;W++){if((U=aa[W])){while((U=U.previousSibling)&&U.nodeType!==1){}aa[W]=Y||U&&U.nodeName===T?U||false:U===T}}if(Y){F.filter(T,aa,true)}},">":function(Z,U,aa){var X=typeof U==="string";if(X&&!/\W/.test(U)){U=aa?U:U.toUpperCase();for(var V=0,T=Z.length;V<T;V++){var Y=Z[V];if(Y){var W=Y.parentNode;Z[V]=W.nodeName===U?W:false}}}else{for(var V=0,T=Z.length;V<T;V++){var Y=Z[V];if(Y){Z[V]=X?Y.parentNode:Y.parentNode===U}}if(X){F.filter(U,Z,true)}}},"":function(W,U,Y){var V=L++,T=S;if(!U.match(/\W/)){var X=U=Y?U:U.toUpperCase();T=P}T("parentNode",U,V,W,X,Y)},"~":function(W,U,Y){var V=L++,T=S;if(typeof U==="string"&&!U.match(/\W/)){var X=U=Y?U:U.toUpperCase();T=P}T("previousSibling",U,V,W,X,Y)}},find:{ID:function(U,V,W){if(typeof V.getElementById!=="undefined"&&!W){var T=V.getElementById(U[1]);return T?[T]:[]}},NAME:function(V,Y,Z){if(typeof Y.getElementsByName!=="undefined"){var U=[],X=Y.getElementsByName(V[1]);for(var W=0,T=X.length;W<T;W++){if(X[W].getAttribute("name")===V[1]){U.push(X[W])}}return U.length===0?null:U}},TAG:function(T,U){return U.getElementsByTagName(T[1])}},preFilter:{CLASS:function(W,U,V,T,Z,aa){W=" "+W[1].replace(/\\/g,"")+" ";if(aa){return W}for(var X=0,Y;(Y=U[X])!=null;X++){if(Y){if(Z^(Y.className&&(" "+Y.className+" ").indexOf(W)>=0)){if(!V){T.push(Y)}}else{if(V){U[X]=false}}}}return false},ID:function(T){return T[1].replace(/\\/g,"")},TAG:function(U,T){for(var V=0;T[V]===false;V++){}return T[V]&&Q(T[V])?U[1]:U[1].toUpperCase()},CHILD:function(T){if(T[1]=="nth"){var U=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(T[2]=="even"&&"2n"||T[2]=="odd"&&"2n+1"||!/\D/.test(T[2])&&"0n+"+T[2]||T[2]);T[2]=(U[1]+(U[2]||1))-0;T[3]=U[3]-0}T[0]=L++;return T},ATTR:function(X,U,V,T,Y,Z){var W=X[1].replace(/\\/g,"");if(!Z&&I.attrMap[W]){X[1]=I.attrMap[W]}if(X[2]==="~="){X[4]=" "+X[4]+" "}return X},PSEUDO:function(X,U,V,T,Y){if(X[1]==="not"){if(X[3].match(R).length>1||/^\w/.test(X[3])){X[3]=F(X[3],null,null,U)}else{var W=F.filter(X[3],U,V,true^Y);if(!V){T.push.apply(T,W)}return false}}else{if(I.match.POS.test(X[0])||I.match.CHILD.test(X[0])){return true}}return X},POS:function(T){T.unshift(true);return T}},filters:{enabled:function(T){return T.disabled===false&&T.type!=="hidden"},disabled:function(T){return T.disabled===true},checked:function(T){return T.checked===true},selected:function(T){T.parentNode.selectedIndex;return T.selected===true},parent:function(T){return !!T.firstChild},empty:function(T){return !T.firstChild},has:function(V,U,T){return !!F(T[3],V).length},header:function(T){return/h\d/i.test(T.nodeName)},text:function(T){return"text"===T.type},radio:function(T){return"radio"===T.type},checkbox:function(T){return"checkbox"===T.type},file:function(T){return"file"===T.type},password:function(T){return"password"===T.type},submit:function(T){return"submit"===T.type},image:function(T){return"image"===T.type},reset:function(T){return"reset"===T.type},button:function(T){return"button"===T.type||T.nodeName.toUpperCase()==="BUTTON"},input:function(T){return/input|select|textarea|button/i.test(T.nodeName)}},setFilters:{first:function(U,T){return T===0},last:function(V,U,T,W){return U===W.length-1},even:function(U,T){return T%2===0},odd:function(U,T){return T%2===1},lt:function(V,U,T){return U<T[3]-0},gt:function(V,U,T){return U>T[3]-0},nth:function(V,U,T){return T[3]-0==U},eq:function(V,U,T){return T[3]-0==U}},filter:{PSEUDO:function(Z,V,W,aa){var U=V[1],X=I.filters[U];if(X){return X(Z,W,V,aa)}else{if(U==="contains"){return(Z.textContent||Z.innerText||"").indexOf(V[3])>=0}else{if(U==="not"){var Y=V[3];for(var W=0,T=Y.length;W<T;W++){if(Y[W]===Z){return false}}return true}}}},CHILD:function(T,W){var Z=W[1],U=T;switch(Z){case"only":case"first":while(U=U.previousSibling){if(U.nodeType===1){return false}}if(Z=="first"){return true}U=T;case"last":while(U=U.nextSibling){if(U.nodeType===1){return false}}return true;case"nth":var V=W[2],ac=W[3];if(V==1&&ac==0){return true}var Y=W[0],ab=T.parentNode;if(ab&&(ab.sizcache!==Y||!T.nodeIndex)){var X=0;for(U=ab.firstChild;U;U=U.nextSibling){if(U.nodeType===1){U.nodeIndex=++X}}ab.sizcache=Y}var aa=T.nodeIndex-ac;if(V==0){return aa==0}else{return(aa%V==0&&aa/V>=0)}}},ID:function(U,T){return U.nodeType===1&&U.getAttribute("id")===T},TAG:function(U,T){return(T==="*"&&U.nodeType===1)||U.nodeName===T},CLASS:function(U,T){return(" "+(U.className||U.getAttribute("class"))+" ").indexOf(T)>-1},ATTR:function(Y,W){var V=W[1],T=I.attrHandle[V]?I.attrHandle[V](Y):Y[V]!=null?Y[V]:Y.getAttribute(V),Z=T+"",X=W[2],U=W[4];return T==null?X==="!=":X==="="?Z===U:X==="*="?Z.indexOf(U)>=0:X==="~="?(" "+Z+" ").indexOf(U)>=0:!U?Z&&T!==false:X==="!="?Z!=U:X==="^="?Z.indexOf(U)===0:X==="$="?Z.substr(Z.length-U.length)===U:X==="|="?Z===U||Z.substr(0,U.length+1)===U+"-":false},POS:function(X,U,V,Y){var T=U[2],W=I.setFilters[T];if(W){return W(X,V,U,Y)}}}};var M=I.match.POS;for(var O in I.match){I.match[O]=RegExp(I.match[O].source+/(?![^\[]*\])(?![^\(]*\))/.source)}var E=function(U,T){U=Array.prototype.slice.call(U);if(T){T.push.apply(T,U);return T}return U};try{Array.prototype.slice.call(document.documentElement.childNodes)}catch(N){E=function(X,W){var U=W||[];if(H.call(X)==="[object Array]"){Array.prototype.push.apply(U,X)}else{if(typeof X.length==="number"){for(var V=0,T=X.length;V<T;V++){U.push(X[V])}}else{for(var V=0;X[V];V++){U.push(X[V])}}}return U}}var G;if(document.documentElement.compareDocumentPosition){G=function(U,T){var V=U.compareDocumentPosition(T)&4?-1:U===T?0:1;if(V===0){hasDuplicate=true}return V}}else{if("sourceIndex" in document.documentElement){G=function(U,T){var V=U.sourceIndex-T.sourceIndex;if(V===0){hasDuplicate=true}return V}}else{if(document.createRange){G=function(W,U){var V=W.ownerDocument.createRange(),T=U.ownerDocument.createRange();V.selectNode(W);V.collapse(true);T.selectNode(U);T.collapse(true);var X=V.compareBoundaryPoints(Range.START_TO_END,T);if(X===0){hasDuplicate=true}return X}}}}(function(){var U=document.createElement("form"),V="script"+(new Date).getTime();U.innerHTML="<input name='"+V+"'/>";var T=document.documentElement;T.insertBefore(U,T.firstChild);if(!!document.getElementById(V)){I.find.ID=function(X,Y,Z){if(typeof Y.getElementById!=="undefined"&&!Z){var W=Y.getElementById(X[1]);return W?W.id===X[1]||typeof W.getAttributeNode!=="undefined"&&W.getAttributeNode("id").nodeValue===X[1]?[W]:g:[]}};I.filter.ID=function(Y,W){var X=typeof Y.getAttributeNode!=="undefined"&&Y.getAttributeNode("id");return Y.nodeType===1&&X&&X.nodeValue===W}}T.removeChild(U)})();(function(){var T=document.createElement("div");T.appendChild(document.createComment(""));if(T.getElementsByTagName("*").length>0){I.find.TAG=function(U,Y){var X=Y.getElementsByTagName(U[1]);if(U[1]==="*"){var W=[];for(var V=0;X[V];V++){if(X[V].nodeType===1){W.push(X[V])}}X=W}return X}}T.innerHTML="<a href='#'></a>";if(T.firstChild&&typeof T.firstChild.getAttribute!=="undefined"&&T.firstChild.getAttribute("href")!=="#"){I.attrHandle.href=function(U){return U.getAttribute("href",2)}}})();if(document.querySelectorAll){(function(){var T=F,U=document.createElement("div");U.innerHTML="<p class='TEST'></p>";if(U.querySelectorAll&&U.querySelectorAll(".TEST").length===0){return}F=function(Y,X,V,W){X=X||document;if(!W&&X.nodeType===9&&!Q(X)){try{return E(X.querySelectorAll(Y),V)}catch(Z){}}return T(Y,X,V,W)};F.find=T.find;F.filter=T.filter;F.selectors=T.selectors;F.matches=T.matches})()}if(document.getElementsByClassName&&document.documentElement.getElementsByClassName){(function(){var T=document.createElement("div");T.innerHTML="<div class='test e'></div><div class='test'></div>";if(T.getElementsByClassName("e").length===0){return}T.lastChild.className="e";if(T.getElementsByClassName("e").length===1){return}I.order.splice(1,0,"CLASS");I.find.CLASS=function(U,V,W){if(typeof V.getElementsByClassName!=="undefined"&&!W){return V.getElementsByClassName(U[1])}}})()}function P(U,Z,Y,ad,aa,ac){var ab=U=="previousSibling"&&!ac;for(var W=0,V=ad.length;W<V;W++){var T=ad[W];if(T){if(ab&&T.nodeType===1){T.sizcache=Y;T.sizset=W}T=T[U];var X=false;while(T){if(T.sizcache===Y){X=ad[T.sizset];break}if(T.nodeType===1&&!ac){T.sizcache=Y;T.sizset=W}if(T.nodeName===Z){X=T;break}T=T[U]}ad[W]=X}}}function S(U,Z,Y,ad,aa,ac){var ab=U=="previousSibling"&&!ac;for(var W=0,V=ad.length;W<V;W++){var T=ad[W];if(T){if(ab&&T.nodeType===1){T.sizcache=Y;T.sizset=W}T=T[U];var X=false;while(T){if(T.sizcache===Y){X=ad[T.sizset];break}if(T.nodeType===1){if(!ac){T.sizcache=Y;T.sizset=W}if(typeof Z!=="string"){if(T===Z){X=true;break}}else{if(F.filter(Z,[T]).length>0){X=T;break}}}T=T[U]}ad[W]=X}}}var K=document.compareDocumentPosition?function(U,T){return U.compareDocumentPosition(T)&16}:function(U,T){return U!==T&&(U.contains?U.contains(T):true)};var Q=function(T){return T.nodeType===9&&T.documentElement.nodeName!=="HTML"||!!T.ownerDocument&&Q(T.ownerDocument)};var J=function(T,aa){var W=[],X="",Y,V=aa.nodeType?[aa]:aa;while((Y=I.match.PSEUDO.exec(T))){X+=Y[0];T=T.replace(I.match.PSEUDO,"")}T=I.relative[T]?T+"*":T;for(var Z=0,U=V.length;Z<U;Z++){F(T,V[Z],W)}return F.filter(X,W)};o.find=F;o.filter=F.filter;o.expr=F.selectors;o.expr[":"]=o.expr.filters;F.selectors.filters.hidden=function(T){return T.offsetWidth===0||T.offsetHeight===0};F.selectors.filters.visible=function(T){return T.offsetWidth>0||T.offsetHeight>0};F.selectors.filters.animated=function(T){return o.grep(o.timers,function(U){return T===U.elem}).length};o.multiFilter=function(V,T,U){if(U){V=":not("+V+")"}return F.matches(V,T)};o.dir=function(V,U){var T=[],W=V[U];while(W&&W!=document){if(W.nodeType==1){T.push(W)}W=W[U]}return T};o.nth=function(X,T,V,W){T=T||1;var U=0;for(;X;X=X[V]){if(X.nodeType==1&&++U==T){break}}return X};o.sibling=function(V,U){var T=[];for(;V;V=V.nextSibling){if(V.nodeType==1&&V!=U){T.push(V)}}return T};return;l.Sizzle=F})();o.event={add:function(I,F,H,K){if(I.nodeType==3||I.nodeType==8){return}if(I.setInterval&&I!=l){I=l}if(!H.guid){H.guid=this.guid++}if(K!==g){var G=H;H=this.proxy(G);H.data=K}var E=o.data(I,"events")||o.data(I,"events",{}),J=o.data(I,"handle")||o.data(I,"handle",function(){return typeof o!=="undefined"&&!o.event.triggered?o.event.handle.apply(arguments.callee.elem,arguments):g});J.elem=I;o.each(F.split(/\s+/),function(M,N){var O=N.split(".");N=O.shift();H.type=O.slice().sort().join(".");var L=E[N];if(o.event.specialAll[N]){o.event.specialAll[N].setup.call(I,K,O)}if(!L){L=E[N]={};if(!o.event.special[N]||o.event.special[N].setup.call(I,K,O)===false){if(I.addEventListener){I.addEventListener(N,J,false)}else{if(I.attachEvent){I.attachEvent("on"+N,J)}}}}L[H.guid]=H;o.event.global[N]=true});I=null},guid:1,global:{},remove:function(K,H,J){if(K.nodeType==3||K.nodeType==8){return}var G=o.data(K,"events"),F,E;if(G){if(H===g||(typeof H==="string"&&H.charAt(0)==".")){for(var I in G){this.remove(K,I+(H||""))}}else{if(H.type){J=H.handler;H=H.type}o.each(H.split(/\s+/),function(M,O){var Q=O.split(".");O=Q.shift();var N=RegExp("(^|\\.)"+Q.slice().sort().join(".*\\.")+"(\\.|$)");if(G[O]){if(J){delete G[O][J.guid]}else{for(var P in G[O]){if(N.test(G[O][P].type)){delete G[O][P]}}}if(o.event.specialAll[O]){o.event.specialAll[O].teardown.call(K,Q)}for(F in G[O]){break}if(!F){if(!o.event.special[O]||o.event.special[O].teardown.call(K,Q)===false){if(K.removeEventListener){K.removeEventListener(O,o.data(K,"handle"),false)}else{if(K.detachEvent){K.detachEvent("on"+O,o.data(K,"handle"))}}}F=null;delete G[O]}}})}for(F in G){break}if(!F){var L=o.data(K,"handle");if(L){L.elem=null}o.removeData(K,"events");o.removeData(K,"handle")}}},trigger:function(I,K,H,E){var G=I.type||I;if(!E){I=typeof I==="object"?I[h]?I:o.extend(o.Event(G),I):o.Event(G);if(G.indexOf("!")>=0)
+{I.type=G=G.slice(0,-1);I.exclusive=true}if(!H){I.stopPropagation();if(this.global[G]){o.each(o.cache,function(){if(this.events&&this.events[G]){o.event.trigger(I,K,this.handle.elem)}})}}if(!H||H.nodeType==3||H.nodeType==8){return g}I.result=g;I.target=H;K=o.makeArray(K);K.unshift(I)}I.currentTarget=H;var J=o.data(H,"handle");if(J){J.apply(H,K)}if((!H[G]||(o.nodeName(H,"a")&&G=="click"))&&H["on"+G]&&H["on"+G].apply(H,K)===false){I.result=false}if(!E&&H[G]&&!I.isDefaultPrevented()&&!(o.nodeName(H,"a")&&G=="click")){this.triggered=true;try{H[G]()}catch(L){}}this.triggered=false;if(!I.isPropagationStopped()){var F=H.parentNode||H.ownerDocument;if(F){o.event.trigger(I,K,F,true)}}},handle:function(K){var J,E;K=arguments[0]=o.event.fix(K||l.event);K.currentTarget=this;var L=K.type.split(".");K.type=L.shift();J=!L.length&&!K.exclusive;var I=RegExp("(^|\\.)"+L.slice().sort().join(".*\\.")+"(\\.|$)");E=(o.data(this,"events")||{})[K.type];for(var G in E){var H=E[G];if(J||I.test(H.type)){K.handler=H;K.data=H.data;var F=H.apply(this,arguments);if(F!==g){K.result=F;if(F===false){K.preventDefault();K.stopPropagation()}}if(K.isImmediatePropagationStopped()){break}}}},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(H){if(H[h]){return H}var F=H;H=o.Event(F);for(var G=this.props.length,J;G;){J=this.props[--G];H[J]=F[J]}if(!H.target){H.target=H.srcElement||document}if(H.target.nodeType==3){H.target=H.target.parentNode}if(!H.relatedTarget&&H.fromElement){H.relatedTarget=H.fromElement==H.target?H.toElement:H.fromElement}if(H.pageX==null&&H.clientX!=null){var I=document.documentElement,E=document.body;H.pageX=H.clientX+(I&&I.scrollLeft||E&&E.scrollLeft||0)-(I.clientLeft||0);H.pageY=H.clientY+(I&&I.scrollTop||E&&E.scrollTop||0)-(I.clientTop||0)}if(!H.which&&((H.charCode||H.charCode===0)?H.charCode:H.keyCode)){H.which=H.charCode||H.keyCode}if(!H.metaKey&&H.ctrlKey){H.metaKey=H.ctrlKey}if(!H.which&&H.button){H.which=(H.button&1?1:(H.button&2?3:(H.button&4?2:0)))}return H},proxy:function(F,E){E=E||function(){return F.apply(this,arguments)};E.guid=F.guid=F.guid||E.guid||this.guid++;return E},special:{ready:{setup:B,teardown:function(){}}},specialAll:{live:{setup:function(E,F){o.event.add(this,F[0],c)},teardown:function(G){if(G.length){var E=0,F=RegExp("(^|\\.)"+G[0]+"(\\.|$)");o.each((o.data(this,"events").live||{}),function(){if(F.test(this.type)){E++}});if(E<1){o.event.remove(this,G[0],c)}}}}}};o.Event=function(E){if(!this.preventDefault){return new o.Event(E)}if(E&&E.type){this.originalEvent=E;this.type=E.type}else{this.type=E}this.timeStamp=e();this[h]=true};function k(){return false}function u(){return true}o.Event.prototype={preventDefault:function(){this.isDefaultPrevented=u;var E=this.originalEvent;if(!E){return}if(E.preventDefault){E.preventDefault()}E.returnValue=false},stopPropagation:function(){this.isPropagationStopped=u;var E=this.originalEvent;if(!E){return}if(E.stopPropagation){E.stopPropagation()}E.cancelBubble=true},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=u;this.stopPropagation()},isDefaultPrevented:k,isPropagationStopped:k,isImmediatePropagationStopped:k};var a=function(F){var E=F.relatedTarget;while(E&&E!=this){try{E=E.parentNode}catch(G){E=this}}if(E!=this){F.type=F.data;o.event.handle.apply(this,arguments)}};o.each({mouseover:"mouseenter",mouseout:"mouseleave"},function(F,E){o.event.special[E]={setup:function(){o.event.add(this,F,a,E)},teardown:function(){o.event.remove(this,F,a)}}});o.fn.extend({bind:function(F,G,E){return F=="unload"?this.one(F,G,E):this.each(function(){o.event.add(this,F,E||G,E&&G)})},one:function(G,H,F){var E=o.event.proxy(F||H,function(I){o(this).unbind(I,E);return(F||H).apply(this,arguments)});return this.each(function(){o.event.add(this,G,E,F&&H)})},unbind:function(F,E){return this.each(function(){o.event.remove(this,F,E)})},trigger:function(E,F){return this.each(function(){o.event.trigger(E,F,this)})},triggerHandler:function(E,G){if(this[0]){var F=o.Event(E);F.preventDefault();F.stopPropagation();o.event.trigger(F,G,this[0]);return F.result}},toggle:function(G){var E=arguments,F=1;while(F<E.length){o.event.proxy(G,E[F++])}return this.click(o.event.proxy(G,function(H){this.lastToggle=(this.lastToggle||0)%F;H.preventDefault();return E[this.lastToggle++].apply(this,arguments)||false}))},hover:function(E,F){return this.mouseenter(E).mouseleave(F)},ready:function(E){B();if(o.isReady){E.call(document,o)}else{o.readyList.push(E)}return this},live:function(G,F){var E=o.event.proxy(F);E.guid+=this.selector+G;o(document).bind(i(G,this.selector),this.selector,E);return this},die:function(F,E){o(document).unbind(i(F,this.selector),E?{guid:E.guid+this.selector+F}:null);return this}});function c(H){var E=RegExp("(^|\\.)"+H.type+"(\\.|$)"),G=true,F=[];o.each(o.data(this,"events").live||[],function(I,J){if(E.test(J.type)){var K=o(H.target).closest(J.data)[0];if(K){F.push({elem:K,fn:J})}}});F.sort(function(J,I){return o.data(J.elem,"closest")-o.data(I.elem,"closest")});o.each(F,function(){if(this.fn.call(this.elem,H,this.fn.data)===false){return(G=false)}});return G}function i(F,E){return["live",F,E.replace(/\./g,"`").replace(/ /g,"|")].join(".")}o.extend({isReady:false,readyList:[],ready:function(){if(!o.isReady){o.isReady=true;if(o.readyList){o.each(o.readyList,function(){this.call(document,o)});o.readyList=null}o(document).triggerHandler("ready")}}});var x=false;function B(){if(x){return}x=true;if(document.addEventListener){document.addEventListener("DOMContentLoaded",function(){document.removeEventListener("DOMContentLoaded",arguments.callee,false);o.ready()},false)}else{if(document.attachEvent){document.attachEvent("onreadystatechange",function(){if(document.readyState==="complete"){document.detachEvent("onreadystatechange",arguments.callee);o.ready()}});if(document.documentElement.doScroll&&l==l.top){(function(){if(o.isReady){return}try{document.documentElement.doScroll("left")}catch(E){setTimeout(arguments.callee,0);return}o.ready()})()}}}o.event.add(l,"load",o.ready)}o.each(("blur,focus,load,resize,scroll,unload,click,dblclick,mousedown,mouseup,mousemove,mouseover,mouseout,mouseenter,mouseleave,change,select,submit,keydown,keypress,keyup,error").split(","),function(F,E){o.fn[E]=function(G){return G?this.bind(E,G):this.trigger(E)}});o(l).bind("unload",function(){for(var E in o.cache){if(E!=1&&o.cache[E].handle){o.event.remove(o.cache[E].handle.elem)}}});(function(){o.support={};var F=document.documentElement,G=document.createElement("script"),K=document.createElement("div"),J="script"+(new Date).getTime();K.style.display="none";K.innerHTML='   <link/><table></table><a href="/a" style="color:red;float:left;opacity:.5;">a</a><select><option>text</option></select><object><param/></object>';var H=K.getElementsByTagName("*"),E=K.getElementsByTagName("a")[0];if(!H||!H.length||!E){return}o.support={leadingWhitespace:K.firstChild.nodeType==3,tbody:!K.getElementsByTagName("tbody").length,objectAll:!!K.getElementsByTagName("object")[0].getElementsByTagName("*").length,htmlSerialize:!!K.getElementsByTagName("link").length,style:/red/.test(E.getAttribute("style")),hrefNormalized:E.getAttribute("href")==="/a",opacity:E.style.opacity==="0.5",cssFloat:!!E.style.cssFloat,scriptEval:false,noCloneEvent:true,boxModel:null};G.type="text/javascript";try{G.appendChild(document.createTextNode("window."+J+"=1;"))}catch(I){}F.insertBefore(G,F.firstChild);if(l[J]){o.support.scriptEval=true;delete l[J]}F.removeChild(G);if(K.attachEvent&&K.fireEvent){K.attachEvent("onclick",function(){o.support.noCloneEvent=false;K.detachEvent("onclick",arguments.callee)});K.cloneNode(true).fireEvent("onclick")}o(function(){var L=document.createElement("div");L.style.width=L.style.paddingLeft="1px";document.body.appendChild(L);o.boxModel=o.support.boxModel=L.offsetWidth===2;document.body.removeChild(L).style.display="none"})})();var w=o.support.cssFloat?"cssFloat":"styleFloat";o.props={"for":"htmlFor","class":"className","float":w,cssFloat:w,styleFloat:w,readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",tabindex:"tabIndex"};o.fn.extend({_load:o.fn.load,load:function(G,J,K){if(typeof G!=="string"){return this._load(G)}var I=G.indexOf(" ");if(I>=0){var E=G.slice(I,G.length);G=G.slice(0,I)}var H="GET";if(J){if(o.isFunction(J)){K=J;J=null}else{if(typeof J==="object"){J=o.param(J);H="POST"}}}var F=this;o.ajax({url:G,type:H,dataType:"html",data:J,complete:function(M,L){if(L=="success"||L=="notmodified"){F.html(E?o("<div/>").append(M.responseText.replace(/<script(.|\s)*?\/script>/g,"")).find(E):M.responseText)}if(K){F.each(K,[M.responseText,L,M])}}});return this},serialize:function(){return o.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?o.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password|search/i.test(this.type))}).map(function(E,F){var G=o(this).val();return G==null?null:o.isArray(G)?o.map(G,function(I,H){return{name:F.name,value:I}}):{name:F.name,value:G}}).get()}});o.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(E,F){o.fn[F]=function(G){return this.bind(F,G)}});var r=e();o.extend({get:function(E,G,H,F){if(o.isFunction(G)){H=G;G=null}return o.ajax({type:"GET",url:E,data:G,success:H,dataType:F})},getScript:function(E,F){return o.get(E,null,F,"script")},getJSON:function(E,F,G){return o.get(E,F,G,"json")},post:function(E,G,H,F){if(o.isFunction(G)){H=G;G={}}return o.ajax({type:"POST",url:E,data:G,success:H,dataType:F})},ajaxSetup:function(E){o.extend(o.ajaxSettings,E)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return l.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest()},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(M){M=o.extend(true,M,o.extend(true,{},o.ajaxSettings,M));var W,F=/=\?(&|$)/g,R,V,G=M.type.toUpperCase();if(M.data&&M.processData&&typeof M.data!=="string"){M.data=o.param(M.data)}if(M.dataType=="jsonp"){if(G=="GET"){if(!M.url.match(F)){M.url+=(M.url.match(/\?/)?"&":"?")+(M.jsonp||"callback")+"=?"}}else{if(!M.data||!M.data.match(F)){M.data=(M.data?M.data+"&":"")+(M.jsonp||"callback")+"=?"}}M.dataType="json"}if(M.dataType=="json"&&(M.data&&M.data.match(F)||M.url.match(F))){W="jsonp"+r++;if(M.data){M.data=(M.data+"").replace(F,"="+W+"$1")}M.url=M.url.replace(F,"="+W+"$1");M.dataType="script";l[W]=function(X){V=X;I();L();l[W]=g;try{delete l[W]}catch(Y){}if(H){H.removeChild(T)}}}if(M.dataType=="script"&&M.cache==null){M.cache=false}if(M.cache===false&&G=="GET"){var E=e();var U=M.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+E+"$2");M.url=U+((U==M.url)?(M.url.match(/\?/)?"&":"?")+"_="+E:"")}if(M.data&&G=="GET"){M.url+=(M.url.match(/\?/)?"&":"?")+M.data;M.data=null}if(M.global&&!o.active++){o.event.trigger("ajaxStart")}var Q=/^(\w+:)?\/\/([^\/?#]+)/.exec(M.url);if(M.dataType=="script"&&G=="GET"&&Q&&(Q[1]&&Q[1]!=location.protocol||Q[2]!=location.host)){var H=document.getElementsByTagName("head")[0];var T=document.createElement("script");T.src=M.url;if(M.scriptCharset){T.charset=M.scriptCharset}if(!W){var O=false;T.onload=T.onreadystatechange=function(){if(!O&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){O=true;I();L();T.onload=T.onreadystatechange=null;H.removeChild(T)}}}H.appendChild(T);return g}var K=false;var J=M.xhr();if(M.username){J.open(G,M.url,M.async,M.username,M.password)}else{J.open(G,M.url,M.async)}try{if(M.data){J.setRequestHeader("Content-Type",M.contentType)}if(M.ifModified){J.setRequestHeader("If-Modified-Since",o.lastModified[M.url]||"Thu, 01 Jan 1970 00:00:00 GMT")}J.setRequestHeader("X-Requested-With","XMLHttpRequest");J.setRequestHeader("Accept",M.dataType&&M.accepts[M.dataType]?M.accepts[M.dataType]+", */*":M.accepts._default)}catch(S){}if(M.beforeSend&&M.beforeSend(J,M)===false){if(M.global&&!--o.active){o.event.trigger("ajaxStop")}J.abort();return false}if(M.global){o.event.trigger("ajaxSend",[J,M])}var N=function(X){if(J.readyState==0){if(P){clearInterval(P);P=null;if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}}else{if(!K&&J&&(J.readyState==4||X=="timeout")){K=true;if(P){clearInterval(P);P=null}R=X=="timeout"?"timeout":!o.httpSuccess(J)?"error":M.ifModified&&o.httpNotModified(J,M.url)?"notmodified":"success";if(R=="success"){try{V=o.httpData(J,M.dataType,M)}catch(Z){R="parsererror"}}if(R=="success"){var Y;try{Y=J.getResponseHeader("Last-Modified")}catch(Z){}if(M.ifModified&&Y){o.lastModified[M.url]=Y}if(!W){I()}}else{o.handleError(M,J,R)}L();if(X){J.abort()}if(M.async){J=null}}}};if(M.async){var P=setInterval(N,13);if(M.timeout>0){setTimeout(function(){if(J&&!K){N("timeout")}},M.timeout)}}try{J.send(M.data)}catch(S){o.handleError(M,J,null,S)}if(!M.async){N()}function I(){if(M.success){M.success(V,R)}if(M.global){o.event.trigger("ajaxSuccess",[J,M])}}function L(){if(M.complete){M.complete(J,R)}if(M.global){o.event.trigger("ajaxComplete",[J,M])}if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}return J},handleError:function(F,H,E,G){if(F.error){F.error(H,E,G)}if(F.global){o.event.trigger("ajaxError",[H,F,G])}},active:0,httpSuccess:function(F){try{return !F.status&&location.protocol=="file:"||(F.status>=200&&F.status<300)||F.status==304||F.status==1223}catch(E){}return false},httpNotModified:function(G,E){try{var H=G.getResponseHeader("Last-Modified");return G.status==304||H==o.lastModified[E]}catch(F){}return false},httpData:function(J,H,G){var F=J.getResponseHeader("content-type"),E=H=="xml"||!H&&F&&F.indexOf("xml")>=0,I=E?J.responseXML:J.responseText;if(E&&I.documentElement.tagName=="parsererror"){throw"parsererror"}if(G&&G.dataFilter){I=G.dataFilter(I,H)}if(typeof I==="string"){if(H=="script"){o.globalEval(I)}if(H=="json"){I=l["eval"]("("+I+")")}}return I},param:function(E){var G=[];function H(I,J){G[G.length]=encodeURIComponent(I)+"="+encodeURIComponent(J)}if(o.isArray(E)||E.jquery){o.each(E,function(){H(this.name,this.value)})}else{for(var F in E){if(o.isArray(E[F])){o.each(E[F],function(){H(F,this)})}else{H(F,o.isFunction(E[F])?E[F]():E[F])}}}return G.join("&").replace(/%20/g,"+")}});var m={},n,d=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];function t(F,E){var G={};o.each(d.concat.apply([],d.slice(0,E)),function()
+{G[this]=F});return G}o.fn.extend({show:function(J,L){if(J){return this.animate(t("show",3),J,L)}else{for(var H=0,F=this.length;H<F;H++){var E=o.data(this[H],"olddisplay");this[H].style.display=E||"";if(o.css(this[H],"display")==="none"){var G=this[H].tagName,K;if(m[G]){K=m[G]}else{var I=o("<"+G+" />").appendTo("body");K=I.css("display");if(K==="none"){K="block"}I.remove();m[G]=K}o.data(this[H],"olddisplay",K)}}for(var H=0,F=this.length;H<F;H++){this[H].style.display=o.data(this[H],"olddisplay")||""}return this}},hide:function(H,I){if(H){return this.animate(t("hide",3),H,I)}else{for(var G=0,F=this.length;G<F;G++){var E=o.data(this[G],"olddisplay");if(!E&&E!=="none"){o.data(this[G],"olddisplay",o.css(this[G],"display"))}}for(var G=0,F=this.length;G<F;G++){this[G].style.display="none"}return this}},_toggle:o.fn.toggle,toggle:function(G,F){var E=typeof G==="boolean";return o.isFunction(G)&&o.isFunction(F)?this._toggle.apply(this,arguments):G==null||E?this.each(function(){var H=E?G:o(this).is(":hidden");o(this)[H?"show":"hide"]()}):this.animate(t("toggle",3),G,F)},fadeTo:function(E,G,F){return this.animate({opacity:G},E,F)},animate:function(I,F,H,G){var E=o.speed(F,H,G);return this[E.queue===false?"each":"queue"](function(){var K=o.extend({},E),M,L=this.nodeType==1&&o(this).is(":hidden"),J=this;for(M in I){if(I[M]=="hide"&&L||I[M]=="show"&&!L){return K.complete.call(this)}if((M=="height"||M=="width")&&this.style){K.display=o.css(this,"display");K.overflow=this.style.overflow}}if(K.overflow!=null){this.style.overflow="hidden"}K.curAnim=o.extend({},I);o.each(I,function(O,S){var R=new o.fx(J,K,O);if(/toggle|show|hide/.test(S)){R[S=="toggle"?L?"show":"hide":S](I)}else{var Q=S.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),T=R.cur(true)||0;if(Q){var N=parseFloat(Q[2]),P=Q[3]||"px";if(P!="px"){J.style[O]=(N||1)+P;T=((N||1)/R.cur(true))*T;J.style[O]=T+P}if(Q[1]){N=((Q[1]=="-="?-1:1)*N)+T}R.custom(T,N,P)}else{R.custom(T,S,"")}}});return true})},stop:function(F,E){var G=o.timers;if(F){this.queue([])}this.each(function(){for(var H=G.length-1;H>=0;H--){if(G[H].elem==this){if(E){G[H](true)}G.splice(H,1)}}});if(!E){this.dequeue()}return this}});o.each({slideDown:t("show",1),slideUp:t("hide",1),slideToggle:t("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(E,F){o.fn[E]=function(G,H){return this.animate(F,G,H)}});o.extend({speed:function(G,H,F){var E=typeof G==="object"?G:{complete:F||!F&&H||o.isFunction(G)&&G,duration:G,easing:F&&H||H&&!o.isFunction(H)&&H};E.duration=o.fx.off?0:typeof E.duration==="number"?E.duration:o.fx.speeds[E.duration]||o.fx.speeds._default;E.old=E.complete;E.complete=function(){if(E.queue!==false){o(this).dequeue()}if(o.isFunction(E.old)){E.old.call(this)}};return E},easing:{linear:function(G,H,E,F){return E+F*G},swing:function(G,H,E,F){return((-Math.cos(G*Math.PI)/2)+0.5)*F+E}},timers:[],fx:function(F,E,G){this.options=E;this.elem=F;this.prop=G;if(!E.orig){E.orig={}}}});o.fx.prototype={update:function(){if(this.options.step){this.options.step.call(this.elem,this.now,this)}(o.fx.step[this.prop]||o.fx.step._default)(this);if((this.prop=="height"||this.prop=="width")&&this.elem.style){this.elem.style.display="block"}},cur:function(F){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null)){return this.elem[this.prop]}var E=parseFloat(o.css(this.elem,this.prop,F));return E&&E>-10000?E:parseFloat(o.curCSS(this.elem,this.prop))||0},custom:function(I,H,G){this.startTime=e();this.start=I;this.end=H;this.unit=G||this.unit||"px";this.now=this.start;this.pos=this.state=0;var E=this;function F(J){return E.step(J)}F.elem=this.elem;if(F()&&o.timers.push(F)&&!n){n=setInterval(function(){var K=o.timers;for(var J=0;J<K.length;J++){if(!K[J]()){K.splice(J--,1)}}if(!K.length){clearInterval(n);n=g}},13)}},show:function(){this.options.orig[this.prop]=o.attr(this.elem.style,this.prop);this.options.show=true;this.custom(this.prop=="width"||this.prop=="height"?1:0,this.cur());o(this.elem).show()},hide:function(){this.options.orig[this.prop]=o.attr(this.elem.style,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(H){var G=e();if(H||G>=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var E=true;for(var F in this.options.curAnim){if(this.options.curAnim[F]!==true){E=false}}if(E){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(o.css(this.elem,"display")=="none"){this.elem.style.display="block"}}if(this.options.hide){o(this.elem).hide()}if(this.options.hide||this.options.show){for(var I in this.options.curAnim){o.attr(this.elem.style,I,this.options.orig[I])}}this.options.complete.call(this.elem)}return false}else{var J=G-this.startTime;this.state=J/this.options.duration;this.pos=o.easing[this.options.easing||(o.easing.swing?"swing":"linear")](this.state,J,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update()}return true}};o.extend(o.fx,{speeds:{slow:600,fast:200,_default:400},step:{opacity:function(E){o.attr(E.elem.style,"opacity",E.now)},_default:function(E){if(E.elem.style&&E.elem.style[E.prop]!=null){E.elem.style[E.prop]=E.now+E.unit}else{E.elem[E.prop]=E.now}}}});if(document.documentElement.getBoundingClientRect){o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}var G=this[0].getBoundingClientRect(),J=this[0].ownerDocument,F=J.body,E=J.documentElement,L=E.clientTop||F.clientTop||0,K=E.clientLeft||F.clientLeft||0,I=G.top+(self.pageYOffset||o.boxModel&&E.scrollTop||F.scrollTop)-L,H=G.left+(self.pageXOffset||o.boxModel&&E.scrollLeft||F.scrollLeft)-K;return{top:I,left:H}}}else{o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}o.offset.initialized||o.offset.initialize();var J=this[0],G=J.offsetParent,F=J,O=J.ownerDocument,M,H=O.documentElement,K=O.body,L=O.defaultView,E=L.getComputedStyle(J,null),N=J.offsetTop,I=J.offsetLeft;while((J=J.parentNode)&&J!==K&&J!==H){M=L.getComputedStyle(J,null);N-=J.scrollTop,I-=J.scrollLeft;if(J===G){N+=J.offsetTop,I+=J.offsetLeft;if(o.offset.doesNotAddBorder&&!(o.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(J.tagName))){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}F=G,G=J.offsetParent}if(o.offset.subtractsBorderForOverflowNotVisible&&M.overflow!=="visible"){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}E=M}if(E.position==="relative"||E.position==="static"){N+=K.offsetTop,I+=K.offsetLeft}if(E.position==="fixed"){N+=Math.max(H.scrollTop,K.scrollTop),I+=Math.max(H.scrollLeft,K.scrollLeft)}return{top:N,left:I}}}o.offset={initialize:function(){if(this.initialized){return}var L=document.body,F=document.createElement("div"),H,G,N,I,M,E,J=L.style.marginTop,K='<div style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;"><div></div></div><table style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;" cellpadding="0" cellspacing="0"><tr><td></td></tr></table>';M={position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"};for(E in M){F.style[E]=M[E]}F.innerHTML=K;L.insertBefore(F,L.firstChild);H=F.firstChild,G=H.firstChild,I=H.nextSibling.firstChild.firstChild;this.doesNotAddBorder=(G.offsetTop!==5);this.doesAddBorderForTableAndCells=(I.offsetTop===5);H.style.overflow="hidden",H.style.position="relative";this.subtractsBorderForOverflowNotVisible=(G.offsetTop===-5);L.style.marginTop="1px";this.doesNotIncludeMarginInBodyOffset=(L.offsetTop===0);L.style.marginTop=J;L.removeChild(F);this.initialized=true},bodyOffset:function(E){o.offset.initialized||o.offset.initialize();var G=E.offsetTop,F=E.offsetLeft;if(o.offset.doesNotIncludeMarginInBodyOffset){G+=parseInt(o.curCSS(E,"marginTop",true),10)||0,F+=parseInt(o.curCSS(E,"marginLeft",true),10)||0}return{top:G,left:F}}};o.fn.extend({position:function(){var I=0,H=0,F;if(this[0]){var G=this.offsetParent(),J=this.offset(),E=/^body|html$/i.test(G[0].tagName)?{top:0,left:0}:G.offset();J.top-=j(this,"marginTop");J.left-=j(this,"marginLeft");E.top+=j(G,"borderTopWidth");E.left+=j(G,"borderLeftWidth");F={top:J.top-E.top,left:J.left-E.left}}return F},offsetParent:function(){var E=this[0].offsetParent||document.body;while(E&&(!/^body|html$/i.test(E.tagName)&&o.css(E,"position")=="static")){E=E.offsetParent}return o(E)}});o.each(["Left","Top"],function(F,E){var G="scroll"+E;o.fn[G]=function(H){if(!this[0]){return null}return H!==g?this.each(function(){this==l||this==document?l.scrollTo(!F?H:o(l).scrollLeft(),F?H:o(l).scrollTop()):this[G]=H}):this[0]==l||this[0]==document?self[F?"pageYOffset":"pageXOffset"]||o.boxModel&&document.documentElement[G]||document.body[G]:this[0][G]}});o.each(["Height","Width"],function(I,G){var E=I?"Left":"Top",H=I?"Right":"Bottom",F=G.toLowerCase();o.fn["inner"+G]=function(){return this[0]?o.css(this[0],F,false,"padding"):null};o.fn["outer"+G]=function(K){return this[0]?o.css(this[0],F,false,K?"margin":"border"):null};var J=G.toLowerCase();o.fn[J]=function(K){return this[0]==l?document.compatMode=="CSS1Compat"&&document.documentElement["client"+G]||document.body["client"+G]:this[0]==document?Math.max(document.documentElement["client"+G],document.body["scroll"+G],document.documentElement["scroll"+G],document.body["offset"+G],document.documentElement["offset"+G]):K===g?(this.length?o.css(this[0],J):null):this.css(J,typeof K==="string"?K:K+"px")}})})();
+
+/*
+ * jQuery hashchange event - v1.3 - 7/21/2010
+ * http://benalman.com/projects/jquery-hashchange-plugin/
+ * 
+ * Copyright (c) 2010 "Cowboy" Ben Alman
+ * Dual licensed under the MIT and GPL licenses.
+ * http://benalman.com/about/license/
+ */
+(function($,e,b){var c="hashchange",h=document,f,g=$.event.special,i=h.documentMode,d="on"+c in e&&(i===b||i>7);function a(j){j=j||location.href;return"#"+j.replace(/^[^#]*#?(.*)$/,"$1")}$.fn[c]=function(j){return j?this.bind(c,j):this.trigger(c)};$.fn[c].delay=50;g[c]=$.extend(g[c],{setup:function(){if(d){return false}$(f.start)},teardown:function(){if(d){return false}$(f.stop)}});f=(function(){var j={},p,m=a(),k=function(q){return q},l=k,o=k;j.start=function(){p||n()};j.stop=function(){p&&clearTimeout(p);p=b};function n(){var r=a(),q=o(m);if(r!==m){l(m=r,q);$(e).trigger(c)}else{if(q!==m){location.href=location.href.replace(/#.*/,"")+q}}p=setTimeout(n,$.fn[c].delay)}$.browser.msie&&!d&&(function(){var q,r;j.start=function(){if(!q){r=$.fn[c].src;r=r&&r+a();q=$('<iframe tabindex="-1" title="empty"/>').hide().one("load",function(){r||l(a());n()}).attr("src",r||"javascript:0").insertAfter("body")[0].contentWindow;h.onpropertychange=function(){try{if(event.propertyName==="title"){q.document.title=h.title}}catch(s){}}}};j.stop=k;o=function(){return a(q.location.href)};l=function(v,s){var u=q.document,t=$.fn[c].domain;if(v!==s){u.title=h.title;u.open();t&&u.write('<script>document.domain="'+t+'"<\/script>');u.close();q.location.hash=v}}})();return j})()})(jQuery,this);
+/*
+ * jQuery UI 1.7.2
+ *
+ * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * http://docs.jquery.com/UI
+ */
+jQuery.ui||(function(c){var i=c.fn.remove,d=c.browser.mozilla&&(parseFloat(c.browser.version)<1.9);c.ui={version:"1.7.2",plugin:{add:function(k,l,n){var m=c.ui[k].prototype;for(var j in n){m.plugins[j]=m.plugins[j]||[];m.plugins[j].push([l,n[j]])}},call:function(j,l,k){var n=j.plugins[l];if(!n||!j.element[0].parentNode){return}for(var m=0;m<n.length;m++){if(j.options[n[m][0]]){n[m][1].apply(j.element,k)}}}},contains:function(k,j){return document.compareDocumentPosition?k.compareDocumentPosition(j)&16:k!==j&&k.contains(j)},hasScroll:function(m,k){if(c(m).css("overflow")=="hidden"){return false}var j=(k&&k=="left")?"scrollLeft":"scrollTop",l=false;if(m[j]>0){return true}m[j]=1;l=(m[j]>0);m[j]=0;return l},isOverAxis:function(k,j,l){return(k>j)&&(k<(j+l))},isOver:function(o,k,n,m,j,l){return c.ui.isOverAxis(o,n,j)&&c.ui.isOverAxis(k,m,l)},keyCode:{BACKSPACE:8,CAPS_LOCK:20,COMMA:188,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38}};if(d){var f=c.attr,e=c.fn.removeAttr,h="http://www.w3.org/2005/07/aaa",a=/^aria-/,b=/^wairole:/;c.attr=function(k,j,l){var m=l!==undefined;return(j=="role"?(m?f.call(this,k,j,"wairole:"+l):(f.apply(this,arguments)||"").replace(b,"")):(a.test(j)?(m?k.setAttributeNS(h,j.replace(a,"aaa:"),l):f.call(this,k,j.replace(a,"aaa:"))):f.apply(this,arguments)))};c.fn.removeAttr=function(j){return(a.test(j)?this.each(function(){this.removeAttributeNS(h,j.replace(a,""))}):e.call(this,j))}}c.fn.extend({remove:function(){c("*",this).add(this).each(function(){c(this).triggerHandler("remove")});return i.apply(this,arguments)},enableSelection:function(){return this.attr("unselectable","off").css("MozUserSelect","").unbind("selectstart.ui")},disableSelection:function(){return this.attr("unselectable","on").css("MozUserSelect","none").bind("selectstart.ui",function(){return false})},scrollParent:function(){var j;if((c.browser.msie&&(/(static|relative)/).test(this.css("position")))||(/absolute/).test(this.css("position"))){j=this.parents().filter(function(){return(/(relative|absolute|fixed)/).test(c.curCSS(this,"position",1))&&(/(auto|scroll)/).test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0)}else{j=this.parents().filter(function(){return(/(auto|scroll)/).test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0)}return(/fixed/).test(this.css("position"))||!j.length?c(document):j}});c.extend(c.expr[":"],{data:function(l,k,j){return !!c.data(l,j[3])},focusable:function(k){var l=k.nodeName.toLowerCase(),j=c.attr(k,"tabindex");return(/input|select|textarea|button|object/.test(l)?!k.disabled:"a"==l||"area"==l?k.href||!isNaN(j):!isNaN(j))&&!c(k)["area"==l?"parents":"closest"](":hidden").length},tabbable:function(k){var j=c.attr(k,"tabindex");return(isNaN(j)||j>=0)&&c(k).is(":focusable")}});function g(m,n,o,l){function k(q){var p=c[m][n][q]||[];return(typeof p=="string"?p.split(/,?\s+/):p)}var j=k("getter");if(l.length==1&&typeof l[0]=="string"){j=j.concat(k("getterSetter"))}return(c.inArray(o,j)!=-1)}c.widget=function(k,j){var l=k.split(".")[0];k=k.split(".")[1];c.fn[k]=function(p){var n=(typeof p=="string"),o=Array.prototype.slice.call(arguments,1);if(n&&p.substring(0,1)=="_"){return this}if(n&&g(l,k,p,o)){var m=c.data(this[0],k);return(m?m[p].apply(m,o):undefined)}return this.each(function(){var q=c.data(this,k);(!q&&!n&&c.data(this,k,new c[l][k](this,p))._init());(q&&n&&c.isFunction(q[p])&&q[p].apply(q,o))})};c[l]=c[l]||{};c[l][k]=function(o,n){var m=this;this.namespace=l;this.widgetName=k;this.widgetEventPrefix=c[l][k].eventPrefix||k;this.widgetBaseClass=l+"-"+k;this.options=c.extend({},c.widget.defaults,c[l][k].defaults,c.metadata&&c.metadata.get(o)[k],n);this.element=c(o).bind("setData."+k,function(q,p,r){if(q.target==o){return m._setData(p,r)}}).bind("getData."+k,function(q,p){if(q.target==o){return m._getData(p)}}).bind("remove",function(){return m.destroy()})};c[l][k].prototype=c.extend({},c.widget.prototype,j);c[l][k].getterSetter="option"};c.widget.prototype={_init:function(){},destroy:function(){this.element.removeData(this.widgetName).removeClass(this.widgetBaseClass+"-disabled "+this.namespace+"-state-disabled").removeAttr("aria-disabled")},option:function(l,m){var k=l,j=this;if(typeof l=="string"){if(m===undefined){return this._getData(l)}k={};k[l]=m}c.each(k,function(n,o){j._setData(n,o)})},_getData:function(j){return this.options[j]},_setData:function(j,k){this.options[j]=k;if(j=="disabled"){this.element[k?"addClass":"removeClass"](this.widgetBaseClass+"-disabled "+this.namespace+"-state-disabled").attr("aria-disabled",k)}},enable:function(){this._setData("disabled",false)},disable:function(){this._setData("disabled",true)},_trigger:function(l,m,n){var p=this.options[l],j=(l==this.widgetEventPrefix?l:this.widgetEventPrefix+l);m=c.Event(m);m.type=j;if(m.originalEvent){for(var k=c.event.props.length,o;k;){o=c.event.props[--k];m[o]=m.originalEvent[o]}}this.element.trigger(m,n);return !(c.isFunction(p)&&p.call(this.element[0],m,n)===false||m.isDefaultPrevented())}};c.widget.defaults={disabled:false};c.ui.mouse={_mouseInit:function(){var j=this;this.element.bind("mousedown."+this.widgetName,function(k){return j._mouseDown(k)}).bind("click."+this.widgetName,function(k){if(j._preventClickEvent){j._preventClickEvent=false;k.stopImmediatePropagation();return false}});if(c.browser.msie){this._mouseUnselectable=this.element.attr("unselectable");this.element.attr("unselectable","on")}this.started=false},_mouseDestroy:function(){this.element.unbind("."+this.widgetName);(c.browser.msie&&this.element.attr("unselectable",this._mouseUnselectable))},_mouseDown:function(l){l.originalEvent=l.originalEvent||{};if(l.originalEvent.mouseHandled){return}(this._mouseStarted&&this._mouseUp(l));this._mouseDownEvent=l;var k=this,m=(l.which==1),j=(typeof this.options.cancel=="string"?c(l.target).parents().add(l.target).filter(this.options.cancel).length:false);if(!m||j||!this._mouseCapture(l)){return true}this.mouseDelayMet=!this.options.delay;if(!this.mouseDelayMet){this._mouseDelayTimer=setTimeout(function(){k.mouseDelayMet=true},this.options.delay)}if(this._mouseDistanceMet(l)&&this._mouseDelayMet(l)){this._mouseStarted=(this._mouseStart(l)!==false);if(!this._mouseStarted){l.preventDefault();return true}}this._mouseMoveDelegate=function(n){return k._mouseMove(n)};this._mouseUpDelegate=function(n){return k._mouseUp(n)};c(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate);(c.browser.safari||l.preventDefault());l.originalEvent.mouseHandled=true;return true},_mouseMove:function(j){if(c.browser.msie&&!j.button){return this._mouseUp(j)}if(this._mouseStarted){this._mouseDrag(j);return j.preventDefault()}if(this._mouseDistanceMet(j)&&this._mouseDelayMet(j)){this._mouseStarted=(this._mouseStart(this._mouseDownEvent,j)!==false);(this._mouseStarted?this._mouseDrag(j):this._mouseUp(j))}return !this._mouseStarted},_mouseUp:function(j){c(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted=false;this._preventClickEvent=(j.target==this._mouseDownEvent.target);this._mouseStop(j)}return false},_mouseDistanceMet:function(j){return(Math.max(Math.abs(this._mouseDownEvent.pageX-j.pageX),Math.abs(this._mouseDownEvent.pageY-j.pageY))>=this.options.distance)},_mouseDelayMet:function(j){return this.mouseDelayMet},_mouseStart:function(j){},_mouseDrag:function(j){},_mouseStop:function(j){},_mouseCapture:function(j){return true}};c.ui.mouse.defaults={cancel:null,distance:1,delay:0}})(jQuery);;/* * jQuery UI Resizable 1.7.2
+ *
+ * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * http://docs.jquery.com/UI/Resizables
+ *
+ * Depends:
+ *	ui.core.js
+ */
+(function(c){c.widget("ui.resizable",c.extend({},c.ui.mouse,{_init:function(){var e=this,j=this.options;this.element.addClass("ui-resizable");c.extend(this,{_aspectRatio:!!(j.aspectRatio),aspectRatio:j.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:j.helper||j.ghost||j.animate?j.helper||"ui-resizable-helper":null});if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)){if(/relative/.test(this.element.css("position"))&&c.browser.opera){this.element.css({position:"relative",top:"auto",left:"auto"})}this.element.wrap(c('<div class="ui-wrapper" style="overflow: hidden;"></div>').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")}));this.element=this.element.parent().data("resizable",this.element.data("resizable"));this.elementIsWrapper=true;this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")});this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0});this.originalResizeStyle=this.originalElement.css("resize");this.originalElement.css("resize","none");this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"}));this.originalElement.css({margin:this.originalElement.css("margin")});this._proportionallyResize()}this.handles=j.handles||(!c(".ui-resizable-handle",this.element).length?"e,s,se":{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"});if(this.handles.constructor==String){if(this.handles=="all"){this.handles="n,e,s,w,se,sw,ne,nw"}var k=this.handles.split(",");this.handles={};for(var f=0;f<k.length;f++){var h=c.trim(k[f]),d="ui-resizable-"+h;var g=c('<div class="ui-resizable-handle '+d+'"></div>');if(/sw|se|ne|nw/.test(h)){g.css({zIndex:++j.zIndex})}if("se"==h){g.addClass("ui-icon ui-icon-gripsmall-diagonal-se")}this.handles[h]=".ui-resizable-"+h;this.element.append(g)}}this._renderAxis=function(p){p=p||this.element;for(var m in this.handles){if(this.handles[m].constructor==String){this.handles[m]=c(this.handles[m],this.element).show()}if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var n=c(this.handles[m],this.element),o=0;o=/sw|ne|nw|se|n|s/.test(m)?n.outerHeight():n.outerWidth();var l=["padding",/ne|nw|n/.test(m)?"Top":/se|sw|s/.test(m)?"Bottom":/^e$/.test(m)?"Right":"Left"].join("");p.css(l,o);this._proportionallyResize()}if(!c(this.handles[m]).length){continue}}};this._renderAxis(this.element);this._handles=c(".ui-resizable-handle",this.element).disableSelection();this._handles.mouseover(function(){if(!e.resizing){if(this.className){var i=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)}e.axis=i&&i[1]?i[1]:"se"}});if(j.autoHide){this._handles.hide();c(this.element).addClass("ui-resizable-autohide").hover(function(){c(this).removeClass("ui-resizable-autohide");e._handles.show()},function(){if(!e.resizing){c(this).addClass("ui-resizable-autohide");e._handles.hide()}})}this._mouseInit()},destroy:function(){this._mouseDestroy();var d=function(f){c(f).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};if(this.elementIsWrapper){d(this.element);var e=this.element;e.parent().append(this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")})).end().remove()}this.originalElement.css("resize",this.originalResizeStyle);d(this.originalElement)},_mouseCapture:function(e){var f=false;for(var d in this.handles){if(c(this.handles[d])[0]==e.target){f=true}}return this.options.disabled||!!f},_mouseStart:function(f){var i=this.options,e=this.element.position(),d=this.element;this.resizing=true;this.documentScroll={top:c(document).scrollTop(),left:c(document).scrollLeft()};if(d.is(".ui-draggable")||(/absolute/).test(d.css("position"))){d.css({position:"absolute",top:e.top,left:e.left})}if(c.browser.opera&&(/relative/).test(d.css("position"))){d.css({position:"relative",top:"auto",left:"auto"})}this._renderProxy();var j=b(this.helper.css("left")),g=b(this.helper.css("top"));if(i.containment){j+=c(i.containment).scrollLeft()||0;g+=c(i.containment).scrollTop()||0}this.offset=this.helper.offset();this.position={left:j,top:g};this.size=this._helper?{width:d.outerWidth(),height:d.outerHeight()}:{width:d.width(),height:d.height()};this.originalSize=this._helper?{width:d.outerWidth(),height:d.outerHeight()}:{width:d.width(),height:d.height()};this.originalPosition={left:j,top:g};this.sizeDiff={width:d.outerWidth()-d.width(),height:d.outerHeight()-d.height()};this.originalMousePosition={left:f.pageX,top:f.pageY};this.aspectRatio=(typeof i.aspectRatio=="number")?i.aspectRatio:((this.originalSize.width/this.originalSize.height)||1);var h=c(".ui-resizable-"+this.axis).css("cursor");c("body").css("cursor",h=="auto"?this.axis+"-resize":h);d.addClass("ui-resizable-resizing");this._propagate("start",f);return true},_mouseDrag:function(d){var g=this.helper,f=this.options,l={},p=this,i=this.originalMousePosition,m=this.axis;var q=(d.pageX-i.left)||0,n=(d.pageY-i.top)||0;var h=this._change[m];if(!h){return false}var k=h.apply(this,[d,q,n]),j=c.browser.msie&&c.browser.version<7,e=this.sizeDiff;if(this._aspectRatio||d.shiftKey){k=this._updateRatio(k,d)}k=this._respectSize(k,d);this._propagate("resize",d);g.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"});if(!this._helper&&this._proportionallyResizeElements.length){this._proportionallyResize()}this._updateCache(k);this._trigger("resize",d,this.ui());return false},_mouseStop:function(g){this.resizing=false;var h=this.options,l=this;if(this._helper){var f=this._proportionallyResizeElements,d=f.length&&(/textarea/i).test(f[0].nodeName),e=d&&c.ui.hasScroll(f[0],"left")?0:l.sizeDiff.height,j=d?0:l.sizeDiff.width;var m={width:(l.size.width-j),height:(l.size.height-e)},i=(parseInt(l.element.css("left"),10)+(l.position.left-l.originalPosition.left))||null,k=(parseInt(l.element.css("top"),10)+(l.position.top-l.originalPosition.top))||null;if(!h.animate){this.element.css(c.extend(m,{top:k,left:i}))}l.helper.height(l.size.height);l.helper.width(l.size.width);if(this._helper&&!h.animate){this._proportionallyResize()}}c("body").css("cursor","auto");this.element.removeClass("ui-resizable-resizing");this._propagate("stop",g);if(this._helper){this.helper.remove()}return false},_updateCache:function(d){var e=this.options;this.offset=this.helper.offset();if(a(d.left)){this.position.left=d.left}if(a(d.top)){this.position.top=d.top}if(a(d.height)){this.size.height=d.height}if(a(d.width)){this.size.width=d.width}},_updateRatio:function(g,f){var h=this.options,i=this.position,e=this.size,d=this.axis;if(g.height){g.width=(e.height*this.aspectRatio)}else{if(g.width){g.height=(e.width/this.aspectRatio)}}if(d=="sw"){g.left=i.left+(e.width-g.width);g.top=null}if(d=="nw"){g.top=i.top+(e.height-g.height);g.left=i.left+(e.width-g.width)}return g},_respectSize:function(k,f){var i=this.helper,h=this.options,q=this._aspectRatio||f.shiftKey,p=this.axis,s=a(k.width)&&h.maxWidth&&(h.maxWidth<k.width),l=a(k.height)&&h.maxHeight&&(h.maxHeight<k.height),g=a(k.width)&&h.minWidth&&(h.minWidth>k.width),r=a(k.height)&&h.minHeight&&(h.minHeight>k.height);if(g){k.width=h.minWidth}if(r){k.height=h.minHeight}if(s){k.width=h.maxWidth}if(l){k.height=h.maxHeight}var e=this.originalPosition.left+this.originalSize.width,n=this.position.top+this.size.height;var j=/sw|nw|w/.test(p),d=/nw|ne|n/.test(p);if(g&&j){k.left=e-h.minWidth}if(s&&j){k.left=e-h.maxWidth}if(r&&d){k.top=n-h.minHeight}if(l&&d){k.top=n-h.maxHeight}var m=!k.width&&!k.height;if(m&&!k.left&&k.top){k.top=null}else{if(m&&!k.top&&k.left){k.left=null}}return k},_proportionallyResize:function(){var j=this.options;if(!this._proportionallyResizeElements.length){return}var f=this.helper||this.element;for(var e=0;e<this._proportionallyResizeElements.length;e++){var g=this._proportionallyResizeElements[e];if(!this.borderDif){var d=[g.css("borderTopWidth"),g.css("borderRightWidth"),g.css("borderBottomWidth"),g.css("borderLeftWidth")],h=[g.css("paddingTop"),g.css("paddingRight"),g.css("paddingBottom"),g.css("paddingLeft")];this.borderDif=c.map(d,function(k,m){var l=parseInt(k,10)||0,n=parseInt(h[m],10)||0;return l+n})}if(c.browser.msie&&!(!(c(f).is(":hidden")||c(f).parents(":hidden").length))){continue}g.css({height:(f.height()-this.borderDif[0]-this.borderDif[2])||0,width:(f.width()-this.borderDif[1]-this.borderDif[3])||0})}},_renderProxy:function(){var e=this.element,h=this.options;this.elementOffset=e.offset();if(this._helper){this.helper=this.helper||c('<div style="overflow:hidden;"></div>');var d=c.browser.msie&&c.browser.version<7,f=(d?1:0),g=(d?2:-1);this.helper.addClass(this._helper).css({width:this.element.outerWidth()+g,height:this.element.outerHeight()+g,position:"absolute",left:this.elementOffset.left-f+"px",top:this.elementOffset.top-f+"px",zIndex:++h.zIndex});this.helper.appendTo("body").disableSelection()}else{this.helper=this.element}},_change:{e:function(f,e,d){return{width:this.originalSize.width+e}},w:function(g,e,d){var i=this.options,f=this.originalSize,h=this.originalPosition;return{left:h.left+e,width:f.width-e}},n:function(g,e,d){var i=this.options,f=this.originalSize,h=this.originalPosition;return{top:h.top+d,height:f.height-d}},s:function(f,e,d){return{height:this.originalSize.height+d}},se:function(f,e,d){return c.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[f,e,d]))},sw:function(f,e,d){return c.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[f,e,d]))},ne:function(f,e,d){return c.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[f,e,d]))},nw:function(f,e,d){return c.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[f,e,d]))}},_propagate:function(e,d){c.ui.plugin.call(this,e,[d,this.ui()]);(e!="resize"&&this._trigger(e,d,this.ui()))},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}));c.extend(c.ui.resizable,{version:"1.7.2",eventPrefix:"resize",defaults:{alsoResize:false,animate:false,animateDuration:"slow",animateEasing:"swing",aspectRatio:false,autoHide:false,cancel:":input,option",containment:false,delay:0,distance:1,ghost:false,grid:false,handles:"e,s,se",helper:false,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:1000}});c.ui.plugin.add("resizable","alsoResize",{start:function(e,f){var d=c(this).data("resizable"),g=d.options;_store=function(h){c(h).each(function(){c(this).data("resizable-alsoresize",{width:parseInt(c(this).width(),10),height:parseInt(c(this).height(),10),left:parseInt(c(this).css("left"),10),top:parseInt(c(this).css("top"),10)})})};if(typeof(g.alsoResize)=="object"&&!g.alsoResize.parentNode){if(g.alsoResize.length){g.alsoResize=g.alsoResize[0];_store(g.alsoResize)}else{c.each(g.alsoResize,function(h,i){_store(h)})}}else{_store(g.alsoResize)}},resize:function(f,h){var e=c(this).data("resizable"),i=e.options,g=e.originalSize,k=e.originalPosition;var j={height:(e.size.height-g.height)||0,width:(e.size.width-g.width)||0,top:(e.position.top-k.top)||0,left:(e.position.left-k.left)||0},d=function(l,m){c(l).each(function(){var p=c(this),q=c(this).data("resizable-alsoresize"),o={},n=m&&m.length?m:["width","height","top","left"];c.each(n||["width","height","top","left"],function(r,t){var s=(q[t]||0)+(j[t]||0);if(s&&s>=0){o[t]=s||null}});if(/relative/.test(p.css("position"))&&c.browser.opera){e._revertToRelativePosition=true;p.css({position:"absolute",top:"auto",left:"auto"})}p.css(o)})};if(typeof(i.alsoResize)=="object"&&!i.alsoResize.nodeType){c.each(i.alsoResize,function(l,m){d(l,m)})}else{d(i.alsoResize)}},stop:function(e,f){var d=c(this).data("resizable");if(d._revertToRelativePosition&&c.browser.opera){d._revertToRelativePosition=false;el.css({position:"relative"})}c(this).removeData("resizable-alsoresize-start")}});c.ui.plugin.add("resizable","animate",{stop:function(h,m){var n=c(this).data("resizable"),i=n.options;var g=n._proportionallyResizeElements,d=g.length&&(/textarea/i).test(g[0].nodeName),e=d&&c.ui.hasScroll(g[0],"left")?0:n.sizeDiff.height,k=d?0:n.sizeDiff.width;var f={width:(n.size.width-k),height:(n.size.height-e)},j=(parseInt(n.element.css("left"),10)+(n.position.left-n.originalPosition.left))||null,l=(parseInt(n.element.css("top"),10)+(n.position.top-n.originalPosition.top))||null;n.element.animate(c.extend(f,l&&j?{top:l,left:j}:{}),{duration:i.animateDuration,easing:i.animateEasing,step:function(){var o={width:parseInt(n.element.css("width"),10),height:parseInt(n.element.css("height"),10),top:parseInt(n.element.css("top"),10),left:parseInt(n.element.css("left"),10)};if(g&&g.length){c(g[0]).css({width:o.width,height:o.height})}n._updateCache(o);n._propagate("resize",h)}})}});c.ui.plugin.add("resizable","containment",{start:function(e,q){var s=c(this).data("resizable"),i=s.options,k=s.element;var f=i.containment,j=(f instanceof c)?f.get(0):(/parent/.test(f))?k.parent().get(0):f;if(!j){return}s.containerElement=c(j);if(/document/.test(f)||f==document){s.containerOffset={left:0,top:0};s.containerPosition={left:0,top:0};s.parentData={element:c(document),left:0,top:0,width:c(document).width(),height:c(document).height()||document.body.parentNode.scrollHeight}}else{var m=c(j),h=[];c(["Top","Right","Left","Bottom"]).each(function(p,o){h[p]=b(m.css("padding"+o))});s.containerOffset=m.offset();s.containerPosition=m.position();s.containerSize={height:(m.innerHeight()-h[3]),width:(m.innerWidth()-h[1])};var n=s.containerOffset,d=s.containerSize.height,l=s.containerSize.width,g=(c.ui.hasScroll(j,"left")?j.scrollWidth:l),r=(c.ui.hasScroll(j)?j.scrollHeight:d);s.parentData={element:j,left:n.left,top:n.top,width:g,height:r}}},resize:function(f,p){var s=c(this).data("resizable"),h=s.options,e=s.containerSize,n=s.containerOffset,l=s.size,m=s.position,q=s._aspectRatio||f.shiftKey,d={top:0,left:0},g=s.containerElement;if(g[0]!=document&&(/static/).test(g.css("position"))){d=n}if(m.left<(s._helper?n.left:0)){s.size.width=s.size.width+(s._helper?(s.position.left-n.left):(s.position.left-d.left));if(q){s.size.height=s.size.width/h.aspectRatio}s.position.left=h.helper?n.left:0}if(m.top<(s._helper?n.top:0))
+{s.size.height=s.size.height+(s._helper?(s.position.top-n.top):s.position.top);if(q){s.size.width=s.size.height*h.aspectRatio}s.position.top=s._helper?n.top:0}s.offset.left=s.parentData.left+s.position.left;s.offset.top=s.parentData.top+s.position.top;var k=Math.abs((s._helper?s.offset.left-d.left:(s.offset.left-d.left))+s.sizeDiff.width),r=Math.abs((s._helper?s.offset.top-d.top:(s.offset.top-n.top))+s.sizeDiff.height);var j=s.containerElement.get(0)==s.element.parent().get(0),i=/relative|absolute/.test(s.containerElement.css("position"));if(j&&i){k-=s.parentData.left}if(k+s.size.width>=s.parentData.width){s.size.width=s.parentData.width-k;if(q){s.size.height=s.size.width/s.aspectRatio}}if(r+s.size.height>=s.parentData.height){s.size.height=s.parentData.height-r;if(q){s.size.width=s.size.height*s.aspectRatio}}},stop:function(e,m){var p=c(this).data("resizable"),f=p.options,k=p.position,l=p.containerOffset,d=p.containerPosition,g=p.containerElement;var i=c(p.helper),q=i.offset(),n=i.outerWidth()-p.sizeDiff.width,j=i.outerHeight()-p.sizeDiff.height;if(p._helper&&!f.animate&&(/relative/).test(g.css("position"))){c(this).css({left:q.left-d.left-l.left,width:n,height:j})}if(p._helper&&!f.animate&&(/static/).test(g.css("position"))){c(this).css({left:q.left-d.left-l.left,width:n,height:j})}}});c.ui.plugin.add("resizable","ghost",{start:function(f,g){var d=c(this).data("resizable"),h=d.options,e=d.size;d.ghost=d.originalElement.clone();d.ghost.css({opacity:0.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof h.ghost=="string"?h.ghost:"");d.ghost.appendTo(d.helper)},resize:function(e,f){var d=c(this).data("resizable"),g=d.options;if(d.ghost){d.ghost.css({position:"relative",height:d.size.height,width:d.size.width})}},stop:function(e,f){var d=c(this).data("resizable"),g=d.options;if(d.ghost&&d.helper){d.helper.get(0).removeChild(d.ghost.get(0))}}});c.ui.plugin.add("resizable","grid",{resize:function(d,l){var n=c(this).data("resizable"),g=n.options,j=n.size,h=n.originalSize,i=n.originalPosition,m=n.axis,k=g._aspectRatio||d.shiftKey;g.grid=typeof g.grid=="number"?[g.grid,g.grid]:g.grid;var f=Math.round((j.width-h.width)/(g.grid[0]||1))*(g.grid[0]||1),e=Math.round((j.height-h.height)/(g.grid[1]||1))*(g.grid[1]||1);if(/^(se|s|e)$/.test(m)){n.size.width=h.width+f;n.size.height=h.height+e}else{if(/^(ne)$/.test(m)){n.size.width=h.width+f;n.size.height=h.height+e;n.position.top=i.top-e}else{if(/^(sw)$/.test(m)){n.size.width=h.width+f;n.size.height=h.height+e;n.position.left=i.left-f}else{n.size.width=h.width+f;n.size.height=h.height+e;n.position.top=i.top-e;n.position.left=i.left-f}}}}});var b=function(d){return parseInt(d,10)||0};var a=function(d){return !isNaN(parseInt(d,10))}})(jQuery);;
+/**
+ * jQuery.ScrollTo - Easy element scrolling using jQuery.
+ * Copyright (c) 2008 Ariel Flesler - aflesler(at)gmail(dot)com
+ * Licensed under GPL license (http://www.opensource.org/licenses/gpl-license.php).
+ * Date: 2/8/2008
+ * @author Ariel Flesler
+ * @version 1.3.2
+ */
+;(function($){var o=$.scrollTo=function(a,b,c){o.window().scrollTo(a,b,c)};o.defaults={axis:'y',duration:1};o.window=function(){return $($.browser.safari?'body':'html')};$.fn.scrollTo=function(l,m,n){if(typeof m=='object'){n=m;m=0}n=$.extend({},o.defaults,n);m=m||n.speed||n.duration;n.queue=n.queue&&n.axis.length>1;if(n.queue)m/=2;n.offset=j(n.offset);n.over=j(n.over);return this.each(function(){var a=this,b=$(a),t=l,c,d={},w=b.is('html,body');switch(typeof t){case'number':case'string':if(/^([+-]=)?\d+(px)?$/.test(t)){t=j(t);break}t=$(t,this);case'object':if(t.is||t.style)c=(t=$(t)).offset()}$.each(n.axis.split(''),function(i,f){var P=f=='x'?'Left':'Top',p=P.toLowerCase(),k='scroll'+P,e=a[k],D=f=='x'?'Width':'Height';if(c){d[k]=c[p]+(w?0:e-b.offset()[p]);if(n.margin){d[k]-=parseInt(t.css('margin'+P))||0;d[k]-=parseInt(t.css('border'+P+'Width'))||0}d[k]+=n.offset[p]||0;if(n.over[p])d[k]+=t[D.toLowerCase()]()*n.over[p]}else d[k]=t[p];if(/^\d+$/.test(d[k]))d[k]=d[k]<=0?0:Math.min(d[k],h(D));if(!i&&n.queue){if(e!=d[k])g(n.onAfterFirst);delete d[k]}});g(n.onAfter);function g(a){b.animate(d,m,n.easing,a&&function(){a.call(this,l)})};function h(D){var b=w?$.browser.opera?document.body:document.documentElement:a;return b['scroll'+D]-b['client'+D]}})};function j(a){return typeof a=='object'?a:{top:a,left:a}}})(jQuery);
+
diff --git a/native_client_sdk/doc_generated/pepper_dev/c/ppb__graphics__2d_8h.html b/native_client_sdk/doc_generated/pepper_dev/c/ppb__graphics__2d_8h.html
index 4a81442..84a4eb6 100644
--- a/native_client_sdk/doc_generated/pepper_dev/c/ppb__graphics__2d_8h.html
+++ b/native_client_sdk/doc_generated/pepper_dev/c/ppb__graphics__2d_8h.html
@@ -19,15 +19,15 @@
 </div><h2>
 Data Structures</h2><table class="memberdecls">
 
-<tr><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___graphics2_d__1__1.html">PPB_Graphics2D</a></td></tr>
-<tr><td class="mdescLeft">&#160;</td><td class="mdescRight"><code>PPB_Graphics2D</code> defines the interface for a 2D graphics context.  <a href="struct_p_p_b___graphics2_d__1__1.html#details">More...</a><br /></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___graphics2_d__1__2.html">PPB_Graphics2D</a></td></tr>
+<tr><td class="mdescLeft">&#160;</td><td class="mdescRight"><code>PPB_Graphics2D</code> defines the interface for a 2D graphics context.  <a href="struct_p_p_b___graphics2_d__1__2.html#details">More...</a><br /></td></tr>
 </table><h2>
 Defines</h2><table class="memberdecls">
-<tr><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ppb__graphics__2d_8h.html#ad9792b60ca6ce77f3925be8d60e06640">PPB_GRAPHICS_2D_INTERFACE</a>&#160;&#160;&#160;&quot;PPB_Graphics2D;1.1&quot;</td></tr>
-<tr><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ppb__graphics__2d_8h.html#ab4930fe7aea6b403503d5cc748824b0d">PPB_GRAPHICS_2D_INTERFACE</a>&#160;&#160;&#160;<a class="el" href="ppb__graphics__2d_8h.html#ad9792b60ca6ce77f3925be8d60e06640">PPB_GRAPHICS_2D_INTERFACE</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ppb__graphics__2d_8h.html#a8991520a54fc032adae6e8de92d0e0c5">PPB_GRAPHICS_2D_INTERFACE</a>&#160;&#160;&#160;&quot;PPB_Graphics2D;1.2&quot;</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ppb__graphics__2d_8h.html#ab4930fe7aea6b403503d5cc748824b0d">PPB_GRAPHICS_2D_INTERFACE</a>&#160;&#160;&#160;<a class="el" href="ppb__graphics__2d_8h.html#a8991520a54fc032adae6e8de92d0e0c5">PPB_GRAPHICS_2D_INTERFACE</a></td></tr>
 </table><h2>
 Typedefs</h2><table class="memberdecls">
-<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___graphics2_d__1__1.html">PPB_Graphics2D</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#gaf9f8348d3315d8bb014b401f733ebdb6">PPB_Graphics2D</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___graphics2_d__1__2.html">PPB_Graphics2D</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#gae81de3c5ca761162254ed217693050ba">PPB_Graphics2D</a></td></tr>
 </table>
 <hr /><a name="details" id="details"></a><h2>Detailed Description</h2>
 <div class="textblock"><p>Defines the <code>PPB_Graphics2D</code> struct representing a 2D graphics context within the browser. </p>
@@ -37,19 +37,19 @@
 <div class="memproto">
 <table class="memname">
 <tr>
-<td class="memname">#define <a class="el" href="ppb__graphics__2d_8h.html#ab4930fe7aea6b403503d5cc748824b0d">PPB_GRAPHICS_2D_INTERFACE</a>&#160;&#160;&#160;<a class="el" href="ppb__graphics__2d_8h.html#ad9792b60ca6ce77f3925be8d60e06640">PPB_GRAPHICS_2D_INTERFACE</a></td>
+<td class="memname">#define <a class="el" href="ppb__graphics__2d_8h.html#ab4930fe7aea6b403503d5cc748824b0d">PPB_GRAPHICS_2D_INTERFACE</a>&#160;&#160;&#160;<a class="el" href="ppb__graphics__2d_8h.html#a8991520a54fc032adae6e8de92d0e0c5">PPB_GRAPHICS_2D_INTERFACE</a></td>
 </tr>
 </table>
 </div>
 <div class="memdoc">
 </div>
 </div>
-<a class="anchor" id="ad9792b60ca6ce77f3925be8d60e06640"></a><!-- doxytag: member="ppb_graphics_2d.h::PPB_GRAPHICS_2D_INTERFACE" ref="ad9792b60ca6ce77f3925be8d60e06640" args="" -->
+<a class="anchor" id="a8991520a54fc032adae6e8de92d0e0c5"></a><!-- doxytag: member="ppb_graphics_2d.h::PPB_GRAPHICS_2D_INTERFACE" ref="a8991520a54fc032adae6e8de92d0e0c5" args="" -->
 <div class="memitem">
 <div class="memproto">
 <table class="memname">
 <tr>
-<td class="memname">#define <a class="el" href="ppb__graphics__2d_8h.html#ad9792b60ca6ce77f3925be8d60e06640">PPB_GRAPHICS_2D_INTERFACE</a>&#160;&#160;&#160;&quot;PPB_Graphics2D;1.1&quot;</td>
+<td class="memname">#define <a class="el" href="ppb__graphics__2d_8h.html#a8991520a54fc032adae6e8de92d0e0c5">PPB_GRAPHICS_2D_INTERFACE</a>&#160;&#160;&#160;&quot;PPB_Graphics2D;1.2&quot;</td>
 </tr>
 </table>
 </div>
diff --git a/native_client_sdk/doc_generated/pepper_dev/c/ppb__input__event_8h.html b/native_client_sdk/doc_generated/pepper_dev/c/ppb__input__event_8h.html
index 1312059..b80c7b30 100644
--- a/native_client_sdk/doc_generated/pepper_dev/c/ppb__input__event_8h.html
+++ b/native_client_sdk/doc_generated/pepper_dev/c/ppb__input__event_8h.html
@@ -102,7 +102,9 @@
 <a class="el" href="group___enums.html#gga21b811ac0484a214a8751aa3e1c959d9a493ca598187014e2356cd7a5ba8cdffd">PP_INPUTEVENT_MODIFIER_NUMLOCKKEY</a> =  1 &lt;&lt; 10, 
 <a class="el" href="group___enums.html#gga21b811ac0484a214a8751aa3e1c959d9a8295bfc8067c06a17ccfc5fb6a992e17">PP_INPUTEVENT_MODIFIER_ISLEFT</a> =  1 &lt;&lt; 11, 
 <br />
-&#160;&#160;<a class="el" href="group___enums.html#gga21b811ac0484a214a8751aa3e1c959d9a348f43efaf61edbefd83346428c5b122">PP_INPUTEVENT_MODIFIER_ISRIGHT</a> =  1 &lt;&lt; 12
+&#160;&#160;<a class="el" href="group___enums.html#gga21b811ac0484a214a8751aa3e1c959d9a348f43efaf61edbefd83346428c5b122">PP_INPUTEVENT_MODIFIER_ISRIGHT</a> =  1 &lt;&lt; 12, 
+<a class="el" href="group___enums.html#gga21b811ac0484a214a8751aa3e1c959d9a970ad827a7240093ec57f1a3a7aea692">PP_INPUTEVENT_MODIFIER_ISPEN</a> =  1 &lt;&lt; 13, 
+<a class="el" href="group___enums.html#gga21b811ac0484a214a8751aa3e1c959d9a3367f08ba940a67d0098a59093582ef1">PP_INPUTEVENT_MODIFIER_ISERASER</a> =  1 &lt;&lt; 14
 <br />
  }</td></tr>
 <tr><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#ga25113f3c8d33e863fd38b3f70f8a5e6e">PP_InputEvent_MouseButton</a> { <a class="el" href="group___enums.html#gga25113f3c8d33e863fd38b3f70f8a5e6eaa2d4e499d6c23ef45381a89612e654d9">PP_INPUTEVENT_MOUSEBUTTON_NONE</a> =  -1, 
diff --git a/native_client_sdk/doc_generated/pepper_dev/c/ppb__vpn__provider_8h.html b/native_client_sdk/doc_generated/pepper_dev/c/ppb__vpn__provider_8h.html
new file mode 100644
index 0000000..27e0fa7741
--- /dev/null
+++ b/native_client_sdk/doc_generated/pepper_dev/c/ppb__vpn__provider_8h.html
@@ -0,0 +1,45 @@
+{{+bindTo:partials.standard_nacl_api}}
+<h1>ppb_vpn_provider.h File Reference</h1>
+<div id="doxygen-ref">
+{{- dummy div to appease doxygen -}}
+  <div>
+<!-- Generated by Doxygen 1.7.6.1 -->
+
+
+</div>
+<!--header-->
+<div class="contents">
+<div class="textblock"><div class="dynheader">
+Include dependency graph for ppb_vpn_provider.h:</div>
+<div class="dyncontent">
+<div class="center"><img src="ppb__vpn__provider_8h__incl.png" border="0" usemap="#ppb__vpn__provider_8h" alt="" /></div>
+<map name="ppb__vpn__provider_8h" id="ppb__vpn__provider_8h">
+</map>
+</div>
+</div><h2>
+Data Structures</h2><table class="memberdecls">
+
+<tr><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___vpn_provider__0__1.html">PPB_VpnProvider</a></td></tr>
+<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Use the <code>PPB_VpnProvider</code> interface to implement a VPN client.  <a href="struct_p_p_b___vpn_provider__0__1.html#details">More...</a><br /></td></tr>
+</table><h2>
+Defines</h2><table class="memberdecls">
+<tr><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ppb__vpn__provider_8h.html#adc236058517f438cdd43d61c8948de69">PPB_VPNPROVIDER_INTERFACE</a>&#160;&#160;&#160;&quot;PPB_VpnProvider;0.1&quot; /* dev */</td></tr>
+</table>
+<hr /><a name="details" id="details"></a><h2>Detailed Description</h2>
+<div class="textblock"><p>This file defines the <code>PPB_VpnProvider</code> interface. </p>
+</div><hr /><h2>Define Documentation</h2>
+<a class="anchor" id="adc236058517f438cdd43d61c8948de69"></a><!-- doxytag: member="ppb_vpn_provider.h::PPB_VPNPROVIDER_INTERFACE" ref="adc236058517f438cdd43d61c8948de69" args="" -->
+<div class="memitem">
+<div class="memproto">
+<table class="memname">
+<tr>
+<td class="memname">#define <a class="el" href="ppb__vpn__provider_8h.html#adc236058517f438cdd43d61c8948de69">PPB_VPNPROVIDER_INTERFACE</a>&#160;&#160;&#160;&quot;PPB_VpnProvider;0.1&quot; /* dev */</td>
+</tr>
+</table>
+</div>
+<div class="memdoc">
+</div>
+</div>
+</div><!-- contents -->
+</div>
+{{/partials.standard_nacl_api}}
diff --git a/native_client_sdk/doc_generated/pepper_dev/c/ppb__vpn__provider_8h__incl.png b/native_client_sdk/doc_generated/pepper_dev/c/ppb__vpn__provider_8h__incl.png
new file mode 100644
index 0000000..8283005f
--- /dev/null
+++ b/native_client_sdk/doc_generated/pepper_dev/c/ppb__vpn__provider_8h__incl.png
Binary files differ
diff --git a/native_client_sdk/doc_generated/pepper_dev/c/struct_p_p___gamepad_sample_data.html b/native_client_sdk/doc_generated/pepper_dev/c/struct_p_p___gamepad_sample_data.html
index b198568..33332ca 100644
--- a/native_client_sdk/doc_generated/pepper_dev/c/struct_p_p___gamepad_sample_data.html
+++ b/native_client_sdk/doc_generated/pepper_dev/c/struct_p_p___gamepad_sample_data.html
@@ -19,7 +19,7 @@
 <tr><td class="memItemLeft" align="right" valign="top">double&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___gamepad_sample_data.html#af832f6af0964f9023d712712a6e3afc7">timestamp</a></td></tr>
 <tr><td class="memItemLeft" align="right" valign="top">uint16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___gamepad_sample_data.html#a0a4d0498f6beecb54628a4f1919c48e3">id</a> [128]</td></tr>
 <tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___gamepad_sample_data.html#ae955efce5fcd9de08ab8d4c7f52d0af7">connected</a></td></tr>
-<tr><td class="memItemLeft" align="right" valign="top">char&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___gamepad_sample_data.html#aad71d81059bd5880ebd79bc3b9e55cd5">unused_pad_</a> [4]</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">int8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___gamepad_sample_data.html#a6d8faab2471cbf6133481d7df6c53c3f">unused_pad_</a> [4]</td></tr>
 </table>
 <hr /><a name="details" id="details"></a><h2>Detailed Description</h2>
 <div class="textblock"><p>The data for one gamepad device. </p>
@@ -119,12 +119,12 @@
 <p>Monotonically increasing value that is incremented when the data have been updated. </p>
 </div>
 </div>
-<a class="anchor" id="aad71d81059bd5880ebd79bc3b9e55cd5"></a><!-- doxytag: member="PP_GamepadSampleData::unused_pad_" ref="aad71d81059bd5880ebd79bc3b9e55cd5" args="[4]" -->
+<a class="anchor" id="a6d8faab2471cbf6133481d7df6c53c3f"></a><!-- doxytag: member="PP_GamepadSampleData::unused_pad_" ref="a6d8faab2471cbf6133481d7df6c53c3f" args="[4]" -->
 <div class="memitem">
 <div class="memproto">
 <table class="memname">
 <tr>
-<td class="memname">char <a class="el" href="struct_p_p___gamepad_sample_data.html#aad71d81059bd5880ebd79bc3b9e55cd5">PP_GamepadSampleData::unused_pad_</a>[4]</td>
+<td class="memname">int8_t <a class="el" href="struct_p_p___gamepad_sample_data.html#a6d8faab2471cbf6133481d7df6c53c3f">PP_GamepadSampleData::unused_pad_</a>[4]</td>
 </tr>
 </table>
 </div>
diff --git a/native_client_sdk/doc_generated/pepper_dev/c/struct_p_p___gamepads_sample_data.html b/native_client_sdk/doc_generated/pepper_dev/c/struct_p_p___gamepads_sample_data.html
index 26c5f006..1783f94f 100644
--- a/native_client_sdk/doc_generated/pepper_dev/c/struct_p_p___gamepads_sample_data.html
+++ b/native_client_sdk/doc_generated/pepper_dev/c/struct_p_p___gamepads_sample_data.html
@@ -13,7 +13,7 @@
 Data Fields</h2><table class="memberdecls">
 
 <tr><td class="memItemLeft" align="right" valign="top">uint32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___gamepads_sample_data.html#abc9c0c8b20cfe0219a5ab4e38dd5a800">length</a></td></tr>
-<tr><td class="memItemLeft" align="right" valign="top">char&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___gamepads_sample_data.html#a0664781b0f25af5206d134cb04543235">unused_pad_</a> [4]</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">int8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___gamepads_sample_data.html#a8da16be21054bad05283f6cbc7ab226a">unused_pad_</a> [4]</td></tr>
 <tr><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="struct_p_p___gamepad_sample_data.html">PP_GamepadSampleData</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___gamepads_sample_data.html#ab0fa87f088fef743ba879a2f91363bfe">items</a> [4]</td></tr>
 </table>
 <hr /><a name="details" id="details"></a><h2>Detailed Description</h2>
@@ -45,12 +45,12 @@
 <p>Number of valid elements in the |items| array. </p>
 </div>
 </div>
-<a class="anchor" id="a0664781b0f25af5206d134cb04543235"></a><!-- doxytag: member="PP_GamepadsSampleData::unused_pad_" ref="a0664781b0f25af5206d134cb04543235" args="[4]" -->
+<a class="anchor" id="a8da16be21054bad05283f6cbc7ab226a"></a><!-- doxytag: member="PP_GamepadsSampleData::unused_pad_" ref="a8da16be21054bad05283f6cbc7ab226a" args="[4]" -->
 <div class="memitem">
 <div class="memproto">
 <table class="memname">
 <tr>
-<td class="memname">char <a class="el" href="struct_p_p___gamepads_sample_data.html#a0664781b0f25af5206d134cb04543235">PP_GamepadsSampleData::unused_pad_</a>[4]</td>
+<td class="memname">int8_t <a class="el" href="struct_p_p___gamepads_sample_data.html#a8da16be21054bad05283f6cbc7ab226a">PP_GamepadsSampleData::unused_pad_</a>[4]</td>
 </tr>
 </table>
 </div>
diff --git a/native_client_sdk/doc_generated/pepper_dev/c/struct_p_p___input_event___character.html b/native_client_sdk/doc_generated/pepper_dev/c/struct_p_p___input_event___character.html
index 4f3913d..17f4592 100644
--- a/native_client_sdk/doc_generated/pepper_dev/c/struct_p_p___input_event___character.html
+++ b/native_client_sdk/doc_generated/pepper_dev/c/struct_p_p___input_event___character.html
@@ -13,7 +13,7 @@
 Data Fields</h2><table class="memberdecls">
 
 <tr><td class="memItemLeft" align="right" valign="top">uint32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___input_event___character.html#a6505d006cdb0e52d39e94b540b923b9a">modifier</a></td></tr>
-<tr><td class="memItemLeft" align="right" valign="top">char&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___input_event___character.html#ac5e8c1dbf5c8ae33f22b8781ff5f1760">text</a> [5]</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">int8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___input_event___character.html#a02f4d484985b53e378df8f0281a268ba">text</a> [5]</td></tr>
 </table>
 <hr /><a name="details" id="details"></a><h2>Detailed Description</h2>
 <div class="textblock"><p>The <code><a class="el" href="struct_p_p___input_event___character.html" title="The PP_InputEvent_Character struct represents a typed character event.">PP_InputEvent_Character</a></code> struct represents a typed character event. </p>
@@ -33,12 +33,12 @@
 <p>A combination of the <code>PP_InputEvent_Modifier</code> flags. </p>
 </div>
 </div>
-<a class="anchor" id="ac5e8c1dbf5c8ae33f22b8781ff5f1760"></a><!-- doxytag: member="PP_InputEvent_Character::text" ref="ac5e8c1dbf5c8ae33f22b8781ff5f1760" args="[5]" -->
+<a class="anchor" id="a02f4d484985b53e378df8f0281a268ba"></a><!-- doxytag: member="PP_InputEvent_Character::text" ref="a02f4d484985b53e378df8f0281a268ba" args="[5]" -->
 <div class="memitem">
 <div class="memproto">
 <table class="memname">
 <tr>
-<td class="memname">char <a class="el" href="struct_p_p___input_event___character.html#ac5e8c1dbf5c8ae33f22b8781ff5f1760">PP_InputEvent_Character::text</a>[5]</td>
+<td class="memname">int8_t <a class="el" href="struct_p_p___input_event___character.html#a02f4d484985b53e378df8f0281a268ba">PP_InputEvent_Character::text</a>[5]</td>
 </tr>
 </table>
 </div>
diff --git a/native_client_sdk/doc_generated/pepper_dev/c/struct_p_p_b___graphics2_d__1__1.html b/native_client_sdk/doc_generated/pepper_dev/c/struct_p_p_b___graphics2_d__1__1.html
deleted file mode 100644
index ec01d7f..0000000
--- a/native_client_sdk/doc_generated/pepper_dev/c/struct_p_p_b___graphics2_d__1__1.html
+++ /dev/null
@@ -1,238 +0,0 @@
-{{+bindTo:partials.standard_nacl_api}}
-<h1>PPB_Graphics2D Struct Reference</h1>
-<div id="doxygen-ref">
-{{- dummy div to appease doxygen -}}
-  <div>
-<!-- Generated by Doxygen 1.7.6.1 -->
-
-
-</div>
-<!--header-->
-<div class="contents">
-<!-- doxytag: class="PPB_Graphics2D" --><h2>
-Data Fields</h2><table class="memberdecls">
-
-<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a034e6a3df2bccb119a087874e7cf18ed">Create</a> )(<a class="el" href="group___typedefs.html#ga89b662403e6a687bb914b80114c0d19d">PP_Instance</a> instance, const struct <a class="el" href="struct_p_p___size.html">PP_Size</a> *size, <a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a> is_always_opaque)</td></tr>
-<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a8d634407f71b52367901e8c807f3bb15">IsGraphics2D</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource)</td></tr>
-<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___graphics2_d__1__1.html#ae9aae546a51e35ee85688e0f80907fc3">Describe</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics_2d, struct <a class="el" href="struct_p_p___size.html">PP_Size</a> *size, <a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a> *is_always_opaque)</td></tr>
-<tr><td class="memItemLeft" align="right" valign="top">void(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a912e5704c150c4228ee4ec326e7cb1bb">PaintImageData</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics_2d, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> image_data, const struct <a class="el" href="struct_p_p___point.html">PP_Point</a> *top_left, const struct <a class="el" href="struct_p_p___rect.html">PP_Rect</a> *src_rect)</td></tr>
-<tr><td class="memItemLeft" align="right" valign="top">void(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a2242719819a82b11b0e3f71c4a19f461">Scroll</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics_2d, const struct <a class="el" href="struct_p_p___rect.html">PP_Rect</a> *clip_rect, const struct <a class="el" href="struct_p_p___point.html">PP_Point</a> *amount)</td></tr>
-<tr><td class="memItemLeft" align="right" valign="top">void(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___graphics2_d__1__1.html#ae5cfb7616fe383d9fedee88131f4b9ff">ReplaceContents</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics_2d, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> image_data)</td></tr>
-<tr><td class="memItemLeft" align="right" valign="top">int32_t(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a46607be26d07e4af31b56ef0791022fa">Flush</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics_2d, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr>
-<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___graphics2_d__1__1.html#ad809f5d73448def11577d54147fa268e">SetScale</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource, float scale)</td></tr>
-<tr><td class="memItemLeft" align="right" valign="top">float(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a9e284dc50e55e87c5367e9f081f44045">GetScale</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource)</td></tr>
-</table>
-<hr /><a name="details" id="details"></a><h2>Detailed Description</h2>
-<div class="textblock"><p><code>PPB_Graphics2D</code> defines the interface for a 2D graphics context. </p>
-</div><hr /><h2>Field Documentation</h2>
-<a class="anchor" id="a034e6a3df2bccb119a087874e7cf18ed"></a><!-- doxytag: member="PPB_Graphics2D::Create" ref="a034e6a3df2bccb119a087874e7cf18ed" args=")(PP_Instance instance, const struct PP_Size *size, PP_Bool is_always_opaque)" -->
-<div class="memitem">
-<div class="memproto">
-<table class="memname">
-<tr>
-<td class="memname"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(* <a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a034e6a3df2bccb119a087874e7cf18ed">PPB_Graphics2D::Create</a>)(<a class="el" href="group___typedefs.html#ga89b662403e6a687bb914b80114c0d19d">PP_Instance</a> instance, const struct <a class="el" href="struct_p_p___size.html">PP_Size</a> *size, <a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a> is_always_opaque)</td>
-</tr>
-</table>
-</div>
-<div class="memdoc">
-<p><a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a034e6a3df2bccb119a087874e7cf18ed" title="Create() creates a 2D graphics context.">Create()</a> creates a 2D graphics context. </p>
-<p>The returned graphics context will not be bound to the module instance on creation (call BindGraphics() on the module instance to bind the returned graphics context to the module instance).</p>
-<dl class="params"><dt><b>Parameters:</b></dt><dd>
-<table class="params">
-<tr><td class="paramdir">[in]</td><td class="paramname">instance</td><td>The module instance. </td></tr>
-<tr><td class="paramdir">[in]</td><td class="paramname">size</td><td>The size of the graphic context. </td></tr>
-<tr><td class="paramdir">[in]</td><td class="paramname">is_always_opaque</td><td>Set the <code>is_always_opaque</code> flag to <code>PP_TRUE</code> if you know that you will be painting only opaque data to this context. This option will disable blending when compositing the module with the web page, which might give higher performance on some computers.</td></tr>
-</table>
-</dd>
-</dl>
-<p>If you set <code>is_always_opaque</code>, your alpha channel should always be set to 0xFF or there may be painting artifacts. The alpha values overwrite the destination alpha values without blending when <code>is_always_opaque</code> is true.</p>
-<dl class="return"><dt><b>Returns:</b></dt><dd>A <code>PP_Resource</code> containing the 2D graphics context if successful or 0 if unsuccessful. </dd></dl>
-</div>
-</div>
-<a class="anchor" id="ae9aae546a51e35ee85688e0f80907fc3"></a><!-- doxytag: member="PPB_Graphics2D::Describe" ref="ae9aae546a51e35ee85688e0f80907fc3" args=")(PP_Resource graphics_2d, struct PP_Size *size, PP_Bool *is_always_opaque)" -->
-<div class="memitem">
-<div class="memproto">
-<table class="memname">
-<tr>
-<td class="memname"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(* <a class="el" href="struct_p_p_b___graphics2_d__1__1.html#ae9aae546a51e35ee85688e0f80907fc3">PPB_Graphics2D::Describe</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics_2d, struct <a class="el" href="struct_p_p___size.html">PP_Size</a> *size, <a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a> *is_always_opaque)</td>
-</tr>
-</table>
-</div>
-<div class="memdoc">
-<p><a class="el" href="struct_p_p_b___graphics2_d__1__1.html#ae9aae546a51e35ee85688e0f80907fc3" title="Describe() retrieves the configuration for the given graphics context, filling the given values (whic...">Describe()</a> retrieves the configuration for the given graphics context, filling the given values (which must not be <code>NULL</code>). </p>
-<dl class="params"><dt><b>Parameters:</b></dt><dd>
-<table class="params">
-<tr><td class="paramdir">[in]</td><td class="paramname">resource</td><td>The 2D Graphics resource. </td></tr>
-<tr><td class="paramdir">[in,out]</td><td class="paramname">size</td><td>The size of the 2D graphics context in the browser. </td></tr>
-<tr><td class="paramdir">[in,out]</td><td class="paramname">is_always_opaque</td><td>Identifies whether only opaque data will be painted.</td></tr>
-</table>
-</dd>
-</dl>
-<dl class="return"><dt><b>Returns:</b></dt><dd>Returns <code>PP_TRUE</code> on success or <code>PP_FALSE</code> if the resource is invalid. The output parameters will be set to 0 on a <code>PP_FALSE</code>. </dd></dl>
-</div>
-</div>
-<a class="anchor" id="a46607be26d07e4af31b56ef0791022fa"></a><!-- doxytag: member="PPB_Graphics2D::Flush" ref="a46607be26d07e4af31b56ef0791022fa" args=")(PP_Resource graphics_2d, struct PP_CompletionCallback callback)" -->
-<div class="memitem">
-<div class="memproto">
-<table class="memname">
-<tr>
-<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a46607be26d07e4af31b56ef0791022fa">PPB_Graphics2D::Flush</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics_2d, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td>
-</tr>
-</table>
-</div>
-<div class="memdoc">
-<p><a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a46607be26d07e4af31b56ef0791022fa" title="Flush() flushes any enqueued paint, scroll, and replace commands to the backing store.">Flush()</a> flushes any enqueued paint, scroll, and replace commands to the backing store. </p>
-<p>This function actually executes the updates, and causes a repaint of the webpage, assuming this graphics context is bound to a module instance.</p>
-<p><a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a46607be26d07e4af31b56ef0791022fa" title="Flush() flushes any enqueued paint, scroll, and replace commands to the backing store.">Flush()</a> runs in asynchronous mode. Specify a callback function and the argument for that callback function. The callback function will be executed on the calling thread when the image has been painted to the screen. While you are waiting for a flush callback, additional calls to <a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a46607be26d07e4af31b56ef0791022fa" title="Flush() flushes any enqueued paint, scroll, and replace commands to the backing store.">Flush()</a> will fail.</p>
-<p>Because the callback is executed (or thread unblocked) only when the instance's image is actually on the screen, this function provides a way to rate limit animations. By waiting until the image is on the screen before painting the next frame, you can ensure you're not flushing 2D graphics faster than the screen can be updated.</p>
-<p><b>Unbound contexts</b> If the context is not bound to a module instance, you will still get a callback. The callback will execute after <a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a46607be26d07e4af31b56ef0791022fa" title="Flush() flushes any enqueued paint, scroll, and replace commands to the backing store.">Flush()</a> returns to avoid reentrancy. The callback will not wait until anything is painted to the screen because there will be nothing on the screen. The timing of this callback is not guaranteed and may be deprioritized by the browser because it is not affecting the user experience.</p>
-<p><b>Off-screen instances</b> If the context is bound to an instance that is currently not visible (for example, scrolled out of view) it will behave like the "unbound context" case.</p>
-<p><b>Detaching a context</b> If you detach a context from a module instance, any pending flush callbacks will be converted into the "unbound context" case.</p>
-<p><b>Released contexts</b> A callback may or may not get called even if you have released all of your references to the context. This scenario can occur if there are internal references to the context suggesting it has not been internally destroyed (for example, if it is still bound to an instance) or due to other implementation details. As a result, you should be careful to check that flush callbacks are for the context you expect and that you're capable of handling callbacks for unreferenced contexts.</p>
-<p><b>Shutdown</b> If a module instance is removed when a flush is pending, the callback will not be executed.</p>
-<dl class="params"><dt><b>Parameters:</b></dt><dd>
-<table class="params">
-<tr><td class="paramdir">[in]</td><td class="paramname">graphics_2d</td><td>The 2D Graphics resource. </td></tr>
-<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code>CompletionCallback</code> to be called when the image has been painted on the screen.</td></tr>
-</table>
-</dd>
-</dl>
-<dl class="return"><dt><b>Returns:</b></dt><dd>Returns <code>PP_OK</code> on success or <code>PP_ERROR_BADRESOURCE</code> if the graphics context is invalid, <code>PP_ERROR_BADARGUMENT</code> if the callback is null and flush is being called from the main thread of the module, or <code>PP_ERROR_INPROGRESS</code> if a flush is already pending that has not issued its callback yet. In the failure case, nothing will be updated and no callback will be scheduled. </dd></dl>
-</div>
-</div>
-<a class="anchor" id="a9e284dc50e55e87c5367e9f081f44045"></a><!-- doxytag: member="PPB_Graphics2D::GetScale" ref="a9e284dc50e55e87c5367e9f081f44045" args=")(PP_Resource resource)" -->
-<div class="memitem">
-<div class="memproto">
-<table class="memname">
-<tr>
-<td class="memname">float(* <a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a9e284dc50e55e87c5367e9f081f44045">PPB_Graphics2D::GetScale</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource)</td>
-</tr>
-</table>
-</div>
-<div class="memdoc">
-</div>
-</div>
-<a class="anchor" id="a8d634407f71b52367901e8c807f3bb15"></a><!-- doxytag: member="PPB_Graphics2D::IsGraphics2D" ref="a8d634407f71b52367901e8c807f3bb15" args=")(PP_Resource resource)" -->
-<div class="memitem">
-<div class="memproto">
-<table class="memname">
-<tr>
-<td class="memname"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(* <a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a8d634407f71b52367901e8c807f3bb15">PPB_Graphics2D::IsGraphics2D</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource)</td>
-</tr>
-</table>
-</div>
-<div class="memdoc">
-<p><a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a8d634407f71b52367901e8c807f3bb15" title="IsGraphics2D() determines if the given resource is a valid Graphics2D.">IsGraphics2D()</a> determines if the given resource is a valid <code>Graphics2D</code>. </p>
-<dl class="params"><dt><b>Parameters:</b></dt><dd>
-<table class="params">
-<tr><td class="paramdir">[in]</td><td class="paramname">resource</td><td>A <code>Graphics2D</code> context resource.</td></tr>
-</table>
-</dd>
-</dl>
-<dl class="return"><dt><b>Returns:</b></dt><dd>PP_TRUE if the given resource is a valid <code>Graphics2D</code>, <code>PP_FALSE</code> if it is an invalid resource or is a resource of another type. </dd></dl>
-</div>
-</div>
-<a class="anchor" id="a912e5704c150c4228ee4ec326e7cb1bb"></a><!-- doxytag: member="PPB_Graphics2D::PaintImageData" ref="a912e5704c150c4228ee4ec326e7cb1bb" args=")(PP_Resource graphics_2d, PP_Resource image_data, const struct PP_Point *top_left, const struct PP_Rect *src_rect)" -->
-<div class="memitem">
-<div class="memproto">
-<table class="memname">
-<tr>
-<td class="memname">void(* <a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a912e5704c150c4228ee4ec326e7cb1bb">PPB_Graphics2D::PaintImageData</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics_2d, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> image_data, const struct <a class="el" href="struct_p_p___point.html">PP_Point</a> *top_left, const struct <a class="el" href="struct_p_p___rect.html">PP_Rect</a> *src_rect)</td>
-</tr>
-</table>
-</div>
-<div class="memdoc">
-<p><a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a912e5704c150c4228ee4ec326e7cb1bb" title="PaintImageData() enqueues a paint of the given image into the context.">PaintImageData()</a> enqueues a paint of the given image into the context. </p>
-<p>This function has no effect until you call <a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a46607be26d07e4af31b56ef0791022fa" title="Flush() flushes any enqueued paint, scroll, and replace commands to the backing store.">Flush()</a> As a result, what counts is the contents of the bitmap when you call <a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a46607be26d07e4af31b56ef0791022fa" title="Flush() flushes any enqueued paint, scroll, and replace commands to the backing store.">Flush()</a>, not when you call this function.</p>
-<p>The provided image will be placed at <code>top_left</code> from the top left of the context's internal backing store. Then the pixels contained in <code>src_rect</code> will be copied into the backing store. This means that the rectangle being painted will be at <code>src_rect</code> offset by <code>top_left</code>.</p>
-<p>The <code>src_rect</code> is specified in the coordinate system of the image being painted, not the context. For the common case of copying the entire image, you may specify an empty <code>src_rect</code>.</p>
-<p>The painted area of the source bitmap must fall entirely within the context. Attempting to paint outside of the context will result in an error. However, the source bitmap may fall outside the context, as long as the <code>src_rect</code> subset of it falls entirely within the context.</p>
-<p>There are two methods most modules will use for painting. The first method is to generate a new <code>ImageData</code> and then paint it. In this case, you'll set the location of your painting to <code>top_left</code> and set <code>src_rect</code> to <code>NULL</code>. The second is that you're generating small invalid regions out of a larger bitmap representing your entire instance. In this case, you would set the location of your image to (0,0) and then set <code>src_rect</code> to the pixels you changed.</p>
-<dl class="params"><dt><b>Parameters:</b></dt><dd>
-<table class="params">
-<tr><td class="paramdir">[in]</td><td class="paramname">resource</td><td>The 2D Graphics resource. </td></tr>
-<tr><td class="paramdir">[in]</td><td class="paramname">image</td><td>The <code>ImageData</code> to be painted. </td></tr>
-<tr><td class="paramdir">[in]</td><td class="paramname">top_left</td><td>A <code>Point</code> representing the <code>top_left</code> location where the <code>ImageData</code> will be painted. </td></tr>
-<tr><td class="paramdir">[in]</td><td class="paramname">src_rect</td><td>The rectangular area where the <code>ImageData</code> will be painted. </td></tr>
-</table>
-</dd>
-</dl>
-</div>
-</div>
-<a class="anchor" id="ae5cfb7616fe383d9fedee88131f4b9ff"></a><!-- doxytag: member="PPB_Graphics2D::ReplaceContents" ref="ae5cfb7616fe383d9fedee88131f4b9ff" args=")(PP_Resource graphics_2d, PP_Resource image_data)" -->
-<div class="memitem">
-<div class="memproto">
-<table class="memname">
-<tr>
-<td class="memname">void(* <a class="el" href="struct_p_p_b___graphics2_d__1__1.html#ae5cfb7616fe383d9fedee88131f4b9ff">PPB_Graphics2D::ReplaceContents</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics_2d, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> image_data)</td>
-</tr>
-</table>
-</div>
-<div class="memdoc">
-<p><a class="el" href="struct_p_p_b___graphics2_d__1__1.html#ae5cfb7616fe383d9fedee88131f4b9ff" title="ReplaceContents() provides a slightly more efficient way to paint the entire module's image...">ReplaceContents()</a> provides a slightly more efficient way to paint the entire module's image. </p>
-<p>Normally, calling <a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a912e5704c150c4228ee4ec326e7cb1bb" title="PaintImageData() enqueues a paint of the given image into the context.">PaintImageData()</a> requires that the browser copy the pixels out of the image and into the graphics context's backing store. This function replaces the graphics context's backing store with the given image, avoiding the copy.</p>
-<p>The new image must be the exact same size as this graphics context. If the new image uses a different image format than the browser's native bitmap format (use <code><a class="el" href="struct_p_p_b___image_data__1__0.html#adba78e8f9e623809b6b23419dbce4d65" title="GetNativeImageDataFormat() returns the browser's preferred format for image data.">PPB_ImageData.GetNativeImageDataFormat()</a></code> to retrieve the format), then a conversion will be done inside the browser which may slow the performance a little bit.</p>
-<p><b>Note:</b> The new image will not be painted until you call <a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a46607be26d07e4af31b56ef0791022fa" title="Flush() flushes any enqueued paint, scroll, and replace commands to the backing store.">Flush()</a>.</p>
-<p>After this call, you should take care to release your references to the image. If you paint to the image after <a class="el" href="struct_p_p_b___graphics2_d__1__1.html#ae5cfb7616fe383d9fedee88131f4b9ff" title="ReplaceContents() provides a slightly more efficient way to paint the entire module's image...">ReplaceContents()</a>, there is the possibility of significant painting artifacts because the page might use partially-rendered data when copying out of the backing store.</p>
-<p>In the case of an animation, you will want to allocate a new image for the next frame. It is best if you wait until the flush callback has executed before allocating this bitmap. This gives the browser the option of caching the previous backing store and handing it back to you (assuming the sizes match). In the optimal case, this means no bitmaps are allocated during the animation, and the backing store and "front buffer" (which the plugin is painting into) are just being swapped back and forth.</p>
-<dl class="params"><dt><b>Parameters:</b></dt><dd>
-<table class="params">
-<tr><td class="paramdir">[in]</td><td class="paramname">graphics_2d</td><td>The 2D Graphics resource. </td></tr>
-<tr><td class="paramdir">[in]</td><td class="paramname">image</td><td>The <code>ImageData</code> to be painted. </td></tr>
-</table>
-</dd>
-</dl>
-</div>
-</div>
-<a class="anchor" id="a2242719819a82b11b0e3f71c4a19f461"></a><!-- doxytag: member="PPB_Graphics2D::Scroll" ref="a2242719819a82b11b0e3f71c4a19f461" args=")(PP_Resource graphics_2d, const struct PP_Rect *clip_rect, const struct PP_Point *amount)" -->
-<div class="memitem">
-<div class="memproto">
-<table class="memname">
-<tr>
-<td class="memname">void(* <a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a2242719819a82b11b0e3f71c4a19f461">PPB_Graphics2D::Scroll</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics_2d, const struct <a class="el" href="struct_p_p___rect.html">PP_Rect</a> *clip_rect, const struct <a class="el" href="struct_p_p___point.html">PP_Point</a> *amount)</td>
-</tr>
-</table>
-</div>
-<div class="memdoc">
-<p><a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a2242719819a82b11b0e3f71c4a19f461" title="Scroll() enqueues a scroll of the context's backing store.">Scroll()</a> enqueues a scroll of the context's backing store. </p>
-<p>This function has no effect until you call <a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a46607be26d07e4af31b56ef0791022fa" title="Flush() flushes any enqueued paint, scroll, and replace commands to the backing store.">Flush()</a>. The data within the provided clipping rectangle will be shifted by (dx, dy) pixels.</p>
-<p>This function will result in some exposed region which will have undefined contents. The module should call <a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a912e5704c150c4228ee4ec326e7cb1bb" title="PaintImageData() enqueues a paint of the given image into the context.">PaintImageData()</a> on these exposed regions to give the correct contents.</p>
-<p>The scroll can be larger than the area of the clipping rectangle, which means the current image will be scrolled out of the rectangle. This scenario is not an error but will result in a no-op.</p>
-<dl class="params"><dt><b>Parameters:</b></dt><dd>
-<table class="params">
-<tr><td class="paramdir">[in]</td><td class="paramname">graphics_2d</td><td>The 2D Graphics resource. </td></tr>
-<tr><td class="paramdir">[in]</td><td class="paramname">clip</td><td>The clipping rectangle. </td></tr>
-<tr><td class="paramdir">[in]</td><td class="paramname">amount</td><td>The amount the area in the clipping rectangle will shifted. </td></tr>
-</table>
-</dd>
-</dl>
-</div>
-</div>
-<a class="anchor" id="ad809f5d73448def11577d54147fa268e"></a><!-- doxytag: member="PPB_Graphics2D::SetScale" ref="ad809f5d73448def11577d54147fa268e" args=")(PP_Resource resource, float scale)" -->
-<div class="memitem">
-<div class="memproto">
-<table class="memname">
-<tr>
-<td class="memname"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(* <a class="el" href="struct_p_p_b___graphics2_d__1__1.html#ad809f5d73448def11577d54147fa268e">PPB_Graphics2D::SetScale</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource, float scale)</td>
-</tr>
-</table>
-</div>
-<div class="memdoc">
-<p><a class="el" href="struct_p_p_b___graphics2_d__1__1.html#ad809f5d73448def11577d54147fa268e" title="SetScale() sets the scale factor that will be applied when painting the graphics context onto the out...">SetScale()</a> sets the scale factor that will be applied when painting the graphics context onto the output device. </p>
-<p>Typically, if rendering at device resolution is desired, the context would be created with the width and height scaled up by the view's GetDeviceScale and SetScale called with a scale of 1.0 / GetDeviceScale(). For example, if the view resource passed to DidChangeView has a rectangle of (w=200, h=100) and a device scale of 2.0, one would call Create with a size of (w=400, h=200) and then call SetScale with 0.5. One would then treat each pixel in the context as a single device pixel.</p>
-<dl class="params"><dt><b>Parameters:</b></dt><dd>
-<table class="params">
-<tr><td class="paramdir">[in]</td><td class="paramname">resource</td><td>A <code>Graphics2D</code> context resource. </td></tr>
-<tr><td class="paramdir">[in]</td><td class="paramname">scale</td><td>The scale to apply when painting.</td></tr>
-</table>
-</dd>
-</dl>
-<dl class="return"><dt><b>Returns:</b></dt><dd>Returns <code>PP_TRUE</code> on success or <code>PP_FALSE</code> if the resource is invalid or the scale factor is 0 or less. </dd></dl>
-</div>
-</div>
-<hr />The documentation for this struct was generated from the following file:<ul>
-<li><a class="el" href="ppb__graphics__2d_8h.html">ppb_graphics_2d.h</a></li>
-</ul>
-</div><!-- contents -->
-</div>
-{{/partials.standard_nacl_api}}
diff --git a/native_client_sdk/doc_generated/pepper_beta/c/struct_p_p_b___graphics2_d__1__1.html b/native_client_sdk/doc_generated/pepper_dev/c/struct_p_p_b___graphics2_d__1__2.html
similarity index 71%
copy from native_client_sdk/doc_generated/pepper_beta/c/struct_p_p_b___graphics2_d__1__1.html
copy to native_client_sdk/doc_generated/pepper_dev/c/struct_p_p_b___graphics2_d__1__2.html
index ec01d7f..010a0b56 100644
--- a/native_client_sdk/doc_generated/pepper_beta/c/struct_p_p_b___graphics2_d__1__1.html
+++ b/native_client_sdk/doc_generated/pepper_dev/c/struct_p_p_b___graphics2_d__1__2.html
@@ -12,30 +12,31 @@
 <!-- doxytag: class="PPB_Graphics2D" --><h2>
 Data Fields</h2><table class="memberdecls">
 
-<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a034e6a3df2bccb119a087874e7cf18ed">Create</a> )(<a class="el" href="group___typedefs.html#ga89b662403e6a687bb914b80114c0d19d">PP_Instance</a> instance, const struct <a class="el" href="struct_p_p___size.html">PP_Size</a> *size, <a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a> is_always_opaque)</td></tr>
-<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a8d634407f71b52367901e8c807f3bb15">IsGraphics2D</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource)</td></tr>
-<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___graphics2_d__1__1.html#ae9aae546a51e35ee85688e0f80907fc3">Describe</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics_2d, struct <a class="el" href="struct_p_p___size.html">PP_Size</a> *size, <a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a> *is_always_opaque)</td></tr>
-<tr><td class="memItemLeft" align="right" valign="top">void(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a912e5704c150c4228ee4ec326e7cb1bb">PaintImageData</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics_2d, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> image_data, const struct <a class="el" href="struct_p_p___point.html">PP_Point</a> *top_left, const struct <a class="el" href="struct_p_p___rect.html">PP_Rect</a> *src_rect)</td></tr>
-<tr><td class="memItemLeft" align="right" valign="top">void(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a2242719819a82b11b0e3f71c4a19f461">Scroll</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics_2d, const struct <a class="el" href="struct_p_p___rect.html">PP_Rect</a> *clip_rect, const struct <a class="el" href="struct_p_p___point.html">PP_Point</a> *amount)</td></tr>
-<tr><td class="memItemLeft" align="right" valign="top">void(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___graphics2_d__1__1.html#ae5cfb7616fe383d9fedee88131f4b9ff">ReplaceContents</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics_2d, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> image_data)</td></tr>
-<tr><td class="memItemLeft" align="right" valign="top">int32_t(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a46607be26d07e4af31b56ef0791022fa">Flush</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics_2d, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr>
-<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___graphics2_d__1__1.html#ad809f5d73448def11577d54147fa268e">SetScale</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource, float scale)</td></tr>
-<tr><td class="memItemLeft" align="right" valign="top">float(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a9e284dc50e55e87c5367e9f081f44045">GetScale</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a10e02f41b41c26bb88398b591f06ff12">Create</a> )(<a class="el" href="group___typedefs.html#ga89b662403e6a687bb914b80114c0d19d">PP_Instance</a> instance, const struct <a class="el" href="struct_p_p___size.html">PP_Size</a> *size, <a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a> is_always_opaque)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___graphics2_d__1__2.html#acae7c38863e9997fc0eee88a54d3d60d">IsGraphics2D</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a49dcb387e7e420bdd1c22344f3f35718">Describe</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics_2d, struct <a class="el" href="struct_p_p___size.html">PP_Size</a> *size, <a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a> *is_always_opaque)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">void(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a20071a446e8d7695c697f81a449597fe">PaintImageData</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics_2d, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> image_data, const struct <a class="el" href="struct_p_p___point.html">PP_Point</a> *top_left, const struct <a class="el" href="struct_p_p___rect.html">PP_Rect</a> *src_rect)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">void(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a3f87a2d280d6d4e6b9a2679787f5de1d">Scroll</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics_2d, const struct <a class="el" href="struct_p_p___rect.html">PP_Rect</a> *clip_rect, const struct <a class="el" href="struct_p_p___point.html">PP_Point</a> *amount)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">void(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a533a03163e1617692885aca78e72905a">ReplaceContents</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics_2d, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> image_data)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">int32_t(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a65dfb539bd057e33977a78537564885e">Flush</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics_2d, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a4b16d1210b49c45edfe477396934238a">SetScale</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource, float scale)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">float(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___graphics2_d__1__2.html#aa2820c6356e60627a175942ddd265753">GetScale</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___graphics2_d__1__2.html#af7d4955738f54da9eda60e5c052bf361">SetLayerTransform</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource, float scale, const struct <a class="el" href="struct_p_p___point.html">PP_Point</a> *origin, const struct <a class="el" href="struct_p_p___point.html">PP_Point</a> *translate)</td></tr>
 </table>
 <hr /><a name="details" id="details"></a><h2>Detailed Description</h2>
 <div class="textblock"><p><code>PPB_Graphics2D</code> defines the interface for a 2D graphics context. </p>
 </div><hr /><h2>Field Documentation</h2>
-<a class="anchor" id="a034e6a3df2bccb119a087874e7cf18ed"></a><!-- doxytag: member="PPB_Graphics2D::Create" ref="a034e6a3df2bccb119a087874e7cf18ed" args=")(PP_Instance instance, const struct PP_Size *size, PP_Bool is_always_opaque)" -->
+<a class="anchor" id="a10e02f41b41c26bb88398b591f06ff12"></a><!-- doxytag: member="PPB_Graphics2D::Create" ref="a10e02f41b41c26bb88398b591f06ff12" args=")(PP_Instance instance, const struct PP_Size *size, PP_Bool is_always_opaque)" -->
 <div class="memitem">
 <div class="memproto">
 <table class="memname">
 <tr>
-<td class="memname"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(* <a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a034e6a3df2bccb119a087874e7cf18ed">PPB_Graphics2D::Create</a>)(<a class="el" href="group___typedefs.html#ga89b662403e6a687bb914b80114c0d19d">PP_Instance</a> instance, const struct <a class="el" href="struct_p_p___size.html">PP_Size</a> *size, <a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a> is_always_opaque)</td>
+<td class="memname"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(* <a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a10e02f41b41c26bb88398b591f06ff12">PPB_Graphics2D::Create</a>)(<a class="el" href="group___typedefs.html#ga89b662403e6a687bb914b80114c0d19d">PP_Instance</a> instance, const struct <a class="el" href="struct_p_p___size.html">PP_Size</a> *size, <a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a> is_always_opaque)</td>
 </tr>
 </table>
 </div>
 <div class="memdoc">
-<p><a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a034e6a3df2bccb119a087874e7cf18ed" title="Create() creates a 2D graphics context.">Create()</a> creates a 2D graphics context. </p>
+<p><a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a10e02f41b41c26bb88398b591f06ff12" title="Create() creates a 2D graphics context.">Create()</a> creates a 2D graphics context. </p>
 <p>The returned graphics context will not be bound to the module instance on creation (call BindGraphics() on the module instance to bind the returned graphics context to the module instance).</p>
 <dl class="params"><dt><b>Parameters:</b></dt><dd>
 <table class="params">
@@ -49,17 +50,17 @@
 <dl class="return"><dt><b>Returns:</b></dt><dd>A <code>PP_Resource</code> containing the 2D graphics context if successful or 0 if unsuccessful. </dd></dl>
 </div>
 </div>
-<a class="anchor" id="ae9aae546a51e35ee85688e0f80907fc3"></a><!-- doxytag: member="PPB_Graphics2D::Describe" ref="ae9aae546a51e35ee85688e0f80907fc3" args=")(PP_Resource graphics_2d, struct PP_Size *size, PP_Bool *is_always_opaque)" -->
+<a class="anchor" id="a49dcb387e7e420bdd1c22344f3f35718"></a><!-- doxytag: member="PPB_Graphics2D::Describe" ref="a49dcb387e7e420bdd1c22344f3f35718" args=")(PP_Resource graphics_2d, struct PP_Size *size, PP_Bool *is_always_opaque)" -->
 <div class="memitem">
 <div class="memproto">
 <table class="memname">
 <tr>
-<td class="memname"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(* <a class="el" href="struct_p_p_b___graphics2_d__1__1.html#ae9aae546a51e35ee85688e0f80907fc3">PPB_Graphics2D::Describe</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics_2d, struct <a class="el" href="struct_p_p___size.html">PP_Size</a> *size, <a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a> *is_always_opaque)</td>
+<td class="memname"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(* <a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a49dcb387e7e420bdd1c22344f3f35718">PPB_Graphics2D::Describe</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics_2d, struct <a class="el" href="struct_p_p___size.html">PP_Size</a> *size, <a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a> *is_always_opaque)</td>
 </tr>
 </table>
 </div>
 <div class="memdoc">
-<p><a class="el" href="struct_p_p_b___graphics2_d__1__1.html#ae9aae546a51e35ee85688e0f80907fc3" title="Describe() retrieves the configuration for the given graphics context, filling the given values (whic...">Describe()</a> retrieves the configuration for the given graphics context, filling the given values (which must not be <code>NULL</code>). </p>
+<p><a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a49dcb387e7e420bdd1c22344f3f35718" title="Describe() retrieves the configuration for the given graphics context, filling the given values (whic...">Describe()</a> retrieves the configuration for the given graphics context, filling the given values (which must not be <code>NULL</code>). </p>
 <dl class="params"><dt><b>Parameters:</b></dt><dd>
 <table class="params">
 <tr><td class="paramdir">[in]</td><td class="paramname">resource</td><td>The 2D Graphics resource. </td></tr>
@@ -71,21 +72,21 @@
 <dl class="return"><dt><b>Returns:</b></dt><dd>Returns <code>PP_TRUE</code> on success or <code>PP_FALSE</code> if the resource is invalid. The output parameters will be set to 0 on a <code>PP_FALSE</code>. </dd></dl>
 </div>
 </div>
-<a class="anchor" id="a46607be26d07e4af31b56ef0791022fa"></a><!-- doxytag: member="PPB_Graphics2D::Flush" ref="a46607be26d07e4af31b56ef0791022fa" args=")(PP_Resource graphics_2d, struct PP_CompletionCallback callback)" -->
+<a class="anchor" id="a65dfb539bd057e33977a78537564885e"></a><!-- doxytag: member="PPB_Graphics2D::Flush" ref="a65dfb539bd057e33977a78537564885e" args=")(PP_Resource graphics_2d, struct PP_CompletionCallback callback)" -->
 <div class="memitem">
 <div class="memproto">
 <table class="memname">
 <tr>
-<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a46607be26d07e4af31b56ef0791022fa">PPB_Graphics2D::Flush</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics_2d, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td>
+<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a65dfb539bd057e33977a78537564885e">PPB_Graphics2D::Flush</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics_2d, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td>
 </tr>
 </table>
 </div>
 <div class="memdoc">
-<p><a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a46607be26d07e4af31b56ef0791022fa" title="Flush() flushes any enqueued paint, scroll, and replace commands to the backing store.">Flush()</a> flushes any enqueued paint, scroll, and replace commands to the backing store. </p>
+<p><a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a65dfb539bd057e33977a78537564885e" title="Flush() flushes any enqueued paint, scroll, and replace commands to the backing store.">Flush()</a> flushes any enqueued paint, scroll, and replace commands to the backing store. </p>
 <p>This function actually executes the updates, and causes a repaint of the webpage, assuming this graphics context is bound to a module instance.</p>
-<p><a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a46607be26d07e4af31b56ef0791022fa" title="Flush() flushes any enqueued paint, scroll, and replace commands to the backing store.">Flush()</a> runs in asynchronous mode. Specify a callback function and the argument for that callback function. The callback function will be executed on the calling thread when the image has been painted to the screen. While you are waiting for a flush callback, additional calls to <a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a46607be26d07e4af31b56ef0791022fa" title="Flush() flushes any enqueued paint, scroll, and replace commands to the backing store.">Flush()</a> will fail.</p>
+<p><a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a65dfb539bd057e33977a78537564885e" title="Flush() flushes any enqueued paint, scroll, and replace commands to the backing store.">Flush()</a> runs in asynchronous mode. Specify a callback function and the argument for that callback function. The callback function will be executed on the calling thread when the image has been painted to the screen. While you are waiting for a flush callback, additional calls to <a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a65dfb539bd057e33977a78537564885e" title="Flush() flushes any enqueued paint, scroll, and replace commands to the backing store.">Flush()</a> will fail.</p>
 <p>Because the callback is executed (or thread unblocked) only when the instance's image is actually on the screen, this function provides a way to rate limit animations. By waiting until the image is on the screen before painting the next frame, you can ensure you're not flushing 2D graphics faster than the screen can be updated.</p>
-<p><b>Unbound contexts</b> If the context is not bound to a module instance, you will still get a callback. The callback will execute after <a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a46607be26d07e4af31b56ef0791022fa" title="Flush() flushes any enqueued paint, scroll, and replace commands to the backing store.">Flush()</a> returns to avoid reentrancy. The callback will not wait until anything is painted to the screen because there will be nothing on the screen. The timing of this callback is not guaranteed and may be deprioritized by the browser because it is not affecting the user experience.</p>
+<p><b>Unbound contexts</b> If the context is not bound to a module instance, you will still get a callback. The callback will execute after <a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a65dfb539bd057e33977a78537564885e" title="Flush() flushes any enqueued paint, scroll, and replace commands to the backing store.">Flush()</a> returns to avoid reentrancy. The callback will not wait until anything is painted to the screen because there will be nothing on the screen. The timing of this callback is not guaranteed and may be deprioritized by the browser because it is not affecting the user experience.</p>
 <p><b>Off-screen instances</b> If the context is bound to an instance that is currently not visible (for example, scrolled out of view) it will behave like the "unbound context" case.</p>
 <p><b>Detaching a context</b> If you detach a context from a module instance, any pending flush callbacks will be converted into the "unbound context" case.</p>
 <p><b>Released contexts</b> A callback may or may not get called even if you have released all of your references to the context. This scenario can occur if there are internal references to the context suggesting it has not been internally destroyed (for example, if it is still bound to an instance) or due to other implementation details. As a result, you should be careful to check that flush callbacks are for the context you expect and that you're capable of handling callbacks for unreferenced contexts.</p>
@@ -100,29 +101,29 @@
 <dl class="return"><dt><b>Returns:</b></dt><dd>Returns <code>PP_OK</code> on success or <code>PP_ERROR_BADRESOURCE</code> if the graphics context is invalid, <code>PP_ERROR_BADARGUMENT</code> if the callback is null and flush is being called from the main thread of the module, or <code>PP_ERROR_INPROGRESS</code> if a flush is already pending that has not issued its callback yet. In the failure case, nothing will be updated and no callback will be scheduled. </dd></dl>
 </div>
 </div>
-<a class="anchor" id="a9e284dc50e55e87c5367e9f081f44045"></a><!-- doxytag: member="PPB_Graphics2D::GetScale" ref="a9e284dc50e55e87c5367e9f081f44045" args=")(PP_Resource resource)" -->
+<a class="anchor" id="aa2820c6356e60627a175942ddd265753"></a><!-- doxytag: member="PPB_Graphics2D::GetScale" ref="aa2820c6356e60627a175942ddd265753" args=")(PP_Resource resource)" -->
 <div class="memitem">
 <div class="memproto">
 <table class="memname">
 <tr>
-<td class="memname">float(* <a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a9e284dc50e55e87c5367e9f081f44045">PPB_Graphics2D::GetScale</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource)</td>
+<td class="memname">float(* <a class="el" href="struct_p_p_b___graphics2_d__1__2.html#aa2820c6356e60627a175942ddd265753">PPB_Graphics2D::GetScale</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource)</td>
 </tr>
 </table>
 </div>
 <div class="memdoc">
 </div>
 </div>
-<a class="anchor" id="a8d634407f71b52367901e8c807f3bb15"></a><!-- doxytag: member="PPB_Graphics2D::IsGraphics2D" ref="a8d634407f71b52367901e8c807f3bb15" args=")(PP_Resource resource)" -->
+<a class="anchor" id="acae7c38863e9997fc0eee88a54d3d60d"></a><!-- doxytag: member="PPB_Graphics2D::IsGraphics2D" ref="acae7c38863e9997fc0eee88a54d3d60d" args=")(PP_Resource resource)" -->
 <div class="memitem">
 <div class="memproto">
 <table class="memname">
 <tr>
-<td class="memname"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(* <a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a8d634407f71b52367901e8c807f3bb15">PPB_Graphics2D::IsGraphics2D</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource)</td>
+<td class="memname"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(* <a class="el" href="struct_p_p_b___graphics2_d__1__2.html#acae7c38863e9997fc0eee88a54d3d60d">PPB_Graphics2D::IsGraphics2D</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource)</td>
 </tr>
 </table>
 </div>
 <div class="memdoc">
-<p><a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a8d634407f71b52367901e8c807f3bb15" title="IsGraphics2D() determines if the given resource is a valid Graphics2D.">IsGraphics2D()</a> determines if the given resource is a valid <code>Graphics2D</code>. </p>
+<p><a class="el" href="struct_p_p_b___graphics2_d__1__2.html#acae7c38863e9997fc0eee88a54d3d60d" title="IsGraphics2D() determines if the given resource is a valid Graphics2D.">IsGraphics2D()</a> determines if the given resource is a valid <code>Graphics2D</code>. </p>
 <dl class="params"><dt><b>Parameters:</b></dt><dd>
 <table class="params">
 <tr><td class="paramdir">[in]</td><td class="paramname">resource</td><td>A <code>Graphics2D</code> context resource.</td></tr>
@@ -132,18 +133,18 @@
 <dl class="return"><dt><b>Returns:</b></dt><dd>PP_TRUE if the given resource is a valid <code>Graphics2D</code>, <code>PP_FALSE</code> if it is an invalid resource or is a resource of another type. </dd></dl>
 </div>
 </div>
-<a class="anchor" id="a912e5704c150c4228ee4ec326e7cb1bb"></a><!-- doxytag: member="PPB_Graphics2D::PaintImageData" ref="a912e5704c150c4228ee4ec326e7cb1bb" args=")(PP_Resource graphics_2d, PP_Resource image_data, const struct PP_Point *top_left, const struct PP_Rect *src_rect)" -->
+<a class="anchor" id="a20071a446e8d7695c697f81a449597fe"></a><!-- doxytag: member="PPB_Graphics2D::PaintImageData" ref="a20071a446e8d7695c697f81a449597fe" args=")(PP_Resource graphics_2d, PP_Resource image_data, const struct PP_Point *top_left, const struct PP_Rect *src_rect)" -->
 <div class="memitem">
 <div class="memproto">
 <table class="memname">
 <tr>
-<td class="memname">void(* <a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a912e5704c150c4228ee4ec326e7cb1bb">PPB_Graphics2D::PaintImageData</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics_2d, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> image_data, const struct <a class="el" href="struct_p_p___point.html">PP_Point</a> *top_left, const struct <a class="el" href="struct_p_p___rect.html">PP_Rect</a> *src_rect)</td>
+<td class="memname">void(* <a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a20071a446e8d7695c697f81a449597fe">PPB_Graphics2D::PaintImageData</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics_2d, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> image_data, const struct <a class="el" href="struct_p_p___point.html">PP_Point</a> *top_left, const struct <a class="el" href="struct_p_p___rect.html">PP_Rect</a> *src_rect)</td>
 </tr>
 </table>
 </div>
 <div class="memdoc">
-<p><a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a912e5704c150c4228ee4ec326e7cb1bb" title="PaintImageData() enqueues a paint of the given image into the context.">PaintImageData()</a> enqueues a paint of the given image into the context. </p>
-<p>This function has no effect until you call <a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a46607be26d07e4af31b56ef0791022fa" title="Flush() flushes any enqueued paint, scroll, and replace commands to the backing store.">Flush()</a> As a result, what counts is the contents of the bitmap when you call <a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a46607be26d07e4af31b56ef0791022fa" title="Flush() flushes any enqueued paint, scroll, and replace commands to the backing store.">Flush()</a>, not when you call this function.</p>
+<p><a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a20071a446e8d7695c697f81a449597fe" title="PaintImageData() enqueues a paint of the given image into the context.">PaintImageData()</a> enqueues a paint of the given image into the context. </p>
+<p>This function has no effect until you call <a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a65dfb539bd057e33977a78537564885e" title="Flush() flushes any enqueued paint, scroll, and replace commands to the backing store.">Flush()</a> As a result, what counts is the contents of the bitmap when you call <a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a65dfb539bd057e33977a78537564885e" title="Flush() flushes any enqueued paint, scroll, and replace commands to the backing store.">Flush()</a>, not when you call this function.</p>
 <p>The provided image will be placed at <code>top_left</code> from the top left of the context's internal backing store. Then the pixels contained in <code>src_rect</code> will be copied into the backing store. This means that the rectangle being painted will be at <code>src_rect</code> offset by <code>top_left</code>.</p>
 <p>The <code>src_rect</code> is specified in the coordinate system of the image being painted, not the context. For the common case of copying the entire image, you may specify an empty <code>src_rect</code>.</p>
 <p>The painted area of the source bitmap must fall entirely within the context. Attempting to paint outside of the context will result in an error. However, the source bitmap may fall outside the context, as long as the <code>src_rect</code> subset of it falls entirely within the context.</p>
@@ -159,21 +160,21 @@
 </dl>
 </div>
 </div>
-<a class="anchor" id="ae5cfb7616fe383d9fedee88131f4b9ff"></a><!-- doxytag: member="PPB_Graphics2D::ReplaceContents" ref="ae5cfb7616fe383d9fedee88131f4b9ff" args=")(PP_Resource graphics_2d, PP_Resource image_data)" -->
+<a class="anchor" id="a533a03163e1617692885aca78e72905a"></a><!-- doxytag: member="PPB_Graphics2D::ReplaceContents" ref="a533a03163e1617692885aca78e72905a" args=")(PP_Resource graphics_2d, PP_Resource image_data)" -->
 <div class="memitem">
 <div class="memproto">
 <table class="memname">
 <tr>
-<td class="memname">void(* <a class="el" href="struct_p_p_b___graphics2_d__1__1.html#ae5cfb7616fe383d9fedee88131f4b9ff">PPB_Graphics2D::ReplaceContents</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics_2d, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> image_data)</td>
+<td class="memname">void(* <a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a533a03163e1617692885aca78e72905a">PPB_Graphics2D::ReplaceContents</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics_2d, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> image_data)</td>
 </tr>
 </table>
 </div>
 <div class="memdoc">
-<p><a class="el" href="struct_p_p_b___graphics2_d__1__1.html#ae5cfb7616fe383d9fedee88131f4b9ff" title="ReplaceContents() provides a slightly more efficient way to paint the entire module's image...">ReplaceContents()</a> provides a slightly more efficient way to paint the entire module's image. </p>
-<p>Normally, calling <a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a912e5704c150c4228ee4ec326e7cb1bb" title="PaintImageData() enqueues a paint of the given image into the context.">PaintImageData()</a> requires that the browser copy the pixels out of the image and into the graphics context's backing store. This function replaces the graphics context's backing store with the given image, avoiding the copy.</p>
+<p><a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a533a03163e1617692885aca78e72905a" title="ReplaceContents() provides a slightly more efficient way to paint the entire module's image...">ReplaceContents()</a> provides a slightly more efficient way to paint the entire module's image. </p>
+<p>Normally, calling <a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a20071a446e8d7695c697f81a449597fe" title="PaintImageData() enqueues a paint of the given image into the context.">PaintImageData()</a> requires that the browser copy the pixels out of the image and into the graphics context's backing store. This function replaces the graphics context's backing store with the given image, avoiding the copy.</p>
 <p>The new image must be the exact same size as this graphics context. If the new image uses a different image format than the browser's native bitmap format (use <code><a class="el" href="struct_p_p_b___image_data__1__0.html#adba78e8f9e623809b6b23419dbce4d65" title="GetNativeImageDataFormat() returns the browser's preferred format for image data.">PPB_ImageData.GetNativeImageDataFormat()</a></code> to retrieve the format), then a conversion will be done inside the browser which may slow the performance a little bit.</p>
-<p><b>Note:</b> The new image will not be painted until you call <a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a46607be26d07e4af31b56ef0791022fa" title="Flush() flushes any enqueued paint, scroll, and replace commands to the backing store.">Flush()</a>.</p>
-<p>After this call, you should take care to release your references to the image. If you paint to the image after <a class="el" href="struct_p_p_b___graphics2_d__1__1.html#ae5cfb7616fe383d9fedee88131f4b9ff" title="ReplaceContents() provides a slightly more efficient way to paint the entire module's image...">ReplaceContents()</a>, there is the possibility of significant painting artifacts because the page might use partially-rendered data when copying out of the backing store.</p>
+<p><b>Note:</b> The new image will not be painted until you call <a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a65dfb539bd057e33977a78537564885e" title="Flush() flushes any enqueued paint, scroll, and replace commands to the backing store.">Flush()</a>.</p>
+<p>After this call, you should take care to release your references to the image. If you paint to the image after <a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a533a03163e1617692885aca78e72905a" title="ReplaceContents() provides a slightly more efficient way to paint the entire module's image...">ReplaceContents()</a>, there is the possibility of significant painting artifacts because the page might use partially-rendered data when copying out of the backing store.</p>
 <p>In the case of an animation, you will want to allocate a new image for the next frame. It is best if you wait until the flush callback has executed before allocating this bitmap. This gives the browser the option of caching the previous backing store and handing it back to you (assuming the sizes match). In the optimal case, this means no bitmaps are allocated during the animation, and the backing store and "front buffer" (which the plugin is painting into) are just being swapped back and forth.</p>
 <dl class="params"><dt><b>Parameters:</b></dt><dd>
 <table class="params">
@@ -184,19 +185,19 @@
 </dl>
 </div>
 </div>
-<a class="anchor" id="a2242719819a82b11b0e3f71c4a19f461"></a><!-- doxytag: member="PPB_Graphics2D::Scroll" ref="a2242719819a82b11b0e3f71c4a19f461" args=")(PP_Resource graphics_2d, const struct PP_Rect *clip_rect, const struct PP_Point *amount)" -->
+<a class="anchor" id="a3f87a2d280d6d4e6b9a2679787f5de1d"></a><!-- doxytag: member="PPB_Graphics2D::Scroll" ref="a3f87a2d280d6d4e6b9a2679787f5de1d" args=")(PP_Resource graphics_2d, const struct PP_Rect *clip_rect, const struct PP_Point *amount)" -->
 <div class="memitem">
 <div class="memproto">
 <table class="memname">
 <tr>
-<td class="memname">void(* <a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a2242719819a82b11b0e3f71c4a19f461">PPB_Graphics2D::Scroll</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics_2d, const struct <a class="el" href="struct_p_p___rect.html">PP_Rect</a> *clip_rect, const struct <a class="el" href="struct_p_p___point.html">PP_Point</a> *amount)</td>
+<td class="memname">void(* <a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a3f87a2d280d6d4e6b9a2679787f5de1d">PPB_Graphics2D::Scroll</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics_2d, const struct <a class="el" href="struct_p_p___rect.html">PP_Rect</a> *clip_rect, const struct <a class="el" href="struct_p_p___point.html">PP_Point</a> *amount)</td>
 </tr>
 </table>
 </div>
 <div class="memdoc">
-<p><a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a2242719819a82b11b0e3f71c4a19f461" title="Scroll() enqueues a scroll of the context's backing store.">Scroll()</a> enqueues a scroll of the context's backing store. </p>
-<p>This function has no effect until you call <a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a46607be26d07e4af31b56ef0791022fa" title="Flush() flushes any enqueued paint, scroll, and replace commands to the backing store.">Flush()</a>. The data within the provided clipping rectangle will be shifted by (dx, dy) pixels.</p>
-<p>This function will result in some exposed region which will have undefined contents. The module should call <a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a912e5704c150c4228ee4ec326e7cb1bb" title="PaintImageData() enqueues a paint of the given image into the context.">PaintImageData()</a> on these exposed regions to give the correct contents.</p>
+<p><a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a3f87a2d280d6d4e6b9a2679787f5de1d" title="Scroll() enqueues a scroll of the context's backing store.">Scroll()</a> enqueues a scroll of the context's backing store. </p>
+<p>This function has no effect until you call <a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a65dfb539bd057e33977a78537564885e" title="Flush() flushes any enqueued paint, scroll, and replace commands to the backing store.">Flush()</a>. The data within the provided clipping rectangle will be shifted by (dx, dy) pixels.</p>
+<p>This function will result in some exposed region which will have undefined contents. The module should call <a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a20071a446e8d7695c697f81a449597fe" title="PaintImageData() enqueues a paint of the given image into the context.">PaintImageData()</a> on these exposed regions to give the correct contents.</p>
 <p>The scroll can be larger than the area of the clipping rectangle, which means the current image will be scrolled out of the rectangle. This scenario is not an error but will result in a no-op.</p>
 <dl class="params"><dt><b>Parameters:</b></dt><dd>
 <table class="params">
@@ -208,17 +209,41 @@
 </dl>
 </div>
 </div>
-<a class="anchor" id="ad809f5d73448def11577d54147fa268e"></a><!-- doxytag: member="PPB_Graphics2D::SetScale" ref="ad809f5d73448def11577d54147fa268e" args=")(PP_Resource resource, float scale)" -->
+<a class="anchor" id="af7d4955738f54da9eda60e5c052bf361"></a><!-- doxytag: member="PPB_Graphics2D::SetLayerTransform" ref="af7d4955738f54da9eda60e5c052bf361" args=")(PP_Resource resource, float scale, const struct PP_Point *origin, const struct PP_Point *translate)" -->
 <div class="memitem">
 <div class="memproto">
 <table class="memname">
 <tr>
-<td class="memname"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(* <a class="el" href="struct_p_p_b___graphics2_d__1__1.html#ad809f5d73448def11577d54147fa268e">PPB_Graphics2D::SetScale</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource, float scale)</td>
+<td class="memname"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(* <a class="el" href="struct_p_p_b___graphics2_d__1__2.html#af7d4955738f54da9eda60e5c052bf361">PPB_Graphics2D::SetLayerTransform</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource, float scale, const struct <a class="el" href="struct_p_p___point.html">PP_Point</a> *origin, const struct <a class="el" href="struct_p_p___point.html">PP_Point</a> *translate)</td>
 </tr>
 </table>
 </div>
 <div class="memdoc">
-<p><a class="el" href="struct_p_p_b___graphics2_d__1__1.html#ad809f5d73448def11577d54147fa268e" title="SetScale() sets the scale factor that will be applied when painting the graphics context onto the out...">SetScale()</a> sets the scale factor that will be applied when painting the graphics context onto the output device. </p>
+<p><a class="el" href="struct_p_p_b___graphics2_d__1__2.html#af7d4955738f54da9eda60e5c052bf361" title="SetLayerTransform() sets a transformation factor that will be applied for the current graphics contex...">SetLayerTransform()</a> sets a transformation factor that will be applied for the current graphics context displayed on the output device. </p>
+<p>If both SetScale and SetLayerTransform will be used, they are going to get combined for the final result.</p>
+<p>This function has no effect until you call <a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a65dfb539bd057e33977a78537564885e" title="Flush() flushes any enqueued paint, scroll, and replace commands to the backing store.">Flush()</a>.</p>
+<dl class="params"><dt><b>Parameters:</b></dt><dd>
+<table class="params">
+<tr><td class="paramdir">[in]</td><td class="paramname">scale</td><td>The scale to be applied. </td></tr>
+<tr><td class="paramdir">[in]</td><td class="paramname">origin</td><td>The origin of the scale. </td></tr>
+<tr><td class="paramdir">[in]</td><td class="paramname">translate</td><td>The translation to be applied.</td></tr>
+</table>
+</dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>Returns <code>PP_TRUE</code> on success or <code>PP_FALSE</code> if the resource is invalid or the scale factor is 0 or less. </dd></dl>
+</div>
+</div>
+<a class="anchor" id="a4b16d1210b49c45edfe477396934238a"></a><!-- doxytag: member="PPB_Graphics2D::SetScale" ref="a4b16d1210b49c45edfe477396934238a" args=")(PP_Resource resource, float scale)" -->
+<div class="memitem">
+<div class="memproto">
+<table class="memname">
+<tr>
+<td class="memname"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(* <a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a4b16d1210b49c45edfe477396934238a">PPB_Graphics2D::SetScale</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource, float scale)</td>
+</tr>
+</table>
+</div>
+<div class="memdoc">
+<p><a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a4b16d1210b49c45edfe477396934238a" title="SetScale() sets the scale factor that will be applied when painting the graphics context onto the out...">SetScale()</a> sets the scale factor that will be applied when painting the graphics context onto the output device. </p>
 <p>Typically, if rendering at device resolution is desired, the context would be created with the width and height scaled up by the view's GetDeviceScale and SetScale called with a scale of 1.0 / GetDeviceScale(). For example, if the view resource passed to DidChangeView has a rectangle of (w=200, h=100) and a device scale of 2.0, one would call Create with a size of (w=400, h=200) and then call SetScale with 0.5. One would then treat each pixel in the context as a single device pixel.</p>
 <dl class="params"><dt><b>Parameters:</b></dt><dd>
 <table class="params">
diff --git a/native_client_sdk/doc_generated/pepper_dev/c/struct_p_p_b___vpn_provider__0__1.html b/native_client_sdk/doc_generated/pepper_dev/c/struct_p_p_b___vpn_provider__0__1.html
new file mode 100644
index 0000000..ce4e7f5
--- /dev/null
+++ b/native_client_sdk/doc_generated/pepper_dev/c/struct_p_p_b___vpn_provider__0__1.html
@@ -0,0 +1,152 @@
+{{+bindTo:partials.standard_nacl_api}}
+<h1>PPB_VpnProvider Struct Reference</h1>
+<div id="doxygen-ref">
+{{- dummy div to appease doxygen -}}
+  <div>
+<!-- Generated by Doxygen 1.7.6.1 -->
+
+
+</div>
+<!--header-->
+<div class="contents">
+<!-- doxytag: class="PPB_VpnProvider" --><h2>
+Data Fields</h2><table class="memberdecls">
+
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___vpn_provider__0__1.html#a2ec07eb1aaf01c4e7050c198e96a8f76">Create</a> )(<a class="el" href="group___typedefs.html#ga89b662403e6a687bb914b80114c0d19d">PP_Instance</a> instance)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___vpn_provider__0__1.html#a55919d9d06bd5ecd2c8365b872e1db9f">IsVpnProvider</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">int32_t(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___vpn_provider__0__1.html#a7b925b10a83d769e6d80d22fcace7833">Bind</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> vpn_provider, struct <a class="el" href="struct_p_p___var.html">PP_Var</a> configuration_id, struct <a class="el" href="struct_p_p___var.html">PP_Var</a> configuration_name, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">int32_t(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___vpn_provider__0__1.html#a43d8ddc1da63d7ee94c26721599c34db">SendPacket</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> vpn_provider, struct <a class="el" href="struct_p_p___var.html">PP_Var</a> packet, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">int32_t(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___vpn_provider__0__1.html#a767149d43eb103ad379dddcb04d1ca22">ReceivePacket</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> vpn_provider, struct <a class="el" href="struct_p_p___var.html">PP_Var</a> *packet, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr>
+</table>
+<hr /><a name="details" id="details"></a><h2>Detailed Description</h2>
+<div class="textblock"><p>Use the <code>PPB_VpnProvider</code> interface to implement a VPN client. </p>
+<p>Important: This API is available only on Chrome OS.</p>
+<p>This interface enhances the <code>chrome.vpnProvider</code> JavaScript API by providing a high performance path for packet handling.</p>
+<p>Permissions: Apps permission <code>vpnProvider</code> is required for <code>PPB_VpnProvider.Bind()</code>.</p>
+<p>Typical usage:</p>
+<ul>
+<li>Create a <code>PPB_VpnProvider</code> instance.</li>
+<li>Register the callback for <code>PPB_VpnProvider.ReceivePacket()</code>.</li>
+<li>In the extension follow the usual workflow for configuring a VPN connection via the <code>chrome.vpnProvider</code> API until the step for notifying the connection state as "connected".</li>
+<li>Bind to the previously created connection using <code>PPB_VpnProvider.Bind()</code>.</li>
+<li>Notify the connection state as "connected" from JavaScript using <code>chrome.vpnProvider.notifyConnectionStateChanged</code>.</li>
+<li>When the steps above are completed without errors, a virtual tunnel is created to the network stack of Chrome OS. IP packets can be sent through the tunnel using <code>PPB_VpnProvider.SendPacket()</code> and any packets originating on the Chrome OS device will be received using the callback registered for <code>PPB_VpnProvider.ReceivePacket()</code>.</li>
+<li>When the user disconnects from the VPN configuration or there is an error the extension will be notfied via <code>chrome.vpnProvider.onPlatformMessage</code>. </li>
+</ul>
+</div><hr /><h2>Field Documentation</h2>
+<a class="anchor" id="a7b925b10a83d769e6d80d22fcace7833"></a><!-- doxytag: member="PPB_VpnProvider::Bind" ref="a7b925b10a83d769e6d80d22fcace7833" args=")(PP_Resource vpn_provider, struct PP_Var configuration_id, struct PP_Var configuration_name, struct PP_CompletionCallback callback)" -->
+<div class="memitem">
+<div class="memproto">
+<table class="memname">
+<tr>
+<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___vpn_provider__0__1.html#a7b925b10a83d769e6d80d22fcace7833">PPB_VpnProvider::Bind</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> vpn_provider, struct <a class="el" href="struct_p_p___var.html">PP_Var</a> configuration_id, struct <a class="el" href="struct_p_p___var.html">PP_Var</a> configuration_name, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td>
+</tr>
+</table>
+</div>
+<div class="memdoc">
+<p><a class="el" href="struct_p_p_b___vpn_provider__0__1.html#a7b925b10a83d769e6d80d22fcace7833" title="Bind() binds to an existing configuration created from JavaScript by chrome.vpnProvider.createConfig.">Bind()</a> binds to an existing configuration created from JavaScript by <code>chrome.vpnProvider.createConfig</code>. </p>
+<p>All packets will be routed via <code>SendPacket</code> and <code>ReceivePacket</code>. The user should register the callback for <code>ReceivePacket</code> before calling <code><a class="el" href="struct_p_p_b___vpn_provider__0__1.html#a7b925b10a83d769e6d80d22fcace7833" title="Bind() binds to an existing configuration created from JavaScript by chrome.vpnProvider.createConfig.">Bind()</a></code>.</p>
+<dl class="params"><dt><b>Parameters:</b></dt><dd>
+<table class="params">
+<tr><td class="paramdir">[in]</td><td class="paramname">vpn_provider</td><td>A <code>PP_Resource</code> corresponding to a VpnProvider.</td></tr>
+<tr><td class="paramdir">[in]</td><td class="paramname">configuration_id</td><td>A <code>PP_VARTYPE_STRING</code> representing the configuration id from the callback of <code>chrome.vpnProvider.createConfig</code>.</td></tr>
+<tr><td class="paramdir">[in]</td><td class="paramname">configuration_name</td><td>A <code>PP_VARTYPE_STRING</code> representing the configuration name as defined by the user when calling <code>chrome.vpnProvider.createConfig</code>.</td></tr>
+<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="struct_p_p___completion_callback.html" title="PP_CompletionCallback is a common mechanism for supporting potentially asynchronous calls in browser ...">PP_CompletionCallback</a></code> called on completion.</td></tr>
+</table>
+</dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. Returns <code>PP_ERROR_INPROGRESS</code> if a previous call to <code><a class="el" href="struct_p_p_b___vpn_provider__0__1.html#a7b925b10a83d769e6d80d22fcace7833" title="Bind() binds to an existing configuration created from JavaScript by chrome.vpnProvider.createConfig.">Bind()</a></code> has not completed. Returns <code>PP_ERROR_BADARGUMENT</code> if either <code>configuration_id</code> or <code>configuration_name</code> are not of type <code>PP_VARTYPE_STRING</code>. Returns <code>PP_ERROR_NOACCESS</code> if the caller does the have the required "vpnProvider" permission. Returns <code>PP_ERROR_FAILED</code> if <code>connection_id</code> and <code>connection_name</code> could not be matched with the existing connection, or if the plugin originates from a different extension than the one that created the connection. </dd></dl>
+</div>
+</div>
+<a class="anchor" id="a2ec07eb1aaf01c4e7050c198e96a8f76"></a><!-- doxytag: member="PPB_VpnProvider::Create" ref="a2ec07eb1aaf01c4e7050c198e96a8f76" args=")(PP_Instance instance)" -->
+<div class="memitem">
+<div class="memproto">
+<table class="memname">
+<tr>
+<td class="memname"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(* <a class="el" href="struct_p_p_b___vpn_provider__0__1.html#a2ec07eb1aaf01c4e7050c198e96a8f76">PPB_VpnProvider::Create</a>)(<a class="el" href="group___typedefs.html#ga89b662403e6a687bb914b80114c0d19d">PP_Instance</a> instance)</td>
+</tr>
+</table>
+</div>
+<div class="memdoc">
+<p><a class="el" href="struct_p_p_b___vpn_provider__0__1.html#a2ec07eb1aaf01c4e7050c198e96a8f76" title="Create() creates a VpnProvider instance.">Create()</a> creates a VpnProvider instance. </p>
+<dl class="params"><dt><b>Parameters:</b></dt><dd>
+<table class="params">
+<tr><td class="paramdir">[in]</td><td class="paramname">instance</td><td>A <code>PP_Instance</code> identifying the instance with the VpnProvider.</td></tr>
+</table>
+</dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>A <code>PP_Resource</code> corresponding to a VpnProvider if successful. </dd></dl>
+</div>
+</div>
+<a class="anchor" id="a55919d9d06bd5ecd2c8365b872e1db9f"></a><!-- doxytag: member="PPB_VpnProvider::IsVpnProvider" ref="a55919d9d06bd5ecd2c8365b872e1db9f" args=")(PP_Resource resource)" -->
+<div class="memitem">
+<div class="memproto">
+<table class="memname">
+<tr>
+<td class="memname"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(* <a class="el" href="struct_p_p_b___vpn_provider__0__1.html#a55919d9d06bd5ecd2c8365b872e1db9f">PPB_VpnProvider::IsVpnProvider</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource)</td>
+</tr>
+</table>
+</div>
+<div class="memdoc">
+<p><a class="el" href="struct_p_p_b___vpn_provider__0__1.html#a55919d9d06bd5ecd2c8365b872e1db9f" title="IsVpnProvider() determines if the provided resource is a VpnProvider instance.">IsVpnProvider()</a> determines if the provided <code>resource</code> is a VpnProvider instance. </p>
+<dl class="params"><dt><b>Parameters:</b></dt><dd>
+<table class="params">
+<tr><td class="paramdir">[in]</td><td class="paramname">resource</td><td>A <code>PP_Resource</code> corresponding to a VpnProvider.</td></tr>
+</table>
+</dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>Returns <code>PP_TRUE</code> if <code>resource</code> is a <code>PPB_VpnProvider</code>, <code>PP_FALSE</code> if the <code>resource</code> is invalid or some type other than <code>PPB_VpnProvider</code>. </dd></dl>
+</div>
+</div>
+<a class="anchor" id="a767149d43eb103ad379dddcb04d1ca22"></a><!-- doxytag: member="PPB_VpnProvider::ReceivePacket" ref="a767149d43eb103ad379dddcb04d1ca22" args=")(PP_Resource vpn_provider, struct PP_Var *packet, struct PP_CompletionCallback callback)" -->
+<div class="memitem">
+<div class="memproto">
+<table class="memname">
+<tr>
+<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___vpn_provider__0__1.html#a767149d43eb103ad379dddcb04d1ca22">PPB_VpnProvider::ReceivePacket</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> vpn_provider, struct <a class="el" href="struct_p_p___var.html">PP_Var</a> *packet, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td>
+</tr>
+</table>
+</div>
+<div class="memdoc">
+<p><a class="el" href="struct_p_p_b___vpn_provider__0__1.html#a767149d43eb103ad379dddcb04d1ca22" title="ReceivePacket() receives an IP packet from the tunnel for the VPN session.">ReceivePacket()</a> receives an IP packet from the tunnel for the VPN session. </p>
+<p>This function only returns a single packet. This function must be called at least N times to receive N packets, no matter the size of each packet. The callback should be registered before calling <code><a class="el" href="struct_p_p_b___vpn_provider__0__1.html#a7b925b10a83d769e6d80d22fcace7833" title="Bind() binds to an existing configuration created from JavaScript by chrome.vpnProvider.createConfig.">Bind()</a></code>.</p>
+<dl class="params"><dt><b>Parameters:</b></dt><dd>
+<table class="params">
+<tr><td class="paramdir">[in]</td><td class="paramname">vpn_provider</td><td>A <code>PP_Resource</code> corresponding to a VpnProvider.</td></tr>
+<tr><td class="paramdir">[out]</td><td class="paramname">packet</td><td>The received packet is copied to provided <code>packet</code>. The <code>packet</code> must remain valid until <a class="el" href="struct_p_p_b___vpn_provider__0__1.html#a767149d43eb103ad379dddcb04d1ca22" title="ReceivePacket() receives an IP packet from the tunnel for the VPN session.">ReceivePacket()</a> completes. Its received <code>PP_VarType</code> will be <code>PP_VARTYPE_ARRAY_BUFFER</code>.</td></tr>
+<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="struct_p_p___completion_callback.html" title="PP_CompletionCallback is a common mechanism for supporting potentially asynchronous calls in browser ...">PP_CompletionCallback</a></code> called on completion.</td></tr>
+</table>
+</dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. Returns <code>PP_ERROR_INPROGRESS</code> if a previous call to <code><a class="el" href="struct_p_p_b___vpn_provider__0__1.html#a767149d43eb103ad379dddcb04d1ca22" title="ReceivePacket() receives an IP packet from the tunnel for the VPN session.">ReceivePacket()</a></code> has not completed. </dd></dl>
+</div>
+</div>
+<a class="anchor" id="a43d8ddc1da63d7ee94c26721599c34db"></a><!-- doxytag: member="PPB_VpnProvider::SendPacket" ref="a43d8ddc1da63d7ee94c26721599c34db" args=")(PP_Resource vpn_provider, struct PP_Var packet, struct PP_CompletionCallback callback)" -->
+<div class="memitem">
+<div class="memproto">
+<table class="memname">
+<tr>
+<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___vpn_provider__0__1.html#a43d8ddc1da63d7ee94c26721599c34db">PPB_VpnProvider::SendPacket</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> vpn_provider, struct <a class="el" href="struct_p_p___var.html">PP_Var</a> packet, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td>
+</tr>
+</table>
+</div>
+<div class="memdoc">
+<p><a class="el" href="struct_p_p_b___vpn_provider__0__1.html#a43d8ddc1da63d7ee94c26721599c34db" title="SendPacket() sends an IP packet through the tunnel created for the VPN session.">SendPacket()</a> sends an IP packet through the tunnel created for the VPN session. </p>
+<p>This will succeed only when the VPN session is owned by the module and the connection is bound.</p>
+<dl class="params"><dt><b>Parameters:</b></dt><dd>
+<table class="params">
+<tr><td class="paramdir">[in]</td><td class="paramname">vpn_provider</td><td>A <code>PP_Resource</code> corresponding to a VpnProvider.</td></tr>
+<tr><td class="paramdir">[in]</td><td class="paramname">packet</td><td>A <code>PP_VARTYPE_ARRAY_BUFFER</code> corresponding to an IP packet to be sent to the platform.</td></tr>
+<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="struct_p_p___completion_callback.html" title="PP_CompletionCallback is a common mechanism for supporting potentially asynchronous calls in browser ...">PP_CompletionCallback</a></code> called on completion.</td></tr>
+</table>
+</dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. Returns <code>PP_ERROR_FAILED</code> if the connection is not bound. Returns <code>PP_ERROR_INPROGRESS</code> if a previous call to <code><a class="el" href="struct_p_p_b___vpn_provider__0__1.html#a43d8ddc1da63d7ee94c26721599c34db" title="SendPacket() sends an IP packet through the tunnel created for the VPN session.">SendPacket()</a></code> has not completed. Returns <code>PP_ERROR_BADARGUMENT</code> if <code>packet</code> is not of type <code>PP_VARTYPE_ARRAY_BUFFER</code>. </dd></dl>
+</div>
+</div>
+<hr />The documentation for this struct was generated from the following file:<ul>
+<li><a class="el" href="ppb__vpn__provider_8h.html">ppb_vpn_provider.h</a></li>
+</ul>
+</div><!-- contents -->
+</div>
+{{/partials.standard_nacl_api}}
diff --git a/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_graphics2_d-members.html b/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_graphics2_d-members.html
index 3478097e..cc23614 100644
--- a/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_graphics2_d-members.html
+++ b/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_graphics2_d-members.html
@@ -31,6 +31,7 @@
 <tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a555de93fdf4793f7db1183bf71d20580">Resource</a>(PP_Resource resource)</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [explicit, protected]</code></td></tr>
 <tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a907d3d6b7e292587c8cb9ff30d0a418d">Resource</a>(PassRef, PP_Resource resource)</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [protected]</code></td></tr>
 <tr class="memlist"><td><a class="el" href="classpp_1_1_graphics2_d.html#a6a4256bb84cab71909821699d7aea369">Scroll</a>(const Rect &amp;clip, const Point &amp;amount)</td><td><a class="el" href="classpp_1_1_graphics2_d.html">pp::Graphics2D</a></td><td></td></tr>
+<tr class="memlist"><td><a class="el" href="classpp_1_1_graphics2_d.html#a3babd6bb9c922a650b3c7c57d1e36d8c">SetLayerTransform</a>(float scale, const Point &amp;origin, const Point &amp;translate)</td><td><a class="el" href="classpp_1_1_graphics2_d.html">pp::Graphics2D</a></td><td></td></tr>
 <tr class="memlist"><td><a class="el" href="classpp_1_1_graphics2_d.html#a96a91958227a7e42a829033241fac6b1">SetScale</a>(float scale)</td><td><a class="el" href="classpp_1_1_graphics2_d.html">pp::Graphics2D</a></td><td></td></tr>
 <tr class="memlist"><td><a class="el" href="classpp_1_1_graphics2_d.html#ad623f80db2c0cc679619303a0c0b9eff">size</a>() const </td><td><a class="el" href="classpp_1_1_graphics2_d.html">pp::Graphics2D</a></td><td><code> [inline]</code></td></tr>
 <tr class="memlist"><td><a class="el" href="classpp_1_1_graphics2_d.html#aa40a889094d345add38f16d559ae0ebd">~Graphics2D</a>()</td><td><a class="el" href="classpp_1_1_graphics2_d.html">pp::Graphics2D</a></td><td><code> [virtual]</code></td></tr>
diff --git a/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_graphics2_d.html b/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_graphics2_d.html
index add8e599..c8b6d8a 100644
--- a/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_graphics2_d.html
+++ b/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_graphics2_d.html
@@ -34,6 +34,7 @@
 <tr><td class="memItemLeft" align="right" valign="top">int32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_graphics2_d.html#a3c1e23ad48ad62860a125d471b7664a4">Flush</a> (const <a class="el" href="classpp_1_1_completion_callback.html">CompletionCallback</a> &amp;cc)</td></tr>
 <tr><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_graphics2_d.html#a96a91958227a7e42a829033241fac6b1">SetScale</a> (float scale)</td></tr>
 <tr><td class="memItemLeft" align="right" valign="top">float&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_graphics2_d.html#a5b927eaabdd78b1a0094aa1a3695bae2">GetScale</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_graphics2_d.html#a3babd6bb9c922a650b3c7c57d1e36d8c">SetLayerTransform</a> (float scale, const <a class="el" href="classpp_1_1_point.html">Point</a> &amp;origin, const <a class="el" href="classpp_1_1_point.html">Point</a> &amp;translate)</td></tr>
 </table>
 <hr /><h2>Constructor &amp; Destructor Documentation</h2>
 <a class="anchor" id="aef2cf8f0798d4980309f9bc888a73463"></a><!-- doxytag: member="pp::Graphics2D::Graphics2D" ref="aef2cf8f0798d4980309f9bc888a73463" args="()" -->
@@ -359,6 +360,38 @@
 </dl>
 </div>
 </div>
+<a class="anchor" id="a3babd6bb9c922a650b3c7c57d1e36d8c"></a><!-- doxytag: member="pp::Graphics2D::SetLayerTransform" ref="a3babd6bb9c922a650b3c7c57d1e36d8c" args="(float scale, const Point &amp;origin, const Point &amp;translate)" -->
+<div class="memitem">
+<div class="memproto">
+<table class="memname">
+<tr>
+<td class="memname">bool <a class="el" href="classpp_1_1_graphics2_d.html#a3babd6bb9c922a650b3c7c57d1e36d8c">pp::Graphics2D::SetLayerTransform</a> </td>
+<td>(</td>
+<td class="paramtype">float&#160;</td>
+<td class="paramname"><em>scale</em>, </td>
+</tr>
+<tr>
+<td class="paramkey"></td>
+<td></td>
+<td class="paramtype">const <a class="el" href="classpp_1_1_point.html">Point</a> &amp;&#160;</td>
+<td class="paramname"><em>origin</em>, </td>
+</tr>
+<tr>
+<td class="paramkey"></td>
+<td></td>
+<td class="paramtype">const <a class="el" href="classpp_1_1_point.html">Point</a> &amp;&#160;</td>
+<td class="paramname"><em>translate</em>&#160;</td>
+</tr>
+<tr>
+<td></td>
+<td>)</td>
+<td></td><td></td>
+</tr>
+</table>
+</div>
+<div class="memdoc">
+</div>
+</div>
 <a class="anchor" id="a96a91958227a7e42a829033241fac6b1"></a><!-- doxytag: member="pp::Graphics2D::SetScale" ref="a96a91958227a7e42a829033241fac6b1" args="(float scale)" -->
 <div class="memitem">
 <div class="memproto">
diff --git a/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_resource.html b/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_resource.html
index 9e77949..5811e35f 100644
--- a/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_resource.html
+++ b/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_resource.html
@@ -15,7 +15,7 @@
 <div class="dyncontent">
 <div class="center"><img src="classpp_1_1_resource__inherit__graph.png" border="0" usemap="#pp_1_1_resource_inherit__map" alt="Inheritance graph" /></div>
 <map name="pp_1_1_resource_inherit__map" id="pp_1_1_resource_inherit__map">
-<area shape="rect" id="node2" href="classpp_1_1_audio.html" title="An audio resource." alt="" coords="216,5,299,32"></area><area shape="rect" id="node3" href="classpp_1_1_audio_buffer.html" title="pp::AudioBuffer" alt="" coords="197,56,317,83"></area><area shape="rect" id="node4" href="classpp_1_1_audio_config.html" title="A 16 bit stereo AudioConfig resource." alt="" coords="196,107,319,133"></area><area shape="rect" id="node5" href="classpp_1_1_audio_encoder.html" title="Audio encoder interface." alt="" coords="190,157,325,184"></area><area shape="rect" id="node6" href="classpp_1_1_compositor.html" title="The Compositor interface is used for setting CompositorLayer layers to the Chromium compositor for co..." alt="" coords="197,208,317,235"></area><area shape="rect" id="node7" href="classpp_1_1_compositor_layer.html" title="pp::CompositorLayer" alt="" coords="180,259,335,285"></area><area shape="rect" id="node8" href="classpp_1_1_file_i_o.html" title="The FileIO class represents a regular file." alt="" coords="218,309,297,336"></area><area shape="rect" id="node9" href="classpp_1_1_file_ref.html" title='The FileRef class represents a "weak pointer" to a file in a file system.' alt="" coords="215,360,300,387"></area><area shape="rect" id="node10" href="classpp_1_1_file_system.html" title="The FileSystem class identifies the file system type associated with a file." alt="" coords="200,411,315,437"></area><area shape="rect" id="node11" href="classpp_1_1_graphics2_d.html" title="pp::Graphics2D" alt="" coords="197,461,317,488"></area><area shape="rect" id="node12" href="classpp_1_1_graphics3_d.html" title="This class represents a 3D rendering context in the browser." alt="" coords="197,512,317,539"></area><area shape="rect" id="node13" href="classpp_1_1_host_resolver.html" title="The HostResolver class supports host name resolution." alt="" coords="193,563,322,589"></area><area shape="rect" id="node14" href="classpp_1_1_image_data.html" title="pp::ImageData" alt="" coords="199,613,316,640"></area><area shape="rect" id="node15" href="classpp_1_1_input_event.html" title="This class represents an input event resource." alt="" coords="200,664,315,691"></area><area shape="rect" id="node21" href="classpp_1_1_media_stream_audio_track.html" title="The MediaStreamAudioTrack class contains methods for receiving audio buffers from a MediaStream audio..." alt="" coords="157,715,357,741"></area><area shape="rect" id="node22" href="classpp_1_1_media_stream_video_track.html" title="The MediaStreamVideoTrack class contains methods for receiving video frames from a MediaStream video ..." alt="" coords="157,765,357,792"></area><area shape="rect" id="node23" href="classpp_1_1_message_loop.html" title="A message loop allows PPAPI calls to be issued on a thread." alt="" coords="190,816,325,843"></area><area shape="rect" id="node24" href="classpp_1_1_net_address.html" title="The NetAddress class represents a network address." alt="" coords="197,867,318,893"></area><area shape="rect" id="node25" href="classpp_1_1_network_list.html" title="pp::NetworkList" alt="" coords="197,917,317,944"></area><area shape="rect" id="node26" href="classpp_1_1_network_monitor.html" title="pp::NetworkMonitor" alt="" coords="184,968,331,995"></area><area shape="rect" id="node27" href="classpp_1_1_t_c_p_socket.html" title="The TCPSocket class provides TCP socket operations." alt="" coords="201,1019,314,1045"></area><area shape="rect" id="node28" href="classpp_1_1_u_d_p_socket.html" title="The UDPSocket class provides UDP socket operations." alt="" coords="198,1069,317,1096"></area><area shape="rect" id="node29" href="classpp_1_1_u_r_l_loader.html" title="URLLoader provides an API for loading URLs." alt="" coords="200,1120,315,1147"></area><area shape="rect" id="node30" href="classpp_1_1_u_r_l_request_info.html" title="URLRequestInfo provides an API for creating and manipulating URL requests." alt="" coords="185,1171,330,1197"></area><area shape="rect" id="node31" href="classpp_1_1_u_r_l_response_info.html" title="URLResponseInfo provides an API for examining URL responses." alt="" coords="180,1221,335,1248"></area><area shape="rect" id="node32" href="classpp_1_1_video_decoder.html" title="Video decoder interface." alt="" coords="189,1272,325,1299"></area><area shape="rect" id="node33" href="classpp_1_1_video_encoder.html" title="Video encoder interface." alt="" coords="190,1323,325,1349"></area><area shape="rect" id="node34" href="classpp_1_1_video_frame.html" title="pp::VideoFrame" alt="" coords="196,1373,319,1400"></area><area shape="rect" id="node35" href="classpp_1_1_view.html" title="This class represents the state of the view for an instance and contains functions for retrieving the..." alt="" coords="220,1424,295,1451"></area><area shape="rect" id="node36" href="classpp_1_1_web_socket.html" title="The WebSocket class providing bi-directional, full-duplex, communications over a single TCP socket..." alt="" coords="199,1475,315,1501"></area><area shape="rect" id="node16" href="classpp_1_1_i_m_e_input_event.html" title="pp::IMEInputEvent" alt="" coords="424,563,560,589"></area><area shape="rect" id="node17" href="classpp_1_1_keyboard_input_event.html" title="pp::KeyboardInputEvent" alt="" coords="405,613,579,640"></area><area shape="rect" id="node18" href="classpp_1_1_mouse_input_event.html" title="This class handles mouse events." alt="" coords="414,664,570,691"></area><area shape="rect" id="node19" href="classpp_1_1_touch_input_event.html" title="pp::TouchInputEvent" alt="" coords="417,715,567,741"></area><area shape="rect" id="node20" href="classpp_1_1_wheel_input_event.html" title="pp::WheelInputEvent" alt="" coords="416,765,568,792"></area></map>
+<area shape="rect" id="node2" href="classpp_1_1_audio.html" title="An audio resource." alt="" coords="216,5,299,32"></area><area shape="rect" id="node3" href="classpp_1_1_audio_buffer.html" title="pp::AudioBuffer" alt="" coords="197,56,317,83"></area><area shape="rect" id="node4" href="classpp_1_1_audio_config.html" title="A 16 bit stereo AudioConfig resource." alt="" coords="196,107,319,133"></area><area shape="rect" id="node5" href="classpp_1_1_audio_encoder.html" title="Audio encoder interface." alt="" coords="190,157,325,184"></area><area shape="rect" id="node6" href="classpp_1_1_compositor.html" title="The Compositor interface is used for setting CompositorLayer layers to the Chromium compositor for co..." alt="" coords="197,208,317,235"></area><area shape="rect" id="node7" href="classpp_1_1_compositor_layer.html" title="pp::CompositorLayer" alt="" coords="180,259,335,285"></area><area shape="rect" id="node8" href="classpp_1_1_file_i_o.html" title="The FileIO class represents a regular file." alt="" coords="218,309,297,336"></area><area shape="rect" id="node9" href="classpp_1_1_file_ref.html" title='The FileRef class represents a "weak pointer" to a file in a file system.' alt="" coords="215,360,300,387"></area><area shape="rect" id="node10" href="classpp_1_1_file_system.html" title="The FileSystem class identifies the file system type associated with a file." alt="" coords="200,411,315,437"></area><area shape="rect" id="node11" href="classpp_1_1_graphics2_d.html" title="pp::Graphics2D" alt="" coords="197,461,317,488"></area><area shape="rect" id="node12" href="classpp_1_1_graphics3_d.html" title="This class represents a 3D rendering context in the browser." alt="" coords="197,512,317,539"></area><area shape="rect" id="node13" href="classpp_1_1_host_resolver.html" title="The HostResolver class supports host name resolution." alt="" coords="193,563,322,589"></area><area shape="rect" id="node14" href="classpp_1_1_image_data.html" title="pp::ImageData" alt="" coords="199,613,316,640"></area><area shape="rect" id="node15" href="classpp_1_1_input_event.html" title="This class represents an input event resource." alt="" coords="200,664,315,691"></area><area shape="rect" id="node21" href="classpp_1_1_media_stream_audio_track.html" title="The MediaStreamAudioTrack class contains methods for receiving audio buffers from a MediaStream audio..." alt="" coords="157,715,357,741"></area><area shape="rect" id="node22" href="classpp_1_1_media_stream_video_track.html" title="The MediaStreamVideoTrack class contains methods for receiving video frames from a MediaStream video ..." alt="" coords="157,765,357,792"></area><area shape="rect" id="node23" href="classpp_1_1_message_loop.html" title="A message loop allows PPAPI calls to be issued on a thread." alt="" coords="190,816,325,843"></area><area shape="rect" id="node24" href="classpp_1_1_net_address.html" title="The NetAddress class represents a network address." alt="" coords="197,867,318,893"></area><area shape="rect" id="node25" href="classpp_1_1_network_list.html" title="pp::NetworkList" alt="" coords="197,917,317,944"></area><area shape="rect" id="node26" href="classpp_1_1_network_monitor.html" title="pp::NetworkMonitor" alt="" coords="184,968,331,995"></area><area shape="rect" id="node27" href="classpp_1_1_t_c_p_socket.html" title="The TCPSocket class provides TCP socket operations." alt="" coords="201,1019,314,1045"></area><area shape="rect" id="node28" href="classpp_1_1_u_d_p_socket.html" title="The UDPSocket class provides UDP socket operations." alt="" coords="198,1069,317,1096"></area><area shape="rect" id="node29" href="classpp_1_1_u_r_l_loader.html" title="URLLoader provides an API for loading URLs." alt="" coords="200,1120,315,1147"></area><area shape="rect" id="node30" href="classpp_1_1_u_r_l_request_info.html" title="URLRequestInfo provides an API for creating and manipulating URL requests." alt="" coords="185,1171,330,1197"></area><area shape="rect" id="node31" href="classpp_1_1_u_r_l_response_info.html" title="URLResponseInfo provides an API for examining URL responses." alt="" coords="180,1221,335,1248"></area><area shape="rect" id="node32" href="classpp_1_1_video_decoder.html" title="Video decoder interface." alt="" coords="189,1272,325,1299"></area><area shape="rect" id="node33" href="classpp_1_1_video_encoder.html" title="Video encoder interface." alt="" coords="190,1323,325,1349"></area><area shape="rect" id="node34" href="classpp_1_1_video_frame.html" title="pp::VideoFrame" alt="" coords="196,1373,319,1400"></area><area shape="rect" id="node35" href="classpp_1_1_view.html" title="This class represents the state of the view for an instance and contains functions for retrieving the..." alt="" coords="220,1424,295,1451"></area><area shape="rect" id="node36" href="classpp_1_1_vpn_provider.html" title="The VpnProvider class enhances the chrome.vpnProvider JavaScript API by providing a high performance ..." alt="" coords="196,1475,319,1501"></area><area shape="rect" id="node37" href="classpp_1_1_web_socket.html" title="The WebSocket class providing bi-directional, full-duplex, communications over a single TCP socket..." alt="" coords="199,1525,315,1552"></area><area shape="rect" id="node16" href="classpp_1_1_i_m_e_input_event.html" title="pp::IMEInputEvent" alt="" coords="424,563,560,589"></area><area shape="rect" id="node17" href="classpp_1_1_keyboard_input_event.html" title="pp::KeyboardInputEvent" alt="" coords="405,613,579,640"></area><area shape="rect" id="node18" href="classpp_1_1_mouse_input_event.html" title="This class handles mouse events." alt="" coords="414,664,570,691"></area><area shape="rect" id="node19" href="classpp_1_1_touch_input_event.html" title="pp::TouchInputEvent" alt="" coords="417,715,567,741"></area><area shape="rect" id="node20" href="classpp_1_1_wheel_input_event.html" title="pp::WheelInputEvent" alt="" coords="416,765,568,792"></area></map>
 <center><span class="legend">[<a href="graph_legend.html">legend</a>]</span></center></div>
 <p><a href="classpp_1_1_resource-members.html">List of all members.</a></p>
 <h2>
diff --git a/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_resource__inherit__graph.png b/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_resource__inherit__graph.png
index 5fd5ac3..2df5ffd 100644
--- a/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_resource__inherit__graph.png
+++ b/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_resource__inherit__graph.png
Binary files differ
diff --git a/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_vpn_provider-members.html b/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_vpn_provider-members.html
new file mode 100644
index 0000000..d8f037be
--- /dev/null
+++ b/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_vpn_provider-members.html
@@ -0,0 +1,33 @@
+{{+bindTo:partials.standard_nacl_api}}
+<h1>Member List</h1>
+<div id="doxygen-ref">
+{{- dummy div to appease doxygen -}}
+  <div>
+<!-- Generated by Doxygen 1.7.6.1 -->
+
+
+
+</div>
+<!--header-->
+<div class="contents">
+This is the complete list of members for <a class="el" href="classpp_1_1_vpn_provider.html">pp::VpnProvider</a>, including all inherited members.<table>
+<tr class="memlist"><td><a class="el" href="classpp_1_1_vpn_provider.html#a90d17a19973f48a31ea933325e0b61af">Bind</a>(const Var &amp;configuration_id, const Var &amp;configuration_name, const CompletionCallback &amp;callback)</td><td><a class="el" href="classpp_1_1_vpn_provider.html">pp::VpnProvider</a></td><td></td></tr>
+<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#ad4016f37d3022863ca0188acb26ac9c4">Clear</a>()</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [protected]</code></td></tr>
+<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a81b9246381bdddacca3ac25f6ded2bfd">detach</a>()</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td></td></tr>
+<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a859068e34cdc2dc0b78754c255323aa9">is_null</a>() const </td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [inline]</code></td></tr>
+<tr class="memlist"><td><a class="el" href="classpp_1_1_vpn_provider.html#a0a6b1fd0a843997fafe1bf5bed85b3b9">IsAvailable</a>()</td><td><a class="el" href="classpp_1_1_vpn_provider.html">pp::VpnProvider</a></td><td><code> [static]</code></td></tr>
+<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#aaf808a98bdaa7998d82e19514aa87423">operator=</a>(const Resource &amp;other)</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td></td></tr>
+<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a3eda014529127a818df8d5bb5ec2fdf0">PassRefFromConstructor</a>(PP_Resource resource)</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [protected]</code></td></tr>
+<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a46a6123de0b007ad3fcb6f666534ccb4">pp_resource</a>() const </td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [inline]</code></td></tr>
+<tr class="memlist"><td><a class="el" href="classpp_1_1_vpn_provider.html#a745f12bb3d3eb9bf7f29892a717caefb">ReceivePacket</a>(const CompletionCallbackWithOutput&lt; Var &gt; &amp;callback)</td><td><a class="el" href="classpp_1_1_vpn_provider.html">pp::VpnProvider</a></td><td></td></tr>
+<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a56679e93a58101c8dce5dc510811a094">Resource</a>()</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td></td></tr>
+<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#ab0f664099ca06367180f220ea7e0b831">Resource</a>(const Resource &amp;other)</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td></td></tr>
+<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a555de93fdf4793f7db1183bf71d20580">Resource</a>(PP_Resource resource)</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [explicit, protected]</code></td></tr>
+<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a907d3d6b7e292587c8cb9ff30d0a418d">Resource</a>(PassRef, PP_Resource resource)</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [protected]</code></td></tr>
+<tr class="memlist"><td><a class="el" href="classpp_1_1_vpn_provider.html#ae692340a675bcd27c756e98779efe615">SendPacket</a>(const Var &amp;packet, const CompletionCallback &amp;callback)</td><td><a class="el" href="classpp_1_1_vpn_provider.html">pp::VpnProvider</a></td><td></td></tr>
+<tr class="memlist"><td><a class="el" href="classpp_1_1_vpn_provider.html#a5d44d34828cce02849b2ade71de054f6">VpnProvider</a>(const InstanceHandle &amp;instance)</td><td><a class="el" href="classpp_1_1_vpn_provider.html">pp::VpnProvider</a></td><td><code> [explicit]</code></td></tr>
+<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a081165265e2bd8217eaa2be2aeeb3aa3">~Resource</a>()</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [virtual]</code></td></tr>
+<tr class="memlist"><td><a class="el" href="classpp_1_1_vpn_provider.html#a0ae82ce542bed9af72da27fb4c94ec42">~VpnProvider</a>()</td><td><a class="el" href="classpp_1_1_vpn_provider.html">pp::VpnProvider</a></td><td><code> [virtual]</code></td></tr>
+</table></div><!-- contents -->
+</div>
+{{/partials.standard_nacl_api}}
diff --git a/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_vpn_provider.html b/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_vpn_provider.html
new file mode 100644
index 0000000..d3ab36e
--- /dev/null
+++ b/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_vpn_provider.html
@@ -0,0 +1,213 @@
+{{+bindTo:partials.standard_nacl_api}}
+<h1>pp::VpnProvider Class Reference</h1>
+<div id="doxygen-ref">
+{{- dummy div to appease doxygen -}}
+  <div>
+<!-- Generated by Doxygen 1.7.6.1 -->
+
+
+
+</div>
+<!--header-->
+<div class="contents">
+<!-- doxytag: class="pp::VpnProvider" --><!-- doxytag: inherits="pp::Resource" --><div class="dynheader">
+Inheritance diagram for pp::VpnProvider:</div>
+<div class="dyncontent">
+<div class="center"><img src="classpp_1_1_vpn_provider__inherit__graph.png" border="0" usemap="#pp_1_1_vpn_provider_inherit__map" alt="Inheritance graph" /></div>
+<map name="pp_1_1_vpn_provider_inherit__map" id="pp_1_1_vpn_provider_inherit__map">
+<area shape="rect" id="node2" href="classpp_1_1_resource.html" title="A reference counted module resource." alt="" coords="15,5,119,32"></area></map>
+<center><span class="legend">[<a href="graph_legend.html">legend</a>]</span></center></div>
+<p><a href="classpp_1_1_vpn_provider-members.html">List of all members.</a></p>
+<h2>
+Public Member Functions</h2><table class="memberdecls">
+
+<tr><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_vpn_provider.html#a5d44d34828cce02849b2ade71de054f6">VpnProvider</a> (const <a class="el" href="classpp_1_1_instance_handle.html">InstanceHandle</a> &amp;instance)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">virtual&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_vpn_provider.html#a0ae82ce542bed9af72da27fb4c94ec42">~VpnProvider</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">int32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_vpn_provider.html#a90d17a19973f48a31ea933325e0b61af">Bind</a> (const <a class="el" href="classpp_1_1_var.html">Var</a> &amp;configuration_id, const <a class="el" href="classpp_1_1_var.html">Var</a> &amp;configuration_name, const <a class="el" href="classpp_1_1_completion_callback.html">CompletionCallback</a> &amp;callback)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">int32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_vpn_provider.html#ae692340a675bcd27c756e98779efe615">SendPacket</a> (const <a class="el" href="classpp_1_1_var.html">Var</a> &amp;packet, const <a class="el" href="classpp_1_1_completion_callback.html">CompletionCallback</a> &amp;callback)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">int32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_vpn_provider.html#a745f12bb3d3eb9bf7f29892a717caefb">ReceivePacket</a> (const <a class="el" href="classpp_1_1_completion_callback_with_output.html">CompletionCallbackWithOutput</a>&lt; <a class="el" href="classpp_1_1_var.html">Var</a> &gt; &amp;callback)</td></tr>
+</table><h2>
+Static Public Member Functions</h2><table class="memberdecls">
+<tr><td class="memItemLeft" align="right" valign="top">static bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_vpn_provider.html#a0a6b1fd0a843997fafe1bf5bed85b3b9">IsAvailable</a> ()</td></tr>
+</table>
+<hr /><a name="details" id="details"></a><h2>Detailed Description</h2>
+<div class="textblock"><p>The <code><a class="el" href="classpp_1_1_vpn_provider.html" title="The VpnProvider class enhances the chrome.vpnProvider JavaScript API by providing a high performance ...">VpnProvider</a></code> class enhances the <code>chrome.vpnProvider</code> JavaScript API by providing a high performance path for packet handling. </p>
+<p>Permissions: Apps permission <code>vpnProvider</code> is required for <code><a class="el" href="classpp_1_1_vpn_provider.html#a90d17a19973f48a31ea933325e0b61af" title="Binds to an existing configuration created from JavaScript by chrome.vpnProvider.createConfig.">VpnProvider.Bind()</a></code>.</p>
+<p>Typical usage:</p>
+<ul>
+<li>Create a <code><a class="el" href="classpp_1_1_vpn_provider.html" title="The VpnProvider class enhances the chrome.vpnProvider JavaScript API by providing a high performance ...">VpnProvider</a></code> instance.</li>
+<li>Register the callback for <code><a class="el" href="classpp_1_1_vpn_provider.html#a745f12bb3d3eb9bf7f29892a717caefb" title="Receives an IP packet from the tunnel for the VPN session.">VpnProvider.ReceivePacket()</a></code>.</li>
+<li>In the extension follow the usual workflow for configuring a VPN connection via the <code>chrome.vpnProvider</code> API until the step for notifying the connection state as "connected".</li>
+<li>Bind to the previously created connection using <code><a class="el" href="classpp_1_1_vpn_provider.html#a90d17a19973f48a31ea933325e0b61af" title="Binds to an existing configuration created from JavaScript by chrome.vpnProvider.createConfig.">VpnProvider.Bind()</a></code>.</li>
+<li>Notify the connection state as "connected" from JavaScript using <code>chrome.vpnProvider.notifyConnectionStateChanged</code>.</li>
+<li>When the steps above are completed without errors, a virtual tunnel is created to the network stack of Chrome OS. IP packets can be sent through the tunnel using <code><a class="el" href="classpp_1_1_vpn_provider.html#ae692340a675bcd27c756e98779efe615" title="Sends an IP packet through the tunnel created for the VPN session.">VpnProvider.SendPacket()</a></code> and any packets originating on the Chrome OS device will be received using the callback registered for <code><a class="el" href="classpp_1_1_vpn_provider.html#a745f12bb3d3eb9bf7f29892a717caefb" title="Receives an IP packet from the tunnel for the VPN session.">VpnProvider.ReceivePacket()</a></code>.</li>
+<li>When the user disconnects from the VPN configuration or there is an error the extension will be notfied via <code>chrome.vpnProvider.onPlatformMessage</code>. </li>
+</ul>
+</div><hr /><h2>Constructor &amp; Destructor Documentation</h2>
+<a class="anchor" id="a5d44d34828cce02849b2ade71de054f6"></a><!-- doxytag: member="pp::VpnProvider::VpnProvider" ref="a5d44d34828cce02849b2ade71de054f6" args="(const InstanceHandle &amp;instance)" -->
+<div class="memitem">
+<div class="memproto">
+<table class="memname">
+<tr>
+<td class="memname"><a class="el" href="classpp_1_1_vpn_provider.html#a5d44d34828cce02849b2ade71de054f6">pp::VpnProvider::VpnProvider</a> </td>
+<td>(</td>
+<td class="paramtype">const <a class="el" href="classpp_1_1_instance_handle.html">InstanceHandle</a> &amp;&#160;</td>
+<td class="paramname"><em>instance</em></td><td>)</td>
+<td><code> [explicit]</code></td>
+</tr>
+</table>
+</div>
+<div class="memdoc">
+<p>Constructs a <a class="el" href="classpp_1_1_vpn_provider.html" title="The VpnProvider class enhances the chrome.vpnProvider JavaScript API by providing a high performance ...">VpnProvider</a> object. </p>
+<dl class="params"><dt><b>Parameters:</b></dt><dd>
+<table class="params">
+<tr><td class="paramdir">[in]</td><td class="paramname">instance</td><td>The instance with which this resource will be associated. </td></tr>
+</table>
+</dd>
+</dl>
+</div>
+</div>
+<a class="anchor" id="a0ae82ce542bed9af72da27fb4c94ec42"></a><!-- doxytag: member="pp::VpnProvider::~VpnProvider" ref="a0ae82ce542bed9af72da27fb4c94ec42" args="()" -->
+<div class="memitem">
+<div class="memproto">
+<table class="memname">
+<tr>
+<td class="memname">virtual <a class="el" href="classpp_1_1_vpn_provider.html#a0ae82ce542bed9af72da27fb4c94ec42">pp::VpnProvider::~VpnProvider</a> </td>
+<td>(</td>
+<td class="paramname"></td><td>)</td>
+<td><code> [virtual]</code></td>
+</tr>
+</table>
+</div>
+<div class="memdoc">
+<p>Destructs a <a class="el" href="classpp_1_1_vpn_provider.html" title="The VpnProvider class enhances the chrome.vpnProvider JavaScript API by providing a high performance ...">VpnProvider</a> object. </p>
+</div>
+</div>
+<hr /><h2>Member Function Documentation</h2>
+<a class="anchor" id="a90d17a19973f48a31ea933325e0b61af"></a><!-- doxytag: member="pp::VpnProvider::Bind" ref="a90d17a19973f48a31ea933325e0b61af" args="(const Var &amp;configuration_id, const Var &amp;configuration_name, const CompletionCallback &amp;callback)" -->
+<div class="memitem">
+<div class="memproto">
+<table class="memname">
+<tr>
+<td class="memname">int32_t <a class="el" href="classpp_1_1_vpn_provider.html#a90d17a19973f48a31ea933325e0b61af">pp::VpnProvider::Bind</a> </td>
+<td>(</td>
+<td class="paramtype">const <a class="el" href="classpp_1_1_var.html">Var</a> &amp;&#160;</td>
+<td class="paramname"><em>configuration_id</em>, </td>
+</tr>
+<tr>
+<td class="paramkey"></td>
+<td></td>
+<td class="paramtype">const <a class="el" href="classpp_1_1_var.html">Var</a> &amp;&#160;</td>
+<td class="paramname"><em>configuration_name</em>, </td>
+</tr>
+<tr>
+<td class="paramkey"></td>
+<td></td>
+<td class="paramtype">const <a class="el" href="classpp_1_1_completion_callback.html">CompletionCallback</a> &amp;&#160;</td>
+<td class="paramname"><em>callback</em>&#160;</td>
+</tr>
+<tr>
+<td></td>
+<td>)</td>
+<td></td><td></td>
+</tr>
+</table>
+</div>
+<div class="memdoc">
+<p>Binds to an existing configuration created from JavaScript by <code>chrome.vpnProvider.createConfig</code>. </p>
+<p>All packets will be routed via <code>SendPacket</code> and <code>ReceivePacket</code>. The user should register the callback for <code>ReceivePacket</code> before calling <code><a class="el" href="classpp_1_1_vpn_provider.html#a90d17a19973f48a31ea933325e0b61af" title="Binds to an existing configuration created from JavaScript by chrome.vpnProvider.createConfig.">Bind()</a></code>.</p>
+<dl class="params"><dt><b>Parameters:</b></dt><dd>
+<table class="params">
+<tr><td class="paramdir">[in]</td><td class="paramname">configuration_id</td><td>The configuration id from the callback of <code>chrome.vpnProvider.createConfig</code>. This <code><a class="el" href="classpp_1_1_var.html" title="A generic type used for passing data types between the module and the page.">Var</a></code> must be of string type.</td></tr>
+<tr><td class="paramdir">[in]</td><td class="paramname">configuration_name</td><td>The configuration name as defined by the user when calling <code>chrome.vpnProvider.createConfig</code>. This <code><a class="el" href="classpp_1_1_var.html" title="A generic type used for passing data types between the module and the page.">Var</a></code> must be of string type.</td></tr>
+<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="classpp_1_1_completion_callback.html" title="This API enables you to implement and receive callbacks when Pepper operations complete asynchronousl...">CompletionCallback</a></code> to be called on completion.</td></tr>
+</table>
+</dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code>pp_errors.h</code>. Returns <code>PP_ERROR_INPROGRESS</code> if a previous call to <code><a class="el" href="classpp_1_1_vpn_provider.html#a90d17a19973f48a31ea933325e0b61af" title="Binds to an existing configuration created from JavaScript by chrome.vpnProvider.createConfig.">Bind()</a></code> has not completed. Returns <code>PP_ERROR_BADARGUMENT</code> if the <code><a class="el" href="classpp_1_1_var.html" title="A generic type used for passing data types between the module and the page.">Var</a></code> type of either <code>configuration_id</code> or <code>configuration_name</code> is not of string type. Returns <code>PP_ERROR_NOACCESS</code> if the caller does the have the required "vpnProvider" permission. Returns <code>PP_ERROR_FAILED</code> if <code>connection_id</code> and <code>connection_name</code> could not be matched with the existing connection, or if the plugin originates from a different extension than the one that created the connection. </dd></dl>
+</div>
+</div>
+<a class="anchor" id="a0a6b1fd0a843997fafe1bf5bed85b3b9"></a><!-- doxytag: member="pp::VpnProvider::IsAvailable" ref="a0a6b1fd0a843997fafe1bf5bed85b3b9" args="()" -->
+<div class="memitem">
+<div class="memproto">
+<table class="memname">
+<tr>
+<td class="memname">static bool <a class="el" href="classpp_1_1_vpn_provider.html#a0a6b1fd0a843997fafe1bf5bed85b3b9">pp::VpnProvider::IsAvailable</a> </td>
+<td>(</td>
+<td class="paramname"></td><td>)</td>
+<td><code> [static]</code></td>
+</tr>
+</table>
+</div>
+<div class="memdoc">
+<p>Static function for determining whether the browser supports the <code><a class="el" href="classpp_1_1_vpn_provider.html" title="The VpnProvider class enhances the chrome.vpnProvider JavaScript API by providing a high performance ...">VpnProvider</a></code> interface. </p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>true if the interface is available, false otherwise. </dd></dl>
+</div>
+</div>
+<a class="anchor" id="a745f12bb3d3eb9bf7f29892a717caefb"></a><!-- doxytag: member="pp::VpnProvider::ReceivePacket" ref="a745f12bb3d3eb9bf7f29892a717caefb" args="(const CompletionCallbackWithOutput&lt; Var &gt; &amp;callback)" -->
+<div class="memitem">
+<div class="memproto">
+<table class="memname">
+<tr>
+<td class="memname">int32_t <a class="el" href="classpp_1_1_vpn_provider.html#a745f12bb3d3eb9bf7f29892a717caefb">pp::VpnProvider::ReceivePacket</a> </td>
+<td>(</td>
+<td class="paramtype">const <a class="el" href="classpp_1_1_completion_callback_with_output.html">CompletionCallbackWithOutput</a>&lt; <a class="el" href="classpp_1_1_var.html">Var</a> &gt; &amp;&#160;</td>
+<td class="paramname"><em>callback</em></td><td>)</td>
+<td></td>
+</tr>
+</table>
+</div>
+<div class="memdoc">
+<p>Receives an IP packet from the tunnel for the VPN session. </p>
+<p>This function only returns a single packet. That is, this function must be called at least N times to receive N packets, no matter the size of each packet. The callback should be registered before calling <code><a class="el" href="classpp_1_1_vpn_provider.html#a90d17a19973f48a31ea933325e0b61af" title="Binds to an existing configuration created from JavaScript by chrome.vpnProvider.createConfig.">Bind()</a></code>.</p>
+<dl class="params"><dt><b>Parameters:</b></dt><dd>
+<table class="params">
+<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="classpp_1_1_completion_callback_with_output.html" title="A CompletionCallbackWithOutput defines a completion callback that additionally stores a pointer to so...">CompletionCallbackWithOutput</a></code> to be called upon completion of ReceivePacket. It will be passed an ArrayBuffer type <code><a class="el" href="classpp_1_1_var.html" title="A generic type used for passing data types between the module and the page.">Var</a></code> containing an IP packet to be sent to the platform.</td></tr>
+</table>
+</dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code>pp_errors.h</code>. Returns <code>PP_ERROR_INPROGRESS</code> if a previous call to <code><a class="el" href="classpp_1_1_vpn_provider.html#a745f12bb3d3eb9bf7f29892a717caefb" title="Receives an IP packet from the tunnel for the VPN session.">ReceivePacket()</a></code> has not completed. </dd></dl>
+</div>
+</div>
+<a class="anchor" id="ae692340a675bcd27c756e98779efe615"></a><!-- doxytag: member="pp::VpnProvider::SendPacket" ref="ae692340a675bcd27c756e98779efe615" args="(const Var &amp;packet, const CompletionCallback &amp;callback)" -->
+<div class="memitem">
+<div class="memproto">
+<table class="memname">
+<tr>
+<td class="memname">int32_t <a class="el" href="classpp_1_1_vpn_provider.html#ae692340a675bcd27c756e98779efe615">pp::VpnProvider::SendPacket</a> </td>
+<td>(</td>
+<td class="paramtype">const <a class="el" href="classpp_1_1_var.html">Var</a> &amp;&#160;</td>
+<td class="paramname"><em>packet</em>, </td>
+</tr>
+<tr>
+<td class="paramkey"></td>
+<td></td>
+<td class="paramtype">const <a class="el" href="classpp_1_1_completion_callback.html">CompletionCallback</a> &amp;&#160;</td>
+<td class="paramname"><em>callback</em>&#160;</td>
+</tr>
+<tr>
+<td></td>
+<td>)</td>
+<td></td><td></td>
+</tr>
+</table>
+</div>
+<div class="memdoc">
+<p>Sends an IP packet through the tunnel created for the VPN session. </p>
+<p>This will succeed only when the VPN session is owned by the module and connection is bound.</p>
+<dl class="params"><dt><b>Parameters:</b></dt><dd>
+<table class="params">
+<tr><td class="paramdir">[in]</td><td class="paramname">packet</td><td>IP packet to be sent to the platform. The <code><a class="el" href="classpp_1_1_var.html" title="A generic type used for passing data types between the module and the page.">Var</a></code> must be of ArrayBuffer type.</td></tr>
+<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="classpp_1_1_completion_callback.html" title="This API enables you to implement and receive callbacks when Pepper operations complete asynchronousl...">CompletionCallback</a></code> to be called on completion.</td></tr>
+</table>
+</dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code>pp_errors.h</code>. Returns <code>PP_ERROR_FAILED</code> if the connection is not bound. Returns <code>PP_ERROR_INPROGRESS</code> if a previous call to <code><a class="el" href="classpp_1_1_vpn_provider.html#ae692340a675bcd27c756e98779efe615" title="Sends an IP packet through the tunnel created for the VPN session.">SendPacket()</a></code> has not completed. Returns <code>PP_ERROR_BADARGUMENT</code> if the <code><a class="el" href="classpp_1_1_var.html" title="A generic type used for passing data types between the module and the page.">Var</a></code> type of <code>packet</code> is not of ArrayBuffer type. </dd></dl>
+</div>
+</div>
+<hr />The documentation for this class was generated from the following file:<ul>
+<li><a class="el" href="vpn__provider_8h.html">vpn_provider.h</a></li>
+</ul>
+</div><!-- contents -->
+</div>
+{{/partials.standard_nacl_api}}
diff --git a/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_vpn_provider__inherit__graph.png b/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_vpn_provider__inherit__graph.png
new file mode 100644
index 0000000..b2b83f8b
--- /dev/null
+++ b/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_vpn_provider__inherit__graph.png
Binary files differ
diff --git a/native_client_sdk/doc_generated/pepper_dev/cpp/inherit_graph_23.png b/native_client_sdk/doc_generated/pepper_dev/cpp/inherit_graph_23.png
index 056cffd..12c7b57 100644
--- a/native_client_sdk/doc_generated/pepper_dev/cpp/inherit_graph_23.png
+++ b/native_client_sdk/doc_generated/pepper_dev/cpp/inherit_graph_23.png
Binary files differ
diff --git a/native_client_sdk/doc_generated/pepper_dev/cpp/inherits.html b/native_client_sdk/doc_generated/pepper_dev/cpp/inherits.html
index f1a43a2c..d0e14c96 100644
--- a/native_client_sdk/doc_generated/pepper_dev/cpp/inherits.html
+++ b/native_client_sdk/doc_generated/pepper_dev/cpp/inherits.html
@@ -106,7 +106,7 @@
 </td></tr>
 <tr><td><img src="inherit_graph_23.png" border="0" alt="" usemap="#pp_1_1_resource" />
 <map name="pp_1_1_resource" id="pp_1_1_resource">
-<area shape="rect" id="node1" href="classpp_1_1_resource.html" title="A reference counted module resource." alt="" coords="5,740,109,767"></area><area shape="rect" id="node2" href="classpp_1_1_audio.html" title="An audio resource." alt="" coords="216,5,299,32"></area><area shape="rect" id="node3" href="classpp_1_1_audio_buffer.html" title="pp::AudioBuffer" alt="" coords="197,56,317,83"></area><area shape="rect" id="node4" href="classpp_1_1_audio_config.html" title="A 16 bit stereo AudioConfig resource." alt="" coords="196,107,319,133"></area><area shape="rect" id="node5" href="classpp_1_1_audio_encoder.html" title="Audio encoder interface." alt="" coords="190,157,325,184"></area><area shape="rect" id="node6" href="classpp_1_1_compositor.html" title="The Compositor interface is used for setting CompositorLayer layers to the Chromium compositor for co..." alt="" coords="197,208,317,235"></area><area shape="rect" id="node7" href="classpp_1_1_compositor_layer.html" title="pp::CompositorLayer" alt="" coords="180,259,335,285"></area><area shape="rect" id="node8" href="classpp_1_1_file_i_o.html" title="The FileIO class represents a regular file." alt="" coords="218,309,297,336"></area><area shape="rect" id="node9" href="classpp_1_1_file_ref.html" title='The FileRef class represents a "weak pointer" to a file in a file system.' alt="" coords="215,360,300,387"></area><area shape="rect" id="node10" href="classpp_1_1_file_system.html" title="The FileSystem class identifies the file system type associated with a file." alt="" coords="200,411,315,437"></area><area shape="rect" id="node11" href="classpp_1_1_graphics2_d.html" title="pp::Graphics2D" alt="" coords="197,461,317,488"></area><area shape="rect" id="node12" href="classpp_1_1_graphics3_d.html" title="This class represents a 3D rendering context in the browser." alt="" coords="197,512,317,539"></area><area shape="rect" id="node13" href="classpp_1_1_host_resolver.html" title="The HostResolver class supports host name resolution." alt="" coords="193,563,322,589"></area><area shape="rect" id="node14" href="classpp_1_1_image_data.html" title="pp::ImageData" alt="" coords="199,613,316,640"></area><area shape="rect" id="node15" href="classpp_1_1_input_event.html" title="This class represents an input event resource." alt="" coords="200,664,315,691"></area><area shape="rect" id="node21" href="classpp_1_1_media_stream_audio_track.html" title="The MediaStreamAudioTrack class contains methods for receiving audio buffers from a MediaStream audio..." alt="" coords="157,715,357,741"></area><area shape="rect" id="node22" href="classpp_1_1_media_stream_video_track.html" title="The MediaStreamVideoTrack class contains methods for receiving video frames from a MediaStream video ..." alt="" coords="157,765,357,792"></area><area shape="rect" id="node23" href="classpp_1_1_message_loop.html" title="A message loop allows PPAPI calls to be issued on a thread." alt="" coords="190,816,325,843"></area><area shape="rect" id="node24" href="classpp_1_1_net_address.html" title="The NetAddress class represents a network address." alt="" coords="197,867,318,893"></area><area shape="rect" id="node25" href="classpp_1_1_network_list.html" title="pp::NetworkList" alt="" coords="197,917,317,944"></area><area shape="rect" id="node26" href="classpp_1_1_network_monitor.html" title="pp::NetworkMonitor" alt="" coords="184,968,331,995"></area><area shape="rect" id="node27" href="classpp_1_1_t_c_p_socket.html" title="The TCPSocket class provides TCP socket operations." alt="" coords="201,1019,314,1045"></area><area shape="rect" id="node28" href="classpp_1_1_u_d_p_socket.html" title="The UDPSocket class provides UDP socket operations." alt="" coords="198,1069,317,1096"></area><area shape="rect" id="node29" href="classpp_1_1_u_r_l_loader.html" title="URLLoader provides an API for loading URLs." alt="" coords="200,1120,315,1147"></area><area shape="rect" id="node30" href="classpp_1_1_u_r_l_request_info.html" title="URLRequestInfo provides an API for creating and manipulating URL requests." alt="" coords="185,1171,330,1197"></area><area shape="rect" id="node31" href="classpp_1_1_u_r_l_response_info.html" title="URLResponseInfo provides an API for examining URL responses." alt="" coords="180,1221,335,1248"></area><area shape="rect" id="node32" href="classpp_1_1_video_decoder.html" title="Video decoder interface." alt="" coords="189,1272,325,1299"></area><area shape="rect" id="node33" href="classpp_1_1_video_encoder.html" title="Video encoder interface." alt="" coords="190,1323,325,1349"></area><area shape="rect" id="node34" href="classpp_1_1_video_frame.html" title="pp::VideoFrame" alt="" coords="196,1373,319,1400"></area><area shape="rect" id="node35" href="classpp_1_1_view.html" title="This class represents the state of the view for an instance and contains functions for retrieving the..." alt="" coords="220,1424,295,1451"></area><area shape="rect" id="node36" href="classpp_1_1_web_socket.html" title="The WebSocket class providing bi-directional, full-duplex, communications over a single TCP socket..." alt="" coords="199,1475,315,1501"></area><area shape="rect" id="node16" href="classpp_1_1_i_m_e_input_event.html" title="pp::IMEInputEvent" alt="" coords="424,563,560,589"></area><area shape="rect" id="node17" href="classpp_1_1_keyboard_input_event.html" title="pp::KeyboardInputEvent" alt="" coords="405,613,579,640"></area><area shape="rect" id="node18" href="classpp_1_1_mouse_input_event.html" title="This class handles mouse events." alt="" coords="414,664,570,691"></area><area shape="rect" id="node19" href="classpp_1_1_touch_input_event.html" title="pp::TouchInputEvent" alt="" coords="417,715,567,741"></area><area shape="rect" id="node20" href="classpp_1_1_wheel_input_event.html" title="pp::WheelInputEvent" alt="" coords="416,765,568,792"></area></map>
+<area shape="rect" id="node1" href="classpp_1_1_resource.html" title="A reference counted module resource." alt="" coords="5,765,109,792"></area><area shape="rect" id="node2" href="classpp_1_1_audio.html" title="An audio resource." alt="" coords="216,5,299,32"></area><area shape="rect" id="node3" href="classpp_1_1_audio_buffer.html" title="pp::AudioBuffer" alt="" coords="197,56,317,83"></area><area shape="rect" id="node4" href="classpp_1_1_audio_config.html" title="A 16 bit stereo AudioConfig resource." alt="" coords="196,107,319,133"></area><area shape="rect" id="node5" href="classpp_1_1_audio_encoder.html" title="Audio encoder interface." alt="" coords="190,157,325,184"></area><area shape="rect" id="node6" href="classpp_1_1_compositor.html" title="The Compositor interface is used for setting CompositorLayer layers to the Chromium compositor for co..." alt="" coords="197,208,317,235"></area><area shape="rect" id="node7" href="classpp_1_1_compositor_layer.html" title="pp::CompositorLayer" alt="" coords="180,259,335,285"></area><area shape="rect" id="node8" href="classpp_1_1_file_i_o.html" title="The FileIO class represents a regular file." alt="" coords="218,309,297,336"></area><area shape="rect" id="node9" href="classpp_1_1_file_ref.html" title='The FileRef class represents a "weak pointer" to a file in a file system.' alt="" coords="215,360,300,387"></area><area shape="rect" id="node10" href="classpp_1_1_file_system.html" title="The FileSystem class identifies the file system type associated with a file." alt="" coords="200,411,315,437"></area><area shape="rect" id="node11" href="classpp_1_1_graphics2_d.html" title="pp::Graphics2D" alt="" coords="197,461,317,488"></area><area shape="rect" id="node12" href="classpp_1_1_graphics3_d.html" title="This class represents a 3D rendering context in the browser." alt="" coords="197,512,317,539"></area><area shape="rect" id="node13" href="classpp_1_1_host_resolver.html" title="The HostResolver class supports host name resolution." alt="" coords="193,563,322,589"></area><area shape="rect" id="node14" href="classpp_1_1_image_data.html" title="pp::ImageData" alt="" coords="199,613,316,640"></area><area shape="rect" id="node15" href="classpp_1_1_input_event.html" title="This class represents an input event resource." alt="" coords="200,664,315,691"></area><area shape="rect" id="node21" href="classpp_1_1_media_stream_audio_track.html" title="The MediaStreamAudioTrack class contains methods for receiving audio buffers from a MediaStream audio..." alt="" coords="157,715,357,741"></area><area shape="rect" id="node22" href="classpp_1_1_media_stream_video_track.html" title="The MediaStreamVideoTrack class contains methods for receiving video frames from a MediaStream video ..." alt="" coords="157,765,357,792"></area><area shape="rect" id="node23" href="classpp_1_1_message_loop.html" title="A message loop allows PPAPI calls to be issued on a thread." alt="" coords="190,816,325,843"></area><area shape="rect" id="node24" href="classpp_1_1_net_address.html" title="The NetAddress class represents a network address." alt="" coords="197,867,318,893"></area><area shape="rect" id="node25" href="classpp_1_1_network_list.html" title="pp::NetworkList" alt="" coords="197,917,317,944"></area><area shape="rect" id="node26" href="classpp_1_1_network_monitor.html" title="pp::NetworkMonitor" alt="" coords="184,968,331,995"></area><area shape="rect" id="node27" href="classpp_1_1_t_c_p_socket.html" title="The TCPSocket class provides TCP socket operations." alt="" coords="201,1019,314,1045"></area><area shape="rect" id="node28" href="classpp_1_1_u_d_p_socket.html" title="The UDPSocket class provides UDP socket operations." alt="" coords="198,1069,317,1096"></area><area shape="rect" id="node29" href="classpp_1_1_u_r_l_loader.html" title="URLLoader provides an API for loading URLs." alt="" coords="200,1120,315,1147"></area><area shape="rect" id="node30" href="classpp_1_1_u_r_l_request_info.html" title="URLRequestInfo provides an API for creating and manipulating URL requests." alt="" coords="185,1171,330,1197"></area><area shape="rect" id="node31" href="classpp_1_1_u_r_l_response_info.html" title="URLResponseInfo provides an API for examining URL responses." alt="" coords="180,1221,335,1248"></area><area shape="rect" id="node32" href="classpp_1_1_video_decoder.html" title="Video decoder interface." alt="" coords="189,1272,325,1299"></area><area shape="rect" id="node33" href="classpp_1_1_video_encoder.html" title="Video encoder interface." alt="" coords="190,1323,325,1349"></area><area shape="rect" id="node34" href="classpp_1_1_video_frame.html" title="pp::VideoFrame" alt="" coords="196,1373,319,1400"></area><area shape="rect" id="node35" href="classpp_1_1_view.html" title="This class represents the state of the view for an instance and contains functions for retrieving the..." alt="" coords="220,1424,295,1451"></area><area shape="rect" id="node36" href="classpp_1_1_vpn_provider.html" title="The VpnProvider class enhances the chrome.vpnProvider JavaScript API by providing a high performance ..." alt="" coords="196,1475,319,1501"></area><area shape="rect" id="node37" href="classpp_1_1_web_socket.html" title="The WebSocket class providing bi-directional, full-duplex, communications over a single TCP socket..." alt="" coords="199,1525,315,1552"></area><area shape="rect" id="node16" href="classpp_1_1_i_m_e_input_event.html" title="pp::IMEInputEvent" alt="" coords="424,563,560,589"></area><area shape="rect" id="node17" href="classpp_1_1_keyboard_input_event.html" title="pp::KeyboardInputEvent" alt="" coords="405,613,579,640"></area><area shape="rect" id="node18" href="classpp_1_1_mouse_input_event.html" title="This class handles mouse events." alt="" coords="414,664,570,691"></area><area shape="rect" id="node19" href="classpp_1_1_touch_input_event.html" title="pp::TouchInputEvent" alt="" coords="417,715,567,741"></area><area shape="rect" id="node20" href="classpp_1_1_wheel_input_event.html" title="pp::WheelInputEvent" alt="" coords="416,765,568,792"></area></map>
 </td></tr>
 <tr><td><img src="inherit_graph_24.png" border="0" alt="" usemap="#pp_1_1_size" />
 <map name="pp_1_1_size" id="pp_1_1_size">
diff --git a/native_client_sdk/doc_generated/pepper_dev/cpp/jquery.js b/native_client_sdk/doc_generated/pepper_dev/cpp/jquery.js
new file mode 100644
index 0000000..90b3a2b
--- /dev/null
+++ b/native_client_sdk/doc_generated/pepper_dev/cpp/jquery.js
@@ -0,0 +1,64 @@
+/*
+ * jQuery JavaScript Library v1.3.2
+ * http://jquery.com/
+ *
+ * Copyright (c) 2009 John Resig
+ * Dual licensed under the MIT and GPL licenses.
+ * http://docs.jquery.com/License
+ *
+ * Date: 2009-02-19 17:34:21 -0500 (Thu, 19 Feb 2009)
+ * Revision: 6246
+ */
+(function(){var l=this,g,y=l.jQuery,p=l.$,o=l.jQuery=l.$=function(E,F){return new o.fn.init(E,F)},D=/^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/,f=/^.[^:#\[\.,]*$/;o.fn=o.prototype={init:function(E,H){E=E||document;if(E.nodeType){this[0]=E;this.length=1;this.context=E;return this}if(typeof E==="string"){var G=D.exec(E);if(G&&(G[1]||!H)){if(G[1]){E=o.clean([G[1]],H)}else{var I=document.getElementById(G[3]);if(I&&I.id!=G[3]){return o().find(E)}var F=o(I||[]);F.context=document;F.selector=E;return F}}else{return o(H).find(E)}}else{if(o.isFunction(E)){return o(document).ready(E)}}if(E.selector&&E.context){this.selector=E.selector;this.context=E.context}return this.setArray(o.isArray(E)?E:o.makeArray(E))},selector:"",jquery:"1.3.2",size:function(){return this.length},get:function(E){return E===g?Array.prototype.slice.call(this):this[E]},pushStack:function(F,H,E){var G=o(F);G.prevObject=this;G.context=this.context;if(H==="find"){G.selector=this.selector+(this.selector?" ":"")+E}else{if(H){G.selector=this.selector+"."+H+"("+E+")"}}return G},setArray:function(E){this.length=0;Array.prototype.push.apply(this,E);return this},each:function(F,E){return o.each(this,F,E)},index:function(E){return o.inArray(E&&E.jquery?E[0]:E,this)},attr:function(F,H,G){var E=F;if(typeof F==="string"){if(H===g){return this[0]&&o[G||"attr"](this[0],F)}else{E={};E[F]=H}}return this.each(function(I){for(F in E){o.attr(G?this.style:this,F,o.prop(this,E[F],G,I,F))}})},css:function(E,F){if((E=="width"||E=="height")&&parseFloat(F)<0){F=g}return this.attr(E,F,"curCSS")},text:function(F){if(typeof F!=="object"&&F!=null){return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(F))}var E="";o.each(F||this,function(){o.each(this.childNodes,function(){if(this.nodeType!=8){E+=this.nodeType!=1?this.nodeValue:o.fn.text([this])}})});return E},wrapAll:function(E){if(this[0]){var F=o(E,this[0].ownerDocument).clone();if(this[0].parentNode){F.insertBefore(this[0])}F.map(function(){var G=this;while(G.firstChild){G=G.firstChild}return G}).append(this)}return this},wrapInner:function(E){return this.each(function(){o(this).contents().wrapAll(E)})},wrap:function(E){return this.each(function(){o(this).wrapAll(E)})},append:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.appendChild(E)}})},prepend:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.insertBefore(E,this.firstChild)}})},before:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this)})},after:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this.nextSibling)})},end:function(){return this.prevObject||o([])},push:[].push,sort:[].sort,splice:[].splice,find:function(E){if(this.length===1){var F=this.pushStack([],"find",E);F.length=0;o.find(E,this[0],F);return F}else{return this.pushStack(o.unique(o.map(this,function(G){return o.find(E,G)})),"find",E)}},clone:function(G){var E=this.map(function(){if(!o.support.noCloneEvent&&!o.isXMLDoc(this)){var I=this.outerHTML;if(!I){var J=this.ownerDocument.createElement("div");J.appendChild(this.cloneNode(true));I=J.innerHTML}return o.clean([I.replace(/ jQuery\d+="(?:\d+|null)"/g,"").replace(/^\s*/,"")])[0]}else{return this.cloneNode(true)}});if(G===true){var H=this.find("*").andSelf(),F=0;E.find("*").andSelf().each(function(){if(this.nodeName!==H[F].nodeName){return}var I=o.data(H[F],"events");for(var K in I){for(var J in I[K]){o.event.add(this,K,I[K][J],I[K][J].data)}}F++})}return E},filter:function(E){return this.pushStack(o.isFunction(E)&&o.grep(this,function(G,F){return E.call(G,F)})||o.multiFilter(E,o.grep(this,function(F){return F.nodeType===1})),"filter",E)},closest:function(E){var G=o.expr.match.POS.test(E)?o(E):null,F=0;return this.map(function(){var H=this;while(H&&H.ownerDocument){if(G?G.index(H)>-1:o(H).is(E)){o.data(H,"closest",F);return H}H=H.parentNode;F++}})},not:function(E){if(typeof E==="string"){if(f.test(E)){return this.pushStack(o.multiFilter(E,this,true),"not",E)}else{E=o.multiFilter(E,this)}}var F=E.length&&E[E.length-1]!==g&&!E.nodeType;return this.filter(function(){return F?o.inArray(this,E)<0:this!=E})},add:function(E){return this.pushStack(o.unique(o.merge(this.get(),typeof E==="string"?o(E):o.makeArray(E))))},is:function(E){return !!E&&o.multiFilter(E,this).length>0},hasClass:function(E){return !!E&&this.is("."+E)},val:function(K){if(K===g){var E=this[0];if(E){if(o.nodeName(E,"option")){return(E.attributes.value||{}).specified?E.value:E.text}if(o.nodeName(E,"select")){var I=E.selectedIndex,L=[],M=E.options,H=E.type=="select-one";if(I<0){return null}for(var F=H?I:0,J=H?I+1:M.length;F<J;F++){var G=M[F];if(G.selected){K=o(G).val();if(H){return K}L.push(K)}}return L}return(E.value||"").replace(/\r/g,"")}return g}if(typeof K==="number"){K+=""}return this.each(function(){if(this.nodeType!=1){return}if(o.isArray(K)&&/radio|checkbox/.test(this.type)){this.checked=(o.inArray(this.value,K)>=0||o.inArray(this.name,K)>=0)}else{if(o.nodeName(this,"select")){var N=o.makeArray(K);o("option",this).each(function(){this.selected=(o.inArray(this.value,N)>=0||o.inArray(this.text,N)>=0)});if(!N.length){this.selectedIndex=-1}}else{this.value=K}}})},html:function(E){return E===g?(this[0]?this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g,""):null):this.empty().append(E)},replaceWith:function(E){return this.after(E).remove()},eq:function(E){return this.slice(E,+E+1)},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments),"slice",Array.prototype.slice.call(arguments).join(","))},map:function(E){return this.pushStack(o.map(this,function(G,F){return E.call(G,F,G)}))},andSelf:function(){return this.add(this.prevObject)},domManip:function(J,M,L){if(this[0]){var I=(this[0].ownerDocument||this[0]).createDocumentFragment(),F=o.clean(J,(this[0].ownerDocument||this[0]),I),H=I.firstChild;if(H){for(var G=0,E=this.length;G<E;G++){L.call(K(this[G],H),this.length>1||G>0?I.cloneNode(true):I)}}if(F){o.each(F,z)}}return this;function K(N,O){return M&&o.nodeName(N,"table")&&o.nodeName(O,"tr")?(N.getElementsByTagName("tbody")[0]||N.appendChild(N.ownerDocument.createElement("tbody"))):N}}};o.fn.init.prototype=o.fn;function z(E,F){if(F.src){o.ajax({url:F.src,async:false,dataType:"script"})}else{o.globalEval(F.text||F.textContent||F.innerHTML||"")}if(F.parentNode){F.parentNode.removeChild(F)}}function e(){return +new Date}o.extend=o.fn.extend=function(){var J=arguments[0]||{},H=1,I=arguments.length,E=false,G;if(typeof J==="boolean"){E=J;J=arguments[1]||{};H=2}if(typeof J!=="object"&&!o.isFunction(J)){J={}}if(I==H){J=this;--H}for(;H<I;H++){if((G=arguments[H])!=null){for(var F in G){var K=J[F],L=G[F];if(J===L){continue}if(E&&L&&typeof L==="object"&&!L.nodeType){J[F]=o.extend(E,K||(L.length!=null?[]:{}),L)}else{if(L!==g){J[F]=L}}}}}return J};var b=/z-?index|font-?weight|opacity|zoom|line-?height/i,q=document.defaultView||{},s=Object.prototype.toString;o.extend({noConflict:function(E){l.$=p;if(E){l.jQuery=y}return o},isFunction:function(E){return s.call(E)==="[object Function]"},isArray:function(E){return s.call(E)==="[object Array]"},isXMLDoc:function(E){return E.nodeType===9&&E.documentElement.nodeName!=="HTML"||!!E.ownerDocument&&o.isXMLDoc(E.ownerDocument)},globalEval:function(G){if(G&&/\S/.test(G)){var F=document.getElementsByTagName("head")[0]||document.documentElement,E=document.createElement("script");E.type="text/javascript";if(o.support.scriptEval){E.appendChild(document.createTextNode(G))}else{E.text=G}F.insertBefore(E,F.firstChild);F.removeChild(E)}},nodeName:function(F,E){return F.nodeName&&F.nodeName.toUpperCase()==E.toUpperCase()},each:function(G,K,F){var E,H=0,I=G.length;if(F){if(I===g){for(E in G){if(K.apply(G[E],F)===false){break}}}else{for(;H<I;){if(K.apply(G[H++],F)===false){break}}}}else{if(I===g){for(E in G){if(K.call(G[E],E,G[E])===false){break}}}else{for(var J=G[0];H<I&&K.call(J,H,J)!==false;J=G[++H]){}}}return G},prop:function(H,I,G,F,E){if(o.isFunction(I)){I=I.call(H,F)}return typeof I==="number"&&G=="curCSS"&&!b.test(E)?I+"px":I},className:{add:function(E,F){o.each((F||"").split(/\s+/),function(G,H){if(E.nodeType==1&&!o.className.has(E.className,H)){E.className+=(E.className?" ":"")+H}})},remove:function(E,F){if(E.nodeType==1){E.className=F!==g?o.grep(E.className.split(/\s+/),function(G){return !o.className.has(F,G)}).join(" "):""}},has:function(F,E){return F&&o.inArray(E,(F.className||F).toString().split(/\s+/))>-1}},swap:function(H,G,I){var E={};for(var F in G){E[F]=H.style[F];H.style[F]=G[F]}I.call(H);for(var F in G){H.style[F]=E[F]}},css:function(H,F,J,E){if(F=="width"||F=="height"){var L,G={position:"absolute",visibility:"hidden",display:"block"},K=F=="width"?["Left","Right"]:["Top","Bottom"];function I(){L=F=="width"?H.offsetWidth:H.offsetHeight;if(E==="border"){return}o.each(K,function(){if(!E){L-=parseFloat(o.curCSS(H,"padding"+this,true))||0}if(E==="margin"){L+=parseFloat(o.curCSS(H,"margin"+this,true))||0}else{L-=parseFloat(o.curCSS(H,"border"+this+"Width",true))||0}})}if(H.offsetWidth!==0){I()}else{o.swap(H,G,I)}return Math.max(0,Math.round(L))}return o.curCSS(H,F,J)},curCSS:function(I,F,G){var L,E=I.style;if(F=="opacity"&&!o.support.opacity){L=o.attr(E,"opacity");return L==""?"1":L}if(F.match(/float/i)){F=w}if(!G&&E&&E[F]){L=E[F]}else{if(q.getComputedStyle){if(F.match(/float/i)){F="float"}F=F.replace(/([A-Z])/g,"-$1").toLowerCase();var M=q.getComputedStyle(I,null);if(M){L=M.getPropertyValue(F)}if(F=="opacity"&&L==""){L="1"}}else{if(I.currentStyle){var J=F.replace(/\-(\w)/g,function(N,O){return O.toUpperCase()});L=I.currentStyle[F]||I.currentStyle[J];if(!/^\d+(px)?$/i.test(L)&&/^\d/.test(L)){var H=E.left,K=I.runtimeStyle.left;I.runtimeStyle.left=I.currentStyle.left;E.left=L||0;L=E.pixelLeft+"px";E.left=H;I.runtimeStyle.left=K}}}}return L},clean:function(F,K,I){K=K||document;if(typeof K.createElement==="undefined"){K=K.ownerDocument||K[0]&&K[0].ownerDocument||document}if(!I&&F.length===1&&typeof F[0]==="string"){var H=/^<(\w+)\s*\/?>$/.exec(F[0]);if(H){return[K.createElement(H[1])]}}var G=[],E=[],L=K.createElement("div");o.each(F,function(P,S){if(typeof S==="number"){S+=""}if(!S){return}if(typeof S==="string"){S=S.replace(/(<(\w+)[^>]*?)\/>/g,function(U,V,T){return T.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?U:V+"></"+T+">"});var O=S.replace(/^\s+/,"").substring(0,10).toLowerCase();var Q=!O.indexOf("<opt")&&[1,"<select multiple='multiple'>","</select>"]||!O.indexOf("<leg")&&[1,"<fieldset>","</fieldset>"]||O.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"<table>","</table>"]||!O.indexOf("<tr")&&[2,"<table><tbody>","</tbody></table>"]||(!O.indexOf("<td")||!O.indexOf("<th"))&&[3,"<table><tbody><tr>","</tr></tbody></table>"]||!O.indexOf("<col")&&[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"]||!o.support.htmlSerialize&&[1,"div<div>","</div>"]||[0,"",""];L.innerHTML=Q[1]+S+Q[2];while(Q[0]--){L=L.lastChild}if(!o.support.tbody){var R=/<tbody/i.test(S),N=!O.indexOf("<table")&&!R?L.firstChild&&L.firstChild.childNodes:Q[1]=="<table>"&&!R?L.childNodes:[];for(var M=N.length-1;M>=0;--M){if(o.nodeName(N[M],"tbody")&&!N[M].childNodes.length){N[M].parentNode.removeChild(N[M])}}}if(!o.support.leadingWhitespace&&/^\s/.test(S)){L.insertBefore(K.createTextNode(S.match(/^\s*/)[0]),L.firstChild)}S=o.makeArray(L.childNodes)}if(S.nodeType){G.push(S)}else{G=o.merge(G,S)}});if(I){for(var J=0;G[J];J++){if(o.nodeName(G[J],"script")&&(!G[J].type||G[J].type.toLowerCase()==="text/javascript")){E.push(G[J].parentNode?G[J].parentNode.removeChild(G[J]):G[J])}else{if(G[J].nodeType===1){G.splice.apply(G,[J+1,0].concat(o.makeArray(G[J].getElementsByTagName("script"))))}I.appendChild(G[J])}}return E}return G},attr:function(J,G,K){if(!J||J.nodeType==3||J.nodeType==8){return g}var H=!o.isXMLDoc(J),L=K!==g;G=H&&o.props[G]||G;if(J.tagName){var F=/href|src|style/.test(G);if(G=="selected"&&J.parentNode){J.parentNode.selectedIndex}if(G in J&&H&&!F){if(L){if(G=="type"&&o.nodeName(J,"input")&&J.parentNode){throw"type property can't be changed"}J[G]=K}if(o.nodeName(J,"form")&&J.getAttributeNode(G)){return J.getAttributeNode(G).nodeValue}if(G=="tabIndex"){var I=J.getAttributeNode("tabIndex");return I&&I.specified?I.value:J.nodeName.match(/(button|input|object|select|textarea)/i)?0:J.nodeName.match(/^(a|area)$/i)&&J.href?0:g}return J[G]}if(!o.support.style&&H&&G=="style"){return o.attr(J.style,"cssText",K)}if(L){J.setAttribute(G,""+K)}var E=!o.support.hrefNormalized&&H&&F?J.getAttribute(G,2):J.getAttribute(G);return E===null?g:E}if(!o.support.opacity&&G=="opacity"){if(L){J.zoom=1;J.filter=(J.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(K)+""=="NaN"?"":"alpha(opacity="+K*100+")")}return J.filter&&J.filter.indexOf("opacity=")>=0?(parseFloat(J.filter.match(/opacity=([^)]*)/)[1])/100)+"":""}G=G.replace(/-([a-z])/ig,function(M,N){return N.toUpperCase()});if(L){J[G]=K}return J[G]},trim:function(E){return(E||"").replace(/^\s+|\s+$/g,"")},makeArray:function(G){var E=[];if(G!=null){var F=G.length;if(F==null||typeof G==="string"||o.isFunction(G)||G.setInterval){E[0]=G}else{while(F){E[--F]=G[F]}}}return E},inArray:function(G,H){for(var E=0,F=H.length;E<F;E++){if(H[E]===G){return E}}return -1},merge:function(H,E){var F=0,G,I=H.length;if(!o.support.getAll){while((G=E[F++])!=null){if(G.nodeType!=8){H[I++]=G}}}else{while((G=E[F++])!=null){H[I++]=G}}return H},unique:function(K){var F=[],E={};try{for(var G=0,H=K.length;G<H;G++){var J=o.data(K[G]);if(!E[J]){E[J]=true;F.push(K[G])}}}catch(I){F=K}return F},grep:function(F,J,E){var G=[];for(var H=0,I=F.length;H<I;H++){if(!E!=!J(F[H],H)){G.push(F[H])}}return G},map:function(E,J){var F=[];for(var G=0,H=E.length;G<H;G++){var I=J(E[G],G);if(I!=null){F[F.length]=I}}return F.concat.apply([],F)}});var C=navigator.userAgent.toLowerCase();o.browser={version:(C.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[0,"0"])[1],safari:/webkit/.test(C),opera:/opera/.test(C),msie:/msie/.test(C)&&!/opera/.test(C),mozilla:/mozilla/.test(C)&&!/(compatible|webkit)/.test(C)};o.each({parent:function(E){return E.parentNode},parents:function(E){return o.dir(E,"parentNode")},next:function(E){return o.nth(E,2,"nextSibling")},prev:function(E){return o.nth(E,2,"previousSibling")},nextAll:function(E){return o.dir(E,"nextSibling")},prevAll:function(E){return o.dir(E,"previousSibling")},siblings:function(E){return o.sibling(E.parentNode.firstChild,E)},children:function(E){return o.sibling(E.firstChild)},contents:function(E){return o.nodeName(E,"iframe")?E.contentDocument||E.contentWindow.document:o.makeArray(E.childNodes)}},function(E,F){o.fn[E]=function(G){var H=o.map(this,F);if(G&&typeof G=="string"){H=o.multiFilter(G,H)}return this.pushStack(o.unique(H),E,G)}});o.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(E,F){o.fn[E]=function(G){var J=[],L=o(G);for(var K=0,H=L.length;K<H;K++){
+var I=(K>0?this.clone(true):this).get();o.fn[F].apply(o(L[K]),I);J=J.concat(I)}return this.pushStack(J,E,G)}});o.each({removeAttr:function(E){o.attr(this,E,"");if(this.nodeType==1){this.removeAttribute(E)}},addClass:function(E){o.className.add(this,E)},removeClass:function(E){o.className.remove(this,E)},toggleClass:function(F,E){if(typeof E!=="boolean"){E=!o.className.has(this,F)}o.className[E?"add":"remove"](this,F)},remove:function(E){if(!E||o.filter(E,[this]).length){o("*",this).add([this]).each(function(){o.event.remove(this);o.removeData(this)});if(this.parentNode){this.parentNode.removeChild(this)}}},empty:function(){o(this).children().remove();while(this.firstChild){this.removeChild(this.firstChild)}}},function(E,F){o.fn[E]=function(){return this.each(F,arguments)}});function j(E,F){return E[0]&&parseInt(o.curCSS(E[0],F,true),10)||0}var h="jQuery"+e(),v=0,A={};o.extend({cache:{},data:function(F,E,G){F=F==l?A:F;var H=F[h];if(!H){H=F[h]=++v}if(E&&!o.cache[H]){o.cache[H]={}}if(G!==g){o.cache[H][E]=G}return E?o.cache[H][E]:H},removeData:function(F,E){F=F==l?A:F;var H=F[h];if(E){if(o.cache[H]){delete o.cache[H][E];E="";for(E in o.cache[H]){break}if(!E){o.removeData(F)}}}else{try{delete F[h]}catch(G){if(F.removeAttribute){F.removeAttribute(h)}}delete o.cache[H]}},queue:function(F,E,H){if(F){E=(E||"fx")+"queue";var G=o.data(F,E);if(!G||o.isArray(H)){G=o.data(F,E,o.makeArray(H))}else{if(H){G.push(H)}}}return G},dequeue:function(H,G){var E=o.queue(H,G),F=E.shift();if(!G||G==="fx"){F=E[0]}if(F!==g){F.call(H)}}});o.fn.extend({data:function(E,G){var H=E.split(".");H[1]=H[1]?"."+H[1]:"";if(G===g){var F=this.triggerHandler("getData"+H[1]+"!",[H[0]]);if(F===g&&this.length){F=o.data(this[0],E)}return F===g&&H[1]?this.data(H[0]):F}else{return this.trigger("setData"+H[1]+"!",[H[0],G]).each(function(){o.data(this,E,G)})}},removeData:function(E){return this.each(function(){o.removeData(this,E)})},queue:function(E,F){if(typeof E!=="string"){F=E;E="fx"}if(F===g){return o.queue(this[0],E)}return this.each(function(){var G=o.queue(this,E,F);if(E=="fx"&&G.length==1){G[0].call(this)}})},dequeue:function(E){return this.each(function(){o.dequeue(this,E)})}});
+/*
+ * Sizzle CSS Selector Engine - v0.9.3
+ *  Copyright 2009, The Dojo Foundation
+ *  Released under the MIT, BSD, and GPL Licenses.
+ *  More information: http://sizzlejs.com/
+ */
+(function(){var R=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?/g,L=0,H=Object.prototype.toString;var F=function(Y,U,ab,ac){ab=ab||[];U=U||document;if(U.nodeType!==1&&U.nodeType!==9){return[]}if(!Y||typeof Y!=="string"){return ab}var Z=[],W,af,ai,T,ad,V,X=true;R.lastIndex=0;while((W=R.exec(Y))!==null){Z.push(W[1]);if(W[2]){V=RegExp.rightContext;break}}if(Z.length>1&&M.exec(Y)){if(Z.length===2&&I.relative[Z[0]]){af=J(Z[0]+Z[1],U)}else{af=I.relative[Z[0]]?[U]:F(Z.shift(),U);while(Z.length){Y=Z.shift();if(I.relative[Y]){Y+=Z.shift()}af=J(Y,af)}}}else{var ae=ac?{expr:Z.pop(),set:E(ac)}:F.find(Z.pop(),Z.length===1&&U.parentNode?U.parentNode:U,Q(U));af=F.filter(ae.expr,ae.set);if(Z.length>0){ai=E(af)}else{X=false}while(Z.length){var ah=Z.pop(),ag=ah;if(!I.relative[ah]){ah=""}else{ag=Z.pop()}if(ag==null){ag=U}I.relative[ah](ai,ag,Q(U))}}if(!ai){ai=af}if(!ai){throw"Syntax error, unrecognized expression: "+(ah||Y)}if(H.call(ai)==="[object Array]"){if(!X){ab.push.apply(ab,ai)}else{if(U.nodeType===1){for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&(ai[aa]===true||ai[aa].nodeType===1&&K(U,ai[aa]))){ab.push(af[aa])}}}else{for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&ai[aa].nodeType===1){ab.push(af[aa])}}}}}else{E(ai,ab)}if(V){F(V,U,ab,ac);if(G){hasDuplicate=false;ab.sort(G);if(hasDuplicate){for(var aa=1;aa<ab.length;aa++){if(ab[aa]===ab[aa-1]){ab.splice(aa--,1)}}}}}return ab};F.matches=function(T,U){return F(T,null,null,U)};F.find=function(aa,T,ab){var Z,X;if(!aa){return[]}for(var W=0,V=I.order.length;W<V;W++){var Y=I.order[W],X;if((X=I.match[Y].exec(aa))){var U=RegExp.leftContext;if(U.substr(U.length-1)!=="\\"){X[1]=(X[1]||"").replace(/\\/g,"");Z=I.find[Y](X,T,ab);if(Z!=null){aa=aa.replace(I.match[Y],"");break}}}}if(!Z){Z=T.getElementsByTagName("*")}return{set:Z,expr:aa}};F.filter=function(ad,ac,ag,W){var V=ad,ai=[],aa=ac,Y,T,Z=ac&&ac[0]&&Q(ac[0]);while(ad&&ac.length){for(var ab in I.filter){if((Y=I.match[ab].exec(ad))!=null){var U=I.filter[ab],ah,af;T=false;if(aa==ai){ai=[]}if(I.preFilter[ab]){Y=I.preFilter[ab](Y,aa,ag,ai,W,Z);if(!Y){T=ah=true}else{if(Y===true){continue}}}if(Y){for(var X=0;(af=aa[X])!=null;X++){if(af){ah=U(af,Y,X,aa);var ae=W^!!ah;if(ag&&ah!=null){if(ae){T=true}else{aa[X]=false}}else{if(ae){ai.push(af);T=true}}}}}if(ah!==g){if(!ag){aa=ai}ad=ad.replace(I.match[ab],"");if(!T){return[]}break}}}if(ad==V){if(T==null){throw"Syntax error, unrecognized expression: "+ad}else{break}}V=ad}return aa};var I=F.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF_-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF_-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*_-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF_-]|\\.)+)(?:\((['"]*)((?:\([^\)]+\)|[^\2\(\)]*)+)\2\))?/},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(T){return T.getAttribute("href")}},relative:{"+":function(aa,T,Z){var X=typeof T==="string",ab=X&&!/\W/.test(T),Y=X&&!ab;if(ab&&!Z){T=T.toUpperCase()}for(var W=0,V=aa.length,U;W<V;W++){if((U=aa[W])){while((U=U.previousSibling)&&U.nodeType!==1){}aa[W]=Y||U&&U.nodeName===T?U||false:U===T}}if(Y){F.filter(T,aa,true)}},">":function(Z,U,aa){var X=typeof U==="string";if(X&&!/\W/.test(U)){U=aa?U:U.toUpperCase();for(var V=0,T=Z.length;V<T;V++){var Y=Z[V];if(Y){var W=Y.parentNode;Z[V]=W.nodeName===U?W:false}}}else{for(var V=0,T=Z.length;V<T;V++){var Y=Z[V];if(Y){Z[V]=X?Y.parentNode:Y.parentNode===U}}if(X){F.filter(U,Z,true)}}},"":function(W,U,Y){var V=L++,T=S;if(!U.match(/\W/)){var X=U=Y?U:U.toUpperCase();T=P}T("parentNode",U,V,W,X,Y)},"~":function(W,U,Y){var V=L++,T=S;if(typeof U==="string"&&!U.match(/\W/)){var X=U=Y?U:U.toUpperCase();T=P}T("previousSibling",U,V,W,X,Y)}},find:{ID:function(U,V,W){if(typeof V.getElementById!=="undefined"&&!W){var T=V.getElementById(U[1]);return T?[T]:[]}},NAME:function(V,Y,Z){if(typeof Y.getElementsByName!=="undefined"){var U=[],X=Y.getElementsByName(V[1]);for(var W=0,T=X.length;W<T;W++){if(X[W].getAttribute("name")===V[1]){U.push(X[W])}}return U.length===0?null:U}},TAG:function(T,U){return U.getElementsByTagName(T[1])}},preFilter:{CLASS:function(W,U,V,T,Z,aa){W=" "+W[1].replace(/\\/g,"")+" ";if(aa){return W}for(var X=0,Y;(Y=U[X])!=null;X++){if(Y){if(Z^(Y.className&&(" "+Y.className+" ").indexOf(W)>=0)){if(!V){T.push(Y)}}else{if(V){U[X]=false}}}}return false},ID:function(T){return T[1].replace(/\\/g,"")},TAG:function(U,T){for(var V=0;T[V]===false;V++){}return T[V]&&Q(T[V])?U[1]:U[1].toUpperCase()},CHILD:function(T){if(T[1]=="nth"){var U=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(T[2]=="even"&&"2n"||T[2]=="odd"&&"2n+1"||!/\D/.test(T[2])&&"0n+"+T[2]||T[2]);T[2]=(U[1]+(U[2]||1))-0;T[3]=U[3]-0}T[0]=L++;return T},ATTR:function(X,U,V,T,Y,Z){var W=X[1].replace(/\\/g,"");if(!Z&&I.attrMap[W]){X[1]=I.attrMap[W]}if(X[2]==="~="){X[4]=" "+X[4]+" "}return X},PSEUDO:function(X,U,V,T,Y){if(X[1]==="not"){if(X[3].match(R).length>1||/^\w/.test(X[3])){X[3]=F(X[3],null,null,U)}else{var W=F.filter(X[3],U,V,true^Y);if(!V){T.push.apply(T,W)}return false}}else{if(I.match.POS.test(X[0])||I.match.CHILD.test(X[0])){return true}}return X},POS:function(T){T.unshift(true);return T}},filters:{enabled:function(T){return T.disabled===false&&T.type!=="hidden"},disabled:function(T){return T.disabled===true},checked:function(T){return T.checked===true},selected:function(T){T.parentNode.selectedIndex;return T.selected===true},parent:function(T){return !!T.firstChild},empty:function(T){return !T.firstChild},has:function(V,U,T){return !!F(T[3],V).length},header:function(T){return/h\d/i.test(T.nodeName)},text:function(T){return"text"===T.type},radio:function(T){return"radio"===T.type},checkbox:function(T){return"checkbox"===T.type},file:function(T){return"file"===T.type},password:function(T){return"password"===T.type},submit:function(T){return"submit"===T.type},image:function(T){return"image"===T.type},reset:function(T){return"reset"===T.type},button:function(T){return"button"===T.type||T.nodeName.toUpperCase()==="BUTTON"},input:function(T){return/input|select|textarea|button/i.test(T.nodeName)}},setFilters:{first:function(U,T){return T===0},last:function(V,U,T,W){return U===W.length-1},even:function(U,T){return T%2===0},odd:function(U,T){return T%2===1},lt:function(V,U,T){return U<T[3]-0},gt:function(V,U,T){return U>T[3]-0},nth:function(V,U,T){return T[3]-0==U},eq:function(V,U,T){return T[3]-0==U}},filter:{PSEUDO:function(Z,V,W,aa){var U=V[1],X=I.filters[U];if(X){return X(Z,W,V,aa)}else{if(U==="contains"){return(Z.textContent||Z.innerText||"").indexOf(V[3])>=0}else{if(U==="not"){var Y=V[3];for(var W=0,T=Y.length;W<T;W++){if(Y[W]===Z){return false}}return true}}}},CHILD:function(T,W){var Z=W[1],U=T;switch(Z){case"only":case"first":while(U=U.previousSibling){if(U.nodeType===1){return false}}if(Z=="first"){return true}U=T;case"last":while(U=U.nextSibling){if(U.nodeType===1){return false}}return true;case"nth":var V=W[2],ac=W[3];if(V==1&&ac==0){return true}var Y=W[0],ab=T.parentNode;if(ab&&(ab.sizcache!==Y||!T.nodeIndex)){var X=0;for(U=ab.firstChild;U;U=U.nextSibling){if(U.nodeType===1){U.nodeIndex=++X}}ab.sizcache=Y}var aa=T.nodeIndex-ac;if(V==0){return aa==0}else{return(aa%V==0&&aa/V>=0)}}},ID:function(U,T){return U.nodeType===1&&U.getAttribute("id")===T},TAG:function(U,T){return(T==="*"&&U.nodeType===1)||U.nodeName===T},CLASS:function(U,T){return(" "+(U.className||U.getAttribute("class"))+" ").indexOf(T)>-1},ATTR:function(Y,W){var V=W[1],T=I.attrHandle[V]?I.attrHandle[V](Y):Y[V]!=null?Y[V]:Y.getAttribute(V),Z=T+"",X=W[2],U=W[4];return T==null?X==="!=":X==="="?Z===U:X==="*="?Z.indexOf(U)>=0:X==="~="?(" "+Z+" ").indexOf(U)>=0:!U?Z&&T!==false:X==="!="?Z!=U:X==="^="?Z.indexOf(U)===0:X==="$="?Z.substr(Z.length-U.length)===U:X==="|="?Z===U||Z.substr(0,U.length+1)===U+"-":false},POS:function(X,U,V,Y){var T=U[2],W=I.setFilters[T];if(W){return W(X,V,U,Y)}}}};var M=I.match.POS;for(var O in I.match){I.match[O]=RegExp(I.match[O].source+/(?![^\[]*\])(?![^\(]*\))/.source)}var E=function(U,T){U=Array.prototype.slice.call(U);if(T){T.push.apply(T,U);return T}return U};try{Array.prototype.slice.call(document.documentElement.childNodes)}catch(N){E=function(X,W){var U=W||[];if(H.call(X)==="[object Array]"){Array.prototype.push.apply(U,X)}else{if(typeof X.length==="number"){for(var V=0,T=X.length;V<T;V++){U.push(X[V])}}else{for(var V=0;X[V];V++){U.push(X[V])}}}return U}}var G;if(document.documentElement.compareDocumentPosition){G=function(U,T){var V=U.compareDocumentPosition(T)&4?-1:U===T?0:1;if(V===0){hasDuplicate=true}return V}}else{if("sourceIndex" in document.documentElement){G=function(U,T){var V=U.sourceIndex-T.sourceIndex;if(V===0){hasDuplicate=true}return V}}else{if(document.createRange){G=function(W,U){var V=W.ownerDocument.createRange(),T=U.ownerDocument.createRange();V.selectNode(W);V.collapse(true);T.selectNode(U);T.collapse(true);var X=V.compareBoundaryPoints(Range.START_TO_END,T);if(X===0){hasDuplicate=true}return X}}}}(function(){var U=document.createElement("form"),V="script"+(new Date).getTime();U.innerHTML="<input name='"+V+"'/>";var T=document.documentElement;T.insertBefore(U,T.firstChild);if(!!document.getElementById(V)){I.find.ID=function(X,Y,Z){if(typeof Y.getElementById!=="undefined"&&!Z){var W=Y.getElementById(X[1]);return W?W.id===X[1]||typeof W.getAttributeNode!=="undefined"&&W.getAttributeNode("id").nodeValue===X[1]?[W]:g:[]}};I.filter.ID=function(Y,W){var X=typeof Y.getAttributeNode!=="undefined"&&Y.getAttributeNode("id");return Y.nodeType===1&&X&&X.nodeValue===W}}T.removeChild(U)})();(function(){var T=document.createElement("div");T.appendChild(document.createComment(""));if(T.getElementsByTagName("*").length>0){I.find.TAG=function(U,Y){var X=Y.getElementsByTagName(U[1]);if(U[1]==="*"){var W=[];for(var V=0;X[V];V++){if(X[V].nodeType===1){W.push(X[V])}}X=W}return X}}T.innerHTML="<a href='#'></a>";if(T.firstChild&&typeof T.firstChild.getAttribute!=="undefined"&&T.firstChild.getAttribute("href")!=="#"){I.attrHandle.href=function(U){return U.getAttribute("href",2)}}})();if(document.querySelectorAll){(function(){var T=F,U=document.createElement("div");U.innerHTML="<p class='TEST'></p>";if(U.querySelectorAll&&U.querySelectorAll(".TEST").length===0){return}F=function(Y,X,V,W){X=X||document;if(!W&&X.nodeType===9&&!Q(X)){try{return E(X.querySelectorAll(Y),V)}catch(Z){}}return T(Y,X,V,W)};F.find=T.find;F.filter=T.filter;F.selectors=T.selectors;F.matches=T.matches})()}if(document.getElementsByClassName&&document.documentElement.getElementsByClassName){(function(){var T=document.createElement("div");T.innerHTML="<div class='test e'></div><div class='test'></div>";if(T.getElementsByClassName("e").length===0){return}T.lastChild.className="e";if(T.getElementsByClassName("e").length===1){return}I.order.splice(1,0,"CLASS");I.find.CLASS=function(U,V,W){if(typeof V.getElementsByClassName!=="undefined"&&!W){return V.getElementsByClassName(U[1])}}})()}function P(U,Z,Y,ad,aa,ac){var ab=U=="previousSibling"&&!ac;for(var W=0,V=ad.length;W<V;W++){var T=ad[W];if(T){if(ab&&T.nodeType===1){T.sizcache=Y;T.sizset=W}T=T[U];var X=false;while(T){if(T.sizcache===Y){X=ad[T.sizset];break}if(T.nodeType===1&&!ac){T.sizcache=Y;T.sizset=W}if(T.nodeName===Z){X=T;break}T=T[U]}ad[W]=X}}}function S(U,Z,Y,ad,aa,ac){var ab=U=="previousSibling"&&!ac;for(var W=0,V=ad.length;W<V;W++){var T=ad[W];if(T){if(ab&&T.nodeType===1){T.sizcache=Y;T.sizset=W}T=T[U];var X=false;while(T){if(T.sizcache===Y){X=ad[T.sizset];break}if(T.nodeType===1){if(!ac){T.sizcache=Y;T.sizset=W}if(typeof Z!=="string"){if(T===Z){X=true;break}}else{if(F.filter(Z,[T]).length>0){X=T;break}}}T=T[U]}ad[W]=X}}}var K=document.compareDocumentPosition?function(U,T){return U.compareDocumentPosition(T)&16}:function(U,T){return U!==T&&(U.contains?U.contains(T):true)};var Q=function(T){return T.nodeType===9&&T.documentElement.nodeName!=="HTML"||!!T.ownerDocument&&Q(T.ownerDocument)};var J=function(T,aa){var W=[],X="",Y,V=aa.nodeType?[aa]:aa;while((Y=I.match.PSEUDO.exec(T))){X+=Y[0];T=T.replace(I.match.PSEUDO,"")}T=I.relative[T]?T+"*":T;for(var Z=0,U=V.length;Z<U;Z++){F(T,V[Z],W)}return F.filter(X,W)};o.find=F;o.filter=F.filter;o.expr=F.selectors;o.expr[":"]=o.expr.filters;F.selectors.filters.hidden=function(T){return T.offsetWidth===0||T.offsetHeight===0};F.selectors.filters.visible=function(T){return T.offsetWidth>0||T.offsetHeight>0};F.selectors.filters.animated=function(T){return o.grep(o.timers,function(U){return T===U.elem}).length};o.multiFilter=function(V,T,U){if(U){V=":not("+V+")"}return F.matches(V,T)};o.dir=function(V,U){var T=[],W=V[U];while(W&&W!=document){if(W.nodeType==1){T.push(W)}W=W[U]}return T};o.nth=function(X,T,V,W){T=T||1;var U=0;for(;X;X=X[V]){if(X.nodeType==1&&++U==T){break}}return X};o.sibling=function(V,U){var T=[];for(;V;V=V.nextSibling){if(V.nodeType==1&&V!=U){T.push(V)}}return T};return;l.Sizzle=F})();o.event={add:function(I,F,H,K){if(I.nodeType==3||I.nodeType==8){return}if(I.setInterval&&I!=l){I=l}if(!H.guid){H.guid=this.guid++}if(K!==g){var G=H;H=this.proxy(G);H.data=K}var E=o.data(I,"events")||o.data(I,"events",{}),J=o.data(I,"handle")||o.data(I,"handle",function(){return typeof o!=="undefined"&&!o.event.triggered?o.event.handle.apply(arguments.callee.elem,arguments):g});J.elem=I;o.each(F.split(/\s+/),function(M,N){var O=N.split(".");N=O.shift();H.type=O.slice().sort().join(".");var L=E[N];if(o.event.specialAll[N]){o.event.specialAll[N].setup.call(I,K,O)}if(!L){L=E[N]={};if(!o.event.special[N]||o.event.special[N].setup.call(I,K,O)===false){if(I.addEventListener){I.addEventListener(N,J,false)}else{if(I.attachEvent){I.attachEvent("on"+N,J)}}}}L[H.guid]=H;o.event.global[N]=true});I=null},guid:1,global:{},remove:function(K,H,J){if(K.nodeType==3||K.nodeType==8){return}var G=o.data(K,"events"),F,E;if(G){if(H===g||(typeof H==="string"&&H.charAt(0)==".")){for(var I in G){this.remove(K,I+(H||""))}}else{if(H.type){J=H.handler;H=H.type}o.each(H.split(/\s+/),function(M,O){var Q=O.split(".");O=Q.shift();var N=RegExp("(^|\\.)"+Q.slice().sort().join(".*\\.")+"(\\.|$)");if(G[O]){if(J){delete G[O][J.guid]}else{for(var P in G[O]){if(N.test(G[O][P].type)){delete G[O][P]}}}if(o.event.specialAll[O]){o.event.specialAll[O].teardown.call(K,Q)}for(F in G[O]){break}if(!F){if(!o.event.special[O]||o.event.special[O].teardown.call(K,Q)===false){if(K.removeEventListener){K.removeEventListener(O,o.data(K,"handle"),false)}else{if(K.detachEvent){K.detachEvent("on"+O,o.data(K,"handle"))}}}F=null;delete G[O]}}})}for(F in G){break}if(!F){var L=o.data(K,"handle");if(L){L.elem=null}o.removeData(K,"events");o.removeData(K,"handle")}}},trigger:function(I,K,H,E){var G=I.type||I;if(!E){I=typeof I==="object"?I[h]?I:o.extend(o.Event(G),I):o.Event(G);if(G.indexOf("!")>=0)
+{I.type=G=G.slice(0,-1);I.exclusive=true}if(!H){I.stopPropagation();if(this.global[G]){o.each(o.cache,function(){if(this.events&&this.events[G]){o.event.trigger(I,K,this.handle.elem)}})}}if(!H||H.nodeType==3||H.nodeType==8){return g}I.result=g;I.target=H;K=o.makeArray(K);K.unshift(I)}I.currentTarget=H;var J=o.data(H,"handle");if(J){J.apply(H,K)}if((!H[G]||(o.nodeName(H,"a")&&G=="click"))&&H["on"+G]&&H["on"+G].apply(H,K)===false){I.result=false}if(!E&&H[G]&&!I.isDefaultPrevented()&&!(o.nodeName(H,"a")&&G=="click")){this.triggered=true;try{H[G]()}catch(L){}}this.triggered=false;if(!I.isPropagationStopped()){var F=H.parentNode||H.ownerDocument;if(F){o.event.trigger(I,K,F,true)}}},handle:function(K){var J,E;K=arguments[0]=o.event.fix(K||l.event);K.currentTarget=this;var L=K.type.split(".");K.type=L.shift();J=!L.length&&!K.exclusive;var I=RegExp("(^|\\.)"+L.slice().sort().join(".*\\.")+"(\\.|$)");E=(o.data(this,"events")||{})[K.type];for(var G in E){var H=E[G];if(J||I.test(H.type)){K.handler=H;K.data=H.data;var F=H.apply(this,arguments);if(F!==g){K.result=F;if(F===false){K.preventDefault();K.stopPropagation()}}if(K.isImmediatePropagationStopped()){break}}}},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(H){if(H[h]){return H}var F=H;H=o.Event(F);for(var G=this.props.length,J;G;){J=this.props[--G];H[J]=F[J]}if(!H.target){H.target=H.srcElement||document}if(H.target.nodeType==3){H.target=H.target.parentNode}if(!H.relatedTarget&&H.fromElement){H.relatedTarget=H.fromElement==H.target?H.toElement:H.fromElement}if(H.pageX==null&&H.clientX!=null){var I=document.documentElement,E=document.body;H.pageX=H.clientX+(I&&I.scrollLeft||E&&E.scrollLeft||0)-(I.clientLeft||0);H.pageY=H.clientY+(I&&I.scrollTop||E&&E.scrollTop||0)-(I.clientTop||0)}if(!H.which&&((H.charCode||H.charCode===0)?H.charCode:H.keyCode)){H.which=H.charCode||H.keyCode}if(!H.metaKey&&H.ctrlKey){H.metaKey=H.ctrlKey}if(!H.which&&H.button){H.which=(H.button&1?1:(H.button&2?3:(H.button&4?2:0)))}return H},proxy:function(F,E){E=E||function(){return F.apply(this,arguments)};E.guid=F.guid=F.guid||E.guid||this.guid++;return E},special:{ready:{setup:B,teardown:function(){}}},specialAll:{live:{setup:function(E,F){o.event.add(this,F[0],c)},teardown:function(G){if(G.length){var E=0,F=RegExp("(^|\\.)"+G[0]+"(\\.|$)");o.each((o.data(this,"events").live||{}),function(){if(F.test(this.type)){E++}});if(E<1){o.event.remove(this,G[0],c)}}}}}};o.Event=function(E){if(!this.preventDefault){return new o.Event(E)}if(E&&E.type){this.originalEvent=E;this.type=E.type}else{this.type=E}this.timeStamp=e();this[h]=true};function k(){return false}function u(){return true}o.Event.prototype={preventDefault:function(){this.isDefaultPrevented=u;var E=this.originalEvent;if(!E){return}if(E.preventDefault){E.preventDefault()}E.returnValue=false},stopPropagation:function(){this.isPropagationStopped=u;var E=this.originalEvent;if(!E){return}if(E.stopPropagation){E.stopPropagation()}E.cancelBubble=true},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=u;this.stopPropagation()},isDefaultPrevented:k,isPropagationStopped:k,isImmediatePropagationStopped:k};var a=function(F){var E=F.relatedTarget;while(E&&E!=this){try{E=E.parentNode}catch(G){E=this}}if(E!=this){F.type=F.data;o.event.handle.apply(this,arguments)}};o.each({mouseover:"mouseenter",mouseout:"mouseleave"},function(F,E){o.event.special[E]={setup:function(){o.event.add(this,F,a,E)},teardown:function(){o.event.remove(this,F,a)}}});o.fn.extend({bind:function(F,G,E){return F=="unload"?this.one(F,G,E):this.each(function(){o.event.add(this,F,E||G,E&&G)})},one:function(G,H,F){var E=o.event.proxy(F||H,function(I){o(this).unbind(I,E);return(F||H).apply(this,arguments)});return this.each(function(){o.event.add(this,G,E,F&&H)})},unbind:function(F,E){return this.each(function(){o.event.remove(this,F,E)})},trigger:function(E,F){return this.each(function(){o.event.trigger(E,F,this)})},triggerHandler:function(E,G){if(this[0]){var F=o.Event(E);F.preventDefault();F.stopPropagation();o.event.trigger(F,G,this[0]);return F.result}},toggle:function(G){var E=arguments,F=1;while(F<E.length){o.event.proxy(G,E[F++])}return this.click(o.event.proxy(G,function(H){this.lastToggle=(this.lastToggle||0)%F;H.preventDefault();return E[this.lastToggle++].apply(this,arguments)||false}))},hover:function(E,F){return this.mouseenter(E).mouseleave(F)},ready:function(E){B();if(o.isReady){E.call(document,o)}else{o.readyList.push(E)}return this},live:function(G,F){var E=o.event.proxy(F);E.guid+=this.selector+G;o(document).bind(i(G,this.selector),this.selector,E);return this},die:function(F,E){o(document).unbind(i(F,this.selector),E?{guid:E.guid+this.selector+F}:null);return this}});function c(H){var E=RegExp("(^|\\.)"+H.type+"(\\.|$)"),G=true,F=[];o.each(o.data(this,"events").live||[],function(I,J){if(E.test(J.type)){var K=o(H.target).closest(J.data)[0];if(K){F.push({elem:K,fn:J})}}});F.sort(function(J,I){return o.data(J.elem,"closest")-o.data(I.elem,"closest")});o.each(F,function(){if(this.fn.call(this.elem,H,this.fn.data)===false){return(G=false)}});return G}function i(F,E){return["live",F,E.replace(/\./g,"`").replace(/ /g,"|")].join(".")}o.extend({isReady:false,readyList:[],ready:function(){if(!o.isReady){o.isReady=true;if(o.readyList){o.each(o.readyList,function(){this.call(document,o)});o.readyList=null}o(document).triggerHandler("ready")}}});var x=false;function B(){if(x){return}x=true;if(document.addEventListener){document.addEventListener("DOMContentLoaded",function(){document.removeEventListener("DOMContentLoaded",arguments.callee,false);o.ready()},false)}else{if(document.attachEvent){document.attachEvent("onreadystatechange",function(){if(document.readyState==="complete"){document.detachEvent("onreadystatechange",arguments.callee);o.ready()}});if(document.documentElement.doScroll&&l==l.top){(function(){if(o.isReady){return}try{document.documentElement.doScroll("left")}catch(E){setTimeout(arguments.callee,0);return}o.ready()})()}}}o.event.add(l,"load",o.ready)}o.each(("blur,focus,load,resize,scroll,unload,click,dblclick,mousedown,mouseup,mousemove,mouseover,mouseout,mouseenter,mouseleave,change,select,submit,keydown,keypress,keyup,error").split(","),function(F,E){o.fn[E]=function(G){return G?this.bind(E,G):this.trigger(E)}});o(l).bind("unload",function(){for(var E in o.cache){if(E!=1&&o.cache[E].handle){o.event.remove(o.cache[E].handle.elem)}}});(function(){o.support={};var F=document.documentElement,G=document.createElement("script"),K=document.createElement("div"),J="script"+(new Date).getTime();K.style.display="none";K.innerHTML='   <link/><table></table><a href="/a" style="color:red;float:left;opacity:.5;">a</a><select><option>text</option></select><object><param/></object>';var H=K.getElementsByTagName("*"),E=K.getElementsByTagName("a")[0];if(!H||!H.length||!E){return}o.support={leadingWhitespace:K.firstChild.nodeType==3,tbody:!K.getElementsByTagName("tbody").length,objectAll:!!K.getElementsByTagName("object")[0].getElementsByTagName("*").length,htmlSerialize:!!K.getElementsByTagName("link").length,style:/red/.test(E.getAttribute("style")),hrefNormalized:E.getAttribute("href")==="/a",opacity:E.style.opacity==="0.5",cssFloat:!!E.style.cssFloat,scriptEval:false,noCloneEvent:true,boxModel:null};G.type="text/javascript";try{G.appendChild(document.createTextNode("window."+J+"=1;"))}catch(I){}F.insertBefore(G,F.firstChild);if(l[J]){o.support.scriptEval=true;delete l[J]}F.removeChild(G);if(K.attachEvent&&K.fireEvent){K.attachEvent("onclick",function(){o.support.noCloneEvent=false;K.detachEvent("onclick",arguments.callee)});K.cloneNode(true).fireEvent("onclick")}o(function(){var L=document.createElement("div");L.style.width=L.style.paddingLeft="1px";document.body.appendChild(L);o.boxModel=o.support.boxModel=L.offsetWidth===2;document.body.removeChild(L).style.display="none"})})();var w=o.support.cssFloat?"cssFloat":"styleFloat";o.props={"for":"htmlFor","class":"className","float":w,cssFloat:w,styleFloat:w,readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",tabindex:"tabIndex"};o.fn.extend({_load:o.fn.load,load:function(G,J,K){if(typeof G!=="string"){return this._load(G)}var I=G.indexOf(" ");if(I>=0){var E=G.slice(I,G.length);G=G.slice(0,I)}var H="GET";if(J){if(o.isFunction(J)){K=J;J=null}else{if(typeof J==="object"){J=o.param(J);H="POST"}}}var F=this;o.ajax({url:G,type:H,dataType:"html",data:J,complete:function(M,L){if(L=="success"||L=="notmodified"){F.html(E?o("<div/>").append(M.responseText.replace(/<script(.|\s)*?\/script>/g,"")).find(E):M.responseText)}if(K){F.each(K,[M.responseText,L,M])}}});return this},serialize:function(){return o.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?o.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password|search/i.test(this.type))}).map(function(E,F){var G=o(this).val();return G==null?null:o.isArray(G)?o.map(G,function(I,H){return{name:F.name,value:I}}):{name:F.name,value:G}}).get()}});o.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(E,F){o.fn[F]=function(G){return this.bind(F,G)}});var r=e();o.extend({get:function(E,G,H,F){if(o.isFunction(G)){H=G;G=null}return o.ajax({type:"GET",url:E,data:G,success:H,dataType:F})},getScript:function(E,F){return o.get(E,null,F,"script")},getJSON:function(E,F,G){return o.get(E,F,G,"json")},post:function(E,G,H,F){if(o.isFunction(G)){H=G;G={}}return o.ajax({type:"POST",url:E,data:G,success:H,dataType:F})},ajaxSetup:function(E){o.extend(o.ajaxSettings,E)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return l.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest()},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(M){M=o.extend(true,M,o.extend(true,{},o.ajaxSettings,M));var W,F=/=\?(&|$)/g,R,V,G=M.type.toUpperCase();if(M.data&&M.processData&&typeof M.data!=="string"){M.data=o.param(M.data)}if(M.dataType=="jsonp"){if(G=="GET"){if(!M.url.match(F)){M.url+=(M.url.match(/\?/)?"&":"?")+(M.jsonp||"callback")+"=?"}}else{if(!M.data||!M.data.match(F)){M.data=(M.data?M.data+"&":"")+(M.jsonp||"callback")+"=?"}}M.dataType="json"}if(M.dataType=="json"&&(M.data&&M.data.match(F)||M.url.match(F))){W="jsonp"+r++;if(M.data){M.data=(M.data+"").replace(F,"="+W+"$1")}M.url=M.url.replace(F,"="+W+"$1");M.dataType="script";l[W]=function(X){V=X;I();L();l[W]=g;try{delete l[W]}catch(Y){}if(H){H.removeChild(T)}}}if(M.dataType=="script"&&M.cache==null){M.cache=false}if(M.cache===false&&G=="GET"){var E=e();var U=M.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+E+"$2");M.url=U+((U==M.url)?(M.url.match(/\?/)?"&":"?")+"_="+E:"")}if(M.data&&G=="GET"){M.url+=(M.url.match(/\?/)?"&":"?")+M.data;M.data=null}if(M.global&&!o.active++){o.event.trigger("ajaxStart")}var Q=/^(\w+:)?\/\/([^\/?#]+)/.exec(M.url);if(M.dataType=="script"&&G=="GET"&&Q&&(Q[1]&&Q[1]!=location.protocol||Q[2]!=location.host)){var H=document.getElementsByTagName("head")[0];var T=document.createElement("script");T.src=M.url;if(M.scriptCharset){T.charset=M.scriptCharset}if(!W){var O=false;T.onload=T.onreadystatechange=function(){if(!O&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){O=true;I();L();T.onload=T.onreadystatechange=null;H.removeChild(T)}}}H.appendChild(T);return g}var K=false;var J=M.xhr();if(M.username){J.open(G,M.url,M.async,M.username,M.password)}else{J.open(G,M.url,M.async)}try{if(M.data){J.setRequestHeader("Content-Type",M.contentType)}if(M.ifModified){J.setRequestHeader("If-Modified-Since",o.lastModified[M.url]||"Thu, 01 Jan 1970 00:00:00 GMT")}J.setRequestHeader("X-Requested-With","XMLHttpRequest");J.setRequestHeader("Accept",M.dataType&&M.accepts[M.dataType]?M.accepts[M.dataType]+", */*":M.accepts._default)}catch(S){}if(M.beforeSend&&M.beforeSend(J,M)===false){if(M.global&&!--o.active){o.event.trigger("ajaxStop")}J.abort();return false}if(M.global){o.event.trigger("ajaxSend",[J,M])}var N=function(X){if(J.readyState==0){if(P){clearInterval(P);P=null;if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}}else{if(!K&&J&&(J.readyState==4||X=="timeout")){K=true;if(P){clearInterval(P);P=null}R=X=="timeout"?"timeout":!o.httpSuccess(J)?"error":M.ifModified&&o.httpNotModified(J,M.url)?"notmodified":"success";if(R=="success"){try{V=o.httpData(J,M.dataType,M)}catch(Z){R="parsererror"}}if(R=="success"){var Y;try{Y=J.getResponseHeader("Last-Modified")}catch(Z){}if(M.ifModified&&Y){o.lastModified[M.url]=Y}if(!W){I()}}else{o.handleError(M,J,R)}L();if(X){J.abort()}if(M.async){J=null}}}};if(M.async){var P=setInterval(N,13);if(M.timeout>0){setTimeout(function(){if(J&&!K){N("timeout")}},M.timeout)}}try{J.send(M.data)}catch(S){o.handleError(M,J,null,S)}if(!M.async){N()}function I(){if(M.success){M.success(V,R)}if(M.global){o.event.trigger("ajaxSuccess",[J,M])}}function L(){if(M.complete){M.complete(J,R)}if(M.global){o.event.trigger("ajaxComplete",[J,M])}if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}return J},handleError:function(F,H,E,G){if(F.error){F.error(H,E,G)}if(F.global){o.event.trigger("ajaxError",[H,F,G])}},active:0,httpSuccess:function(F){try{return !F.status&&location.protocol=="file:"||(F.status>=200&&F.status<300)||F.status==304||F.status==1223}catch(E){}return false},httpNotModified:function(G,E){try{var H=G.getResponseHeader("Last-Modified");return G.status==304||H==o.lastModified[E]}catch(F){}return false},httpData:function(J,H,G){var F=J.getResponseHeader("content-type"),E=H=="xml"||!H&&F&&F.indexOf("xml")>=0,I=E?J.responseXML:J.responseText;if(E&&I.documentElement.tagName=="parsererror"){throw"parsererror"}if(G&&G.dataFilter){I=G.dataFilter(I,H)}if(typeof I==="string"){if(H=="script"){o.globalEval(I)}if(H=="json"){I=l["eval"]("("+I+")")}}return I},param:function(E){var G=[];function H(I,J){G[G.length]=encodeURIComponent(I)+"="+encodeURIComponent(J)}if(o.isArray(E)||E.jquery){o.each(E,function(){H(this.name,this.value)})}else{for(var F in E){if(o.isArray(E[F])){o.each(E[F],function(){H(F,this)})}else{H(F,o.isFunction(E[F])?E[F]():E[F])}}}return G.join("&").replace(/%20/g,"+")}});var m={},n,d=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];function t(F,E){var G={};o.each(d.concat.apply([],d.slice(0,E)),function()
+{G[this]=F});return G}o.fn.extend({show:function(J,L){if(J){return this.animate(t("show",3),J,L)}else{for(var H=0,F=this.length;H<F;H++){var E=o.data(this[H],"olddisplay");this[H].style.display=E||"";if(o.css(this[H],"display")==="none"){var G=this[H].tagName,K;if(m[G]){K=m[G]}else{var I=o("<"+G+" />").appendTo("body");K=I.css("display");if(K==="none"){K="block"}I.remove();m[G]=K}o.data(this[H],"olddisplay",K)}}for(var H=0,F=this.length;H<F;H++){this[H].style.display=o.data(this[H],"olddisplay")||""}return this}},hide:function(H,I){if(H){return this.animate(t("hide",3),H,I)}else{for(var G=0,F=this.length;G<F;G++){var E=o.data(this[G],"olddisplay");if(!E&&E!=="none"){o.data(this[G],"olddisplay",o.css(this[G],"display"))}}for(var G=0,F=this.length;G<F;G++){this[G].style.display="none"}return this}},_toggle:o.fn.toggle,toggle:function(G,F){var E=typeof G==="boolean";return o.isFunction(G)&&o.isFunction(F)?this._toggle.apply(this,arguments):G==null||E?this.each(function(){var H=E?G:o(this).is(":hidden");o(this)[H?"show":"hide"]()}):this.animate(t("toggle",3),G,F)},fadeTo:function(E,G,F){return this.animate({opacity:G},E,F)},animate:function(I,F,H,G){var E=o.speed(F,H,G);return this[E.queue===false?"each":"queue"](function(){var K=o.extend({},E),M,L=this.nodeType==1&&o(this).is(":hidden"),J=this;for(M in I){if(I[M]=="hide"&&L||I[M]=="show"&&!L){return K.complete.call(this)}if((M=="height"||M=="width")&&this.style){K.display=o.css(this,"display");K.overflow=this.style.overflow}}if(K.overflow!=null){this.style.overflow="hidden"}K.curAnim=o.extend({},I);o.each(I,function(O,S){var R=new o.fx(J,K,O);if(/toggle|show|hide/.test(S)){R[S=="toggle"?L?"show":"hide":S](I)}else{var Q=S.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),T=R.cur(true)||0;if(Q){var N=parseFloat(Q[2]),P=Q[3]||"px";if(P!="px"){J.style[O]=(N||1)+P;T=((N||1)/R.cur(true))*T;J.style[O]=T+P}if(Q[1]){N=((Q[1]=="-="?-1:1)*N)+T}R.custom(T,N,P)}else{R.custom(T,S,"")}}});return true})},stop:function(F,E){var G=o.timers;if(F){this.queue([])}this.each(function(){for(var H=G.length-1;H>=0;H--){if(G[H].elem==this){if(E){G[H](true)}G.splice(H,1)}}});if(!E){this.dequeue()}return this}});o.each({slideDown:t("show",1),slideUp:t("hide",1),slideToggle:t("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(E,F){o.fn[E]=function(G,H){return this.animate(F,G,H)}});o.extend({speed:function(G,H,F){var E=typeof G==="object"?G:{complete:F||!F&&H||o.isFunction(G)&&G,duration:G,easing:F&&H||H&&!o.isFunction(H)&&H};E.duration=o.fx.off?0:typeof E.duration==="number"?E.duration:o.fx.speeds[E.duration]||o.fx.speeds._default;E.old=E.complete;E.complete=function(){if(E.queue!==false){o(this).dequeue()}if(o.isFunction(E.old)){E.old.call(this)}};return E},easing:{linear:function(G,H,E,F){return E+F*G},swing:function(G,H,E,F){return((-Math.cos(G*Math.PI)/2)+0.5)*F+E}},timers:[],fx:function(F,E,G){this.options=E;this.elem=F;this.prop=G;if(!E.orig){E.orig={}}}});o.fx.prototype={update:function(){if(this.options.step){this.options.step.call(this.elem,this.now,this)}(o.fx.step[this.prop]||o.fx.step._default)(this);if((this.prop=="height"||this.prop=="width")&&this.elem.style){this.elem.style.display="block"}},cur:function(F){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null)){return this.elem[this.prop]}var E=parseFloat(o.css(this.elem,this.prop,F));return E&&E>-10000?E:parseFloat(o.curCSS(this.elem,this.prop))||0},custom:function(I,H,G){this.startTime=e();this.start=I;this.end=H;this.unit=G||this.unit||"px";this.now=this.start;this.pos=this.state=0;var E=this;function F(J){return E.step(J)}F.elem=this.elem;if(F()&&o.timers.push(F)&&!n){n=setInterval(function(){var K=o.timers;for(var J=0;J<K.length;J++){if(!K[J]()){K.splice(J--,1)}}if(!K.length){clearInterval(n);n=g}},13)}},show:function(){this.options.orig[this.prop]=o.attr(this.elem.style,this.prop);this.options.show=true;this.custom(this.prop=="width"||this.prop=="height"?1:0,this.cur());o(this.elem).show()},hide:function(){this.options.orig[this.prop]=o.attr(this.elem.style,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(H){var G=e();if(H||G>=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var E=true;for(var F in this.options.curAnim){if(this.options.curAnim[F]!==true){E=false}}if(E){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(o.css(this.elem,"display")=="none"){this.elem.style.display="block"}}if(this.options.hide){o(this.elem).hide()}if(this.options.hide||this.options.show){for(var I in this.options.curAnim){o.attr(this.elem.style,I,this.options.orig[I])}}this.options.complete.call(this.elem)}return false}else{var J=G-this.startTime;this.state=J/this.options.duration;this.pos=o.easing[this.options.easing||(o.easing.swing?"swing":"linear")](this.state,J,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update()}return true}};o.extend(o.fx,{speeds:{slow:600,fast:200,_default:400},step:{opacity:function(E){o.attr(E.elem.style,"opacity",E.now)},_default:function(E){if(E.elem.style&&E.elem.style[E.prop]!=null){E.elem.style[E.prop]=E.now+E.unit}else{E.elem[E.prop]=E.now}}}});if(document.documentElement.getBoundingClientRect){o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}var G=this[0].getBoundingClientRect(),J=this[0].ownerDocument,F=J.body,E=J.documentElement,L=E.clientTop||F.clientTop||0,K=E.clientLeft||F.clientLeft||0,I=G.top+(self.pageYOffset||o.boxModel&&E.scrollTop||F.scrollTop)-L,H=G.left+(self.pageXOffset||o.boxModel&&E.scrollLeft||F.scrollLeft)-K;return{top:I,left:H}}}else{o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}o.offset.initialized||o.offset.initialize();var J=this[0],G=J.offsetParent,F=J,O=J.ownerDocument,M,H=O.documentElement,K=O.body,L=O.defaultView,E=L.getComputedStyle(J,null),N=J.offsetTop,I=J.offsetLeft;while((J=J.parentNode)&&J!==K&&J!==H){M=L.getComputedStyle(J,null);N-=J.scrollTop,I-=J.scrollLeft;if(J===G){N+=J.offsetTop,I+=J.offsetLeft;if(o.offset.doesNotAddBorder&&!(o.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(J.tagName))){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}F=G,G=J.offsetParent}if(o.offset.subtractsBorderForOverflowNotVisible&&M.overflow!=="visible"){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}E=M}if(E.position==="relative"||E.position==="static"){N+=K.offsetTop,I+=K.offsetLeft}if(E.position==="fixed"){N+=Math.max(H.scrollTop,K.scrollTop),I+=Math.max(H.scrollLeft,K.scrollLeft)}return{top:N,left:I}}}o.offset={initialize:function(){if(this.initialized){return}var L=document.body,F=document.createElement("div"),H,G,N,I,M,E,J=L.style.marginTop,K='<div style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;"><div></div></div><table style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;" cellpadding="0" cellspacing="0"><tr><td></td></tr></table>';M={position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"};for(E in M){F.style[E]=M[E]}F.innerHTML=K;L.insertBefore(F,L.firstChild);H=F.firstChild,G=H.firstChild,I=H.nextSibling.firstChild.firstChild;this.doesNotAddBorder=(G.offsetTop!==5);this.doesAddBorderForTableAndCells=(I.offsetTop===5);H.style.overflow="hidden",H.style.position="relative";this.subtractsBorderForOverflowNotVisible=(G.offsetTop===-5);L.style.marginTop="1px";this.doesNotIncludeMarginInBodyOffset=(L.offsetTop===0);L.style.marginTop=J;L.removeChild(F);this.initialized=true},bodyOffset:function(E){o.offset.initialized||o.offset.initialize();var G=E.offsetTop,F=E.offsetLeft;if(o.offset.doesNotIncludeMarginInBodyOffset){G+=parseInt(o.curCSS(E,"marginTop",true),10)||0,F+=parseInt(o.curCSS(E,"marginLeft",true),10)||0}return{top:G,left:F}}};o.fn.extend({position:function(){var I=0,H=0,F;if(this[0]){var G=this.offsetParent(),J=this.offset(),E=/^body|html$/i.test(G[0].tagName)?{top:0,left:0}:G.offset();J.top-=j(this,"marginTop");J.left-=j(this,"marginLeft");E.top+=j(G,"borderTopWidth");E.left+=j(G,"borderLeftWidth");F={top:J.top-E.top,left:J.left-E.left}}return F},offsetParent:function(){var E=this[0].offsetParent||document.body;while(E&&(!/^body|html$/i.test(E.tagName)&&o.css(E,"position")=="static")){E=E.offsetParent}return o(E)}});o.each(["Left","Top"],function(F,E){var G="scroll"+E;o.fn[G]=function(H){if(!this[0]){return null}return H!==g?this.each(function(){this==l||this==document?l.scrollTo(!F?H:o(l).scrollLeft(),F?H:o(l).scrollTop()):this[G]=H}):this[0]==l||this[0]==document?self[F?"pageYOffset":"pageXOffset"]||o.boxModel&&document.documentElement[G]||document.body[G]:this[0][G]}});o.each(["Height","Width"],function(I,G){var E=I?"Left":"Top",H=I?"Right":"Bottom",F=G.toLowerCase();o.fn["inner"+G]=function(){return this[0]?o.css(this[0],F,false,"padding"):null};o.fn["outer"+G]=function(K){return this[0]?o.css(this[0],F,false,K?"margin":"border"):null};var J=G.toLowerCase();o.fn[J]=function(K){return this[0]==l?document.compatMode=="CSS1Compat"&&document.documentElement["client"+G]||document.body["client"+G]:this[0]==document?Math.max(document.documentElement["client"+G],document.body["scroll"+G],document.documentElement["scroll"+G],document.body["offset"+G],document.documentElement["offset"+G]):K===g?(this.length?o.css(this[0],J):null):this.css(J,typeof K==="string"?K:K+"px")}})})();
+
+/*
+ * jQuery hashchange event - v1.3 - 7/21/2010
+ * http://benalman.com/projects/jquery-hashchange-plugin/
+ * 
+ * Copyright (c) 2010 "Cowboy" Ben Alman
+ * Dual licensed under the MIT and GPL licenses.
+ * http://benalman.com/about/license/
+ */
+(function($,e,b){var c="hashchange",h=document,f,g=$.event.special,i=h.documentMode,d="on"+c in e&&(i===b||i>7);function a(j){j=j||location.href;return"#"+j.replace(/^[^#]*#?(.*)$/,"$1")}$.fn[c]=function(j){return j?this.bind(c,j):this.trigger(c)};$.fn[c].delay=50;g[c]=$.extend(g[c],{setup:function(){if(d){return false}$(f.start)},teardown:function(){if(d){return false}$(f.stop)}});f=(function(){var j={},p,m=a(),k=function(q){return q},l=k,o=k;j.start=function(){p||n()};j.stop=function(){p&&clearTimeout(p);p=b};function n(){var r=a(),q=o(m);if(r!==m){l(m=r,q);$(e).trigger(c)}else{if(q!==m){location.href=location.href.replace(/#.*/,"")+q}}p=setTimeout(n,$.fn[c].delay)}$.browser.msie&&!d&&(function(){var q,r;j.start=function(){if(!q){r=$.fn[c].src;r=r&&r+a();q=$('<iframe tabindex="-1" title="empty"/>').hide().one("load",function(){r||l(a());n()}).attr("src",r||"javascript:0").insertAfter("body")[0].contentWindow;h.onpropertychange=function(){try{if(event.propertyName==="title"){q.document.title=h.title}}catch(s){}}}};j.stop=k;o=function(){return a(q.location.href)};l=function(v,s){var u=q.document,t=$.fn[c].domain;if(v!==s){u.title=h.title;u.open();t&&u.write('<script>document.domain="'+t+'"<\/script>');u.close();q.location.hash=v}}})();return j})()})(jQuery,this);
+/*
+ * jQuery UI 1.7.2
+ *
+ * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * http://docs.jquery.com/UI
+ */
+jQuery.ui||(function(c){var i=c.fn.remove,d=c.browser.mozilla&&(parseFloat(c.browser.version)<1.9);c.ui={version:"1.7.2",plugin:{add:function(k,l,n){var m=c.ui[k].prototype;for(var j in n){m.plugins[j]=m.plugins[j]||[];m.plugins[j].push([l,n[j]])}},call:function(j,l,k){var n=j.plugins[l];if(!n||!j.element[0].parentNode){return}for(var m=0;m<n.length;m++){if(j.options[n[m][0]]){n[m][1].apply(j.element,k)}}}},contains:function(k,j){return document.compareDocumentPosition?k.compareDocumentPosition(j)&16:k!==j&&k.contains(j)},hasScroll:function(m,k){if(c(m).css("overflow")=="hidden"){return false}var j=(k&&k=="left")?"scrollLeft":"scrollTop",l=false;if(m[j]>0){return true}m[j]=1;l=(m[j]>0);m[j]=0;return l},isOverAxis:function(k,j,l){return(k>j)&&(k<(j+l))},isOver:function(o,k,n,m,j,l){return c.ui.isOverAxis(o,n,j)&&c.ui.isOverAxis(k,m,l)},keyCode:{BACKSPACE:8,CAPS_LOCK:20,COMMA:188,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38}};if(d){var f=c.attr,e=c.fn.removeAttr,h="http://www.w3.org/2005/07/aaa",a=/^aria-/,b=/^wairole:/;c.attr=function(k,j,l){var m=l!==undefined;return(j=="role"?(m?f.call(this,k,j,"wairole:"+l):(f.apply(this,arguments)||"").replace(b,"")):(a.test(j)?(m?k.setAttributeNS(h,j.replace(a,"aaa:"),l):f.call(this,k,j.replace(a,"aaa:"))):f.apply(this,arguments)))};c.fn.removeAttr=function(j){return(a.test(j)?this.each(function(){this.removeAttributeNS(h,j.replace(a,""))}):e.call(this,j))}}c.fn.extend({remove:function(){c("*",this).add(this).each(function(){c(this).triggerHandler("remove")});return i.apply(this,arguments)},enableSelection:function(){return this.attr("unselectable","off").css("MozUserSelect","").unbind("selectstart.ui")},disableSelection:function(){return this.attr("unselectable","on").css("MozUserSelect","none").bind("selectstart.ui",function(){return false})},scrollParent:function(){var j;if((c.browser.msie&&(/(static|relative)/).test(this.css("position")))||(/absolute/).test(this.css("position"))){j=this.parents().filter(function(){return(/(relative|absolute|fixed)/).test(c.curCSS(this,"position",1))&&(/(auto|scroll)/).test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0)}else{j=this.parents().filter(function(){return(/(auto|scroll)/).test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0)}return(/fixed/).test(this.css("position"))||!j.length?c(document):j}});c.extend(c.expr[":"],{data:function(l,k,j){return !!c.data(l,j[3])},focusable:function(k){var l=k.nodeName.toLowerCase(),j=c.attr(k,"tabindex");return(/input|select|textarea|button|object/.test(l)?!k.disabled:"a"==l||"area"==l?k.href||!isNaN(j):!isNaN(j))&&!c(k)["area"==l?"parents":"closest"](":hidden").length},tabbable:function(k){var j=c.attr(k,"tabindex");return(isNaN(j)||j>=0)&&c(k).is(":focusable")}});function g(m,n,o,l){function k(q){var p=c[m][n][q]||[];return(typeof p=="string"?p.split(/,?\s+/):p)}var j=k("getter");if(l.length==1&&typeof l[0]=="string"){j=j.concat(k("getterSetter"))}return(c.inArray(o,j)!=-1)}c.widget=function(k,j){var l=k.split(".")[0];k=k.split(".")[1];c.fn[k]=function(p){var n=(typeof p=="string"),o=Array.prototype.slice.call(arguments,1);if(n&&p.substring(0,1)=="_"){return this}if(n&&g(l,k,p,o)){var m=c.data(this[0],k);return(m?m[p].apply(m,o):undefined)}return this.each(function(){var q=c.data(this,k);(!q&&!n&&c.data(this,k,new c[l][k](this,p))._init());(q&&n&&c.isFunction(q[p])&&q[p].apply(q,o))})};c[l]=c[l]||{};c[l][k]=function(o,n){var m=this;this.namespace=l;this.widgetName=k;this.widgetEventPrefix=c[l][k].eventPrefix||k;this.widgetBaseClass=l+"-"+k;this.options=c.extend({},c.widget.defaults,c[l][k].defaults,c.metadata&&c.metadata.get(o)[k],n);this.element=c(o).bind("setData."+k,function(q,p,r){if(q.target==o){return m._setData(p,r)}}).bind("getData."+k,function(q,p){if(q.target==o){return m._getData(p)}}).bind("remove",function(){return m.destroy()})};c[l][k].prototype=c.extend({},c.widget.prototype,j);c[l][k].getterSetter="option"};c.widget.prototype={_init:function(){},destroy:function(){this.element.removeData(this.widgetName).removeClass(this.widgetBaseClass+"-disabled "+this.namespace+"-state-disabled").removeAttr("aria-disabled")},option:function(l,m){var k=l,j=this;if(typeof l=="string"){if(m===undefined){return this._getData(l)}k={};k[l]=m}c.each(k,function(n,o){j._setData(n,o)})},_getData:function(j){return this.options[j]},_setData:function(j,k){this.options[j]=k;if(j=="disabled"){this.element[k?"addClass":"removeClass"](this.widgetBaseClass+"-disabled "+this.namespace+"-state-disabled").attr("aria-disabled",k)}},enable:function(){this._setData("disabled",false)},disable:function(){this._setData("disabled",true)},_trigger:function(l,m,n){var p=this.options[l],j=(l==this.widgetEventPrefix?l:this.widgetEventPrefix+l);m=c.Event(m);m.type=j;if(m.originalEvent){for(var k=c.event.props.length,o;k;){o=c.event.props[--k];m[o]=m.originalEvent[o]}}this.element.trigger(m,n);return !(c.isFunction(p)&&p.call(this.element[0],m,n)===false||m.isDefaultPrevented())}};c.widget.defaults={disabled:false};c.ui.mouse={_mouseInit:function(){var j=this;this.element.bind("mousedown."+this.widgetName,function(k){return j._mouseDown(k)}).bind("click."+this.widgetName,function(k){if(j._preventClickEvent){j._preventClickEvent=false;k.stopImmediatePropagation();return false}});if(c.browser.msie){this._mouseUnselectable=this.element.attr("unselectable");this.element.attr("unselectable","on")}this.started=false},_mouseDestroy:function(){this.element.unbind("."+this.widgetName);(c.browser.msie&&this.element.attr("unselectable",this._mouseUnselectable))},_mouseDown:function(l){l.originalEvent=l.originalEvent||{};if(l.originalEvent.mouseHandled){return}(this._mouseStarted&&this._mouseUp(l));this._mouseDownEvent=l;var k=this,m=(l.which==1),j=(typeof this.options.cancel=="string"?c(l.target).parents().add(l.target).filter(this.options.cancel).length:false);if(!m||j||!this._mouseCapture(l)){return true}this.mouseDelayMet=!this.options.delay;if(!this.mouseDelayMet){this._mouseDelayTimer=setTimeout(function(){k.mouseDelayMet=true},this.options.delay)}if(this._mouseDistanceMet(l)&&this._mouseDelayMet(l)){this._mouseStarted=(this._mouseStart(l)!==false);if(!this._mouseStarted){l.preventDefault();return true}}this._mouseMoveDelegate=function(n){return k._mouseMove(n)};this._mouseUpDelegate=function(n){return k._mouseUp(n)};c(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate);(c.browser.safari||l.preventDefault());l.originalEvent.mouseHandled=true;return true},_mouseMove:function(j){if(c.browser.msie&&!j.button){return this._mouseUp(j)}if(this._mouseStarted){this._mouseDrag(j);return j.preventDefault()}if(this._mouseDistanceMet(j)&&this._mouseDelayMet(j)){this._mouseStarted=(this._mouseStart(this._mouseDownEvent,j)!==false);(this._mouseStarted?this._mouseDrag(j):this._mouseUp(j))}return !this._mouseStarted},_mouseUp:function(j){c(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted=false;this._preventClickEvent=(j.target==this._mouseDownEvent.target);this._mouseStop(j)}return false},_mouseDistanceMet:function(j){return(Math.max(Math.abs(this._mouseDownEvent.pageX-j.pageX),Math.abs(this._mouseDownEvent.pageY-j.pageY))>=this.options.distance)},_mouseDelayMet:function(j){return this.mouseDelayMet},_mouseStart:function(j){},_mouseDrag:function(j){},_mouseStop:function(j){},_mouseCapture:function(j){return true}};c.ui.mouse.defaults={cancel:null,distance:1,delay:0}})(jQuery);;/* * jQuery UI Resizable 1.7.2
+ *
+ * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * http://docs.jquery.com/UI/Resizables
+ *
+ * Depends:
+ *	ui.core.js
+ */
+(function(c){c.widget("ui.resizable",c.extend({},c.ui.mouse,{_init:function(){var e=this,j=this.options;this.element.addClass("ui-resizable");c.extend(this,{_aspectRatio:!!(j.aspectRatio),aspectRatio:j.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:j.helper||j.ghost||j.animate?j.helper||"ui-resizable-helper":null});if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)){if(/relative/.test(this.element.css("position"))&&c.browser.opera){this.element.css({position:"relative",top:"auto",left:"auto"})}this.element.wrap(c('<div class="ui-wrapper" style="overflow: hidden;"></div>').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")}));this.element=this.element.parent().data("resizable",this.element.data("resizable"));this.elementIsWrapper=true;this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")});this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0});this.originalResizeStyle=this.originalElement.css("resize");this.originalElement.css("resize","none");this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"}));this.originalElement.css({margin:this.originalElement.css("margin")});this._proportionallyResize()}this.handles=j.handles||(!c(".ui-resizable-handle",this.element).length?"e,s,se":{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"});if(this.handles.constructor==String){if(this.handles=="all"){this.handles="n,e,s,w,se,sw,ne,nw"}var k=this.handles.split(",");this.handles={};for(var f=0;f<k.length;f++){var h=c.trim(k[f]),d="ui-resizable-"+h;var g=c('<div class="ui-resizable-handle '+d+'"></div>');if(/sw|se|ne|nw/.test(h)){g.css({zIndex:++j.zIndex})}if("se"==h){g.addClass("ui-icon ui-icon-gripsmall-diagonal-se")}this.handles[h]=".ui-resizable-"+h;this.element.append(g)}}this._renderAxis=function(p){p=p||this.element;for(var m in this.handles){if(this.handles[m].constructor==String){this.handles[m]=c(this.handles[m],this.element).show()}if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var n=c(this.handles[m],this.element),o=0;o=/sw|ne|nw|se|n|s/.test(m)?n.outerHeight():n.outerWidth();var l=["padding",/ne|nw|n/.test(m)?"Top":/se|sw|s/.test(m)?"Bottom":/^e$/.test(m)?"Right":"Left"].join("");p.css(l,o);this._proportionallyResize()}if(!c(this.handles[m]).length){continue}}};this._renderAxis(this.element);this._handles=c(".ui-resizable-handle",this.element).disableSelection();this._handles.mouseover(function(){if(!e.resizing){if(this.className){var i=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)}e.axis=i&&i[1]?i[1]:"se"}});if(j.autoHide){this._handles.hide();c(this.element).addClass("ui-resizable-autohide").hover(function(){c(this).removeClass("ui-resizable-autohide");e._handles.show()},function(){if(!e.resizing){c(this).addClass("ui-resizable-autohide");e._handles.hide()}})}this._mouseInit()},destroy:function(){this._mouseDestroy();var d=function(f){c(f).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};if(this.elementIsWrapper){d(this.element);var e=this.element;e.parent().append(this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")})).end().remove()}this.originalElement.css("resize",this.originalResizeStyle);d(this.originalElement)},_mouseCapture:function(e){var f=false;for(var d in this.handles){if(c(this.handles[d])[0]==e.target){f=true}}return this.options.disabled||!!f},_mouseStart:function(f){var i=this.options,e=this.element.position(),d=this.element;this.resizing=true;this.documentScroll={top:c(document).scrollTop(),left:c(document).scrollLeft()};if(d.is(".ui-draggable")||(/absolute/).test(d.css("position"))){d.css({position:"absolute",top:e.top,left:e.left})}if(c.browser.opera&&(/relative/).test(d.css("position"))){d.css({position:"relative",top:"auto",left:"auto"})}this._renderProxy();var j=b(this.helper.css("left")),g=b(this.helper.css("top"));if(i.containment){j+=c(i.containment).scrollLeft()||0;g+=c(i.containment).scrollTop()||0}this.offset=this.helper.offset();this.position={left:j,top:g};this.size=this._helper?{width:d.outerWidth(),height:d.outerHeight()}:{width:d.width(),height:d.height()};this.originalSize=this._helper?{width:d.outerWidth(),height:d.outerHeight()}:{width:d.width(),height:d.height()};this.originalPosition={left:j,top:g};this.sizeDiff={width:d.outerWidth()-d.width(),height:d.outerHeight()-d.height()};this.originalMousePosition={left:f.pageX,top:f.pageY};this.aspectRatio=(typeof i.aspectRatio=="number")?i.aspectRatio:((this.originalSize.width/this.originalSize.height)||1);var h=c(".ui-resizable-"+this.axis).css("cursor");c("body").css("cursor",h=="auto"?this.axis+"-resize":h);d.addClass("ui-resizable-resizing");this._propagate("start",f);return true},_mouseDrag:function(d){var g=this.helper,f=this.options,l={},p=this,i=this.originalMousePosition,m=this.axis;var q=(d.pageX-i.left)||0,n=(d.pageY-i.top)||0;var h=this._change[m];if(!h){return false}var k=h.apply(this,[d,q,n]),j=c.browser.msie&&c.browser.version<7,e=this.sizeDiff;if(this._aspectRatio||d.shiftKey){k=this._updateRatio(k,d)}k=this._respectSize(k,d);this._propagate("resize",d);g.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"});if(!this._helper&&this._proportionallyResizeElements.length){this._proportionallyResize()}this._updateCache(k);this._trigger("resize",d,this.ui());return false},_mouseStop:function(g){this.resizing=false;var h=this.options,l=this;if(this._helper){var f=this._proportionallyResizeElements,d=f.length&&(/textarea/i).test(f[0].nodeName),e=d&&c.ui.hasScroll(f[0],"left")?0:l.sizeDiff.height,j=d?0:l.sizeDiff.width;var m={width:(l.size.width-j),height:(l.size.height-e)},i=(parseInt(l.element.css("left"),10)+(l.position.left-l.originalPosition.left))||null,k=(parseInt(l.element.css("top"),10)+(l.position.top-l.originalPosition.top))||null;if(!h.animate){this.element.css(c.extend(m,{top:k,left:i}))}l.helper.height(l.size.height);l.helper.width(l.size.width);if(this._helper&&!h.animate){this._proportionallyResize()}}c("body").css("cursor","auto");this.element.removeClass("ui-resizable-resizing");this._propagate("stop",g);if(this._helper){this.helper.remove()}return false},_updateCache:function(d){var e=this.options;this.offset=this.helper.offset();if(a(d.left)){this.position.left=d.left}if(a(d.top)){this.position.top=d.top}if(a(d.height)){this.size.height=d.height}if(a(d.width)){this.size.width=d.width}},_updateRatio:function(g,f){var h=this.options,i=this.position,e=this.size,d=this.axis;if(g.height){g.width=(e.height*this.aspectRatio)}else{if(g.width){g.height=(e.width/this.aspectRatio)}}if(d=="sw"){g.left=i.left+(e.width-g.width);g.top=null}if(d=="nw"){g.top=i.top+(e.height-g.height);g.left=i.left+(e.width-g.width)}return g},_respectSize:function(k,f){var i=this.helper,h=this.options,q=this._aspectRatio||f.shiftKey,p=this.axis,s=a(k.width)&&h.maxWidth&&(h.maxWidth<k.width),l=a(k.height)&&h.maxHeight&&(h.maxHeight<k.height),g=a(k.width)&&h.minWidth&&(h.minWidth>k.width),r=a(k.height)&&h.minHeight&&(h.minHeight>k.height);if(g){k.width=h.minWidth}if(r){k.height=h.minHeight}if(s){k.width=h.maxWidth}if(l){k.height=h.maxHeight}var e=this.originalPosition.left+this.originalSize.width,n=this.position.top+this.size.height;var j=/sw|nw|w/.test(p),d=/nw|ne|n/.test(p);if(g&&j){k.left=e-h.minWidth}if(s&&j){k.left=e-h.maxWidth}if(r&&d){k.top=n-h.minHeight}if(l&&d){k.top=n-h.maxHeight}var m=!k.width&&!k.height;if(m&&!k.left&&k.top){k.top=null}else{if(m&&!k.top&&k.left){k.left=null}}return k},_proportionallyResize:function(){var j=this.options;if(!this._proportionallyResizeElements.length){return}var f=this.helper||this.element;for(var e=0;e<this._proportionallyResizeElements.length;e++){var g=this._proportionallyResizeElements[e];if(!this.borderDif){var d=[g.css("borderTopWidth"),g.css("borderRightWidth"),g.css("borderBottomWidth"),g.css("borderLeftWidth")],h=[g.css("paddingTop"),g.css("paddingRight"),g.css("paddingBottom"),g.css("paddingLeft")];this.borderDif=c.map(d,function(k,m){var l=parseInt(k,10)||0,n=parseInt(h[m],10)||0;return l+n})}if(c.browser.msie&&!(!(c(f).is(":hidden")||c(f).parents(":hidden").length))){continue}g.css({height:(f.height()-this.borderDif[0]-this.borderDif[2])||0,width:(f.width()-this.borderDif[1]-this.borderDif[3])||0})}},_renderProxy:function(){var e=this.element,h=this.options;this.elementOffset=e.offset();if(this._helper){this.helper=this.helper||c('<div style="overflow:hidden;"></div>');var d=c.browser.msie&&c.browser.version<7,f=(d?1:0),g=(d?2:-1);this.helper.addClass(this._helper).css({width:this.element.outerWidth()+g,height:this.element.outerHeight()+g,position:"absolute",left:this.elementOffset.left-f+"px",top:this.elementOffset.top-f+"px",zIndex:++h.zIndex});this.helper.appendTo("body").disableSelection()}else{this.helper=this.element}},_change:{e:function(f,e,d){return{width:this.originalSize.width+e}},w:function(g,e,d){var i=this.options,f=this.originalSize,h=this.originalPosition;return{left:h.left+e,width:f.width-e}},n:function(g,e,d){var i=this.options,f=this.originalSize,h=this.originalPosition;return{top:h.top+d,height:f.height-d}},s:function(f,e,d){return{height:this.originalSize.height+d}},se:function(f,e,d){return c.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[f,e,d]))},sw:function(f,e,d){return c.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[f,e,d]))},ne:function(f,e,d){return c.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[f,e,d]))},nw:function(f,e,d){return c.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[f,e,d]))}},_propagate:function(e,d){c.ui.plugin.call(this,e,[d,this.ui()]);(e!="resize"&&this._trigger(e,d,this.ui()))},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}));c.extend(c.ui.resizable,{version:"1.7.2",eventPrefix:"resize",defaults:{alsoResize:false,animate:false,animateDuration:"slow",animateEasing:"swing",aspectRatio:false,autoHide:false,cancel:":input,option",containment:false,delay:0,distance:1,ghost:false,grid:false,handles:"e,s,se",helper:false,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:1000}});c.ui.plugin.add("resizable","alsoResize",{start:function(e,f){var d=c(this).data("resizable"),g=d.options;_store=function(h){c(h).each(function(){c(this).data("resizable-alsoresize",{width:parseInt(c(this).width(),10),height:parseInt(c(this).height(),10),left:parseInt(c(this).css("left"),10),top:parseInt(c(this).css("top"),10)})})};if(typeof(g.alsoResize)=="object"&&!g.alsoResize.parentNode){if(g.alsoResize.length){g.alsoResize=g.alsoResize[0];_store(g.alsoResize)}else{c.each(g.alsoResize,function(h,i){_store(h)})}}else{_store(g.alsoResize)}},resize:function(f,h){var e=c(this).data("resizable"),i=e.options,g=e.originalSize,k=e.originalPosition;var j={height:(e.size.height-g.height)||0,width:(e.size.width-g.width)||0,top:(e.position.top-k.top)||0,left:(e.position.left-k.left)||0},d=function(l,m){c(l).each(function(){var p=c(this),q=c(this).data("resizable-alsoresize"),o={},n=m&&m.length?m:["width","height","top","left"];c.each(n||["width","height","top","left"],function(r,t){var s=(q[t]||0)+(j[t]||0);if(s&&s>=0){o[t]=s||null}});if(/relative/.test(p.css("position"))&&c.browser.opera){e._revertToRelativePosition=true;p.css({position:"absolute",top:"auto",left:"auto"})}p.css(o)})};if(typeof(i.alsoResize)=="object"&&!i.alsoResize.nodeType){c.each(i.alsoResize,function(l,m){d(l,m)})}else{d(i.alsoResize)}},stop:function(e,f){var d=c(this).data("resizable");if(d._revertToRelativePosition&&c.browser.opera){d._revertToRelativePosition=false;el.css({position:"relative"})}c(this).removeData("resizable-alsoresize-start")}});c.ui.plugin.add("resizable","animate",{stop:function(h,m){var n=c(this).data("resizable"),i=n.options;var g=n._proportionallyResizeElements,d=g.length&&(/textarea/i).test(g[0].nodeName),e=d&&c.ui.hasScroll(g[0],"left")?0:n.sizeDiff.height,k=d?0:n.sizeDiff.width;var f={width:(n.size.width-k),height:(n.size.height-e)},j=(parseInt(n.element.css("left"),10)+(n.position.left-n.originalPosition.left))||null,l=(parseInt(n.element.css("top"),10)+(n.position.top-n.originalPosition.top))||null;n.element.animate(c.extend(f,l&&j?{top:l,left:j}:{}),{duration:i.animateDuration,easing:i.animateEasing,step:function(){var o={width:parseInt(n.element.css("width"),10),height:parseInt(n.element.css("height"),10),top:parseInt(n.element.css("top"),10),left:parseInt(n.element.css("left"),10)};if(g&&g.length){c(g[0]).css({width:o.width,height:o.height})}n._updateCache(o);n._propagate("resize",h)}})}});c.ui.plugin.add("resizable","containment",{start:function(e,q){var s=c(this).data("resizable"),i=s.options,k=s.element;var f=i.containment,j=(f instanceof c)?f.get(0):(/parent/.test(f))?k.parent().get(0):f;if(!j){return}s.containerElement=c(j);if(/document/.test(f)||f==document){s.containerOffset={left:0,top:0};s.containerPosition={left:0,top:0};s.parentData={element:c(document),left:0,top:0,width:c(document).width(),height:c(document).height()||document.body.parentNode.scrollHeight}}else{var m=c(j),h=[];c(["Top","Right","Left","Bottom"]).each(function(p,o){h[p]=b(m.css("padding"+o))});s.containerOffset=m.offset();s.containerPosition=m.position();s.containerSize={height:(m.innerHeight()-h[3]),width:(m.innerWidth()-h[1])};var n=s.containerOffset,d=s.containerSize.height,l=s.containerSize.width,g=(c.ui.hasScroll(j,"left")?j.scrollWidth:l),r=(c.ui.hasScroll(j)?j.scrollHeight:d);s.parentData={element:j,left:n.left,top:n.top,width:g,height:r}}},resize:function(f,p){var s=c(this).data("resizable"),h=s.options,e=s.containerSize,n=s.containerOffset,l=s.size,m=s.position,q=s._aspectRatio||f.shiftKey,d={top:0,left:0},g=s.containerElement;if(g[0]!=document&&(/static/).test(g.css("position"))){d=n}if(m.left<(s._helper?n.left:0)){s.size.width=s.size.width+(s._helper?(s.position.left-n.left):(s.position.left-d.left));if(q){s.size.height=s.size.width/h.aspectRatio}s.position.left=h.helper?n.left:0}if(m.top<(s._helper?n.top:0))
+{s.size.height=s.size.height+(s._helper?(s.position.top-n.top):s.position.top);if(q){s.size.width=s.size.height*h.aspectRatio}s.position.top=s._helper?n.top:0}s.offset.left=s.parentData.left+s.position.left;s.offset.top=s.parentData.top+s.position.top;var k=Math.abs((s._helper?s.offset.left-d.left:(s.offset.left-d.left))+s.sizeDiff.width),r=Math.abs((s._helper?s.offset.top-d.top:(s.offset.top-n.top))+s.sizeDiff.height);var j=s.containerElement.get(0)==s.element.parent().get(0),i=/relative|absolute/.test(s.containerElement.css("position"));if(j&&i){k-=s.parentData.left}if(k+s.size.width>=s.parentData.width){s.size.width=s.parentData.width-k;if(q){s.size.height=s.size.width/s.aspectRatio}}if(r+s.size.height>=s.parentData.height){s.size.height=s.parentData.height-r;if(q){s.size.width=s.size.height*s.aspectRatio}}},stop:function(e,m){var p=c(this).data("resizable"),f=p.options,k=p.position,l=p.containerOffset,d=p.containerPosition,g=p.containerElement;var i=c(p.helper),q=i.offset(),n=i.outerWidth()-p.sizeDiff.width,j=i.outerHeight()-p.sizeDiff.height;if(p._helper&&!f.animate&&(/relative/).test(g.css("position"))){c(this).css({left:q.left-d.left-l.left,width:n,height:j})}if(p._helper&&!f.animate&&(/static/).test(g.css("position"))){c(this).css({left:q.left-d.left-l.left,width:n,height:j})}}});c.ui.plugin.add("resizable","ghost",{start:function(f,g){var d=c(this).data("resizable"),h=d.options,e=d.size;d.ghost=d.originalElement.clone();d.ghost.css({opacity:0.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof h.ghost=="string"?h.ghost:"");d.ghost.appendTo(d.helper)},resize:function(e,f){var d=c(this).data("resizable"),g=d.options;if(d.ghost){d.ghost.css({position:"relative",height:d.size.height,width:d.size.width})}},stop:function(e,f){var d=c(this).data("resizable"),g=d.options;if(d.ghost&&d.helper){d.helper.get(0).removeChild(d.ghost.get(0))}}});c.ui.plugin.add("resizable","grid",{resize:function(d,l){var n=c(this).data("resizable"),g=n.options,j=n.size,h=n.originalSize,i=n.originalPosition,m=n.axis,k=g._aspectRatio||d.shiftKey;g.grid=typeof g.grid=="number"?[g.grid,g.grid]:g.grid;var f=Math.round((j.width-h.width)/(g.grid[0]||1))*(g.grid[0]||1),e=Math.round((j.height-h.height)/(g.grid[1]||1))*(g.grid[1]||1);if(/^(se|s|e)$/.test(m)){n.size.width=h.width+f;n.size.height=h.height+e}else{if(/^(ne)$/.test(m)){n.size.width=h.width+f;n.size.height=h.height+e;n.position.top=i.top-e}else{if(/^(sw)$/.test(m)){n.size.width=h.width+f;n.size.height=h.height+e;n.position.left=i.left-f}else{n.size.width=h.width+f;n.size.height=h.height+e;n.position.top=i.top-e;n.position.left=i.left-f}}}}});var b=function(d){return parseInt(d,10)||0};var a=function(d){return !isNaN(parseInt(d,10))}})(jQuery);;
+/**
+ * jQuery.ScrollTo - Easy element scrolling using jQuery.
+ * Copyright (c) 2008 Ariel Flesler - aflesler(at)gmail(dot)com
+ * Licensed under GPL license (http://www.opensource.org/licenses/gpl-license.php).
+ * Date: 2/8/2008
+ * @author Ariel Flesler
+ * @version 1.3.2
+ */
+;(function($){var o=$.scrollTo=function(a,b,c){o.window().scrollTo(a,b,c)};o.defaults={axis:'y',duration:1};o.window=function(){return $($.browser.safari?'body':'html')};$.fn.scrollTo=function(l,m,n){if(typeof m=='object'){n=m;m=0}n=$.extend({},o.defaults,n);m=m||n.speed||n.duration;n.queue=n.queue&&n.axis.length>1;if(n.queue)m/=2;n.offset=j(n.offset);n.over=j(n.over);return this.each(function(){var a=this,b=$(a),t=l,c,d={},w=b.is('html,body');switch(typeof t){case'number':case'string':if(/^([+-]=)?\d+(px)?$/.test(t)){t=j(t);break}t=$(t,this);case'object':if(t.is||t.style)c=(t=$(t)).offset()}$.each(n.axis.split(''),function(i,f){var P=f=='x'?'Left':'Top',p=P.toLowerCase(),k='scroll'+P,e=a[k],D=f=='x'?'Width':'Height';if(c){d[k]=c[p]+(w?0:e-b.offset()[p]);if(n.margin){d[k]-=parseInt(t.css('margin'+P))||0;d[k]-=parseInt(t.css('border'+P+'Width'))||0}d[k]+=n.offset[p]||0;if(n.over[p])d[k]+=t[D.toLowerCase()]()*n.over[p]}else d[k]=t[p];if(/^\d+$/.test(d[k]))d[k]=d[k]<=0?0:Math.min(d[k],h(D));if(!i&&n.queue){if(e!=d[k])g(n.onAfterFirst);delete d[k]}});g(n.onAfter);function g(a){b.animate(d,m,n.easing,a&&function(){a.call(this,l)})};function h(D){var b=w?$.browser.opera?document.body:document.documentElement:a;return b['scroll'+D]-b['client'+D]}})};function j(a){return typeof a=='object'?a:{top:a,left:a}}})(jQuery);
+
diff --git a/native_client_sdk/doc_generated/pepper_dev/cpp/namespacepp.html b/native_client_sdk/doc_generated/pepper_dev/cpp/namespacepp.html
index e888367..c003388 100644
--- a/native_client_sdk/doc_generated/pepper_dev/cpp/namespacepp.html
+++ b/native_client_sdk/doc_generated/pepper_dev/cpp/namespacepp.html
@@ -119,6 +119,8 @@
 <tr><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_video_frame.html">VideoFrame</a></td></tr>
 <tr><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_view.html">View</a></td></tr>
 <tr><td class="mdescLeft">&#160;</td><td class="mdescRight">This class represents the state of the view for an instance and contains functions for retrieving the current state of that view.  <a href="classpp_1_1_view.html#details">More...</a><br /></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_vpn_provider.html">VpnProvider</a></td></tr>
+<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The <code><a class="el" href="classpp_1_1_vpn_provider.html" title="The VpnProvider class enhances the chrome.vpnProvider JavaScript API by providing a high performance ...">VpnProvider</a></code> class enhances the <code>chrome.vpnProvider</code> JavaScript API by providing a high performance path for packet handling.  <a href="classpp_1_1_vpn_provider.html#details">More...</a><br /></td></tr>
 <tr><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_web_socket.html">WebSocket</a></td></tr>
 <tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The <code><a class="el" href="classpp_1_1_web_socket.html" title="The WebSocket class providing bi-directional, full-duplex, communications over a single TCP socket...">WebSocket</a></code> class providing bi-directional, full-duplex, communications over a single TCP socket.  <a href="classpp_1_1_web_socket.html#details">More...</a><br /></td></tr>
 <tr><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_completion_callback_factory.html">CompletionCallbackFactory</a></td></tr>
diff --git a/native_client_sdk/doc_generated/pepper_dev/cpp/vpn__provider_8h.html b/native_client_sdk/doc_generated/pepper_dev/cpp/vpn__provider_8h.html
new file mode 100644
index 0000000..9fe2c2c
--- /dev/null
+++ b/native_client_sdk/doc_generated/pepper_dev/cpp/vpn__provider_8h.html
@@ -0,0 +1,33 @@
+{{+bindTo:partials.standard_nacl_api}}
+<h1>vpn_provider.h File Reference</h1>
+<div id="doxygen-ref">
+{{- dummy div to appease doxygen -}}
+  <div>
+<!-- Generated by Doxygen 1.7.6.1 -->
+
+
+</div>
+<!--header-->
+<div class="contents">
+<div class="textblock"><div class="dynheader">
+Include dependency graph for vpn_provider.h:</div>
+<div class="dyncontent">
+<div class="center"><img src="vpn__provider_8h__incl.png" border="0" usemap="#vpn__provider_8h" alt="" /></div>
+<map name="vpn__provider_8h" id="vpn__provider_8h">
+</map>
+</div>
+</div><h2>
+Classes</h2><table class="memberdecls">
+
+<tr><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_vpn_provider.html">pp::VpnProvider</a></td></tr>
+<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The <code><a class="el" href="classpp_1_1_vpn_provider.html" title="The VpnProvider class enhances the chrome.vpnProvider JavaScript API by providing a high performance ...">VpnProvider</a></code> class enhances the <code>chrome.vpnProvider</code> JavaScript API by providing a high performance path for packet handling.  <a href="classpp_1_1_vpn_provider.html#details">More...</a><br /></td></tr>
+</table><h2>
+Namespaces</h2><table class="memberdecls">
+<tr><td class="memItemLeft" align="right" valign="top">namespace &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacepp.html">pp</a></td></tr>
+</table>
+<hr /><a name="details" id="details"></a><h2>Detailed Description</h2>
+<div class="textblock"><p>This file defines the VpnProvider interface providing a way to implement a VPN client. </p>
+<p>Important: This API is available only on Chrome OS. </p>
+</div></div><!-- contents -->
+</div>
+{{/partials.standard_nacl_api}}
diff --git a/native_client_sdk/doc_generated/pepper_dev/cpp/vpn__provider_8h__incl.png b/native_client_sdk/doc_generated/pepper_dev/cpp/vpn__provider_8h__incl.png
new file mode 100644
index 0000000..35015c16
--- /dev/null
+++ b/native_client_sdk/doc_generated/pepper_dev/cpp/vpn__provider_8h__incl.png
Binary files differ
diff --git a/native_client_sdk/doc_generated/pepper_dev/index.html b/native_client_sdk/doc_generated/pepper_dev/index.html
index b6e57b8..7998ea0 100644
--- a/native_client_sdk/doc_generated/pepper_dev/index.html
+++ b/native_client_sdk/doc_generated/pepper_dev/index.html
@@ -1,9 +1,17 @@
 {{+bindTo:partials.standard_nacl_article}}
 
-<section id="pepper-api-reference-dev">
+<b><font color="#cc0000">
+NOTE:
+Deprecation of the technologies described here has been announced
+for platforms other than ChromeOS.<br/>
+Please visit our
+<a href="/native-client/migration">migration guide</a>
+for details.
+</font></b>
+<hr/><section id="pepper-api-reference-dev">
 <h1 id="pepper-api-reference-dev">Pepper API Reference (Dev)</h1>
-<p>This page lists the API for Pepper 50. Apps that use this API can
-run in Chrome 50 or higher.</p>
+<p>This page lists the API for Pepper 60. Apps that use this API can
+run in Chrome 60 or higher.</p>
 <h2 id="pepper-c-api-reference"><a class="reference internal" href="/native-client/c-api-dev.html#pepper-dev-c-index"><em>Pepper C API Reference</em></a></h2>
 <h2 id="id1"><a class="reference internal" href="/native-client/cpp-api-dev.html#pepper-dev-cpp-index"><em>Pepper C++ API Reference</em></a></h2>
 </section>
diff --git a/native_client_sdk/doc_generated/pepper_stable/c/globals_defs.html b/native_client_sdk/doc_generated/pepper_stable/c/globals_defs.html
index b08950b1..46088eb 100644
--- a/native_client_sdk/doc_generated/pepper_stable/c/globals_defs.html
+++ b/native_client_sdk/doc_generated/pepper_stable/c/globals_defs.html
@@ -85,8 +85,8 @@
 <li>PPB_GRAPHICS_2D_INTERFACE
 : <a class="el" href="ppb__graphics__2d_8h.html#ab4930fe7aea6b403503d5cc748824b0d">ppb_graphics_2d.h</a>
 </li>
-<li>PPB_GRAPHICS_2D_INTERFACE_1_1
-: <a class="el" href="ppb__graphics__2d_8h.html#ad9792b60ca6ce77f3925be8d60e06640">ppb_graphics_2d.h</a>
+<li>PPB_GRAPHICS_2D_INTERFACE_1_2
+: <a class="el" href="ppb__graphics__2d_8h.html#a8991520a54fc032adae6e8de92d0e0c5">ppb_graphics_2d.h</a>
 </li>
 <li>PPB_GRAPHICS_3D_INTERFACE
 : <a class="el" href="ppb__graphics__3d_8h.html#a3ba3c80f5959aca6bdef2584a2ceb55e">ppb_graphics_3d.h</a>
@@ -331,6 +331,9 @@
 <li>PPB_VIEW_INTERFACE_1_2
 : <a class="el" href="ppb__view_8h.html#a5cdcf0cc190c3ad8c47904939c519a85">ppb_view.h</a>
 </li>
+<li>PPB_VPNPROVIDER_INTERFACE_0_1
+: <a class="el" href="ppb__vpn__provider_8h.html#adc236058517f438cdd43d61c8948de69">ppb_vpn_provider.h</a>
+</li>
 <li>PPB_WEBSOCKET_INTERFACE
 : <a class="el" href="ppb__websocket_8h.html#a6d56a012c9350b4cc4e55b668d3fbe75">ppb_websocket.h</a>
 </li>
diff --git a/native_client_sdk/doc_generated/pepper_stable/c/group___enums.html b/native_client_sdk/doc_generated/pepper_stable/c/group___enums.html
index f5d7907..80d38a7 100644
--- a/native_client_sdk/doc_generated/pepper_stable/c/group___enums.html
+++ b/native_client_sdk/doc_generated/pepper_stable/c/group___enums.html
@@ -244,7 +244,9 @@
 <a class="el" href="group___enums.html#gga21b811ac0484a214a8751aa3e1c959d9a493ca598187014e2356cd7a5ba8cdffd">PP_INPUTEVENT_MODIFIER_NUMLOCKKEY</a> =  1 &lt;&lt; 10, 
 <a class="el" href="group___enums.html#gga21b811ac0484a214a8751aa3e1c959d9a8295bfc8067c06a17ccfc5fb6a992e17">PP_INPUTEVENT_MODIFIER_ISLEFT</a> =  1 &lt;&lt; 11, 
 <br />
-&#160;&#160;<a class="el" href="group___enums.html#gga21b811ac0484a214a8751aa3e1c959d9a348f43efaf61edbefd83346428c5b122">PP_INPUTEVENT_MODIFIER_ISRIGHT</a> =  1 &lt;&lt; 12
+&#160;&#160;<a class="el" href="group___enums.html#gga21b811ac0484a214a8751aa3e1c959d9a348f43efaf61edbefd83346428c5b122">PP_INPUTEVENT_MODIFIER_ISRIGHT</a> =  1 &lt;&lt; 12, 
+<a class="el" href="group___enums.html#gga21b811ac0484a214a8751aa3e1c959d9a970ad827a7240093ec57f1a3a7aea692">PP_INPUTEVENT_MODIFIER_ISPEN</a> =  1 &lt;&lt; 13, 
+<a class="el" href="group___enums.html#gga21b811ac0484a214a8751aa3e1c959d9a3367f08ba940a67d0098a59093582ef1">PP_INPUTEVENT_MODIFIER_ISERASER</a> =  1 &lt;&lt; 14
 <br />
  }</td></tr>
 <tr><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#ga25113f3c8d33e863fd38b3f70f8a5e6e">PP_InputEvent_MouseButton</a> { <a class="el" href="group___enums.html#gga25113f3c8d33e863fd38b3f70f8a5e6eaa2d4e499d6c23ef45381a89612e654d9">PP_INPUTEVENT_MOUSEBUTTON_NONE</a> =  -1, 
@@ -1155,6 +1157,10 @@
 </td></tr>
 <tr><td valign="top"><em><a class="anchor" id="gga21b811ac0484a214a8751aa3e1c959d9a348f43efaf61edbefd83346428c5b122"></a><!-- doxytag: member="PP_INPUTEVENT_MODIFIER_ISRIGHT" ref="gga21b811ac0484a214a8751aa3e1c959d9a348f43efaf61edbefd83346428c5b122" args="" -->PP_INPUTEVENT_MODIFIER_ISRIGHT</em>&nbsp;</td><td>
 </td></tr>
+<tr><td valign="top"><em><a class="anchor" id="gga21b811ac0484a214a8751aa3e1c959d9a970ad827a7240093ec57f1a3a7aea692"></a><!-- doxytag: member="PP_INPUTEVENT_MODIFIER_ISPEN" ref="gga21b811ac0484a214a8751aa3e1c959d9a970ad827a7240093ec57f1a3a7aea692" args="" -->PP_INPUTEVENT_MODIFIER_ISPEN</em>&nbsp;</td><td>
+</td></tr>
+<tr><td valign="top"><em><a class="anchor" id="gga21b811ac0484a214a8751aa3e1c959d9a3367f08ba940a67d0098a59093582ef1"></a><!-- doxytag: member="PP_INPUTEVENT_MODIFIER_ISERASER" ref="gga21b811ac0484a214a8751aa3e1c959d9a3367f08ba940a67d0098a59093582ef1" args="" -->PP_INPUTEVENT_MODIFIER_ISERASER</em>&nbsp;</td><td>
+</td></tr>
 </table>
 </dd>
 </dl>
diff --git a/native_client_sdk/doc_generated/pepper_stable/c/group___interfaces.html b/native_client_sdk/doc_generated/pepper_stable/c/group___interfaces.html
index 72f88bb..4a04f9f 100644
--- a/native_client_sdk/doc_generated/pepper_stable/c/group___interfaces.html
+++ b/native_client_sdk/doc_generated/pepper_stable/c/group___interfaces.html
@@ -35,8 +35,8 @@
 <tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The <code>PPB_Fullscreen</code> interface is implemented by the browser.  <a href="struct_p_p_b___fullscreen__1__0.html#details">More...</a><br /></td></tr>
 <tr><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___gamepad__1__0.html">PPB_Gamepad</a></td></tr>
 <tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The <code>PPB_Gamepad</code> interface allows retrieving data from gamepad/joystick devices that are connected to the system.  <a href="struct_p_p_b___gamepad__1__0.html#details">More...</a><br /></td></tr>
-<tr><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___graphics2_d__1__1.html">PPB_Graphics2D</a></td></tr>
-<tr><td class="mdescLeft">&#160;</td><td class="mdescRight"><code>PPB_Graphics2D</code> defines the interface for a 2D graphics context.  <a href="struct_p_p_b___graphics2_d__1__1.html#details">More...</a><br /></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___graphics2_d__1__2.html">PPB_Graphics2D</a></td></tr>
+<tr><td class="mdescLeft">&#160;</td><td class="mdescRight"><code>PPB_Graphics2D</code> defines the interface for a 2D graphics context.  <a href="struct_p_p_b___graphics2_d__1__2.html#details">More...</a><br /></td></tr>
 <tr><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___graphics3_d__1__0.html">PPB_Graphics3D</a></td></tr>
 <tr><td class="mdescLeft">&#160;</td><td class="mdescRight"><code>PPB_Graphics3D</code> defines the interface for a 3D graphics context.  <a href="struct_p_p_b___graphics3_d__1__0.html#details">More...</a><br /></td></tr>
 <tr><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___host_resolver__1__0.html">PPB_HostResolver</a></td></tr>
@@ -116,6 +116,8 @@
 <tr><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_frame__0__1.html">PPB_VideoFrame</a></td></tr>
 <tr><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___view__1__2.html">PPB_View</a></td></tr>
 <tr><td class="mdescLeft">&#160;</td><td class="mdescRight"><code>PPB_View</code> represents the state of the view of an instance.  <a href="struct_p_p_b___view__1__2.html#details">More...</a><br /></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___vpn_provider__0__1.html">PPB_VpnProvider</a></td></tr>
+<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Use the <code>PPB_VpnProvider</code> interface to implement a VPN client.  <a href="struct_p_p_b___vpn_provider__0__1.html#details">More...</a><br /></td></tr>
 <tr><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___web_socket__1__0.html">PPB_WebSocket</a></td></tr>
 <tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The <code>PPB_WebSocket</code> interface provides bi-directional, full-duplex, communications over a single TCP socket.  <a href="struct_p_p_b___web_socket__1__0.html#details">More...</a><br /></td></tr>
 <tr><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_p___graphics3_d__1__0.html">PPP_Graphics3D</a></td></tr>
@@ -141,7 +143,7 @@
 <tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___file_system__1__0.html">PPB_FileSystem</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#gae5ad593b6aff864c6bd0acc09d6cc5e9">PPB_FileSystem</a></td></tr>
 <tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___fullscreen__1__0.html">PPB_Fullscreen</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#ga965dcf552ef79d1a41e0c24db2cf5c3c">PPB_Fullscreen</a></td></tr>
 <tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___gamepad__1__0.html">PPB_Gamepad</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#ga57baea75086a666a92489da807f16f2a">PPB_Gamepad</a></td></tr>
-<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___graphics2_d__1__1.html">PPB_Graphics2D</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#gaf9f8348d3315d8bb014b401f733ebdb6">PPB_Graphics2D</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___graphics2_d__1__2.html">PPB_Graphics2D</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#gae81de3c5ca761162254ed217693050ba">PPB_Graphics2D</a></td></tr>
 <tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___graphics3_d__1__0.html">PPB_Graphics3D</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#ga2865870b49481aae8ed416c06c58a7c0">PPB_Graphics3D</a></td></tr>
 <tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___host_resolver__1__0.html">PPB_HostResolver</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#ga72b9bd04eeace0c69f4e454b7cc4e440">PPB_HostResolver</a></td></tr>
 <tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___image_data__1__0.html">PPB_ImageData</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#ga17e05bbe7da0d6d7b61b6f78c5913c37">PPB_ImageData</a></td></tr>
@@ -317,12 +319,12 @@
 <div class="memdoc">
 </div>
 </div>
-<a class="anchor" id="gaf9f8348d3315d8bb014b401f733ebdb6"></a><!-- doxytag: member="ppb_graphics_2d.h::PPB_Graphics2D" ref="gaf9f8348d3315d8bb014b401f733ebdb6" args="" -->
+<a class="anchor" id="gae81de3c5ca761162254ed217693050ba"></a><!-- doxytag: member="ppb_graphics_2d.h::PPB_Graphics2D" ref="gae81de3c5ca761162254ed217693050ba" args="" -->
 <div class="memitem">
 <div class="memproto">
 <table class="memname">
 <tr>
-<td class="memname">typedef struct <a class="el" href="struct_p_p_b___graphics2_d__1__1.html">PPB_Graphics2D</a> <a class="el" href="group___interfaces.html#gaf9f8348d3315d8bb014b401f733ebdb6">PPB_Graphics2D</a></td>
+<td class="memname">typedef struct <a class="el" href="struct_p_p_b___graphics2_d__1__2.html">PPB_Graphics2D</a> <a class="el" href="group___interfaces.html#gae81de3c5ca761162254ed217693050ba">PPB_Graphics2D</a></td>
 </tr>
 </table>
 </div>
diff --git a/native_client_sdk/doc_generated/pepper_stable/c/jquery.js b/native_client_sdk/doc_generated/pepper_stable/c/jquery.js
new file mode 100644
index 0000000..90b3a2b
--- /dev/null
+++ b/native_client_sdk/doc_generated/pepper_stable/c/jquery.js
@@ -0,0 +1,64 @@
+/*
+ * jQuery JavaScript Library v1.3.2
+ * http://jquery.com/
+ *
+ * Copyright (c) 2009 John Resig
+ * Dual licensed under the MIT and GPL licenses.
+ * http://docs.jquery.com/License
+ *
+ * Date: 2009-02-19 17:34:21 -0500 (Thu, 19 Feb 2009)
+ * Revision: 6246
+ */
+(function(){var l=this,g,y=l.jQuery,p=l.$,o=l.jQuery=l.$=function(E,F){return new o.fn.init(E,F)},D=/^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/,f=/^.[^:#\[\.,]*$/;o.fn=o.prototype={init:function(E,H){E=E||document;if(E.nodeType){this[0]=E;this.length=1;this.context=E;return this}if(typeof E==="string"){var G=D.exec(E);if(G&&(G[1]||!H)){if(G[1]){E=o.clean([G[1]],H)}else{var I=document.getElementById(G[3]);if(I&&I.id!=G[3]){return o().find(E)}var F=o(I||[]);F.context=document;F.selector=E;return F}}else{return o(H).find(E)}}else{if(o.isFunction(E)){return o(document).ready(E)}}if(E.selector&&E.context){this.selector=E.selector;this.context=E.context}return this.setArray(o.isArray(E)?E:o.makeArray(E))},selector:"",jquery:"1.3.2",size:function(){return this.length},get:function(E){return E===g?Array.prototype.slice.call(this):this[E]},pushStack:function(F,H,E){var G=o(F);G.prevObject=this;G.context=this.context;if(H==="find"){G.selector=this.selector+(this.selector?" ":"")+E}else{if(H){G.selector=this.selector+"."+H+"("+E+")"}}return G},setArray:function(E){this.length=0;Array.prototype.push.apply(this,E);return this},each:function(F,E){return o.each(this,F,E)},index:function(E){return o.inArray(E&&E.jquery?E[0]:E,this)},attr:function(F,H,G){var E=F;if(typeof F==="string"){if(H===g){return this[0]&&o[G||"attr"](this[0],F)}else{E={};E[F]=H}}return this.each(function(I){for(F in E){o.attr(G?this.style:this,F,o.prop(this,E[F],G,I,F))}})},css:function(E,F){if((E=="width"||E=="height")&&parseFloat(F)<0){F=g}return this.attr(E,F,"curCSS")},text:function(F){if(typeof F!=="object"&&F!=null){return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(F))}var E="";o.each(F||this,function(){o.each(this.childNodes,function(){if(this.nodeType!=8){E+=this.nodeType!=1?this.nodeValue:o.fn.text([this])}})});return E},wrapAll:function(E){if(this[0]){var F=o(E,this[0].ownerDocument).clone();if(this[0].parentNode){F.insertBefore(this[0])}F.map(function(){var G=this;while(G.firstChild){G=G.firstChild}return G}).append(this)}return this},wrapInner:function(E){return this.each(function(){o(this).contents().wrapAll(E)})},wrap:function(E){return this.each(function(){o(this).wrapAll(E)})},append:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.appendChild(E)}})},prepend:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.insertBefore(E,this.firstChild)}})},before:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this)})},after:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this.nextSibling)})},end:function(){return this.prevObject||o([])},push:[].push,sort:[].sort,splice:[].splice,find:function(E){if(this.length===1){var F=this.pushStack([],"find",E);F.length=0;o.find(E,this[0],F);return F}else{return this.pushStack(o.unique(o.map(this,function(G){return o.find(E,G)})),"find",E)}},clone:function(G){var E=this.map(function(){if(!o.support.noCloneEvent&&!o.isXMLDoc(this)){var I=this.outerHTML;if(!I){var J=this.ownerDocument.createElement("div");J.appendChild(this.cloneNode(true));I=J.innerHTML}return o.clean([I.replace(/ jQuery\d+="(?:\d+|null)"/g,"").replace(/^\s*/,"")])[0]}else{return this.cloneNode(true)}});if(G===true){var H=this.find("*").andSelf(),F=0;E.find("*").andSelf().each(function(){if(this.nodeName!==H[F].nodeName){return}var I=o.data(H[F],"events");for(var K in I){for(var J in I[K]){o.event.add(this,K,I[K][J],I[K][J].data)}}F++})}return E},filter:function(E){return this.pushStack(o.isFunction(E)&&o.grep(this,function(G,F){return E.call(G,F)})||o.multiFilter(E,o.grep(this,function(F){return F.nodeType===1})),"filter",E)},closest:function(E){var G=o.expr.match.POS.test(E)?o(E):null,F=0;return this.map(function(){var H=this;while(H&&H.ownerDocument){if(G?G.index(H)>-1:o(H).is(E)){o.data(H,"closest",F);return H}H=H.parentNode;F++}})},not:function(E){if(typeof E==="string"){if(f.test(E)){return this.pushStack(o.multiFilter(E,this,true),"not",E)}else{E=o.multiFilter(E,this)}}var F=E.length&&E[E.length-1]!==g&&!E.nodeType;return this.filter(function(){return F?o.inArray(this,E)<0:this!=E})},add:function(E){return this.pushStack(o.unique(o.merge(this.get(),typeof E==="string"?o(E):o.makeArray(E))))},is:function(E){return !!E&&o.multiFilter(E,this).length>0},hasClass:function(E){return !!E&&this.is("."+E)},val:function(K){if(K===g){var E=this[0];if(E){if(o.nodeName(E,"option")){return(E.attributes.value||{}).specified?E.value:E.text}if(o.nodeName(E,"select")){var I=E.selectedIndex,L=[],M=E.options,H=E.type=="select-one";if(I<0){return null}for(var F=H?I:0,J=H?I+1:M.length;F<J;F++){var G=M[F];if(G.selected){K=o(G).val();if(H){return K}L.push(K)}}return L}return(E.value||"").replace(/\r/g,"")}return g}if(typeof K==="number"){K+=""}return this.each(function(){if(this.nodeType!=1){return}if(o.isArray(K)&&/radio|checkbox/.test(this.type)){this.checked=(o.inArray(this.value,K)>=0||o.inArray(this.name,K)>=0)}else{if(o.nodeName(this,"select")){var N=o.makeArray(K);o("option",this).each(function(){this.selected=(o.inArray(this.value,N)>=0||o.inArray(this.text,N)>=0)});if(!N.length){this.selectedIndex=-1}}else{this.value=K}}})},html:function(E){return E===g?(this[0]?this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g,""):null):this.empty().append(E)},replaceWith:function(E){return this.after(E).remove()},eq:function(E){return this.slice(E,+E+1)},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments),"slice",Array.prototype.slice.call(arguments).join(","))},map:function(E){return this.pushStack(o.map(this,function(G,F){return E.call(G,F,G)}))},andSelf:function(){return this.add(this.prevObject)},domManip:function(J,M,L){if(this[0]){var I=(this[0].ownerDocument||this[0]).createDocumentFragment(),F=o.clean(J,(this[0].ownerDocument||this[0]),I),H=I.firstChild;if(H){for(var G=0,E=this.length;G<E;G++){L.call(K(this[G],H),this.length>1||G>0?I.cloneNode(true):I)}}if(F){o.each(F,z)}}return this;function K(N,O){return M&&o.nodeName(N,"table")&&o.nodeName(O,"tr")?(N.getElementsByTagName("tbody")[0]||N.appendChild(N.ownerDocument.createElement("tbody"))):N}}};o.fn.init.prototype=o.fn;function z(E,F){if(F.src){o.ajax({url:F.src,async:false,dataType:"script"})}else{o.globalEval(F.text||F.textContent||F.innerHTML||"")}if(F.parentNode){F.parentNode.removeChild(F)}}function e(){return +new Date}o.extend=o.fn.extend=function(){var J=arguments[0]||{},H=1,I=arguments.length,E=false,G;if(typeof J==="boolean"){E=J;J=arguments[1]||{};H=2}if(typeof J!=="object"&&!o.isFunction(J)){J={}}if(I==H){J=this;--H}for(;H<I;H++){if((G=arguments[H])!=null){for(var F in G){var K=J[F],L=G[F];if(J===L){continue}if(E&&L&&typeof L==="object"&&!L.nodeType){J[F]=o.extend(E,K||(L.length!=null?[]:{}),L)}else{if(L!==g){J[F]=L}}}}}return J};var b=/z-?index|font-?weight|opacity|zoom|line-?height/i,q=document.defaultView||{},s=Object.prototype.toString;o.extend({noConflict:function(E){l.$=p;if(E){l.jQuery=y}return o},isFunction:function(E){return s.call(E)==="[object Function]"},isArray:function(E){return s.call(E)==="[object Array]"},isXMLDoc:function(E){return E.nodeType===9&&E.documentElement.nodeName!=="HTML"||!!E.ownerDocument&&o.isXMLDoc(E.ownerDocument)},globalEval:function(G){if(G&&/\S/.test(G)){var F=document.getElementsByTagName("head")[0]||document.documentElement,E=document.createElement("script");E.type="text/javascript";if(o.support.scriptEval){E.appendChild(document.createTextNode(G))}else{E.text=G}F.insertBefore(E,F.firstChild);F.removeChild(E)}},nodeName:function(F,E){return F.nodeName&&F.nodeName.toUpperCase()==E.toUpperCase()},each:function(G,K,F){var E,H=0,I=G.length;if(F){if(I===g){for(E in G){if(K.apply(G[E],F)===false){break}}}else{for(;H<I;){if(K.apply(G[H++],F)===false){break}}}}else{if(I===g){for(E in G){if(K.call(G[E],E,G[E])===false){break}}}else{for(var J=G[0];H<I&&K.call(J,H,J)!==false;J=G[++H]){}}}return G},prop:function(H,I,G,F,E){if(o.isFunction(I)){I=I.call(H,F)}return typeof I==="number"&&G=="curCSS"&&!b.test(E)?I+"px":I},className:{add:function(E,F){o.each((F||"").split(/\s+/),function(G,H){if(E.nodeType==1&&!o.className.has(E.className,H)){E.className+=(E.className?" ":"")+H}})},remove:function(E,F){if(E.nodeType==1){E.className=F!==g?o.grep(E.className.split(/\s+/),function(G){return !o.className.has(F,G)}).join(" "):""}},has:function(F,E){return F&&o.inArray(E,(F.className||F).toString().split(/\s+/))>-1}},swap:function(H,G,I){var E={};for(var F in G){E[F]=H.style[F];H.style[F]=G[F]}I.call(H);for(var F in G){H.style[F]=E[F]}},css:function(H,F,J,E){if(F=="width"||F=="height"){var L,G={position:"absolute",visibility:"hidden",display:"block"},K=F=="width"?["Left","Right"]:["Top","Bottom"];function I(){L=F=="width"?H.offsetWidth:H.offsetHeight;if(E==="border"){return}o.each(K,function(){if(!E){L-=parseFloat(o.curCSS(H,"padding"+this,true))||0}if(E==="margin"){L+=parseFloat(o.curCSS(H,"margin"+this,true))||0}else{L-=parseFloat(o.curCSS(H,"border"+this+"Width",true))||0}})}if(H.offsetWidth!==0){I()}else{o.swap(H,G,I)}return Math.max(0,Math.round(L))}return o.curCSS(H,F,J)},curCSS:function(I,F,G){var L,E=I.style;if(F=="opacity"&&!o.support.opacity){L=o.attr(E,"opacity");return L==""?"1":L}if(F.match(/float/i)){F=w}if(!G&&E&&E[F]){L=E[F]}else{if(q.getComputedStyle){if(F.match(/float/i)){F="float"}F=F.replace(/([A-Z])/g,"-$1").toLowerCase();var M=q.getComputedStyle(I,null);if(M){L=M.getPropertyValue(F)}if(F=="opacity"&&L==""){L="1"}}else{if(I.currentStyle){var J=F.replace(/\-(\w)/g,function(N,O){return O.toUpperCase()});L=I.currentStyle[F]||I.currentStyle[J];if(!/^\d+(px)?$/i.test(L)&&/^\d/.test(L)){var H=E.left,K=I.runtimeStyle.left;I.runtimeStyle.left=I.currentStyle.left;E.left=L||0;L=E.pixelLeft+"px";E.left=H;I.runtimeStyle.left=K}}}}return L},clean:function(F,K,I){K=K||document;if(typeof K.createElement==="undefined"){K=K.ownerDocument||K[0]&&K[0].ownerDocument||document}if(!I&&F.length===1&&typeof F[0]==="string"){var H=/^<(\w+)\s*\/?>$/.exec(F[0]);if(H){return[K.createElement(H[1])]}}var G=[],E=[],L=K.createElement("div");o.each(F,function(P,S){if(typeof S==="number"){S+=""}if(!S){return}if(typeof S==="string"){S=S.replace(/(<(\w+)[^>]*?)\/>/g,function(U,V,T){return T.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?U:V+"></"+T+">"});var O=S.replace(/^\s+/,"").substring(0,10).toLowerCase();var Q=!O.indexOf("<opt")&&[1,"<select multiple='multiple'>","</select>"]||!O.indexOf("<leg")&&[1,"<fieldset>","</fieldset>"]||O.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"<table>","</table>"]||!O.indexOf("<tr")&&[2,"<table><tbody>","</tbody></table>"]||(!O.indexOf("<td")||!O.indexOf("<th"))&&[3,"<table><tbody><tr>","</tr></tbody></table>"]||!O.indexOf("<col")&&[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"]||!o.support.htmlSerialize&&[1,"div<div>","</div>"]||[0,"",""];L.innerHTML=Q[1]+S+Q[2];while(Q[0]--){L=L.lastChild}if(!o.support.tbody){var R=/<tbody/i.test(S),N=!O.indexOf("<table")&&!R?L.firstChild&&L.firstChild.childNodes:Q[1]=="<table>"&&!R?L.childNodes:[];for(var M=N.length-1;M>=0;--M){if(o.nodeName(N[M],"tbody")&&!N[M].childNodes.length){N[M].parentNode.removeChild(N[M])}}}if(!o.support.leadingWhitespace&&/^\s/.test(S)){L.insertBefore(K.createTextNode(S.match(/^\s*/)[0]),L.firstChild)}S=o.makeArray(L.childNodes)}if(S.nodeType){G.push(S)}else{G=o.merge(G,S)}});if(I){for(var J=0;G[J];J++){if(o.nodeName(G[J],"script")&&(!G[J].type||G[J].type.toLowerCase()==="text/javascript")){E.push(G[J].parentNode?G[J].parentNode.removeChild(G[J]):G[J])}else{if(G[J].nodeType===1){G.splice.apply(G,[J+1,0].concat(o.makeArray(G[J].getElementsByTagName("script"))))}I.appendChild(G[J])}}return E}return G},attr:function(J,G,K){if(!J||J.nodeType==3||J.nodeType==8){return g}var H=!o.isXMLDoc(J),L=K!==g;G=H&&o.props[G]||G;if(J.tagName){var F=/href|src|style/.test(G);if(G=="selected"&&J.parentNode){J.parentNode.selectedIndex}if(G in J&&H&&!F){if(L){if(G=="type"&&o.nodeName(J,"input")&&J.parentNode){throw"type property can't be changed"}J[G]=K}if(o.nodeName(J,"form")&&J.getAttributeNode(G)){return J.getAttributeNode(G).nodeValue}if(G=="tabIndex"){var I=J.getAttributeNode("tabIndex");return I&&I.specified?I.value:J.nodeName.match(/(button|input|object|select|textarea)/i)?0:J.nodeName.match(/^(a|area)$/i)&&J.href?0:g}return J[G]}if(!o.support.style&&H&&G=="style"){return o.attr(J.style,"cssText",K)}if(L){J.setAttribute(G,""+K)}var E=!o.support.hrefNormalized&&H&&F?J.getAttribute(G,2):J.getAttribute(G);return E===null?g:E}if(!o.support.opacity&&G=="opacity"){if(L){J.zoom=1;J.filter=(J.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(K)+""=="NaN"?"":"alpha(opacity="+K*100+")")}return J.filter&&J.filter.indexOf("opacity=")>=0?(parseFloat(J.filter.match(/opacity=([^)]*)/)[1])/100)+"":""}G=G.replace(/-([a-z])/ig,function(M,N){return N.toUpperCase()});if(L){J[G]=K}return J[G]},trim:function(E){return(E||"").replace(/^\s+|\s+$/g,"")},makeArray:function(G){var E=[];if(G!=null){var F=G.length;if(F==null||typeof G==="string"||o.isFunction(G)||G.setInterval){E[0]=G}else{while(F){E[--F]=G[F]}}}return E},inArray:function(G,H){for(var E=0,F=H.length;E<F;E++){if(H[E]===G){return E}}return -1},merge:function(H,E){var F=0,G,I=H.length;if(!o.support.getAll){while((G=E[F++])!=null){if(G.nodeType!=8){H[I++]=G}}}else{while((G=E[F++])!=null){H[I++]=G}}return H},unique:function(K){var F=[],E={};try{for(var G=0,H=K.length;G<H;G++){var J=o.data(K[G]);if(!E[J]){E[J]=true;F.push(K[G])}}}catch(I){F=K}return F},grep:function(F,J,E){var G=[];for(var H=0,I=F.length;H<I;H++){if(!E!=!J(F[H],H)){G.push(F[H])}}return G},map:function(E,J){var F=[];for(var G=0,H=E.length;G<H;G++){var I=J(E[G],G);if(I!=null){F[F.length]=I}}return F.concat.apply([],F)}});var C=navigator.userAgent.toLowerCase();o.browser={version:(C.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[0,"0"])[1],safari:/webkit/.test(C),opera:/opera/.test(C),msie:/msie/.test(C)&&!/opera/.test(C),mozilla:/mozilla/.test(C)&&!/(compatible|webkit)/.test(C)};o.each({parent:function(E){return E.parentNode},parents:function(E){return o.dir(E,"parentNode")},next:function(E){return o.nth(E,2,"nextSibling")},prev:function(E){return o.nth(E,2,"previousSibling")},nextAll:function(E){return o.dir(E,"nextSibling")},prevAll:function(E){return o.dir(E,"previousSibling")},siblings:function(E){return o.sibling(E.parentNode.firstChild,E)},children:function(E){return o.sibling(E.firstChild)},contents:function(E){return o.nodeName(E,"iframe")?E.contentDocument||E.contentWindow.document:o.makeArray(E.childNodes)}},function(E,F){o.fn[E]=function(G){var H=o.map(this,F);if(G&&typeof G=="string"){H=o.multiFilter(G,H)}return this.pushStack(o.unique(H),E,G)}});o.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(E,F){o.fn[E]=function(G){var J=[],L=o(G);for(var K=0,H=L.length;K<H;K++){
+var I=(K>0?this.clone(true):this).get();o.fn[F].apply(o(L[K]),I);J=J.concat(I)}return this.pushStack(J,E,G)}});o.each({removeAttr:function(E){o.attr(this,E,"");if(this.nodeType==1){this.removeAttribute(E)}},addClass:function(E){o.className.add(this,E)},removeClass:function(E){o.className.remove(this,E)},toggleClass:function(F,E){if(typeof E!=="boolean"){E=!o.className.has(this,F)}o.className[E?"add":"remove"](this,F)},remove:function(E){if(!E||o.filter(E,[this]).length){o("*",this).add([this]).each(function(){o.event.remove(this);o.removeData(this)});if(this.parentNode){this.parentNode.removeChild(this)}}},empty:function(){o(this).children().remove();while(this.firstChild){this.removeChild(this.firstChild)}}},function(E,F){o.fn[E]=function(){return this.each(F,arguments)}});function j(E,F){return E[0]&&parseInt(o.curCSS(E[0],F,true),10)||0}var h="jQuery"+e(),v=0,A={};o.extend({cache:{},data:function(F,E,G){F=F==l?A:F;var H=F[h];if(!H){H=F[h]=++v}if(E&&!o.cache[H]){o.cache[H]={}}if(G!==g){o.cache[H][E]=G}return E?o.cache[H][E]:H},removeData:function(F,E){F=F==l?A:F;var H=F[h];if(E){if(o.cache[H]){delete o.cache[H][E];E="";for(E in o.cache[H]){break}if(!E){o.removeData(F)}}}else{try{delete F[h]}catch(G){if(F.removeAttribute){F.removeAttribute(h)}}delete o.cache[H]}},queue:function(F,E,H){if(F){E=(E||"fx")+"queue";var G=o.data(F,E);if(!G||o.isArray(H)){G=o.data(F,E,o.makeArray(H))}else{if(H){G.push(H)}}}return G},dequeue:function(H,G){var E=o.queue(H,G),F=E.shift();if(!G||G==="fx"){F=E[0]}if(F!==g){F.call(H)}}});o.fn.extend({data:function(E,G){var H=E.split(".");H[1]=H[1]?"."+H[1]:"";if(G===g){var F=this.triggerHandler("getData"+H[1]+"!",[H[0]]);if(F===g&&this.length){F=o.data(this[0],E)}return F===g&&H[1]?this.data(H[0]):F}else{return this.trigger("setData"+H[1]+"!",[H[0],G]).each(function(){o.data(this,E,G)})}},removeData:function(E){return this.each(function(){o.removeData(this,E)})},queue:function(E,F){if(typeof E!=="string"){F=E;E="fx"}if(F===g){return o.queue(this[0],E)}return this.each(function(){var G=o.queue(this,E,F);if(E=="fx"&&G.length==1){G[0].call(this)}})},dequeue:function(E){return this.each(function(){o.dequeue(this,E)})}});
+/*
+ * Sizzle CSS Selector Engine - v0.9.3
+ *  Copyright 2009, The Dojo Foundation
+ *  Released under the MIT, BSD, and GPL Licenses.
+ *  More information: http://sizzlejs.com/
+ */
+(function(){var R=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?/g,L=0,H=Object.prototype.toString;var F=function(Y,U,ab,ac){ab=ab||[];U=U||document;if(U.nodeType!==1&&U.nodeType!==9){return[]}if(!Y||typeof Y!=="string"){return ab}var Z=[],W,af,ai,T,ad,V,X=true;R.lastIndex=0;while((W=R.exec(Y))!==null){Z.push(W[1]);if(W[2]){V=RegExp.rightContext;break}}if(Z.length>1&&M.exec(Y)){if(Z.length===2&&I.relative[Z[0]]){af=J(Z[0]+Z[1],U)}else{af=I.relative[Z[0]]?[U]:F(Z.shift(),U);while(Z.length){Y=Z.shift();if(I.relative[Y]){Y+=Z.shift()}af=J(Y,af)}}}else{var ae=ac?{expr:Z.pop(),set:E(ac)}:F.find(Z.pop(),Z.length===1&&U.parentNode?U.parentNode:U,Q(U));af=F.filter(ae.expr,ae.set);if(Z.length>0){ai=E(af)}else{X=false}while(Z.length){var ah=Z.pop(),ag=ah;if(!I.relative[ah]){ah=""}else{ag=Z.pop()}if(ag==null){ag=U}I.relative[ah](ai,ag,Q(U))}}if(!ai){ai=af}if(!ai){throw"Syntax error, unrecognized expression: "+(ah||Y)}if(H.call(ai)==="[object Array]"){if(!X){ab.push.apply(ab,ai)}else{if(U.nodeType===1){for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&(ai[aa]===true||ai[aa].nodeType===1&&K(U,ai[aa]))){ab.push(af[aa])}}}else{for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&ai[aa].nodeType===1){ab.push(af[aa])}}}}}else{E(ai,ab)}if(V){F(V,U,ab,ac);if(G){hasDuplicate=false;ab.sort(G);if(hasDuplicate){for(var aa=1;aa<ab.length;aa++){if(ab[aa]===ab[aa-1]){ab.splice(aa--,1)}}}}}return ab};F.matches=function(T,U){return F(T,null,null,U)};F.find=function(aa,T,ab){var Z,X;if(!aa){return[]}for(var W=0,V=I.order.length;W<V;W++){var Y=I.order[W],X;if((X=I.match[Y].exec(aa))){var U=RegExp.leftContext;if(U.substr(U.length-1)!=="\\"){X[1]=(X[1]||"").replace(/\\/g,"");Z=I.find[Y](X,T,ab);if(Z!=null){aa=aa.replace(I.match[Y],"");break}}}}if(!Z){Z=T.getElementsByTagName("*")}return{set:Z,expr:aa}};F.filter=function(ad,ac,ag,W){var V=ad,ai=[],aa=ac,Y,T,Z=ac&&ac[0]&&Q(ac[0]);while(ad&&ac.length){for(var ab in I.filter){if((Y=I.match[ab].exec(ad))!=null){var U=I.filter[ab],ah,af;T=false;if(aa==ai){ai=[]}if(I.preFilter[ab]){Y=I.preFilter[ab](Y,aa,ag,ai,W,Z);if(!Y){T=ah=true}else{if(Y===true){continue}}}if(Y){for(var X=0;(af=aa[X])!=null;X++){if(af){ah=U(af,Y,X,aa);var ae=W^!!ah;if(ag&&ah!=null){if(ae){T=true}else{aa[X]=false}}else{if(ae){ai.push(af);T=true}}}}}if(ah!==g){if(!ag){aa=ai}ad=ad.replace(I.match[ab],"");if(!T){return[]}break}}}if(ad==V){if(T==null){throw"Syntax error, unrecognized expression: "+ad}else{break}}V=ad}return aa};var I=F.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF_-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF_-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*_-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF_-]|\\.)+)(?:\((['"]*)((?:\([^\)]+\)|[^\2\(\)]*)+)\2\))?/},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(T){return T.getAttribute("href")}},relative:{"+":function(aa,T,Z){var X=typeof T==="string",ab=X&&!/\W/.test(T),Y=X&&!ab;if(ab&&!Z){T=T.toUpperCase()}for(var W=0,V=aa.length,U;W<V;W++){if((U=aa[W])){while((U=U.previousSibling)&&U.nodeType!==1){}aa[W]=Y||U&&U.nodeName===T?U||false:U===T}}if(Y){F.filter(T,aa,true)}},">":function(Z,U,aa){var X=typeof U==="string";if(X&&!/\W/.test(U)){U=aa?U:U.toUpperCase();for(var V=0,T=Z.length;V<T;V++){var Y=Z[V];if(Y){var W=Y.parentNode;Z[V]=W.nodeName===U?W:false}}}else{for(var V=0,T=Z.length;V<T;V++){var Y=Z[V];if(Y){Z[V]=X?Y.parentNode:Y.parentNode===U}}if(X){F.filter(U,Z,true)}}},"":function(W,U,Y){var V=L++,T=S;if(!U.match(/\W/)){var X=U=Y?U:U.toUpperCase();T=P}T("parentNode",U,V,W,X,Y)},"~":function(W,U,Y){var V=L++,T=S;if(typeof U==="string"&&!U.match(/\W/)){var X=U=Y?U:U.toUpperCase();T=P}T("previousSibling",U,V,W,X,Y)}},find:{ID:function(U,V,W){if(typeof V.getElementById!=="undefined"&&!W){var T=V.getElementById(U[1]);return T?[T]:[]}},NAME:function(V,Y,Z){if(typeof Y.getElementsByName!=="undefined"){var U=[],X=Y.getElementsByName(V[1]);for(var W=0,T=X.length;W<T;W++){if(X[W].getAttribute("name")===V[1]){U.push(X[W])}}return U.length===0?null:U}},TAG:function(T,U){return U.getElementsByTagName(T[1])}},preFilter:{CLASS:function(W,U,V,T,Z,aa){W=" "+W[1].replace(/\\/g,"")+" ";if(aa){return W}for(var X=0,Y;(Y=U[X])!=null;X++){if(Y){if(Z^(Y.className&&(" "+Y.className+" ").indexOf(W)>=0)){if(!V){T.push(Y)}}else{if(V){U[X]=false}}}}return false},ID:function(T){return T[1].replace(/\\/g,"")},TAG:function(U,T){for(var V=0;T[V]===false;V++){}return T[V]&&Q(T[V])?U[1]:U[1].toUpperCase()},CHILD:function(T){if(T[1]=="nth"){var U=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(T[2]=="even"&&"2n"||T[2]=="odd"&&"2n+1"||!/\D/.test(T[2])&&"0n+"+T[2]||T[2]);T[2]=(U[1]+(U[2]||1))-0;T[3]=U[3]-0}T[0]=L++;return T},ATTR:function(X,U,V,T,Y,Z){var W=X[1].replace(/\\/g,"");if(!Z&&I.attrMap[W]){X[1]=I.attrMap[W]}if(X[2]==="~="){X[4]=" "+X[4]+" "}return X},PSEUDO:function(X,U,V,T,Y){if(X[1]==="not"){if(X[3].match(R).length>1||/^\w/.test(X[3])){X[3]=F(X[3],null,null,U)}else{var W=F.filter(X[3],U,V,true^Y);if(!V){T.push.apply(T,W)}return false}}else{if(I.match.POS.test(X[0])||I.match.CHILD.test(X[0])){return true}}return X},POS:function(T){T.unshift(true);return T}},filters:{enabled:function(T){return T.disabled===false&&T.type!=="hidden"},disabled:function(T){return T.disabled===true},checked:function(T){return T.checked===true},selected:function(T){T.parentNode.selectedIndex;return T.selected===true},parent:function(T){return !!T.firstChild},empty:function(T){return !T.firstChild},has:function(V,U,T){return !!F(T[3],V).length},header:function(T){return/h\d/i.test(T.nodeName)},text:function(T){return"text"===T.type},radio:function(T){return"radio"===T.type},checkbox:function(T){return"checkbox"===T.type},file:function(T){return"file"===T.type},password:function(T){return"password"===T.type},submit:function(T){return"submit"===T.type},image:function(T){return"image"===T.type},reset:function(T){return"reset"===T.type},button:function(T){return"button"===T.type||T.nodeName.toUpperCase()==="BUTTON"},input:function(T){return/input|select|textarea|button/i.test(T.nodeName)}},setFilters:{first:function(U,T){return T===0},last:function(V,U,T,W){return U===W.length-1},even:function(U,T){return T%2===0},odd:function(U,T){return T%2===1},lt:function(V,U,T){return U<T[3]-0},gt:function(V,U,T){return U>T[3]-0},nth:function(V,U,T){return T[3]-0==U},eq:function(V,U,T){return T[3]-0==U}},filter:{PSEUDO:function(Z,V,W,aa){var U=V[1],X=I.filters[U];if(X){return X(Z,W,V,aa)}else{if(U==="contains"){return(Z.textContent||Z.innerText||"").indexOf(V[3])>=0}else{if(U==="not"){var Y=V[3];for(var W=0,T=Y.length;W<T;W++){if(Y[W]===Z){return false}}return true}}}},CHILD:function(T,W){var Z=W[1],U=T;switch(Z){case"only":case"first":while(U=U.previousSibling){if(U.nodeType===1){return false}}if(Z=="first"){return true}U=T;case"last":while(U=U.nextSibling){if(U.nodeType===1){return false}}return true;case"nth":var V=W[2],ac=W[3];if(V==1&&ac==0){return true}var Y=W[0],ab=T.parentNode;if(ab&&(ab.sizcache!==Y||!T.nodeIndex)){var X=0;for(U=ab.firstChild;U;U=U.nextSibling){if(U.nodeType===1){U.nodeIndex=++X}}ab.sizcache=Y}var aa=T.nodeIndex-ac;if(V==0){return aa==0}else{return(aa%V==0&&aa/V>=0)}}},ID:function(U,T){return U.nodeType===1&&U.getAttribute("id")===T},TAG:function(U,T){return(T==="*"&&U.nodeType===1)||U.nodeName===T},CLASS:function(U,T){return(" "+(U.className||U.getAttribute("class"))+" ").indexOf(T)>-1},ATTR:function(Y,W){var V=W[1],T=I.attrHandle[V]?I.attrHandle[V](Y):Y[V]!=null?Y[V]:Y.getAttribute(V),Z=T+"",X=W[2],U=W[4];return T==null?X==="!=":X==="="?Z===U:X==="*="?Z.indexOf(U)>=0:X==="~="?(" "+Z+" ").indexOf(U)>=0:!U?Z&&T!==false:X==="!="?Z!=U:X==="^="?Z.indexOf(U)===0:X==="$="?Z.substr(Z.length-U.length)===U:X==="|="?Z===U||Z.substr(0,U.length+1)===U+"-":false},POS:function(X,U,V,Y){var T=U[2],W=I.setFilters[T];if(W){return W(X,V,U,Y)}}}};var M=I.match.POS;for(var O in I.match){I.match[O]=RegExp(I.match[O].source+/(?![^\[]*\])(?![^\(]*\))/.source)}var E=function(U,T){U=Array.prototype.slice.call(U);if(T){T.push.apply(T,U);return T}return U};try{Array.prototype.slice.call(document.documentElement.childNodes)}catch(N){E=function(X,W){var U=W||[];if(H.call(X)==="[object Array]"){Array.prototype.push.apply(U,X)}else{if(typeof X.length==="number"){for(var V=0,T=X.length;V<T;V++){U.push(X[V])}}else{for(var V=0;X[V];V++){U.push(X[V])}}}return U}}var G;if(document.documentElement.compareDocumentPosition){G=function(U,T){var V=U.compareDocumentPosition(T)&4?-1:U===T?0:1;if(V===0){hasDuplicate=true}return V}}else{if("sourceIndex" in document.documentElement){G=function(U,T){var V=U.sourceIndex-T.sourceIndex;if(V===0){hasDuplicate=true}return V}}else{if(document.createRange){G=function(W,U){var V=W.ownerDocument.createRange(),T=U.ownerDocument.createRange();V.selectNode(W);V.collapse(true);T.selectNode(U);T.collapse(true);var X=V.compareBoundaryPoints(Range.START_TO_END,T);if(X===0){hasDuplicate=true}return X}}}}(function(){var U=document.createElement("form"),V="script"+(new Date).getTime();U.innerHTML="<input name='"+V+"'/>";var T=document.documentElement;T.insertBefore(U,T.firstChild);if(!!document.getElementById(V)){I.find.ID=function(X,Y,Z){if(typeof Y.getElementById!=="undefined"&&!Z){var W=Y.getElementById(X[1]);return W?W.id===X[1]||typeof W.getAttributeNode!=="undefined"&&W.getAttributeNode("id").nodeValue===X[1]?[W]:g:[]}};I.filter.ID=function(Y,W){var X=typeof Y.getAttributeNode!=="undefined"&&Y.getAttributeNode("id");return Y.nodeType===1&&X&&X.nodeValue===W}}T.removeChild(U)})();(function(){var T=document.createElement("div");T.appendChild(document.createComment(""));if(T.getElementsByTagName("*").length>0){I.find.TAG=function(U,Y){var X=Y.getElementsByTagName(U[1]);if(U[1]==="*"){var W=[];for(var V=0;X[V];V++){if(X[V].nodeType===1){W.push(X[V])}}X=W}return X}}T.innerHTML="<a href='#'></a>";if(T.firstChild&&typeof T.firstChild.getAttribute!=="undefined"&&T.firstChild.getAttribute("href")!=="#"){I.attrHandle.href=function(U){return U.getAttribute("href",2)}}})();if(document.querySelectorAll){(function(){var T=F,U=document.createElement("div");U.innerHTML="<p class='TEST'></p>";if(U.querySelectorAll&&U.querySelectorAll(".TEST").length===0){return}F=function(Y,X,V,W){X=X||document;if(!W&&X.nodeType===9&&!Q(X)){try{return E(X.querySelectorAll(Y),V)}catch(Z){}}return T(Y,X,V,W)};F.find=T.find;F.filter=T.filter;F.selectors=T.selectors;F.matches=T.matches})()}if(document.getElementsByClassName&&document.documentElement.getElementsByClassName){(function(){var T=document.createElement("div");T.innerHTML="<div class='test e'></div><div class='test'></div>";if(T.getElementsByClassName("e").length===0){return}T.lastChild.className="e";if(T.getElementsByClassName("e").length===1){return}I.order.splice(1,0,"CLASS");I.find.CLASS=function(U,V,W){if(typeof V.getElementsByClassName!=="undefined"&&!W){return V.getElementsByClassName(U[1])}}})()}function P(U,Z,Y,ad,aa,ac){var ab=U=="previousSibling"&&!ac;for(var W=0,V=ad.length;W<V;W++){var T=ad[W];if(T){if(ab&&T.nodeType===1){T.sizcache=Y;T.sizset=W}T=T[U];var X=false;while(T){if(T.sizcache===Y){X=ad[T.sizset];break}if(T.nodeType===1&&!ac){T.sizcache=Y;T.sizset=W}if(T.nodeName===Z){X=T;break}T=T[U]}ad[W]=X}}}function S(U,Z,Y,ad,aa,ac){var ab=U=="previousSibling"&&!ac;for(var W=0,V=ad.length;W<V;W++){var T=ad[W];if(T){if(ab&&T.nodeType===1){T.sizcache=Y;T.sizset=W}T=T[U];var X=false;while(T){if(T.sizcache===Y){X=ad[T.sizset];break}if(T.nodeType===1){if(!ac){T.sizcache=Y;T.sizset=W}if(typeof Z!=="string"){if(T===Z){X=true;break}}else{if(F.filter(Z,[T]).length>0){X=T;break}}}T=T[U]}ad[W]=X}}}var K=document.compareDocumentPosition?function(U,T){return U.compareDocumentPosition(T)&16}:function(U,T){return U!==T&&(U.contains?U.contains(T):true)};var Q=function(T){return T.nodeType===9&&T.documentElement.nodeName!=="HTML"||!!T.ownerDocument&&Q(T.ownerDocument)};var J=function(T,aa){var W=[],X="",Y,V=aa.nodeType?[aa]:aa;while((Y=I.match.PSEUDO.exec(T))){X+=Y[0];T=T.replace(I.match.PSEUDO,"")}T=I.relative[T]?T+"*":T;for(var Z=0,U=V.length;Z<U;Z++){F(T,V[Z],W)}return F.filter(X,W)};o.find=F;o.filter=F.filter;o.expr=F.selectors;o.expr[":"]=o.expr.filters;F.selectors.filters.hidden=function(T){return T.offsetWidth===0||T.offsetHeight===0};F.selectors.filters.visible=function(T){return T.offsetWidth>0||T.offsetHeight>0};F.selectors.filters.animated=function(T){return o.grep(o.timers,function(U){return T===U.elem}).length};o.multiFilter=function(V,T,U){if(U){V=":not("+V+")"}return F.matches(V,T)};o.dir=function(V,U){var T=[],W=V[U];while(W&&W!=document){if(W.nodeType==1){T.push(W)}W=W[U]}return T};o.nth=function(X,T,V,W){T=T||1;var U=0;for(;X;X=X[V]){if(X.nodeType==1&&++U==T){break}}return X};o.sibling=function(V,U){var T=[];for(;V;V=V.nextSibling){if(V.nodeType==1&&V!=U){T.push(V)}}return T};return;l.Sizzle=F})();o.event={add:function(I,F,H,K){if(I.nodeType==3||I.nodeType==8){return}if(I.setInterval&&I!=l){I=l}if(!H.guid){H.guid=this.guid++}if(K!==g){var G=H;H=this.proxy(G);H.data=K}var E=o.data(I,"events")||o.data(I,"events",{}),J=o.data(I,"handle")||o.data(I,"handle",function(){return typeof o!=="undefined"&&!o.event.triggered?o.event.handle.apply(arguments.callee.elem,arguments):g});J.elem=I;o.each(F.split(/\s+/),function(M,N){var O=N.split(".");N=O.shift();H.type=O.slice().sort().join(".");var L=E[N];if(o.event.specialAll[N]){o.event.specialAll[N].setup.call(I,K,O)}if(!L){L=E[N]={};if(!o.event.special[N]||o.event.special[N].setup.call(I,K,O)===false){if(I.addEventListener){I.addEventListener(N,J,false)}else{if(I.attachEvent){I.attachEvent("on"+N,J)}}}}L[H.guid]=H;o.event.global[N]=true});I=null},guid:1,global:{},remove:function(K,H,J){if(K.nodeType==3||K.nodeType==8){return}var G=o.data(K,"events"),F,E;if(G){if(H===g||(typeof H==="string"&&H.charAt(0)==".")){for(var I in G){this.remove(K,I+(H||""))}}else{if(H.type){J=H.handler;H=H.type}o.each(H.split(/\s+/),function(M,O){var Q=O.split(".");O=Q.shift();var N=RegExp("(^|\\.)"+Q.slice().sort().join(".*\\.")+"(\\.|$)");if(G[O]){if(J){delete G[O][J.guid]}else{for(var P in G[O]){if(N.test(G[O][P].type)){delete G[O][P]}}}if(o.event.specialAll[O]){o.event.specialAll[O].teardown.call(K,Q)}for(F in G[O]){break}if(!F){if(!o.event.special[O]||o.event.special[O].teardown.call(K,Q)===false){if(K.removeEventListener){K.removeEventListener(O,o.data(K,"handle"),false)}else{if(K.detachEvent){K.detachEvent("on"+O,o.data(K,"handle"))}}}F=null;delete G[O]}}})}for(F in G){break}if(!F){var L=o.data(K,"handle");if(L){L.elem=null}o.removeData(K,"events");o.removeData(K,"handle")}}},trigger:function(I,K,H,E){var G=I.type||I;if(!E){I=typeof I==="object"?I[h]?I:o.extend(o.Event(G),I):o.Event(G);if(G.indexOf("!")>=0)
+{I.type=G=G.slice(0,-1);I.exclusive=true}if(!H){I.stopPropagation();if(this.global[G]){o.each(o.cache,function(){if(this.events&&this.events[G]){o.event.trigger(I,K,this.handle.elem)}})}}if(!H||H.nodeType==3||H.nodeType==8){return g}I.result=g;I.target=H;K=o.makeArray(K);K.unshift(I)}I.currentTarget=H;var J=o.data(H,"handle");if(J){J.apply(H,K)}if((!H[G]||(o.nodeName(H,"a")&&G=="click"))&&H["on"+G]&&H["on"+G].apply(H,K)===false){I.result=false}if(!E&&H[G]&&!I.isDefaultPrevented()&&!(o.nodeName(H,"a")&&G=="click")){this.triggered=true;try{H[G]()}catch(L){}}this.triggered=false;if(!I.isPropagationStopped()){var F=H.parentNode||H.ownerDocument;if(F){o.event.trigger(I,K,F,true)}}},handle:function(K){var J,E;K=arguments[0]=o.event.fix(K||l.event);K.currentTarget=this;var L=K.type.split(".");K.type=L.shift();J=!L.length&&!K.exclusive;var I=RegExp("(^|\\.)"+L.slice().sort().join(".*\\.")+"(\\.|$)");E=(o.data(this,"events")||{})[K.type];for(var G in E){var H=E[G];if(J||I.test(H.type)){K.handler=H;K.data=H.data;var F=H.apply(this,arguments);if(F!==g){K.result=F;if(F===false){K.preventDefault();K.stopPropagation()}}if(K.isImmediatePropagationStopped()){break}}}},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(H){if(H[h]){return H}var F=H;H=o.Event(F);for(var G=this.props.length,J;G;){J=this.props[--G];H[J]=F[J]}if(!H.target){H.target=H.srcElement||document}if(H.target.nodeType==3){H.target=H.target.parentNode}if(!H.relatedTarget&&H.fromElement){H.relatedTarget=H.fromElement==H.target?H.toElement:H.fromElement}if(H.pageX==null&&H.clientX!=null){var I=document.documentElement,E=document.body;H.pageX=H.clientX+(I&&I.scrollLeft||E&&E.scrollLeft||0)-(I.clientLeft||0);H.pageY=H.clientY+(I&&I.scrollTop||E&&E.scrollTop||0)-(I.clientTop||0)}if(!H.which&&((H.charCode||H.charCode===0)?H.charCode:H.keyCode)){H.which=H.charCode||H.keyCode}if(!H.metaKey&&H.ctrlKey){H.metaKey=H.ctrlKey}if(!H.which&&H.button){H.which=(H.button&1?1:(H.button&2?3:(H.button&4?2:0)))}return H},proxy:function(F,E){E=E||function(){return F.apply(this,arguments)};E.guid=F.guid=F.guid||E.guid||this.guid++;return E},special:{ready:{setup:B,teardown:function(){}}},specialAll:{live:{setup:function(E,F){o.event.add(this,F[0],c)},teardown:function(G){if(G.length){var E=0,F=RegExp("(^|\\.)"+G[0]+"(\\.|$)");o.each((o.data(this,"events").live||{}),function(){if(F.test(this.type)){E++}});if(E<1){o.event.remove(this,G[0],c)}}}}}};o.Event=function(E){if(!this.preventDefault){return new o.Event(E)}if(E&&E.type){this.originalEvent=E;this.type=E.type}else{this.type=E}this.timeStamp=e();this[h]=true};function k(){return false}function u(){return true}o.Event.prototype={preventDefault:function(){this.isDefaultPrevented=u;var E=this.originalEvent;if(!E){return}if(E.preventDefault){E.preventDefault()}E.returnValue=false},stopPropagation:function(){this.isPropagationStopped=u;var E=this.originalEvent;if(!E){return}if(E.stopPropagation){E.stopPropagation()}E.cancelBubble=true},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=u;this.stopPropagation()},isDefaultPrevented:k,isPropagationStopped:k,isImmediatePropagationStopped:k};var a=function(F){var E=F.relatedTarget;while(E&&E!=this){try{E=E.parentNode}catch(G){E=this}}if(E!=this){F.type=F.data;o.event.handle.apply(this,arguments)}};o.each({mouseover:"mouseenter",mouseout:"mouseleave"},function(F,E){o.event.special[E]={setup:function(){o.event.add(this,F,a,E)},teardown:function(){o.event.remove(this,F,a)}}});o.fn.extend({bind:function(F,G,E){return F=="unload"?this.one(F,G,E):this.each(function(){o.event.add(this,F,E||G,E&&G)})},one:function(G,H,F){var E=o.event.proxy(F||H,function(I){o(this).unbind(I,E);return(F||H).apply(this,arguments)});return this.each(function(){o.event.add(this,G,E,F&&H)})},unbind:function(F,E){return this.each(function(){o.event.remove(this,F,E)})},trigger:function(E,F){return this.each(function(){o.event.trigger(E,F,this)})},triggerHandler:function(E,G){if(this[0]){var F=o.Event(E);F.preventDefault();F.stopPropagation();o.event.trigger(F,G,this[0]);return F.result}},toggle:function(G){var E=arguments,F=1;while(F<E.length){o.event.proxy(G,E[F++])}return this.click(o.event.proxy(G,function(H){this.lastToggle=(this.lastToggle||0)%F;H.preventDefault();return E[this.lastToggle++].apply(this,arguments)||false}))},hover:function(E,F){return this.mouseenter(E).mouseleave(F)},ready:function(E){B();if(o.isReady){E.call(document,o)}else{o.readyList.push(E)}return this},live:function(G,F){var E=o.event.proxy(F);E.guid+=this.selector+G;o(document).bind(i(G,this.selector),this.selector,E);return this},die:function(F,E){o(document).unbind(i(F,this.selector),E?{guid:E.guid+this.selector+F}:null);return this}});function c(H){var E=RegExp("(^|\\.)"+H.type+"(\\.|$)"),G=true,F=[];o.each(o.data(this,"events").live||[],function(I,J){if(E.test(J.type)){var K=o(H.target).closest(J.data)[0];if(K){F.push({elem:K,fn:J})}}});F.sort(function(J,I){return o.data(J.elem,"closest")-o.data(I.elem,"closest")});o.each(F,function(){if(this.fn.call(this.elem,H,this.fn.data)===false){return(G=false)}});return G}function i(F,E){return["live",F,E.replace(/\./g,"`").replace(/ /g,"|")].join(".")}o.extend({isReady:false,readyList:[],ready:function(){if(!o.isReady){o.isReady=true;if(o.readyList){o.each(o.readyList,function(){this.call(document,o)});o.readyList=null}o(document).triggerHandler("ready")}}});var x=false;function B(){if(x){return}x=true;if(document.addEventListener){document.addEventListener("DOMContentLoaded",function(){document.removeEventListener("DOMContentLoaded",arguments.callee,false);o.ready()},false)}else{if(document.attachEvent){document.attachEvent("onreadystatechange",function(){if(document.readyState==="complete"){document.detachEvent("onreadystatechange",arguments.callee);o.ready()}});if(document.documentElement.doScroll&&l==l.top){(function(){if(o.isReady){return}try{document.documentElement.doScroll("left")}catch(E){setTimeout(arguments.callee,0);return}o.ready()})()}}}o.event.add(l,"load",o.ready)}o.each(("blur,focus,load,resize,scroll,unload,click,dblclick,mousedown,mouseup,mousemove,mouseover,mouseout,mouseenter,mouseleave,change,select,submit,keydown,keypress,keyup,error").split(","),function(F,E){o.fn[E]=function(G){return G?this.bind(E,G):this.trigger(E)}});o(l).bind("unload",function(){for(var E in o.cache){if(E!=1&&o.cache[E].handle){o.event.remove(o.cache[E].handle.elem)}}});(function(){o.support={};var F=document.documentElement,G=document.createElement("script"),K=document.createElement("div"),J="script"+(new Date).getTime();K.style.display="none";K.innerHTML='   <link/><table></table><a href="/a" style="color:red;float:left;opacity:.5;">a</a><select><option>text</option></select><object><param/></object>';var H=K.getElementsByTagName("*"),E=K.getElementsByTagName("a")[0];if(!H||!H.length||!E){return}o.support={leadingWhitespace:K.firstChild.nodeType==3,tbody:!K.getElementsByTagName("tbody").length,objectAll:!!K.getElementsByTagName("object")[0].getElementsByTagName("*").length,htmlSerialize:!!K.getElementsByTagName("link").length,style:/red/.test(E.getAttribute("style")),hrefNormalized:E.getAttribute("href")==="/a",opacity:E.style.opacity==="0.5",cssFloat:!!E.style.cssFloat,scriptEval:false,noCloneEvent:true,boxModel:null};G.type="text/javascript";try{G.appendChild(document.createTextNode("window."+J+"=1;"))}catch(I){}F.insertBefore(G,F.firstChild);if(l[J]){o.support.scriptEval=true;delete l[J]}F.removeChild(G);if(K.attachEvent&&K.fireEvent){K.attachEvent("onclick",function(){o.support.noCloneEvent=false;K.detachEvent("onclick",arguments.callee)});K.cloneNode(true).fireEvent("onclick")}o(function(){var L=document.createElement("div");L.style.width=L.style.paddingLeft="1px";document.body.appendChild(L);o.boxModel=o.support.boxModel=L.offsetWidth===2;document.body.removeChild(L).style.display="none"})})();var w=o.support.cssFloat?"cssFloat":"styleFloat";o.props={"for":"htmlFor","class":"className","float":w,cssFloat:w,styleFloat:w,readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",tabindex:"tabIndex"};o.fn.extend({_load:o.fn.load,load:function(G,J,K){if(typeof G!=="string"){return this._load(G)}var I=G.indexOf(" ");if(I>=0){var E=G.slice(I,G.length);G=G.slice(0,I)}var H="GET";if(J){if(o.isFunction(J)){K=J;J=null}else{if(typeof J==="object"){J=o.param(J);H="POST"}}}var F=this;o.ajax({url:G,type:H,dataType:"html",data:J,complete:function(M,L){if(L=="success"||L=="notmodified"){F.html(E?o("<div/>").append(M.responseText.replace(/<script(.|\s)*?\/script>/g,"")).find(E):M.responseText)}if(K){F.each(K,[M.responseText,L,M])}}});return this},serialize:function(){return o.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?o.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password|search/i.test(this.type))}).map(function(E,F){var G=o(this).val();return G==null?null:o.isArray(G)?o.map(G,function(I,H){return{name:F.name,value:I}}):{name:F.name,value:G}}).get()}});o.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(E,F){o.fn[F]=function(G){return this.bind(F,G)}});var r=e();o.extend({get:function(E,G,H,F){if(o.isFunction(G)){H=G;G=null}return o.ajax({type:"GET",url:E,data:G,success:H,dataType:F})},getScript:function(E,F){return o.get(E,null,F,"script")},getJSON:function(E,F,G){return o.get(E,F,G,"json")},post:function(E,G,H,F){if(o.isFunction(G)){H=G;G={}}return o.ajax({type:"POST",url:E,data:G,success:H,dataType:F})},ajaxSetup:function(E){o.extend(o.ajaxSettings,E)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return l.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest()},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(M){M=o.extend(true,M,o.extend(true,{},o.ajaxSettings,M));var W,F=/=\?(&|$)/g,R,V,G=M.type.toUpperCase();if(M.data&&M.processData&&typeof M.data!=="string"){M.data=o.param(M.data)}if(M.dataType=="jsonp"){if(G=="GET"){if(!M.url.match(F)){M.url+=(M.url.match(/\?/)?"&":"?")+(M.jsonp||"callback")+"=?"}}else{if(!M.data||!M.data.match(F)){M.data=(M.data?M.data+"&":"")+(M.jsonp||"callback")+"=?"}}M.dataType="json"}if(M.dataType=="json"&&(M.data&&M.data.match(F)||M.url.match(F))){W="jsonp"+r++;if(M.data){M.data=(M.data+"").replace(F,"="+W+"$1")}M.url=M.url.replace(F,"="+W+"$1");M.dataType="script";l[W]=function(X){V=X;I();L();l[W]=g;try{delete l[W]}catch(Y){}if(H){H.removeChild(T)}}}if(M.dataType=="script"&&M.cache==null){M.cache=false}if(M.cache===false&&G=="GET"){var E=e();var U=M.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+E+"$2");M.url=U+((U==M.url)?(M.url.match(/\?/)?"&":"?")+"_="+E:"")}if(M.data&&G=="GET"){M.url+=(M.url.match(/\?/)?"&":"?")+M.data;M.data=null}if(M.global&&!o.active++){o.event.trigger("ajaxStart")}var Q=/^(\w+:)?\/\/([^\/?#]+)/.exec(M.url);if(M.dataType=="script"&&G=="GET"&&Q&&(Q[1]&&Q[1]!=location.protocol||Q[2]!=location.host)){var H=document.getElementsByTagName("head")[0];var T=document.createElement("script");T.src=M.url;if(M.scriptCharset){T.charset=M.scriptCharset}if(!W){var O=false;T.onload=T.onreadystatechange=function(){if(!O&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){O=true;I();L();T.onload=T.onreadystatechange=null;H.removeChild(T)}}}H.appendChild(T);return g}var K=false;var J=M.xhr();if(M.username){J.open(G,M.url,M.async,M.username,M.password)}else{J.open(G,M.url,M.async)}try{if(M.data){J.setRequestHeader("Content-Type",M.contentType)}if(M.ifModified){J.setRequestHeader("If-Modified-Since",o.lastModified[M.url]||"Thu, 01 Jan 1970 00:00:00 GMT")}J.setRequestHeader("X-Requested-With","XMLHttpRequest");J.setRequestHeader("Accept",M.dataType&&M.accepts[M.dataType]?M.accepts[M.dataType]+", */*":M.accepts._default)}catch(S){}if(M.beforeSend&&M.beforeSend(J,M)===false){if(M.global&&!--o.active){o.event.trigger("ajaxStop")}J.abort();return false}if(M.global){o.event.trigger("ajaxSend",[J,M])}var N=function(X){if(J.readyState==0){if(P){clearInterval(P);P=null;if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}}else{if(!K&&J&&(J.readyState==4||X=="timeout")){K=true;if(P){clearInterval(P);P=null}R=X=="timeout"?"timeout":!o.httpSuccess(J)?"error":M.ifModified&&o.httpNotModified(J,M.url)?"notmodified":"success";if(R=="success"){try{V=o.httpData(J,M.dataType,M)}catch(Z){R="parsererror"}}if(R=="success"){var Y;try{Y=J.getResponseHeader("Last-Modified")}catch(Z){}if(M.ifModified&&Y){o.lastModified[M.url]=Y}if(!W){I()}}else{o.handleError(M,J,R)}L();if(X){J.abort()}if(M.async){J=null}}}};if(M.async){var P=setInterval(N,13);if(M.timeout>0){setTimeout(function(){if(J&&!K){N("timeout")}},M.timeout)}}try{J.send(M.data)}catch(S){o.handleError(M,J,null,S)}if(!M.async){N()}function I(){if(M.success){M.success(V,R)}if(M.global){o.event.trigger("ajaxSuccess",[J,M])}}function L(){if(M.complete){M.complete(J,R)}if(M.global){o.event.trigger("ajaxComplete",[J,M])}if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}return J},handleError:function(F,H,E,G){if(F.error){F.error(H,E,G)}if(F.global){o.event.trigger("ajaxError",[H,F,G])}},active:0,httpSuccess:function(F){try{return !F.status&&location.protocol=="file:"||(F.status>=200&&F.status<300)||F.status==304||F.status==1223}catch(E){}return false},httpNotModified:function(G,E){try{var H=G.getResponseHeader("Last-Modified");return G.status==304||H==o.lastModified[E]}catch(F){}return false},httpData:function(J,H,G){var F=J.getResponseHeader("content-type"),E=H=="xml"||!H&&F&&F.indexOf("xml")>=0,I=E?J.responseXML:J.responseText;if(E&&I.documentElement.tagName=="parsererror"){throw"parsererror"}if(G&&G.dataFilter){I=G.dataFilter(I,H)}if(typeof I==="string"){if(H=="script"){o.globalEval(I)}if(H=="json"){I=l["eval"]("("+I+")")}}return I},param:function(E){var G=[];function H(I,J){G[G.length]=encodeURIComponent(I)+"="+encodeURIComponent(J)}if(o.isArray(E)||E.jquery){o.each(E,function(){H(this.name,this.value)})}else{for(var F in E){if(o.isArray(E[F])){o.each(E[F],function(){H(F,this)})}else{H(F,o.isFunction(E[F])?E[F]():E[F])}}}return G.join("&").replace(/%20/g,"+")}});var m={},n,d=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];function t(F,E){var G={};o.each(d.concat.apply([],d.slice(0,E)),function()
+{G[this]=F});return G}o.fn.extend({show:function(J,L){if(J){return this.animate(t("show",3),J,L)}else{for(var H=0,F=this.length;H<F;H++){var E=o.data(this[H],"olddisplay");this[H].style.display=E||"";if(o.css(this[H],"display")==="none"){var G=this[H].tagName,K;if(m[G]){K=m[G]}else{var I=o("<"+G+" />").appendTo("body");K=I.css("display");if(K==="none"){K="block"}I.remove();m[G]=K}o.data(this[H],"olddisplay",K)}}for(var H=0,F=this.length;H<F;H++){this[H].style.display=o.data(this[H],"olddisplay")||""}return this}},hide:function(H,I){if(H){return this.animate(t("hide",3),H,I)}else{for(var G=0,F=this.length;G<F;G++){var E=o.data(this[G],"olddisplay");if(!E&&E!=="none"){o.data(this[G],"olddisplay",o.css(this[G],"display"))}}for(var G=0,F=this.length;G<F;G++){this[G].style.display="none"}return this}},_toggle:o.fn.toggle,toggle:function(G,F){var E=typeof G==="boolean";return o.isFunction(G)&&o.isFunction(F)?this._toggle.apply(this,arguments):G==null||E?this.each(function(){var H=E?G:o(this).is(":hidden");o(this)[H?"show":"hide"]()}):this.animate(t("toggle",3),G,F)},fadeTo:function(E,G,F){return this.animate({opacity:G},E,F)},animate:function(I,F,H,G){var E=o.speed(F,H,G);return this[E.queue===false?"each":"queue"](function(){var K=o.extend({},E),M,L=this.nodeType==1&&o(this).is(":hidden"),J=this;for(M in I){if(I[M]=="hide"&&L||I[M]=="show"&&!L){return K.complete.call(this)}if((M=="height"||M=="width")&&this.style){K.display=o.css(this,"display");K.overflow=this.style.overflow}}if(K.overflow!=null){this.style.overflow="hidden"}K.curAnim=o.extend({},I);o.each(I,function(O,S){var R=new o.fx(J,K,O);if(/toggle|show|hide/.test(S)){R[S=="toggle"?L?"show":"hide":S](I)}else{var Q=S.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),T=R.cur(true)||0;if(Q){var N=parseFloat(Q[2]),P=Q[3]||"px";if(P!="px"){J.style[O]=(N||1)+P;T=((N||1)/R.cur(true))*T;J.style[O]=T+P}if(Q[1]){N=((Q[1]=="-="?-1:1)*N)+T}R.custom(T,N,P)}else{R.custom(T,S,"")}}});return true})},stop:function(F,E){var G=o.timers;if(F){this.queue([])}this.each(function(){for(var H=G.length-1;H>=0;H--){if(G[H].elem==this){if(E){G[H](true)}G.splice(H,1)}}});if(!E){this.dequeue()}return this}});o.each({slideDown:t("show",1),slideUp:t("hide",1),slideToggle:t("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(E,F){o.fn[E]=function(G,H){return this.animate(F,G,H)}});o.extend({speed:function(G,H,F){var E=typeof G==="object"?G:{complete:F||!F&&H||o.isFunction(G)&&G,duration:G,easing:F&&H||H&&!o.isFunction(H)&&H};E.duration=o.fx.off?0:typeof E.duration==="number"?E.duration:o.fx.speeds[E.duration]||o.fx.speeds._default;E.old=E.complete;E.complete=function(){if(E.queue!==false){o(this).dequeue()}if(o.isFunction(E.old)){E.old.call(this)}};return E},easing:{linear:function(G,H,E,F){return E+F*G},swing:function(G,H,E,F){return((-Math.cos(G*Math.PI)/2)+0.5)*F+E}},timers:[],fx:function(F,E,G){this.options=E;this.elem=F;this.prop=G;if(!E.orig){E.orig={}}}});o.fx.prototype={update:function(){if(this.options.step){this.options.step.call(this.elem,this.now,this)}(o.fx.step[this.prop]||o.fx.step._default)(this);if((this.prop=="height"||this.prop=="width")&&this.elem.style){this.elem.style.display="block"}},cur:function(F){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null)){return this.elem[this.prop]}var E=parseFloat(o.css(this.elem,this.prop,F));return E&&E>-10000?E:parseFloat(o.curCSS(this.elem,this.prop))||0},custom:function(I,H,G){this.startTime=e();this.start=I;this.end=H;this.unit=G||this.unit||"px";this.now=this.start;this.pos=this.state=0;var E=this;function F(J){return E.step(J)}F.elem=this.elem;if(F()&&o.timers.push(F)&&!n){n=setInterval(function(){var K=o.timers;for(var J=0;J<K.length;J++){if(!K[J]()){K.splice(J--,1)}}if(!K.length){clearInterval(n);n=g}},13)}},show:function(){this.options.orig[this.prop]=o.attr(this.elem.style,this.prop);this.options.show=true;this.custom(this.prop=="width"||this.prop=="height"?1:0,this.cur());o(this.elem).show()},hide:function(){this.options.orig[this.prop]=o.attr(this.elem.style,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(H){var G=e();if(H||G>=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var E=true;for(var F in this.options.curAnim){if(this.options.curAnim[F]!==true){E=false}}if(E){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(o.css(this.elem,"display")=="none"){this.elem.style.display="block"}}if(this.options.hide){o(this.elem).hide()}if(this.options.hide||this.options.show){for(var I in this.options.curAnim){o.attr(this.elem.style,I,this.options.orig[I])}}this.options.complete.call(this.elem)}return false}else{var J=G-this.startTime;this.state=J/this.options.duration;this.pos=o.easing[this.options.easing||(o.easing.swing?"swing":"linear")](this.state,J,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update()}return true}};o.extend(o.fx,{speeds:{slow:600,fast:200,_default:400},step:{opacity:function(E){o.attr(E.elem.style,"opacity",E.now)},_default:function(E){if(E.elem.style&&E.elem.style[E.prop]!=null){E.elem.style[E.prop]=E.now+E.unit}else{E.elem[E.prop]=E.now}}}});if(document.documentElement.getBoundingClientRect){o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}var G=this[0].getBoundingClientRect(),J=this[0].ownerDocument,F=J.body,E=J.documentElement,L=E.clientTop||F.clientTop||0,K=E.clientLeft||F.clientLeft||0,I=G.top+(self.pageYOffset||o.boxModel&&E.scrollTop||F.scrollTop)-L,H=G.left+(self.pageXOffset||o.boxModel&&E.scrollLeft||F.scrollLeft)-K;return{top:I,left:H}}}else{o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}o.offset.initialized||o.offset.initialize();var J=this[0],G=J.offsetParent,F=J,O=J.ownerDocument,M,H=O.documentElement,K=O.body,L=O.defaultView,E=L.getComputedStyle(J,null),N=J.offsetTop,I=J.offsetLeft;while((J=J.parentNode)&&J!==K&&J!==H){M=L.getComputedStyle(J,null);N-=J.scrollTop,I-=J.scrollLeft;if(J===G){N+=J.offsetTop,I+=J.offsetLeft;if(o.offset.doesNotAddBorder&&!(o.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(J.tagName))){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}F=G,G=J.offsetParent}if(o.offset.subtractsBorderForOverflowNotVisible&&M.overflow!=="visible"){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}E=M}if(E.position==="relative"||E.position==="static"){N+=K.offsetTop,I+=K.offsetLeft}if(E.position==="fixed"){N+=Math.max(H.scrollTop,K.scrollTop),I+=Math.max(H.scrollLeft,K.scrollLeft)}return{top:N,left:I}}}o.offset={initialize:function(){if(this.initialized){return}var L=document.body,F=document.createElement("div"),H,G,N,I,M,E,J=L.style.marginTop,K='<div style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;"><div></div></div><table style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;" cellpadding="0" cellspacing="0"><tr><td></td></tr></table>';M={position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"};for(E in M){F.style[E]=M[E]}F.innerHTML=K;L.insertBefore(F,L.firstChild);H=F.firstChild,G=H.firstChild,I=H.nextSibling.firstChild.firstChild;this.doesNotAddBorder=(G.offsetTop!==5);this.doesAddBorderForTableAndCells=(I.offsetTop===5);H.style.overflow="hidden",H.style.position="relative";this.subtractsBorderForOverflowNotVisible=(G.offsetTop===-5);L.style.marginTop="1px";this.doesNotIncludeMarginInBodyOffset=(L.offsetTop===0);L.style.marginTop=J;L.removeChild(F);this.initialized=true},bodyOffset:function(E){o.offset.initialized||o.offset.initialize();var G=E.offsetTop,F=E.offsetLeft;if(o.offset.doesNotIncludeMarginInBodyOffset){G+=parseInt(o.curCSS(E,"marginTop",true),10)||0,F+=parseInt(o.curCSS(E,"marginLeft",true),10)||0}return{top:G,left:F}}};o.fn.extend({position:function(){var I=0,H=0,F;if(this[0]){var G=this.offsetParent(),J=this.offset(),E=/^body|html$/i.test(G[0].tagName)?{top:0,left:0}:G.offset();J.top-=j(this,"marginTop");J.left-=j(this,"marginLeft");E.top+=j(G,"borderTopWidth");E.left+=j(G,"borderLeftWidth");F={top:J.top-E.top,left:J.left-E.left}}return F},offsetParent:function(){var E=this[0].offsetParent||document.body;while(E&&(!/^body|html$/i.test(E.tagName)&&o.css(E,"position")=="static")){E=E.offsetParent}return o(E)}});o.each(["Left","Top"],function(F,E){var G="scroll"+E;o.fn[G]=function(H){if(!this[0]){return null}return H!==g?this.each(function(){this==l||this==document?l.scrollTo(!F?H:o(l).scrollLeft(),F?H:o(l).scrollTop()):this[G]=H}):this[0]==l||this[0]==document?self[F?"pageYOffset":"pageXOffset"]||o.boxModel&&document.documentElement[G]||document.body[G]:this[0][G]}});o.each(["Height","Width"],function(I,G){var E=I?"Left":"Top",H=I?"Right":"Bottom",F=G.toLowerCase();o.fn["inner"+G]=function(){return this[0]?o.css(this[0],F,false,"padding"):null};o.fn["outer"+G]=function(K){return this[0]?o.css(this[0],F,false,K?"margin":"border"):null};var J=G.toLowerCase();o.fn[J]=function(K){return this[0]==l?document.compatMode=="CSS1Compat"&&document.documentElement["client"+G]||document.body["client"+G]:this[0]==document?Math.max(document.documentElement["client"+G],document.body["scroll"+G],document.documentElement["scroll"+G],document.body["offset"+G],document.documentElement["offset"+G]):K===g?(this.length?o.css(this[0],J):null):this.css(J,typeof K==="string"?K:K+"px")}})})();
+
+/*
+ * jQuery hashchange event - v1.3 - 7/21/2010
+ * http://benalman.com/projects/jquery-hashchange-plugin/
+ * 
+ * Copyright (c) 2010 "Cowboy" Ben Alman
+ * Dual licensed under the MIT and GPL licenses.
+ * http://benalman.com/about/license/
+ */
+(function($,e,b){var c="hashchange",h=document,f,g=$.event.special,i=h.documentMode,d="on"+c in e&&(i===b||i>7);function a(j){j=j||location.href;return"#"+j.replace(/^[^#]*#?(.*)$/,"$1")}$.fn[c]=function(j){return j?this.bind(c,j):this.trigger(c)};$.fn[c].delay=50;g[c]=$.extend(g[c],{setup:function(){if(d){return false}$(f.start)},teardown:function(){if(d){return false}$(f.stop)}});f=(function(){var j={},p,m=a(),k=function(q){return q},l=k,o=k;j.start=function(){p||n()};j.stop=function(){p&&clearTimeout(p);p=b};function n(){var r=a(),q=o(m);if(r!==m){l(m=r,q);$(e).trigger(c)}else{if(q!==m){location.href=location.href.replace(/#.*/,"")+q}}p=setTimeout(n,$.fn[c].delay)}$.browser.msie&&!d&&(function(){var q,r;j.start=function(){if(!q){r=$.fn[c].src;r=r&&r+a();q=$('<iframe tabindex="-1" title="empty"/>').hide().one("load",function(){r||l(a());n()}).attr("src",r||"javascript:0").insertAfter("body")[0].contentWindow;h.onpropertychange=function(){try{if(event.propertyName==="title"){q.document.title=h.title}}catch(s){}}}};j.stop=k;o=function(){return a(q.location.href)};l=function(v,s){var u=q.document,t=$.fn[c].domain;if(v!==s){u.title=h.title;u.open();t&&u.write('<script>document.domain="'+t+'"<\/script>');u.close();q.location.hash=v}}})();return j})()})(jQuery,this);
+/*
+ * jQuery UI 1.7.2
+ *
+ * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * http://docs.jquery.com/UI
+ */
+jQuery.ui||(function(c){var i=c.fn.remove,d=c.browser.mozilla&&(parseFloat(c.browser.version)<1.9);c.ui={version:"1.7.2",plugin:{add:function(k,l,n){var m=c.ui[k].prototype;for(var j in n){m.plugins[j]=m.plugins[j]||[];m.plugins[j].push([l,n[j]])}},call:function(j,l,k){var n=j.plugins[l];if(!n||!j.element[0].parentNode){return}for(var m=0;m<n.length;m++){if(j.options[n[m][0]]){n[m][1].apply(j.element,k)}}}},contains:function(k,j){return document.compareDocumentPosition?k.compareDocumentPosition(j)&16:k!==j&&k.contains(j)},hasScroll:function(m,k){if(c(m).css("overflow")=="hidden"){return false}var j=(k&&k=="left")?"scrollLeft":"scrollTop",l=false;if(m[j]>0){return true}m[j]=1;l=(m[j]>0);m[j]=0;return l},isOverAxis:function(k,j,l){return(k>j)&&(k<(j+l))},isOver:function(o,k,n,m,j,l){return c.ui.isOverAxis(o,n,j)&&c.ui.isOverAxis(k,m,l)},keyCode:{BACKSPACE:8,CAPS_LOCK:20,COMMA:188,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38}};if(d){var f=c.attr,e=c.fn.removeAttr,h="http://www.w3.org/2005/07/aaa",a=/^aria-/,b=/^wairole:/;c.attr=function(k,j,l){var m=l!==undefined;return(j=="role"?(m?f.call(this,k,j,"wairole:"+l):(f.apply(this,arguments)||"").replace(b,"")):(a.test(j)?(m?k.setAttributeNS(h,j.replace(a,"aaa:"),l):f.call(this,k,j.replace(a,"aaa:"))):f.apply(this,arguments)))};c.fn.removeAttr=function(j){return(a.test(j)?this.each(function(){this.removeAttributeNS(h,j.replace(a,""))}):e.call(this,j))}}c.fn.extend({remove:function(){c("*",this).add(this).each(function(){c(this).triggerHandler("remove")});return i.apply(this,arguments)},enableSelection:function(){return this.attr("unselectable","off").css("MozUserSelect","").unbind("selectstart.ui")},disableSelection:function(){return this.attr("unselectable","on").css("MozUserSelect","none").bind("selectstart.ui",function(){return false})},scrollParent:function(){var j;if((c.browser.msie&&(/(static|relative)/).test(this.css("position")))||(/absolute/).test(this.css("position"))){j=this.parents().filter(function(){return(/(relative|absolute|fixed)/).test(c.curCSS(this,"position",1))&&(/(auto|scroll)/).test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0)}else{j=this.parents().filter(function(){return(/(auto|scroll)/).test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0)}return(/fixed/).test(this.css("position"))||!j.length?c(document):j}});c.extend(c.expr[":"],{data:function(l,k,j){return !!c.data(l,j[3])},focusable:function(k){var l=k.nodeName.toLowerCase(),j=c.attr(k,"tabindex");return(/input|select|textarea|button|object/.test(l)?!k.disabled:"a"==l||"area"==l?k.href||!isNaN(j):!isNaN(j))&&!c(k)["area"==l?"parents":"closest"](":hidden").length},tabbable:function(k){var j=c.attr(k,"tabindex");return(isNaN(j)||j>=0)&&c(k).is(":focusable")}});function g(m,n,o,l){function k(q){var p=c[m][n][q]||[];return(typeof p=="string"?p.split(/,?\s+/):p)}var j=k("getter");if(l.length==1&&typeof l[0]=="string"){j=j.concat(k("getterSetter"))}return(c.inArray(o,j)!=-1)}c.widget=function(k,j){var l=k.split(".")[0];k=k.split(".")[1];c.fn[k]=function(p){var n=(typeof p=="string"),o=Array.prototype.slice.call(arguments,1);if(n&&p.substring(0,1)=="_"){return this}if(n&&g(l,k,p,o)){var m=c.data(this[0],k);return(m?m[p].apply(m,o):undefined)}return this.each(function(){var q=c.data(this,k);(!q&&!n&&c.data(this,k,new c[l][k](this,p))._init());(q&&n&&c.isFunction(q[p])&&q[p].apply(q,o))})};c[l]=c[l]||{};c[l][k]=function(o,n){var m=this;this.namespace=l;this.widgetName=k;this.widgetEventPrefix=c[l][k].eventPrefix||k;this.widgetBaseClass=l+"-"+k;this.options=c.extend({},c.widget.defaults,c[l][k].defaults,c.metadata&&c.metadata.get(o)[k],n);this.element=c(o).bind("setData."+k,function(q,p,r){if(q.target==o){return m._setData(p,r)}}).bind("getData."+k,function(q,p){if(q.target==o){return m._getData(p)}}).bind("remove",function(){return m.destroy()})};c[l][k].prototype=c.extend({},c.widget.prototype,j);c[l][k].getterSetter="option"};c.widget.prototype={_init:function(){},destroy:function(){this.element.removeData(this.widgetName).removeClass(this.widgetBaseClass+"-disabled "+this.namespace+"-state-disabled").removeAttr("aria-disabled")},option:function(l,m){var k=l,j=this;if(typeof l=="string"){if(m===undefined){return this._getData(l)}k={};k[l]=m}c.each(k,function(n,o){j._setData(n,o)})},_getData:function(j){return this.options[j]},_setData:function(j,k){this.options[j]=k;if(j=="disabled"){this.element[k?"addClass":"removeClass"](this.widgetBaseClass+"-disabled "+this.namespace+"-state-disabled").attr("aria-disabled",k)}},enable:function(){this._setData("disabled",false)},disable:function(){this._setData("disabled",true)},_trigger:function(l,m,n){var p=this.options[l],j=(l==this.widgetEventPrefix?l:this.widgetEventPrefix+l);m=c.Event(m);m.type=j;if(m.originalEvent){for(var k=c.event.props.length,o;k;){o=c.event.props[--k];m[o]=m.originalEvent[o]}}this.element.trigger(m,n);return !(c.isFunction(p)&&p.call(this.element[0],m,n)===false||m.isDefaultPrevented())}};c.widget.defaults={disabled:false};c.ui.mouse={_mouseInit:function(){var j=this;this.element.bind("mousedown."+this.widgetName,function(k){return j._mouseDown(k)}).bind("click."+this.widgetName,function(k){if(j._preventClickEvent){j._preventClickEvent=false;k.stopImmediatePropagation();return false}});if(c.browser.msie){this._mouseUnselectable=this.element.attr("unselectable");this.element.attr("unselectable","on")}this.started=false},_mouseDestroy:function(){this.element.unbind("."+this.widgetName);(c.browser.msie&&this.element.attr("unselectable",this._mouseUnselectable))},_mouseDown:function(l){l.originalEvent=l.originalEvent||{};if(l.originalEvent.mouseHandled){return}(this._mouseStarted&&this._mouseUp(l));this._mouseDownEvent=l;var k=this,m=(l.which==1),j=(typeof this.options.cancel=="string"?c(l.target).parents().add(l.target).filter(this.options.cancel).length:false);if(!m||j||!this._mouseCapture(l)){return true}this.mouseDelayMet=!this.options.delay;if(!this.mouseDelayMet){this._mouseDelayTimer=setTimeout(function(){k.mouseDelayMet=true},this.options.delay)}if(this._mouseDistanceMet(l)&&this._mouseDelayMet(l)){this._mouseStarted=(this._mouseStart(l)!==false);if(!this._mouseStarted){l.preventDefault();return true}}this._mouseMoveDelegate=function(n){return k._mouseMove(n)};this._mouseUpDelegate=function(n){return k._mouseUp(n)};c(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate);(c.browser.safari||l.preventDefault());l.originalEvent.mouseHandled=true;return true},_mouseMove:function(j){if(c.browser.msie&&!j.button){return this._mouseUp(j)}if(this._mouseStarted){this._mouseDrag(j);return j.preventDefault()}if(this._mouseDistanceMet(j)&&this._mouseDelayMet(j)){this._mouseStarted=(this._mouseStart(this._mouseDownEvent,j)!==false);(this._mouseStarted?this._mouseDrag(j):this._mouseUp(j))}return !this._mouseStarted},_mouseUp:function(j){c(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted=false;this._preventClickEvent=(j.target==this._mouseDownEvent.target);this._mouseStop(j)}return false},_mouseDistanceMet:function(j){return(Math.max(Math.abs(this._mouseDownEvent.pageX-j.pageX),Math.abs(this._mouseDownEvent.pageY-j.pageY))>=this.options.distance)},_mouseDelayMet:function(j){return this.mouseDelayMet},_mouseStart:function(j){},_mouseDrag:function(j){},_mouseStop:function(j){},_mouseCapture:function(j){return true}};c.ui.mouse.defaults={cancel:null,distance:1,delay:0}})(jQuery);;/* * jQuery UI Resizable 1.7.2
+ *
+ * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * http://docs.jquery.com/UI/Resizables
+ *
+ * Depends:
+ *	ui.core.js
+ */
+(function(c){c.widget("ui.resizable",c.extend({},c.ui.mouse,{_init:function(){var e=this,j=this.options;this.element.addClass("ui-resizable");c.extend(this,{_aspectRatio:!!(j.aspectRatio),aspectRatio:j.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:j.helper||j.ghost||j.animate?j.helper||"ui-resizable-helper":null});if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)){if(/relative/.test(this.element.css("position"))&&c.browser.opera){this.element.css({position:"relative",top:"auto",left:"auto"})}this.element.wrap(c('<div class="ui-wrapper" style="overflow: hidden;"></div>').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")}));this.element=this.element.parent().data("resizable",this.element.data("resizable"));this.elementIsWrapper=true;this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")});this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0});this.originalResizeStyle=this.originalElement.css("resize");this.originalElement.css("resize","none");this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"}));this.originalElement.css({margin:this.originalElement.css("margin")});this._proportionallyResize()}this.handles=j.handles||(!c(".ui-resizable-handle",this.element).length?"e,s,se":{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"});if(this.handles.constructor==String){if(this.handles=="all"){this.handles="n,e,s,w,se,sw,ne,nw"}var k=this.handles.split(",");this.handles={};for(var f=0;f<k.length;f++){var h=c.trim(k[f]),d="ui-resizable-"+h;var g=c('<div class="ui-resizable-handle '+d+'"></div>');if(/sw|se|ne|nw/.test(h)){g.css({zIndex:++j.zIndex})}if("se"==h){g.addClass("ui-icon ui-icon-gripsmall-diagonal-se")}this.handles[h]=".ui-resizable-"+h;this.element.append(g)}}this._renderAxis=function(p){p=p||this.element;for(var m in this.handles){if(this.handles[m].constructor==String){this.handles[m]=c(this.handles[m],this.element).show()}if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var n=c(this.handles[m],this.element),o=0;o=/sw|ne|nw|se|n|s/.test(m)?n.outerHeight():n.outerWidth();var l=["padding",/ne|nw|n/.test(m)?"Top":/se|sw|s/.test(m)?"Bottom":/^e$/.test(m)?"Right":"Left"].join("");p.css(l,o);this._proportionallyResize()}if(!c(this.handles[m]).length){continue}}};this._renderAxis(this.element);this._handles=c(".ui-resizable-handle",this.element).disableSelection();this._handles.mouseover(function(){if(!e.resizing){if(this.className){var i=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)}e.axis=i&&i[1]?i[1]:"se"}});if(j.autoHide){this._handles.hide();c(this.element).addClass("ui-resizable-autohide").hover(function(){c(this).removeClass("ui-resizable-autohide");e._handles.show()},function(){if(!e.resizing){c(this).addClass("ui-resizable-autohide");e._handles.hide()}})}this._mouseInit()},destroy:function(){this._mouseDestroy();var d=function(f){c(f).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};if(this.elementIsWrapper){d(this.element);var e=this.element;e.parent().append(this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")})).end().remove()}this.originalElement.css("resize",this.originalResizeStyle);d(this.originalElement)},_mouseCapture:function(e){var f=false;for(var d in this.handles){if(c(this.handles[d])[0]==e.target){f=true}}return this.options.disabled||!!f},_mouseStart:function(f){var i=this.options,e=this.element.position(),d=this.element;this.resizing=true;this.documentScroll={top:c(document).scrollTop(),left:c(document).scrollLeft()};if(d.is(".ui-draggable")||(/absolute/).test(d.css("position"))){d.css({position:"absolute",top:e.top,left:e.left})}if(c.browser.opera&&(/relative/).test(d.css("position"))){d.css({position:"relative",top:"auto",left:"auto"})}this._renderProxy();var j=b(this.helper.css("left")),g=b(this.helper.css("top"));if(i.containment){j+=c(i.containment).scrollLeft()||0;g+=c(i.containment).scrollTop()||0}this.offset=this.helper.offset();this.position={left:j,top:g};this.size=this._helper?{width:d.outerWidth(),height:d.outerHeight()}:{width:d.width(),height:d.height()};this.originalSize=this._helper?{width:d.outerWidth(),height:d.outerHeight()}:{width:d.width(),height:d.height()};this.originalPosition={left:j,top:g};this.sizeDiff={width:d.outerWidth()-d.width(),height:d.outerHeight()-d.height()};this.originalMousePosition={left:f.pageX,top:f.pageY};this.aspectRatio=(typeof i.aspectRatio=="number")?i.aspectRatio:((this.originalSize.width/this.originalSize.height)||1);var h=c(".ui-resizable-"+this.axis).css("cursor");c("body").css("cursor",h=="auto"?this.axis+"-resize":h);d.addClass("ui-resizable-resizing");this._propagate("start",f);return true},_mouseDrag:function(d){var g=this.helper,f=this.options,l={},p=this,i=this.originalMousePosition,m=this.axis;var q=(d.pageX-i.left)||0,n=(d.pageY-i.top)||0;var h=this._change[m];if(!h){return false}var k=h.apply(this,[d,q,n]),j=c.browser.msie&&c.browser.version<7,e=this.sizeDiff;if(this._aspectRatio||d.shiftKey){k=this._updateRatio(k,d)}k=this._respectSize(k,d);this._propagate("resize",d);g.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"});if(!this._helper&&this._proportionallyResizeElements.length){this._proportionallyResize()}this._updateCache(k);this._trigger("resize",d,this.ui());return false},_mouseStop:function(g){this.resizing=false;var h=this.options,l=this;if(this._helper){var f=this._proportionallyResizeElements,d=f.length&&(/textarea/i).test(f[0].nodeName),e=d&&c.ui.hasScroll(f[0],"left")?0:l.sizeDiff.height,j=d?0:l.sizeDiff.width;var m={width:(l.size.width-j),height:(l.size.height-e)},i=(parseInt(l.element.css("left"),10)+(l.position.left-l.originalPosition.left))||null,k=(parseInt(l.element.css("top"),10)+(l.position.top-l.originalPosition.top))||null;if(!h.animate){this.element.css(c.extend(m,{top:k,left:i}))}l.helper.height(l.size.height);l.helper.width(l.size.width);if(this._helper&&!h.animate){this._proportionallyResize()}}c("body").css("cursor","auto");this.element.removeClass("ui-resizable-resizing");this._propagate("stop",g);if(this._helper){this.helper.remove()}return false},_updateCache:function(d){var e=this.options;this.offset=this.helper.offset();if(a(d.left)){this.position.left=d.left}if(a(d.top)){this.position.top=d.top}if(a(d.height)){this.size.height=d.height}if(a(d.width)){this.size.width=d.width}},_updateRatio:function(g,f){var h=this.options,i=this.position,e=this.size,d=this.axis;if(g.height){g.width=(e.height*this.aspectRatio)}else{if(g.width){g.height=(e.width/this.aspectRatio)}}if(d=="sw"){g.left=i.left+(e.width-g.width);g.top=null}if(d=="nw"){g.top=i.top+(e.height-g.height);g.left=i.left+(e.width-g.width)}return g},_respectSize:function(k,f){var i=this.helper,h=this.options,q=this._aspectRatio||f.shiftKey,p=this.axis,s=a(k.width)&&h.maxWidth&&(h.maxWidth<k.width),l=a(k.height)&&h.maxHeight&&(h.maxHeight<k.height),g=a(k.width)&&h.minWidth&&(h.minWidth>k.width),r=a(k.height)&&h.minHeight&&(h.minHeight>k.height);if(g){k.width=h.minWidth}if(r){k.height=h.minHeight}if(s){k.width=h.maxWidth}if(l){k.height=h.maxHeight}var e=this.originalPosition.left+this.originalSize.width,n=this.position.top+this.size.height;var j=/sw|nw|w/.test(p),d=/nw|ne|n/.test(p);if(g&&j){k.left=e-h.minWidth}if(s&&j){k.left=e-h.maxWidth}if(r&&d){k.top=n-h.minHeight}if(l&&d){k.top=n-h.maxHeight}var m=!k.width&&!k.height;if(m&&!k.left&&k.top){k.top=null}else{if(m&&!k.top&&k.left){k.left=null}}return k},_proportionallyResize:function(){var j=this.options;if(!this._proportionallyResizeElements.length){return}var f=this.helper||this.element;for(var e=0;e<this._proportionallyResizeElements.length;e++){var g=this._proportionallyResizeElements[e];if(!this.borderDif){var d=[g.css("borderTopWidth"),g.css("borderRightWidth"),g.css("borderBottomWidth"),g.css("borderLeftWidth")],h=[g.css("paddingTop"),g.css("paddingRight"),g.css("paddingBottom"),g.css("paddingLeft")];this.borderDif=c.map(d,function(k,m){var l=parseInt(k,10)||0,n=parseInt(h[m],10)||0;return l+n})}if(c.browser.msie&&!(!(c(f).is(":hidden")||c(f).parents(":hidden").length))){continue}g.css({height:(f.height()-this.borderDif[0]-this.borderDif[2])||0,width:(f.width()-this.borderDif[1]-this.borderDif[3])||0})}},_renderProxy:function(){var e=this.element,h=this.options;this.elementOffset=e.offset();if(this._helper){this.helper=this.helper||c('<div style="overflow:hidden;"></div>');var d=c.browser.msie&&c.browser.version<7,f=(d?1:0),g=(d?2:-1);this.helper.addClass(this._helper).css({width:this.element.outerWidth()+g,height:this.element.outerHeight()+g,position:"absolute",left:this.elementOffset.left-f+"px",top:this.elementOffset.top-f+"px",zIndex:++h.zIndex});this.helper.appendTo("body").disableSelection()}else{this.helper=this.element}},_change:{e:function(f,e,d){return{width:this.originalSize.width+e}},w:function(g,e,d){var i=this.options,f=this.originalSize,h=this.originalPosition;return{left:h.left+e,width:f.width-e}},n:function(g,e,d){var i=this.options,f=this.originalSize,h=this.originalPosition;return{top:h.top+d,height:f.height-d}},s:function(f,e,d){return{height:this.originalSize.height+d}},se:function(f,e,d){return c.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[f,e,d]))},sw:function(f,e,d){return c.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[f,e,d]))},ne:function(f,e,d){return c.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[f,e,d]))},nw:function(f,e,d){return c.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[f,e,d]))}},_propagate:function(e,d){c.ui.plugin.call(this,e,[d,this.ui()]);(e!="resize"&&this._trigger(e,d,this.ui()))},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}));c.extend(c.ui.resizable,{version:"1.7.2",eventPrefix:"resize",defaults:{alsoResize:false,animate:false,animateDuration:"slow",animateEasing:"swing",aspectRatio:false,autoHide:false,cancel:":input,option",containment:false,delay:0,distance:1,ghost:false,grid:false,handles:"e,s,se",helper:false,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:1000}});c.ui.plugin.add("resizable","alsoResize",{start:function(e,f){var d=c(this).data("resizable"),g=d.options;_store=function(h){c(h).each(function(){c(this).data("resizable-alsoresize",{width:parseInt(c(this).width(),10),height:parseInt(c(this).height(),10),left:parseInt(c(this).css("left"),10),top:parseInt(c(this).css("top"),10)})})};if(typeof(g.alsoResize)=="object"&&!g.alsoResize.parentNode){if(g.alsoResize.length){g.alsoResize=g.alsoResize[0];_store(g.alsoResize)}else{c.each(g.alsoResize,function(h,i){_store(h)})}}else{_store(g.alsoResize)}},resize:function(f,h){var e=c(this).data("resizable"),i=e.options,g=e.originalSize,k=e.originalPosition;var j={height:(e.size.height-g.height)||0,width:(e.size.width-g.width)||0,top:(e.position.top-k.top)||0,left:(e.position.left-k.left)||0},d=function(l,m){c(l).each(function(){var p=c(this),q=c(this).data("resizable-alsoresize"),o={},n=m&&m.length?m:["width","height","top","left"];c.each(n||["width","height","top","left"],function(r,t){var s=(q[t]||0)+(j[t]||0);if(s&&s>=0){o[t]=s||null}});if(/relative/.test(p.css("position"))&&c.browser.opera){e._revertToRelativePosition=true;p.css({position:"absolute",top:"auto",left:"auto"})}p.css(o)})};if(typeof(i.alsoResize)=="object"&&!i.alsoResize.nodeType){c.each(i.alsoResize,function(l,m){d(l,m)})}else{d(i.alsoResize)}},stop:function(e,f){var d=c(this).data("resizable");if(d._revertToRelativePosition&&c.browser.opera){d._revertToRelativePosition=false;el.css({position:"relative"})}c(this).removeData("resizable-alsoresize-start")}});c.ui.plugin.add("resizable","animate",{stop:function(h,m){var n=c(this).data("resizable"),i=n.options;var g=n._proportionallyResizeElements,d=g.length&&(/textarea/i).test(g[0].nodeName),e=d&&c.ui.hasScroll(g[0],"left")?0:n.sizeDiff.height,k=d?0:n.sizeDiff.width;var f={width:(n.size.width-k),height:(n.size.height-e)},j=(parseInt(n.element.css("left"),10)+(n.position.left-n.originalPosition.left))||null,l=(parseInt(n.element.css("top"),10)+(n.position.top-n.originalPosition.top))||null;n.element.animate(c.extend(f,l&&j?{top:l,left:j}:{}),{duration:i.animateDuration,easing:i.animateEasing,step:function(){var o={width:parseInt(n.element.css("width"),10),height:parseInt(n.element.css("height"),10),top:parseInt(n.element.css("top"),10),left:parseInt(n.element.css("left"),10)};if(g&&g.length){c(g[0]).css({width:o.width,height:o.height})}n._updateCache(o);n._propagate("resize",h)}})}});c.ui.plugin.add("resizable","containment",{start:function(e,q){var s=c(this).data("resizable"),i=s.options,k=s.element;var f=i.containment,j=(f instanceof c)?f.get(0):(/parent/.test(f))?k.parent().get(0):f;if(!j){return}s.containerElement=c(j);if(/document/.test(f)||f==document){s.containerOffset={left:0,top:0};s.containerPosition={left:0,top:0};s.parentData={element:c(document),left:0,top:0,width:c(document).width(),height:c(document).height()||document.body.parentNode.scrollHeight}}else{var m=c(j),h=[];c(["Top","Right","Left","Bottom"]).each(function(p,o){h[p]=b(m.css("padding"+o))});s.containerOffset=m.offset();s.containerPosition=m.position();s.containerSize={height:(m.innerHeight()-h[3]),width:(m.innerWidth()-h[1])};var n=s.containerOffset,d=s.containerSize.height,l=s.containerSize.width,g=(c.ui.hasScroll(j,"left")?j.scrollWidth:l),r=(c.ui.hasScroll(j)?j.scrollHeight:d);s.parentData={element:j,left:n.left,top:n.top,width:g,height:r}}},resize:function(f,p){var s=c(this).data("resizable"),h=s.options,e=s.containerSize,n=s.containerOffset,l=s.size,m=s.position,q=s._aspectRatio||f.shiftKey,d={top:0,left:0},g=s.containerElement;if(g[0]!=document&&(/static/).test(g.css("position"))){d=n}if(m.left<(s._helper?n.left:0)){s.size.width=s.size.width+(s._helper?(s.position.left-n.left):(s.position.left-d.left));if(q){s.size.height=s.size.width/h.aspectRatio}s.position.left=h.helper?n.left:0}if(m.top<(s._helper?n.top:0))
+{s.size.height=s.size.height+(s._helper?(s.position.top-n.top):s.position.top);if(q){s.size.width=s.size.height*h.aspectRatio}s.position.top=s._helper?n.top:0}s.offset.left=s.parentData.left+s.position.left;s.offset.top=s.parentData.top+s.position.top;var k=Math.abs((s._helper?s.offset.left-d.left:(s.offset.left-d.left))+s.sizeDiff.width),r=Math.abs((s._helper?s.offset.top-d.top:(s.offset.top-n.top))+s.sizeDiff.height);var j=s.containerElement.get(0)==s.element.parent().get(0),i=/relative|absolute/.test(s.containerElement.css("position"));if(j&&i){k-=s.parentData.left}if(k+s.size.width>=s.parentData.width){s.size.width=s.parentData.width-k;if(q){s.size.height=s.size.width/s.aspectRatio}}if(r+s.size.height>=s.parentData.height){s.size.height=s.parentData.height-r;if(q){s.size.width=s.size.height*s.aspectRatio}}},stop:function(e,m){var p=c(this).data("resizable"),f=p.options,k=p.position,l=p.containerOffset,d=p.containerPosition,g=p.containerElement;var i=c(p.helper),q=i.offset(),n=i.outerWidth()-p.sizeDiff.width,j=i.outerHeight()-p.sizeDiff.height;if(p._helper&&!f.animate&&(/relative/).test(g.css("position"))){c(this).css({left:q.left-d.left-l.left,width:n,height:j})}if(p._helper&&!f.animate&&(/static/).test(g.css("position"))){c(this).css({left:q.left-d.left-l.left,width:n,height:j})}}});c.ui.plugin.add("resizable","ghost",{start:function(f,g){var d=c(this).data("resizable"),h=d.options,e=d.size;d.ghost=d.originalElement.clone();d.ghost.css({opacity:0.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof h.ghost=="string"?h.ghost:"");d.ghost.appendTo(d.helper)},resize:function(e,f){var d=c(this).data("resizable"),g=d.options;if(d.ghost){d.ghost.css({position:"relative",height:d.size.height,width:d.size.width})}},stop:function(e,f){var d=c(this).data("resizable"),g=d.options;if(d.ghost&&d.helper){d.helper.get(0).removeChild(d.ghost.get(0))}}});c.ui.plugin.add("resizable","grid",{resize:function(d,l){var n=c(this).data("resizable"),g=n.options,j=n.size,h=n.originalSize,i=n.originalPosition,m=n.axis,k=g._aspectRatio||d.shiftKey;g.grid=typeof g.grid=="number"?[g.grid,g.grid]:g.grid;var f=Math.round((j.width-h.width)/(g.grid[0]||1))*(g.grid[0]||1),e=Math.round((j.height-h.height)/(g.grid[1]||1))*(g.grid[1]||1);if(/^(se|s|e)$/.test(m)){n.size.width=h.width+f;n.size.height=h.height+e}else{if(/^(ne)$/.test(m)){n.size.width=h.width+f;n.size.height=h.height+e;n.position.top=i.top-e}else{if(/^(sw)$/.test(m)){n.size.width=h.width+f;n.size.height=h.height+e;n.position.left=i.left-f}else{n.size.width=h.width+f;n.size.height=h.height+e;n.position.top=i.top-e;n.position.left=i.left-f}}}}});var b=function(d){return parseInt(d,10)||0};var a=function(d){return !isNaN(parseInt(d,10))}})(jQuery);;
+/**
+ * jQuery.ScrollTo - Easy element scrolling using jQuery.
+ * Copyright (c) 2008 Ariel Flesler - aflesler(at)gmail(dot)com
+ * Licensed under GPL license (http://www.opensource.org/licenses/gpl-license.php).
+ * Date: 2/8/2008
+ * @author Ariel Flesler
+ * @version 1.3.2
+ */
+;(function($){var o=$.scrollTo=function(a,b,c){o.window().scrollTo(a,b,c)};o.defaults={axis:'y',duration:1};o.window=function(){return $($.browser.safari?'body':'html')};$.fn.scrollTo=function(l,m,n){if(typeof m=='object'){n=m;m=0}n=$.extend({},o.defaults,n);m=m||n.speed||n.duration;n.queue=n.queue&&n.axis.length>1;if(n.queue)m/=2;n.offset=j(n.offset);n.over=j(n.over);return this.each(function(){var a=this,b=$(a),t=l,c,d={},w=b.is('html,body');switch(typeof t){case'number':case'string':if(/^([+-]=)?\d+(px)?$/.test(t)){t=j(t);break}t=$(t,this);case'object':if(t.is||t.style)c=(t=$(t)).offset()}$.each(n.axis.split(''),function(i,f){var P=f=='x'?'Left':'Top',p=P.toLowerCase(),k='scroll'+P,e=a[k],D=f=='x'?'Width':'Height';if(c){d[k]=c[p]+(w?0:e-b.offset()[p]);if(n.margin){d[k]-=parseInt(t.css('margin'+P))||0;d[k]-=parseInt(t.css('border'+P+'Width'))||0}d[k]+=n.offset[p]||0;if(n.over[p])d[k]+=t[D.toLowerCase()]()*n.over[p]}else d[k]=t[p];if(/^\d+$/.test(d[k]))d[k]=d[k]<=0?0:Math.min(d[k],h(D));if(!i&&n.queue){if(e!=d[k])g(n.onAfterFirst);delete d[k]}});g(n.onAfter);function g(a){b.animate(d,m,n.easing,a&&function(){a.call(this,l)})};function h(D){var b=w?$.browser.opera?document.body:document.documentElement:a;return b['scroll'+D]-b['client'+D]}})};function j(a){return typeof a=='object'?a:{top:a,left:a}}})(jQuery);
+
diff --git a/native_client_sdk/doc_generated/pepper_stable/c/ppb__graphics__2d_8h.html b/native_client_sdk/doc_generated/pepper_stable/c/ppb__graphics__2d_8h.html
index 4a81442..84a4eb6 100644
--- a/native_client_sdk/doc_generated/pepper_stable/c/ppb__graphics__2d_8h.html
+++ b/native_client_sdk/doc_generated/pepper_stable/c/ppb__graphics__2d_8h.html
@@ -19,15 +19,15 @@
 </div><h2>
 Data Structures</h2><table class="memberdecls">
 
-<tr><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___graphics2_d__1__1.html">PPB_Graphics2D</a></td></tr>
-<tr><td class="mdescLeft">&#160;</td><td class="mdescRight"><code>PPB_Graphics2D</code> defines the interface for a 2D graphics context.  <a href="struct_p_p_b___graphics2_d__1__1.html#details">More...</a><br /></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___graphics2_d__1__2.html">PPB_Graphics2D</a></td></tr>
+<tr><td class="mdescLeft">&#160;</td><td class="mdescRight"><code>PPB_Graphics2D</code> defines the interface for a 2D graphics context.  <a href="struct_p_p_b___graphics2_d__1__2.html#details">More...</a><br /></td></tr>
 </table><h2>
 Defines</h2><table class="memberdecls">
-<tr><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ppb__graphics__2d_8h.html#ad9792b60ca6ce77f3925be8d60e06640">PPB_GRAPHICS_2D_INTERFACE</a>&#160;&#160;&#160;&quot;PPB_Graphics2D;1.1&quot;</td></tr>
-<tr><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ppb__graphics__2d_8h.html#ab4930fe7aea6b403503d5cc748824b0d">PPB_GRAPHICS_2D_INTERFACE</a>&#160;&#160;&#160;<a class="el" href="ppb__graphics__2d_8h.html#ad9792b60ca6ce77f3925be8d60e06640">PPB_GRAPHICS_2D_INTERFACE</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ppb__graphics__2d_8h.html#a8991520a54fc032adae6e8de92d0e0c5">PPB_GRAPHICS_2D_INTERFACE</a>&#160;&#160;&#160;&quot;PPB_Graphics2D;1.2&quot;</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ppb__graphics__2d_8h.html#ab4930fe7aea6b403503d5cc748824b0d">PPB_GRAPHICS_2D_INTERFACE</a>&#160;&#160;&#160;<a class="el" href="ppb__graphics__2d_8h.html#a8991520a54fc032adae6e8de92d0e0c5">PPB_GRAPHICS_2D_INTERFACE</a></td></tr>
 </table><h2>
 Typedefs</h2><table class="memberdecls">
-<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___graphics2_d__1__1.html">PPB_Graphics2D</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#gaf9f8348d3315d8bb014b401f733ebdb6">PPB_Graphics2D</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___graphics2_d__1__2.html">PPB_Graphics2D</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#gae81de3c5ca761162254ed217693050ba">PPB_Graphics2D</a></td></tr>
 </table>
 <hr /><a name="details" id="details"></a><h2>Detailed Description</h2>
 <div class="textblock"><p>Defines the <code>PPB_Graphics2D</code> struct representing a 2D graphics context within the browser. </p>
@@ -37,19 +37,19 @@
 <div class="memproto">
 <table class="memname">
 <tr>
-<td class="memname">#define <a class="el" href="ppb__graphics__2d_8h.html#ab4930fe7aea6b403503d5cc748824b0d">PPB_GRAPHICS_2D_INTERFACE</a>&#160;&#160;&#160;<a class="el" href="ppb__graphics__2d_8h.html#ad9792b60ca6ce77f3925be8d60e06640">PPB_GRAPHICS_2D_INTERFACE</a></td>
+<td class="memname">#define <a class="el" href="ppb__graphics__2d_8h.html#ab4930fe7aea6b403503d5cc748824b0d">PPB_GRAPHICS_2D_INTERFACE</a>&#160;&#160;&#160;<a class="el" href="ppb__graphics__2d_8h.html#a8991520a54fc032adae6e8de92d0e0c5">PPB_GRAPHICS_2D_INTERFACE</a></td>
 </tr>
 </table>
 </div>
 <div class="memdoc">
 </div>
 </div>
-<a class="anchor" id="ad9792b60ca6ce77f3925be8d60e06640"></a><!-- doxytag: member="ppb_graphics_2d.h::PPB_GRAPHICS_2D_INTERFACE" ref="ad9792b60ca6ce77f3925be8d60e06640" args="" -->
+<a class="anchor" id="a8991520a54fc032adae6e8de92d0e0c5"></a><!-- doxytag: member="ppb_graphics_2d.h::PPB_GRAPHICS_2D_INTERFACE" ref="a8991520a54fc032adae6e8de92d0e0c5" args="" -->
 <div class="memitem">
 <div class="memproto">
 <table class="memname">
 <tr>
-<td class="memname">#define <a class="el" href="ppb__graphics__2d_8h.html#ad9792b60ca6ce77f3925be8d60e06640">PPB_GRAPHICS_2D_INTERFACE</a>&#160;&#160;&#160;&quot;PPB_Graphics2D;1.1&quot;</td>
+<td class="memname">#define <a class="el" href="ppb__graphics__2d_8h.html#a8991520a54fc032adae6e8de92d0e0c5">PPB_GRAPHICS_2D_INTERFACE</a>&#160;&#160;&#160;&quot;PPB_Graphics2D;1.2&quot;</td>
 </tr>
 </table>
 </div>
diff --git a/native_client_sdk/doc_generated/pepper_stable/c/ppb__input__event_8h.html b/native_client_sdk/doc_generated/pepper_stable/c/ppb__input__event_8h.html
index 1312059..b80c7b30 100644
--- a/native_client_sdk/doc_generated/pepper_stable/c/ppb__input__event_8h.html
+++ b/native_client_sdk/doc_generated/pepper_stable/c/ppb__input__event_8h.html
@@ -102,7 +102,9 @@
 <a class="el" href="group___enums.html#gga21b811ac0484a214a8751aa3e1c959d9a493ca598187014e2356cd7a5ba8cdffd">PP_INPUTEVENT_MODIFIER_NUMLOCKKEY</a> =  1 &lt;&lt; 10, 
 <a class="el" href="group___enums.html#gga21b811ac0484a214a8751aa3e1c959d9a8295bfc8067c06a17ccfc5fb6a992e17">PP_INPUTEVENT_MODIFIER_ISLEFT</a> =  1 &lt;&lt; 11, 
 <br />
-&#160;&#160;<a class="el" href="group___enums.html#gga21b811ac0484a214a8751aa3e1c959d9a348f43efaf61edbefd83346428c5b122">PP_INPUTEVENT_MODIFIER_ISRIGHT</a> =  1 &lt;&lt; 12
+&#160;&#160;<a class="el" href="group___enums.html#gga21b811ac0484a214a8751aa3e1c959d9a348f43efaf61edbefd83346428c5b122">PP_INPUTEVENT_MODIFIER_ISRIGHT</a> =  1 &lt;&lt; 12, 
+<a class="el" href="group___enums.html#gga21b811ac0484a214a8751aa3e1c959d9a970ad827a7240093ec57f1a3a7aea692">PP_INPUTEVENT_MODIFIER_ISPEN</a> =  1 &lt;&lt; 13, 
+<a class="el" href="group___enums.html#gga21b811ac0484a214a8751aa3e1c959d9a3367f08ba940a67d0098a59093582ef1">PP_INPUTEVENT_MODIFIER_ISERASER</a> =  1 &lt;&lt; 14
 <br />
  }</td></tr>
 <tr><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#ga25113f3c8d33e863fd38b3f70f8a5e6e">PP_InputEvent_MouseButton</a> { <a class="el" href="group___enums.html#gga25113f3c8d33e863fd38b3f70f8a5e6eaa2d4e499d6c23ef45381a89612e654d9">PP_INPUTEVENT_MOUSEBUTTON_NONE</a> =  -1, 
diff --git a/native_client_sdk/doc_generated/pepper_stable/c/ppb__vpn__provider_8h.html b/native_client_sdk/doc_generated/pepper_stable/c/ppb__vpn__provider_8h.html
new file mode 100644
index 0000000..27e0fa7741
--- /dev/null
+++ b/native_client_sdk/doc_generated/pepper_stable/c/ppb__vpn__provider_8h.html
@@ -0,0 +1,45 @@
+{{+bindTo:partials.standard_nacl_api}}
+<h1>ppb_vpn_provider.h File Reference</h1>
+<div id="doxygen-ref">
+{{- dummy div to appease doxygen -}}
+  <div>
+<!-- Generated by Doxygen 1.7.6.1 -->
+
+
+</div>
+<!--header-->
+<div class="contents">
+<div class="textblock"><div class="dynheader">
+Include dependency graph for ppb_vpn_provider.h:</div>
+<div class="dyncontent">
+<div class="center"><img src="ppb__vpn__provider_8h__incl.png" border="0" usemap="#ppb__vpn__provider_8h" alt="" /></div>
+<map name="ppb__vpn__provider_8h" id="ppb__vpn__provider_8h">
+</map>
+</div>
+</div><h2>
+Data Structures</h2><table class="memberdecls">
+
+<tr><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___vpn_provider__0__1.html">PPB_VpnProvider</a></td></tr>
+<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Use the <code>PPB_VpnProvider</code> interface to implement a VPN client.  <a href="struct_p_p_b___vpn_provider__0__1.html#details">More...</a><br /></td></tr>
+</table><h2>
+Defines</h2><table class="memberdecls">
+<tr><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ppb__vpn__provider_8h.html#adc236058517f438cdd43d61c8948de69">PPB_VPNPROVIDER_INTERFACE</a>&#160;&#160;&#160;&quot;PPB_VpnProvider;0.1&quot; /* dev */</td></tr>
+</table>
+<hr /><a name="details" id="details"></a><h2>Detailed Description</h2>
+<div class="textblock"><p>This file defines the <code>PPB_VpnProvider</code> interface. </p>
+</div><hr /><h2>Define Documentation</h2>
+<a class="anchor" id="adc236058517f438cdd43d61c8948de69"></a><!-- doxytag: member="ppb_vpn_provider.h::PPB_VPNPROVIDER_INTERFACE" ref="adc236058517f438cdd43d61c8948de69" args="" -->
+<div class="memitem">
+<div class="memproto">
+<table class="memname">
+<tr>
+<td class="memname">#define <a class="el" href="ppb__vpn__provider_8h.html#adc236058517f438cdd43d61c8948de69">PPB_VPNPROVIDER_INTERFACE</a>&#160;&#160;&#160;&quot;PPB_VpnProvider;0.1&quot; /* dev */</td>
+</tr>
+</table>
+</div>
+<div class="memdoc">
+</div>
+</div>
+</div><!-- contents -->
+</div>
+{{/partials.standard_nacl_api}}
diff --git a/native_client_sdk/doc_generated/pepper_stable/c/ppb__vpn__provider_8h__incl.png b/native_client_sdk/doc_generated/pepper_stable/c/ppb__vpn__provider_8h__incl.png
new file mode 100644
index 0000000..8283005f
--- /dev/null
+++ b/native_client_sdk/doc_generated/pepper_stable/c/ppb__vpn__provider_8h__incl.png
Binary files differ
diff --git a/native_client_sdk/doc_generated/pepper_stable/c/struct_p_p___gamepad_sample_data.html b/native_client_sdk/doc_generated/pepper_stable/c/struct_p_p___gamepad_sample_data.html
index b198568..33332ca 100644
--- a/native_client_sdk/doc_generated/pepper_stable/c/struct_p_p___gamepad_sample_data.html
+++ b/native_client_sdk/doc_generated/pepper_stable/c/struct_p_p___gamepad_sample_data.html
@@ -19,7 +19,7 @@
 <tr><td class="memItemLeft" align="right" valign="top">double&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___gamepad_sample_data.html#af832f6af0964f9023d712712a6e3afc7">timestamp</a></td></tr>
 <tr><td class="memItemLeft" align="right" valign="top">uint16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___gamepad_sample_data.html#a0a4d0498f6beecb54628a4f1919c48e3">id</a> [128]</td></tr>
 <tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___gamepad_sample_data.html#ae955efce5fcd9de08ab8d4c7f52d0af7">connected</a></td></tr>
-<tr><td class="memItemLeft" align="right" valign="top">char&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___gamepad_sample_data.html#aad71d81059bd5880ebd79bc3b9e55cd5">unused_pad_</a> [4]</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">int8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___gamepad_sample_data.html#a6d8faab2471cbf6133481d7df6c53c3f">unused_pad_</a> [4]</td></tr>
 </table>
 <hr /><a name="details" id="details"></a><h2>Detailed Description</h2>
 <div class="textblock"><p>The data for one gamepad device. </p>
@@ -119,12 +119,12 @@
 <p>Monotonically increasing value that is incremented when the data have been updated. </p>
 </div>
 </div>
-<a class="anchor" id="aad71d81059bd5880ebd79bc3b9e55cd5"></a><!-- doxytag: member="PP_GamepadSampleData::unused_pad_" ref="aad71d81059bd5880ebd79bc3b9e55cd5" args="[4]" -->
+<a class="anchor" id="a6d8faab2471cbf6133481d7df6c53c3f"></a><!-- doxytag: member="PP_GamepadSampleData::unused_pad_" ref="a6d8faab2471cbf6133481d7df6c53c3f" args="[4]" -->
 <div class="memitem">
 <div class="memproto">
 <table class="memname">
 <tr>
-<td class="memname">char <a class="el" href="struct_p_p___gamepad_sample_data.html#aad71d81059bd5880ebd79bc3b9e55cd5">PP_GamepadSampleData::unused_pad_</a>[4]</td>
+<td class="memname">int8_t <a class="el" href="struct_p_p___gamepad_sample_data.html#a6d8faab2471cbf6133481d7df6c53c3f">PP_GamepadSampleData::unused_pad_</a>[4]</td>
 </tr>
 </table>
 </div>
diff --git a/native_client_sdk/doc_generated/pepper_stable/c/struct_p_p___gamepads_sample_data.html b/native_client_sdk/doc_generated/pepper_stable/c/struct_p_p___gamepads_sample_data.html
index 26c5f006..1783f94f 100644
--- a/native_client_sdk/doc_generated/pepper_stable/c/struct_p_p___gamepads_sample_data.html
+++ b/native_client_sdk/doc_generated/pepper_stable/c/struct_p_p___gamepads_sample_data.html
@@ -13,7 +13,7 @@
 Data Fields</h2><table class="memberdecls">
 
 <tr><td class="memItemLeft" align="right" valign="top">uint32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___gamepads_sample_data.html#abc9c0c8b20cfe0219a5ab4e38dd5a800">length</a></td></tr>
-<tr><td class="memItemLeft" align="right" valign="top">char&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___gamepads_sample_data.html#a0664781b0f25af5206d134cb04543235">unused_pad_</a> [4]</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">int8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___gamepads_sample_data.html#a8da16be21054bad05283f6cbc7ab226a">unused_pad_</a> [4]</td></tr>
 <tr><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="struct_p_p___gamepad_sample_data.html">PP_GamepadSampleData</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___gamepads_sample_data.html#ab0fa87f088fef743ba879a2f91363bfe">items</a> [4]</td></tr>
 </table>
 <hr /><a name="details" id="details"></a><h2>Detailed Description</h2>
@@ -45,12 +45,12 @@
 <p>Number of valid elements in the |items| array. </p>
 </div>
 </div>
-<a class="anchor" id="a0664781b0f25af5206d134cb04543235"></a><!-- doxytag: member="PP_GamepadsSampleData::unused_pad_" ref="a0664781b0f25af5206d134cb04543235" args="[4]" -->
+<a class="anchor" id="a8da16be21054bad05283f6cbc7ab226a"></a><!-- doxytag: member="PP_GamepadsSampleData::unused_pad_" ref="a8da16be21054bad05283f6cbc7ab226a" args="[4]" -->
 <div class="memitem">
 <div class="memproto">
 <table class="memname">
 <tr>
-<td class="memname">char <a class="el" href="struct_p_p___gamepads_sample_data.html#a0664781b0f25af5206d134cb04543235">PP_GamepadsSampleData::unused_pad_</a>[4]</td>
+<td class="memname">int8_t <a class="el" href="struct_p_p___gamepads_sample_data.html#a8da16be21054bad05283f6cbc7ab226a">PP_GamepadsSampleData::unused_pad_</a>[4]</td>
 </tr>
 </table>
 </div>
diff --git a/native_client_sdk/doc_generated/pepper_stable/c/struct_p_p___input_event___character.html b/native_client_sdk/doc_generated/pepper_stable/c/struct_p_p___input_event___character.html
index 4f3913d..17f4592 100644
--- a/native_client_sdk/doc_generated/pepper_stable/c/struct_p_p___input_event___character.html
+++ b/native_client_sdk/doc_generated/pepper_stable/c/struct_p_p___input_event___character.html
@@ -13,7 +13,7 @@
 Data Fields</h2><table class="memberdecls">
 
 <tr><td class="memItemLeft" align="right" valign="top">uint32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___input_event___character.html#a6505d006cdb0e52d39e94b540b923b9a">modifier</a></td></tr>
-<tr><td class="memItemLeft" align="right" valign="top">char&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___input_event___character.html#ac5e8c1dbf5c8ae33f22b8781ff5f1760">text</a> [5]</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">int8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___input_event___character.html#a02f4d484985b53e378df8f0281a268ba">text</a> [5]</td></tr>
 </table>
 <hr /><a name="details" id="details"></a><h2>Detailed Description</h2>
 <div class="textblock"><p>The <code><a class="el" href="struct_p_p___input_event___character.html" title="The PP_InputEvent_Character struct represents a typed character event.">PP_InputEvent_Character</a></code> struct represents a typed character event. </p>
@@ -33,12 +33,12 @@
 <p>A combination of the <code>PP_InputEvent_Modifier</code> flags. </p>
 </div>
 </div>
-<a class="anchor" id="ac5e8c1dbf5c8ae33f22b8781ff5f1760"></a><!-- doxytag: member="PP_InputEvent_Character::text" ref="ac5e8c1dbf5c8ae33f22b8781ff5f1760" args="[5]" -->
+<a class="anchor" id="a02f4d484985b53e378df8f0281a268ba"></a><!-- doxytag: member="PP_InputEvent_Character::text" ref="a02f4d484985b53e378df8f0281a268ba" args="[5]" -->
 <div class="memitem">
 <div class="memproto">
 <table class="memname">
 <tr>
-<td class="memname">char <a class="el" href="struct_p_p___input_event___character.html#ac5e8c1dbf5c8ae33f22b8781ff5f1760">PP_InputEvent_Character::text</a>[5]</td>
+<td class="memname">int8_t <a class="el" href="struct_p_p___input_event___character.html#a02f4d484985b53e378df8f0281a268ba">PP_InputEvent_Character::text</a>[5]</td>
 </tr>
 </table>
 </div>
diff --git a/native_client_sdk/doc_generated/pepper_stable/c/struct_p_p_b___graphics2_d__1__1.html b/native_client_sdk/doc_generated/pepper_stable/c/struct_p_p_b___graphics2_d__1__1.html
deleted file mode 100644
index ec01d7f..0000000
--- a/native_client_sdk/doc_generated/pepper_stable/c/struct_p_p_b___graphics2_d__1__1.html
+++ /dev/null
@@ -1,238 +0,0 @@
-{{+bindTo:partials.standard_nacl_api}}
-<h1>PPB_Graphics2D Struct Reference</h1>
-<div id="doxygen-ref">
-{{- dummy div to appease doxygen -}}
-  <div>
-<!-- Generated by Doxygen 1.7.6.1 -->
-
-
-</div>
-<!--header-->
-<div class="contents">
-<!-- doxytag: class="PPB_Graphics2D" --><h2>
-Data Fields</h2><table class="memberdecls">
-
-<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a034e6a3df2bccb119a087874e7cf18ed">Create</a> )(<a class="el" href="group___typedefs.html#ga89b662403e6a687bb914b80114c0d19d">PP_Instance</a> instance, const struct <a class="el" href="struct_p_p___size.html">PP_Size</a> *size, <a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a> is_always_opaque)</td></tr>
-<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a8d634407f71b52367901e8c807f3bb15">IsGraphics2D</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource)</td></tr>
-<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___graphics2_d__1__1.html#ae9aae546a51e35ee85688e0f80907fc3">Describe</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics_2d, struct <a class="el" href="struct_p_p___size.html">PP_Size</a> *size, <a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a> *is_always_opaque)</td></tr>
-<tr><td class="memItemLeft" align="right" valign="top">void(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a912e5704c150c4228ee4ec326e7cb1bb">PaintImageData</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics_2d, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> image_data, const struct <a class="el" href="struct_p_p___point.html">PP_Point</a> *top_left, const struct <a class="el" href="struct_p_p___rect.html">PP_Rect</a> *src_rect)</td></tr>
-<tr><td class="memItemLeft" align="right" valign="top">void(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a2242719819a82b11b0e3f71c4a19f461">Scroll</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics_2d, const struct <a class="el" href="struct_p_p___rect.html">PP_Rect</a> *clip_rect, const struct <a class="el" href="struct_p_p___point.html">PP_Point</a> *amount)</td></tr>
-<tr><td class="memItemLeft" align="right" valign="top">void(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___graphics2_d__1__1.html#ae5cfb7616fe383d9fedee88131f4b9ff">ReplaceContents</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics_2d, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> image_data)</td></tr>
-<tr><td class="memItemLeft" align="right" valign="top">int32_t(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a46607be26d07e4af31b56ef0791022fa">Flush</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics_2d, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr>
-<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___graphics2_d__1__1.html#ad809f5d73448def11577d54147fa268e">SetScale</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource, float scale)</td></tr>
-<tr><td class="memItemLeft" align="right" valign="top">float(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a9e284dc50e55e87c5367e9f081f44045">GetScale</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource)</td></tr>
-</table>
-<hr /><a name="details" id="details"></a><h2>Detailed Description</h2>
-<div class="textblock"><p><code>PPB_Graphics2D</code> defines the interface for a 2D graphics context. </p>
-</div><hr /><h2>Field Documentation</h2>
-<a class="anchor" id="a034e6a3df2bccb119a087874e7cf18ed"></a><!-- doxytag: member="PPB_Graphics2D::Create" ref="a034e6a3df2bccb119a087874e7cf18ed" args=")(PP_Instance instance, const struct PP_Size *size, PP_Bool is_always_opaque)" -->
-<div class="memitem">
-<div class="memproto">
-<table class="memname">
-<tr>
-<td class="memname"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(* <a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a034e6a3df2bccb119a087874e7cf18ed">PPB_Graphics2D::Create</a>)(<a class="el" href="group___typedefs.html#ga89b662403e6a687bb914b80114c0d19d">PP_Instance</a> instance, const struct <a class="el" href="struct_p_p___size.html">PP_Size</a> *size, <a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a> is_always_opaque)</td>
-</tr>
-</table>
-</div>
-<div class="memdoc">
-<p><a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a034e6a3df2bccb119a087874e7cf18ed" title="Create() creates a 2D graphics context.">Create()</a> creates a 2D graphics context. </p>
-<p>The returned graphics context will not be bound to the module instance on creation (call BindGraphics() on the module instance to bind the returned graphics context to the module instance).</p>
-<dl class="params"><dt><b>Parameters:</b></dt><dd>
-<table class="params">
-<tr><td class="paramdir">[in]</td><td class="paramname">instance</td><td>The module instance. </td></tr>
-<tr><td class="paramdir">[in]</td><td class="paramname">size</td><td>The size of the graphic context. </td></tr>
-<tr><td class="paramdir">[in]</td><td class="paramname">is_always_opaque</td><td>Set the <code>is_always_opaque</code> flag to <code>PP_TRUE</code> if you know that you will be painting only opaque data to this context. This option will disable blending when compositing the module with the web page, which might give higher performance on some computers.</td></tr>
-</table>
-</dd>
-</dl>
-<p>If you set <code>is_always_opaque</code>, your alpha channel should always be set to 0xFF or there may be painting artifacts. The alpha values overwrite the destination alpha values without blending when <code>is_always_opaque</code> is true.</p>
-<dl class="return"><dt><b>Returns:</b></dt><dd>A <code>PP_Resource</code> containing the 2D graphics context if successful or 0 if unsuccessful. </dd></dl>
-</div>
-</div>
-<a class="anchor" id="ae9aae546a51e35ee85688e0f80907fc3"></a><!-- doxytag: member="PPB_Graphics2D::Describe" ref="ae9aae546a51e35ee85688e0f80907fc3" args=")(PP_Resource graphics_2d, struct PP_Size *size, PP_Bool *is_always_opaque)" -->
-<div class="memitem">
-<div class="memproto">
-<table class="memname">
-<tr>
-<td class="memname"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(* <a class="el" href="struct_p_p_b___graphics2_d__1__1.html#ae9aae546a51e35ee85688e0f80907fc3">PPB_Graphics2D::Describe</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics_2d, struct <a class="el" href="struct_p_p___size.html">PP_Size</a> *size, <a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a> *is_always_opaque)</td>
-</tr>
-</table>
-</div>
-<div class="memdoc">
-<p><a class="el" href="struct_p_p_b___graphics2_d__1__1.html#ae9aae546a51e35ee85688e0f80907fc3" title="Describe() retrieves the configuration for the given graphics context, filling the given values (whic...">Describe()</a> retrieves the configuration for the given graphics context, filling the given values (which must not be <code>NULL</code>). </p>
-<dl class="params"><dt><b>Parameters:</b></dt><dd>
-<table class="params">
-<tr><td class="paramdir">[in]</td><td class="paramname">resource</td><td>The 2D Graphics resource. </td></tr>
-<tr><td class="paramdir">[in,out]</td><td class="paramname">size</td><td>The size of the 2D graphics context in the browser. </td></tr>
-<tr><td class="paramdir">[in,out]</td><td class="paramname">is_always_opaque</td><td>Identifies whether only opaque data will be painted.</td></tr>
-</table>
-</dd>
-</dl>
-<dl class="return"><dt><b>Returns:</b></dt><dd>Returns <code>PP_TRUE</code> on success or <code>PP_FALSE</code> if the resource is invalid. The output parameters will be set to 0 on a <code>PP_FALSE</code>. </dd></dl>
-</div>
-</div>
-<a class="anchor" id="a46607be26d07e4af31b56ef0791022fa"></a><!-- doxytag: member="PPB_Graphics2D::Flush" ref="a46607be26d07e4af31b56ef0791022fa" args=")(PP_Resource graphics_2d, struct PP_CompletionCallback callback)" -->
-<div class="memitem">
-<div class="memproto">
-<table class="memname">
-<tr>
-<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a46607be26d07e4af31b56ef0791022fa">PPB_Graphics2D::Flush</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics_2d, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td>
-</tr>
-</table>
-</div>
-<div class="memdoc">
-<p><a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a46607be26d07e4af31b56ef0791022fa" title="Flush() flushes any enqueued paint, scroll, and replace commands to the backing store.">Flush()</a> flushes any enqueued paint, scroll, and replace commands to the backing store. </p>
-<p>This function actually executes the updates, and causes a repaint of the webpage, assuming this graphics context is bound to a module instance.</p>
-<p><a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a46607be26d07e4af31b56ef0791022fa" title="Flush() flushes any enqueued paint, scroll, and replace commands to the backing store.">Flush()</a> runs in asynchronous mode. Specify a callback function and the argument for that callback function. The callback function will be executed on the calling thread when the image has been painted to the screen. While you are waiting for a flush callback, additional calls to <a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a46607be26d07e4af31b56ef0791022fa" title="Flush() flushes any enqueued paint, scroll, and replace commands to the backing store.">Flush()</a> will fail.</p>
-<p>Because the callback is executed (or thread unblocked) only when the instance's image is actually on the screen, this function provides a way to rate limit animations. By waiting until the image is on the screen before painting the next frame, you can ensure you're not flushing 2D graphics faster than the screen can be updated.</p>
-<p><b>Unbound contexts</b> If the context is not bound to a module instance, you will still get a callback. The callback will execute after <a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a46607be26d07e4af31b56ef0791022fa" title="Flush() flushes any enqueued paint, scroll, and replace commands to the backing store.">Flush()</a> returns to avoid reentrancy. The callback will not wait until anything is painted to the screen because there will be nothing on the screen. The timing of this callback is not guaranteed and may be deprioritized by the browser because it is not affecting the user experience.</p>
-<p><b>Off-screen instances</b> If the context is bound to an instance that is currently not visible (for example, scrolled out of view) it will behave like the "unbound context" case.</p>
-<p><b>Detaching a context</b> If you detach a context from a module instance, any pending flush callbacks will be converted into the "unbound context" case.</p>
-<p><b>Released contexts</b> A callback may or may not get called even if you have released all of your references to the context. This scenario can occur if there are internal references to the context suggesting it has not been internally destroyed (for example, if it is still bound to an instance) or due to other implementation details. As a result, you should be careful to check that flush callbacks are for the context you expect and that you're capable of handling callbacks for unreferenced contexts.</p>
-<p><b>Shutdown</b> If a module instance is removed when a flush is pending, the callback will not be executed.</p>
-<dl class="params"><dt><b>Parameters:</b></dt><dd>
-<table class="params">
-<tr><td class="paramdir">[in]</td><td class="paramname">graphics_2d</td><td>The 2D Graphics resource. </td></tr>
-<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code>CompletionCallback</code> to be called when the image has been painted on the screen.</td></tr>
-</table>
-</dd>
-</dl>
-<dl class="return"><dt><b>Returns:</b></dt><dd>Returns <code>PP_OK</code> on success or <code>PP_ERROR_BADRESOURCE</code> if the graphics context is invalid, <code>PP_ERROR_BADARGUMENT</code> if the callback is null and flush is being called from the main thread of the module, or <code>PP_ERROR_INPROGRESS</code> if a flush is already pending that has not issued its callback yet. In the failure case, nothing will be updated and no callback will be scheduled. </dd></dl>
-</div>
-</div>
-<a class="anchor" id="a9e284dc50e55e87c5367e9f081f44045"></a><!-- doxytag: member="PPB_Graphics2D::GetScale" ref="a9e284dc50e55e87c5367e9f081f44045" args=")(PP_Resource resource)" -->
-<div class="memitem">
-<div class="memproto">
-<table class="memname">
-<tr>
-<td class="memname">float(* <a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a9e284dc50e55e87c5367e9f081f44045">PPB_Graphics2D::GetScale</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource)</td>
-</tr>
-</table>
-</div>
-<div class="memdoc">
-</div>
-</div>
-<a class="anchor" id="a8d634407f71b52367901e8c807f3bb15"></a><!-- doxytag: member="PPB_Graphics2D::IsGraphics2D" ref="a8d634407f71b52367901e8c807f3bb15" args=")(PP_Resource resource)" -->
-<div class="memitem">
-<div class="memproto">
-<table class="memname">
-<tr>
-<td class="memname"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(* <a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a8d634407f71b52367901e8c807f3bb15">PPB_Graphics2D::IsGraphics2D</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource)</td>
-</tr>
-</table>
-</div>
-<div class="memdoc">
-<p><a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a8d634407f71b52367901e8c807f3bb15" title="IsGraphics2D() determines if the given resource is a valid Graphics2D.">IsGraphics2D()</a> determines if the given resource is a valid <code>Graphics2D</code>. </p>
-<dl class="params"><dt><b>Parameters:</b></dt><dd>
-<table class="params">
-<tr><td class="paramdir">[in]</td><td class="paramname">resource</td><td>A <code>Graphics2D</code> context resource.</td></tr>
-</table>
-</dd>
-</dl>
-<dl class="return"><dt><b>Returns:</b></dt><dd>PP_TRUE if the given resource is a valid <code>Graphics2D</code>, <code>PP_FALSE</code> if it is an invalid resource or is a resource of another type. </dd></dl>
-</div>
-</div>
-<a class="anchor" id="a912e5704c150c4228ee4ec326e7cb1bb"></a><!-- doxytag: member="PPB_Graphics2D::PaintImageData" ref="a912e5704c150c4228ee4ec326e7cb1bb" args=")(PP_Resource graphics_2d, PP_Resource image_data, const struct PP_Point *top_left, const struct PP_Rect *src_rect)" -->
-<div class="memitem">
-<div class="memproto">
-<table class="memname">
-<tr>
-<td class="memname">void(* <a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a912e5704c150c4228ee4ec326e7cb1bb">PPB_Graphics2D::PaintImageData</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics_2d, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> image_data, const struct <a class="el" href="struct_p_p___point.html">PP_Point</a> *top_left, const struct <a class="el" href="struct_p_p___rect.html">PP_Rect</a> *src_rect)</td>
-</tr>
-</table>
-</div>
-<div class="memdoc">
-<p><a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a912e5704c150c4228ee4ec326e7cb1bb" title="PaintImageData() enqueues a paint of the given image into the context.">PaintImageData()</a> enqueues a paint of the given image into the context. </p>
-<p>This function has no effect until you call <a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a46607be26d07e4af31b56ef0791022fa" title="Flush() flushes any enqueued paint, scroll, and replace commands to the backing store.">Flush()</a> As a result, what counts is the contents of the bitmap when you call <a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a46607be26d07e4af31b56ef0791022fa" title="Flush() flushes any enqueued paint, scroll, and replace commands to the backing store.">Flush()</a>, not when you call this function.</p>
-<p>The provided image will be placed at <code>top_left</code> from the top left of the context's internal backing store. Then the pixels contained in <code>src_rect</code> will be copied into the backing store. This means that the rectangle being painted will be at <code>src_rect</code> offset by <code>top_left</code>.</p>
-<p>The <code>src_rect</code> is specified in the coordinate system of the image being painted, not the context. For the common case of copying the entire image, you may specify an empty <code>src_rect</code>.</p>
-<p>The painted area of the source bitmap must fall entirely within the context. Attempting to paint outside of the context will result in an error. However, the source bitmap may fall outside the context, as long as the <code>src_rect</code> subset of it falls entirely within the context.</p>
-<p>There are two methods most modules will use for painting. The first method is to generate a new <code>ImageData</code> and then paint it. In this case, you'll set the location of your painting to <code>top_left</code> and set <code>src_rect</code> to <code>NULL</code>. The second is that you're generating small invalid regions out of a larger bitmap representing your entire instance. In this case, you would set the location of your image to (0,0) and then set <code>src_rect</code> to the pixels you changed.</p>
-<dl class="params"><dt><b>Parameters:</b></dt><dd>
-<table class="params">
-<tr><td class="paramdir">[in]</td><td class="paramname">resource</td><td>The 2D Graphics resource. </td></tr>
-<tr><td class="paramdir">[in]</td><td class="paramname">image</td><td>The <code>ImageData</code> to be painted. </td></tr>
-<tr><td class="paramdir">[in]</td><td class="paramname">top_left</td><td>A <code>Point</code> representing the <code>top_left</code> location where the <code>ImageData</code> will be painted. </td></tr>
-<tr><td class="paramdir">[in]</td><td class="paramname">src_rect</td><td>The rectangular area where the <code>ImageData</code> will be painted. </td></tr>
-</table>
-</dd>
-</dl>
-</div>
-</div>
-<a class="anchor" id="ae5cfb7616fe383d9fedee88131f4b9ff"></a><!-- doxytag: member="PPB_Graphics2D::ReplaceContents" ref="ae5cfb7616fe383d9fedee88131f4b9ff" args=")(PP_Resource graphics_2d, PP_Resource image_data)" -->
-<div class="memitem">
-<div class="memproto">
-<table class="memname">
-<tr>
-<td class="memname">void(* <a class="el" href="struct_p_p_b___graphics2_d__1__1.html#ae5cfb7616fe383d9fedee88131f4b9ff">PPB_Graphics2D::ReplaceContents</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics_2d, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> image_data)</td>
-</tr>
-</table>
-</div>
-<div class="memdoc">
-<p><a class="el" href="struct_p_p_b___graphics2_d__1__1.html#ae5cfb7616fe383d9fedee88131f4b9ff" title="ReplaceContents() provides a slightly more efficient way to paint the entire module's image...">ReplaceContents()</a> provides a slightly more efficient way to paint the entire module's image. </p>
-<p>Normally, calling <a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a912e5704c150c4228ee4ec326e7cb1bb" title="PaintImageData() enqueues a paint of the given image into the context.">PaintImageData()</a> requires that the browser copy the pixels out of the image and into the graphics context's backing store. This function replaces the graphics context's backing store with the given image, avoiding the copy.</p>
-<p>The new image must be the exact same size as this graphics context. If the new image uses a different image format than the browser's native bitmap format (use <code><a class="el" href="struct_p_p_b___image_data__1__0.html#adba78e8f9e623809b6b23419dbce4d65" title="GetNativeImageDataFormat() returns the browser's preferred format for image data.">PPB_ImageData.GetNativeImageDataFormat()</a></code> to retrieve the format), then a conversion will be done inside the browser which may slow the performance a little bit.</p>
-<p><b>Note:</b> The new image will not be painted until you call <a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a46607be26d07e4af31b56ef0791022fa" title="Flush() flushes any enqueued paint, scroll, and replace commands to the backing store.">Flush()</a>.</p>
-<p>After this call, you should take care to release your references to the image. If you paint to the image after <a class="el" href="struct_p_p_b___graphics2_d__1__1.html#ae5cfb7616fe383d9fedee88131f4b9ff" title="ReplaceContents() provides a slightly more efficient way to paint the entire module's image...">ReplaceContents()</a>, there is the possibility of significant painting artifacts because the page might use partially-rendered data when copying out of the backing store.</p>
-<p>In the case of an animation, you will want to allocate a new image for the next frame. It is best if you wait until the flush callback has executed before allocating this bitmap. This gives the browser the option of caching the previous backing store and handing it back to you (assuming the sizes match). In the optimal case, this means no bitmaps are allocated during the animation, and the backing store and "front buffer" (which the plugin is painting into) are just being swapped back and forth.</p>
-<dl class="params"><dt><b>Parameters:</b></dt><dd>
-<table class="params">
-<tr><td class="paramdir">[in]</td><td class="paramname">graphics_2d</td><td>The 2D Graphics resource. </td></tr>
-<tr><td class="paramdir">[in]</td><td class="paramname">image</td><td>The <code>ImageData</code> to be painted. </td></tr>
-</table>
-</dd>
-</dl>
-</div>
-</div>
-<a class="anchor" id="a2242719819a82b11b0e3f71c4a19f461"></a><!-- doxytag: member="PPB_Graphics2D::Scroll" ref="a2242719819a82b11b0e3f71c4a19f461" args=")(PP_Resource graphics_2d, const struct PP_Rect *clip_rect, const struct PP_Point *amount)" -->
-<div class="memitem">
-<div class="memproto">
-<table class="memname">
-<tr>
-<td class="memname">void(* <a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a2242719819a82b11b0e3f71c4a19f461">PPB_Graphics2D::Scroll</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics_2d, const struct <a class="el" href="struct_p_p___rect.html">PP_Rect</a> *clip_rect, const struct <a class="el" href="struct_p_p___point.html">PP_Point</a> *amount)</td>
-</tr>
-</table>
-</div>
-<div class="memdoc">
-<p><a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a2242719819a82b11b0e3f71c4a19f461" title="Scroll() enqueues a scroll of the context's backing store.">Scroll()</a> enqueues a scroll of the context's backing store. </p>
-<p>This function has no effect until you call <a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a46607be26d07e4af31b56ef0791022fa" title="Flush() flushes any enqueued paint, scroll, and replace commands to the backing store.">Flush()</a>. The data within the provided clipping rectangle will be shifted by (dx, dy) pixels.</p>
-<p>This function will result in some exposed region which will have undefined contents. The module should call <a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a912e5704c150c4228ee4ec326e7cb1bb" title="PaintImageData() enqueues a paint of the given image into the context.">PaintImageData()</a> on these exposed regions to give the correct contents.</p>
-<p>The scroll can be larger than the area of the clipping rectangle, which means the current image will be scrolled out of the rectangle. This scenario is not an error but will result in a no-op.</p>
-<dl class="params"><dt><b>Parameters:</b></dt><dd>
-<table class="params">
-<tr><td class="paramdir">[in]</td><td class="paramname">graphics_2d</td><td>The 2D Graphics resource. </td></tr>
-<tr><td class="paramdir">[in]</td><td class="paramname">clip</td><td>The clipping rectangle. </td></tr>
-<tr><td class="paramdir">[in]</td><td class="paramname">amount</td><td>The amount the area in the clipping rectangle will shifted. </td></tr>
-</table>
-</dd>
-</dl>
-</div>
-</div>
-<a class="anchor" id="ad809f5d73448def11577d54147fa268e"></a><!-- doxytag: member="PPB_Graphics2D::SetScale" ref="ad809f5d73448def11577d54147fa268e" args=")(PP_Resource resource, float scale)" -->
-<div class="memitem">
-<div class="memproto">
-<table class="memname">
-<tr>
-<td class="memname"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(* <a class="el" href="struct_p_p_b___graphics2_d__1__1.html#ad809f5d73448def11577d54147fa268e">PPB_Graphics2D::SetScale</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource, float scale)</td>
-</tr>
-</table>
-</div>
-<div class="memdoc">
-<p><a class="el" href="struct_p_p_b___graphics2_d__1__1.html#ad809f5d73448def11577d54147fa268e" title="SetScale() sets the scale factor that will be applied when painting the graphics context onto the out...">SetScale()</a> sets the scale factor that will be applied when painting the graphics context onto the output device. </p>
-<p>Typically, if rendering at device resolution is desired, the context would be created with the width and height scaled up by the view's GetDeviceScale and SetScale called with a scale of 1.0 / GetDeviceScale(). For example, if the view resource passed to DidChangeView has a rectangle of (w=200, h=100) and a device scale of 2.0, one would call Create with a size of (w=400, h=200) and then call SetScale with 0.5. One would then treat each pixel in the context as a single device pixel.</p>
-<dl class="params"><dt><b>Parameters:</b></dt><dd>
-<table class="params">
-<tr><td class="paramdir">[in]</td><td class="paramname">resource</td><td>A <code>Graphics2D</code> context resource. </td></tr>
-<tr><td class="paramdir">[in]</td><td class="paramname">scale</td><td>The scale to apply when painting.</td></tr>
-</table>
-</dd>
-</dl>
-<dl class="return"><dt><b>Returns:</b></dt><dd>Returns <code>PP_TRUE</code> on success or <code>PP_FALSE</code> if the resource is invalid or the scale factor is 0 or less. </dd></dl>
-</div>
-</div>
-<hr />The documentation for this struct was generated from the following file:<ul>
-<li><a class="el" href="ppb__graphics__2d_8h.html">ppb_graphics_2d.h</a></li>
-</ul>
-</div><!-- contents -->
-</div>
-{{/partials.standard_nacl_api}}
diff --git a/native_client_sdk/doc_generated/pepper_beta/c/struct_p_p_b___graphics2_d__1__1.html b/native_client_sdk/doc_generated/pepper_stable/c/struct_p_p_b___graphics2_d__1__2.html
similarity index 71%
copy from native_client_sdk/doc_generated/pepper_beta/c/struct_p_p_b___graphics2_d__1__1.html
copy to native_client_sdk/doc_generated/pepper_stable/c/struct_p_p_b___graphics2_d__1__2.html
index ec01d7f..010a0b56 100644
--- a/native_client_sdk/doc_generated/pepper_beta/c/struct_p_p_b___graphics2_d__1__1.html
+++ b/native_client_sdk/doc_generated/pepper_stable/c/struct_p_p_b___graphics2_d__1__2.html
@@ -12,30 +12,31 @@
 <!-- doxytag: class="PPB_Graphics2D" --><h2>
 Data Fields</h2><table class="memberdecls">
 
-<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a034e6a3df2bccb119a087874e7cf18ed">Create</a> )(<a class="el" href="group___typedefs.html#ga89b662403e6a687bb914b80114c0d19d">PP_Instance</a> instance, const struct <a class="el" href="struct_p_p___size.html">PP_Size</a> *size, <a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a> is_always_opaque)</td></tr>
-<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a8d634407f71b52367901e8c807f3bb15">IsGraphics2D</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource)</td></tr>
-<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___graphics2_d__1__1.html#ae9aae546a51e35ee85688e0f80907fc3">Describe</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics_2d, struct <a class="el" href="struct_p_p___size.html">PP_Size</a> *size, <a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a> *is_always_opaque)</td></tr>
-<tr><td class="memItemLeft" align="right" valign="top">void(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a912e5704c150c4228ee4ec326e7cb1bb">PaintImageData</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics_2d, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> image_data, const struct <a class="el" href="struct_p_p___point.html">PP_Point</a> *top_left, const struct <a class="el" href="struct_p_p___rect.html">PP_Rect</a> *src_rect)</td></tr>
-<tr><td class="memItemLeft" align="right" valign="top">void(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a2242719819a82b11b0e3f71c4a19f461">Scroll</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics_2d, const struct <a class="el" href="struct_p_p___rect.html">PP_Rect</a> *clip_rect, const struct <a class="el" href="struct_p_p___point.html">PP_Point</a> *amount)</td></tr>
-<tr><td class="memItemLeft" align="right" valign="top">void(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___graphics2_d__1__1.html#ae5cfb7616fe383d9fedee88131f4b9ff">ReplaceContents</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics_2d, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> image_data)</td></tr>
-<tr><td class="memItemLeft" align="right" valign="top">int32_t(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a46607be26d07e4af31b56ef0791022fa">Flush</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics_2d, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr>
-<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___graphics2_d__1__1.html#ad809f5d73448def11577d54147fa268e">SetScale</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource, float scale)</td></tr>
-<tr><td class="memItemLeft" align="right" valign="top">float(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a9e284dc50e55e87c5367e9f081f44045">GetScale</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a10e02f41b41c26bb88398b591f06ff12">Create</a> )(<a class="el" href="group___typedefs.html#ga89b662403e6a687bb914b80114c0d19d">PP_Instance</a> instance, const struct <a class="el" href="struct_p_p___size.html">PP_Size</a> *size, <a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a> is_always_opaque)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___graphics2_d__1__2.html#acae7c38863e9997fc0eee88a54d3d60d">IsGraphics2D</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a49dcb387e7e420bdd1c22344f3f35718">Describe</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics_2d, struct <a class="el" href="struct_p_p___size.html">PP_Size</a> *size, <a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a> *is_always_opaque)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">void(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a20071a446e8d7695c697f81a449597fe">PaintImageData</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics_2d, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> image_data, const struct <a class="el" href="struct_p_p___point.html">PP_Point</a> *top_left, const struct <a class="el" href="struct_p_p___rect.html">PP_Rect</a> *src_rect)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">void(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a3f87a2d280d6d4e6b9a2679787f5de1d">Scroll</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics_2d, const struct <a class="el" href="struct_p_p___rect.html">PP_Rect</a> *clip_rect, const struct <a class="el" href="struct_p_p___point.html">PP_Point</a> *amount)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">void(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a533a03163e1617692885aca78e72905a">ReplaceContents</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics_2d, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> image_data)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">int32_t(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a65dfb539bd057e33977a78537564885e">Flush</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics_2d, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a4b16d1210b49c45edfe477396934238a">SetScale</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource, float scale)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">float(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___graphics2_d__1__2.html#aa2820c6356e60627a175942ddd265753">GetScale</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___graphics2_d__1__2.html#af7d4955738f54da9eda60e5c052bf361">SetLayerTransform</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource, float scale, const struct <a class="el" href="struct_p_p___point.html">PP_Point</a> *origin, const struct <a class="el" href="struct_p_p___point.html">PP_Point</a> *translate)</td></tr>
 </table>
 <hr /><a name="details" id="details"></a><h2>Detailed Description</h2>
 <div class="textblock"><p><code>PPB_Graphics2D</code> defines the interface for a 2D graphics context. </p>
 </div><hr /><h2>Field Documentation</h2>
-<a class="anchor" id="a034e6a3df2bccb119a087874e7cf18ed"></a><!-- doxytag: member="PPB_Graphics2D::Create" ref="a034e6a3df2bccb119a087874e7cf18ed" args=")(PP_Instance instance, const struct PP_Size *size, PP_Bool is_always_opaque)" -->
+<a class="anchor" id="a10e02f41b41c26bb88398b591f06ff12"></a><!-- doxytag: member="PPB_Graphics2D::Create" ref="a10e02f41b41c26bb88398b591f06ff12" args=")(PP_Instance instance, const struct PP_Size *size, PP_Bool is_always_opaque)" -->
 <div class="memitem">
 <div class="memproto">
 <table class="memname">
 <tr>
-<td class="memname"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(* <a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a034e6a3df2bccb119a087874e7cf18ed">PPB_Graphics2D::Create</a>)(<a class="el" href="group___typedefs.html#ga89b662403e6a687bb914b80114c0d19d">PP_Instance</a> instance, const struct <a class="el" href="struct_p_p___size.html">PP_Size</a> *size, <a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a> is_always_opaque)</td>
+<td class="memname"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(* <a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a10e02f41b41c26bb88398b591f06ff12">PPB_Graphics2D::Create</a>)(<a class="el" href="group___typedefs.html#ga89b662403e6a687bb914b80114c0d19d">PP_Instance</a> instance, const struct <a class="el" href="struct_p_p___size.html">PP_Size</a> *size, <a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a> is_always_opaque)</td>
 </tr>
 </table>
 </div>
 <div class="memdoc">
-<p><a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a034e6a3df2bccb119a087874e7cf18ed" title="Create() creates a 2D graphics context.">Create()</a> creates a 2D graphics context. </p>
+<p><a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a10e02f41b41c26bb88398b591f06ff12" title="Create() creates a 2D graphics context.">Create()</a> creates a 2D graphics context. </p>
 <p>The returned graphics context will not be bound to the module instance on creation (call BindGraphics() on the module instance to bind the returned graphics context to the module instance).</p>
 <dl class="params"><dt><b>Parameters:</b></dt><dd>
 <table class="params">
@@ -49,17 +50,17 @@
 <dl class="return"><dt><b>Returns:</b></dt><dd>A <code>PP_Resource</code> containing the 2D graphics context if successful or 0 if unsuccessful. </dd></dl>
 </div>
 </div>
-<a class="anchor" id="ae9aae546a51e35ee85688e0f80907fc3"></a><!-- doxytag: member="PPB_Graphics2D::Describe" ref="ae9aae546a51e35ee85688e0f80907fc3" args=")(PP_Resource graphics_2d, struct PP_Size *size, PP_Bool *is_always_opaque)" -->
+<a class="anchor" id="a49dcb387e7e420bdd1c22344f3f35718"></a><!-- doxytag: member="PPB_Graphics2D::Describe" ref="a49dcb387e7e420bdd1c22344f3f35718" args=")(PP_Resource graphics_2d, struct PP_Size *size, PP_Bool *is_always_opaque)" -->
 <div class="memitem">
 <div class="memproto">
 <table class="memname">
 <tr>
-<td class="memname"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(* <a class="el" href="struct_p_p_b___graphics2_d__1__1.html#ae9aae546a51e35ee85688e0f80907fc3">PPB_Graphics2D::Describe</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics_2d, struct <a class="el" href="struct_p_p___size.html">PP_Size</a> *size, <a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a> *is_always_opaque)</td>
+<td class="memname"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(* <a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a49dcb387e7e420bdd1c22344f3f35718">PPB_Graphics2D::Describe</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics_2d, struct <a class="el" href="struct_p_p___size.html">PP_Size</a> *size, <a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a> *is_always_opaque)</td>
 </tr>
 </table>
 </div>
 <div class="memdoc">
-<p><a class="el" href="struct_p_p_b___graphics2_d__1__1.html#ae9aae546a51e35ee85688e0f80907fc3" title="Describe() retrieves the configuration for the given graphics context, filling the given values (whic...">Describe()</a> retrieves the configuration for the given graphics context, filling the given values (which must not be <code>NULL</code>). </p>
+<p><a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a49dcb387e7e420bdd1c22344f3f35718" title="Describe() retrieves the configuration for the given graphics context, filling the given values (whic...">Describe()</a> retrieves the configuration for the given graphics context, filling the given values (which must not be <code>NULL</code>). </p>
 <dl class="params"><dt><b>Parameters:</b></dt><dd>
 <table class="params">
 <tr><td class="paramdir">[in]</td><td class="paramname">resource</td><td>The 2D Graphics resource. </td></tr>
@@ -71,21 +72,21 @@
 <dl class="return"><dt><b>Returns:</b></dt><dd>Returns <code>PP_TRUE</code> on success or <code>PP_FALSE</code> if the resource is invalid. The output parameters will be set to 0 on a <code>PP_FALSE</code>. </dd></dl>
 </div>
 </div>
-<a class="anchor" id="a46607be26d07e4af31b56ef0791022fa"></a><!-- doxytag: member="PPB_Graphics2D::Flush" ref="a46607be26d07e4af31b56ef0791022fa" args=")(PP_Resource graphics_2d, struct PP_CompletionCallback callback)" -->
+<a class="anchor" id="a65dfb539bd057e33977a78537564885e"></a><!-- doxytag: member="PPB_Graphics2D::Flush" ref="a65dfb539bd057e33977a78537564885e" args=")(PP_Resource graphics_2d, struct PP_CompletionCallback callback)" -->
 <div class="memitem">
 <div class="memproto">
 <table class="memname">
 <tr>
-<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a46607be26d07e4af31b56ef0791022fa">PPB_Graphics2D::Flush</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics_2d, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td>
+<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a65dfb539bd057e33977a78537564885e">PPB_Graphics2D::Flush</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics_2d, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td>
 </tr>
 </table>
 </div>
 <div class="memdoc">
-<p><a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a46607be26d07e4af31b56ef0791022fa" title="Flush() flushes any enqueued paint, scroll, and replace commands to the backing store.">Flush()</a> flushes any enqueued paint, scroll, and replace commands to the backing store. </p>
+<p><a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a65dfb539bd057e33977a78537564885e" title="Flush() flushes any enqueued paint, scroll, and replace commands to the backing store.">Flush()</a> flushes any enqueued paint, scroll, and replace commands to the backing store. </p>
 <p>This function actually executes the updates, and causes a repaint of the webpage, assuming this graphics context is bound to a module instance.</p>
-<p><a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a46607be26d07e4af31b56ef0791022fa" title="Flush() flushes any enqueued paint, scroll, and replace commands to the backing store.">Flush()</a> runs in asynchronous mode. Specify a callback function and the argument for that callback function. The callback function will be executed on the calling thread when the image has been painted to the screen. While you are waiting for a flush callback, additional calls to <a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a46607be26d07e4af31b56ef0791022fa" title="Flush() flushes any enqueued paint, scroll, and replace commands to the backing store.">Flush()</a> will fail.</p>
+<p><a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a65dfb539bd057e33977a78537564885e" title="Flush() flushes any enqueued paint, scroll, and replace commands to the backing store.">Flush()</a> runs in asynchronous mode. Specify a callback function and the argument for that callback function. The callback function will be executed on the calling thread when the image has been painted to the screen. While you are waiting for a flush callback, additional calls to <a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a65dfb539bd057e33977a78537564885e" title="Flush() flushes any enqueued paint, scroll, and replace commands to the backing store.">Flush()</a> will fail.</p>
 <p>Because the callback is executed (or thread unblocked) only when the instance's image is actually on the screen, this function provides a way to rate limit animations. By waiting until the image is on the screen before painting the next frame, you can ensure you're not flushing 2D graphics faster than the screen can be updated.</p>
-<p><b>Unbound contexts</b> If the context is not bound to a module instance, you will still get a callback. The callback will execute after <a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a46607be26d07e4af31b56ef0791022fa" title="Flush() flushes any enqueued paint, scroll, and replace commands to the backing store.">Flush()</a> returns to avoid reentrancy. The callback will not wait until anything is painted to the screen because there will be nothing on the screen. The timing of this callback is not guaranteed and may be deprioritized by the browser because it is not affecting the user experience.</p>
+<p><b>Unbound contexts</b> If the context is not bound to a module instance, you will still get a callback. The callback will execute after <a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a65dfb539bd057e33977a78537564885e" title="Flush() flushes any enqueued paint, scroll, and replace commands to the backing store.">Flush()</a> returns to avoid reentrancy. The callback will not wait until anything is painted to the screen because there will be nothing on the screen. The timing of this callback is not guaranteed and may be deprioritized by the browser because it is not affecting the user experience.</p>
 <p><b>Off-screen instances</b> If the context is bound to an instance that is currently not visible (for example, scrolled out of view) it will behave like the "unbound context" case.</p>
 <p><b>Detaching a context</b> If you detach a context from a module instance, any pending flush callbacks will be converted into the "unbound context" case.</p>
 <p><b>Released contexts</b> A callback may or may not get called even if you have released all of your references to the context. This scenario can occur if there are internal references to the context suggesting it has not been internally destroyed (for example, if it is still bound to an instance) or due to other implementation details. As a result, you should be careful to check that flush callbacks are for the context you expect and that you're capable of handling callbacks for unreferenced contexts.</p>
@@ -100,29 +101,29 @@
 <dl class="return"><dt><b>Returns:</b></dt><dd>Returns <code>PP_OK</code> on success or <code>PP_ERROR_BADRESOURCE</code> if the graphics context is invalid, <code>PP_ERROR_BADARGUMENT</code> if the callback is null and flush is being called from the main thread of the module, or <code>PP_ERROR_INPROGRESS</code> if a flush is already pending that has not issued its callback yet. In the failure case, nothing will be updated and no callback will be scheduled. </dd></dl>
 </div>
 </div>
-<a class="anchor" id="a9e284dc50e55e87c5367e9f081f44045"></a><!-- doxytag: member="PPB_Graphics2D::GetScale" ref="a9e284dc50e55e87c5367e9f081f44045" args=")(PP_Resource resource)" -->
+<a class="anchor" id="aa2820c6356e60627a175942ddd265753"></a><!-- doxytag: member="PPB_Graphics2D::GetScale" ref="aa2820c6356e60627a175942ddd265753" args=")(PP_Resource resource)" -->
 <div class="memitem">
 <div class="memproto">
 <table class="memname">
 <tr>
-<td class="memname">float(* <a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a9e284dc50e55e87c5367e9f081f44045">PPB_Graphics2D::GetScale</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource)</td>
+<td class="memname">float(* <a class="el" href="struct_p_p_b___graphics2_d__1__2.html#aa2820c6356e60627a175942ddd265753">PPB_Graphics2D::GetScale</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource)</td>
 </tr>
 </table>
 </div>
 <div class="memdoc">
 </div>
 </div>
-<a class="anchor" id="a8d634407f71b52367901e8c807f3bb15"></a><!-- doxytag: member="PPB_Graphics2D::IsGraphics2D" ref="a8d634407f71b52367901e8c807f3bb15" args=")(PP_Resource resource)" -->
+<a class="anchor" id="acae7c38863e9997fc0eee88a54d3d60d"></a><!-- doxytag: member="PPB_Graphics2D::IsGraphics2D" ref="acae7c38863e9997fc0eee88a54d3d60d" args=")(PP_Resource resource)" -->
 <div class="memitem">
 <div class="memproto">
 <table class="memname">
 <tr>
-<td class="memname"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(* <a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a8d634407f71b52367901e8c807f3bb15">PPB_Graphics2D::IsGraphics2D</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource)</td>
+<td class="memname"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(* <a class="el" href="struct_p_p_b___graphics2_d__1__2.html#acae7c38863e9997fc0eee88a54d3d60d">PPB_Graphics2D::IsGraphics2D</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource)</td>
 </tr>
 </table>
 </div>
 <div class="memdoc">
-<p><a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a8d634407f71b52367901e8c807f3bb15" title="IsGraphics2D() determines if the given resource is a valid Graphics2D.">IsGraphics2D()</a> determines if the given resource is a valid <code>Graphics2D</code>. </p>
+<p><a class="el" href="struct_p_p_b___graphics2_d__1__2.html#acae7c38863e9997fc0eee88a54d3d60d" title="IsGraphics2D() determines if the given resource is a valid Graphics2D.">IsGraphics2D()</a> determines if the given resource is a valid <code>Graphics2D</code>. </p>
 <dl class="params"><dt><b>Parameters:</b></dt><dd>
 <table class="params">
 <tr><td class="paramdir">[in]</td><td class="paramname">resource</td><td>A <code>Graphics2D</code> context resource.</td></tr>
@@ -132,18 +133,18 @@
 <dl class="return"><dt><b>Returns:</b></dt><dd>PP_TRUE if the given resource is a valid <code>Graphics2D</code>, <code>PP_FALSE</code> if it is an invalid resource or is a resource of another type. </dd></dl>
 </div>
 </div>
-<a class="anchor" id="a912e5704c150c4228ee4ec326e7cb1bb"></a><!-- doxytag: member="PPB_Graphics2D::PaintImageData" ref="a912e5704c150c4228ee4ec326e7cb1bb" args=")(PP_Resource graphics_2d, PP_Resource image_data, const struct PP_Point *top_left, const struct PP_Rect *src_rect)" -->
+<a class="anchor" id="a20071a446e8d7695c697f81a449597fe"></a><!-- doxytag: member="PPB_Graphics2D::PaintImageData" ref="a20071a446e8d7695c697f81a449597fe" args=")(PP_Resource graphics_2d, PP_Resource image_data, const struct PP_Point *top_left, const struct PP_Rect *src_rect)" -->
 <div class="memitem">
 <div class="memproto">
 <table class="memname">
 <tr>
-<td class="memname">void(* <a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a912e5704c150c4228ee4ec326e7cb1bb">PPB_Graphics2D::PaintImageData</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics_2d, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> image_data, const struct <a class="el" href="struct_p_p___point.html">PP_Point</a> *top_left, const struct <a class="el" href="struct_p_p___rect.html">PP_Rect</a> *src_rect)</td>
+<td class="memname">void(* <a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a20071a446e8d7695c697f81a449597fe">PPB_Graphics2D::PaintImageData</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics_2d, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> image_data, const struct <a class="el" href="struct_p_p___point.html">PP_Point</a> *top_left, const struct <a class="el" href="struct_p_p___rect.html">PP_Rect</a> *src_rect)</td>
 </tr>
 </table>
 </div>
 <div class="memdoc">
-<p><a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a912e5704c150c4228ee4ec326e7cb1bb" title="PaintImageData() enqueues a paint of the given image into the context.">PaintImageData()</a> enqueues a paint of the given image into the context. </p>
-<p>This function has no effect until you call <a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a46607be26d07e4af31b56ef0791022fa" title="Flush() flushes any enqueued paint, scroll, and replace commands to the backing store.">Flush()</a> As a result, what counts is the contents of the bitmap when you call <a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a46607be26d07e4af31b56ef0791022fa" title="Flush() flushes any enqueued paint, scroll, and replace commands to the backing store.">Flush()</a>, not when you call this function.</p>
+<p><a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a20071a446e8d7695c697f81a449597fe" title="PaintImageData() enqueues a paint of the given image into the context.">PaintImageData()</a> enqueues a paint of the given image into the context. </p>
+<p>This function has no effect until you call <a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a65dfb539bd057e33977a78537564885e" title="Flush() flushes any enqueued paint, scroll, and replace commands to the backing store.">Flush()</a> As a result, what counts is the contents of the bitmap when you call <a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a65dfb539bd057e33977a78537564885e" title="Flush() flushes any enqueued paint, scroll, and replace commands to the backing store.">Flush()</a>, not when you call this function.</p>
 <p>The provided image will be placed at <code>top_left</code> from the top left of the context's internal backing store. Then the pixels contained in <code>src_rect</code> will be copied into the backing store. This means that the rectangle being painted will be at <code>src_rect</code> offset by <code>top_left</code>.</p>
 <p>The <code>src_rect</code> is specified in the coordinate system of the image being painted, not the context. For the common case of copying the entire image, you may specify an empty <code>src_rect</code>.</p>
 <p>The painted area of the source bitmap must fall entirely within the context. Attempting to paint outside of the context will result in an error. However, the source bitmap may fall outside the context, as long as the <code>src_rect</code> subset of it falls entirely within the context.</p>
@@ -159,21 +160,21 @@
 </dl>
 </div>
 </div>
-<a class="anchor" id="ae5cfb7616fe383d9fedee88131f4b9ff"></a><!-- doxytag: member="PPB_Graphics2D::ReplaceContents" ref="ae5cfb7616fe383d9fedee88131f4b9ff" args=")(PP_Resource graphics_2d, PP_Resource image_data)" -->
+<a class="anchor" id="a533a03163e1617692885aca78e72905a"></a><!-- doxytag: member="PPB_Graphics2D::ReplaceContents" ref="a533a03163e1617692885aca78e72905a" args=")(PP_Resource graphics_2d, PP_Resource image_data)" -->
 <div class="memitem">
 <div class="memproto">
 <table class="memname">
 <tr>
-<td class="memname">void(* <a class="el" href="struct_p_p_b___graphics2_d__1__1.html#ae5cfb7616fe383d9fedee88131f4b9ff">PPB_Graphics2D::ReplaceContents</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics_2d, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> image_data)</td>
+<td class="memname">void(* <a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a533a03163e1617692885aca78e72905a">PPB_Graphics2D::ReplaceContents</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics_2d, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> image_data)</td>
 </tr>
 </table>
 </div>
 <div class="memdoc">
-<p><a class="el" href="struct_p_p_b___graphics2_d__1__1.html#ae5cfb7616fe383d9fedee88131f4b9ff" title="ReplaceContents() provides a slightly more efficient way to paint the entire module's image...">ReplaceContents()</a> provides a slightly more efficient way to paint the entire module's image. </p>
-<p>Normally, calling <a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a912e5704c150c4228ee4ec326e7cb1bb" title="PaintImageData() enqueues a paint of the given image into the context.">PaintImageData()</a> requires that the browser copy the pixels out of the image and into the graphics context's backing store. This function replaces the graphics context's backing store with the given image, avoiding the copy.</p>
+<p><a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a533a03163e1617692885aca78e72905a" title="ReplaceContents() provides a slightly more efficient way to paint the entire module's image...">ReplaceContents()</a> provides a slightly more efficient way to paint the entire module's image. </p>
+<p>Normally, calling <a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a20071a446e8d7695c697f81a449597fe" title="PaintImageData() enqueues a paint of the given image into the context.">PaintImageData()</a> requires that the browser copy the pixels out of the image and into the graphics context's backing store. This function replaces the graphics context's backing store with the given image, avoiding the copy.</p>
 <p>The new image must be the exact same size as this graphics context. If the new image uses a different image format than the browser's native bitmap format (use <code><a class="el" href="struct_p_p_b___image_data__1__0.html#adba78e8f9e623809b6b23419dbce4d65" title="GetNativeImageDataFormat() returns the browser's preferred format for image data.">PPB_ImageData.GetNativeImageDataFormat()</a></code> to retrieve the format), then a conversion will be done inside the browser which may slow the performance a little bit.</p>
-<p><b>Note:</b> The new image will not be painted until you call <a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a46607be26d07e4af31b56ef0791022fa" title="Flush() flushes any enqueued paint, scroll, and replace commands to the backing store.">Flush()</a>.</p>
-<p>After this call, you should take care to release your references to the image. If you paint to the image after <a class="el" href="struct_p_p_b___graphics2_d__1__1.html#ae5cfb7616fe383d9fedee88131f4b9ff" title="ReplaceContents() provides a slightly more efficient way to paint the entire module's image...">ReplaceContents()</a>, there is the possibility of significant painting artifacts because the page might use partially-rendered data when copying out of the backing store.</p>
+<p><b>Note:</b> The new image will not be painted until you call <a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a65dfb539bd057e33977a78537564885e" title="Flush() flushes any enqueued paint, scroll, and replace commands to the backing store.">Flush()</a>.</p>
+<p>After this call, you should take care to release your references to the image. If you paint to the image after <a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a533a03163e1617692885aca78e72905a" title="ReplaceContents() provides a slightly more efficient way to paint the entire module's image...">ReplaceContents()</a>, there is the possibility of significant painting artifacts because the page might use partially-rendered data when copying out of the backing store.</p>
 <p>In the case of an animation, you will want to allocate a new image for the next frame. It is best if you wait until the flush callback has executed before allocating this bitmap. This gives the browser the option of caching the previous backing store and handing it back to you (assuming the sizes match). In the optimal case, this means no bitmaps are allocated during the animation, and the backing store and "front buffer" (which the plugin is painting into) are just being swapped back and forth.</p>
 <dl class="params"><dt><b>Parameters:</b></dt><dd>
 <table class="params">
@@ -184,19 +185,19 @@
 </dl>
 </div>
 </div>
-<a class="anchor" id="a2242719819a82b11b0e3f71c4a19f461"></a><!-- doxytag: member="PPB_Graphics2D::Scroll" ref="a2242719819a82b11b0e3f71c4a19f461" args=")(PP_Resource graphics_2d, const struct PP_Rect *clip_rect, const struct PP_Point *amount)" -->
+<a class="anchor" id="a3f87a2d280d6d4e6b9a2679787f5de1d"></a><!-- doxytag: member="PPB_Graphics2D::Scroll" ref="a3f87a2d280d6d4e6b9a2679787f5de1d" args=")(PP_Resource graphics_2d, const struct PP_Rect *clip_rect, const struct PP_Point *amount)" -->
 <div class="memitem">
 <div class="memproto">
 <table class="memname">
 <tr>
-<td class="memname">void(* <a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a2242719819a82b11b0e3f71c4a19f461">PPB_Graphics2D::Scroll</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics_2d, const struct <a class="el" href="struct_p_p___rect.html">PP_Rect</a> *clip_rect, const struct <a class="el" href="struct_p_p___point.html">PP_Point</a> *amount)</td>
+<td class="memname">void(* <a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a3f87a2d280d6d4e6b9a2679787f5de1d">PPB_Graphics2D::Scroll</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics_2d, const struct <a class="el" href="struct_p_p___rect.html">PP_Rect</a> *clip_rect, const struct <a class="el" href="struct_p_p___point.html">PP_Point</a> *amount)</td>
 </tr>
 </table>
 </div>
 <div class="memdoc">
-<p><a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a2242719819a82b11b0e3f71c4a19f461" title="Scroll() enqueues a scroll of the context's backing store.">Scroll()</a> enqueues a scroll of the context's backing store. </p>
-<p>This function has no effect until you call <a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a46607be26d07e4af31b56ef0791022fa" title="Flush() flushes any enqueued paint, scroll, and replace commands to the backing store.">Flush()</a>. The data within the provided clipping rectangle will be shifted by (dx, dy) pixels.</p>
-<p>This function will result in some exposed region which will have undefined contents. The module should call <a class="el" href="struct_p_p_b___graphics2_d__1__1.html#a912e5704c150c4228ee4ec326e7cb1bb" title="PaintImageData() enqueues a paint of the given image into the context.">PaintImageData()</a> on these exposed regions to give the correct contents.</p>
+<p><a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a3f87a2d280d6d4e6b9a2679787f5de1d" title="Scroll() enqueues a scroll of the context's backing store.">Scroll()</a> enqueues a scroll of the context's backing store. </p>
+<p>This function has no effect until you call <a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a65dfb539bd057e33977a78537564885e" title="Flush() flushes any enqueued paint, scroll, and replace commands to the backing store.">Flush()</a>. The data within the provided clipping rectangle will be shifted by (dx, dy) pixels.</p>
+<p>This function will result in some exposed region which will have undefined contents. The module should call <a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a20071a446e8d7695c697f81a449597fe" title="PaintImageData() enqueues a paint of the given image into the context.">PaintImageData()</a> on these exposed regions to give the correct contents.</p>
 <p>The scroll can be larger than the area of the clipping rectangle, which means the current image will be scrolled out of the rectangle. This scenario is not an error but will result in a no-op.</p>
 <dl class="params"><dt><b>Parameters:</b></dt><dd>
 <table class="params">
@@ -208,17 +209,41 @@
 </dl>
 </div>
 </div>
-<a class="anchor" id="ad809f5d73448def11577d54147fa268e"></a><!-- doxytag: member="PPB_Graphics2D::SetScale" ref="ad809f5d73448def11577d54147fa268e" args=")(PP_Resource resource, float scale)" -->
+<a class="anchor" id="af7d4955738f54da9eda60e5c052bf361"></a><!-- doxytag: member="PPB_Graphics2D::SetLayerTransform" ref="af7d4955738f54da9eda60e5c052bf361" args=")(PP_Resource resource, float scale, const struct PP_Point *origin, const struct PP_Point *translate)" -->
 <div class="memitem">
 <div class="memproto">
 <table class="memname">
 <tr>
-<td class="memname"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(* <a class="el" href="struct_p_p_b___graphics2_d__1__1.html#ad809f5d73448def11577d54147fa268e">PPB_Graphics2D::SetScale</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource, float scale)</td>
+<td class="memname"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(* <a class="el" href="struct_p_p_b___graphics2_d__1__2.html#af7d4955738f54da9eda60e5c052bf361">PPB_Graphics2D::SetLayerTransform</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource, float scale, const struct <a class="el" href="struct_p_p___point.html">PP_Point</a> *origin, const struct <a class="el" href="struct_p_p___point.html">PP_Point</a> *translate)</td>
 </tr>
 </table>
 </div>
 <div class="memdoc">
-<p><a class="el" href="struct_p_p_b___graphics2_d__1__1.html#ad809f5d73448def11577d54147fa268e" title="SetScale() sets the scale factor that will be applied when painting the graphics context onto the out...">SetScale()</a> sets the scale factor that will be applied when painting the graphics context onto the output device. </p>
+<p><a class="el" href="struct_p_p_b___graphics2_d__1__2.html#af7d4955738f54da9eda60e5c052bf361" title="SetLayerTransform() sets a transformation factor that will be applied for the current graphics contex...">SetLayerTransform()</a> sets a transformation factor that will be applied for the current graphics context displayed on the output device. </p>
+<p>If both SetScale and SetLayerTransform will be used, they are going to get combined for the final result.</p>
+<p>This function has no effect until you call <a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a65dfb539bd057e33977a78537564885e" title="Flush() flushes any enqueued paint, scroll, and replace commands to the backing store.">Flush()</a>.</p>
+<dl class="params"><dt><b>Parameters:</b></dt><dd>
+<table class="params">
+<tr><td class="paramdir">[in]</td><td class="paramname">scale</td><td>The scale to be applied. </td></tr>
+<tr><td class="paramdir">[in]</td><td class="paramname">origin</td><td>The origin of the scale. </td></tr>
+<tr><td class="paramdir">[in]</td><td class="paramname">translate</td><td>The translation to be applied.</td></tr>
+</table>
+</dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>Returns <code>PP_TRUE</code> on success or <code>PP_FALSE</code> if the resource is invalid or the scale factor is 0 or less. </dd></dl>
+</div>
+</div>
+<a class="anchor" id="a4b16d1210b49c45edfe477396934238a"></a><!-- doxytag: member="PPB_Graphics2D::SetScale" ref="a4b16d1210b49c45edfe477396934238a" args=")(PP_Resource resource, float scale)" -->
+<div class="memitem">
+<div class="memproto">
+<table class="memname">
+<tr>
+<td class="memname"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(* <a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a4b16d1210b49c45edfe477396934238a">PPB_Graphics2D::SetScale</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource, float scale)</td>
+</tr>
+</table>
+</div>
+<div class="memdoc">
+<p><a class="el" href="struct_p_p_b___graphics2_d__1__2.html#a4b16d1210b49c45edfe477396934238a" title="SetScale() sets the scale factor that will be applied when painting the graphics context onto the out...">SetScale()</a> sets the scale factor that will be applied when painting the graphics context onto the output device. </p>
 <p>Typically, if rendering at device resolution is desired, the context would be created with the width and height scaled up by the view's GetDeviceScale and SetScale called with a scale of 1.0 / GetDeviceScale(). For example, if the view resource passed to DidChangeView has a rectangle of (w=200, h=100) and a device scale of 2.0, one would call Create with a size of (w=400, h=200) and then call SetScale with 0.5. One would then treat each pixel in the context as a single device pixel.</p>
 <dl class="params"><dt><b>Parameters:</b></dt><dd>
 <table class="params">
diff --git a/native_client_sdk/doc_generated/pepper_stable/c/struct_p_p_b___message_loop__1__0.html b/native_client_sdk/doc_generated/pepper_stable/c/struct_p_p_b___message_loop__1__0.html
index 67077f6..31f6705 100644
--- a/native_client_sdk/doc_generated/pepper_stable/c/struct_p_p_b___message_loop__1__0.html
+++ b/native_client_sdk/doc_generated/pepper_stable/c/struct_p_p_b___message_loop__1__0.html
@@ -212,7 +212,7 @@
 <p>Runs the thread message loop. </p>
 <p>Running the message loop is required for you to get issued completion callbacks on the thread.</p>
 <p>The message loop identified by the argument must have been previously successfully attached to the current thread.</p>
-<p>You may not run nested run loops. Since the main thread has an implicit message loop that the system runs, you may not call Run on the main thread.</p>
+<p>You may not run nested message loops. Since the main thread has an implicit message loop that the system runs, you may not call Run on the main thread.</p>
 <dl class="return"><dt><b>Returns:</b></dt><dd><ul>
 <li>PP_OK: The message loop was successfully run. Note that on success, the message loop will only exit when you call <a class="el" href="struct_p_p_b___message_loop__1__0.html#adbbdc03661c9ac41df82fffcc566603d" title="Posts a quit message to the given message loop's work queue.">PostQuit()</a>.</li>
 <li>PP_ERROR_BADRESOURCE: The given message loop resource is invalid.</li>
diff --git a/native_client_sdk/doc_generated/pepper_stable/c/struct_p_p_b___vpn_provider__0__1.html b/native_client_sdk/doc_generated/pepper_stable/c/struct_p_p_b___vpn_provider__0__1.html
new file mode 100644
index 0000000..ce4e7f5
--- /dev/null
+++ b/native_client_sdk/doc_generated/pepper_stable/c/struct_p_p_b___vpn_provider__0__1.html
@@ -0,0 +1,152 @@
+{{+bindTo:partials.standard_nacl_api}}
+<h1>PPB_VpnProvider Struct Reference</h1>
+<div id="doxygen-ref">
+{{- dummy div to appease doxygen -}}
+  <div>
+<!-- Generated by Doxygen 1.7.6.1 -->
+
+
+</div>
+<!--header-->
+<div class="contents">
+<!-- doxytag: class="PPB_VpnProvider" --><h2>
+Data Fields</h2><table class="memberdecls">
+
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___vpn_provider__0__1.html#a2ec07eb1aaf01c4e7050c198e96a8f76">Create</a> )(<a class="el" href="group___typedefs.html#ga89b662403e6a687bb914b80114c0d19d">PP_Instance</a> instance)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___vpn_provider__0__1.html#a55919d9d06bd5ecd2c8365b872e1db9f">IsVpnProvider</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">int32_t(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___vpn_provider__0__1.html#a7b925b10a83d769e6d80d22fcace7833">Bind</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> vpn_provider, struct <a class="el" href="struct_p_p___var.html">PP_Var</a> configuration_id, struct <a class="el" href="struct_p_p___var.html">PP_Var</a> configuration_name, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">int32_t(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___vpn_provider__0__1.html#a43d8ddc1da63d7ee94c26721599c34db">SendPacket</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> vpn_provider, struct <a class="el" href="struct_p_p___var.html">PP_Var</a> packet, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">int32_t(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___vpn_provider__0__1.html#a767149d43eb103ad379dddcb04d1ca22">ReceivePacket</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> vpn_provider, struct <a class="el" href="struct_p_p___var.html">PP_Var</a> *packet, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr>
+</table>
+<hr /><a name="details" id="details"></a><h2>Detailed Description</h2>
+<div class="textblock"><p>Use the <code>PPB_VpnProvider</code> interface to implement a VPN client. </p>
+<p>Important: This API is available only on Chrome OS.</p>
+<p>This interface enhances the <code>chrome.vpnProvider</code> JavaScript API by providing a high performance path for packet handling.</p>
+<p>Permissions: Apps permission <code>vpnProvider</code> is required for <code>PPB_VpnProvider.Bind()</code>.</p>
+<p>Typical usage:</p>
+<ul>
+<li>Create a <code>PPB_VpnProvider</code> instance.</li>
+<li>Register the callback for <code>PPB_VpnProvider.ReceivePacket()</code>.</li>
+<li>In the extension follow the usual workflow for configuring a VPN connection via the <code>chrome.vpnProvider</code> API until the step for notifying the connection state as "connected".</li>
+<li>Bind to the previously created connection using <code>PPB_VpnProvider.Bind()</code>.</li>
+<li>Notify the connection state as "connected" from JavaScript using <code>chrome.vpnProvider.notifyConnectionStateChanged</code>.</li>
+<li>When the steps above are completed without errors, a virtual tunnel is created to the network stack of Chrome OS. IP packets can be sent through the tunnel using <code>PPB_VpnProvider.SendPacket()</code> and any packets originating on the Chrome OS device will be received using the callback registered for <code>PPB_VpnProvider.ReceivePacket()</code>.</li>
+<li>When the user disconnects from the VPN configuration or there is an error the extension will be notfied via <code>chrome.vpnProvider.onPlatformMessage</code>. </li>
+</ul>
+</div><hr /><h2>Field Documentation</h2>
+<a class="anchor" id="a7b925b10a83d769e6d80d22fcace7833"></a><!-- doxytag: member="PPB_VpnProvider::Bind" ref="a7b925b10a83d769e6d80d22fcace7833" args=")(PP_Resource vpn_provider, struct PP_Var configuration_id, struct PP_Var configuration_name, struct PP_CompletionCallback callback)" -->
+<div class="memitem">
+<div class="memproto">
+<table class="memname">
+<tr>
+<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___vpn_provider__0__1.html#a7b925b10a83d769e6d80d22fcace7833">PPB_VpnProvider::Bind</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> vpn_provider, struct <a class="el" href="struct_p_p___var.html">PP_Var</a> configuration_id, struct <a class="el" href="struct_p_p___var.html">PP_Var</a> configuration_name, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td>
+</tr>
+</table>
+</div>
+<div class="memdoc">
+<p><a class="el" href="struct_p_p_b___vpn_provider__0__1.html#a7b925b10a83d769e6d80d22fcace7833" title="Bind() binds to an existing configuration created from JavaScript by chrome.vpnProvider.createConfig.">Bind()</a> binds to an existing configuration created from JavaScript by <code>chrome.vpnProvider.createConfig</code>. </p>
+<p>All packets will be routed via <code>SendPacket</code> and <code>ReceivePacket</code>. The user should register the callback for <code>ReceivePacket</code> before calling <code><a class="el" href="struct_p_p_b___vpn_provider__0__1.html#a7b925b10a83d769e6d80d22fcace7833" title="Bind() binds to an existing configuration created from JavaScript by chrome.vpnProvider.createConfig.">Bind()</a></code>.</p>
+<dl class="params"><dt><b>Parameters:</b></dt><dd>
+<table class="params">
+<tr><td class="paramdir">[in]</td><td class="paramname">vpn_provider</td><td>A <code>PP_Resource</code> corresponding to a VpnProvider.</td></tr>
+<tr><td class="paramdir">[in]</td><td class="paramname">configuration_id</td><td>A <code>PP_VARTYPE_STRING</code> representing the configuration id from the callback of <code>chrome.vpnProvider.createConfig</code>.</td></tr>
+<tr><td class="paramdir">[in]</td><td class="paramname">configuration_name</td><td>A <code>PP_VARTYPE_STRING</code> representing the configuration name as defined by the user when calling <code>chrome.vpnProvider.createConfig</code>.</td></tr>
+<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="struct_p_p___completion_callback.html" title="PP_CompletionCallback is a common mechanism for supporting potentially asynchronous calls in browser ...">PP_CompletionCallback</a></code> called on completion.</td></tr>
+</table>
+</dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. Returns <code>PP_ERROR_INPROGRESS</code> if a previous call to <code><a class="el" href="struct_p_p_b___vpn_provider__0__1.html#a7b925b10a83d769e6d80d22fcace7833" title="Bind() binds to an existing configuration created from JavaScript by chrome.vpnProvider.createConfig.">Bind()</a></code> has not completed. Returns <code>PP_ERROR_BADARGUMENT</code> if either <code>configuration_id</code> or <code>configuration_name</code> are not of type <code>PP_VARTYPE_STRING</code>. Returns <code>PP_ERROR_NOACCESS</code> if the caller does the have the required "vpnProvider" permission. Returns <code>PP_ERROR_FAILED</code> if <code>connection_id</code> and <code>connection_name</code> could not be matched with the existing connection, or if the plugin originates from a different extension than the one that created the connection. </dd></dl>
+</div>
+</div>
+<a class="anchor" id="a2ec07eb1aaf01c4e7050c198e96a8f76"></a><!-- doxytag: member="PPB_VpnProvider::Create" ref="a2ec07eb1aaf01c4e7050c198e96a8f76" args=")(PP_Instance instance)" -->
+<div class="memitem">
+<div class="memproto">
+<table class="memname">
+<tr>
+<td class="memname"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(* <a class="el" href="struct_p_p_b___vpn_provider__0__1.html#a2ec07eb1aaf01c4e7050c198e96a8f76">PPB_VpnProvider::Create</a>)(<a class="el" href="group___typedefs.html#ga89b662403e6a687bb914b80114c0d19d">PP_Instance</a> instance)</td>
+</tr>
+</table>
+</div>
+<div class="memdoc">
+<p><a class="el" href="struct_p_p_b___vpn_provider__0__1.html#a2ec07eb1aaf01c4e7050c198e96a8f76" title="Create() creates a VpnProvider instance.">Create()</a> creates a VpnProvider instance. </p>
+<dl class="params"><dt><b>Parameters:</b></dt><dd>
+<table class="params">
+<tr><td class="paramdir">[in]</td><td class="paramname">instance</td><td>A <code>PP_Instance</code> identifying the instance with the VpnProvider.</td></tr>
+</table>
+</dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>A <code>PP_Resource</code> corresponding to a VpnProvider if successful. </dd></dl>
+</div>
+</div>
+<a class="anchor" id="a55919d9d06bd5ecd2c8365b872e1db9f"></a><!-- doxytag: member="PPB_VpnProvider::IsVpnProvider" ref="a55919d9d06bd5ecd2c8365b872e1db9f" args=")(PP_Resource resource)" -->
+<div class="memitem">
+<div class="memproto">
+<table class="memname">
+<tr>
+<td class="memname"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(* <a class="el" href="struct_p_p_b___vpn_provider__0__1.html#a55919d9d06bd5ecd2c8365b872e1db9f">PPB_VpnProvider::IsVpnProvider</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource)</td>
+</tr>
+</table>
+</div>
+<div class="memdoc">
+<p><a class="el" href="struct_p_p_b___vpn_provider__0__1.html#a55919d9d06bd5ecd2c8365b872e1db9f" title="IsVpnProvider() determines if the provided resource is a VpnProvider instance.">IsVpnProvider()</a> determines if the provided <code>resource</code> is a VpnProvider instance. </p>
+<dl class="params"><dt><b>Parameters:</b></dt><dd>
+<table class="params">
+<tr><td class="paramdir">[in]</td><td class="paramname">resource</td><td>A <code>PP_Resource</code> corresponding to a VpnProvider.</td></tr>
+</table>
+</dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>Returns <code>PP_TRUE</code> if <code>resource</code> is a <code>PPB_VpnProvider</code>, <code>PP_FALSE</code> if the <code>resource</code> is invalid or some type other than <code>PPB_VpnProvider</code>. </dd></dl>
+</div>
+</div>
+<a class="anchor" id="a767149d43eb103ad379dddcb04d1ca22"></a><!-- doxytag: member="PPB_VpnProvider::ReceivePacket" ref="a767149d43eb103ad379dddcb04d1ca22" args=")(PP_Resource vpn_provider, struct PP_Var *packet, struct PP_CompletionCallback callback)" -->
+<div class="memitem">
+<div class="memproto">
+<table class="memname">
+<tr>
+<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___vpn_provider__0__1.html#a767149d43eb103ad379dddcb04d1ca22">PPB_VpnProvider::ReceivePacket</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> vpn_provider, struct <a class="el" href="struct_p_p___var.html">PP_Var</a> *packet, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td>
+</tr>
+</table>
+</div>
+<div class="memdoc">
+<p><a class="el" href="struct_p_p_b___vpn_provider__0__1.html#a767149d43eb103ad379dddcb04d1ca22" title="ReceivePacket() receives an IP packet from the tunnel for the VPN session.">ReceivePacket()</a> receives an IP packet from the tunnel for the VPN session. </p>
+<p>This function only returns a single packet. This function must be called at least N times to receive N packets, no matter the size of each packet. The callback should be registered before calling <code><a class="el" href="struct_p_p_b___vpn_provider__0__1.html#a7b925b10a83d769e6d80d22fcace7833" title="Bind() binds to an existing configuration created from JavaScript by chrome.vpnProvider.createConfig.">Bind()</a></code>.</p>
+<dl class="params"><dt><b>Parameters:</b></dt><dd>
+<table class="params">
+<tr><td class="paramdir">[in]</td><td class="paramname">vpn_provider</td><td>A <code>PP_Resource</code> corresponding to a VpnProvider.</td></tr>
+<tr><td class="paramdir">[out]</td><td class="paramname">packet</td><td>The received packet is copied to provided <code>packet</code>. The <code>packet</code> must remain valid until <a class="el" href="struct_p_p_b___vpn_provider__0__1.html#a767149d43eb103ad379dddcb04d1ca22" title="ReceivePacket() receives an IP packet from the tunnel for the VPN session.">ReceivePacket()</a> completes. Its received <code>PP_VarType</code> will be <code>PP_VARTYPE_ARRAY_BUFFER</code>.</td></tr>
+<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="struct_p_p___completion_callback.html" title="PP_CompletionCallback is a common mechanism for supporting potentially asynchronous calls in browser ...">PP_CompletionCallback</a></code> called on completion.</td></tr>
+</table>
+</dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. Returns <code>PP_ERROR_INPROGRESS</code> if a previous call to <code><a class="el" href="struct_p_p_b___vpn_provider__0__1.html#a767149d43eb103ad379dddcb04d1ca22" title="ReceivePacket() receives an IP packet from the tunnel for the VPN session.">ReceivePacket()</a></code> has not completed. </dd></dl>
+</div>
+</div>
+<a class="anchor" id="a43d8ddc1da63d7ee94c26721599c34db"></a><!-- doxytag: member="PPB_VpnProvider::SendPacket" ref="a43d8ddc1da63d7ee94c26721599c34db" args=")(PP_Resource vpn_provider, struct PP_Var packet, struct PP_CompletionCallback callback)" -->
+<div class="memitem">
+<div class="memproto">
+<table class="memname">
+<tr>
+<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___vpn_provider__0__1.html#a43d8ddc1da63d7ee94c26721599c34db">PPB_VpnProvider::SendPacket</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> vpn_provider, struct <a class="el" href="struct_p_p___var.html">PP_Var</a> packet, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td>
+</tr>
+</table>
+</div>
+<div class="memdoc">
+<p><a class="el" href="struct_p_p_b___vpn_provider__0__1.html#a43d8ddc1da63d7ee94c26721599c34db" title="SendPacket() sends an IP packet through the tunnel created for the VPN session.">SendPacket()</a> sends an IP packet through the tunnel created for the VPN session. </p>
+<p>This will succeed only when the VPN session is owned by the module and the connection is bound.</p>
+<dl class="params"><dt><b>Parameters:</b></dt><dd>
+<table class="params">
+<tr><td class="paramdir">[in]</td><td class="paramname">vpn_provider</td><td>A <code>PP_Resource</code> corresponding to a VpnProvider.</td></tr>
+<tr><td class="paramdir">[in]</td><td class="paramname">packet</td><td>A <code>PP_VARTYPE_ARRAY_BUFFER</code> corresponding to an IP packet to be sent to the platform.</td></tr>
+<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="struct_p_p___completion_callback.html" title="PP_CompletionCallback is a common mechanism for supporting potentially asynchronous calls in browser ...">PP_CompletionCallback</a></code> called on completion.</td></tr>
+</table>
+</dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. Returns <code>PP_ERROR_FAILED</code> if the connection is not bound. Returns <code>PP_ERROR_INPROGRESS</code> if a previous call to <code><a class="el" href="struct_p_p_b___vpn_provider__0__1.html#a43d8ddc1da63d7ee94c26721599c34db" title="SendPacket() sends an IP packet through the tunnel created for the VPN session.">SendPacket()</a></code> has not completed. Returns <code>PP_ERROR_BADARGUMENT</code> if <code>packet</code> is not of type <code>PP_VARTYPE_ARRAY_BUFFER</code>. </dd></dl>
+</div>
+</div>
+<hr />The documentation for this struct was generated from the following file:<ul>
+<li><a class="el" href="ppb__vpn__provider_8h.html">ppb_vpn_provider.h</a></li>
+</ul>
+</div><!-- contents -->
+</div>
+{{/partials.standard_nacl_api}}
diff --git a/native_client_sdk/doc_generated/pepper_stable/cpp/classpp_1_1_graphics2_d-members.html b/native_client_sdk/doc_generated/pepper_stable/cpp/classpp_1_1_graphics2_d-members.html
index 3478097e..cc23614 100644
--- a/native_client_sdk/doc_generated/pepper_stable/cpp/classpp_1_1_graphics2_d-members.html
+++ b/native_client_sdk/doc_generated/pepper_stable/cpp/classpp_1_1_graphics2_d-members.html
@@ -31,6 +31,7 @@
 <tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a555de93fdf4793f7db1183bf71d20580">Resource</a>(PP_Resource resource)</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [explicit, protected]</code></td></tr>
 <tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a907d3d6b7e292587c8cb9ff30d0a418d">Resource</a>(PassRef, PP_Resource resource)</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [protected]</code></td></tr>
 <tr class="memlist"><td><a class="el" href="classpp_1_1_graphics2_d.html#a6a4256bb84cab71909821699d7aea369">Scroll</a>(const Rect &amp;clip, const Point &amp;amount)</td><td><a class="el" href="classpp_1_1_graphics2_d.html">pp::Graphics2D</a></td><td></td></tr>
+<tr class="memlist"><td><a class="el" href="classpp_1_1_graphics2_d.html#a3babd6bb9c922a650b3c7c57d1e36d8c">SetLayerTransform</a>(float scale, const Point &amp;origin, const Point &amp;translate)</td><td><a class="el" href="classpp_1_1_graphics2_d.html">pp::Graphics2D</a></td><td></td></tr>
 <tr class="memlist"><td><a class="el" href="classpp_1_1_graphics2_d.html#a96a91958227a7e42a829033241fac6b1">SetScale</a>(float scale)</td><td><a class="el" href="classpp_1_1_graphics2_d.html">pp::Graphics2D</a></td><td></td></tr>
 <tr class="memlist"><td><a class="el" href="classpp_1_1_graphics2_d.html#ad623f80db2c0cc679619303a0c0b9eff">size</a>() const </td><td><a class="el" href="classpp_1_1_graphics2_d.html">pp::Graphics2D</a></td><td><code> [inline]</code></td></tr>
 <tr class="memlist"><td><a class="el" href="classpp_1_1_graphics2_d.html#aa40a889094d345add38f16d559ae0ebd">~Graphics2D</a>()</td><td><a class="el" href="classpp_1_1_graphics2_d.html">pp::Graphics2D</a></td><td><code> [virtual]</code></td></tr>
diff --git a/native_client_sdk/doc_generated/pepper_stable/cpp/classpp_1_1_graphics2_d.html b/native_client_sdk/doc_generated/pepper_stable/cpp/classpp_1_1_graphics2_d.html
index add8e599..c8b6d8a 100644
--- a/native_client_sdk/doc_generated/pepper_stable/cpp/classpp_1_1_graphics2_d.html
+++ b/native_client_sdk/doc_generated/pepper_stable/cpp/classpp_1_1_graphics2_d.html
@@ -34,6 +34,7 @@
 <tr><td class="memItemLeft" align="right" valign="top">int32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_graphics2_d.html#a3c1e23ad48ad62860a125d471b7664a4">Flush</a> (const <a class="el" href="classpp_1_1_completion_callback.html">CompletionCallback</a> &amp;cc)</td></tr>
 <tr><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_graphics2_d.html#a96a91958227a7e42a829033241fac6b1">SetScale</a> (float scale)</td></tr>
 <tr><td class="memItemLeft" align="right" valign="top">float&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_graphics2_d.html#a5b927eaabdd78b1a0094aa1a3695bae2">GetScale</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_graphics2_d.html#a3babd6bb9c922a650b3c7c57d1e36d8c">SetLayerTransform</a> (float scale, const <a class="el" href="classpp_1_1_point.html">Point</a> &amp;origin, const <a class="el" href="classpp_1_1_point.html">Point</a> &amp;translate)</td></tr>
 </table>
 <hr /><h2>Constructor &amp; Destructor Documentation</h2>
 <a class="anchor" id="aef2cf8f0798d4980309f9bc888a73463"></a><!-- doxytag: member="pp::Graphics2D::Graphics2D" ref="aef2cf8f0798d4980309f9bc888a73463" args="()" -->
@@ -359,6 +360,38 @@
 </dl>
 </div>
 </div>
+<a class="anchor" id="a3babd6bb9c922a650b3c7c57d1e36d8c"></a><!-- doxytag: member="pp::Graphics2D::SetLayerTransform" ref="a3babd6bb9c922a650b3c7c57d1e36d8c" args="(float scale, const Point &amp;origin, const Point &amp;translate)" -->
+<div class="memitem">
+<div class="memproto">
+<table class="memname">
+<tr>
+<td class="memname">bool <a class="el" href="classpp_1_1_graphics2_d.html#a3babd6bb9c922a650b3c7c57d1e36d8c">pp::Graphics2D::SetLayerTransform</a> </td>
+<td>(</td>
+<td class="paramtype">float&#160;</td>
+<td class="paramname"><em>scale</em>, </td>
+</tr>
+<tr>
+<td class="paramkey"></td>
+<td></td>
+<td class="paramtype">const <a class="el" href="classpp_1_1_point.html">Point</a> &amp;&#160;</td>
+<td class="paramname"><em>origin</em>, </td>
+</tr>
+<tr>
+<td class="paramkey"></td>
+<td></td>
+<td class="paramtype">const <a class="el" href="classpp_1_1_point.html">Point</a> &amp;&#160;</td>
+<td class="paramname"><em>translate</em>&#160;</td>
+</tr>
+<tr>
+<td></td>
+<td>)</td>
+<td></td><td></td>
+</tr>
+</table>
+</div>
+<div class="memdoc">
+</div>
+</div>
 <a class="anchor" id="a96a91958227a7e42a829033241fac6b1"></a><!-- doxytag: member="pp::Graphics2D::SetScale" ref="a96a91958227a7e42a829033241fac6b1" args="(float scale)" -->
 <div class="memitem">
 <div class="memproto">
diff --git a/native_client_sdk/doc_generated/pepper_stable/cpp/classpp_1_1_message_loop.html b/native_client_sdk/doc_generated/pepper_stable/cpp/classpp_1_1_message_loop.html
index fbf2203..4d250a8 100644
--- a/native_client_sdk/doc_generated/pepper_stable/cpp/classpp_1_1_message_loop.html
+++ b/native_client_sdk/doc_generated/pepper_stable/cpp/classpp_1_1_message_loop.html
@@ -306,7 +306,7 @@
 <p>Runs the thread message loop. </p>
 <p>Running the message loop is required for you to get issued completion callbacks on the thread.</p>
 <p>The message loop identified by the argument must have been previously successfully attached to the current thread.</p>
-<p>You may not run nested run loops. Since the main thread has an implicit message loop that the system runs, you may not call Run on the main thread.</p>
+<p>You may not run nested message loops. Since the main thread has an implicit message loop that the system runs, you may not call Run on the main thread.</p>
 <dl class="return"><dt><b>Returns:</b></dt><dd><ul>
 <li>PP_OK: The message loop was successfully run. Note that on success, the message loop will only exit when you call <a class="el" href="classpp_1_1_message_loop.html#a2311af860834b866076fb518ac27eab5" title="Posts a quit message to the given message loop's work queue.">PostQuit()</a>.</li>
 <li>PP_ERROR_BADRESOURCE: The given message loop resource is invalid.</li>
diff --git a/native_client_sdk/doc_generated/pepper_stable/cpp/classpp_1_1_resource.html b/native_client_sdk/doc_generated/pepper_stable/cpp/classpp_1_1_resource.html
index 9e77949..5811e35f 100644
--- a/native_client_sdk/doc_generated/pepper_stable/cpp/classpp_1_1_resource.html
+++ b/native_client_sdk/doc_generated/pepper_stable/cpp/classpp_1_1_resource.html
@@ -15,7 +15,7 @@
 <div class="dyncontent">
 <div class="center"><img src="classpp_1_1_resource__inherit__graph.png" border="0" usemap="#pp_1_1_resource_inherit__map" alt="Inheritance graph" /></div>
 <map name="pp_1_1_resource_inherit__map" id="pp_1_1_resource_inherit__map">
-<area shape="rect" id="node2" href="classpp_1_1_audio.html" title="An audio resource." alt="" coords="216,5,299,32"></area><area shape="rect" id="node3" href="classpp_1_1_audio_buffer.html" title="pp::AudioBuffer" alt="" coords="197,56,317,83"></area><area shape="rect" id="node4" href="classpp_1_1_audio_config.html" title="A 16 bit stereo AudioConfig resource." alt="" coords="196,107,319,133"></area><area shape="rect" id="node5" href="classpp_1_1_audio_encoder.html" title="Audio encoder interface." alt="" coords="190,157,325,184"></area><area shape="rect" id="node6" href="classpp_1_1_compositor.html" title="The Compositor interface is used for setting CompositorLayer layers to the Chromium compositor for co..." alt="" coords="197,208,317,235"></area><area shape="rect" id="node7" href="classpp_1_1_compositor_layer.html" title="pp::CompositorLayer" alt="" coords="180,259,335,285"></area><area shape="rect" id="node8" href="classpp_1_1_file_i_o.html" title="The FileIO class represents a regular file." alt="" coords="218,309,297,336"></area><area shape="rect" id="node9" href="classpp_1_1_file_ref.html" title='The FileRef class represents a "weak pointer" to a file in a file system.' alt="" coords="215,360,300,387"></area><area shape="rect" id="node10" href="classpp_1_1_file_system.html" title="The FileSystem class identifies the file system type associated with a file." alt="" coords="200,411,315,437"></area><area shape="rect" id="node11" href="classpp_1_1_graphics2_d.html" title="pp::Graphics2D" alt="" coords="197,461,317,488"></area><area shape="rect" id="node12" href="classpp_1_1_graphics3_d.html" title="This class represents a 3D rendering context in the browser." alt="" coords="197,512,317,539"></area><area shape="rect" id="node13" href="classpp_1_1_host_resolver.html" title="The HostResolver class supports host name resolution." alt="" coords="193,563,322,589"></area><area shape="rect" id="node14" href="classpp_1_1_image_data.html" title="pp::ImageData" alt="" coords="199,613,316,640"></area><area shape="rect" id="node15" href="classpp_1_1_input_event.html" title="This class represents an input event resource." alt="" coords="200,664,315,691"></area><area shape="rect" id="node21" href="classpp_1_1_media_stream_audio_track.html" title="The MediaStreamAudioTrack class contains methods for receiving audio buffers from a MediaStream audio..." alt="" coords="157,715,357,741"></area><area shape="rect" id="node22" href="classpp_1_1_media_stream_video_track.html" title="The MediaStreamVideoTrack class contains methods for receiving video frames from a MediaStream video ..." alt="" coords="157,765,357,792"></area><area shape="rect" id="node23" href="classpp_1_1_message_loop.html" title="A message loop allows PPAPI calls to be issued on a thread." alt="" coords="190,816,325,843"></area><area shape="rect" id="node24" href="classpp_1_1_net_address.html" title="The NetAddress class represents a network address." alt="" coords="197,867,318,893"></area><area shape="rect" id="node25" href="classpp_1_1_network_list.html" title="pp::NetworkList" alt="" coords="197,917,317,944"></area><area shape="rect" id="node26" href="classpp_1_1_network_monitor.html" title="pp::NetworkMonitor" alt="" coords="184,968,331,995"></area><area shape="rect" id="node27" href="classpp_1_1_t_c_p_socket.html" title="The TCPSocket class provides TCP socket operations." alt="" coords="201,1019,314,1045"></area><area shape="rect" id="node28" href="classpp_1_1_u_d_p_socket.html" title="The UDPSocket class provides UDP socket operations." alt="" coords="198,1069,317,1096"></area><area shape="rect" id="node29" href="classpp_1_1_u_r_l_loader.html" title="URLLoader provides an API for loading URLs." alt="" coords="200,1120,315,1147"></area><area shape="rect" id="node30" href="classpp_1_1_u_r_l_request_info.html" title="URLRequestInfo provides an API for creating and manipulating URL requests." alt="" coords="185,1171,330,1197"></area><area shape="rect" id="node31" href="classpp_1_1_u_r_l_response_info.html" title="URLResponseInfo provides an API for examining URL responses." alt="" coords="180,1221,335,1248"></area><area shape="rect" id="node32" href="classpp_1_1_video_decoder.html" title="Video decoder interface." alt="" coords="189,1272,325,1299"></area><area shape="rect" id="node33" href="classpp_1_1_video_encoder.html" title="Video encoder interface." alt="" coords="190,1323,325,1349"></area><area shape="rect" id="node34" href="classpp_1_1_video_frame.html" title="pp::VideoFrame" alt="" coords="196,1373,319,1400"></area><area shape="rect" id="node35" href="classpp_1_1_view.html" title="This class represents the state of the view for an instance and contains functions for retrieving the..." alt="" coords="220,1424,295,1451"></area><area shape="rect" id="node36" href="classpp_1_1_web_socket.html" title="The WebSocket class providing bi-directional, full-duplex, communications over a single TCP socket..." alt="" coords="199,1475,315,1501"></area><area shape="rect" id="node16" href="classpp_1_1_i_m_e_input_event.html" title="pp::IMEInputEvent" alt="" coords="424,563,560,589"></area><area shape="rect" id="node17" href="classpp_1_1_keyboard_input_event.html" title="pp::KeyboardInputEvent" alt="" coords="405,613,579,640"></area><area shape="rect" id="node18" href="classpp_1_1_mouse_input_event.html" title="This class handles mouse events." alt="" coords="414,664,570,691"></area><area shape="rect" id="node19" href="classpp_1_1_touch_input_event.html" title="pp::TouchInputEvent" alt="" coords="417,715,567,741"></area><area shape="rect" id="node20" href="classpp_1_1_wheel_input_event.html" title="pp::WheelInputEvent" alt="" coords="416,765,568,792"></area></map>
+<area shape="rect" id="node2" href="classpp_1_1_audio.html" title="An audio resource." alt="" coords="216,5,299,32"></area><area shape="rect" id="node3" href="classpp_1_1_audio_buffer.html" title="pp::AudioBuffer" alt="" coords="197,56,317,83"></area><area shape="rect" id="node4" href="classpp_1_1_audio_config.html" title="A 16 bit stereo AudioConfig resource." alt="" coords="196,107,319,133"></area><area shape="rect" id="node5" href="classpp_1_1_audio_encoder.html" title="Audio encoder interface." alt="" coords="190,157,325,184"></area><area shape="rect" id="node6" href="classpp_1_1_compositor.html" title="The Compositor interface is used for setting CompositorLayer layers to the Chromium compositor for co..." alt="" coords="197,208,317,235"></area><area shape="rect" id="node7" href="classpp_1_1_compositor_layer.html" title="pp::CompositorLayer" alt="" coords="180,259,335,285"></area><area shape="rect" id="node8" href="classpp_1_1_file_i_o.html" title="The FileIO class represents a regular file." alt="" coords="218,309,297,336"></area><area shape="rect" id="node9" href="classpp_1_1_file_ref.html" title='The FileRef class represents a "weak pointer" to a file in a file system.' alt="" coords="215,360,300,387"></area><area shape="rect" id="node10" href="classpp_1_1_file_system.html" title="The FileSystem class identifies the file system type associated with a file." alt="" coords="200,411,315,437"></area><area shape="rect" id="node11" href="classpp_1_1_graphics2_d.html" title="pp::Graphics2D" alt="" coords="197,461,317,488"></area><area shape="rect" id="node12" href="classpp_1_1_graphics3_d.html" title="This class represents a 3D rendering context in the browser." alt="" coords="197,512,317,539"></area><area shape="rect" id="node13" href="classpp_1_1_host_resolver.html" title="The HostResolver class supports host name resolution." alt="" coords="193,563,322,589"></area><area shape="rect" id="node14" href="classpp_1_1_image_data.html" title="pp::ImageData" alt="" coords="199,613,316,640"></area><area shape="rect" id="node15" href="classpp_1_1_input_event.html" title="This class represents an input event resource." alt="" coords="200,664,315,691"></area><area shape="rect" id="node21" href="classpp_1_1_media_stream_audio_track.html" title="The MediaStreamAudioTrack class contains methods for receiving audio buffers from a MediaStream audio..." alt="" coords="157,715,357,741"></area><area shape="rect" id="node22" href="classpp_1_1_media_stream_video_track.html" title="The MediaStreamVideoTrack class contains methods for receiving video frames from a MediaStream video ..." alt="" coords="157,765,357,792"></area><area shape="rect" id="node23" href="classpp_1_1_message_loop.html" title="A message loop allows PPAPI calls to be issued on a thread." alt="" coords="190,816,325,843"></area><area shape="rect" id="node24" href="classpp_1_1_net_address.html" title="The NetAddress class represents a network address." alt="" coords="197,867,318,893"></area><area shape="rect" id="node25" href="classpp_1_1_network_list.html" title="pp::NetworkList" alt="" coords="197,917,317,944"></area><area shape="rect" id="node26" href="classpp_1_1_network_monitor.html" title="pp::NetworkMonitor" alt="" coords="184,968,331,995"></area><area shape="rect" id="node27" href="classpp_1_1_t_c_p_socket.html" title="The TCPSocket class provides TCP socket operations." alt="" coords="201,1019,314,1045"></area><area shape="rect" id="node28" href="classpp_1_1_u_d_p_socket.html" title="The UDPSocket class provides UDP socket operations." alt="" coords="198,1069,317,1096"></area><area shape="rect" id="node29" href="classpp_1_1_u_r_l_loader.html" title="URLLoader provides an API for loading URLs." alt="" coords="200,1120,315,1147"></area><area shape="rect" id="node30" href="classpp_1_1_u_r_l_request_info.html" title="URLRequestInfo provides an API for creating and manipulating URL requests." alt="" coords="185,1171,330,1197"></area><area shape="rect" id="node31" href="classpp_1_1_u_r_l_response_info.html" title="URLResponseInfo provides an API for examining URL responses." alt="" coords="180,1221,335,1248"></area><area shape="rect" id="node32" href="classpp_1_1_video_decoder.html" title="Video decoder interface." alt="" coords="189,1272,325,1299"></area><area shape="rect" id="node33" href="classpp_1_1_video_encoder.html" title="Video encoder interface." alt="" coords="190,1323,325,1349"></area><area shape="rect" id="node34" href="classpp_1_1_video_frame.html" title="pp::VideoFrame" alt="" coords="196,1373,319,1400"></area><area shape="rect" id="node35" href="classpp_1_1_view.html" title="This class represents the state of the view for an instance and contains functions for retrieving the..." alt="" coords="220,1424,295,1451"></area><area shape="rect" id="node36" href="classpp_1_1_vpn_provider.html" title="The VpnProvider class enhances the chrome.vpnProvider JavaScript API by providing a high performance ..." alt="" coords="196,1475,319,1501"></area><area shape="rect" id="node37" href="classpp_1_1_web_socket.html" title="The WebSocket class providing bi-directional, full-duplex, communications over a single TCP socket..." alt="" coords="199,1525,315,1552"></area><area shape="rect" id="node16" href="classpp_1_1_i_m_e_input_event.html" title="pp::IMEInputEvent" alt="" coords="424,563,560,589"></area><area shape="rect" id="node17" href="classpp_1_1_keyboard_input_event.html" title="pp::KeyboardInputEvent" alt="" coords="405,613,579,640"></area><area shape="rect" id="node18" href="classpp_1_1_mouse_input_event.html" title="This class handles mouse events." alt="" coords="414,664,570,691"></area><area shape="rect" id="node19" href="classpp_1_1_touch_input_event.html" title="pp::TouchInputEvent" alt="" coords="417,715,567,741"></area><area shape="rect" id="node20" href="classpp_1_1_wheel_input_event.html" title="pp::WheelInputEvent" alt="" coords="416,765,568,792"></area></map>
 <center><span class="legend">[<a href="graph_legend.html">legend</a>]</span></center></div>
 <p><a href="classpp_1_1_resource-members.html">List of all members.</a></p>
 <h2>
diff --git a/native_client_sdk/doc_generated/pepper_stable/cpp/classpp_1_1_resource__inherit__graph.png b/native_client_sdk/doc_generated/pepper_stable/cpp/classpp_1_1_resource__inherit__graph.png
index 5fd5ac3..2df5ffd 100644
--- a/native_client_sdk/doc_generated/pepper_stable/cpp/classpp_1_1_resource__inherit__graph.png
+++ b/native_client_sdk/doc_generated/pepper_stable/cpp/classpp_1_1_resource__inherit__graph.png
Binary files differ
diff --git a/native_client_sdk/doc_generated/pepper_stable/cpp/classpp_1_1_vpn_provider-members.html b/native_client_sdk/doc_generated/pepper_stable/cpp/classpp_1_1_vpn_provider-members.html
new file mode 100644
index 0000000..d8f037be
--- /dev/null
+++ b/native_client_sdk/doc_generated/pepper_stable/cpp/classpp_1_1_vpn_provider-members.html
@@ -0,0 +1,33 @@
+{{+bindTo:partials.standard_nacl_api}}
+<h1>Member List</h1>
+<div id="doxygen-ref">
+{{- dummy div to appease doxygen -}}
+  <div>
+<!-- Generated by Doxygen 1.7.6.1 -->
+
+
+
+</div>
+<!--header-->
+<div class="contents">
+This is the complete list of members for <a class="el" href="classpp_1_1_vpn_provider.html">pp::VpnProvider</a>, including all inherited members.<table>
+<tr class="memlist"><td><a class="el" href="classpp_1_1_vpn_provider.html#a90d17a19973f48a31ea933325e0b61af">Bind</a>(const Var &amp;configuration_id, const Var &amp;configuration_name, const CompletionCallback &amp;callback)</td><td><a class="el" href="classpp_1_1_vpn_provider.html">pp::VpnProvider</a></td><td></td></tr>
+<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#ad4016f37d3022863ca0188acb26ac9c4">Clear</a>()</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [protected]</code></td></tr>
+<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a81b9246381bdddacca3ac25f6ded2bfd">detach</a>()</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td></td></tr>
+<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a859068e34cdc2dc0b78754c255323aa9">is_null</a>() const </td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [inline]</code></td></tr>
+<tr class="memlist"><td><a class="el" href="classpp_1_1_vpn_provider.html#a0a6b1fd0a843997fafe1bf5bed85b3b9">IsAvailable</a>()</td><td><a class="el" href="classpp_1_1_vpn_provider.html">pp::VpnProvider</a></td><td><code> [static]</code></td></tr>
+<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#aaf808a98bdaa7998d82e19514aa87423">operator=</a>(const Resource &amp;other)</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td></td></tr>
+<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a3eda014529127a818df8d5bb5ec2fdf0">PassRefFromConstructor</a>(PP_Resource resource)</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [protected]</code></td></tr>
+<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a46a6123de0b007ad3fcb6f666534ccb4">pp_resource</a>() const </td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [inline]</code></td></tr>
+<tr class="memlist"><td><a class="el" href="classpp_1_1_vpn_provider.html#a745f12bb3d3eb9bf7f29892a717caefb">ReceivePacket</a>(const CompletionCallbackWithOutput&lt; Var &gt; &amp;callback)</td><td><a class="el" href="classpp_1_1_vpn_provider.html">pp::VpnProvider</a></td><td></td></tr>
+<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a56679e93a58101c8dce5dc510811a094">Resource</a>()</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td></td></tr>
+<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#ab0f664099ca06367180f220ea7e0b831">Resource</a>(const Resource &amp;other)</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td></td></tr>
+<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a555de93fdf4793f7db1183bf71d20580">Resource</a>(PP_Resource resource)</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [explicit, protected]</code></td></tr>
+<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a907d3d6b7e292587c8cb9ff30d0a418d">Resource</a>(PassRef, PP_Resource resource)</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [protected]</code></td></tr>
+<tr class="memlist"><td><a class="el" href="classpp_1_1_vpn_provider.html#ae692340a675bcd27c756e98779efe615">SendPacket</a>(const Var &amp;packet, const CompletionCallback &amp;callback)</td><td><a class="el" href="classpp_1_1_vpn_provider.html">pp::VpnProvider</a></td><td></td></tr>
+<tr class="memlist"><td><a class="el" href="classpp_1_1_vpn_provider.html#a5d44d34828cce02849b2ade71de054f6">VpnProvider</a>(const InstanceHandle &amp;instance)</td><td><a class="el" href="classpp_1_1_vpn_provider.html">pp::VpnProvider</a></td><td><code> [explicit]</code></td></tr>
+<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a081165265e2bd8217eaa2be2aeeb3aa3">~Resource</a>()</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [virtual]</code></td></tr>
+<tr class="memlist"><td><a class="el" href="classpp_1_1_vpn_provider.html#a0ae82ce542bed9af72da27fb4c94ec42">~VpnProvider</a>()</td><td><a class="el" href="classpp_1_1_vpn_provider.html">pp::VpnProvider</a></td><td><code> [virtual]</code></td></tr>
+</table></div><!-- contents -->
+</div>
+{{/partials.standard_nacl_api}}
diff --git a/native_client_sdk/doc_generated/pepper_stable/cpp/classpp_1_1_vpn_provider.html b/native_client_sdk/doc_generated/pepper_stable/cpp/classpp_1_1_vpn_provider.html
new file mode 100644
index 0000000..d3ab36e
--- /dev/null
+++ b/native_client_sdk/doc_generated/pepper_stable/cpp/classpp_1_1_vpn_provider.html
@@ -0,0 +1,213 @@
+{{+bindTo:partials.standard_nacl_api}}
+<h1>pp::VpnProvider Class Reference</h1>
+<div id="doxygen-ref">
+{{- dummy div to appease doxygen -}}
+  <div>
+<!-- Generated by Doxygen 1.7.6.1 -->
+
+
+
+</div>
+<!--header-->
+<div class="contents">
+<!-- doxytag: class="pp::VpnProvider" --><!-- doxytag: inherits="pp::Resource" --><div class="dynheader">
+Inheritance diagram for pp::VpnProvider:</div>
+<div class="dyncontent">
+<div class="center"><img src="classpp_1_1_vpn_provider__inherit__graph.png" border="0" usemap="#pp_1_1_vpn_provider_inherit__map" alt="Inheritance graph" /></div>
+<map name="pp_1_1_vpn_provider_inherit__map" id="pp_1_1_vpn_provider_inherit__map">
+<area shape="rect" id="node2" href="classpp_1_1_resource.html" title="A reference counted module resource." alt="" coords="15,5,119,32"></area></map>
+<center><span class="legend">[<a href="graph_legend.html">legend</a>]</span></center></div>
+<p><a href="classpp_1_1_vpn_provider-members.html">List of all members.</a></p>
+<h2>
+Public Member Functions</h2><table class="memberdecls">
+
+<tr><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_vpn_provider.html#a5d44d34828cce02849b2ade71de054f6">VpnProvider</a> (const <a class="el" href="classpp_1_1_instance_handle.html">InstanceHandle</a> &amp;instance)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">virtual&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_vpn_provider.html#a0ae82ce542bed9af72da27fb4c94ec42">~VpnProvider</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">int32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_vpn_provider.html#a90d17a19973f48a31ea933325e0b61af">Bind</a> (const <a class="el" href="classpp_1_1_var.html">Var</a> &amp;configuration_id, const <a class="el" href="classpp_1_1_var.html">Var</a> &amp;configuration_name, const <a class="el" href="classpp_1_1_completion_callback.html">CompletionCallback</a> &amp;callback)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">int32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_vpn_provider.html#ae692340a675bcd27c756e98779efe615">SendPacket</a> (const <a class="el" href="classpp_1_1_var.html">Var</a> &amp;packet, const <a class="el" href="classpp_1_1_completion_callback.html">CompletionCallback</a> &amp;callback)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">int32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_vpn_provider.html#a745f12bb3d3eb9bf7f29892a717caefb">ReceivePacket</a> (const <a class="el" href="classpp_1_1_completion_callback_with_output.html">CompletionCallbackWithOutput</a>&lt; <a class="el" href="classpp_1_1_var.html">Var</a> &gt; &amp;callback)</td></tr>
+</table><h2>
+Static Public Member Functions</h2><table class="memberdecls">
+<tr><td class="memItemLeft" align="right" valign="top">static bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_vpn_provider.html#a0a6b1fd0a843997fafe1bf5bed85b3b9">IsAvailable</a> ()</td></tr>
+</table>
+<hr /><a name="details" id="details"></a><h2>Detailed Description</h2>
+<div class="textblock"><p>The <code><a class="el" href="classpp_1_1_vpn_provider.html" title="The VpnProvider class enhances the chrome.vpnProvider JavaScript API by providing a high performance ...">VpnProvider</a></code> class enhances the <code>chrome.vpnProvider</code> JavaScript API by providing a high performance path for packet handling. </p>
+<p>Permissions: Apps permission <code>vpnProvider</code> is required for <code><a class="el" href="classpp_1_1_vpn_provider.html#a90d17a19973f48a31ea933325e0b61af" title="Binds to an existing configuration created from JavaScript by chrome.vpnProvider.createConfig.">VpnProvider.Bind()</a></code>.</p>
+<p>Typical usage:</p>
+<ul>
+<li>Create a <code><a class="el" href="classpp_1_1_vpn_provider.html" title="The VpnProvider class enhances the chrome.vpnProvider JavaScript API by providing a high performance ...">VpnProvider</a></code> instance.</li>
+<li>Register the callback for <code><a class="el" href="classpp_1_1_vpn_provider.html#a745f12bb3d3eb9bf7f29892a717caefb" title="Receives an IP packet from the tunnel for the VPN session.">VpnProvider.ReceivePacket()</a></code>.</li>
+<li>In the extension follow the usual workflow for configuring a VPN connection via the <code>chrome.vpnProvider</code> API until the step for notifying the connection state as "connected".</li>
+<li>Bind to the previously created connection using <code><a class="el" href="classpp_1_1_vpn_provider.html#a90d17a19973f48a31ea933325e0b61af" title="Binds to an existing configuration created from JavaScript by chrome.vpnProvider.createConfig.">VpnProvider.Bind()</a></code>.</li>
+<li>Notify the connection state as "connected" from JavaScript using <code>chrome.vpnProvider.notifyConnectionStateChanged</code>.</li>
+<li>When the steps above are completed without errors, a virtual tunnel is created to the network stack of Chrome OS. IP packets can be sent through the tunnel using <code><a class="el" href="classpp_1_1_vpn_provider.html#ae692340a675bcd27c756e98779efe615" title="Sends an IP packet through the tunnel created for the VPN session.">VpnProvider.SendPacket()</a></code> and any packets originating on the Chrome OS device will be received using the callback registered for <code><a class="el" href="classpp_1_1_vpn_provider.html#a745f12bb3d3eb9bf7f29892a717caefb" title="Receives an IP packet from the tunnel for the VPN session.">VpnProvider.ReceivePacket()</a></code>.</li>
+<li>When the user disconnects from the VPN configuration or there is an error the extension will be notfied via <code>chrome.vpnProvider.onPlatformMessage</code>. </li>
+</ul>
+</div><hr /><h2>Constructor &amp; Destructor Documentation</h2>
+<a class="anchor" id="a5d44d34828cce02849b2ade71de054f6"></a><!-- doxytag: member="pp::VpnProvider::VpnProvider" ref="a5d44d34828cce02849b2ade71de054f6" args="(const InstanceHandle &amp;instance)" -->
+<div class="memitem">
+<div class="memproto">
+<table class="memname">
+<tr>
+<td class="memname"><a class="el" href="classpp_1_1_vpn_provider.html#a5d44d34828cce02849b2ade71de054f6">pp::VpnProvider::VpnProvider</a> </td>
+<td>(</td>
+<td class="paramtype">const <a class="el" href="classpp_1_1_instance_handle.html">InstanceHandle</a> &amp;&#160;</td>
+<td class="paramname"><em>instance</em></td><td>)</td>
+<td><code> [explicit]</code></td>
+</tr>
+</table>
+</div>
+<div class="memdoc">
+<p>Constructs a <a class="el" href="classpp_1_1_vpn_provider.html" title="The VpnProvider class enhances the chrome.vpnProvider JavaScript API by providing a high performance ...">VpnProvider</a> object. </p>
+<dl class="params"><dt><b>Parameters:</b></dt><dd>
+<table class="params">
+<tr><td class="paramdir">[in]</td><td class="paramname">instance</td><td>The instance with which this resource will be associated. </td></tr>
+</table>
+</dd>
+</dl>
+</div>
+</div>
+<a class="anchor" id="a0ae82ce542bed9af72da27fb4c94ec42"></a><!-- doxytag: member="pp::VpnProvider::~VpnProvider" ref="a0ae82ce542bed9af72da27fb4c94ec42" args="()" -->
+<div class="memitem">
+<div class="memproto">
+<table class="memname">
+<tr>
+<td class="memname">virtual <a class="el" href="classpp_1_1_vpn_provider.html#a0ae82ce542bed9af72da27fb4c94ec42">pp::VpnProvider::~VpnProvider</a> </td>
+<td>(</td>
+<td class="paramname"></td><td>)</td>
+<td><code> [virtual]</code></td>
+</tr>
+</table>
+</div>
+<div class="memdoc">
+<p>Destructs a <a class="el" href="classpp_1_1_vpn_provider.html" title="The VpnProvider class enhances the chrome.vpnProvider JavaScript API by providing a high performance ...">VpnProvider</a> object. </p>
+</div>
+</div>
+<hr /><h2>Member Function Documentation</h2>
+<a class="anchor" id="a90d17a19973f48a31ea933325e0b61af"></a><!-- doxytag: member="pp::VpnProvider::Bind" ref="a90d17a19973f48a31ea933325e0b61af" args="(const Var &amp;configuration_id, const Var &amp;configuration_name, const CompletionCallback &amp;callback)" -->
+<div class="memitem">
+<div class="memproto">
+<table class="memname">
+<tr>
+<td class="memname">int32_t <a class="el" href="classpp_1_1_vpn_provider.html#a90d17a19973f48a31ea933325e0b61af">pp::VpnProvider::Bind</a> </td>
+<td>(</td>
+<td class="paramtype">const <a class="el" href="classpp_1_1_var.html">Var</a> &amp;&#160;</td>
+<td class="paramname"><em>configuration_id</em>, </td>
+</tr>
+<tr>
+<td class="paramkey"></td>
+<td></td>
+<td class="paramtype">const <a class="el" href="classpp_1_1_var.html">Var</a> &amp;&#160;</td>
+<td class="paramname"><em>configuration_name</em>, </td>
+</tr>
+<tr>
+<td class="paramkey"></td>
+<td></td>
+<td class="paramtype">const <a class="el" href="classpp_1_1_completion_callback.html">CompletionCallback</a> &amp;&#160;</td>
+<td class="paramname"><em>callback</em>&#160;</td>
+</tr>
+<tr>
+<td></td>
+<td>)</td>
+<td></td><td></td>
+</tr>
+</table>
+</div>
+<div class="memdoc">
+<p>Binds to an existing configuration created from JavaScript by <code>chrome.vpnProvider.createConfig</code>. </p>
+<p>All packets will be routed via <code>SendPacket</code> and <code>ReceivePacket</code>. The user should register the callback for <code>ReceivePacket</code> before calling <code><a class="el" href="classpp_1_1_vpn_provider.html#a90d17a19973f48a31ea933325e0b61af" title="Binds to an existing configuration created from JavaScript by chrome.vpnProvider.createConfig.">Bind()</a></code>.</p>
+<dl class="params"><dt><b>Parameters:</b></dt><dd>
+<table class="params">
+<tr><td class="paramdir">[in]</td><td class="paramname">configuration_id</td><td>The configuration id from the callback of <code>chrome.vpnProvider.createConfig</code>. This <code><a class="el" href="classpp_1_1_var.html" title="A generic type used for passing data types between the module and the page.">Var</a></code> must be of string type.</td></tr>
+<tr><td class="paramdir">[in]</td><td class="paramname">configuration_name</td><td>The configuration name as defined by the user when calling <code>chrome.vpnProvider.createConfig</code>. This <code><a class="el" href="classpp_1_1_var.html" title="A generic type used for passing data types between the module and the page.">Var</a></code> must be of string type.</td></tr>
+<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="classpp_1_1_completion_callback.html" title="This API enables you to implement and receive callbacks when Pepper operations complete asynchronousl...">CompletionCallback</a></code> to be called on completion.</td></tr>
+</table>
+</dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code>pp_errors.h</code>. Returns <code>PP_ERROR_INPROGRESS</code> if a previous call to <code><a class="el" href="classpp_1_1_vpn_provider.html#a90d17a19973f48a31ea933325e0b61af" title="Binds to an existing configuration created from JavaScript by chrome.vpnProvider.createConfig.">Bind()</a></code> has not completed. Returns <code>PP_ERROR_BADARGUMENT</code> if the <code><a class="el" href="classpp_1_1_var.html" title="A generic type used for passing data types between the module and the page.">Var</a></code> type of either <code>configuration_id</code> or <code>configuration_name</code> is not of string type. Returns <code>PP_ERROR_NOACCESS</code> if the caller does the have the required "vpnProvider" permission. Returns <code>PP_ERROR_FAILED</code> if <code>connection_id</code> and <code>connection_name</code> could not be matched with the existing connection, or if the plugin originates from a different extension than the one that created the connection. </dd></dl>
+</div>
+</div>
+<a class="anchor" id="a0a6b1fd0a843997fafe1bf5bed85b3b9"></a><!-- doxytag: member="pp::VpnProvider::IsAvailable" ref="a0a6b1fd0a843997fafe1bf5bed85b3b9" args="()" -->
+<div class="memitem">
+<div class="memproto">
+<table class="memname">
+<tr>
+<td class="memname">static bool <a class="el" href="classpp_1_1_vpn_provider.html#a0a6b1fd0a843997fafe1bf5bed85b3b9">pp::VpnProvider::IsAvailable</a> </td>
+<td>(</td>
+<td class="paramname"></td><td>)</td>
+<td><code> [static]</code></td>
+</tr>
+</table>
+</div>
+<div class="memdoc">
+<p>Static function for determining whether the browser supports the <code><a class="el" href="classpp_1_1_vpn_provider.html" title="The VpnProvider class enhances the chrome.vpnProvider JavaScript API by providing a high performance ...">VpnProvider</a></code> interface. </p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>true if the interface is available, false otherwise. </dd></dl>
+</div>
+</div>
+<a class="anchor" id="a745f12bb3d3eb9bf7f29892a717caefb"></a><!-- doxytag: member="pp::VpnProvider::ReceivePacket" ref="a745f12bb3d3eb9bf7f29892a717caefb" args="(const CompletionCallbackWithOutput&lt; Var &gt; &amp;callback)" -->
+<div class="memitem">
+<div class="memproto">
+<table class="memname">
+<tr>
+<td class="memname">int32_t <a class="el" href="classpp_1_1_vpn_provider.html#a745f12bb3d3eb9bf7f29892a717caefb">pp::VpnProvider::ReceivePacket</a> </td>
+<td>(</td>
+<td class="paramtype">const <a class="el" href="classpp_1_1_completion_callback_with_output.html">CompletionCallbackWithOutput</a>&lt; <a class="el" href="classpp_1_1_var.html">Var</a> &gt; &amp;&#160;</td>
+<td class="paramname"><em>callback</em></td><td>)</td>
+<td></td>
+</tr>
+</table>
+</div>
+<div class="memdoc">
+<p>Receives an IP packet from the tunnel for the VPN session. </p>
+<p>This function only returns a single packet. That is, this function must be called at least N times to receive N packets, no matter the size of each packet. The callback should be registered before calling <code><a class="el" href="classpp_1_1_vpn_provider.html#a90d17a19973f48a31ea933325e0b61af" title="Binds to an existing configuration created from JavaScript by chrome.vpnProvider.createConfig.">Bind()</a></code>.</p>
+<dl class="params"><dt><b>Parameters:</b></dt><dd>
+<table class="params">
+<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="classpp_1_1_completion_callback_with_output.html" title="A CompletionCallbackWithOutput defines a completion callback that additionally stores a pointer to so...">CompletionCallbackWithOutput</a></code> to be called upon completion of ReceivePacket. It will be passed an ArrayBuffer type <code><a class="el" href="classpp_1_1_var.html" title="A generic type used for passing data types between the module and the page.">Var</a></code> containing an IP packet to be sent to the platform.</td></tr>
+</table>
+</dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code>pp_errors.h</code>. Returns <code>PP_ERROR_INPROGRESS</code> if a previous call to <code><a class="el" href="classpp_1_1_vpn_provider.html#a745f12bb3d3eb9bf7f29892a717caefb" title="Receives an IP packet from the tunnel for the VPN session.">ReceivePacket()</a></code> has not completed. </dd></dl>
+</div>
+</div>
+<a class="anchor" id="ae692340a675bcd27c756e98779efe615"></a><!-- doxytag: member="pp::VpnProvider::SendPacket" ref="ae692340a675bcd27c756e98779efe615" args="(const Var &amp;packet, const CompletionCallback &amp;callback)" -->
+<div class="memitem">
+<div class="memproto">
+<table class="memname">
+<tr>
+<td class="memname">int32_t <a class="el" href="classpp_1_1_vpn_provider.html#ae692340a675bcd27c756e98779efe615">pp::VpnProvider::SendPacket</a> </td>
+<td>(</td>
+<td class="paramtype">const <a class="el" href="classpp_1_1_var.html">Var</a> &amp;&#160;</td>
+<td class="paramname"><em>packet</em>, </td>
+</tr>
+<tr>
+<td class="paramkey"></td>
+<td></td>
+<td class="paramtype">const <a class="el" href="classpp_1_1_completion_callback.html">CompletionCallback</a> &amp;&#160;</td>
+<td class="paramname"><em>callback</em>&#160;</td>
+</tr>
+<tr>
+<td></td>
+<td>)</td>
+<td></td><td></td>
+</tr>
+</table>
+</div>
+<div class="memdoc">
+<p>Sends an IP packet through the tunnel created for the VPN session. </p>
+<p>This will succeed only when the VPN session is owned by the module and connection is bound.</p>
+<dl class="params"><dt><b>Parameters:</b></dt><dd>
+<table class="params">
+<tr><td class="paramdir">[in]</td><td class="paramname">packet</td><td>IP packet to be sent to the platform. The <code><a class="el" href="classpp_1_1_var.html" title="A generic type used for passing data types between the module and the page.">Var</a></code> must be of ArrayBuffer type.</td></tr>
+<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="classpp_1_1_completion_callback.html" title="This API enables you to implement and receive callbacks when Pepper operations complete asynchronousl...">CompletionCallback</a></code> to be called on completion.</td></tr>
+</table>
+</dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code>pp_errors.h</code>. Returns <code>PP_ERROR_FAILED</code> if the connection is not bound. Returns <code>PP_ERROR_INPROGRESS</code> if a previous call to <code><a class="el" href="classpp_1_1_vpn_provider.html#ae692340a675bcd27c756e98779efe615" title="Sends an IP packet through the tunnel created for the VPN session.">SendPacket()</a></code> has not completed. Returns <code>PP_ERROR_BADARGUMENT</code> if the <code><a class="el" href="classpp_1_1_var.html" title="A generic type used for passing data types between the module and the page.">Var</a></code> type of <code>packet</code> is not of ArrayBuffer type. </dd></dl>
+</div>
+</div>
+<hr />The documentation for this class was generated from the following file:<ul>
+<li><a class="el" href="vpn__provider_8h.html">vpn_provider.h</a></li>
+</ul>
+</div><!-- contents -->
+</div>
+{{/partials.standard_nacl_api}}
diff --git a/native_client_sdk/doc_generated/pepper_stable/cpp/classpp_1_1_vpn_provider__inherit__graph.png b/native_client_sdk/doc_generated/pepper_stable/cpp/classpp_1_1_vpn_provider__inherit__graph.png
new file mode 100644
index 0000000..b2b83f8b
--- /dev/null
+++ b/native_client_sdk/doc_generated/pepper_stable/cpp/classpp_1_1_vpn_provider__inherit__graph.png
Binary files differ
diff --git a/native_client_sdk/doc_generated/pepper_stable/cpp/inherit_graph_23.png b/native_client_sdk/doc_generated/pepper_stable/cpp/inherit_graph_23.png
index 056cffd..12c7b57 100644
--- a/native_client_sdk/doc_generated/pepper_stable/cpp/inherit_graph_23.png
+++ b/native_client_sdk/doc_generated/pepper_stable/cpp/inherit_graph_23.png
Binary files differ
diff --git a/native_client_sdk/doc_generated/pepper_stable/cpp/inherits.html b/native_client_sdk/doc_generated/pepper_stable/cpp/inherits.html
index f1a43a2c..d0e14c96 100644
--- a/native_client_sdk/doc_generated/pepper_stable/cpp/inherits.html
+++ b/native_client_sdk/doc_generated/pepper_stable/cpp/inherits.html
@@ -106,7 +106,7 @@
 </td></tr>
 <tr><td><img src="inherit_graph_23.png" border="0" alt="" usemap="#pp_1_1_resource" />
 <map name="pp_1_1_resource" id="pp_1_1_resource">
-<area shape="rect" id="node1" href="classpp_1_1_resource.html" title="A reference counted module resource." alt="" coords="5,740,109,767"></area><area shape="rect" id="node2" href="classpp_1_1_audio.html" title="An audio resource." alt="" coords="216,5,299,32"></area><area shape="rect" id="node3" href="classpp_1_1_audio_buffer.html" title="pp::AudioBuffer" alt="" coords="197,56,317,83"></area><area shape="rect" id="node4" href="classpp_1_1_audio_config.html" title="A 16 bit stereo AudioConfig resource." alt="" coords="196,107,319,133"></area><area shape="rect" id="node5" href="classpp_1_1_audio_encoder.html" title="Audio encoder interface." alt="" coords="190,157,325,184"></area><area shape="rect" id="node6" href="classpp_1_1_compositor.html" title="The Compositor interface is used for setting CompositorLayer layers to the Chromium compositor for co..." alt="" coords="197,208,317,235"></area><area shape="rect" id="node7" href="classpp_1_1_compositor_layer.html" title="pp::CompositorLayer" alt="" coords="180,259,335,285"></area><area shape="rect" id="node8" href="classpp_1_1_file_i_o.html" title="The FileIO class represents a regular file." alt="" coords="218,309,297,336"></area><area shape="rect" id="node9" href="classpp_1_1_file_ref.html" title='The FileRef class represents a "weak pointer" to a file in a file system.' alt="" coords="215,360,300,387"></area><area shape="rect" id="node10" href="classpp_1_1_file_system.html" title="The FileSystem class identifies the file system type associated with a file." alt="" coords="200,411,315,437"></area><area shape="rect" id="node11" href="classpp_1_1_graphics2_d.html" title="pp::Graphics2D" alt="" coords="197,461,317,488"></area><area shape="rect" id="node12" href="classpp_1_1_graphics3_d.html" title="This class represents a 3D rendering context in the browser." alt="" coords="197,512,317,539"></area><area shape="rect" id="node13" href="classpp_1_1_host_resolver.html" title="The HostResolver class supports host name resolution." alt="" coords="193,563,322,589"></area><area shape="rect" id="node14" href="classpp_1_1_image_data.html" title="pp::ImageData" alt="" coords="199,613,316,640"></area><area shape="rect" id="node15" href="classpp_1_1_input_event.html" title="This class represents an input event resource." alt="" coords="200,664,315,691"></area><area shape="rect" id="node21" href="classpp_1_1_media_stream_audio_track.html" title="The MediaStreamAudioTrack class contains methods for receiving audio buffers from a MediaStream audio..." alt="" coords="157,715,357,741"></area><area shape="rect" id="node22" href="classpp_1_1_media_stream_video_track.html" title="The MediaStreamVideoTrack class contains methods for receiving video frames from a MediaStream video ..." alt="" coords="157,765,357,792"></area><area shape="rect" id="node23" href="classpp_1_1_message_loop.html" title="A message loop allows PPAPI calls to be issued on a thread." alt="" coords="190,816,325,843"></area><area shape="rect" id="node24" href="classpp_1_1_net_address.html" title="The NetAddress class represents a network address." alt="" coords="197,867,318,893"></area><area shape="rect" id="node25" href="classpp_1_1_network_list.html" title="pp::NetworkList" alt="" coords="197,917,317,944"></area><area shape="rect" id="node26" href="classpp_1_1_network_monitor.html" title="pp::NetworkMonitor" alt="" coords="184,968,331,995"></area><area shape="rect" id="node27" href="classpp_1_1_t_c_p_socket.html" title="The TCPSocket class provides TCP socket operations." alt="" coords="201,1019,314,1045"></area><area shape="rect" id="node28" href="classpp_1_1_u_d_p_socket.html" title="The UDPSocket class provides UDP socket operations." alt="" coords="198,1069,317,1096"></area><area shape="rect" id="node29" href="classpp_1_1_u_r_l_loader.html" title="URLLoader provides an API for loading URLs." alt="" coords="200,1120,315,1147"></area><area shape="rect" id="node30" href="classpp_1_1_u_r_l_request_info.html" title="URLRequestInfo provides an API for creating and manipulating URL requests." alt="" coords="185,1171,330,1197"></area><area shape="rect" id="node31" href="classpp_1_1_u_r_l_response_info.html" title="URLResponseInfo provides an API for examining URL responses." alt="" coords="180,1221,335,1248"></area><area shape="rect" id="node32" href="classpp_1_1_video_decoder.html" title="Video decoder interface." alt="" coords="189,1272,325,1299"></area><area shape="rect" id="node33" href="classpp_1_1_video_encoder.html" title="Video encoder interface." alt="" coords="190,1323,325,1349"></area><area shape="rect" id="node34" href="classpp_1_1_video_frame.html" title="pp::VideoFrame" alt="" coords="196,1373,319,1400"></area><area shape="rect" id="node35" href="classpp_1_1_view.html" title="This class represents the state of the view for an instance and contains functions for retrieving the..." alt="" coords="220,1424,295,1451"></area><area shape="rect" id="node36" href="classpp_1_1_web_socket.html" title="The WebSocket class providing bi-directional, full-duplex, communications over a single TCP socket..." alt="" coords="199,1475,315,1501"></area><area shape="rect" id="node16" href="classpp_1_1_i_m_e_input_event.html" title="pp::IMEInputEvent" alt="" coords="424,563,560,589"></area><area shape="rect" id="node17" href="classpp_1_1_keyboard_input_event.html" title="pp::KeyboardInputEvent" alt="" coords="405,613,579,640"></area><area shape="rect" id="node18" href="classpp_1_1_mouse_input_event.html" title="This class handles mouse events." alt="" coords="414,664,570,691"></area><area shape="rect" id="node19" href="classpp_1_1_touch_input_event.html" title="pp::TouchInputEvent" alt="" coords="417,715,567,741"></area><area shape="rect" id="node20" href="classpp_1_1_wheel_input_event.html" title="pp::WheelInputEvent" alt="" coords="416,765,568,792"></area></map>
+<area shape="rect" id="node1" href="classpp_1_1_resource.html" title="A reference counted module resource." alt="" coords="5,765,109,792"></area><area shape="rect" id="node2" href="classpp_1_1_audio.html" title="An audio resource." alt="" coords="216,5,299,32"></area><area shape="rect" id="node3" href="classpp_1_1_audio_buffer.html" title="pp::AudioBuffer" alt="" coords="197,56,317,83"></area><area shape="rect" id="node4" href="classpp_1_1_audio_config.html" title="A 16 bit stereo AudioConfig resource." alt="" coords="196,107,319,133"></area><area shape="rect" id="node5" href="classpp_1_1_audio_encoder.html" title="Audio encoder interface." alt="" coords="190,157,325,184"></area><area shape="rect" id="node6" href="classpp_1_1_compositor.html" title="The Compositor interface is used for setting CompositorLayer layers to the Chromium compositor for co..." alt="" coords="197,208,317,235"></area><area shape="rect" id="node7" href="classpp_1_1_compositor_layer.html" title="pp::CompositorLayer" alt="" coords="180,259,335,285"></area><area shape="rect" id="node8" href="classpp_1_1_file_i_o.html" title="The FileIO class represents a regular file." alt="" coords="218,309,297,336"></area><area shape="rect" id="node9" href="classpp_1_1_file_ref.html" title='The FileRef class represents a "weak pointer" to a file in a file system.' alt="" coords="215,360,300,387"></area><area shape="rect" id="node10" href="classpp_1_1_file_system.html" title="The FileSystem class identifies the file system type associated with a file." alt="" coords="200,411,315,437"></area><area shape="rect" id="node11" href="classpp_1_1_graphics2_d.html" title="pp::Graphics2D" alt="" coords="197,461,317,488"></area><area shape="rect" id="node12" href="classpp_1_1_graphics3_d.html" title="This class represents a 3D rendering context in the browser." alt="" coords="197,512,317,539"></area><area shape="rect" id="node13" href="classpp_1_1_host_resolver.html" title="The HostResolver class supports host name resolution." alt="" coords="193,563,322,589"></area><area shape="rect" id="node14" href="classpp_1_1_image_data.html" title="pp::ImageData" alt="" coords="199,613,316,640"></area><area shape="rect" id="node15" href="classpp_1_1_input_event.html" title="This class represents an input event resource." alt="" coords="200,664,315,691"></area><area shape="rect" id="node21" href="classpp_1_1_media_stream_audio_track.html" title="The MediaStreamAudioTrack class contains methods for receiving audio buffers from a MediaStream audio..." alt="" coords="157,715,357,741"></area><area shape="rect" id="node22" href="classpp_1_1_media_stream_video_track.html" title="The MediaStreamVideoTrack class contains methods for receiving video frames from a MediaStream video ..." alt="" coords="157,765,357,792"></area><area shape="rect" id="node23" href="classpp_1_1_message_loop.html" title="A message loop allows PPAPI calls to be issued on a thread." alt="" coords="190,816,325,843"></area><area shape="rect" id="node24" href="classpp_1_1_net_address.html" title="The NetAddress class represents a network address." alt="" coords="197,867,318,893"></area><area shape="rect" id="node25" href="classpp_1_1_network_list.html" title="pp::NetworkList" alt="" coords="197,917,317,944"></area><area shape="rect" id="node26" href="classpp_1_1_network_monitor.html" title="pp::NetworkMonitor" alt="" coords="184,968,331,995"></area><area shape="rect" id="node27" href="classpp_1_1_t_c_p_socket.html" title="The TCPSocket class provides TCP socket operations." alt="" coords="201,1019,314,1045"></area><area shape="rect" id="node28" href="classpp_1_1_u_d_p_socket.html" title="The UDPSocket class provides UDP socket operations." alt="" coords="198,1069,317,1096"></area><area shape="rect" id="node29" href="classpp_1_1_u_r_l_loader.html" title="URLLoader provides an API for loading URLs." alt="" coords="200,1120,315,1147"></area><area shape="rect" id="node30" href="classpp_1_1_u_r_l_request_info.html" title="URLRequestInfo provides an API for creating and manipulating URL requests." alt="" coords="185,1171,330,1197"></area><area shape="rect" id="node31" href="classpp_1_1_u_r_l_response_info.html" title="URLResponseInfo provides an API for examining URL responses." alt="" coords="180,1221,335,1248"></area><area shape="rect" id="node32" href="classpp_1_1_video_decoder.html" title="Video decoder interface." alt="" coords="189,1272,325,1299"></area><area shape="rect" id="node33" href="classpp_1_1_video_encoder.html" title="Video encoder interface." alt="" coords="190,1323,325,1349"></area><area shape="rect" id="node34" href="classpp_1_1_video_frame.html" title="pp::VideoFrame" alt="" coords="196,1373,319,1400"></area><area shape="rect" id="node35" href="classpp_1_1_view.html" title="This class represents the state of the view for an instance and contains functions for retrieving the..." alt="" coords="220,1424,295,1451"></area><area shape="rect" id="node36" href="classpp_1_1_vpn_provider.html" title="The VpnProvider class enhances the chrome.vpnProvider JavaScript API by providing a high performance ..." alt="" coords="196,1475,319,1501"></area><area shape="rect" id="node37" href="classpp_1_1_web_socket.html" title="The WebSocket class providing bi-directional, full-duplex, communications over a single TCP socket..." alt="" coords="199,1525,315,1552"></area><area shape="rect" id="node16" href="classpp_1_1_i_m_e_input_event.html" title="pp::IMEInputEvent" alt="" coords="424,563,560,589"></area><area shape="rect" id="node17" href="classpp_1_1_keyboard_input_event.html" title="pp::KeyboardInputEvent" alt="" coords="405,613,579,640"></area><area shape="rect" id="node18" href="classpp_1_1_mouse_input_event.html" title="This class handles mouse events." alt="" coords="414,664,570,691"></area><area shape="rect" id="node19" href="classpp_1_1_touch_input_event.html" title="pp::TouchInputEvent" alt="" coords="417,715,567,741"></area><area shape="rect" id="node20" href="classpp_1_1_wheel_input_event.html" title="pp::WheelInputEvent" alt="" coords="416,765,568,792"></area></map>
 </td></tr>
 <tr><td><img src="inherit_graph_24.png" border="0" alt="" usemap="#pp_1_1_size" />
 <map name="pp_1_1_size" id="pp_1_1_size">
diff --git a/native_client_sdk/doc_generated/pepper_stable/cpp/jquery.js b/native_client_sdk/doc_generated/pepper_stable/cpp/jquery.js
new file mode 100644
index 0000000..90b3a2b
--- /dev/null
+++ b/native_client_sdk/doc_generated/pepper_stable/cpp/jquery.js
@@ -0,0 +1,64 @@
+/*
+ * jQuery JavaScript Library v1.3.2
+ * http://jquery.com/
+ *
+ * Copyright (c) 2009 John Resig
+ * Dual licensed under the MIT and GPL licenses.
+ * http://docs.jquery.com/License
+ *
+ * Date: 2009-02-19 17:34:21 -0500 (Thu, 19 Feb 2009)
+ * Revision: 6246
+ */
+(function(){var l=this,g,y=l.jQuery,p=l.$,o=l.jQuery=l.$=function(E,F){return new o.fn.init(E,F)},D=/^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/,f=/^.[^:#\[\.,]*$/;o.fn=o.prototype={init:function(E,H){E=E||document;if(E.nodeType){this[0]=E;this.length=1;this.context=E;return this}if(typeof E==="string"){var G=D.exec(E);if(G&&(G[1]||!H)){if(G[1]){E=o.clean([G[1]],H)}else{var I=document.getElementById(G[3]);if(I&&I.id!=G[3]){return o().find(E)}var F=o(I||[]);F.context=document;F.selector=E;return F}}else{return o(H).find(E)}}else{if(o.isFunction(E)){return o(document).ready(E)}}if(E.selector&&E.context){this.selector=E.selector;this.context=E.context}return this.setArray(o.isArray(E)?E:o.makeArray(E))},selector:"",jquery:"1.3.2",size:function(){return this.length},get:function(E){return E===g?Array.prototype.slice.call(this):this[E]},pushStack:function(F,H,E){var G=o(F);G.prevObject=this;G.context=this.context;if(H==="find"){G.selector=this.selector+(this.selector?" ":"")+E}else{if(H){G.selector=this.selector+"."+H+"("+E+")"}}return G},setArray:function(E){this.length=0;Array.prototype.push.apply(this,E);return this},each:function(F,E){return o.each(this,F,E)},index:function(E){return o.inArray(E&&E.jquery?E[0]:E,this)},attr:function(F,H,G){var E=F;if(typeof F==="string"){if(H===g){return this[0]&&o[G||"attr"](this[0],F)}else{E={};E[F]=H}}return this.each(function(I){for(F in E){o.attr(G?this.style:this,F,o.prop(this,E[F],G,I,F))}})},css:function(E,F){if((E=="width"||E=="height")&&parseFloat(F)<0){F=g}return this.attr(E,F,"curCSS")},text:function(F){if(typeof F!=="object"&&F!=null){return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(F))}var E="";o.each(F||this,function(){o.each(this.childNodes,function(){if(this.nodeType!=8){E+=this.nodeType!=1?this.nodeValue:o.fn.text([this])}})});return E},wrapAll:function(E){if(this[0]){var F=o(E,this[0].ownerDocument).clone();if(this[0].parentNode){F.insertBefore(this[0])}F.map(function(){var G=this;while(G.firstChild){G=G.firstChild}return G}).append(this)}return this},wrapInner:function(E){return this.each(function(){o(this).contents().wrapAll(E)})},wrap:function(E){return this.each(function(){o(this).wrapAll(E)})},append:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.appendChild(E)}})},prepend:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.insertBefore(E,this.firstChild)}})},before:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this)})},after:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this.nextSibling)})},end:function(){return this.prevObject||o([])},push:[].push,sort:[].sort,splice:[].splice,find:function(E){if(this.length===1){var F=this.pushStack([],"find",E);F.length=0;o.find(E,this[0],F);return F}else{return this.pushStack(o.unique(o.map(this,function(G){return o.find(E,G)})),"find",E)}},clone:function(G){var E=this.map(function(){if(!o.support.noCloneEvent&&!o.isXMLDoc(this)){var I=this.outerHTML;if(!I){var J=this.ownerDocument.createElement("div");J.appendChild(this.cloneNode(true));I=J.innerHTML}return o.clean([I.replace(/ jQuery\d+="(?:\d+|null)"/g,"").replace(/^\s*/,"")])[0]}else{return this.cloneNode(true)}});if(G===true){var H=this.find("*").andSelf(),F=0;E.find("*").andSelf().each(function(){if(this.nodeName!==H[F].nodeName){return}var I=o.data(H[F],"events");for(var K in I){for(var J in I[K]){o.event.add(this,K,I[K][J],I[K][J].data)}}F++})}return E},filter:function(E){return this.pushStack(o.isFunction(E)&&o.grep(this,function(G,F){return E.call(G,F)})||o.multiFilter(E,o.grep(this,function(F){return F.nodeType===1})),"filter",E)},closest:function(E){var G=o.expr.match.POS.test(E)?o(E):null,F=0;return this.map(function(){var H=this;while(H&&H.ownerDocument){if(G?G.index(H)>-1:o(H).is(E)){o.data(H,"closest",F);return H}H=H.parentNode;F++}})},not:function(E){if(typeof E==="string"){if(f.test(E)){return this.pushStack(o.multiFilter(E,this,true),"not",E)}else{E=o.multiFilter(E,this)}}var F=E.length&&E[E.length-1]!==g&&!E.nodeType;return this.filter(function(){return F?o.inArray(this,E)<0:this!=E})},add:function(E){return this.pushStack(o.unique(o.merge(this.get(),typeof E==="string"?o(E):o.makeArray(E))))},is:function(E){return !!E&&o.multiFilter(E,this).length>0},hasClass:function(E){return !!E&&this.is("."+E)},val:function(K){if(K===g){var E=this[0];if(E){if(o.nodeName(E,"option")){return(E.attributes.value||{}).specified?E.value:E.text}if(o.nodeName(E,"select")){var I=E.selectedIndex,L=[],M=E.options,H=E.type=="select-one";if(I<0){return null}for(var F=H?I:0,J=H?I+1:M.length;F<J;F++){var G=M[F];if(G.selected){K=o(G).val();if(H){return K}L.push(K)}}return L}return(E.value||"").replace(/\r/g,"")}return g}if(typeof K==="number"){K+=""}return this.each(function(){if(this.nodeType!=1){return}if(o.isArray(K)&&/radio|checkbox/.test(this.type)){this.checked=(o.inArray(this.value,K)>=0||o.inArray(this.name,K)>=0)}else{if(o.nodeName(this,"select")){var N=o.makeArray(K);o("option",this).each(function(){this.selected=(o.inArray(this.value,N)>=0||o.inArray(this.text,N)>=0)});if(!N.length){this.selectedIndex=-1}}else{this.value=K}}})},html:function(E){return E===g?(this[0]?this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g,""):null):this.empty().append(E)},replaceWith:function(E){return this.after(E).remove()},eq:function(E){return this.slice(E,+E+1)},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments),"slice",Array.prototype.slice.call(arguments).join(","))},map:function(E){return this.pushStack(o.map(this,function(G,F){return E.call(G,F,G)}))},andSelf:function(){return this.add(this.prevObject)},domManip:function(J,M,L){if(this[0]){var I=(this[0].ownerDocument||this[0]).createDocumentFragment(),F=o.clean(J,(this[0].ownerDocument||this[0]),I),H=I.firstChild;if(H){for(var G=0,E=this.length;G<E;G++){L.call(K(this[G],H),this.length>1||G>0?I.cloneNode(true):I)}}if(F){o.each(F,z)}}return this;function K(N,O){return M&&o.nodeName(N,"table")&&o.nodeName(O,"tr")?(N.getElementsByTagName("tbody")[0]||N.appendChild(N.ownerDocument.createElement("tbody"))):N}}};o.fn.init.prototype=o.fn;function z(E,F){if(F.src){o.ajax({url:F.src,async:false,dataType:"script"})}else{o.globalEval(F.text||F.textContent||F.innerHTML||"")}if(F.parentNode){F.parentNode.removeChild(F)}}function e(){return +new Date}o.extend=o.fn.extend=function(){var J=arguments[0]||{},H=1,I=arguments.length,E=false,G;if(typeof J==="boolean"){E=J;J=arguments[1]||{};H=2}if(typeof J!=="object"&&!o.isFunction(J)){J={}}if(I==H){J=this;--H}for(;H<I;H++){if((G=arguments[H])!=null){for(var F in G){var K=J[F],L=G[F];if(J===L){continue}if(E&&L&&typeof L==="object"&&!L.nodeType){J[F]=o.extend(E,K||(L.length!=null?[]:{}),L)}else{if(L!==g){J[F]=L}}}}}return J};var b=/z-?index|font-?weight|opacity|zoom|line-?height/i,q=document.defaultView||{},s=Object.prototype.toString;o.extend({noConflict:function(E){l.$=p;if(E){l.jQuery=y}return o},isFunction:function(E){return s.call(E)==="[object Function]"},isArray:function(E){return s.call(E)==="[object Array]"},isXMLDoc:function(E){return E.nodeType===9&&E.documentElement.nodeName!=="HTML"||!!E.ownerDocument&&o.isXMLDoc(E.ownerDocument)},globalEval:function(G){if(G&&/\S/.test(G)){var F=document.getElementsByTagName("head")[0]||document.documentElement,E=document.createElement("script");E.type="text/javascript";if(o.support.scriptEval){E.appendChild(document.createTextNode(G))}else{E.text=G}F.insertBefore(E,F.firstChild);F.removeChild(E)}},nodeName:function(F,E){return F.nodeName&&F.nodeName.toUpperCase()==E.toUpperCase()},each:function(G,K,F){var E,H=0,I=G.length;if(F){if(I===g){for(E in G){if(K.apply(G[E],F)===false){break}}}else{for(;H<I;){if(K.apply(G[H++],F)===false){break}}}}else{if(I===g){for(E in G){if(K.call(G[E],E,G[E])===false){break}}}else{for(var J=G[0];H<I&&K.call(J,H,J)!==false;J=G[++H]){}}}return G},prop:function(H,I,G,F,E){if(o.isFunction(I)){I=I.call(H,F)}return typeof I==="number"&&G=="curCSS"&&!b.test(E)?I+"px":I},className:{add:function(E,F){o.each((F||"").split(/\s+/),function(G,H){if(E.nodeType==1&&!o.className.has(E.className,H)){E.className+=(E.className?" ":"")+H}})},remove:function(E,F){if(E.nodeType==1){E.className=F!==g?o.grep(E.className.split(/\s+/),function(G){return !o.className.has(F,G)}).join(" "):""}},has:function(F,E){return F&&o.inArray(E,(F.className||F).toString().split(/\s+/))>-1}},swap:function(H,G,I){var E={};for(var F in G){E[F]=H.style[F];H.style[F]=G[F]}I.call(H);for(var F in G){H.style[F]=E[F]}},css:function(H,F,J,E){if(F=="width"||F=="height"){var L,G={position:"absolute",visibility:"hidden",display:"block"},K=F=="width"?["Left","Right"]:["Top","Bottom"];function I(){L=F=="width"?H.offsetWidth:H.offsetHeight;if(E==="border"){return}o.each(K,function(){if(!E){L-=parseFloat(o.curCSS(H,"padding"+this,true))||0}if(E==="margin"){L+=parseFloat(o.curCSS(H,"margin"+this,true))||0}else{L-=parseFloat(o.curCSS(H,"border"+this+"Width",true))||0}})}if(H.offsetWidth!==0){I()}else{o.swap(H,G,I)}return Math.max(0,Math.round(L))}return o.curCSS(H,F,J)},curCSS:function(I,F,G){var L,E=I.style;if(F=="opacity"&&!o.support.opacity){L=o.attr(E,"opacity");return L==""?"1":L}if(F.match(/float/i)){F=w}if(!G&&E&&E[F]){L=E[F]}else{if(q.getComputedStyle){if(F.match(/float/i)){F="float"}F=F.replace(/([A-Z])/g,"-$1").toLowerCase();var M=q.getComputedStyle(I,null);if(M){L=M.getPropertyValue(F)}if(F=="opacity"&&L==""){L="1"}}else{if(I.currentStyle){var J=F.replace(/\-(\w)/g,function(N,O){return O.toUpperCase()});L=I.currentStyle[F]||I.currentStyle[J];if(!/^\d+(px)?$/i.test(L)&&/^\d/.test(L)){var H=E.left,K=I.runtimeStyle.left;I.runtimeStyle.left=I.currentStyle.left;E.left=L||0;L=E.pixelLeft+"px";E.left=H;I.runtimeStyle.left=K}}}}return L},clean:function(F,K,I){K=K||document;if(typeof K.createElement==="undefined"){K=K.ownerDocument||K[0]&&K[0].ownerDocument||document}if(!I&&F.length===1&&typeof F[0]==="string"){var H=/^<(\w+)\s*\/?>$/.exec(F[0]);if(H){return[K.createElement(H[1])]}}var G=[],E=[],L=K.createElement("div");o.each(F,function(P,S){if(typeof S==="number"){S+=""}if(!S){return}if(typeof S==="string"){S=S.replace(/(<(\w+)[^>]*?)\/>/g,function(U,V,T){return T.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?U:V+"></"+T+">"});var O=S.replace(/^\s+/,"").substring(0,10).toLowerCase();var Q=!O.indexOf("<opt")&&[1,"<select multiple='multiple'>","</select>"]||!O.indexOf("<leg")&&[1,"<fieldset>","</fieldset>"]||O.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"<table>","</table>"]||!O.indexOf("<tr")&&[2,"<table><tbody>","</tbody></table>"]||(!O.indexOf("<td")||!O.indexOf("<th"))&&[3,"<table><tbody><tr>","</tr></tbody></table>"]||!O.indexOf("<col")&&[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"]||!o.support.htmlSerialize&&[1,"div<div>","</div>"]||[0,"",""];L.innerHTML=Q[1]+S+Q[2];while(Q[0]--){L=L.lastChild}if(!o.support.tbody){var R=/<tbody/i.test(S),N=!O.indexOf("<table")&&!R?L.firstChild&&L.firstChild.childNodes:Q[1]=="<table>"&&!R?L.childNodes:[];for(var M=N.length-1;M>=0;--M){if(o.nodeName(N[M],"tbody")&&!N[M].childNodes.length){N[M].parentNode.removeChild(N[M])}}}if(!o.support.leadingWhitespace&&/^\s/.test(S)){L.insertBefore(K.createTextNode(S.match(/^\s*/)[0]),L.firstChild)}S=o.makeArray(L.childNodes)}if(S.nodeType){G.push(S)}else{G=o.merge(G,S)}});if(I){for(var J=0;G[J];J++){if(o.nodeName(G[J],"script")&&(!G[J].type||G[J].type.toLowerCase()==="text/javascript")){E.push(G[J].parentNode?G[J].parentNode.removeChild(G[J]):G[J])}else{if(G[J].nodeType===1){G.splice.apply(G,[J+1,0].concat(o.makeArray(G[J].getElementsByTagName("script"))))}I.appendChild(G[J])}}return E}return G},attr:function(J,G,K){if(!J||J.nodeType==3||J.nodeType==8){return g}var H=!o.isXMLDoc(J),L=K!==g;G=H&&o.props[G]||G;if(J.tagName){var F=/href|src|style/.test(G);if(G=="selected"&&J.parentNode){J.parentNode.selectedIndex}if(G in J&&H&&!F){if(L){if(G=="type"&&o.nodeName(J,"input")&&J.parentNode){throw"type property can't be changed"}J[G]=K}if(o.nodeName(J,"form")&&J.getAttributeNode(G)){return J.getAttributeNode(G).nodeValue}if(G=="tabIndex"){var I=J.getAttributeNode("tabIndex");return I&&I.specified?I.value:J.nodeName.match(/(button|input|object|select|textarea)/i)?0:J.nodeName.match(/^(a|area)$/i)&&J.href?0:g}return J[G]}if(!o.support.style&&H&&G=="style"){return o.attr(J.style,"cssText",K)}if(L){J.setAttribute(G,""+K)}var E=!o.support.hrefNormalized&&H&&F?J.getAttribute(G,2):J.getAttribute(G);return E===null?g:E}if(!o.support.opacity&&G=="opacity"){if(L){J.zoom=1;J.filter=(J.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(K)+""=="NaN"?"":"alpha(opacity="+K*100+")")}return J.filter&&J.filter.indexOf("opacity=")>=0?(parseFloat(J.filter.match(/opacity=([^)]*)/)[1])/100)+"":""}G=G.replace(/-([a-z])/ig,function(M,N){return N.toUpperCase()});if(L){J[G]=K}return J[G]},trim:function(E){return(E||"").replace(/^\s+|\s+$/g,"")},makeArray:function(G){var E=[];if(G!=null){var F=G.length;if(F==null||typeof G==="string"||o.isFunction(G)||G.setInterval){E[0]=G}else{while(F){E[--F]=G[F]}}}return E},inArray:function(G,H){for(var E=0,F=H.length;E<F;E++){if(H[E]===G){return E}}return -1},merge:function(H,E){var F=0,G,I=H.length;if(!o.support.getAll){while((G=E[F++])!=null){if(G.nodeType!=8){H[I++]=G}}}else{while((G=E[F++])!=null){H[I++]=G}}return H},unique:function(K){var F=[],E={};try{for(var G=0,H=K.length;G<H;G++){var J=o.data(K[G]);if(!E[J]){E[J]=true;F.push(K[G])}}}catch(I){F=K}return F},grep:function(F,J,E){var G=[];for(var H=0,I=F.length;H<I;H++){if(!E!=!J(F[H],H)){G.push(F[H])}}return G},map:function(E,J){var F=[];for(var G=0,H=E.length;G<H;G++){var I=J(E[G],G);if(I!=null){F[F.length]=I}}return F.concat.apply([],F)}});var C=navigator.userAgent.toLowerCase();o.browser={version:(C.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[0,"0"])[1],safari:/webkit/.test(C),opera:/opera/.test(C),msie:/msie/.test(C)&&!/opera/.test(C),mozilla:/mozilla/.test(C)&&!/(compatible|webkit)/.test(C)};o.each({parent:function(E){return E.parentNode},parents:function(E){return o.dir(E,"parentNode")},next:function(E){return o.nth(E,2,"nextSibling")},prev:function(E){return o.nth(E,2,"previousSibling")},nextAll:function(E){return o.dir(E,"nextSibling")},prevAll:function(E){return o.dir(E,"previousSibling")},siblings:function(E){return o.sibling(E.parentNode.firstChild,E)},children:function(E){return o.sibling(E.firstChild)},contents:function(E){return o.nodeName(E,"iframe")?E.contentDocument||E.contentWindow.document:o.makeArray(E.childNodes)}},function(E,F){o.fn[E]=function(G){var H=o.map(this,F);if(G&&typeof G=="string"){H=o.multiFilter(G,H)}return this.pushStack(o.unique(H),E,G)}});o.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(E,F){o.fn[E]=function(G){var J=[],L=o(G);for(var K=0,H=L.length;K<H;K++){
+var I=(K>0?this.clone(true):this).get();o.fn[F].apply(o(L[K]),I);J=J.concat(I)}return this.pushStack(J,E,G)}});o.each({removeAttr:function(E){o.attr(this,E,"");if(this.nodeType==1){this.removeAttribute(E)}},addClass:function(E){o.className.add(this,E)},removeClass:function(E){o.className.remove(this,E)},toggleClass:function(F,E){if(typeof E!=="boolean"){E=!o.className.has(this,F)}o.className[E?"add":"remove"](this,F)},remove:function(E){if(!E||o.filter(E,[this]).length){o("*",this).add([this]).each(function(){o.event.remove(this);o.removeData(this)});if(this.parentNode){this.parentNode.removeChild(this)}}},empty:function(){o(this).children().remove();while(this.firstChild){this.removeChild(this.firstChild)}}},function(E,F){o.fn[E]=function(){return this.each(F,arguments)}});function j(E,F){return E[0]&&parseInt(o.curCSS(E[0],F,true),10)||0}var h="jQuery"+e(),v=0,A={};o.extend({cache:{},data:function(F,E,G){F=F==l?A:F;var H=F[h];if(!H){H=F[h]=++v}if(E&&!o.cache[H]){o.cache[H]={}}if(G!==g){o.cache[H][E]=G}return E?o.cache[H][E]:H},removeData:function(F,E){F=F==l?A:F;var H=F[h];if(E){if(o.cache[H]){delete o.cache[H][E];E="";for(E in o.cache[H]){break}if(!E){o.removeData(F)}}}else{try{delete F[h]}catch(G){if(F.removeAttribute){F.removeAttribute(h)}}delete o.cache[H]}},queue:function(F,E,H){if(F){E=(E||"fx")+"queue";var G=o.data(F,E);if(!G||o.isArray(H)){G=o.data(F,E,o.makeArray(H))}else{if(H){G.push(H)}}}return G},dequeue:function(H,G){var E=o.queue(H,G),F=E.shift();if(!G||G==="fx"){F=E[0]}if(F!==g){F.call(H)}}});o.fn.extend({data:function(E,G){var H=E.split(".");H[1]=H[1]?"."+H[1]:"";if(G===g){var F=this.triggerHandler("getData"+H[1]+"!",[H[0]]);if(F===g&&this.length){F=o.data(this[0],E)}return F===g&&H[1]?this.data(H[0]):F}else{return this.trigger("setData"+H[1]+"!",[H[0],G]).each(function(){o.data(this,E,G)})}},removeData:function(E){return this.each(function(){o.removeData(this,E)})},queue:function(E,F){if(typeof E!=="string"){F=E;E="fx"}if(F===g){return o.queue(this[0],E)}return this.each(function(){var G=o.queue(this,E,F);if(E=="fx"&&G.length==1){G[0].call(this)}})},dequeue:function(E){return this.each(function(){o.dequeue(this,E)})}});
+/*
+ * Sizzle CSS Selector Engine - v0.9.3
+ *  Copyright 2009, The Dojo Foundation
+ *  Released under the MIT, BSD, and GPL Licenses.
+ *  More information: http://sizzlejs.com/
+ */
+(function(){var R=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?/g,L=0,H=Object.prototype.toString;var F=function(Y,U,ab,ac){ab=ab||[];U=U||document;if(U.nodeType!==1&&U.nodeType!==9){return[]}if(!Y||typeof Y!=="string"){return ab}var Z=[],W,af,ai,T,ad,V,X=true;R.lastIndex=0;while((W=R.exec(Y))!==null){Z.push(W[1]);if(W[2]){V=RegExp.rightContext;break}}if(Z.length>1&&M.exec(Y)){if(Z.length===2&&I.relative[Z[0]]){af=J(Z[0]+Z[1],U)}else{af=I.relative[Z[0]]?[U]:F(Z.shift(),U);while(Z.length){Y=Z.shift();if(I.relative[Y]){Y+=Z.shift()}af=J(Y,af)}}}else{var ae=ac?{expr:Z.pop(),set:E(ac)}:F.find(Z.pop(),Z.length===1&&U.parentNode?U.parentNode:U,Q(U));af=F.filter(ae.expr,ae.set);if(Z.length>0){ai=E(af)}else{X=false}while(Z.length){var ah=Z.pop(),ag=ah;if(!I.relative[ah]){ah=""}else{ag=Z.pop()}if(ag==null){ag=U}I.relative[ah](ai,ag,Q(U))}}if(!ai){ai=af}if(!ai){throw"Syntax error, unrecognized expression: "+(ah||Y)}if(H.call(ai)==="[object Array]"){if(!X){ab.push.apply(ab,ai)}else{if(U.nodeType===1){for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&(ai[aa]===true||ai[aa].nodeType===1&&K(U,ai[aa]))){ab.push(af[aa])}}}else{for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&ai[aa].nodeType===1){ab.push(af[aa])}}}}}else{E(ai,ab)}if(V){F(V,U,ab,ac);if(G){hasDuplicate=false;ab.sort(G);if(hasDuplicate){for(var aa=1;aa<ab.length;aa++){if(ab[aa]===ab[aa-1]){ab.splice(aa--,1)}}}}}return ab};F.matches=function(T,U){return F(T,null,null,U)};F.find=function(aa,T,ab){var Z,X;if(!aa){return[]}for(var W=0,V=I.order.length;W<V;W++){var Y=I.order[W],X;if((X=I.match[Y].exec(aa))){var U=RegExp.leftContext;if(U.substr(U.length-1)!=="\\"){X[1]=(X[1]||"").replace(/\\/g,"");Z=I.find[Y](X,T,ab);if(Z!=null){aa=aa.replace(I.match[Y],"");break}}}}if(!Z){Z=T.getElementsByTagName("*")}return{set:Z,expr:aa}};F.filter=function(ad,ac,ag,W){var V=ad,ai=[],aa=ac,Y,T,Z=ac&&ac[0]&&Q(ac[0]);while(ad&&ac.length){for(var ab in I.filter){if((Y=I.match[ab].exec(ad))!=null){var U=I.filter[ab],ah,af;T=false;if(aa==ai){ai=[]}if(I.preFilter[ab]){Y=I.preFilter[ab](Y,aa,ag,ai,W,Z);if(!Y){T=ah=true}else{if(Y===true){continue}}}if(Y){for(var X=0;(af=aa[X])!=null;X++){if(af){ah=U(af,Y,X,aa);var ae=W^!!ah;if(ag&&ah!=null){if(ae){T=true}else{aa[X]=false}}else{if(ae){ai.push(af);T=true}}}}}if(ah!==g){if(!ag){aa=ai}ad=ad.replace(I.match[ab],"");if(!T){return[]}break}}}if(ad==V){if(T==null){throw"Syntax error, unrecognized expression: "+ad}else{break}}V=ad}return aa};var I=F.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF_-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF_-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*_-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF_-]|\\.)+)(?:\((['"]*)((?:\([^\)]+\)|[^\2\(\)]*)+)\2\))?/},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(T){return T.getAttribute("href")}},relative:{"+":function(aa,T,Z){var X=typeof T==="string",ab=X&&!/\W/.test(T),Y=X&&!ab;if(ab&&!Z){T=T.toUpperCase()}for(var W=0,V=aa.length,U;W<V;W++){if((U=aa[W])){while((U=U.previousSibling)&&U.nodeType!==1){}aa[W]=Y||U&&U.nodeName===T?U||false:U===T}}if(Y){F.filter(T,aa,true)}},">":function(Z,U,aa){var X=typeof U==="string";if(X&&!/\W/.test(U)){U=aa?U:U.toUpperCase();for(var V=0,T=Z.length;V<T;V++){var Y=Z[V];if(Y){var W=Y.parentNode;Z[V]=W.nodeName===U?W:false}}}else{for(var V=0,T=Z.length;V<T;V++){var Y=Z[V];if(Y){Z[V]=X?Y.parentNode:Y.parentNode===U}}if(X){F.filter(U,Z,true)}}},"":function(W,U,Y){var V=L++,T=S;if(!U.match(/\W/)){var X=U=Y?U:U.toUpperCase();T=P}T("parentNode",U,V,W,X,Y)},"~":function(W,U,Y){var V=L++,T=S;if(typeof U==="string"&&!U.match(/\W/)){var X=U=Y?U:U.toUpperCase();T=P}T("previousSibling",U,V,W,X,Y)}},find:{ID:function(U,V,W){if(typeof V.getElementById!=="undefined"&&!W){var T=V.getElementById(U[1]);return T?[T]:[]}},NAME:function(V,Y,Z){if(typeof Y.getElementsByName!=="undefined"){var U=[],X=Y.getElementsByName(V[1]);for(var W=0,T=X.length;W<T;W++){if(X[W].getAttribute("name")===V[1]){U.push(X[W])}}return U.length===0?null:U}},TAG:function(T,U){return U.getElementsByTagName(T[1])}},preFilter:{CLASS:function(W,U,V,T,Z,aa){W=" "+W[1].replace(/\\/g,"")+" ";if(aa){return W}for(var X=0,Y;(Y=U[X])!=null;X++){if(Y){if(Z^(Y.className&&(" "+Y.className+" ").indexOf(W)>=0)){if(!V){T.push(Y)}}else{if(V){U[X]=false}}}}return false},ID:function(T){return T[1].replace(/\\/g,"")},TAG:function(U,T){for(var V=0;T[V]===false;V++){}return T[V]&&Q(T[V])?U[1]:U[1].toUpperCase()},CHILD:function(T){if(T[1]=="nth"){var U=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(T[2]=="even"&&"2n"||T[2]=="odd"&&"2n+1"||!/\D/.test(T[2])&&"0n+"+T[2]||T[2]);T[2]=(U[1]+(U[2]||1))-0;T[3]=U[3]-0}T[0]=L++;return T},ATTR:function(X,U,V,T,Y,Z){var W=X[1].replace(/\\/g,"");if(!Z&&I.attrMap[W]){X[1]=I.attrMap[W]}if(X[2]==="~="){X[4]=" "+X[4]+" "}return X},PSEUDO:function(X,U,V,T,Y){if(X[1]==="not"){if(X[3].match(R).length>1||/^\w/.test(X[3])){X[3]=F(X[3],null,null,U)}else{var W=F.filter(X[3],U,V,true^Y);if(!V){T.push.apply(T,W)}return false}}else{if(I.match.POS.test(X[0])||I.match.CHILD.test(X[0])){return true}}return X},POS:function(T){T.unshift(true);return T}},filters:{enabled:function(T){return T.disabled===false&&T.type!=="hidden"},disabled:function(T){return T.disabled===true},checked:function(T){return T.checked===true},selected:function(T){T.parentNode.selectedIndex;return T.selected===true},parent:function(T){return !!T.firstChild},empty:function(T){return !T.firstChild},has:function(V,U,T){return !!F(T[3],V).length},header:function(T){return/h\d/i.test(T.nodeName)},text:function(T){return"text"===T.type},radio:function(T){return"radio"===T.type},checkbox:function(T){return"checkbox"===T.type},file:function(T){return"file"===T.type},password:function(T){return"password"===T.type},submit:function(T){return"submit"===T.type},image:function(T){return"image"===T.type},reset:function(T){return"reset"===T.type},button:function(T){return"button"===T.type||T.nodeName.toUpperCase()==="BUTTON"},input:function(T){return/input|select|textarea|button/i.test(T.nodeName)}},setFilters:{first:function(U,T){return T===0},last:function(V,U,T,W){return U===W.length-1},even:function(U,T){return T%2===0},odd:function(U,T){return T%2===1},lt:function(V,U,T){return U<T[3]-0},gt:function(V,U,T){return U>T[3]-0},nth:function(V,U,T){return T[3]-0==U},eq:function(V,U,T){return T[3]-0==U}},filter:{PSEUDO:function(Z,V,W,aa){var U=V[1],X=I.filters[U];if(X){return X(Z,W,V,aa)}else{if(U==="contains"){return(Z.textContent||Z.innerText||"").indexOf(V[3])>=0}else{if(U==="not"){var Y=V[3];for(var W=0,T=Y.length;W<T;W++){if(Y[W]===Z){return false}}return true}}}},CHILD:function(T,W){var Z=W[1],U=T;switch(Z){case"only":case"first":while(U=U.previousSibling){if(U.nodeType===1){return false}}if(Z=="first"){return true}U=T;case"last":while(U=U.nextSibling){if(U.nodeType===1){return false}}return true;case"nth":var V=W[2],ac=W[3];if(V==1&&ac==0){return true}var Y=W[0],ab=T.parentNode;if(ab&&(ab.sizcache!==Y||!T.nodeIndex)){var X=0;for(U=ab.firstChild;U;U=U.nextSibling){if(U.nodeType===1){U.nodeIndex=++X}}ab.sizcache=Y}var aa=T.nodeIndex-ac;if(V==0){return aa==0}else{return(aa%V==0&&aa/V>=0)}}},ID:function(U,T){return U.nodeType===1&&U.getAttribute("id")===T},TAG:function(U,T){return(T==="*"&&U.nodeType===1)||U.nodeName===T},CLASS:function(U,T){return(" "+(U.className||U.getAttribute("class"))+" ").indexOf(T)>-1},ATTR:function(Y,W){var V=W[1],T=I.attrHandle[V]?I.attrHandle[V](Y):Y[V]!=null?Y[V]:Y.getAttribute(V),Z=T+"",X=W[2],U=W[4];return T==null?X==="!=":X==="="?Z===U:X==="*="?Z.indexOf(U)>=0:X==="~="?(" "+Z+" ").indexOf(U)>=0:!U?Z&&T!==false:X==="!="?Z!=U:X==="^="?Z.indexOf(U)===0:X==="$="?Z.substr(Z.length-U.length)===U:X==="|="?Z===U||Z.substr(0,U.length+1)===U+"-":false},POS:function(X,U,V,Y){var T=U[2],W=I.setFilters[T];if(W){return W(X,V,U,Y)}}}};var M=I.match.POS;for(var O in I.match){I.match[O]=RegExp(I.match[O].source+/(?![^\[]*\])(?![^\(]*\))/.source)}var E=function(U,T){U=Array.prototype.slice.call(U);if(T){T.push.apply(T,U);return T}return U};try{Array.prototype.slice.call(document.documentElement.childNodes)}catch(N){E=function(X,W){var U=W||[];if(H.call(X)==="[object Array]"){Array.prototype.push.apply(U,X)}else{if(typeof X.length==="number"){for(var V=0,T=X.length;V<T;V++){U.push(X[V])}}else{for(var V=0;X[V];V++){U.push(X[V])}}}return U}}var G;if(document.documentElement.compareDocumentPosition){G=function(U,T){var V=U.compareDocumentPosition(T)&4?-1:U===T?0:1;if(V===0){hasDuplicate=true}return V}}else{if("sourceIndex" in document.documentElement){G=function(U,T){var V=U.sourceIndex-T.sourceIndex;if(V===0){hasDuplicate=true}return V}}else{if(document.createRange){G=function(W,U){var V=W.ownerDocument.createRange(),T=U.ownerDocument.createRange();V.selectNode(W);V.collapse(true);T.selectNode(U);T.collapse(true);var X=V.compareBoundaryPoints(Range.START_TO_END,T);if(X===0){hasDuplicate=true}return X}}}}(function(){var U=document.createElement("form"),V="script"+(new Date).getTime();U.innerHTML="<input name='"+V+"'/>";var T=document.documentElement;T.insertBefore(U,T.firstChild);if(!!document.getElementById(V)){I.find.ID=function(X,Y,Z){if(typeof Y.getElementById!=="undefined"&&!Z){var W=Y.getElementById(X[1]);return W?W.id===X[1]||typeof W.getAttributeNode!=="undefined"&&W.getAttributeNode("id").nodeValue===X[1]?[W]:g:[]}};I.filter.ID=function(Y,W){var X=typeof Y.getAttributeNode!=="undefined"&&Y.getAttributeNode("id");return Y.nodeType===1&&X&&X.nodeValue===W}}T.removeChild(U)})();(function(){var T=document.createElement("div");T.appendChild(document.createComment(""));if(T.getElementsByTagName("*").length>0){I.find.TAG=function(U,Y){var X=Y.getElementsByTagName(U[1]);if(U[1]==="*"){var W=[];for(var V=0;X[V];V++){if(X[V].nodeType===1){W.push(X[V])}}X=W}return X}}T.innerHTML="<a href='#'></a>";if(T.firstChild&&typeof T.firstChild.getAttribute!=="undefined"&&T.firstChild.getAttribute("href")!=="#"){I.attrHandle.href=function(U){return U.getAttribute("href",2)}}})();if(document.querySelectorAll){(function(){var T=F,U=document.createElement("div");U.innerHTML="<p class='TEST'></p>";if(U.querySelectorAll&&U.querySelectorAll(".TEST").length===0){return}F=function(Y,X,V,W){X=X||document;if(!W&&X.nodeType===9&&!Q(X)){try{return E(X.querySelectorAll(Y),V)}catch(Z){}}return T(Y,X,V,W)};F.find=T.find;F.filter=T.filter;F.selectors=T.selectors;F.matches=T.matches})()}if(document.getElementsByClassName&&document.documentElement.getElementsByClassName){(function(){var T=document.createElement("div");T.innerHTML="<div class='test e'></div><div class='test'></div>";if(T.getElementsByClassName("e").length===0){return}T.lastChild.className="e";if(T.getElementsByClassName("e").length===1){return}I.order.splice(1,0,"CLASS");I.find.CLASS=function(U,V,W){if(typeof V.getElementsByClassName!=="undefined"&&!W){return V.getElementsByClassName(U[1])}}})()}function P(U,Z,Y,ad,aa,ac){var ab=U=="previousSibling"&&!ac;for(var W=0,V=ad.length;W<V;W++){var T=ad[W];if(T){if(ab&&T.nodeType===1){T.sizcache=Y;T.sizset=W}T=T[U];var X=false;while(T){if(T.sizcache===Y){X=ad[T.sizset];break}if(T.nodeType===1&&!ac){T.sizcache=Y;T.sizset=W}if(T.nodeName===Z){X=T;break}T=T[U]}ad[W]=X}}}function S(U,Z,Y,ad,aa,ac){var ab=U=="previousSibling"&&!ac;for(var W=0,V=ad.length;W<V;W++){var T=ad[W];if(T){if(ab&&T.nodeType===1){T.sizcache=Y;T.sizset=W}T=T[U];var X=false;while(T){if(T.sizcache===Y){X=ad[T.sizset];break}if(T.nodeType===1){if(!ac){T.sizcache=Y;T.sizset=W}if(typeof Z!=="string"){if(T===Z){X=true;break}}else{if(F.filter(Z,[T]).length>0){X=T;break}}}T=T[U]}ad[W]=X}}}var K=document.compareDocumentPosition?function(U,T){return U.compareDocumentPosition(T)&16}:function(U,T){return U!==T&&(U.contains?U.contains(T):true)};var Q=function(T){return T.nodeType===9&&T.documentElement.nodeName!=="HTML"||!!T.ownerDocument&&Q(T.ownerDocument)};var J=function(T,aa){var W=[],X="",Y,V=aa.nodeType?[aa]:aa;while((Y=I.match.PSEUDO.exec(T))){X+=Y[0];T=T.replace(I.match.PSEUDO,"")}T=I.relative[T]?T+"*":T;for(var Z=0,U=V.length;Z<U;Z++){F(T,V[Z],W)}return F.filter(X,W)};o.find=F;o.filter=F.filter;o.expr=F.selectors;o.expr[":"]=o.expr.filters;F.selectors.filters.hidden=function(T){return T.offsetWidth===0||T.offsetHeight===0};F.selectors.filters.visible=function(T){return T.offsetWidth>0||T.offsetHeight>0};F.selectors.filters.animated=function(T){return o.grep(o.timers,function(U){return T===U.elem}).length};o.multiFilter=function(V,T,U){if(U){V=":not("+V+")"}return F.matches(V,T)};o.dir=function(V,U){var T=[],W=V[U];while(W&&W!=document){if(W.nodeType==1){T.push(W)}W=W[U]}return T};o.nth=function(X,T,V,W){T=T||1;var U=0;for(;X;X=X[V]){if(X.nodeType==1&&++U==T){break}}return X};o.sibling=function(V,U){var T=[];for(;V;V=V.nextSibling){if(V.nodeType==1&&V!=U){T.push(V)}}return T};return;l.Sizzle=F})();o.event={add:function(I,F,H,K){if(I.nodeType==3||I.nodeType==8){return}if(I.setInterval&&I!=l){I=l}if(!H.guid){H.guid=this.guid++}if(K!==g){var G=H;H=this.proxy(G);H.data=K}var E=o.data(I,"events")||o.data(I,"events",{}),J=o.data(I,"handle")||o.data(I,"handle",function(){return typeof o!=="undefined"&&!o.event.triggered?o.event.handle.apply(arguments.callee.elem,arguments):g});J.elem=I;o.each(F.split(/\s+/),function(M,N){var O=N.split(".");N=O.shift();H.type=O.slice().sort().join(".");var L=E[N];if(o.event.specialAll[N]){o.event.specialAll[N].setup.call(I,K,O)}if(!L){L=E[N]={};if(!o.event.special[N]||o.event.special[N].setup.call(I,K,O)===false){if(I.addEventListener){I.addEventListener(N,J,false)}else{if(I.attachEvent){I.attachEvent("on"+N,J)}}}}L[H.guid]=H;o.event.global[N]=true});I=null},guid:1,global:{},remove:function(K,H,J){if(K.nodeType==3||K.nodeType==8){return}var G=o.data(K,"events"),F,E;if(G){if(H===g||(typeof H==="string"&&H.charAt(0)==".")){for(var I in G){this.remove(K,I+(H||""))}}else{if(H.type){J=H.handler;H=H.type}o.each(H.split(/\s+/),function(M,O){var Q=O.split(".");O=Q.shift();var N=RegExp("(^|\\.)"+Q.slice().sort().join(".*\\.")+"(\\.|$)");if(G[O]){if(J){delete G[O][J.guid]}else{for(var P in G[O]){if(N.test(G[O][P].type)){delete G[O][P]}}}if(o.event.specialAll[O]){o.event.specialAll[O].teardown.call(K,Q)}for(F in G[O]){break}if(!F){if(!o.event.special[O]||o.event.special[O].teardown.call(K,Q)===false){if(K.removeEventListener){K.removeEventListener(O,o.data(K,"handle"),false)}else{if(K.detachEvent){K.detachEvent("on"+O,o.data(K,"handle"))}}}F=null;delete G[O]}}})}for(F in G){break}if(!F){var L=o.data(K,"handle");if(L){L.elem=null}o.removeData(K,"events");o.removeData(K,"handle")}}},trigger:function(I,K,H,E){var G=I.type||I;if(!E){I=typeof I==="object"?I[h]?I:o.extend(o.Event(G),I):o.Event(G);if(G.indexOf("!")>=0)
+{I.type=G=G.slice(0,-1);I.exclusive=true}if(!H){I.stopPropagation();if(this.global[G]){o.each(o.cache,function(){if(this.events&&this.events[G]){o.event.trigger(I,K,this.handle.elem)}})}}if(!H||H.nodeType==3||H.nodeType==8){return g}I.result=g;I.target=H;K=o.makeArray(K);K.unshift(I)}I.currentTarget=H;var J=o.data(H,"handle");if(J){J.apply(H,K)}if((!H[G]||(o.nodeName(H,"a")&&G=="click"))&&H["on"+G]&&H["on"+G].apply(H,K)===false){I.result=false}if(!E&&H[G]&&!I.isDefaultPrevented()&&!(o.nodeName(H,"a")&&G=="click")){this.triggered=true;try{H[G]()}catch(L){}}this.triggered=false;if(!I.isPropagationStopped()){var F=H.parentNode||H.ownerDocument;if(F){o.event.trigger(I,K,F,true)}}},handle:function(K){var J,E;K=arguments[0]=o.event.fix(K||l.event);K.currentTarget=this;var L=K.type.split(".");K.type=L.shift();J=!L.length&&!K.exclusive;var I=RegExp("(^|\\.)"+L.slice().sort().join(".*\\.")+"(\\.|$)");E=(o.data(this,"events")||{})[K.type];for(var G in E){var H=E[G];if(J||I.test(H.type)){K.handler=H;K.data=H.data;var F=H.apply(this,arguments);if(F!==g){K.result=F;if(F===false){K.preventDefault();K.stopPropagation()}}if(K.isImmediatePropagationStopped()){break}}}},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(H){if(H[h]){return H}var F=H;H=o.Event(F);for(var G=this.props.length,J;G;){J=this.props[--G];H[J]=F[J]}if(!H.target){H.target=H.srcElement||document}if(H.target.nodeType==3){H.target=H.target.parentNode}if(!H.relatedTarget&&H.fromElement){H.relatedTarget=H.fromElement==H.target?H.toElement:H.fromElement}if(H.pageX==null&&H.clientX!=null){var I=document.documentElement,E=document.body;H.pageX=H.clientX+(I&&I.scrollLeft||E&&E.scrollLeft||0)-(I.clientLeft||0);H.pageY=H.clientY+(I&&I.scrollTop||E&&E.scrollTop||0)-(I.clientTop||0)}if(!H.which&&((H.charCode||H.charCode===0)?H.charCode:H.keyCode)){H.which=H.charCode||H.keyCode}if(!H.metaKey&&H.ctrlKey){H.metaKey=H.ctrlKey}if(!H.which&&H.button){H.which=(H.button&1?1:(H.button&2?3:(H.button&4?2:0)))}return H},proxy:function(F,E){E=E||function(){return F.apply(this,arguments)};E.guid=F.guid=F.guid||E.guid||this.guid++;return E},special:{ready:{setup:B,teardown:function(){}}},specialAll:{live:{setup:function(E,F){o.event.add(this,F[0],c)},teardown:function(G){if(G.length){var E=0,F=RegExp("(^|\\.)"+G[0]+"(\\.|$)");o.each((o.data(this,"events").live||{}),function(){if(F.test(this.type)){E++}});if(E<1){o.event.remove(this,G[0],c)}}}}}};o.Event=function(E){if(!this.preventDefault){return new o.Event(E)}if(E&&E.type){this.originalEvent=E;this.type=E.type}else{this.type=E}this.timeStamp=e();this[h]=true};function k(){return false}function u(){return true}o.Event.prototype={preventDefault:function(){this.isDefaultPrevented=u;var E=this.originalEvent;if(!E){return}if(E.preventDefault){E.preventDefault()}E.returnValue=false},stopPropagation:function(){this.isPropagationStopped=u;var E=this.originalEvent;if(!E){return}if(E.stopPropagation){E.stopPropagation()}E.cancelBubble=true},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=u;this.stopPropagation()},isDefaultPrevented:k,isPropagationStopped:k,isImmediatePropagationStopped:k};var a=function(F){var E=F.relatedTarget;while(E&&E!=this){try{E=E.parentNode}catch(G){E=this}}if(E!=this){F.type=F.data;o.event.handle.apply(this,arguments)}};o.each({mouseover:"mouseenter",mouseout:"mouseleave"},function(F,E){o.event.special[E]={setup:function(){o.event.add(this,F,a,E)},teardown:function(){o.event.remove(this,F,a)}}});o.fn.extend({bind:function(F,G,E){return F=="unload"?this.one(F,G,E):this.each(function(){o.event.add(this,F,E||G,E&&G)})},one:function(G,H,F){var E=o.event.proxy(F||H,function(I){o(this).unbind(I,E);return(F||H).apply(this,arguments)});return this.each(function(){o.event.add(this,G,E,F&&H)})},unbind:function(F,E){return this.each(function(){o.event.remove(this,F,E)})},trigger:function(E,F){return this.each(function(){o.event.trigger(E,F,this)})},triggerHandler:function(E,G){if(this[0]){var F=o.Event(E);F.preventDefault();F.stopPropagation();o.event.trigger(F,G,this[0]);return F.result}},toggle:function(G){var E=arguments,F=1;while(F<E.length){o.event.proxy(G,E[F++])}return this.click(o.event.proxy(G,function(H){this.lastToggle=(this.lastToggle||0)%F;H.preventDefault();return E[this.lastToggle++].apply(this,arguments)||false}))},hover:function(E,F){return this.mouseenter(E).mouseleave(F)},ready:function(E){B();if(o.isReady){E.call(document,o)}else{o.readyList.push(E)}return this},live:function(G,F){var E=o.event.proxy(F);E.guid+=this.selector+G;o(document).bind(i(G,this.selector),this.selector,E);return this},die:function(F,E){o(document).unbind(i(F,this.selector),E?{guid:E.guid+this.selector+F}:null);return this}});function c(H){var E=RegExp("(^|\\.)"+H.type+"(\\.|$)"),G=true,F=[];o.each(o.data(this,"events").live||[],function(I,J){if(E.test(J.type)){var K=o(H.target).closest(J.data)[0];if(K){F.push({elem:K,fn:J})}}});F.sort(function(J,I){return o.data(J.elem,"closest")-o.data(I.elem,"closest")});o.each(F,function(){if(this.fn.call(this.elem,H,this.fn.data)===false){return(G=false)}});return G}function i(F,E){return["live",F,E.replace(/\./g,"`").replace(/ /g,"|")].join(".")}o.extend({isReady:false,readyList:[],ready:function(){if(!o.isReady){o.isReady=true;if(o.readyList){o.each(o.readyList,function(){this.call(document,o)});o.readyList=null}o(document).triggerHandler("ready")}}});var x=false;function B(){if(x){return}x=true;if(document.addEventListener){document.addEventListener("DOMContentLoaded",function(){document.removeEventListener("DOMContentLoaded",arguments.callee,false);o.ready()},false)}else{if(document.attachEvent){document.attachEvent("onreadystatechange",function(){if(document.readyState==="complete"){document.detachEvent("onreadystatechange",arguments.callee);o.ready()}});if(document.documentElement.doScroll&&l==l.top){(function(){if(o.isReady){return}try{document.documentElement.doScroll("left")}catch(E){setTimeout(arguments.callee,0);return}o.ready()})()}}}o.event.add(l,"load",o.ready)}o.each(("blur,focus,load,resize,scroll,unload,click,dblclick,mousedown,mouseup,mousemove,mouseover,mouseout,mouseenter,mouseleave,change,select,submit,keydown,keypress,keyup,error").split(","),function(F,E){o.fn[E]=function(G){return G?this.bind(E,G):this.trigger(E)}});o(l).bind("unload",function(){for(var E in o.cache){if(E!=1&&o.cache[E].handle){o.event.remove(o.cache[E].handle.elem)}}});(function(){o.support={};var F=document.documentElement,G=document.createElement("script"),K=document.createElement("div"),J="script"+(new Date).getTime();K.style.display="none";K.innerHTML='   <link/><table></table><a href="/a" style="color:red;float:left;opacity:.5;">a</a><select><option>text</option></select><object><param/></object>';var H=K.getElementsByTagName("*"),E=K.getElementsByTagName("a")[0];if(!H||!H.length||!E){return}o.support={leadingWhitespace:K.firstChild.nodeType==3,tbody:!K.getElementsByTagName("tbody").length,objectAll:!!K.getElementsByTagName("object")[0].getElementsByTagName("*").length,htmlSerialize:!!K.getElementsByTagName("link").length,style:/red/.test(E.getAttribute("style")),hrefNormalized:E.getAttribute("href")==="/a",opacity:E.style.opacity==="0.5",cssFloat:!!E.style.cssFloat,scriptEval:false,noCloneEvent:true,boxModel:null};G.type="text/javascript";try{G.appendChild(document.createTextNode("window."+J+"=1;"))}catch(I){}F.insertBefore(G,F.firstChild);if(l[J]){o.support.scriptEval=true;delete l[J]}F.removeChild(G);if(K.attachEvent&&K.fireEvent){K.attachEvent("onclick",function(){o.support.noCloneEvent=false;K.detachEvent("onclick",arguments.callee)});K.cloneNode(true).fireEvent("onclick")}o(function(){var L=document.createElement("div");L.style.width=L.style.paddingLeft="1px";document.body.appendChild(L);o.boxModel=o.support.boxModel=L.offsetWidth===2;document.body.removeChild(L).style.display="none"})})();var w=o.support.cssFloat?"cssFloat":"styleFloat";o.props={"for":"htmlFor","class":"className","float":w,cssFloat:w,styleFloat:w,readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",tabindex:"tabIndex"};o.fn.extend({_load:o.fn.load,load:function(G,J,K){if(typeof G!=="string"){return this._load(G)}var I=G.indexOf(" ");if(I>=0){var E=G.slice(I,G.length);G=G.slice(0,I)}var H="GET";if(J){if(o.isFunction(J)){K=J;J=null}else{if(typeof J==="object"){J=o.param(J);H="POST"}}}var F=this;o.ajax({url:G,type:H,dataType:"html",data:J,complete:function(M,L){if(L=="success"||L=="notmodified"){F.html(E?o("<div/>").append(M.responseText.replace(/<script(.|\s)*?\/script>/g,"")).find(E):M.responseText)}if(K){F.each(K,[M.responseText,L,M])}}});return this},serialize:function(){return o.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?o.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password|search/i.test(this.type))}).map(function(E,F){var G=o(this).val();return G==null?null:o.isArray(G)?o.map(G,function(I,H){return{name:F.name,value:I}}):{name:F.name,value:G}}).get()}});o.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(E,F){o.fn[F]=function(G){return this.bind(F,G)}});var r=e();o.extend({get:function(E,G,H,F){if(o.isFunction(G)){H=G;G=null}return o.ajax({type:"GET",url:E,data:G,success:H,dataType:F})},getScript:function(E,F){return o.get(E,null,F,"script")},getJSON:function(E,F,G){return o.get(E,F,G,"json")},post:function(E,G,H,F){if(o.isFunction(G)){H=G;G={}}return o.ajax({type:"POST",url:E,data:G,success:H,dataType:F})},ajaxSetup:function(E){o.extend(o.ajaxSettings,E)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return l.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest()},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(M){M=o.extend(true,M,o.extend(true,{},o.ajaxSettings,M));var W,F=/=\?(&|$)/g,R,V,G=M.type.toUpperCase();if(M.data&&M.processData&&typeof M.data!=="string"){M.data=o.param(M.data)}if(M.dataType=="jsonp"){if(G=="GET"){if(!M.url.match(F)){M.url+=(M.url.match(/\?/)?"&":"?")+(M.jsonp||"callback")+"=?"}}else{if(!M.data||!M.data.match(F)){M.data=(M.data?M.data+"&":"")+(M.jsonp||"callback")+"=?"}}M.dataType="json"}if(M.dataType=="json"&&(M.data&&M.data.match(F)||M.url.match(F))){W="jsonp"+r++;if(M.data){M.data=(M.data+"").replace(F,"="+W+"$1")}M.url=M.url.replace(F,"="+W+"$1");M.dataType="script";l[W]=function(X){V=X;I();L();l[W]=g;try{delete l[W]}catch(Y){}if(H){H.removeChild(T)}}}if(M.dataType=="script"&&M.cache==null){M.cache=false}if(M.cache===false&&G=="GET"){var E=e();var U=M.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+E+"$2");M.url=U+((U==M.url)?(M.url.match(/\?/)?"&":"?")+"_="+E:"")}if(M.data&&G=="GET"){M.url+=(M.url.match(/\?/)?"&":"?")+M.data;M.data=null}if(M.global&&!o.active++){o.event.trigger("ajaxStart")}var Q=/^(\w+:)?\/\/([^\/?#]+)/.exec(M.url);if(M.dataType=="script"&&G=="GET"&&Q&&(Q[1]&&Q[1]!=location.protocol||Q[2]!=location.host)){var H=document.getElementsByTagName("head")[0];var T=document.createElement("script");T.src=M.url;if(M.scriptCharset){T.charset=M.scriptCharset}if(!W){var O=false;T.onload=T.onreadystatechange=function(){if(!O&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){O=true;I();L();T.onload=T.onreadystatechange=null;H.removeChild(T)}}}H.appendChild(T);return g}var K=false;var J=M.xhr();if(M.username){J.open(G,M.url,M.async,M.username,M.password)}else{J.open(G,M.url,M.async)}try{if(M.data){J.setRequestHeader("Content-Type",M.contentType)}if(M.ifModified){J.setRequestHeader("If-Modified-Since",o.lastModified[M.url]||"Thu, 01 Jan 1970 00:00:00 GMT")}J.setRequestHeader("X-Requested-With","XMLHttpRequest");J.setRequestHeader("Accept",M.dataType&&M.accepts[M.dataType]?M.accepts[M.dataType]+", */*":M.accepts._default)}catch(S){}if(M.beforeSend&&M.beforeSend(J,M)===false){if(M.global&&!--o.active){o.event.trigger("ajaxStop")}J.abort();return false}if(M.global){o.event.trigger("ajaxSend",[J,M])}var N=function(X){if(J.readyState==0){if(P){clearInterval(P);P=null;if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}}else{if(!K&&J&&(J.readyState==4||X=="timeout")){K=true;if(P){clearInterval(P);P=null}R=X=="timeout"?"timeout":!o.httpSuccess(J)?"error":M.ifModified&&o.httpNotModified(J,M.url)?"notmodified":"success";if(R=="success"){try{V=o.httpData(J,M.dataType,M)}catch(Z){R="parsererror"}}if(R=="success"){var Y;try{Y=J.getResponseHeader("Last-Modified")}catch(Z){}if(M.ifModified&&Y){o.lastModified[M.url]=Y}if(!W){I()}}else{o.handleError(M,J,R)}L();if(X){J.abort()}if(M.async){J=null}}}};if(M.async){var P=setInterval(N,13);if(M.timeout>0){setTimeout(function(){if(J&&!K){N("timeout")}},M.timeout)}}try{J.send(M.data)}catch(S){o.handleError(M,J,null,S)}if(!M.async){N()}function I(){if(M.success){M.success(V,R)}if(M.global){o.event.trigger("ajaxSuccess",[J,M])}}function L(){if(M.complete){M.complete(J,R)}if(M.global){o.event.trigger("ajaxComplete",[J,M])}if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}return J},handleError:function(F,H,E,G){if(F.error){F.error(H,E,G)}if(F.global){o.event.trigger("ajaxError",[H,F,G])}},active:0,httpSuccess:function(F){try{return !F.status&&location.protocol=="file:"||(F.status>=200&&F.status<300)||F.status==304||F.status==1223}catch(E){}return false},httpNotModified:function(G,E){try{var H=G.getResponseHeader("Last-Modified");return G.status==304||H==o.lastModified[E]}catch(F){}return false},httpData:function(J,H,G){var F=J.getResponseHeader("content-type"),E=H=="xml"||!H&&F&&F.indexOf("xml")>=0,I=E?J.responseXML:J.responseText;if(E&&I.documentElement.tagName=="parsererror"){throw"parsererror"}if(G&&G.dataFilter){I=G.dataFilter(I,H)}if(typeof I==="string"){if(H=="script"){o.globalEval(I)}if(H=="json"){I=l["eval"]("("+I+")")}}return I},param:function(E){var G=[];function H(I,J){G[G.length]=encodeURIComponent(I)+"="+encodeURIComponent(J)}if(o.isArray(E)||E.jquery){o.each(E,function(){H(this.name,this.value)})}else{for(var F in E){if(o.isArray(E[F])){o.each(E[F],function(){H(F,this)})}else{H(F,o.isFunction(E[F])?E[F]():E[F])}}}return G.join("&").replace(/%20/g,"+")}});var m={},n,d=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];function t(F,E){var G={};o.each(d.concat.apply([],d.slice(0,E)),function()
+{G[this]=F});return G}o.fn.extend({show:function(J,L){if(J){return this.animate(t("show",3),J,L)}else{for(var H=0,F=this.length;H<F;H++){var E=o.data(this[H],"olddisplay");this[H].style.display=E||"";if(o.css(this[H],"display")==="none"){var G=this[H].tagName,K;if(m[G]){K=m[G]}else{var I=o("<"+G+" />").appendTo("body");K=I.css("display");if(K==="none"){K="block"}I.remove();m[G]=K}o.data(this[H],"olddisplay",K)}}for(var H=0,F=this.length;H<F;H++){this[H].style.display=o.data(this[H],"olddisplay")||""}return this}},hide:function(H,I){if(H){return this.animate(t("hide",3),H,I)}else{for(var G=0,F=this.length;G<F;G++){var E=o.data(this[G],"olddisplay");if(!E&&E!=="none"){o.data(this[G],"olddisplay",o.css(this[G],"display"))}}for(var G=0,F=this.length;G<F;G++){this[G].style.display="none"}return this}},_toggle:o.fn.toggle,toggle:function(G,F){var E=typeof G==="boolean";return o.isFunction(G)&&o.isFunction(F)?this._toggle.apply(this,arguments):G==null||E?this.each(function(){var H=E?G:o(this).is(":hidden");o(this)[H?"show":"hide"]()}):this.animate(t("toggle",3),G,F)},fadeTo:function(E,G,F){return this.animate({opacity:G},E,F)},animate:function(I,F,H,G){var E=o.speed(F,H,G);return this[E.queue===false?"each":"queue"](function(){var K=o.extend({},E),M,L=this.nodeType==1&&o(this).is(":hidden"),J=this;for(M in I){if(I[M]=="hide"&&L||I[M]=="show"&&!L){return K.complete.call(this)}if((M=="height"||M=="width")&&this.style){K.display=o.css(this,"display");K.overflow=this.style.overflow}}if(K.overflow!=null){this.style.overflow="hidden"}K.curAnim=o.extend({},I);o.each(I,function(O,S){var R=new o.fx(J,K,O);if(/toggle|show|hide/.test(S)){R[S=="toggle"?L?"show":"hide":S](I)}else{var Q=S.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),T=R.cur(true)||0;if(Q){var N=parseFloat(Q[2]),P=Q[3]||"px";if(P!="px"){J.style[O]=(N||1)+P;T=((N||1)/R.cur(true))*T;J.style[O]=T+P}if(Q[1]){N=((Q[1]=="-="?-1:1)*N)+T}R.custom(T,N,P)}else{R.custom(T,S,"")}}});return true})},stop:function(F,E){var G=o.timers;if(F){this.queue([])}this.each(function(){for(var H=G.length-1;H>=0;H--){if(G[H].elem==this){if(E){G[H](true)}G.splice(H,1)}}});if(!E){this.dequeue()}return this}});o.each({slideDown:t("show",1),slideUp:t("hide",1),slideToggle:t("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(E,F){o.fn[E]=function(G,H){return this.animate(F,G,H)}});o.extend({speed:function(G,H,F){var E=typeof G==="object"?G:{complete:F||!F&&H||o.isFunction(G)&&G,duration:G,easing:F&&H||H&&!o.isFunction(H)&&H};E.duration=o.fx.off?0:typeof E.duration==="number"?E.duration:o.fx.speeds[E.duration]||o.fx.speeds._default;E.old=E.complete;E.complete=function(){if(E.queue!==false){o(this).dequeue()}if(o.isFunction(E.old)){E.old.call(this)}};return E},easing:{linear:function(G,H,E,F){return E+F*G},swing:function(G,H,E,F){return((-Math.cos(G*Math.PI)/2)+0.5)*F+E}},timers:[],fx:function(F,E,G){this.options=E;this.elem=F;this.prop=G;if(!E.orig){E.orig={}}}});o.fx.prototype={update:function(){if(this.options.step){this.options.step.call(this.elem,this.now,this)}(o.fx.step[this.prop]||o.fx.step._default)(this);if((this.prop=="height"||this.prop=="width")&&this.elem.style){this.elem.style.display="block"}},cur:function(F){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null)){return this.elem[this.prop]}var E=parseFloat(o.css(this.elem,this.prop,F));return E&&E>-10000?E:parseFloat(o.curCSS(this.elem,this.prop))||0},custom:function(I,H,G){this.startTime=e();this.start=I;this.end=H;this.unit=G||this.unit||"px";this.now=this.start;this.pos=this.state=0;var E=this;function F(J){return E.step(J)}F.elem=this.elem;if(F()&&o.timers.push(F)&&!n){n=setInterval(function(){var K=o.timers;for(var J=0;J<K.length;J++){if(!K[J]()){K.splice(J--,1)}}if(!K.length){clearInterval(n);n=g}},13)}},show:function(){this.options.orig[this.prop]=o.attr(this.elem.style,this.prop);this.options.show=true;this.custom(this.prop=="width"||this.prop=="height"?1:0,this.cur());o(this.elem).show()},hide:function(){this.options.orig[this.prop]=o.attr(this.elem.style,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(H){var G=e();if(H||G>=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var E=true;for(var F in this.options.curAnim){if(this.options.curAnim[F]!==true){E=false}}if(E){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(o.css(this.elem,"display")=="none"){this.elem.style.display="block"}}if(this.options.hide){o(this.elem).hide()}if(this.options.hide||this.options.show){for(var I in this.options.curAnim){o.attr(this.elem.style,I,this.options.orig[I])}}this.options.complete.call(this.elem)}return false}else{var J=G-this.startTime;this.state=J/this.options.duration;this.pos=o.easing[this.options.easing||(o.easing.swing?"swing":"linear")](this.state,J,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update()}return true}};o.extend(o.fx,{speeds:{slow:600,fast:200,_default:400},step:{opacity:function(E){o.attr(E.elem.style,"opacity",E.now)},_default:function(E){if(E.elem.style&&E.elem.style[E.prop]!=null){E.elem.style[E.prop]=E.now+E.unit}else{E.elem[E.prop]=E.now}}}});if(document.documentElement.getBoundingClientRect){o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}var G=this[0].getBoundingClientRect(),J=this[0].ownerDocument,F=J.body,E=J.documentElement,L=E.clientTop||F.clientTop||0,K=E.clientLeft||F.clientLeft||0,I=G.top+(self.pageYOffset||o.boxModel&&E.scrollTop||F.scrollTop)-L,H=G.left+(self.pageXOffset||o.boxModel&&E.scrollLeft||F.scrollLeft)-K;return{top:I,left:H}}}else{o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}o.offset.initialized||o.offset.initialize();var J=this[0],G=J.offsetParent,F=J,O=J.ownerDocument,M,H=O.documentElement,K=O.body,L=O.defaultView,E=L.getComputedStyle(J,null),N=J.offsetTop,I=J.offsetLeft;while((J=J.parentNode)&&J!==K&&J!==H){M=L.getComputedStyle(J,null);N-=J.scrollTop,I-=J.scrollLeft;if(J===G){N+=J.offsetTop,I+=J.offsetLeft;if(o.offset.doesNotAddBorder&&!(o.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(J.tagName))){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}F=G,G=J.offsetParent}if(o.offset.subtractsBorderForOverflowNotVisible&&M.overflow!=="visible"){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}E=M}if(E.position==="relative"||E.position==="static"){N+=K.offsetTop,I+=K.offsetLeft}if(E.position==="fixed"){N+=Math.max(H.scrollTop,K.scrollTop),I+=Math.max(H.scrollLeft,K.scrollLeft)}return{top:N,left:I}}}o.offset={initialize:function(){if(this.initialized){return}var L=document.body,F=document.createElement("div"),H,G,N,I,M,E,J=L.style.marginTop,K='<div style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;"><div></div></div><table style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;" cellpadding="0" cellspacing="0"><tr><td></td></tr></table>';M={position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"};for(E in M){F.style[E]=M[E]}F.innerHTML=K;L.insertBefore(F,L.firstChild);H=F.firstChild,G=H.firstChild,I=H.nextSibling.firstChild.firstChild;this.doesNotAddBorder=(G.offsetTop!==5);this.doesAddBorderForTableAndCells=(I.offsetTop===5);H.style.overflow="hidden",H.style.position="relative";this.subtractsBorderForOverflowNotVisible=(G.offsetTop===-5);L.style.marginTop="1px";this.doesNotIncludeMarginInBodyOffset=(L.offsetTop===0);L.style.marginTop=J;L.removeChild(F);this.initialized=true},bodyOffset:function(E){o.offset.initialized||o.offset.initialize();var G=E.offsetTop,F=E.offsetLeft;if(o.offset.doesNotIncludeMarginInBodyOffset){G+=parseInt(o.curCSS(E,"marginTop",true),10)||0,F+=parseInt(o.curCSS(E,"marginLeft",true),10)||0}return{top:G,left:F}}};o.fn.extend({position:function(){var I=0,H=0,F;if(this[0]){var G=this.offsetParent(),J=this.offset(),E=/^body|html$/i.test(G[0].tagName)?{top:0,left:0}:G.offset();J.top-=j(this,"marginTop");J.left-=j(this,"marginLeft");E.top+=j(G,"borderTopWidth");E.left+=j(G,"borderLeftWidth");F={top:J.top-E.top,left:J.left-E.left}}return F},offsetParent:function(){var E=this[0].offsetParent||document.body;while(E&&(!/^body|html$/i.test(E.tagName)&&o.css(E,"position")=="static")){E=E.offsetParent}return o(E)}});o.each(["Left","Top"],function(F,E){var G="scroll"+E;o.fn[G]=function(H){if(!this[0]){return null}return H!==g?this.each(function(){this==l||this==document?l.scrollTo(!F?H:o(l).scrollLeft(),F?H:o(l).scrollTop()):this[G]=H}):this[0]==l||this[0]==document?self[F?"pageYOffset":"pageXOffset"]||o.boxModel&&document.documentElement[G]||document.body[G]:this[0][G]}});o.each(["Height","Width"],function(I,G){var E=I?"Left":"Top",H=I?"Right":"Bottom",F=G.toLowerCase();o.fn["inner"+G]=function(){return this[0]?o.css(this[0],F,false,"padding"):null};o.fn["outer"+G]=function(K){return this[0]?o.css(this[0],F,false,K?"margin":"border"):null};var J=G.toLowerCase();o.fn[J]=function(K){return this[0]==l?document.compatMode=="CSS1Compat"&&document.documentElement["client"+G]||document.body["client"+G]:this[0]==document?Math.max(document.documentElement["client"+G],document.body["scroll"+G],document.documentElement["scroll"+G],document.body["offset"+G],document.documentElement["offset"+G]):K===g?(this.length?o.css(this[0],J):null):this.css(J,typeof K==="string"?K:K+"px")}})})();
+
+/*
+ * jQuery hashchange event - v1.3 - 7/21/2010
+ * http://benalman.com/projects/jquery-hashchange-plugin/
+ * 
+ * Copyright (c) 2010 "Cowboy" Ben Alman
+ * Dual licensed under the MIT and GPL licenses.
+ * http://benalman.com/about/license/
+ */
+(function($,e,b){var c="hashchange",h=document,f,g=$.event.special,i=h.documentMode,d="on"+c in e&&(i===b||i>7);function a(j){j=j||location.href;return"#"+j.replace(/^[^#]*#?(.*)$/,"$1")}$.fn[c]=function(j){return j?this.bind(c,j):this.trigger(c)};$.fn[c].delay=50;g[c]=$.extend(g[c],{setup:function(){if(d){return false}$(f.start)},teardown:function(){if(d){return false}$(f.stop)}});f=(function(){var j={},p,m=a(),k=function(q){return q},l=k,o=k;j.start=function(){p||n()};j.stop=function(){p&&clearTimeout(p);p=b};function n(){var r=a(),q=o(m);if(r!==m){l(m=r,q);$(e).trigger(c)}else{if(q!==m){location.href=location.href.replace(/#.*/,"")+q}}p=setTimeout(n,$.fn[c].delay)}$.browser.msie&&!d&&(function(){var q,r;j.start=function(){if(!q){r=$.fn[c].src;r=r&&r+a();q=$('<iframe tabindex="-1" title="empty"/>').hide().one("load",function(){r||l(a());n()}).attr("src",r||"javascript:0").insertAfter("body")[0].contentWindow;h.onpropertychange=function(){try{if(event.propertyName==="title"){q.document.title=h.title}}catch(s){}}}};j.stop=k;o=function(){return a(q.location.href)};l=function(v,s){var u=q.document,t=$.fn[c].domain;if(v!==s){u.title=h.title;u.open();t&&u.write('<script>document.domain="'+t+'"<\/script>');u.close();q.location.hash=v}}})();return j})()})(jQuery,this);
+/*
+ * jQuery UI 1.7.2
+ *
+ * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * http://docs.jquery.com/UI
+ */
+jQuery.ui||(function(c){var i=c.fn.remove,d=c.browser.mozilla&&(parseFloat(c.browser.version)<1.9);c.ui={version:"1.7.2",plugin:{add:function(k,l,n){var m=c.ui[k].prototype;for(var j in n){m.plugins[j]=m.plugins[j]||[];m.plugins[j].push([l,n[j]])}},call:function(j,l,k){var n=j.plugins[l];if(!n||!j.element[0].parentNode){return}for(var m=0;m<n.length;m++){if(j.options[n[m][0]]){n[m][1].apply(j.element,k)}}}},contains:function(k,j){return document.compareDocumentPosition?k.compareDocumentPosition(j)&16:k!==j&&k.contains(j)},hasScroll:function(m,k){if(c(m).css("overflow")=="hidden"){return false}var j=(k&&k=="left")?"scrollLeft":"scrollTop",l=false;if(m[j]>0){return true}m[j]=1;l=(m[j]>0);m[j]=0;return l},isOverAxis:function(k,j,l){return(k>j)&&(k<(j+l))},isOver:function(o,k,n,m,j,l){return c.ui.isOverAxis(o,n,j)&&c.ui.isOverAxis(k,m,l)},keyCode:{BACKSPACE:8,CAPS_LOCK:20,COMMA:188,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38}};if(d){var f=c.attr,e=c.fn.removeAttr,h="http://www.w3.org/2005/07/aaa",a=/^aria-/,b=/^wairole:/;c.attr=function(k,j,l){var m=l!==undefined;return(j=="role"?(m?f.call(this,k,j,"wairole:"+l):(f.apply(this,arguments)||"").replace(b,"")):(a.test(j)?(m?k.setAttributeNS(h,j.replace(a,"aaa:"),l):f.call(this,k,j.replace(a,"aaa:"))):f.apply(this,arguments)))};c.fn.removeAttr=function(j){return(a.test(j)?this.each(function(){this.removeAttributeNS(h,j.replace(a,""))}):e.call(this,j))}}c.fn.extend({remove:function(){c("*",this).add(this).each(function(){c(this).triggerHandler("remove")});return i.apply(this,arguments)},enableSelection:function(){return this.attr("unselectable","off").css("MozUserSelect","").unbind("selectstart.ui")},disableSelection:function(){return this.attr("unselectable","on").css("MozUserSelect","none").bind("selectstart.ui",function(){return false})},scrollParent:function(){var j;if((c.browser.msie&&(/(static|relative)/).test(this.css("position")))||(/absolute/).test(this.css("position"))){j=this.parents().filter(function(){return(/(relative|absolute|fixed)/).test(c.curCSS(this,"position",1))&&(/(auto|scroll)/).test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0)}else{j=this.parents().filter(function(){return(/(auto|scroll)/).test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0)}return(/fixed/).test(this.css("position"))||!j.length?c(document):j}});c.extend(c.expr[":"],{data:function(l,k,j){return !!c.data(l,j[3])},focusable:function(k){var l=k.nodeName.toLowerCase(),j=c.attr(k,"tabindex");return(/input|select|textarea|button|object/.test(l)?!k.disabled:"a"==l||"area"==l?k.href||!isNaN(j):!isNaN(j))&&!c(k)["area"==l?"parents":"closest"](":hidden").length},tabbable:function(k){var j=c.attr(k,"tabindex");return(isNaN(j)||j>=0)&&c(k).is(":focusable")}});function g(m,n,o,l){function k(q){var p=c[m][n][q]||[];return(typeof p=="string"?p.split(/,?\s+/):p)}var j=k("getter");if(l.length==1&&typeof l[0]=="string"){j=j.concat(k("getterSetter"))}return(c.inArray(o,j)!=-1)}c.widget=function(k,j){var l=k.split(".")[0];k=k.split(".")[1];c.fn[k]=function(p){var n=(typeof p=="string"),o=Array.prototype.slice.call(arguments,1);if(n&&p.substring(0,1)=="_"){return this}if(n&&g(l,k,p,o)){var m=c.data(this[0],k);return(m?m[p].apply(m,o):undefined)}return this.each(function(){var q=c.data(this,k);(!q&&!n&&c.data(this,k,new c[l][k](this,p))._init());(q&&n&&c.isFunction(q[p])&&q[p].apply(q,o))})};c[l]=c[l]||{};c[l][k]=function(o,n){var m=this;this.namespace=l;this.widgetName=k;this.widgetEventPrefix=c[l][k].eventPrefix||k;this.widgetBaseClass=l+"-"+k;this.options=c.extend({},c.widget.defaults,c[l][k].defaults,c.metadata&&c.metadata.get(o)[k],n);this.element=c(o).bind("setData."+k,function(q,p,r){if(q.target==o){return m._setData(p,r)}}).bind("getData."+k,function(q,p){if(q.target==o){return m._getData(p)}}).bind("remove",function(){return m.destroy()})};c[l][k].prototype=c.extend({},c.widget.prototype,j);c[l][k].getterSetter="option"};c.widget.prototype={_init:function(){},destroy:function(){this.element.removeData(this.widgetName).removeClass(this.widgetBaseClass+"-disabled "+this.namespace+"-state-disabled").removeAttr("aria-disabled")},option:function(l,m){var k=l,j=this;if(typeof l=="string"){if(m===undefined){return this._getData(l)}k={};k[l]=m}c.each(k,function(n,o){j._setData(n,o)})},_getData:function(j){return this.options[j]},_setData:function(j,k){this.options[j]=k;if(j=="disabled"){this.element[k?"addClass":"removeClass"](this.widgetBaseClass+"-disabled "+this.namespace+"-state-disabled").attr("aria-disabled",k)}},enable:function(){this._setData("disabled",false)},disable:function(){this._setData("disabled",true)},_trigger:function(l,m,n){var p=this.options[l],j=(l==this.widgetEventPrefix?l:this.widgetEventPrefix+l);m=c.Event(m);m.type=j;if(m.originalEvent){for(var k=c.event.props.length,o;k;){o=c.event.props[--k];m[o]=m.originalEvent[o]}}this.element.trigger(m,n);return !(c.isFunction(p)&&p.call(this.element[0],m,n)===false||m.isDefaultPrevented())}};c.widget.defaults={disabled:false};c.ui.mouse={_mouseInit:function(){var j=this;this.element.bind("mousedown."+this.widgetName,function(k){return j._mouseDown(k)}).bind("click."+this.widgetName,function(k){if(j._preventClickEvent){j._preventClickEvent=false;k.stopImmediatePropagation();return false}});if(c.browser.msie){this._mouseUnselectable=this.element.attr("unselectable");this.element.attr("unselectable","on")}this.started=false},_mouseDestroy:function(){this.element.unbind("."+this.widgetName);(c.browser.msie&&this.element.attr("unselectable",this._mouseUnselectable))},_mouseDown:function(l){l.originalEvent=l.originalEvent||{};if(l.originalEvent.mouseHandled){return}(this._mouseStarted&&this._mouseUp(l));this._mouseDownEvent=l;var k=this,m=(l.which==1),j=(typeof this.options.cancel=="string"?c(l.target).parents().add(l.target).filter(this.options.cancel).length:false);if(!m||j||!this._mouseCapture(l)){return true}this.mouseDelayMet=!this.options.delay;if(!this.mouseDelayMet){this._mouseDelayTimer=setTimeout(function(){k.mouseDelayMet=true},this.options.delay)}if(this._mouseDistanceMet(l)&&this._mouseDelayMet(l)){this._mouseStarted=(this._mouseStart(l)!==false);if(!this._mouseStarted){l.preventDefault();return true}}this._mouseMoveDelegate=function(n){return k._mouseMove(n)};this._mouseUpDelegate=function(n){return k._mouseUp(n)};c(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate);(c.browser.safari||l.preventDefault());l.originalEvent.mouseHandled=true;return true},_mouseMove:function(j){if(c.browser.msie&&!j.button){return this._mouseUp(j)}if(this._mouseStarted){this._mouseDrag(j);return j.preventDefault()}if(this._mouseDistanceMet(j)&&this._mouseDelayMet(j)){this._mouseStarted=(this._mouseStart(this._mouseDownEvent,j)!==false);(this._mouseStarted?this._mouseDrag(j):this._mouseUp(j))}return !this._mouseStarted},_mouseUp:function(j){c(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted=false;this._preventClickEvent=(j.target==this._mouseDownEvent.target);this._mouseStop(j)}return false},_mouseDistanceMet:function(j){return(Math.max(Math.abs(this._mouseDownEvent.pageX-j.pageX),Math.abs(this._mouseDownEvent.pageY-j.pageY))>=this.options.distance)},_mouseDelayMet:function(j){return this.mouseDelayMet},_mouseStart:function(j){},_mouseDrag:function(j){},_mouseStop:function(j){},_mouseCapture:function(j){return true}};c.ui.mouse.defaults={cancel:null,distance:1,delay:0}})(jQuery);;/* * jQuery UI Resizable 1.7.2
+ *
+ * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * http://docs.jquery.com/UI/Resizables
+ *
+ * Depends:
+ *	ui.core.js
+ */
+(function(c){c.widget("ui.resizable",c.extend({},c.ui.mouse,{_init:function(){var e=this,j=this.options;this.element.addClass("ui-resizable");c.extend(this,{_aspectRatio:!!(j.aspectRatio),aspectRatio:j.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:j.helper||j.ghost||j.animate?j.helper||"ui-resizable-helper":null});if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)){if(/relative/.test(this.element.css("position"))&&c.browser.opera){this.element.css({position:"relative",top:"auto",left:"auto"})}this.element.wrap(c('<div class="ui-wrapper" style="overflow: hidden;"></div>').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")}));this.element=this.element.parent().data("resizable",this.element.data("resizable"));this.elementIsWrapper=true;this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")});this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0});this.originalResizeStyle=this.originalElement.css("resize");this.originalElement.css("resize","none");this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"}));this.originalElement.css({margin:this.originalElement.css("margin")});this._proportionallyResize()}this.handles=j.handles||(!c(".ui-resizable-handle",this.element).length?"e,s,se":{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"});if(this.handles.constructor==String){if(this.handles=="all"){this.handles="n,e,s,w,se,sw,ne,nw"}var k=this.handles.split(",");this.handles={};for(var f=0;f<k.length;f++){var h=c.trim(k[f]),d="ui-resizable-"+h;var g=c('<div class="ui-resizable-handle '+d+'"></div>');if(/sw|se|ne|nw/.test(h)){g.css({zIndex:++j.zIndex})}if("se"==h){g.addClass("ui-icon ui-icon-gripsmall-diagonal-se")}this.handles[h]=".ui-resizable-"+h;this.element.append(g)}}this._renderAxis=function(p){p=p||this.element;for(var m in this.handles){if(this.handles[m].constructor==String){this.handles[m]=c(this.handles[m],this.element).show()}if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var n=c(this.handles[m],this.element),o=0;o=/sw|ne|nw|se|n|s/.test(m)?n.outerHeight():n.outerWidth();var l=["padding",/ne|nw|n/.test(m)?"Top":/se|sw|s/.test(m)?"Bottom":/^e$/.test(m)?"Right":"Left"].join("");p.css(l,o);this._proportionallyResize()}if(!c(this.handles[m]).length){continue}}};this._renderAxis(this.element);this._handles=c(".ui-resizable-handle",this.element).disableSelection();this._handles.mouseover(function(){if(!e.resizing){if(this.className){var i=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)}e.axis=i&&i[1]?i[1]:"se"}});if(j.autoHide){this._handles.hide();c(this.element).addClass("ui-resizable-autohide").hover(function(){c(this).removeClass("ui-resizable-autohide");e._handles.show()},function(){if(!e.resizing){c(this).addClass("ui-resizable-autohide");e._handles.hide()}})}this._mouseInit()},destroy:function(){this._mouseDestroy();var d=function(f){c(f).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};if(this.elementIsWrapper){d(this.element);var e=this.element;e.parent().append(this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")})).end().remove()}this.originalElement.css("resize",this.originalResizeStyle);d(this.originalElement)},_mouseCapture:function(e){var f=false;for(var d in this.handles){if(c(this.handles[d])[0]==e.target){f=true}}return this.options.disabled||!!f},_mouseStart:function(f){var i=this.options,e=this.element.position(),d=this.element;this.resizing=true;this.documentScroll={top:c(document).scrollTop(),left:c(document).scrollLeft()};if(d.is(".ui-draggable")||(/absolute/).test(d.css("position"))){d.css({position:"absolute",top:e.top,left:e.left})}if(c.browser.opera&&(/relative/).test(d.css("position"))){d.css({position:"relative",top:"auto",left:"auto"})}this._renderProxy();var j=b(this.helper.css("left")),g=b(this.helper.css("top"));if(i.containment){j+=c(i.containment).scrollLeft()||0;g+=c(i.containment).scrollTop()||0}this.offset=this.helper.offset();this.position={left:j,top:g};this.size=this._helper?{width:d.outerWidth(),height:d.outerHeight()}:{width:d.width(),height:d.height()};this.originalSize=this._helper?{width:d.outerWidth(),height:d.outerHeight()}:{width:d.width(),height:d.height()};this.originalPosition={left:j,top:g};this.sizeDiff={width:d.outerWidth()-d.width(),height:d.outerHeight()-d.height()};this.originalMousePosition={left:f.pageX,top:f.pageY};this.aspectRatio=(typeof i.aspectRatio=="number")?i.aspectRatio:((this.originalSize.width/this.originalSize.height)||1);var h=c(".ui-resizable-"+this.axis).css("cursor");c("body").css("cursor",h=="auto"?this.axis+"-resize":h);d.addClass("ui-resizable-resizing");this._propagate("start",f);return true},_mouseDrag:function(d){var g=this.helper,f=this.options,l={},p=this,i=this.originalMousePosition,m=this.axis;var q=(d.pageX-i.left)||0,n=(d.pageY-i.top)||0;var h=this._change[m];if(!h){return false}var k=h.apply(this,[d,q,n]),j=c.browser.msie&&c.browser.version<7,e=this.sizeDiff;if(this._aspectRatio||d.shiftKey){k=this._updateRatio(k,d)}k=this._respectSize(k,d);this._propagate("resize",d);g.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"});if(!this._helper&&this._proportionallyResizeElements.length){this._proportionallyResize()}this._updateCache(k);this._trigger("resize",d,this.ui());return false},_mouseStop:function(g){this.resizing=false;var h=this.options,l=this;if(this._helper){var f=this._proportionallyResizeElements,d=f.length&&(/textarea/i).test(f[0].nodeName),e=d&&c.ui.hasScroll(f[0],"left")?0:l.sizeDiff.height,j=d?0:l.sizeDiff.width;var m={width:(l.size.width-j),height:(l.size.height-e)},i=(parseInt(l.element.css("left"),10)+(l.position.left-l.originalPosition.left))||null,k=(parseInt(l.element.css("top"),10)+(l.position.top-l.originalPosition.top))||null;if(!h.animate){this.element.css(c.extend(m,{top:k,left:i}))}l.helper.height(l.size.height);l.helper.width(l.size.width);if(this._helper&&!h.animate){this._proportionallyResize()}}c("body").css("cursor","auto");this.element.removeClass("ui-resizable-resizing");this._propagate("stop",g);if(this._helper){this.helper.remove()}return false},_updateCache:function(d){var e=this.options;this.offset=this.helper.offset();if(a(d.left)){this.position.left=d.left}if(a(d.top)){this.position.top=d.top}if(a(d.height)){this.size.height=d.height}if(a(d.width)){this.size.width=d.width}},_updateRatio:function(g,f){var h=this.options,i=this.position,e=this.size,d=this.axis;if(g.height){g.width=(e.height*this.aspectRatio)}else{if(g.width){g.height=(e.width/this.aspectRatio)}}if(d=="sw"){g.left=i.left+(e.width-g.width);g.top=null}if(d=="nw"){g.top=i.top+(e.height-g.height);g.left=i.left+(e.width-g.width)}return g},_respectSize:function(k,f){var i=this.helper,h=this.options,q=this._aspectRatio||f.shiftKey,p=this.axis,s=a(k.width)&&h.maxWidth&&(h.maxWidth<k.width),l=a(k.height)&&h.maxHeight&&(h.maxHeight<k.height),g=a(k.width)&&h.minWidth&&(h.minWidth>k.width),r=a(k.height)&&h.minHeight&&(h.minHeight>k.height);if(g){k.width=h.minWidth}if(r){k.height=h.minHeight}if(s){k.width=h.maxWidth}if(l){k.height=h.maxHeight}var e=this.originalPosition.left+this.originalSize.width,n=this.position.top+this.size.height;var j=/sw|nw|w/.test(p),d=/nw|ne|n/.test(p);if(g&&j){k.left=e-h.minWidth}if(s&&j){k.left=e-h.maxWidth}if(r&&d){k.top=n-h.minHeight}if(l&&d){k.top=n-h.maxHeight}var m=!k.width&&!k.height;if(m&&!k.left&&k.top){k.top=null}else{if(m&&!k.top&&k.left){k.left=null}}return k},_proportionallyResize:function(){var j=this.options;if(!this._proportionallyResizeElements.length){return}var f=this.helper||this.element;for(var e=0;e<this._proportionallyResizeElements.length;e++){var g=this._proportionallyResizeElements[e];if(!this.borderDif){var d=[g.css("borderTopWidth"),g.css("borderRightWidth"),g.css("borderBottomWidth"),g.css("borderLeftWidth")],h=[g.css("paddingTop"),g.css("paddingRight"),g.css("paddingBottom"),g.css("paddingLeft")];this.borderDif=c.map(d,function(k,m){var l=parseInt(k,10)||0,n=parseInt(h[m],10)||0;return l+n})}if(c.browser.msie&&!(!(c(f).is(":hidden")||c(f).parents(":hidden").length))){continue}g.css({height:(f.height()-this.borderDif[0]-this.borderDif[2])||0,width:(f.width()-this.borderDif[1]-this.borderDif[3])||0})}},_renderProxy:function(){var e=this.element,h=this.options;this.elementOffset=e.offset();if(this._helper){this.helper=this.helper||c('<div style="overflow:hidden;"></div>');var d=c.browser.msie&&c.browser.version<7,f=(d?1:0),g=(d?2:-1);this.helper.addClass(this._helper).css({width:this.element.outerWidth()+g,height:this.element.outerHeight()+g,position:"absolute",left:this.elementOffset.left-f+"px",top:this.elementOffset.top-f+"px",zIndex:++h.zIndex});this.helper.appendTo("body").disableSelection()}else{this.helper=this.element}},_change:{e:function(f,e,d){return{width:this.originalSize.width+e}},w:function(g,e,d){var i=this.options,f=this.originalSize,h=this.originalPosition;return{left:h.left+e,width:f.width-e}},n:function(g,e,d){var i=this.options,f=this.originalSize,h=this.originalPosition;return{top:h.top+d,height:f.height-d}},s:function(f,e,d){return{height:this.originalSize.height+d}},se:function(f,e,d){return c.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[f,e,d]))},sw:function(f,e,d){return c.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[f,e,d]))},ne:function(f,e,d){return c.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[f,e,d]))},nw:function(f,e,d){return c.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[f,e,d]))}},_propagate:function(e,d){c.ui.plugin.call(this,e,[d,this.ui()]);(e!="resize"&&this._trigger(e,d,this.ui()))},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}));c.extend(c.ui.resizable,{version:"1.7.2",eventPrefix:"resize",defaults:{alsoResize:false,animate:false,animateDuration:"slow",animateEasing:"swing",aspectRatio:false,autoHide:false,cancel:":input,option",containment:false,delay:0,distance:1,ghost:false,grid:false,handles:"e,s,se",helper:false,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:1000}});c.ui.plugin.add("resizable","alsoResize",{start:function(e,f){var d=c(this).data("resizable"),g=d.options;_store=function(h){c(h).each(function(){c(this).data("resizable-alsoresize",{width:parseInt(c(this).width(),10),height:parseInt(c(this).height(),10),left:parseInt(c(this).css("left"),10),top:parseInt(c(this).css("top"),10)})})};if(typeof(g.alsoResize)=="object"&&!g.alsoResize.parentNode){if(g.alsoResize.length){g.alsoResize=g.alsoResize[0];_store(g.alsoResize)}else{c.each(g.alsoResize,function(h,i){_store(h)})}}else{_store(g.alsoResize)}},resize:function(f,h){var e=c(this).data("resizable"),i=e.options,g=e.originalSize,k=e.originalPosition;var j={height:(e.size.height-g.height)||0,width:(e.size.width-g.width)||0,top:(e.position.top-k.top)||0,left:(e.position.left-k.left)||0},d=function(l,m){c(l).each(function(){var p=c(this),q=c(this).data("resizable-alsoresize"),o={},n=m&&m.length?m:["width","height","top","left"];c.each(n||["width","height","top","left"],function(r,t){var s=(q[t]||0)+(j[t]||0);if(s&&s>=0){o[t]=s||null}});if(/relative/.test(p.css("position"))&&c.browser.opera){e._revertToRelativePosition=true;p.css({position:"absolute",top:"auto",left:"auto"})}p.css(o)})};if(typeof(i.alsoResize)=="object"&&!i.alsoResize.nodeType){c.each(i.alsoResize,function(l,m){d(l,m)})}else{d(i.alsoResize)}},stop:function(e,f){var d=c(this).data("resizable");if(d._revertToRelativePosition&&c.browser.opera){d._revertToRelativePosition=false;el.css({position:"relative"})}c(this).removeData("resizable-alsoresize-start")}});c.ui.plugin.add("resizable","animate",{stop:function(h,m){var n=c(this).data("resizable"),i=n.options;var g=n._proportionallyResizeElements,d=g.length&&(/textarea/i).test(g[0].nodeName),e=d&&c.ui.hasScroll(g[0],"left")?0:n.sizeDiff.height,k=d?0:n.sizeDiff.width;var f={width:(n.size.width-k),height:(n.size.height-e)},j=(parseInt(n.element.css("left"),10)+(n.position.left-n.originalPosition.left))||null,l=(parseInt(n.element.css("top"),10)+(n.position.top-n.originalPosition.top))||null;n.element.animate(c.extend(f,l&&j?{top:l,left:j}:{}),{duration:i.animateDuration,easing:i.animateEasing,step:function(){var o={width:parseInt(n.element.css("width"),10),height:parseInt(n.element.css("height"),10),top:parseInt(n.element.css("top"),10),left:parseInt(n.element.css("left"),10)};if(g&&g.length){c(g[0]).css({width:o.width,height:o.height})}n._updateCache(o);n._propagate("resize",h)}})}});c.ui.plugin.add("resizable","containment",{start:function(e,q){var s=c(this).data("resizable"),i=s.options,k=s.element;var f=i.containment,j=(f instanceof c)?f.get(0):(/parent/.test(f))?k.parent().get(0):f;if(!j){return}s.containerElement=c(j);if(/document/.test(f)||f==document){s.containerOffset={left:0,top:0};s.containerPosition={left:0,top:0};s.parentData={element:c(document),left:0,top:0,width:c(document).width(),height:c(document).height()||document.body.parentNode.scrollHeight}}else{var m=c(j),h=[];c(["Top","Right","Left","Bottom"]).each(function(p,o){h[p]=b(m.css("padding"+o))});s.containerOffset=m.offset();s.containerPosition=m.position();s.containerSize={height:(m.innerHeight()-h[3]),width:(m.innerWidth()-h[1])};var n=s.containerOffset,d=s.containerSize.height,l=s.containerSize.width,g=(c.ui.hasScroll(j,"left")?j.scrollWidth:l),r=(c.ui.hasScroll(j)?j.scrollHeight:d);s.parentData={element:j,left:n.left,top:n.top,width:g,height:r}}},resize:function(f,p){var s=c(this).data("resizable"),h=s.options,e=s.containerSize,n=s.containerOffset,l=s.size,m=s.position,q=s._aspectRatio||f.shiftKey,d={top:0,left:0},g=s.containerElement;if(g[0]!=document&&(/static/).test(g.css("position"))){d=n}if(m.left<(s._helper?n.left:0)){s.size.width=s.size.width+(s._helper?(s.position.left-n.left):(s.position.left-d.left));if(q){s.size.height=s.size.width/h.aspectRatio}s.position.left=h.helper?n.left:0}if(m.top<(s._helper?n.top:0))
+{s.size.height=s.size.height+(s._helper?(s.position.top-n.top):s.position.top);if(q){s.size.width=s.size.height*h.aspectRatio}s.position.top=s._helper?n.top:0}s.offset.left=s.parentData.left+s.position.left;s.offset.top=s.parentData.top+s.position.top;var k=Math.abs((s._helper?s.offset.left-d.left:(s.offset.left-d.left))+s.sizeDiff.width),r=Math.abs((s._helper?s.offset.top-d.top:(s.offset.top-n.top))+s.sizeDiff.height);var j=s.containerElement.get(0)==s.element.parent().get(0),i=/relative|absolute/.test(s.containerElement.css("position"));if(j&&i){k-=s.parentData.left}if(k+s.size.width>=s.parentData.width){s.size.width=s.parentData.width-k;if(q){s.size.height=s.size.width/s.aspectRatio}}if(r+s.size.height>=s.parentData.height){s.size.height=s.parentData.height-r;if(q){s.size.width=s.size.height*s.aspectRatio}}},stop:function(e,m){var p=c(this).data("resizable"),f=p.options,k=p.position,l=p.containerOffset,d=p.containerPosition,g=p.containerElement;var i=c(p.helper),q=i.offset(),n=i.outerWidth()-p.sizeDiff.width,j=i.outerHeight()-p.sizeDiff.height;if(p._helper&&!f.animate&&(/relative/).test(g.css("position"))){c(this).css({left:q.left-d.left-l.left,width:n,height:j})}if(p._helper&&!f.animate&&(/static/).test(g.css("position"))){c(this).css({left:q.left-d.left-l.left,width:n,height:j})}}});c.ui.plugin.add("resizable","ghost",{start:function(f,g){var d=c(this).data("resizable"),h=d.options,e=d.size;d.ghost=d.originalElement.clone();d.ghost.css({opacity:0.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof h.ghost=="string"?h.ghost:"");d.ghost.appendTo(d.helper)},resize:function(e,f){var d=c(this).data("resizable"),g=d.options;if(d.ghost){d.ghost.css({position:"relative",height:d.size.height,width:d.size.width})}},stop:function(e,f){var d=c(this).data("resizable"),g=d.options;if(d.ghost&&d.helper){d.helper.get(0).removeChild(d.ghost.get(0))}}});c.ui.plugin.add("resizable","grid",{resize:function(d,l){var n=c(this).data("resizable"),g=n.options,j=n.size,h=n.originalSize,i=n.originalPosition,m=n.axis,k=g._aspectRatio||d.shiftKey;g.grid=typeof g.grid=="number"?[g.grid,g.grid]:g.grid;var f=Math.round((j.width-h.width)/(g.grid[0]||1))*(g.grid[0]||1),e=Math.round((j.height-h.height)/(g.grid[1]||1))*(g.grid[1]||1);if(/^(se|s|e)$/.test(m)){n.size.width=h.width+f;n.size.height=h.height+e}else{if(/^(ne)$/.test(m)){n.size.width=h.width+f;n.size.height=h.height+e;n.position.top=i.top-e}else{if(/^(sw)$/.test(m)){n.size.width=h.width+f;n.size.height=h.height+e;n.position.left=i.left-f}else{n.size.width=h.width+f;n.size.height=h.height+e;n.position.top=i.top-e;n.position.left=i.left-f}}}}});var b=function(d){return parseInt(d,10)||0};var a=function(d){return !isNaN(parseInt(d,10))}})(jQuery);;
+/**
+ * jQuery.ScrollTo - Easy element scrolling using jQuery.
+ * Copyright (c) 2008 Ariel Flesler - aflesler(at)gmail(dot)com
+ * Licensed under GPL license (http://www.opensource.org/licenses/gpl-license.php).
+ * Date: 2/8/2008
+ * @author Ariel Flesler
+ * @version 1.3.2
+ */
+;(function($){var o=$.scrollTo=function(a,b,c){o.window().scrollTo(a,b,c)};o.defaults={axis:'y',duration:1};o.window=function(){return $($.browser.safari?'body':'html')};$.fn.scrollTo=function(l,m,n){if(typeof m=='object'){n=m;m=0}n=$.extend({},o.defaults,n);m=m||n.speed||n.duration;n.queue=n.queue&&n.axis.length>1;if(n.queue)m/=2;n.offset=j(n.offset);n.over=j(n.over);return this.each(function(){var a=this,b=$(a),t=l,c,d={},w=b.is('html,body');switch(typeof t){case'number':case'string':if(/^([+-]=)?\d+(px)?$/.test(t)){t=j(t);break}t=$(t,this);case'object':if(t.is||t.style)c=(t=$(t)).offset()}$.each(n.axis.split(''),function(i,f){var P=f=='x'?'Left':'Top',p=P.toLowerCase(),k='scroll'+P,e=a[k],D=f=='x'?'Width':'Height';if(c){d[k]=c[p]+(w?0:e-b.offset()[p]);if(n.margin){d[k]-=parseInt(t.css('margin'+P))||0;d[k]-=parseInt(t.css('border'+P+'Width'))||0}d[k]+=n.offset[p]||0;if(n.over[p])d[k]+=t[D.toLowerCase()]()*n.over[p]}else d[k]=t[p];if(/^\d+$/.test(d[k]))d[k]=d[k]<=0?0:Math.min(d[k],h(D));if(!i&&n.queue){if(e!=d[k])g(n.onAfterFirst);delete d[k]}});g(n.onAfter);function g(a){b.animate(d,m,n.easing,a&&function(){a.call(this,l)})};function h(D){var b=w?$.browser.opera?document.body:document.documentElement:a;return b['scroll'+D]-b['client'+D]}})};function j(a){return typeof a=='object'?a:{top:a,left:a}}})(jQuery);
+
diff --git a/native_client_sdk/doc_generated/pepper_stable/cpp/namespacepp.html b/native_client_sdk/doc_generated/pepper_stable/cpp/namespacepp.html
index e888367..c003388 100644
--- a/native_client_sdk/doc_generated/pepper_stable/cpp/namespacepp.html
+++ b/native_client_sdk/doc_generated/pepper_stable/cpp/namespacepp.html
@@ -119,6 +119,8 @@
 <tr><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_video_frame.html">VideoFrame</a></td></tr>
 <tr><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_view.html">View</a></td></tr>
 <tr><td class="mdescLeft">&#160;</td><td class="mdescRight">This class represents the state of the view for an instance and contains functions for retrieving the current state of that view.  <a href="classpp_1_1_view.html#details">More...</a><br /></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_vpn_provider.html">VpnProvider</a></td></tr>
+<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The <code><a class="el" href="classpp_1_1_vpn_provider.html" title="The VpnProvider class enhances the chrome.vpnProvider JavaScript API by providing a high performance ...">VpnProvider</a></code> class enhances the <code>chrome.vpnProvider</code> JavaScript API by providing a high performance path for packet handling.  <a href="classpp_1_1_vpn_provider.html#details">More...</a><br /></td></tr>
 <tr><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_web_socket.html">WebSocket</a></td></tr>
 <tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The <code><a class="el" href="classpp_1_1_web_socket.html" title="The WebSocket class providing bi-directional, full-duplex, communications over a single TCP socket...">WebSocket</a></code> class providing bi-directional, full-duplex, communications over a single TCP socket.  <a href="classpp_1_1_web_socket.html#details">More...</a><br /></td></tr>
 <tr><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_completion_callback_factory.html">CompletionCallbackFactory</a></td></tr>
diff --git a/native_client_sdk/doc_generated/pepper_stable/cpp/vpn__provider_8h.html b/native_client_sdk/doc_generated/pepper_stable/cpp/vpn__provider_8h.html
new file mode 100644
index 0000000..9fe2c2c
--- /dev/null
+++ b/native_client_sdk/doc_generated/pepper_stable/cpp/vpn__provider_8h.html
@@ -0,0 +1,33 @@
+{{+bindTo:partials.standard_nacl_api}}
+<h1>vpn_provider.h File Reference</h1>
+<div id="doxygen-ref">
+{{- dummy div to appease doxygen -}}
+  <div>
+<!-- Generated by Doxygen 1.7.6.1 -->
+
+
+</div>
+<!--header-->
+<div class="contents">
+<div class="textblock"><div class="dynheader">
+Include dependency graph for vpn_provider.h:</div>
+<div class="dyncontent">
+<div class="center"><img src="vpn__provider_8h__incl.png" border="0" usemap="#vpn__provider_8h" alt="" /></div>
+<map name="vpn__provider_8h" id="vpn__provider_8h">
+</map>
+</div>
+</div><h2>
+Classes</h2><table class="memberdecls">
+
+<tr><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_vpn_provider.html">pp::VpnProvider</a></td></tr>
+<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The <code><a class="el" href="classpp_1_1_vpn_provider.html" title="The VpnProvider class enhances the chrome.vpnProvider JavaScript API by providing a high performance ...">VpnProvider</a></code> class enhances the <code>chrome.vpnProvider</code> JavaScript API by providing a high performance path for packet handling.  <a href="classpp_1_1_vpn_provider.html#details">More...</a><br /></td></tr>
+</table><h2>
+Namespaces</h2><table class="memberdecls">
+<tr><td class="memItemLeft" align="right" valign="top">namespace &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacepp.html">pp</a></td></tr>
+</table>
+<hr /><a name="details" id="details"></a><h2>Detailed Description</h2>
+<div class="textblock"><p>This file defines the VpnProvider interface providing a way to implement a VPN client. </p>
+<p>Important: This API is available only on Chrome OS. </p>
+</div></div><!-- contents -->
+</div>
+{{/partials.standard_nacl_api}}
diff --git a/native_client_sdk/doc_generated/pepper_stable/cpp/vpn__provider_8h__incl.png b/native_client_sdk/doc_generated/pepper_stable/cpp/vpn__provider_8h__incl.png
new file mode 100644
index 0000000..35015c16
--- /dev/null
+++ b/native_client_sdk/doc_generated/pepper_stable/cpp/vpn__provider_8h__incl.png
Binary files differ
diff --git a/native_client_sdk/doc_generated/pepper_stable/index.html b/native_client_sdk/doc_generated/pepper_stable/index.html
index 6826f7b..d148ca7 100644
--- a/native_client_sdk/doc_generated/pepper_stable/index.html
+++ b/native_client_sdk/doc_generated/pepper_stable/index.html
@@ -1,9 +1,17 @@
 {{+bindTo:partials.standard_nacl_article}}
 
-<section id="pepper-api-reference-stable">
+<b><font color="#cc0000">
+NOTE:
+Deprecation of the technologies described here has been announced
+for platforms other than ChromeOS.<br/>
+Please visit our
+<a href="/native-client/migration">migration guide</a>
+for details.
+</font></b>
+<hr/><section id="pepper-api-reference-stable">
 <h1 id="pepper-api-reference-stable">Pepper API Reference (Stable)</h1>
-<p>This page lists the API for Pepper 48. Apps that use this API can
-run in Chrome 48 or higher.</p>
+<p>This page lists the API for Pepper 58. Apps that use this API can
+run in Chrome 58 or higher.</p>
 <h2 id="pepper-c-api-reference"><a class="reference internal" href="/native-client/c-api.html#pepper-stable-c-index"><em>Pepper C API Reference</em></a></h2>
 <h2 id="id1"><a class="reference internal" href="/native-client/cpp-api.html#pepper-stable-cpp-index"><em>Pepper C++ API Reference</em></a></h2>
 </section>
diff --git a/native_client_sdk/doc_generated/publications-and-presentations.html b/native_client_sdk/doc_generated/publications-and-presentations.html
index 0d97aa1a4..f0f9c218 100644
--- a/native_client_sdk/doc_generated/publications-and-presentations.html
+++ b/native_client_sdk/doc_generated/publications-and-presentations.html
@@ -1,7 +1,15 @@
 {{+bindTo:partials.standard_nacl_article}}
 
-<section id="publications-and-presentations">
-<span id="id1"></span><h1 id="publications-and-presentations"><span id="id1"></span>Publications and Presentations</h1>
+<b><font color="#cc0000">
+NOTE:
+Deprecation of the technologies described here has been announced
+for platforms other than ChromeOS.<br/>
+Please visit our
+<a href="/native-client/migration">migration guide</a>
+for details.
+</font></b>
+<hr/><section id="id1">
+<h1 id="id1">Publications and Presentations</h1>
 <p>This page lists Native Client and Portable Native Client talks, demos,
 and publications from various conferences and academic symposiums.</p>
 <h2 id="recent-talks-and-demos">Recent talks and demos</h2>
diff --git a/native_client_sdk/doc_generated/quick-start.html b/native_client_sdk/doc_generated/quick-start.html
index 8535f2de9..0b8f72b9 100644
--- a/native_client_sdk/doc_generated/quick-start.html
+++ b/native_client_sdk/doc_generated/quick-start.html
@@ -1,7 +1,15 @@
 {{+bindTo:partials.standard_nacl_article}}
 
-<section id="quick-start">
-<span id="id1"></span><h1 id="quick-start"><span id="id1"></span>Quick-start</h1>
+<b><font color="#cc0000">
+NOTE:
+Deprecation of the technologies described here has been announced
+for platforms other than ChromeOS.<br/>
+Please visit our
+<a href="/native-client/migration">migration guide</a>
+for details.
+</font></b>
+<hr/><section id="id1">
+<h1 id="id1">Quick-start</h1>
 <p>To get started with Native Client:</p>
 <ol class="arabic simple">
 <li>Read the <a class="reference internal" href="/native-client/overview.html"><em>Technical Overview</em></a> to understand what Native
diff --git a/native_client_sdk/doc_generated/reference/design-docs.html b/native_client_sdk/doc_generated/reference/design-docs.html
index aa5b1ed..cee97762 100644
--- a/native_client_sdk/doc_generated/reference/design-docs.html
+++ b/native_client_sdk/doc_generated/reference/design-docs.html
@@ -1,6 +1,14 @@
 {{+bindTo:partials.standard_nacl_article}}
 
-<section id="design-documents">
+<b><font color="#cc0000">
+NOTE:
+Deprecation of the technologies described here has been announced
+for platforms other than ChromeOS.<br/>
+Please visit our
+<a href="/native-client/migration">migration guide</a>
+for details.
+</font></b>
+<hr/><section id="design-documents">
 <h1 id="design-documents">Design Documents</h1>
 <p>This is a list of design documents for Native Client.  This list
 generally covers designs that were implemented.  It does not cover
diff --git a/native_client_sdk/doc_generated/reference/ideas.html b/native_client_sdk/doc_generated/reference/ideas.html
index 2c30c64..754844e07 100644
--- a/native_client_sdk/doc_generated/reference/ideas.html
+++ b/native_client_sdk/doc_generated/reference/ideas.html
@@ -1,7 +1,15 @@
 {{+bindTo:partials.standard_nacl_article}}
 
-<section id="contributor-ideas">
-<span id="ideas"></span><h1 id="contributor-ideas"><span id="ideas"></span>Contributor Ideas</h1>
+<b><font color="#cc0000">
+NOTE:
+Deprecation of the technologies described here has been announced
+for platforms other than ChromeOS.<br/>
+Please visit our
+<a href="/native-client/migration">migration guide</a>
+for details.
+</font></b>
+<hr/><section id="contributor-ideas">
+<h1 id="contributor-ideas">Contributor Ideas</h1>
 <div class="contents local" id="contents" style="display: none">
 <ul class="small-gap">
 <li><a class="reference internal" href="#contributing-me" id="id9">Contributing? Me‽</a></li>
diff --git a/native_client_sdk/doc_generated/reference/index.html b/native_client_sdk/doc_generated/reference/index.html
index 9c1ba8b1..10d2aad 100644
--- a/native_client_sdk/doc_generated/reference/index.html
+++ b/native_client_sdk/doc_generated/reference/index.html
@@ -1,6 +1,14 @@
 {{+bindTo:partials.standard_nacl_article}}
 
-<section id="reference">
+<b><font color="#cc0000">
+NOTE:
+Deprecation of the technologies described here has been announced
+for platforms other than ChromeOS.<br/>
+Please visit our
+<a href="/native-client/migration">migration guide</a>
+for details.
+</font></b>
+<hr/><section id="reference">
 <h1 id="reference">Reference</h1>
 <p>The reference section includes more in-depth details about some aspects of
 developing with Native Client, such as the NaCl manifest file format. In
diff --git a/native_client_sdk/doc_generated/reference/nacl-manifest-format.html b/native_client_sdk/doc_generated/reference/nacl-manifest-format.html
index 69de516f..5491b2a 100644
--- a/native_client_sdk/doc_generated/reference/nacl-manifest-format.html
+++ b/native_client_sdk/doc_generated/reference/nacl-manifest-format.html
@@ -1,6 +1,14 @@
 {{+bindTo:partials.standard_nacl_article}}
 
-<section id="native-client-manifest-nmf-format">
+<b><font color="#cc0000">
+NOTE:
+Deprecation of the technologies described here has been announced
+for platforms other than ChromeOS.<br/>
+Please visit our
+<a href="/native-client/migration">migration guide</a>
+for details.
+</font></b>
+<hr/><section id="native-client-manifest-nmf-format">
 <h1 id="native-client-manifest-nmf-format">Native Client Manifest (nmf) Format</h1>
 <div class="contents local" id="contents" style="display: none">
 <ul class="small-gap">
diff --git a/native_client_sdk/doc_generated/reference/pnacl-bitcode-abi.html b/native_client_sdk/doc_generated/reference/pnacl-bitcode-abi.html
index 6367b419..dbb8f9c4 100644
--- a/native_client_sdk/doc_generated/reference/pnacl-bitcode-abi.html
+++ b/native_client_sdk/doc_generated/reference/pnacl-bitcode-abi.html
@@ -1,6 +1,14 @@
 {{+bindTo:partials.standard_nacl_article}}
 
-<section id="pnacl-bitcode-reference-manual">
+<b><font color="#cc0000">
+NOTE:
+Deprecation of the technologies described here has been announced
+for platforms other than ChromeOS.<br/>
+Please visit our
+<a href="/native-client/migration">migration guide</a>
+for details.
+</font></b>
+<hr/><section id="pnacl-bitcode-reference-manual">
 <h1 id="pnacl-bitcode-reference-manual">PNaCl Bitcode Reference Manual</h1>
 <div class="contents local" id="contents" style="display: none">
 <ul class="small-gap">
diff --git a/native_client_sdk/doc_generated/reference/pnacl-bitcode-manual.html b/native_client_sdk/doc_generated/reference/pnacl-bitcode-manual.html
index 8e28f8e..20063f67 100644
--- a/native_client_sdk/doc_generated/reference/pnacl-bitcode-manual.html
+++ b/native_client_sdk/doc_generated/reference/pnacl-bitcode-manual.html
@@ -1,6 +1,14 @@
 {{+bindTo:partials.standard_nacl_article}}
 
-<section id="contents-of-pnacl-bitcode-files">
+<b><font color="#cc0000">
+NOTE:
+Deprecation of the technologies described here has been announced
+for platforms other than ChromeOS.<br/>
+Please visit our
+<a href="/native-client/migration">migration guide</a>
+for details.
+</font></b>
+<hr/><section id="contents-of-pnacl-bitcode-files">
 <h1 id="contents-of-pnacl-bitcode-files">Contents Of PNaCl Bitcode Files</h1>
 <div class="contents local" id="contents" style="display: none">
 <ul class="small-gap">
diff --git a/native_client_sdk/doc_generated/reference/pnacl-c-cpp-language-support.html b/native_client_sdk/doc_generated/reference/pnacl-c-cpp-language-support.html
index 6d9a8e0..e7250d6 100644
--- a/native_client_sdk/doc_generated/reference/pnacl-c-cpp-language-support.html
+++ b/native_client_sdk/doc_generated/reference/pnacl-c-cpp-language-support.html
@@ -1,6 +1,14 @@
 {{+bindTo:partials.standard_nacl_article}}
 
-<section id="pnacl-c-c-language-support">
+<b><font color="#cc0000">
+NOTE:
+Deprecation of the technologies described here has been announced
+for platforms other than ChromeOS.<br/>
+Please visit our
+<a href="/native-client/migration">migration guide</a>
+for details.
+</font></b>
+<hr/><section id="pnacl-c-c-language-support">
 <h1 id="pnacl-c-c-language-support">PNaCl C/C++ Language Support</h1>
 <div class="contents local" id="contents" style="display: none">
 <ul class="small-gap">
diff --git a/native_client_sdk/doc_generated/reference/pnacl-undefined-behavior.html b/native_client_sdk/doc_generated/reference/pnacl-undefined-behavior.html
index d584d67..6479fd2a 100644
--- a/native_client_sdk/doc_generated/reference/pnacl-undefined-behavior.html
+++ b/native_client_sdk/doc_generated/reference/pnacl-undefined-behavior.html
@@ -1,6 +1,14 @@
 {{+bindTo:partials.standard_nacl_article}}
 
-<section id="pnacl-undefined-behavior">
+<b><font color="#cc0000">
+NOTE:
+Deprecation of the technologies described here has been announced
+for platforms other than ChromeOS.<br/>
+Please visit our
+<a href="/native-client/migration">migration guide</a>
+for details.
+</font></b>
+<hr/><section id="pnacl-undefined-behavior">
 <h1 id="pnacl-undefined-behavior">PNaCl Undefined Behavior</h1>
 <div class="contents local" id="contents" style="display: none">
 <ul class="small-gap">
diff --git a/native_client_sdk/doc_generated/reference/sandbox_internals/arm-32-bit-sandbox.html b/native_client_sdk/doc_generated/reference/sandbox_internals/arm-32-bit-sandbox.html
index d55851fe..b279b1f 100644
--- a/native_client_sdk/doc_generated/reference/sandbox_internals/arm-32-bit-sandbox.html
+++ b/native_client_sdk/doc_generated/reference/sandbox_internals/arm-32-bit-sandbox.html
@@ -1,7 +1,15 @@
 {{+bindTo:partials.standard_nacl_article}}
 
-<section id="arm-32-bit-sandbox">
-<span id="id1"></span><h1 id="arm-32-bit-sandbox"><span id="id1"></span>ARM 32-bit Sandbox</h1>
+<b><font color="#cc0000">
+NOTE:
+Deprecation of the technologies described here has been announced
+for platforms other than ChromeOS.<br/>
+Please visit our
+<a href="/native-client/migration">migration guide</a>
+for details.
+</font></b>
+<hr/><section id="id1">
+<h1 id="id1">ARM 32-bit Sandbox</h1>
 <p>Native Client for ARM is a sandboxing technology for running
 programs&#8212;even malicious ones&#8212;safely, on computers that use 32-bit
 ARM processors. The ARM sandbox is an extension of earlier work on
diff --git a/native_client_sdk/doc_generated/reference/sandbox_internals/index.html b/native_client_sdk/doc_generated/reference/sandbox_internals/index.html
index 672a44ca..e6bd82c 100644
--- a/native_client_sdk/doc_generated/reference/sandbox_internals/index.html
+++ b/native_client_sdk/doc_generated/reference/sandbox_internals/index.html
@@ -1,7 +1,15 @@
 {{+bindTo:partials.standard_nacl_article}}
 
-<section id="sandbox-internals">
-<span id="sandbox-internals-index"></span><h1 id="sandbox-internals"><span id="sandbox-internals-index"></span>Sandbox Internals</h1>
+<b><font color="#cc0000">
+NOTE:
+Deprecation of the technologies described here has been announced
+for platforms other than ChromeOS.<br/>
+Please visit our
+<a href="/native-client/migration">migration guide</a>
+for details.
+</font></b>
+<hr/><section id="sandbox-internals">
+<h1 id="sandbox-internals">Sandbox Internals</h1>
 <p>The sandbox internals documentation describes implementation details for
 Native Client sandboxing, which is also used by Portable Native
 Client. These details can be useful to reimplement a sandbox, or to
diff --git a/native_client_sdk/doc_generated/reference/sandbox_internals/x86-64-sandbox.html b/native_client_sdk/doc_generated/reference/sandbox_internals/x86-64-sandbox.html
index b24d24e3..0817410 100644
--- a/native_client_sdk/doc_generated/reference/sandbox_internals/x86-64-sandbox.html
+++ b/native_client_sdk/doc_generated/reference/sandbox_internals/x86-64-sandbox.html
@@ -1,7 +1,15 @@
 {{+bindTo:partials.standard_nacl_article}}
 
-<section id="nacl-sfi-model-on-x86-64-systems">
-<span id="x86-64-sandbox"></span><h1 id="nacl-sfi-model-on-x86-64-systems"><span id="x86-64-sandbox"></span>NaCl SFI model on x86-64 systems</h1>
+<b><font color="#cc0000">
+NOTE:
+Deprecation of the technologies described here has been announced
+for platforms other than ChromeOS.<br/>
+Please visit our
+<a href="/native-client/migration">migration guide</a>
+for details.
+</font></b>
+<hr/><section id="nacl-sfi-model-on-x86-64-systems">
+<h1 id="nacl-sfi-model-on-x86-64-systems">NaCl SFI model on x86-64 systems</h1>
 <div class="contents local" id="contents" style="display: none">
 <ul class="small-gap">
 <li><a class="reference internal" href="#summary" id="id5">Summary</a></li>
diff --git a/native_client_sdk/doc_generated/sdk/download.html b/native_client_sdk/doc_generated/sdk/download.html
index 6052da14..8ec27a9 100644
--- a/native_client_sdk/doc_generated/sdk/download.html
+++ b/native_client_sdk/doc_generated/sdk/download.html
@@ -1,7 +1,15 @@
 {{+bindTo:partials.standard_nacl_article}}
 
-<section id="download-the-native-client-sdk">
-<span id="download"></span><h1 id="download-the-native-client-sdk"><span id="download"></span>Download the Native Client SDK</h1>
+<b><font color="#cc0000">
+NOTE:
+Deprecation of the technologies described here has been announced
+for platforms other than ChromeOS.<br/>
+Please visit our
+<a href="/native-client/migration">migration guide</a>
+for details.
+</font></b>
+<hr/><section id="download-the-native-client-sdk">
+<h1 id="download-the-native-client-sdk">Download the Native Client SDK</h1>
 <p>This page provides an overview of the Native Client SDK, and instructions for
 downloading and installing the SDK.</p>
 <div id="home">
diff --git a/native_client_sdk/doc_generated/sdk/examples.html b/native_client_sdk/doc_generated/sdk/examples.html
index 4c49810..9122cfa 100644
--- a/native_client_sdk/doc_generated/sdk/examples.html
+++ b/native_client_sdk/doc_generated/sdk/examples.html
@@ -1,6 +1,14 @@
 {{+bindTo:partials.standard_nacl_article}}
 
-<span class="target" id="sdk-examples-2"></span><section id="examples">
+<span class="target" id="sdk-examples-2"></span><b><font color="#cc0000">
+NOTE:
+Deprecation of the technologies described here has been announced
+for platforms other than ChromeOS.<br/>
+Please visit our
+<a href="/native-client/migration">migration guide</a>
+for details.
+</font></b>
+<hr/><section id="examples">
 <h1 id="examples">Examples</h1>
 <p>Every Native Client SDK bundle comes with a folder of example applications.
 Each example demonstrates one or two key Native Client programming concepts.
diff --git a/native_client_sdk/doc_generated/sdk/release-notes.html b/native_client_sdk/doc_generated/sdk/release-notes.html
index 1d2b8a5a..b59cb28 100644
--- a/native_client_sdk/doc_generated/sdk/release-notes.html
+++ b/native_client_sdk/doc_generated/sdk/release-notes.html
@@ -1,7 +1,15 @@
 {{+bindTo:partials.standard_nacl_article}}
 
-<section id="release-notes">
-<span id="sdk-release-notes"></span><h1 id="release-notes"><span id="sdk-release-notes"></span>Release Notes</h1>
+<b><font color="#cc0000">
+NOTE:
+Deprecation of the technologies described here has been announced
+for platforms other than ChromeOS.<br/>
+Please visit our
+<a href="/native-client/migration">migration guide</a>
+for details.
+</font></b>
+<hr/><section id="release-notes">
+<h1 id="release-notes">Release Notes</h1>
 <p>The dates in the following release notes denote when Chrome and the NaCl SDK
 reached canary status. The stable release is typically 6 weeks later.</p>
 <h2 id="chrome-pepper-49">Chrome/Pepper 49</h2>
@@ -37,7 +45,7 @@
 browser (version <code>Y</code>).</li>
 <li>PNaCl&#8217;s support for use of libstdc++ 4.6 as the C++ standard library is
 deprecated and will be removed in the next release. PNaCl has used libc++
-(which is much more up-to-date, currently based on LLVM 3.6) as the default
+(which is much more up to date, currently based on LLVM 3.6) as the default
 since Pepper 33.</li>
 <li>PNaCl&#8217;s experimental <a class="reference external" href="https://chromium.googlesource.com/native_client/pnacl-subzero/+/master/README.rst">Subzero translator</a> is available for x86-32 NaCl in
 Chrome version 43, behind a flag. To give it a try, run Chrome with the
diff --git a/native_client_sdk/doc_generated/sitemap.html b/native_client_sdk/doc_generated/sitemap.html
index 3a6f511..ef834f9d 100644
--- a/native_client_sdk/doc_generated/sitemap.html
+++ b/native_client_sdk/doc_generated/sitemap.html
@@ -1,6 +1,14 @@
 {{+bindTo:partials.standard_nacl_article}}
 
-<section id="native-client-documentation-sitemap">
+<b><font color="#cc0000">
+NOTE:
+Deprecation of the technologies described here has been announced
+for platforms other than ChromeOS.<br/>
+Please visit our
+<a href="/native-client/migration">migration guide</a>
+for details.
+</font></b>
+<hr/><section id="native-client-documentation-sitemap">
 <h1 id="native-client-documentation-sitemap">Native Client Documentation Sitemap</h1>
 <p>Contents:</p>
 <div class="toctree-wrapper compound">
@@ -22,6 +30,15 @@
 <li class="toctree-l2"><a class="reference internal" href="/native-client/nacl-and-pnacl.html#when-to-use-nacl">When to use NaCl</a></li>
 </ul>
 </li>
+<li class="toctree-l1"><a class="reference internal" href="/native-client/migration/index.html">WebAssembly Migration Guide</a><ul class="small-gap">
+<li class="toctree-l2"><a class="reference internal" href="/native-client/migration/index.html#p-nacl-deprecation-announcements">(P)NaCl Deprecation Announcements</a></li>
+<li class="toctree-l2"><a class="reference internal" href="/native-client/migration/index.html#toolchain-migration">Toolchain Migration</a></li>
+<li class="toctree-l2"><a class="reference internal" href="/native-client/migration/index.html#api-migration">API Migration</a></li>
+<li class="toctree-l2"><a class="reference internal" href="/native-client/migration/index.html#ppapi">PPAPI</a></li>
+<li class="toctree-l2"><a class="reference internal" href="/native-client/migration/index.html#irt">IRT</a></li>
+<li class="toctree-l2"><a class="reference internal" href="/native-client/migration/index.html#ppapi-apps">PPAPI (Apps)</a></li>
+</ul>
+</li>
 <li class="toctree-l1"><a class="reference internal" href="/native-client/glossary.html">Glossary</a></li>
 <li class="toctree-l1"><a class="reference internal" href="/native-client/sdk/download.html">Download the Native Client SDK</a><ul class="small-gap">
 <li class="toctree-l2"><a class="reference internal" href="/native-client/sdk/download.html#overview">Overview</a></li>
diff --git a/native_client_sdk/src/doc/_book.yaml b/native_client_sdk/src/doc/_book.yaml
index 075adfb..dbc215418 100644
--- a/native_client_sdk/src/doc/_book.yaml
+++ b/native_client_sdk/src/doc/_book.yaml
@@ -1,6 +1,8 @@
 toc:
 - title: "Version 31 (dev)"
   path: /native-client/dev/version
+- title: "API Migration Guide"
+  path: /native-client/deprecation/migration
 - title: "What is Native Client?"
   path: /native-client/dev/overview
 - title: "Demos"
diff --git a/native_client_sdk/src/doc/c-api-beta.rst b/native_client_sdk/src/doc/c-api-beta.rst
index f8211c4..259f6fc1 100644
--- a/native_client_sdk/src/doc/c-api-beta.rst
+++ b/native_client_sdk/src/doc/c-api-beta.rst
@@ -3,12 +3,14 @@
 
 .. DO NOT EDIT! This document is auto-generated by doxygen/rst_index.py.
 
+.. include:: /migration/deprecation.inc
+
 ##########################################
 Pepper C API Reference (Beta)
 ##########################################
 
-This page lists the C API for Pepper 49. Apps that use this API can
-run in Chrome 49 or higher.
+This page lists the C API for Pepper 59. Apps that use this API can
+run in Chrome 59 or higher.
 
 `Interfaces <pepper_beta/c/group___interfaces.html>`__
 =============================================================
@@ -38,7 +40,7 @@
 
   * `PPB_Gamepad <pepper_beta/c/struct_p_p_b___gamepad__1__0.html>`__
 
-  * `PPB_Graphics2D <pepper_beta/c/struct_p_p_b___graphics2_d__1__1.html>`__
+  * `PPB_Graphics2D <pepper_beta/c/struct_p_p_b___graphics2_d__1__2.html>`__
 
   * `PPB_Graphics3D <pepper_beta/c/struct_p_p_b___graphics3_d__1__0.html>`__
 
@@ -138,6 +140,8 @@
 
   * `PPB_View <pepper_beta/c/struct_p_p_b___view__1__2.html>`__
 
+  * `PPB_VpnProvider <pepper_beta/c/struct_p_p_b___vpn_provider__0__1.html>`__
+
   * `PPB_WebSocket <pepper_beta/c/struct_p_p_b___web_socket__1__0.html>`__
 
   * `PPB_WheelInputEvent <pepper_beta/c/struct_p_p_b___wheel_input_event__1__0.html>`__
@@ -360,6 +364,8 @@
 
   * `ppb_view.h <pepper_beta/c/ppb__view_8h.html>`__
 
+  * `ppb_vpn_provider.h <pepper_beta/c/ppb__vpn__provider_8h.html>`__
+
   * `ppb_websocket.h <pepper_beta/c/ppb__websocket_8h.html>`__
 
   * `ppp.h <pepper_beta/c/ppp_8h.html>`__
diff --git a/native_client_sdk/src/doc/c-api-dev.rst b/native_client_sdk/src/doc/c-api-dev.rst
index 2e3ec46..404f483 100644
--- a/native_client_sdk/src/doc/c-api-dev.rst
+++ b/native_client_sdk/src/doc/c-api-dev.rst
@@ -3,12 +3,14 @@
 
 .. DO NOT EDIT! This document is auto-generated by doxygen/rst_index.py.
 
+.. include:: /migration/deprecation.inc
+
 ##########################################
 Pepper C API Reference (Dev)
 ##########################################
 
-This page lists the C API for Pepper 50. Apps that use this API can
-run in Chrome 50 or higher.
+This page lists the C API for Pepper 60. Apps that use this API can
+run in Chrome 60 or higher.
 
 `Interfaces <pepper_dev/c/group___interfaces.html>`__
 =============================================================
@@ -38,7 +40,7 @@
 
   * `PPB_Gamepad <pepper_dev/c/struct_p_p_b___gamepad__1__0.html>`__
 
-  * `PPB_Graphics2D <pepper_dev/c/struct_p_p_b___graphics2_d__1__1.html>`__
+  * `PPB_Graphics2D <pepper_dev/c/struct_p_p_b___graphics2_d__1__2.html>`__
 
   * `PPB_Graphics3D <pepper_dev/c/struct_p_p_b___graphics3_d__1__0.html>`__
 
@@ -138,6 +140,8 @@
 
   * `PPB_View <pepper_dev/c/struct_p_p_b___view__1__2.html>`__
 
+  * `PPB_VpnProvider <pepper_dev/c/struct_p_p_b___vpn_provider__0__1.html>`__
+
   * `PPB_WebSocket <pepper_dev/c/struct_p_p_b___web_socket__1__0.html>`__
 
   * `PPB_WheelInputEvent <pepper_dev/c/struct_p_p_b___wheel_input_event__1__0.html>`__
@@ -360,6 +364,8 @@
 
   * `ppb_view.h <pepper_dev/c/ppb__view_8h.html>`__
 
+  * `ppb_vpn_provider.h <pepper_dev/c/ppb__vpn__provider_8h.html>`__
+
   * `ppb_websocket.h <pepper_dev/c/ppb__websocket_8h.html>`__
 
   * `ppp.h <pepper_dev/c/ppp_8h.html>`__
diff --git a/native_client_sdk/src/doc/c-api.rst b/native_client_sdk/src/doc/c-api.rst
index 773073a57..ceabc3f 100644
--- a/native_client_sdk/src/doc/c-api.rst
+++ b/native_client_sdk/src/doc/c-api.rst
@@ -3,12 +3,14 @@
 
 .. DO NOT EDIT! This document is auto-generated by doxygen/rst_index.py.
 
+.. include:: /migration/deprecation.inc
+
 ##########################################
 Pepper C API Reference (Stable)
 ##########################################
 
-This page lists the C API for Pepper 48. Apps that use this API can
-run in Chrome 48 or higher.
+This page lists the C API for Pepper 58. Apps that use this API can
+run in Chrome 58 or higher.
 
 `Interfaces <pepper_stable/c/group___interfaces.html>`__
 =============================================================
@@ -38,7 +40,7 @@
 
   * `PPB_Gamepad <pepper_stable/c/struct_p_p_b___gamepad__1__0.html>`__
 
-  * `PPB_Graphics2D <pepper_stable/c/struct_p_p_b___graphics2_d__1__1.html>`__
+  * `PPB_Graphics2D <pepper_stable/c/struct_p_p_b___graphics2_d__1__2.html>`__
 
   * `PPB_Graphics3D <pepper_stable/c/struct_p_p_b___graphics3_d__1__0.html>`__
 
@@ -138,6 +140,8 @@
 
   * `PPB_View <pepper_stable/c/struct_p_p_b___view__1__2.html>`__
 
+  * `PPB_VpnProvider <pepper_stable/c/struct_p_p_b___vpn_provider__0__1.html>`__
+
   * `PPB_WebSocket <pepper_stable/c/struct_p_p_b___web_socket__1__0.html>`__
 
   * `PPB_WheelInputEvent <pepper_stable/c/struct_p_p_b___wheel_input_event__1__0.html>`__
@@ -360,6 +364,8 @@
 
   * `ppb_view.h <pepper_stable/c/ppb__view_8h.html>`__
 
+  * `ppb_vpn_provider.h <pepper_stable/c/ppb__vpn__provider_8h.html>`__
+
   * `ppb_websocket.h <pepper_stable/c/ppb__websocket_8h.html>`__
 
   * `ppp.h <pepper_stable/c/ppp_8h.html>`__
diff --git a/native_client_sdk/src/doc/cds2014/cpp.rst b/native_client_sdk/src/doc/cds2014/cpp.rst
index 881bb56..2709596 100644
--- a/native_client_sdk/src/doc/cds2014/cpp.rst
+++ b/native_client_sdk/src/doc/cds2014/cpp.rst
@@ -1,5 +1,7 @@
 .. _cds2014_cpp:
 
+.. include:: /migration/deprecation.inc
+
 ##################################
 A Saga of Fire and Water - Codelab
 ##################################
diff --git a/native_client_sdk/src/doc/cds2014/index.rst b/native_client_sdk/src/doc/cds2014/index.rst
index f26208b..217d5ce2 100644
--- a/native_client_sdk/src/doc/cds2014/index.rst
+++ b/native_client_sdk/src/doc/cds2014/index.rst
@@ -1,5 +1,7 @@
 .. _cds2014:
 
+.. include:: /migration/deprecation.inc
+
 ###############################################
 Chrome Dev Summit 2014 - Native Client Codelabs
 ###############################################
diff --git a/native_client_sdk/src/doc/cds2014/python.rst b/native_client_sdk/src/doc/cds2014/python.rst
index 5617034a..092a00d 100644
--- a/native_client_sdk/src/doc/cds2014/python.rst
+++ b/native_client_sdk/src/doc/cds2014/python.rst
@@ -1,5 +1,7 @@
 .. _cds2014_python:
 
+.. include:: /migration/deprecation.inc
+
 ########################################
 What a Difference Python Makes - Codelab
 ########################################
diff --git a/native_client_sdk/src/doc/community/index.rst b/native_client_sdk/src/doc/community/index.rst
index 64e7161..d7f287a 100644
--- a/native_client_sdk/src/doc/community/index.rst
+++ b/native_client_sdk/src/doc/community/index.rst
@@ -1,5 +1,7 @@
 .. _community:
 
+.. include:: /migration/deprecation.inc
+
 #########
 Community
 #########
diff --git a/native_client_sdk/src/doc/community/security-contest/contest-announcement.rst b/native_client_sdk/src/doc/community/security-contest/contest-announcement.rst
index 9b0ce1cd..bb3f769c 100644
--- a/native_client_sdk/src/doc/community/security-contest/contest-announcement.rst
+++ b/native_client_sdk/src/doc/community/security-contest/contest-announcement.rst
@@ -1,5 +1,7 @@
 .. _contest_announcement:
 
+.. include:: /migration/deprecation.inc
+
 ##############################
 Native Client Security Contest
 ##############################
diff --git a/native_client_sdk/src/doc/community/security-contest/contest-faq.rst b/native_client_sdk/src/doc/community/security-contest/contest-faq.rst
index 6a24140..837c971a 100644
--- a/native_client_sdk/src/doc/community/security-contest/contest-faq.rst
+++ b/native_client_sdk/src/doc/community/security-contest/contest-faq.rst
@@ -1,5 +1,7 @@
 .. _contest_faq:
 
+.. include:: /migration/deprecation.inc
+
 ####################
 Security Contest FAQ
 ####################
diff --git a/native_client_sdk/src/doc/community/security-contest/contest-terms.rst b/native_client_sdk/src/doc/community/security-contest/contest-terms.rst
index 025da4c7..413eab0 100644
--- a/native_client_sdk/src/doc/community/security-contest/contest-terms.rst
+++ b/native_client_sdk/src/doc/community/security-contest/contest-terms.rst
@@ -1,5 +1,7 @@
 .. _contest_terms:
 
+.. include:: /migration/deprecation.inc
+
 #####################################
 Security Contest Terms and Conditions
 #####################################
diff --git a/native_client_sdk/src/doc/community/security-contest/index.rst b/native_client_sdk/src/doc/community/security-contest/index.rst
index 4834c49..045a4e8 100644
--- a/native_client_sdk/src/doc/community/security-contest/index.rst
+++ b/native_client_sdk/src/doc/community/security-contest/index.rst
@@ -1,5 +1,7 @@
 .. _contest_archive:
 
+.. include:: /migration/deprecation.inc
+
 ########################
 Security Contest Archive
 ########################
diff --git a/native_client_sdk/src/doc/cpp-api-beta.rst b/native_client_sdk/src/doc/cpp-api-beta.rst
index b883aa75..99050b2 100644
--- a/native_client_sdk/src/doc/cpp-api-beta.rst
+++ b/native_client_sdk/src/doc/cpp-api-beta.rst
@@ -3,12 +3,14 @@
 
 .. DO NOT EDIT! This document is auto-generated by doxygen/rst_index.py.
 
+.. include:: /migration/deprecation.inc
+
 ############################################
 Pepper C++ API Reference (Beta)
 ############################################
 
-This page lists the C++ API for Pepper 49. Apps that use this API can
-run in Chrome 49 or higher.
+This page lists the C++ API for Pepper 59. Apps that use this API can
+run in Chrome 59 or higher.
 
 `Classes <pepper_beta/cpp/inherits.html>`__
 ==================================================
@@ -134,6 +136,8 @@
 
   * `View <pepper_beta/cpp/classpp_1_1_view.html>`__
 
+  * `VpnProvider <pepper_beta/cpp/classpp_1_1_vpn_provider.html>`__
+
   * `WebSocket <pepper_beta/cpp/classpp_1_1_web_socket.html>`__
 
   * `WheelInputEvent <pepper_beta/cpp/classpp_1_1_wheel_input_event.html>`__
@@ -255,5 +259,7 @@
 
   * `view.h <pepper_beta/cpp/view_8h.html>`__
 
+  * `vpn_provider.h <pepper_beta/cpp/vpn__provider_8h.html>`__
+
   * `websocket.h <pepper_beta/cpp/websocket_8h.html>`__
 
diff --git a/native_client_sdk/src/doc/cpp-api-dev.rst b/native_client_sdk/src/doc/cpp-api-dev.rst
index 3b6f984..41fa6e4 100644
--- a/native_client_sdk/src/doc/cpp-api-dev.rst
+++ b/native_client_sdk/src/doc/cpp-api-dev.rst
@@ -3,12 +3,14 @@
 
 .. DO NOT EDIT! This document is auto-generated by doxygen/rst_index.py.
 
+.. include:: /migration/deprecation.inc
+
 ############################################
 Pepper C++ API Reference (Dev)
 ############################################
 
-This page lists the C++ API for Pepper 50. Apps that use this API can
-run in Chrome 50 or higher.
+This page lists the C++ API for Pepper 60. Apps that use this API can
+run in Chrome 60 or higher.
 
 `Classes <pepper_dev/cpp/inherits.html>`__
 ==================================================
@@ -134,6 +136,8 @@
 
   * `View <pepper_dev/cpp/classpp_1_1_view.html>`__
 
+  * `VpnProvider <pepper_dev/cpp/classpp_1_1_vpn_provider.html>`__
+
   * `WebSocket <pepper_dev/cpp/classpp_1_1_web_socket.html>`__
 
   * `WheelInputEvent <pepper_dev/cpp/classpp_1_1_wheel_input_event.html>`__
@@ -255,5 +259,7 @@
 
   * `view.h <pepper_dev/cpp/view_8h.html>`__
 
+  * `vpn_provider.h <pepper_dev/cpp/vpn__provider_8h.html>`__
+
   * `websocket.h <pepper_dev/cpp/websocket_8h.html>`__
 
diff --git a/native_client_sdk/src/doc/cpp-api.rst b/native_client_sdk/src/doc/cpp-api.rst
index c43dbdc..85b1f32 100644
--- a/native_client_sdk/src/doc/cpp-api.rst
+++ b/native_client_sdk/src/doc/cpp-api.rst
@@ -3,12 +3,14 @@
 
 .. DO NOT EDIT! This document is auto-generated by doxygen/rst_index.py.
 
+.. include:: /migration/deprecation.inc
+
 ############################################
 Pepper C++ API Reference (Stable)
 ############################################
 
-This page lists the C++ API for Pepper 48. Apps that use this API can
-run in Chrome 48 or higher.
+This page lists the C++ API for Pepper 58. Apps that use this API can
+run in Chrome 58 or higher.
 
 `Classes <pepper_stable/cpp/inherits.html>`__
 ==================================================
@@ -134,6 +136,8 @@
 
   * `View <pepper_stable/cpp/classpp_1_1_view.html>`__
 
+  * `VpnProvider <pepper_stable/cpp/classpp_1_1_vpn_provider.html>`__
+
   * `WebSocket <pepper_stable/cpp/classpp_1_1_web_socket.html>`__
 
   * `WheelInputEvent <pepper_stable/cpp/classpp_1_1_wheel_input_event.html>`__
@@ -255,5 +259,7 @@
 
   * `view.h <pepper_stable/cpp/view_8h.html>`__
 
+  * `vpn_provider.h <pepper_stable/cpp/vpn__provider_8h.html>`__
+
   * `websocket.h <pepper_stable/cpp/websocket_8h.html>`__
 
diff --git a/native_client_sdk/src/doc/devguide/coding/3D-graphics.rst b/native_client_sdk/src/doc/devguide/coding/3D-graphics.rst
index 7563a0f..7389cb68 100644
--- a/native_client_sdk/src/doc/devguide/coding/3D-graphics.rst
+++ b/native_client_sdk/src/doc/devguide/coding/3D-graphics.rst
@@ -1,5 +1,7 @@
 .. _devguide-coding-3D-graphics:
 
+.. include:: /migration/deprecation.inc
+
 ###########
 3D Graphics
 ###########
diff --git a/native_client_sdk/src/doc/devguide/coding/application-structure.rst b/native_client_sdk/src/doc/devguide/coding/application-structure.rst
index 3c475d2..0cba4198 100644
--- a/native_client_sdk/src/doc/devguide/coding/application-structure.rst
+++ b/native_client_sdk/src/doc/devguide/coding/application-structure.rst
@@ -1,5 +1,7 @@
 .. _devcycle-application-structure:
 
+.. include:: /migration/deprecation.inc
+
 #####################
 Application Structure
 #####################
diff --git a/native_client_sdk/src/doc/devguide/coding/audio.rst b/native_client_sdk/src/doc/devguide/coding/audio.rst
index cfe627c..418e03cb 100644
--- a/native_client_sdk/src/doc/devguide/coding/audio.rst
+++ b/native_client_sdk/src/doc/devguide/coding/audio.rst
@@ -1,5 +1,7 @@
 .. _devguide-coding-audio:
 
+.. include:: /migration/deprecation.inc
+
 #####
 Audio
 #####
diff --git a/native_client_sdk/src/doc/devguide/coding/file-io.rst b/native_client_sdk/src/doc/devguide/coding/file-io.rst
index 17df6d4..945d7fae 100644
--- a/native_client_sdk/src/doc/devguide/coding/file-io.rst
+++ b/native_client_sdk/src/doc/devguide/coding/file-io.rst
@@ -1,5 +1,7 @@
 .. _devguide-coding-fileio:
 
+.. include:: /migration/deprecation.inc
+
 ########
 File I/O
 ########
diff --git a/native_client_sdk/src/doc/devguide/coding/index.rst b/native_client_sdk/src/doc/devguide/coding/index.rst
index 796fbb0..812d9f89 100644
--- a/native_client_sdk/src/doc/devguide/coding/index.rst
+++ b/native_client_sdk/src/doc/devguide/coding/index.rst
@@ -1,5 +1,7 @@
 .. _coding:
 
+.. include:: /migration/deprecation.inc
+
 #######################
 Coding Your Application
 #######################
diff --git a/native_client_sdk/src/doc/devguide/coding/message-system.rst b/native_client_sdk/src/doc/devguide/coding/message-system.rst
index 8154db04..9024734 100644
--- a/native_client_sdk/src/doc/devguide/coding/message-system.rst
+++ b/native_client_sdk/src/doc/devguide/coding/message-system.rst
@@ -1,5 +1,7 @@
 .. _message-system:
 
+.. include:: /migration/deprecation.inc
+
 ################
 Messaging System
 ################
diff --git a/native_client_sdk/src/doc/devguide/coding/nacl_io.rst b/native_client_sdk/src/doc/devguide/coding/nacl_io.rst
index e32707c..d1b52ec27 100644
--- a/native_client_sdk/src/doc/devguide/coding/nacl_io.rst
+++ b/native_client_sdk/src/doc/devguide/coding/nacl_io.rst
@@ -1,5 +1,7 @@
 .. _nacl_io:
 
+.. include:: /migration/deprecation.inc
+
 ###################
 The nacl_io Library
 ###################
diff --git a/native_client_sdk/src/doc/devguide/coding/native-client-modules.rst b/native_client_sdk/src/doc/devguide/coding/native-client-modules.rst
index b892fd2..74d786aa 100644
--- a/native_client_sdk/src/doc/devguide/coding/native-client-modules.rst
+++ b/native_client_sdk/src/doc/devguide/coding/native-client-modules.rst
@@ -1,5 +1,7 @@
 .. _devcycle-native-client-modules:
 
+.. include:: /migration/deprecation.inc
+
 #####################
 Native Client Modules
 #####################
diff --git a/native_client_sdk/src/doc/devguide/coding/progress-events.rst b/native_client_sdk/src/doc/devguide/coding/progress-events.rst
index ce962e17..151b8b8d 100644
--- a/native_client_sdk/src/doc/devguide/coding/progress-events.rst
+++ b/native_client_sdk/src/doc/devguide/coding/progress-events.rst
@@ -1,5 +1,7 @@
 .. _devcycle-progress-events:
 
+.. include:: /migration/deprecation.inc
+
 ###############
 Progress Events
 ###############
diff --git a/native_client_sdk/src/doc/devguide/coding/url-loading.rst b/native_client_sdk/src/doc/devguide/coding/url-loading.rst
index 9949467c..6c38a324 100644
--- a/native_client_sdk/src/doc/devguide/coding/url-loading.rst
+++ b/native_client_sdk/src/doc/devguide/coding/url-loading.rst
@@ -1,5 +1,7 @@
 .. _devguide-coding-url-loading:
 
+.. include:: /migration/deprecation.inc
+
 ###########
 URL Loading
 ###########
diff --git a/native_client_sdk/src/doc/devguide/coding/view-focus-input-events.rst b/native_client_sdk/src/doc/devguide/coding/view-focus-input-events.rst
index 57d45c4..39fce4f 100644
--- a/native_client_sdk/src/doc/devguide/coding/view-focus-input-events.rst
+++ b/native_client_sdk/src/doc/devguide/coding/view-focus-input-events.rst
@@ -1,5 +1,7 @@
 .. _view_focus_input_events:
 
+.. include:: /migration/deprecation.inc
+
 ####################################
 View Change, Focus, and Input Events
 ####################################
diff --git a/native_client_sdk/src/doc/devguide/devcycle/building.rst b/native_client_sdk/src/doc/devguide/devcycle/building.rst
index d3b1b291..d44e716 100644
--- a/native_client_sdk/src/doc/devguide/devcycle/building.rst
+++ b/native_client_sdk/src/doc/devguide/devcycle/building.rst
@@ -1,5 +1,7 @@
 .. _devcycle-building:
 
+.. include:: /migration/deprecation.inc
+
 ########
 Building
 ########
diff --git a/native_client_sdk/src/doc/devguide/devcycle/debugging.rst b/native_client_sdk/src/doc/devguide/devcycle/debugging.rst
index 0e2503e..ffdcd1a3 100644
--- a/native_client_sdk/src/doc/devguide/devcycle/debugging.rst
+++ b/native_client_sdk/src/doc/devguide/devcycle/debugging.rst
@@ -1,5 +1,7 @@
 .. _devcycle-debugging:
 
+.. include:: /migration/deprecation.inc
+
 #########
 Debugging
 #########
diff --git a/native_client_sdk/src/doc/devguide/devcycle/dynamic-loading.rst b/native_client_sdk/src/doc/devguide/devcycle/dynamic-loading.rst
index 36ef7eb..9287901 100644
--- a/native_client_sdk/src/doc/devguide/devcycle/dynamic-loading.rst
+++ b/native_client_sdk/src/doc/devguide/devcycle/dynamic-loading.rst
@@ -1,3 +1,5 @@
+.. include:: /migration/deprecation.inc
+
 ######################################
 Dynamic Linking and Loading with glibc
 ######################################
diff --git a/native_client_sdk/src/doc/devguide/devcycle/index.rst b/native_client_sdk/src/doc/devguide/devcycle/index.rst
index b12cc19b..8078eae 100644
--- a/native_client_sdk/src/doc/devguide/devcycle/index.rst
+++ b/native_client_sdk/src/doc/devguide/devcycle/index.rst
@@ -1,5 +1,7 @@
 .. _devcycle:
 
+.. include:: /migration/deprecation.inc
+
 #################
 Development Cycle
 #################
diff --git a/native_client_sdk/src/doc/devguide/devcycle/running.rst b/native_client_sdk/src/doc/devguide/devcycle/running.rst
index 1109b9b..be921b2 100644
--- a/native_client_sdk/src/doc/devguide/devcycle/running.rst
+++ b/native_client_sdk/src/doc/devguide/devcycle/running.rst
@@ -1,5 +1,7 @@
 .. _devcycle-running:
 
+.. include:: /migration/deprecation.inc
+
 #######
 Running
 #######
diff --git a/native_client_sdk/src/doc/devguide/devcycle/vs-addin.rst b/native_client_sdk/src/doc/devguide/devcycle/vs-addin.rst
index 996fa82..026074c 100644
--- a/native_client_sdk/src/doc/devguide/devcycle/vs-addin.rst
+++ b/native_client_sdk/src/doc/devguide/devcycle/vs-addin.rst
@@ -1,5 +1,7 @@
 .. _devcycle-vs-addin:
 
+.. include:: /migration/deprecation.inc
+
 ############################
 Debugging with Visual Studio
 ############################
diff --git a/native_client_sdk/src/doc/devguide/distributing.rst b/native_client_sdk/src/doc/devguide/distributing.rst
index 10c69bb..ca2c8b5 100644
--- a/native_client_sdk/src/doc/devguide/distributing.rst
+++ b/native_client_sdk/src/doc/devguide/distributing.rst
@@ -1,5 +1,7 @@
 .. _distributing:
 
+.. include:: /migration/deprecation.inc
+
 #############################
 Distributing Your Application
 #############################
diff --git a/native_client_sdk/src/doc/devguide/index.rst b/native_client_sdk/src/doc/devguide/index.rst
index 8f45b6e1..76f8799 100644
--- a/native_client_sdk/src/doc/devguide/index.rst
+++ b/native_client_sdk/src/doc/devguide/index.rst
@@ -1,5 +1,7 @@
 .. _devguide-index:
 
+.. include:: /migration/deprecation.inc
+
 #################
 Developer's Guide
 #################
diff --git a/native_client_sdk/src/doc/devguide/tutorial/index.rst b/native_client_sdk/src/doc/devguide/tutorial/index.rst
index f8b2cb4..48c37f6 100644
--- a/native_client_sdk/src/doc/devguide/tutorial/index.rst
+++ b/native_client_sdk/src/doc/devguide/tutorial/index.rst
@@ -1,5 +1,7 @@
 .. _devguide-tutorial-index:
 
+.. include:: /migration/deprecation.inc
+
 ########
 Tutorial
 ########
diff --git a/native_client_sdk/src/doc/devguide/tutorial/tutorial-part1.rst b/native_client_sdk/src/doc/devguide/tutorial/tutorial-part1.rst
index 8332bd9..dc8c3811 100644
--- a/native_client_sdk/src/doc/devguide/tutorial/tutorial-part1.rst
+++ b/native_client_sdk/src/doc/devguide/tutorial/tutorial-part1.rst
@@ -1,5 +1,7 @@
 .. _tutorial:
 
+.. include:: /migration/deprecation.inc
+
 ######################################
 C++ Tutorial: Getting Started (Part 1)
 ######################################
diff --git a/native_client_sdk/src/doc/devguide/tutorial/tutorial-part2.rst b/native_client_sdk/src/doc/devguide/tutorial/tutorial-part2.rst
index af68396d..4a2b3cd5 100644
--- a/native_client_sdk/src/doc/devguide/tutorial/tutorial-part2.rst
+++ b/native_client_sdk/src/doc/devguide/tutorial/tutorial-part2.rst
@@ -1,5 +1,7 @@
 .. _tutorial2:
 
+.. include:: /migration/deprecation.inc
+
 ######################################
 C++ Tutorial: Getting Started (Part 2)
 ######################################
diff --git a/native_client_sdk/src/doc/doxygen/rst_index.py b/native_client_sdk/src/doc/doxygen/rst_index.py
index 35e4f02..9f072787 100755
--- a/native_client_sdk/src/doc/doxygen/rst_index.py
+++ b/native_client_sdk/src/doc/doxygen/rst_index.py
@@ -18,11 +18,12 @@
 ROOT_FILE_CONTENTS = """\
 .. _pepper_%(channel)s_index:
 
-
 :orphan:
 
 .. DO NOT EDIT! This document is auto-generated by doxygen/rst_index.py.
 
+.. include:: /migration/deprecation.inc
+
 ########################################
 Pepper API Reference (%(channel_title)s)
 ########################################
@@ -44,6 +45,8 @@
 
 .. DO NOT EDIT! This document is auto-generated by doxygen/rst_index.py.
 
+.. include:: /migration/deprecation.inc
+
 ##########################################
 Pepper C API Reference (%(channel_title)s)
 ##########################################
@@ -86,6 +89,8 @@
 
 .. DO NOT EDIT! This document is auto-generated by doxygen/rst_index.py.
 
+.. include:: /migration/deprecation.inc
+
 ############################################
 Pepper C++ API Reference (%(channel_title)s)
 ############################################
diff --git a/native_client_sdk/src/doc/faq.rst b/native_client_sdk/src/doc/faq.rst
index eb98708..360c520 100644
--- a/native_client_sdk/src/doc/faq.rst
+++ b/native_client_sdk/src/doc/faq.rst
@@ -1,3 +1,5 @@
+.. include:: /migration/deprecation.inc
+
 ##########################
 Frequently Asked Questions
 ##########################
diff --git a/native_client_sdk/src/doc/glossary.rst b/native_client_sdk/src/doc/glossary.rst
index cf32202..141b54d 100644
--- a/native_client_sdk/src/doc/glossary.rst
+++ b/native_client_sdk/src/doc/glossary.rst
@@ -1,5 +1,7 @@
 .. _glossary:
 
+.. include:: /migration/deprecation.inc
+
 ########
 Glossary
 ########
diff --git a/native_client_sdk/src/doc/help.rst b/native_client_sdk/src/doc/help.rst
index 3d64c9f..ea7b90d 100644
--- a/native_client_sdk/src/doc/help.rst
+++ b/native_client_sdk/src/doc/help.rst
@@ -1,5 +1,7 @@
 .. _help:
 
+.. include:: /migration/deprecation.inc
+
 ##############
 Help with NaCl
 ##############
diff --git a/native_client_sdk/src/doc/index.rst b/native_client_sdk/src/doc/index.rst
index f3229fa..897220c 100644
--- a/native_client_sdk/src/doc/index.rst
+++ b/native_client_sdk/src/doc/index.rst
@@ -1,3 +1,5 @@
+.. include:: /migration/deprecation.inc
+
 ########################
 Welcome to Native Client
 ########################
diff --git a/native_client_sdk/src/doc/io2014.rst b/native_client_sdk/src/doc/io2014.rst
index 7f4f0d45..61e23ad 100644
--- a/native_client_sdk/src/doc/io2014.rst
+++ b/native_client_sdk/src/doc/io2014.rst
@@ -1,5 +1,7 @@
 .. _io2014:
 
+.. include:: /migration/deprecation.inc
+
 ###################
 Building a NaCl App
 ###################
diff --git a/native_client_sdk/src/doc/migration/apps.html b/native_client_sdk/src/doc/migration/apps.html
new file mode 100644
index 0000000..ea2791f8
--- /dev/null
+++ b/native_client_sdk/src/doc/migration/apps.html
@@ -0,0 +1,431 @@
+<table>
+</table>
+<h3>PPB_HostResolver</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Create </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffeecc" style="font-size: 11px; padding: 5px;">GAP (partial) - No direct equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Resolve </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffeecc" style="font-size: 11px; padding: 5px;">GAP (partial) - No direct equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetCanonicalName </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffeecc" style="font-size: 11px; padding: 5px;">GAP (partial) - No direct equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetNetAddressCount </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffeecc" style="font-size: 11px; padding: 5px;">GAP (partial) - No direct equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetNetAddress </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffeecc" style="font-size: 11px; padding: 5px;">GAP (partial) - No direct equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_NetAddress</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">CreateFromIPv4Address </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffeecc" style="font-size: 11px; padding: 5px;">GAP (partial) - No direct equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">CreateFromIPv6Address </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffeecc" style="font-size: 11px; padding: 5px;">GAP (partial) - No direct equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetFamily </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffeecc" style="font-size: 11px; padding: 5px;">GAP (partial) - No direct equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">DescribeAsString </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffeecc" style="font-size: 11px; padding: 5px;">GAP (partial) - No direct equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">DescribeAsIPv4Address </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffeecc" style="font-size: 11px; padding: 5px;">GAP (partial) - No direct equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">DescribeAsIPv6Address </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffeecc" style="font-size: 11px; padding: 5px;">GAP (partial) - No direct equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_NetworkList</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetCount </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No direct equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetName </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No direct equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetType </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No direct equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetState </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No direct equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetIpAddress </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No direct equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetDisplayName </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No direct equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetMTU </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No direct equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_NetworkMonitor</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Create </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No direct equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">UpdateNetworkList </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No direct equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_NetworkProxy</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetProxyForURL </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No direct equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_TCPSocket</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Create </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">chrome.sockets.tcp.create </td>
+    <td style="font-size: 11px; padding: 5px;">WebSockets / WebRTC closest practical equivalent on open Web. </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;"> </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">chrome.sockets.tcpServer.create </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Bind </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">chrome.sockets.tcpServer.create </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Connect </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">chrome.sockets.tcp.connect </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetLocalAddress </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">chrome.sockets.udp.SocketInfo </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetRemoteAddress </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">chrome.sockets.udp.SocketInfo </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Read </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">onReceive* Events </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Write </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">chrome.sockets.tcp.send </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Listen </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">chrome.sockets.tcpServer.listen </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Accept </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">onAccept* Events </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Close </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">chrome.sockets.tcp.close </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;"> </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">chrome.sockets.tcpServer.close </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">SetOption </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">chrome.sockets.tcp.update </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;"> </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">chrome.sockets.tcpServer.update </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_UDPSocket</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Create </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">chrome.sockets.udp.create </td>
+    <td bgcolor="#ffeecc" style="font-size: 11px; padding: 5px;">GAP (partial) - WebRTC closest practical open Web equivalent</td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Bind </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">chrome.sockets.udp.bind </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetBoundAddress </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">chrome.sockets.udp.SocketInfo </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">RecvFrom </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">onReceive* Events </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">SendTo </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">chrome.sockets.udp.send </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Close </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">chrome.sockets.udp.close </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">SetOption </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">chrome.sockets.udp.update </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">JoinGroup </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">chrome.sockets.udp.joinGroup </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">LeaveGroup </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">chrome.sockets.udp.leaveGroup </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
diff --git a/native_client_sdk/src/doc/migration/deprecation.inc b/native_client_sdk/src/doc/migration/deprecation.inc
new file mode 100644
index 0000000..ffc824d
--- /dev/null
+++ b/native_client_sdk/src/doc/migration/deprecation.inc
@@ -0,0 +1,11 @@
+.. raw:: html
+
+  <b><font color="#cc0000">
+  NOTE:
+  Deprecation of the technologies described here has been announced
+  for platforms other than ChromeOS.<br/>
+  Please visit our
+  <a href="/native-client/migration">migration guide</a>
+  for details.
+  </font></b>
+  <hr/>
diff --git a/native_client_sdk/src/doc/migration/index.rst b/native_client_sdk/src/doc/migration/index.rst
new file mode 100644
index 0000000..e6cb18e7
--- /dev/null
+++ b/native_client_sdk/src/doc/migration/index.rst
@@ -0,0 +1,74 @@
+.. _migration:
+
+WebAssembly Migration Guide
+===========================
+
+(P)NaCl Deprecation Announcements
+---------------------------------
+
+Given the momentum of cross-browser WebAssembly support, we plan to focus our
+native code efforts on WebAssembly going forward and plan to remove support for
+PNaCl in Q1 2018 (except for Chrome Apps). We believe that the vibrant
+ecosystem around `WebAssembly <http://webassembly.org>`_
+makes it a better fit for new and existing high-performance
+web apps and that usage of PNaCl is sufficiently low to warrant deprecation.
+
+We also recently announced the deprecation Q1 2018 of
+`Chrome Apps
+<https://blog.chromium.org/2016/08/from-chrome-apps-to-web.html>`_
+outside of ChromeOS.
+
+
+Toolchain Migration
+-------------------
+
+For the majority of (P)NaCl uses cases we recommend transitioning
+from the NaCl SDK to `Emscripten
+<http://webassembly.org/getting-started/developers-guide/>`_.
+Migration is likely to be reasonably straightforward
+if your application is portable to Linux, uses
+`SDL <https://www.libsdl.org/>`_, or POSIX APIs.
+While direct support for NaCl / Pepper APIs in not available,
+we've attempted to list Web API equivalents.
+For more challenging porting cases, please reach out on
+native-client-discuss@googlegroups.com
+
+
+API Migration
+-------------
+
+We've outlined here the status of Web Platform substitutes for each
+of the APIs exposed to (P)NaCl.
+Additionally, the table lists the library or option in Emscripten
+that offers the closest substitute.
+
+We expect to add shared memory threads support to WebAssembly in 2017,
+as threads are crucial to matching (P)NaCl's most interesting use
+cases. Migration items which assume forthcoming threads support
+are marked below. If your application's flow control relies heavily on blocking
+APIs, you may also find threads support is required for convenient porting.
+
+While we've tried to be accurate in this table,
+there are no doubt errors or omissions.
+If you encounter one, please reach out to us on
+native-client-discuss@googlegroups.com
+
+.. contents::
+  :local:
+  :backlinks: none
+  :depth: 2
+
+PPAPI
+-----
+.. raw:: html
+  :file: public.html
+
+IRT
+---
+.. raw:: html
+  :file: public.html
+
+PPAPI (Apps)
+------------
+.. raw:: html
+  :file: apps.html
diff --git a/native_client_sdk/src/doc/migration/irt.html b/native_client_sdk/src/doc/migration/irt.html
new file mode 100644
index 0000000..d1193773
--- /dev/null
+++ b/native_client_sdk/src/doc/migration/irt.html
@@ -0,0 +1,621 @@
+<table>
+</table>
+<h3>nacl_irt_basic</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">IRT Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">exit </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">builtin </td>
+    <td style="font-size: 11px; padding: 5px;">Not relevant to Wasm </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">gettod </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">builtin </td>
+    <td style="font-size: 11px; padding: 5px;">new Date().getTime() </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">clock </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">builtin </td>
+    <td style="font-size: 11px; padding: 5px;">new Date().getTime() </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">nanosleep </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">builtin </td>
+    <td style="font-size: 11px; padding: 5px;">Simulate with Atomics.wait </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">sched_yield </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">builtin </td>
+    <td style="font-size: 11px; padding: 5px;">Simulate with Atomics.wait </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">sysconf </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">builtin </td>
+    <td style="font-size: 11px; padding: 5px;">Not relevant to Wasm, internal detail </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>nacl_irt_fdio</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">IRT Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">close </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">builtin </td>
+    <td style="font-size: 11px; padding: 5px;">Not relevant to Wasm, implementation detail. </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">dup </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">builtin </td>
+    <td style="font-size: 11px; padding: 5px;">Not relevant to Wasm, implementation detail. </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">dup2 </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">builtin </td>
+    <td style="font-size: 11px; padding: 5px;">Not relevant to Wasm, implementation detail. </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">read </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">builtin </td>
+    <td style="font-size: 11px; padding: 5px;">Not relevant to Wasm, implementation detail. </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">write </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">builtin </td>
+    <td style="font-size: 11px; padding: 5px;">Not relevant to Wasm, implementation detail. </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">seek </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">builtin </td>
+    <td style="font-size: 11px; padding: 5px;">Not relevant to Wasm, implementation detail. </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">fstat </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">builtin </td>
+    <td style="font-size: 11px; padding: 5px;">Not relevant to Wasm, implementation detail. </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">getdents </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">builtin </td>
+    <td style="font-size: 11px; padding: 5px;">Not relevant to Wasm, implementation detail. </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>nacl_irt_filename</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">IRT Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">open </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">builtin </td>
+    <td style="font-size: 11px; padding: 5px;">Not relevant to Wasm, implementation detail. </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">stat </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">builtin </td>
+    <td style="font-size: 11px; padding: 5px;">Not relevant to Wasm, implementation detail. </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>nacl_irt_memory</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">IRT Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">sysbrk </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">builtin </td>
+    <td style="font-size: 11px; padding: 5px;">Deprecated. </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">mmap </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No mmap type support. Future multiple memories or mmap support may provide this.</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">munmap </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No mmap type support. Future multiple memories or mmap support may provide this.</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">mprotect </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No mmap type support. Future multiple memories or mmap support may provide this.</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>nacl_irt_dyncode</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">IRT Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">dyncode_create </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SIDE_MODULE=1 </td>
+    <td style="font-size: 11px; padding: 5px;">WebAssembly.compile + Tables </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">dyncode_modify </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent.</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">dyncode_destroy </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SIDE_MODULE=1 </td>
+    <td style="font-size: 11px; padding: 5px;">WebAssembly.compile + Tables </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>nacl_irt_thread</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">IRT Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">thread_create </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td style="font-size: 11px; padding: 5px;">PTHREADS=1 </td>
+    <td style="font-size: 11px; padding: 5px;">new Worker() </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">thread_nice </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent.</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">thread_exit </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td style="font-size: 11px; padding: 5px;">PTHREADS=1 </td>
+    <td style="font-size: 11px; padding: 5px;">exit the worker </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>nacl_irt_futex</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">IRT Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">futex_wait_abs </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td style="font-size: 11px; padding: 5px;">PTHREADS=1 </td>
+    <td style="font-size: 11px; padding: 5px;">Atomics.wait </td>
+    <td style="font-size: 11px; padding: 5px;">Forthcoming WebAssembly threads support will likely expose this directly. </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">futex_wake </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td style="font-size: 11px; padding: 5px;">PTHREADS=1 </td>
+    <td style="font-size: 11px; padding: 5px;">Atomics.wake </td>
+    <td style="font-size: 11px; padding: 5px;">Forthcoming WebAssembly threads support will likely expose this directly. </td>
+  </tr>
+
+</table>
+<h3>nacl_irt_mutex</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">IRT Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">mutex_create </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td style="font-size: 11px; padding: 5px;">PTHREADS=1 </td>
+    <td style="font-size: 11px; padding: 5px;">Implement on top of Atomics + futex. </td>
+    <td style="font-size: 11px; padding: 5px;">Forthcoming WebAssembly threads support will likely expose this directly. </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">mutex_destroy </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td style="font-size: 11px; padding: 5px;">PTHREADS=1 </td>
+    <td style="font-size: 11px; padding: 5px;">Implement on top of Atomics + futex. </td>
+    <td style="font-size: 11px; padding: 5px;">Forthcoming WebAssembly threads support will likely expose this directly. </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">mutex_lock </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td style="font-size: 11px; padding: 5px;">PTHREADS=1 </td>
+    <td style="font-size: 11px; padding: 5px;">Implement on top of Atomics + futex. </td>
+    <td style="font-size: 11px; padding: 5px;">Forthcoming WebAssembly threads support will likely expose this directly. </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">mutex_unlock </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td style="font-size: 11px; padding: 5px;">PTHREADS=1 </td>
+    <td style="font-size: 11px; padding: 5px;">Implement on top of Atomics + futex. </td>
+    <td style="font-size: 11px; padding: 5px;">Forthcoming WebAssembly threads support will likely expose this directly. </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">mutex_trylock </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td style="font-size: 11px; padding: 5px;">PTHREADS=1 </td>
+    <td style="font-size: 11px; padding: 5px;">Implement on top of Atomics + futex. </td>
+    <td style="font-size: 11px; padding: 5px;">Forthcoming WebAssembly threads support will likely expose this directly. </td>
+  </tr>
+
+</table>
+<h3>nacl_irt_cond</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">IRT Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">cond_create </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td style="font-size: 11px; padding: 5px;">PTHREADS=1 </td>
+    <td style="font-size: 11px; padding: 5px;">Implement on top of Atomics + futex. </td>
+    <td style="font-size: 11px; padding: 5px;">Forthcoming WebAssembly threads support will likely expose this directly. </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">cond_destroy </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td style="font-size: 11px; padding: 5px;">PTHREADS=1 </td>
+    <td style="font-size: 11px; padding: 5px;">Implement on top of Atomics + futex. </td>
+    <td style="font-size: 11px; padding: 5px;">Forthcoming WebAssembly threads support will likely expose this directly. </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">cond_signal </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td style="font-size: 11px; padding: 5px;">PTHREADS=1 </td>
+    <td style="font-size: 11px; padding: 5px;">Implement on top of Atomics + futex. </td>
+    <td style="font-size: 11px; padding: 5px;">Forthcoming WebAssembly threads support will likely expose this directly. </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">cond_broadcast </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td style="font-size: 11px; padding: 5px;">PTHREADS=1 </td>
+    <td style="font-size: 11px; padding: 5px;">Implement on top of Atomics + futex. </td>
+    <td style="font-size: 11px; padding: 5px;">Forthcoming WebAssembly threads support will likely expose this directly. </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">cond_wait </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td style="font-size: 11px; padding: 5px;">PTHREADS=1 </td>
+    <td style="font-size: 11px; padding: 5px;">Implement on top of Atomics + futex. </td>
+    <td style="font-size: 11px; padding: 5px;">Forthcoming WebAssembly threads support will likely expose this directly. </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">cond_timed_wait_abs </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td style="font-size: 11px; padding: 5px;">PTHREADS=1 </td>
+    <td style="font-size: 11px; padding: 5px;">Implement on top of Atomics + futex. </td>
+    <td style="font-size: 11px; padding: 5px;">Forthcoming WebAssembly threads support will likely expose this directly. </td>
+  </tr>
+
+</table>
+<h3>nacl_irt_sem</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">IRT Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">sem_create </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td style="font-size: 11px; padding: 5px;">PTHREADS=1 </td>
+    <td style="font-size: 11px; padding: 5px;">Implement on top of Atomics + futex. </td>
+    <td style="font-size: 11px; padding: 5px;">Forthcoming WebAssembly threads support will likely expose this directly. </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">sem_destroy </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td style="font-size: 11px; padding: 5px;">PTHREADS=1 </td>
+    <td style="font-size: 11px; padding: 5px;">Implement on top of Atomics + futex. </td>
+    <td style="font-size: 11px; padding: 5px;">Forthcoming WebAssembly threads support will likely expose this directly. </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">sem_post </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td style="font-size: 11px; padding: 5px;">PTHREADS=1 </td>
+    <td style="font-size: 11px; padding: 5px;">Implement on top of Atomics + futex. </td>
+    <td style="font-size: 11px; padding: 5px;">Forthcoming WebAssembly threads support will likely expose this directly. </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">sem_wait </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td style="font-size: 11px; padding: 5px;">PTHREADS=1 </td>
+    <td style="font-size: 11px; padding: 5px;">Implement on top of Atomics + futex. </td>
+    <td style="font-size: 11px; padding: 5px;">Forthcoming WebAssembly threads support will likely expose this directly. </td>
+  </tr>
+
+</table>
+<h3>nacl_irt_tls</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">IRT Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">tls_init </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td style="font-size: 11px; padding: 5px;">PTHREADS=1 </td>
+    <td style="font-size: 11px; padding: 5px;">Simulate with Worker global variables. </td>
+    <td style="font-size: 11px; padding: 5px;">Forthcoming WebAssembly threads support will likely expose this directly. </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">tls_get </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td style="font-size: 11px; padding: 5px;">PTHREADS=1 </td>
+    <td style="font-size: 11px; padding: 5px;">Simulate with Worker global variables. </td>
+    <td style="font-size: 11px; padding: 5px;">Forthcoming WebAssembly threads support will likely expose this directly. </td>
+  </tr>
+
+</table>
+<h3>nacl_irt_blockhook</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">IRT Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">register_block_hooks </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">N/A </td>
+    <td style="font-size: 11px; padding: 5px;">Moot, implementation detail. </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>nacl_irt_resource_open</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">IRT Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">open_resource </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">N/A </td>
+    <td style="font-size: 11px; padding: 5px;">Moot, implementation detail. </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>nacl_irt_random</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">IRT Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">get_random_bytes </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">FS (partial) - Doesn't use crypto </td>
+    <td style="font-size: 11px; padding: 5px;">crypto.getRandomValues </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>nacl_irt_clock</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">IRT Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">clock_getres </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent.</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">clock_gettime </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">utime </td>
+    <td style="font-size: 11px; padding: 5px;">Performance.now() </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>nacl_irt_exception_handling</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">IRT Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">exception_handler </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent.</td>
+    <td style="font-size: 11px; padding: 5px;">Wasm / Asm don't provide enough introspection of the stack to produce a full crash report. </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">exception_stack </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent.</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">exception_clear_flag </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent.</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>nacl_irt_code_data_alloc</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">IRT Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">allocate_code_data </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">N/A </td>
+    <td style="font-size: 11px; padding: 5px;">Moot, implementation detail. </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
diff --git a/native_client_sdk/src/doc/migration/public.html b/native_client_sdk/src/doc/migration/public.html
new file mode 100644
index 0000000..4e1f801
--- /dev/null
+++ b/native_client_sdk/src/doc/migration/public.html
@@ -0,0 +1,2504 @@
+<table>
+</table>
+<h3>PPB_Audio</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Create </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td style="font-size: 11px; padding: 5px;">SDL (partial) </td>
+    <td bgcolor="#ffeecc" style="font-size: 11px; padding: 5px;">GAP (partial) - AudioWorkletNode ROUGHLY equivalent</td>
+    <td style="font-size: 11px; padding: 5px;">Still being standardized. </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetCurrentConfig </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">AudioContext.* (gets back settings passed in) </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">StartPlayback </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">AudioBufferSourceNode.start </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">StopPlayback </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">AudioBufferSourceNode.stop </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_AudioBuffer</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetTimestamp </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">AudioBufferSourceNode.start (parameter) </td>
+    <td style="font-size: 11px; padding: 5px;">Passed in each time instead of attached to the buffer. </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">SetTimestamp </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">AudioBufferSourceNode.start (parameter) </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetSampleRate </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">AudioBuffer.sampleRate </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetSampleSize </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - WebAudio only uses 32-bit float, PPAPI does 16-bit int.</td>
+    <td style="font-size: 11px; padding: 5px;">PPAPI theoretically supports multiple sampling sizes. In practice, it only supports 16-bit samples. Unfortunately, developers have requested 16-bit sample sizes to save on memory use. </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetNumberOfChannels </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">AudioBuffer.numberOfChannels </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetDataBuffer </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">AudioBuffer.getChannelData </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetBufferSize </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">AudioBuffer.length </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_AudioConfig</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">CreateStereo16Bit </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - Only 32-bit float samples supported</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetSampleRate </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">AudioContext.sampleRate </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetSampleFrameCount </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">AudioBuffer.length </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">RecommendSampleRate </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">AudioContext.sampleRate (from default construct) </td>
+    <td style="font-size: 11px; padding: 5px;">An AudioContext will have the preferred sampling rate by default. </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">RecommendSampleFrameCount </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No mechanism to get a recomended buffer size.</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_Console</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Log </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">utime </td>
+    <td style="font-size: 11px; padding: 5px;">console.log/warn/error/... </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">LogWithSource </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">PPAPI provides a way to override the source filename and line number in a console message. 
+(Though JS API provides way to style text). </td>
+  </tr>
+
+</table>
+<h3>PPB_Core</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">getTime </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">utime </td>
+    <td style="font-size: 11px; padding: 5px;">new Date().getTime() </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">getTimeTicks </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">utime </td>
+    <td style="font-size: 11px; padding: 5px;">new Date().getTime() </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">IsMainThread </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">window.document !== undefined </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">CallOnMainThread </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">Worker.postMessage + Atomics.wait </td>
+    <td style="font-size: 11px; padding: 5px;">Equivalent synchronization can be built. </td>
+  </tr>
+
+</table>
+<h3>PPB_FileIO</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Create </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">FS (partial) </td>
+    <td style="font-size: 11px; padding: 5px;">FileReader / FileWrite (Entry.createReader / Entry.createWriter) </td>
+    <td style="font-size: 11px; padding: 5px;">Create and open are used differently, but the pieces are of equal power. </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Open </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">FS (partial) </td>
+    <td style="font-size: 11px; padding: 5px;">FileReader / FileWrite (Entry.createReader / Entry.createWriter) </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Query </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">FS (partial) </td>
+    <td style="font-size: 11px; padding: 5px;">Entry.getMetadata </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Touch </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">FS (partial) </td>
+    <td bgcolor="#ffeecc" style="font-size: 11px; padding: 5px;">GAP (partial) - No direct equivalent, but no access time either.</td>
+    <td style="font-size: 11px; padding: 5px;">Modify time can be bumped by writing. </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Read </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">FS (partial) </td>
+    <td style="font-size: 11px; padding: 5px;">Entry.getFile + Blob.slice + FileReader.getBinaryData </td>
+    <td style="font-size: 11px; padding: 5px;">Note, this API requires an extra copy to get a read into linear memory, and may be worse than that if Blob slices are not optimizes to use mmap. </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Write </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">FS (partial) </td>
+    <td style="font-size: 11px; padding: 5px;">FileWriter.seek + FileWriter.write 'write*' Events </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">SetLength </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">FS (partial) </td>
+    <td style="font-size: 11px; padding: 5px;">FileWriter.truncate + 'write*' Events </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Flush </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent, no way to flush.</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Close </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">FS (partial) </td>
+    <td style="font-size: 11px; padding: 5px;">No equivalent, open files and directories are implicitly closed. </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">ReadToArray </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent.</td>
+    <td style="font-size: 11px; padding: 5px;">Allows multiple subrange reads in parallel. </td>
+  </tr>
+
+</table>
+<h3>PPB_FileRef</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Create </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">FS (partial) </td>
+    <td style="font-size: 11px; padding: 5px;">Entry.getFile(..., {create:true}) </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetFileSystemType </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">FS (partial) </td>
+    <td style="font-size: 11px; padding: 5px;">FileSystem.type </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetName </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">FS (partial) </td>
+    <td style="font-size: 11px; padding: 5px;">Entry.name </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetPath </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">FS (partial) </td>
+    <td style="font-size: 11px; padding: 5px;">Entry.fullPath </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetParent </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">FS (partial) </td>
+    <td style="font-size: 11px; padding: 5px;">Entry.getParent </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">MakeDirectory </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">FS (partial) </td>
+    <td style="font-size: 11px; padding: 5px;">Entry.getDirectory(..., {create:true}) </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Touch </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">FS (partial) </td>
+    <td bgcolor="#ffeecc" style="font-size: 11px; padding: 5px;">GAP (partial) - No direct equivalent, but no access time either.</td>
+    <td style="font-size: 11px; padding: 5px;">Modify time can be bumped by writing. </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Delete </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">FS (partial) </td>
+    <td style="font-size: 11px; padding: 5px;">Entry.remove </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Rename </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">FS (partial) </td>
+    <td style="font-size: 11px; padding: 5px;">Entry.moveTo </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Query </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">Entry.getMetadata </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - JS API has file size and last modified date, but doesn't have creation date and last accessed date.</td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">ReadDirectoryEntries </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">FS (partial) </td>
+    <td style="font-size: 11px; padding: 5px;">Directory.readEntries </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_FileSystem</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Create </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">FS (partial) </td>
+    <td style="font-size: 11px; padding: 5px;">window.requestFileSystem </td>
+    <td style="font-size: 11px; padding: 5px;">JS API does both in one step </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Open </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">window.requestFileSystem </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - Filesystems API is chrome only. IndexedDB has additional performance limitations around subrange writes.</td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetType </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">FileSystem.type </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_Fullscreen</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">IsFullScreen </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">html5.h </td>
+    <td style="font-size: 11px; padding: 5px;">Document.fullscreenEnabled </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">SetFullscreen </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">html5.h </td>
+    <td style="font-size: 11px; padding: 5px;">Document.requestFullscreen </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetScreenSize </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">html5.h </td>
+    <td style="font-size: 11px; padding: 5px;">Document.exitFullscreen </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_Gamepad</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Sample </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">Gamepad.* </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - PPAPI exposes a timestamp value, but the JS API doesn't provide this (though it is spec'd).</td>
+  </tr>
+
+</table>
+<h3>PPB_Graphics2D</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Create </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">Canvas.getContext('2d') </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Describe </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">Canvas.clientWidth + Canvas.clientHeight </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PaintImageData </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">CanvasRenderingContext2d.putImageData </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Scroll </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">CanvasRenderingContext2d.scrollIntoView </td>
+    <td bgcolor="#ffeecc" style="font-size: 11px; padding: 5px;">GAP (partial) - Not an exact match (might have to resort to getImageData + putImageData which will be slow). Not a cross-browser standard.</td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">ReplaceContents </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">CanvasRenderingContext2d.drawImage </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Flush </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - Only returning to the event loop triggers the flush.</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">SetScale </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">CanvasRenderingContext2d.scale </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetScale </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">CanvasRenderingContext2d.currentTransform </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">SetLayerTransform </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">CanvasRenderingContext2d.setTransform
+CanvasRenderingContext2d.scale
+CanvasRenderingContext2d.translate </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_Graphics3D</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetAttribMaxValue </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - Canvas.getContext lets you set booleans requesting depth / stencil buffers of certain sizes, but does not have a way to query what's possible (or get anything other than on or off for each)</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Create </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">Canvas.getContext </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetAttribs </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">WebGLRenderingContext.getContextAttributes </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">SetAttribs </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">Canvas.getContext(.., OPTIONS) </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetError </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">WebGLRenderingContext.getError </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">ResizeBuffers </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">Canvas.width = w; Canvas.height = h; </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">SwapBuffers </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No way to explicitly flip a frame, must return to the event loop.</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_ImageData</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetNativeImageDataFormat </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">ImageData mandates RGBA order </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">IsImageDataFormatSupported </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">ImageData mandates RGBA order </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Create </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">CanvasRenderingContext2d.createImageData </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Describe </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">ImageData never has a stride </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Map </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">ImageData.data </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Unmap </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">ImageData.data </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_InputEvent</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">RequestInputEvents </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">No direct equivalent </td>
+    <td style="font-size: 11px; padding: 5px;">The lack of this feature is probably less relevant as JS / Wasm runs on the main thread and can more cheaply filter events without incurring a cross process round-trip. </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">RequestFilteringInputEvents </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">mouse* key* wheel* touch* composition* Events </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;"> </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">Element.addEventListener </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">ClearInputEventRequest </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">Element.removeEventListener </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetType </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">Event class descendants </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetTimeStamp </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">Event.timeStamp </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetModifiers </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">*Event.altKey/shiftKey/metaKey/ctrlKey </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_MouseInputEvent</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Create </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">MouseEvent </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetButton </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">MouseEvent.button </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetPosition </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">MouseEvent.client*/page*/offset* </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetClickCount </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">dblclick' vs 'mousedown' Events </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetMovement </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">MouseEvent.movement* </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_WheelInputEvent</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Create </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">WheelEvent </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetDelta </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">WheelEvent.delta* </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetTicks </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - deltaMode kinda of contains this info, but incompletely.</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetScrollByPage </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - deltaMode kinda of contains this info, but incompletely.</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_KeyboardInputEvent</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Create </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">KeyboardEvent </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetKeyCode </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">KeyboardEvent.keyCode </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetCharacterText </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">KeyboardEvent.key </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetCode </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">KeyboardEvent.code </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_TouchInputEvent</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Create </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">TouchEvent </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">AddTouchPoint </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">TouchEvent.touches.push </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetTouchCount </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">TouchEvent.touches.length </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetTouchByIndex </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">TouchEvent.touches[i] </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetTouchById </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">Touch.indentifer (to figure this out yourself) </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_IMEInputEvent</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Create </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">CompositionEvent </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetText </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">CompositionEvent.data </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetSegmentNumber </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No direct equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetSegmentOffset </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No direct equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetTargetSegment </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No direct equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetSelection </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No direct equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_Instance</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">BindGraphics </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">Canvas.getContext (moot as binding is automatic). </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">IsFullFrame </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent to mime type handlers.</td>
+    <td style="font-size: 11px; padding: 5px;">NaCl apps can be registered to handle a particular mime type and own the whole document. </td>
+  </tr>
+
+</table>
+<h3>PPB_MediaStreamAudioTrack</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Configure </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetAttrib </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">MediaStreamSettings.channelCount </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;"> </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">MediaStreamSettings.sampleSize </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;"> </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">MediaStreamSettings.sampleRate </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;"> </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - no equivalent to PP_MEDIASTREAMAUDIOTRACK_ATTRIB_BUFFERS</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;"> </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - no equivalent to PP_MEDIASTREAMAUDIOTRACK_ATTRIB_DURATION</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetId </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">MediaStream.id </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">HasEnded </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">MediaStream.ended </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetBuffer </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">RecycleBuffer </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Close </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_MediaStreamVideoTrack</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Create </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;">Ability to create synthetic stream. </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Configure </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetAttrib </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">MediaStreamSettings.width </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;"> </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">MediaStreamSettings.height </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;"> </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - no equivalent to PP_MEDIASTREAMVIDEOTRACK_ATTRIB_BUFFERED_FRAMES</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;"> </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - no equivalent to PP_MEDIASTREAMVIDEOTRACK_ATTRIB_FORMAT</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetId </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">MediaStream.id </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">HasEnded </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">MediaStream.ended </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetFrame </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">RecycleFrame </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Close </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetEmptyFrame </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PutFrame </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_MessageLoop</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Create </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">N/A </td>
+    <td style="font-size: 11px; padding: 5px;">Mostly moot, workers get an implicit event loop. </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetForMainThread </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">N/A </td>
+    <td style="font-size: 11px; padding: 5px;">Mostly moot, workers get an implicit event loop. </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetCurrent </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">N/A </td>
+    <td style="font-size: 11px; padding: 5px;">Mostly moot, workers get an implicit event loop. </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">AttachToCurrentThread </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">N/A </td>
+    <td style="font-size: 11px; padding: 5px;">Mostly moot, workers get an implicit event loop. </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Run </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">N/A </td>
+    <td style="font-size: 11px; padding: 5px;">Mostly moot, workers get an implicit event loop. </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PostWork </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">N/A </td>
+    <td style="font-size: 11px; padding: 5px;">Mostly moot, workers get an implicit event loop. </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PostQuit </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">N/A </td>
+    <td style="font-size: 11px; padding: 5px;">Mostly moot, workers get an implicit event loop. </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_Messaging</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PostMessage </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">N/A </td>
+    <td style="font-size: 11px; padding: 5px;">Window.postMessage </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">RegisterMessageHandler </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">N/A </td>
+    <td style="font-size: 11px; padding: 5px;">Window.addEventListener </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">UnregisterMessageHandler </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">N/A </td>
+    <td style="font-size: 11px; padding: 5px;">Window.removeEventListener </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_MouseCursor</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">SetCursor </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">Element.style.cursor </td>
+    <td style="font-size: 11px; padding: 5px;">Same set of stock cursors are supported.
+Custom cursors can be done with url(..).
+Dynamic custom cursors can be done with data URIs.
+CSS3 supports specifying the hotspot. </td>
+  </tr>
+
+</table>
+<h3>PPB_MouseLock</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">LockMouse </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">Element.requestPointerLock </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">UnlockMouse </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">Element.exitPointerLock </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_OpenGLES2</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Several Methods </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">OpenGLES </td>
+    <td style="font-size: 11px; padding: 5px;">Close to WebGL 1.0 in functionality. </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;"> </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">x </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - Without offscreen canvas, rendering must be done on the main thread.</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_TextInputController</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">SetTextInputType </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent hints to browser about canvas containing input.</td>
+    <td style="font-size: 11px; padding: 5px;">Some developers would like to either be able to hint in this fashion, or preferrably the ability to intercept and display IME events / output inline inside a canvas. </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">UpdateCaretPosition </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent hints to browser about canvas containing input.</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">CancelCompositionText </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent hints to browser about canvas containing input.</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">UpdateSurroundingText </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent hints to browser about canvas containing input.</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_URLLoader</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Create </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">new XMLHttpRequest(); </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Open </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">XMLHttpRequest.open </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">FollowRedirect </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">Request.redirect </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;"> </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No XMLHTTPRequest equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetUploadProgress </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">XMLHttpRequest 'progress' Event </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;"> </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No Fetch API equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetDownloadProgress </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">XMLHttpRequest 'progress' Event </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;"> </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No Fetch API equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetResponseInfo </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">XMLHttpRequest.getAllResponseHeaders </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;"> </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">Fetch Response.* </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">ReadResponseBody </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">XMLHttpRequest.response </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;"> </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">Body.* (Response is a Body) </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">FinishStreamingToFile </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No direct equivalent</td>
+    <td style="font-size: 11px; padding: 5px;">XMLHttpRequest and Fetch both assume streaming to memory, rather than directly to a storage. </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Close </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">XMLHttpRequest.abort </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;"> </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No Fetch API equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_URLRequestInfo</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Create </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">XMLHttpRequest </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;"> </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">Fetch Request </td>
+    <td style="font-size: 11px; padding: 5px;">No way to stream to a file. </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">SetProperty </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No direct equivalent for XMLHttpRequest</td>
+    <td style="font-size: 11px; padding: 5px;">XMLHttpRequest doesn't provide direct ways to per-request limit following redirects, stream to a file, set referrer or credentials policy. </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;"> </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">Request.* </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">AppendDataToBody </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">XMLHttpRequest.send </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - Both must have the whole body, rather than a chunk.</td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;"> </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">fetch(.., options:body) </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">AppendFileToBody </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No direct equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;"> </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">N/A </td>
+    <td style="font-size: 11px; padding: 5px;">&lt;form&gt; </td>
+    <td style="font-size: 11px; padding: 5px;">You can also read with FileReader and upload, but that's more like AppendDataToBody </td>
+  </tr>
+
+</table>
+<h3>PPB_URLResponseInfo</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetProperty </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">XMLHttpRequest.getAllResponseHeaders + others </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;"> </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">Fetch Response.* </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetBodyAsFileRef </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">Fetch Response (Body) .blob() </td>
+    <td style="font-size: 11px; padding: 5px;">Assumes storage layer optimizes transfer. </td>
+  </tr>
+
+</table>
+<h3>PPB_Var</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">VarFromUtf8 </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">TextDecoder.decode </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">VarToUtf8 </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">TextEncoder.encode </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">VarFromResource </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">N/A </td>
+    <td style="font-size: 11px; padding: 5px;">N/A </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">VarToResource </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">N/A </td>
+    <td style="font-size: 11px; padding: 5px;">N/A </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_VarArray</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Get </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">Array[i] </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Set </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">Array[i] = x </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetLength </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">Array.length </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">SetLength </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">Array.length = n </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_VarArrayBuffer</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Create </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">new ArrayBuffer(n) </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">ByteLength </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">ArrayBuffer.byteLength </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Map </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No direct equivalent</td>
+    <td style="font-size: 11px; padding: 5px;">Asm.js / Wasm modules are unable to map regions of an ArrayBuffer other than their single linear memory heap.
+Future multiple memories or memory mapping might improve this. </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Unmap </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No direct equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_VarDictionary</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Create </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">{} </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Get </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">&lt;Object&gt;[i] </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Set </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">&lt;Object&gt;[i] = x </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Delete </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">delete &lt;Object&gt;[i] </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">HasKey </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">x in &lt;Object&gt; </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetKeys </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">for (k in &lt;Object&gt;) {} </td>
+    <td style="font-size: 11px; padding: 5px;">No literal equivalent, but it can be built. </td>
+  </tr>
+
+</table>
+<h3>PPB_VideoDecoder</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Create </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Initialize </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Decode </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetPicture </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">RecyclePicture </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Flush </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Reset </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_VideoEncoder</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Create </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;">Overlap with MediaRecorder API, but not exact. </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetSupportedProfiles </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Initialize </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetFramesRequired </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetFrameCodedSize </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetVideoFrame </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Encode </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetBitstreamBuffer </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">RecycleBitstreamBuffer </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">RequestEncodingParametersChange </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Close </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_VideoFrame</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetTimestamp </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">SetTimestamp </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetFormat </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetSize </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetDataBuffer </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetDataBufferSize </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No equivalent</td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_View</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetRect </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">Element.getBoundingClientRect </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">IsFullscreen </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">Document.fullScreenEnabled </td>
+    <td style="font-size: 11px; padding: 5px;">Pertains to document instead of just single element. </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">IsVisible </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">IntersectionObserver </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">IsPageVisible </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">document.visibilityState </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetClipRect </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">IntersectionObserver </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetDeviceScale </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">window.devicePixelRatio </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetCSSScale </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">&lt;Element&gt;.getBoundingClientRect().width / &lt;Element&gt;.offsetWidth </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetScrollOffset </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">&lt;Element&gt;.scrollTop / &lt;Element&gt;.scrollLeft </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPB_WebSocket</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Create </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">WebSocket.WebSocket </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Connect </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">WebSocket.WebSocket(url, ...)
+WebSocket 'open' Event </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Close </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">WebSocket.close </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">ReceiveMessage </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">WebSocket 'message' Event
+WebSocket 'error' Event
+WebSocket 'close' Event </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">SendMessage </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">WebSocket.send </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetBufferedAmount </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">WebSocket.bufferedAmount </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetCloseCode </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">CloseEvent.code </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetCloseReason </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">CloseEvent.reason </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetCloseWasClean </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">CloseEvent.wasClean </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetExtensions </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">WebSocket.extensions </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetProtocol </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">WebSocket.protocol </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetReadyState </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">WebSocket.readyState </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">GetURL </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP</td>
+    <td style="font-size: 11px; padding: 5px;">WebSocket.url </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPP_Graphics3D</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">Graphics3DContextLost </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">Canvas 'webglcontextlost' Event </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPP_InputEvent</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">HandleInputEvent </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">Element.addEventListener </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPP_Instance</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">DidCreate </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">N/A </td>
+    <td style="font-size: 11px; padding: 5px;">&lt;Element&gt;[key] </td>
+    <td style="font-size: 11px; padding: 5px;">General DOM access lets you fish out tag attributes </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">DidDestroy </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">N/A </td>
+    <td style="font-size: 11px; padding: 5px;">N/A </td>
+    <td style="font-size: 11px; padding: 5px;">Not triggered for NaCl </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">DidChangeView </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">N/A </td>
+    <td style="font-size: 11px; padding: 5px;">Element 'resize' Event </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">DidChangeFocus </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">N/A </td>
+    <td style="font-size: 11px; padding: 5px;">Element 'focus', 'focusin', 'focusout' Events </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">HandleDocumentLoad </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">N/A </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No way to register as a mime type handler</td>
+    <td style="font-size: 11px; padding: 5px;">NaCl modules via apps + a manifest entry can be set up to handle particular mime types. </td>
+  </tr>
+
+</table>
+<h3>PPP_MessageHandler</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">HandleMessage </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">MessagePort 'message' Event
+Window 'message' Event </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">HandleBlockingMessage </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">N/A </td>
+    <td bgcolor="#ffcccc" style="font-size: 11px; padding: 5px;">GAP - No direct equivalent</td>
+    <td style="font-size: 11px; padding: 5px;">Similar synchronization can be done off main thread with Atomics.wait. This was added to support emulation of synchronous plugin APIs. </td>
+  </tr>
+
+</table>
+<h3>PPP_Messaging</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">HandleMessage </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">embind </td>
+    <td style="font-size: 11px; padding: 5px;">MessagePort 'message' Event
+Window 'message' Event </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
+<h3>PPP_MouseLock</h3>
+<table>
+  <tr bgcolor="#77ccff" style="color:white; font-weight: bold;">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">PPAPI Method </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;">Assumes Threads </td>
+    <td style="font-size: 11px; padding: 5px;">Emscripten </td>
+    <td style="font-size: 11px; padding: 5px;">Web API </td>
+    <td style="font-size: 11px; padding: 5px;">Limitations </td>
+  </tr>
+
+  <tr bgcolor="#fcfcfc">
+    <td style="font-weight: bold; font-size: 11px; padding: 5px;">MouseLockLost </td>
+    <td style="width: 50px; text-align: center; font-size: 11px; padding: 5px;"> </td>
+    <td style="font-size: 11px; padding: 5px;">SDL </td>
+    <td style="font-size: 11px; padding: 5px;">Element 'pointerlockchange', 'pointerlockerror' Events </td>
+    <td style="font-size: 11px; padding: 5px;"> </td>
+  </tr>
+
+</table>
diff --git a/native_client_sdk/src/doc/nacl-and-pnacl.rst b/native_client_sdk/src/doc/nacl-and-pnacl.rst
index 8c6af21..a756b7c 100644
--- a/native_client_sdk/src/doc/nacl-and-pnacl.rst
+++ b/native_client_sdk/src/doc/nacl-and-pnacl.rst
@@ -1,5 +1,7 @@
 .. _nacl-and-pnacl:
 
+.. include:: /migration/deprecation.inc
+
 ##############
 NaCl and PNaCl
 ##############
diff --git a/native_client_sdk/src/doc/nacldev.rst b/native_client_sdk/src/doc/nacldev.rst
index da23c48..68ad352 100644
--- a/native_client_sdk/src/doc/nacldev.rst
+++ b/native_client_sdk/src/doc/nacldev.rst
@@ -1,5 +1,7 @@
 .. _nacldev:
 
+.. include:: /migration/deprecation.inc
+
 ####################
 NaCl Dev Environment
 ####################
diff --git a/native_client_sdk/src/doc/overview.rst b/native_client_sdk/src/doc/overview.rst
index a303b1f5..fa59e42 100644
--- a/native_client_sdk/src/doc/overview.rst
+++ b/native_client_sdk/src/doc/overview.rst
@@ -1,5 +1,7 @@
 .. _overview:
 
+.. include:: /migration/deprecation.inc
+
 ##################
 Technical Overview
 ##################
diff --git a/native_client_sdk/src/doc/pepper_beta/index.rst b/native_client_sdk/src/doc/pepper_beta/index.rst
index 58e6fc5..9d80dc6 100644
--- a/native_client_sdk/src/doc/pepper_beta/index.rst
+++ b/native_client_sdk/src/doc/pepper_beta/index.rst
@@ -1,16 +1,17 @@
 .. _pepper_beta_index:
 
-
 :orphan:
 
 .. DO NOT EDIT! This document is auto-generated by doxygen/rst_index.py.
 
+.. include:: /migration/deprecation.inc
+
 ########################################
 Pepper API Reference (Beta)
 ########################################
 
-This page lists the API for Pepper 49. Apps that use this API can
-run in Chrome 49 or higher.
+This page lists the API for Pepper 59. Apps that use this API can
+run in Chrome 59 or higher.
 
 :ref:`Pepper C API Reference <pepper_beta_c_index>`
 ===========================================================
diff --git a/native_client_sdk/src/doc/pepper_dev/index.rst b/native_client_sdk/src/doc/pepper_dev/index.rst
index 564138e..163639ac 100644
--- a/native_client_sdk/src/doc/pepper_dev/index.rst
+++ b/native_client_sdk/src/doc/pepper_dev/index.rst
@@ -1,16 +1,17 @@
 .. _pepper_dev_index:
 
-
 :orphan:
 
 .. DO NOT EDIT! This document is auto-generated by doxygen/rst_index.py.
 
+.. include:: /migration/deprecation.inc
+
 ########################################
 Pepper API Reference (Dev)
 ########################################
 
-This page lists the API for Pepper 50. Apps that use this API can
-run in Chrome 50 or higher.
+This page lists the API for Pepper 60. Apps that use this API can
+run in Chrome 60 or higher.
 
 :ref:`Pepper C API Reference <pepper_dev_c_index>`
 ===========================================================
diff --git a/native_client_sdk/src/doc/pepper_stable/index.rst b/native_client_sdk/src/doc/pepper_stable/index.rst
index cb3f394..049a3ac 100644
--- a/native_client_sdk/src/doc/pepper_stable/index.rst
+++ b/native_client_sdk/src/doc/pepper_stable/index.rst
@@ -1,16 +1,17 @@
 .. _pepper_stable_index:
 
-
 :orphan:
 
 .. DO NOT EDIT! This document is auto-generated by doxygen/rst_index.py.
 
+.. include:: /migration/deprecation.inc
+
 ########################################
 Pepper API Reference (Stable)
 ########################################
 
-This page lists the API for Pepper 48. Apps that use this API can
-run in Chrome 48 or higher.
+This page lists the API for Pepper 58. Apps that use this API can
+run in Chrome 58 or higher.
 
 :ref:`Pepper C API Reference <pepper_stable_c_index>`
 ===========================================================
diff --git a/native_client_sdk/src/doc/publications-and-presentations.rst b/native_client_sdk/src/doc/publications-and-presentations.rst
index 1133b023..3f8b9fc6 100644
--- a/native_client_sdk/src/doc/publications-and-presentations.rst
+++ b/native_client_sdk/src/doc/publications-and-presentations.rst
@@ -1,5 +1,7 @@
 .. _publications_and_presentations:
 
+.. include:: /migration/deprecation.inc
+
 ##############################
 Publications and Presentations
 ##############################
diff --git a/native_client_sdk/src/doc/quick-start.rst b/native_client_sdk/src/doc/quick-start.rst
index 89535d6d..cf838a901 100644
--- a/native_client_sdk/src/doc/quick-start.rst
+++ b/native_client_sdk/src/doc/quick-start.rst
@@ -1,5 +1,7 @@
 .. _quick-start:
 
+.. include:: /migration/deprecation.inc
+
 ###########
 Quick-start
 ###########
diff --git a/native_client_sdk/src/doc/reference/design-docs.rst b/native_client_sdk/src/doc/reference/design-docs.rst
index b1f19b5..c549d751 100644
--- a/native_client_sdk/src/doc/reference/design-docs.rst
+++ b/native_client_sdk/src/doc/reference/design-docs.rst
@@ -1,3 +1,5 @@
+.. include:: /migration/deprecation.inc
+
 ================
 Design Documents
 ================
diff --git a/native_client_sdk/src/doc/reference/ideas.rst b/native_client_sdk/src/doc/reference/ideas.rst
index 635e988..fbef0690 100644
--- a/native_client_sdk/src/doc/reference/ideas.rst
+++ b/native_client_sdk/src/doc/reference/ideas.rst
@@ -1,5 +1,7 @@
 .. _ideas:
 
+.. include:: /migration/deprecation.inc
+
 #################
 Contributor Ideas
 #################
diff --git a/native_client_sdk/src/doc/reference/index.rst b/native_client_sdk/src/doc/reference/index.rst
index d409c0e1..fe33c85 100644
--- a/native_client_sdk/src/doc/reference/index.rst
+++ b/native_client_sdk/src/doc/reference/index.rst
@@ -1,3 +1,5 @@
+.. include:: /migration/deprecation.inc
+
 #########
 Reference
 #########
diff --git a/native_client_sdk/src/doc/reference/nacl-manifest-format.rst b/native_client_sdk/src/doc/reference/nacl-manifest-format.rst
index 2df2de1d..1dad61e 100644
--- a/native_client_sdk/src/doc/reference/nacl-manifest-format.rst
+++ b/native_client_sdk/src/doc/reference/nacl-manifest-format.rst
@@ -1,3 +1,5 @@
+.. include:: /migration/deprecation.inc
+
 ###################################
 Native Client Manifest (nmf) Format
 ###################################
diff --git a/native_client_sdk/src/doc/reference/pnacl-bitcode-abi.rst b/native_client_sdk/src/doc/reference/pnacl-bitcode-abi.rst
index 2cc44da..d1f4ccc8 100644
--- a/native_client_sdk/src/doc/reference/pnacl-bitcode-abi.rst
+++ b/native_client_sdk/src/doc/reference/pnacl-bitcode-abi.rst
@@ -1,3 +1,5 @@
+.. include:: /migration/deprecation.inc
+
 ==============================
 PNaCl Bitcode Reference Manual
 ==============================
diff --git a/native_client_sdk/src/doc/reference/pnacl-bitcode-manual.rst b/native_client_sdk/src/doc/reference/pnacl-bitcode-manual.rst
index fc27d4c..bc6622a 100644
--- a/native_client_sdk/src/doc/reference/pnacl-bitcode-manual.rst
+++ b/native_client_sdk/src/doc/reference/pnacl-bitcode-manual.rst
@@ -1,3 +1,5 @@
+.. include:: /migration/deprecation.inc
+
 ===============================
 Contents Of PNaCl Bitcode Files
 ===============================
diff --git a/native_client_sdk/src/doc/reference/pnacl-c-cpp-language-support.rst b/native_client_sdk/src/doc/reference/pnacl-c-cpp-language-support.rst
index d92ac17..10472c7f2 100644
--- a/native_client_sdk/src/doc/reference/pnacl-c-cpp-language-support.rst
+++ b/native_client_sdk/src/doc/reference/pnacl-c-cpp-language-support.rst
@@ -1,3 +1,5 @@
+.. include:: /migration/deprecation.inc
+
 ============================
 PNaCl C/C++ Language Support
 ============================
diff --git a/native_client_sdk/src/doc/reference/pnacl-undefined-behavior.rst b/native_client_sdk/src/doc/reference/pnacl-undefined-behavior.rst
index 7ab270a..dc55c73 100644
--- a/native_client_sdk/src/doc/reference/pnacl-undefined-behavior.rst
+++ b/native_client_sdk/src/doc/reference/pnacl-undefined-behavior.rst
@@ -1,3 +1,5 @@
+.. include:: /migration/deprecation.inc
+
 ========================
 PNaCl Undefined Behavior
 ========================
diff --git a/native_client_sdk/src/doc/reference/sandbox_internals/arm-32-bit-sandbox.rst b/native_client_sdk/src/doc/reference/sandbox_internals/arm-32-bit-sandbox.rst
index 919c3fd..c362bdf 100644
--- a/native_client_sdk/src/doc/reference/sandbox_internals/arm-32-bit-sandbox.rst
+++ b/native_client_sdk/src/doc/reference/sandbox_internals/arm-32-bit-sandbox.rst
@@ -1,5 +1,7 @@
 .. _arm-32-bit-sandbox:
 
+.. include:: /migration/deprecation.inc
+
 ==================
 ARM 32-bit Sandbox
 ==================
diff --git a/native_client_sdk/src/doc/reference/sandbox_internals/index.rst b/native_client_sdk/src/doc/reference/sandbox_internals/index.rst
index b8bd1dab..ba6a6cce 100644
--- a/native_client_sdk/src/doc/reference/sandbox_internals/index.rst
+++ b/native_client_sdk/src/doc/reference/sandbox_internals/index.rst
@@ -1,5 +1,7 @@
 .. _sandbox-internals-index:
 
+.. include:: /migration/deprecation.inc
+
 #################
 Sandbox Internals
 #################
diff --git a/native_client_sdk/src/doc/reference/sandbox_internals/x86-64-sandbox.rst b/native_client_sdk/src/doc/reference/sandbox_internals/x86-64-sandbox.rst
index 7061d937..a02990f7 100644
--- a/native_client_sdk/src/doc/reference/sandbox_internals/x86-64-sandbox.rst
+++ b/native_client_sdk/src/doc/reference/sandbox_internals/x86-64-sandbox.rst
@@ -1,5 +1,7 @@
 .. _x86-64-sandbox:
 
+.. include:: /migration/deprecation.inc
+
 ================================
 NaCl SFI model on x86-64 systems
 ================================
diff --git a/native_client_sdk/src/doc/sdk/download.rst b/native_client_sdk/src/doc/sdk/download.rst
index d207438..228cf516 100644
--- a/native_client_sdk/src/doc/sdk/download.rst
+++ b/native_client_sdk/src/doc/sdk/download.rst
@@ -1,5 +1,7 @@
 .. _download:
 
+.. include:: /migration/deprecation.inc
+
 Download the Native Client SDK
 ==============================
 
diff --git a/native_client_sdk/src/doc/sdk/examples.rst b/native_client_sdk/src/doc/sdk/examples.rst
index 2bb0521..cabd206 100644
--- a/native_client_sdk/src/doc/sdk/examples.rst
+++ b/native_client_sdk/src/doc/sdk/examples.rst
@@ -2,6 +2,8 @@
 
 .. TODO: After default toolchain is changed to pnacl, recreate the make examples.
 
+.. include:: /migration/deprecation.inc
+
 Examples
 ========
 
diff --git a/native_client_sdk/src/doc/sdk/release-notes.rst b/native_client_sdk/src/doc/sdk/release-notes.rst
index 5c280c0c..e690a28 100644
--- a/native_client_sdk/src/doc/sdk/release-notes.rst
+++ b/native_client_sdk/src/doc/sdk/release-notes.rst
@@ -1,5 +1,7 @@
 .. _sdk-release-notes:
 
+.. include:: /migration/deprecation.inc
+
 #############
 Release Notes
 #############
diff --git a/native_client_sdk/src/doc/sitemap.rst b/native_client_sdk/src/doc/sitemap.rst
index b1c9c06..bc850a4 100644
--- a/native_client_sdk/src/doc/sitemap.rst
+++ b/native_client_sdk/src/doc/sitemap.rst
@@ -1,5 +1,7 @@
 :orphan:
 
+.. include:: /migration/deprecation.inc
+
 Native Client Documentation Sitemap
 ===================================
 
@@ -11,6 +13,7 @@
    overview.rst
    quick-start.rst
    nacl-and-pnacl.rst
+   migration/index.rst
    glossary.rst
    sdk/download.rst
    sdk/examples.rst
diff --git a/net/quic/chromium/crypto/proof_verifier_chromium_test.cc b/net/quic/chromium/crypto/proof_verifier_chromium_test.cc
index 6174abb..6c9efa69 100644
--- a/net/quic/chromium/crypto/proof_verifier_chromium_test.cc
+++ b/net/quic/chromium/crypto/proof_verifier_chromium_test.cc
@@ -4,6 +4,7 @@
 
 #include "net/quic/chromium/crypto/proof_verifier_chromium.h"
 
+#include "base/memory/ptr_util.h"
 #include "base/memory/ref_counted.h"
 #include "net/base/net_errors.h"
 #include "net/cert/cert_status_flags.h"
@@ -15,6 +16,7 @@
 #include "net/cert/mock_cert_verifier.h"
 #include "net/cert/multi_log_ct_verifier.h"
 #include "net/http/transport_security_state.h"
+#include "net/quic/chromium/crypto/proof_source_chromium.h"
 #include "net/quic/core/crypto/proof_verifier.h"
 #include "net/test/cert_test_util.h"
 #include "net/test/ct_test_util.h"
@@ -85,6 +87,22 @@
                CTRequirementLevel(const std::string& host));
 };
 
+// Proof source callback which saves the signature into |signature|.
+class SignatureSaver : public ProofSource::Callback {
+ public:
+  explicit SignatureSaver(std::string* signature) : signature_(signature) {}
+  ~SignatureSaver() override {}
+
+  void Run(bool /*ok*/,
+           const QuicReferenceCountedPointer<ProofSource::Chain>& /*chain*/,
+           const QuicCryptoProof& proof,
+           std::unique_ptr<ProofSource::Details> /*details*/) override {
+    *signature_ = proof.signature;
+  }
+
+  std::string* signature_;
+};
+
 class DummyProofVerifierCallback : public ProofVerifierCallback {
  public:
   DummyProofVerifierCallback() {}
@@ -98,6 +116,8 @@
 };
 
 const char kTestHostname[] = "test.example.com";
+const char kTestChloHash[] = "CHLO hash";
+const char kTestEmptySCT[] = "";
 const uint16_t kTestPort = 8443;
 const char kTestConfig[] = "server config bytes";
 const char kLogDescription[] = "somelog";
@@ -148,35 +168,16 @@
   }
 
   std::string GetTestSignature() {
-    // Sample known answer test from ProofTest.VerifyRSAKnownAnswerTest.
-    // Generated by dumping the bytes of the |signature| output of
-    // ProofSource::GetProof().
-    static const unsigned char kTestSignature[] = {
-        0x31, 0xd5, 0xfb, 0x40, 0x30, 0x75, 0xd2, 0x7d, 0x61, 0xf9, 0xd7, 0x54,
-        0x30, 0x06, 0xaf, 0x54, 0x0d, 0xb0, 0x0a, 0xda, 0x63, 0xca, 0x7e, 0x9e,
-        0xce, 0xba, 0x10, 0x05, 0x1b, 0xa6, 0x7f, 0xef, 0x2b, 0xa3, 0xff, 0x3c,
-        0xbb, 0x9a, 0xe4, 0xbf, 0xb8, 0x0c, 0xc1, 0xbd, 0xed, 0xc2, 0x90, 0x68,
-        0xeb, 0x45, 0x48, 0xea, 0x3c, 0x95, 0xf8, 0xa2, 0xb9, 0xe7, 0x62, 0x29,
-        0x00, 0xc3, 0x18, 0xb4, 0x16, 0x6f, 0x5e, 0xb0, 0xc1, 0x26, 0xc0, 0x4b,
-        0x84, 0xf5, 0x97, 0xfc, 0x17, 0xf9, 0x1c, 0x43, 0xb8, 0xf2, 0x3f, 0x38,
-        0x32, 0xad, 0x36, 0x52, 0x2c, 0x26, 0x92, 0x7a, 0xea, 0x2c, 0xa2, 0xf4,
-        0x28, 0x2f, 0x19, 0x4d, 0x1f, 0x11, 0x46, 0x82, 0xd0, 0xc4, 0x86, 0x56,
-        0x5c, 0x97, 0x9e, 0xc6, 0x37, 0x8e, 0xaf, 0x9d, 0x69, 0xe9, 0x4f, 0x5a,
-        0x6d, 0x70, 0x75, 0xc7, 0x41, 0x95, 0x68, 0x53, 0x94, 0xca, 0x31, 0x63,
-        0x61, 0x9f, 0xb8, 0x8c, 0x3b, 0x75, 0x36, 0x8b, 0x69, 0xa2, 0x35, 0xc0,
-        0x4b, 0x77, 0x55, 0x08, 0xc2, 0xb4, 0x56, 0xd2, 0x81, 0xce, 0x9e, 0x25,
-        0xdb, 0x50, 0x74, 0xb3, 0x8a, 0xd9, 0x20, 0x42, 0x3f, 0x85, 0x2d, 0xaa,
-        0xfd, 0x66, 0xfa, 0xd6, 0x95, 0x55, 0x6b, 0x63, 0x63, 0x04, 0xf8, 0x6c,
-        0x3e, 0x08, 0x22, 0x39, 0xb9, 0x9a, 0xe0, 0xd7, 0x01, 0xff, 0xeb, 0x8a,
-        0xb9, 0xe2, 0x34, 0xa5, 0xa0, 0x51, 0xe9, 0xbe, 0x15, 0x12, 0xbf, 0xbe,
-        0x64, 0x3d, 0x3f, 0x98, 0xce, 0xc1, 0xa6, 0x33, 0x32, 0xd3, 0x5c, 0xa8,
-        0x39, 0x93, 0xdc, 0x1c, 0xb9, 0xab, 0x3c, 0x80, 0x62, 0xb3, 0x76, 0x21,
-        0xdf, 0x47, 0x1e, 0xa9, 0x0e, 0x5e, 0x8a, 0xbe, 0x66, 0x5b, 0x7c, 0x21,
-        0xfa, 0x78, 0x2d, 0xd1, 0x1d, 0x5c, 0x35, 0x8a, 0x34, 0xb2, 0x1a, 0xc2,
-        0xc4, 0x4b, 0x53, 0x54,
-    };
-    return std::string(reinterpret_cast<const char*>(kTestSignature),
-                       sizeof(kTestSignature));
+    ProofSourceChromium source;
+    source.Initialize(
+        GetTestCertsDirectory().AppendASCII("quic_test.example.com.crt"),
+        GetTestCertsDirectory().AppendASCII("quic_test.example.com.key.pkcs8"),
+        GetTestCertsDirectory().AppendASCII("quic_test.example.com.key.sct"));
+    std::string signature;
+    source.GetProof(QuicSocketAddress(), kTestHostname, kTestConfig,
+                    QUIC_VERSION_35, kTestChloHash, QuicTagVector(),
+                    base::MakeUnique<SignatureSaver>(&signature));
+    return signature;
   }
 
   void GetSCTTestCertificates(std::vector<std::string>* certs) {
@@ -224,7 +225,7 @@
 
 // Tests that the ProofVerifier fails verification if certificate
 // verification fails.
-TEST_F(ProofVerifierChromiumTest, DISABLED_FailsIfCertFails) {
+TEST_F(ProofVerifierChromiumTest, FailsIfCertFails) {
   MockCertVerifier dummy_verifier;
   ProofVerifierChromium proof_verifier(&dummy_verifier, &ct_policy_enforcer_,
                                        &transport_security_state_,
@@ -233,18 +234,19 @@
   std::unique_ptr<DummyProofVerifierCallback> callback(
       new DummyProofVerifierCallback);
   QuicAsyncStatus status = proof_verifier.VerifyProof(
-      kTestHostname, kTestPort, kTestConfig, QUIC_VERSION_35, "", certs_, "",
-      GetTestSignature(), verify_context_.get(), &error_details_, &details_,
-      std::move(callback));
+      kTestHostname, kTestPort, kTestConfig, QUIC_VERSION_35, kTestChloHash,
+      certs_, kTestEmptySCT, GetTestSignature(), verify_context_.get(),
+      &error_details_, &details_, std::move(callback));
   ASSERT_EQ(QUIC_FAILURE, status);
 }
 
 // Valid SCT, but invalid signature.
-TEST_F(ProofVerifierChromiumTest, DISABLED_ValidSCTList) {
+TEST_F(ProofVerifierChromiumTest, ValidSCTList) {
   // Use different certificates for SCT tests.
   ASSERT_NO_FATAL_FAILURE(GetSCTTestCertificates(&certs_));
 
   MockCertVerifier cert_verifier;
+
   ProofVerifierChromium proof_verifier(&cert_verifier, &ct_policy_enforcer_,
                                        &transport_security_state_,
                                        ct_verifier_.get());
@@ -252,15 +254,15 @@
   std::unique_ptr<DummyProofVerifierCallback> callback(
       new DummyProofVerifierCallback);
   QuicAsyncStatus status = proof_verifier.VerifyProof(
-      kTestHostname, kTestPort, kTestConfig, QUIC_VERSION_35, "", certs_,
-      ct::GetSCTListForTesting(), "", verify_context_.get(), &error_details_,
-      &details_, std::move(callback));
+      kTestHostname, kTestPort, kTestConfig, QUIC_VERSION_35, kTestChloHash,
+      certs_, ct::GetSCTListForTesting(), kTestEmptySCT, verify_context_.get(),
+      &error_details_, &details_, std::move(callback));
   ASSERT_EQ(QUIC_FAILURE, status);
   CheckSCT(/*sct_expected_ok=*/true);
 }
 
 // Invalid SCT and signature.
-TEST_F(ProofVerifierChromiumTest, DISABLED_InvalidSCTList) {
+TEST_F(ProofVerifierChromiumTest, InvalidSCTList) {
   // Use different certificates for SCT tests.
   ASSERT_NO_FATAL_FAILURE(GetSCTTestCertificates(&certs_));
 
@@ -272,16 +274,16 @@
   std::unique_ptr<DummyProofVerifierCallback> callback(
       new DummyProofVerifierCallback);
   QuicAsyncStatus status = proof_verifier.VerifyProof(
-      kTestHostname, kTestPort, kTestConfig, QUIC_VERSION_35, "", certs_,
-      ct::GetSCTListWithInvalidSCT(), "", verify_context_.get(),
-      &error_details_, &details_, std::move(callback));
+      kTestHostname, kTestPort, kTestConfig, QUIC_VERSION_35, kTestChloHash,
+      certs_, ct::GetSCTListWithInvalidSCT(), kTestEmptySCT,
+      verify_context_.get(), &error_details_, &details_, std::move(callback));
   ASSERT_EQ(QUIC_FAILURE, status);
   CheckSCT(/*sct_expected_ok=*/false);
 }
 
 // Tests that the ProofVerifier doesn't verify certificates if the config
 // signature fails.
-TEST_F(ProofVerifierChromiumTest, DISABLED_FailsIfSignatureFails) {
+TEST_F(ProofVerifierChromiumTest, FailsIfSignatureFails) {
   FailsTestCertVerifier cert_verifier;
   ProofVerifierChromium proof_verifier(&cert_verifier, &ct_policy_enforcer_,
                                        &transport_security_state_,
@@ -290,15 +292,15 @@
   std::unique_ptr<DummyProofVerifierCallback> callback(
       new DummyProofVerifierCallback);
   QuicAsyncStatus status = proof_verifier.VerifyProof(
-      kTestHostname, kTestPort, kTestConfig, QUIC_VERSION_35, "", certs_, "",
-      kTestConfig, verify_context_.get(), &error_details_, &details_,
-      std::move(callback));
+      kTestHostname, kTestPort, kTestConfig, QUIC_VERSION_35, kTestChloHash,
+      certs_, kTestEmptySCT, kTestConfig, verify_context_.get(),
+      &error_details_, &details_, std::move(callback));
   ASSERT_EQ(QUIC_FAILURE, status);
 }
 
 // Tests that the certificate policy enforcer is consulted for EV
 // and the certificate is allowed to be EV.
-TEST_F(ProofVerifierChromiumTest, DISABLED_PreservesEVIfAllowed) {
+TEST_F(ProofVerifierChromiumTest, PreservesEVIfAllowed) {
   scoped_refptr<X509Certificate> test_cert = GetTestServerCertificate();
   ASSERT_TRUE(test_cert);
 
@@ -320,9 +322,9 @@
   std::unique_ptr<DummyProofVerifierCallback> callback(
       new DummyProofVerifierCallback);
   QuicAsyncStatus status = proof_verifier.VerifyProof(
-      kTestHostname, kTestPort, kTestConfig, QUIC_VERSION_35, "", certs_, "",
-      GetTestSignature(), verify_context_.get(), &error_details_, &details_,
-      std::move(callback));
+      kTestHostname, kTestPort, kTestConfig, QUIC_VERSION_35, kTestChloHash,
+      certs_, kTestEmptySCT, GetTestSignature(), verify_context_.get(),
+      &error_details_, &details_, std::move(callback));
   ASSERT_EQ(QUIC_SUCCESS, status);
 
   ASSERT_TRUE(details_.get());
@@ -334,7 +336,7 @@
 
 // Tests that the certificate policy enforcer is consulted for EV
 // and the certificate is not allowed to be EV.
-TEST_F(ProofVerifierChromiumTest, DISABLED_StripsEVIfNotAllowed) {
+TEST_F(ProofVerifierChromiumTest, StripsEVIfNotAllowed) {
   scoped_refptr<X509Certificate> test_cert = GetTestServerCertificate();
   ASSERT_TRUE(test_cert);
 
@@ -356,9 +358,9 @@
   std::unique_ptr<DummyProofVerifierCallback> callback(
       new DummyProofVerifierCallback);
   QuicAsyncStatus status = proof_verifier.VerifyProof(
-      kTestHostname, kTestPort, kTestConfig, QUIC_VERSION_35, "", certs_, "",
-      GetTestSignature(), verify_context_.get(), &error_details_, &details_,
-      std::move(callback));
+      kTestHostname, kTestPort, kTestConfig, QUIC_VERSION_35, kTestChloHash,
+      certs_, kTestEmptySCT, GetTestSignature(), verify_context_.get(),
+      &error_details_, &details_, std::move(callback));
   ASSERT_EQ(QUIC_SUCCESS, status);
 
   ASSERT_TRUE(details_.get());
@@ -371,7 +373,7 @@
 
 // Tests that the certificate policy enforcer is not consulted if
 // the certificate is not EV.
-TEST_F(ProofVerifierChromiumTest, DISABLED_IgnoresPolicyEnforcerIfNotEV) {
+TEST_F(ProofVerifierChromiumTest, IgnoresPolicyEnforcerIfNotEV) {
   scoped_refptr<X509Certificate> test_cert = GetTestServerCertificate();
   ASSERT_TRUE(test_cert);
 
@@ -391,9 +393,9 @@
   std::unique_ptr<DummyProofVerifierCallback> callback(
       new DummyProofVerifierCallback);
   QuicAsyncStatus status = proof_verifier.VerifyProof(
-      kTestHostname, kTestPort, kTestConfig, QUIC_VERSION_35, "", certs_, "",
-      GetTestSignature(), verify_context_.get(), &error_details_, &details_,
-      std::move(callback));
+      kTestHostname, kTestPort, kTestConfig, QUIC_VERSION_35, kTestChloHash,
+      certs_, kTestEmptySCT, GetTestSignature(), verify_context_.get(),
+      &error_details_, &details_, std::move(callback));
   ASSERT_EQ(QUIC_SUCCESS, status);
 
   ASSERT_TRUE(details_.get());
@@ -411,7 +413,7 @@
 }
 
 // Test that PKP is enforced for certificates that chain up to known roots.
-TEST_F(ProofVerifierChromiumTest, DISABLED_PKPEnforced) {
+TEST_F(ProofVerifierChromiumTest, PKPEnforced) {
   scoped_refptr<X509Certificate> test_cert = GetTestServerCertificate();
   ASSERT_TRUE(test_cert);
 
@@ -436,9 +438,9 @@
   std::unique_ptr<DummyProofVerifierCallback> callback(
       new DummyProofVerifierCallback);
   QuicAsyncStatus status = proof_verifier.VerifyProof(
-      kTestHostname, kTestPort, kTestConfig, QUIC_VERSION_35, "", certs_, "",
-      GetTestSignature(), verify_context_.get(), &error_details_, &details_,
-      std::move(callback));
+      kTestHostname, kTestPort, kTestConfig, QUIC_VERSION_35, kTestChloHash,
+      certs_, kTestEmptySCT, GetTestSignature(), verify_context_.get(),
+      &error_details_, &details_, std::move(callback));
   ASSERT_EQ(QUIC_FAILURE, status);
 
   ASSERT_TRUE(details_.get());
@@ -452,7 +454,7 @@
 
 // Test |pkp_bypassed| is set when PKP is bypassed due to a local
 // trust anchor
-TEST_F(ProofVerifierChromiumTest, DISABLED_PKPBypassFlagSet) {
+TEST_F(ProofVerifierChromiumTest, PKPBypassFlagSet) {
   scoped_refptr<X509Certificate> test_cert = GetTestServerCertificate();
   ASSERT_TRUE(test_cert);
 
@@ -477,9 +479,9 @@
   std::unique_ptr<DummyProofVerifierCallback> callback(
       new DummyProofVerifierCallback);
   QuicAsyncStatus status = proof_verifier.VerifyProof(
-      kTestHostname, kTestPort, kTestConfig, QUIC_VERSION_35, "", certs_, "",
-      GetTestSignature(), verify_context_.get(), &error_details_, &details_,
-      std::move(callback));
+      kTestHostname, kTestPort, kTestConfig, QUIC_VERSION_35, kTestChloHash,
+      certs_, kTestEmptySCT, GetTestSignature(), verify_context_.get(),
+      &error_details_, &details_, std::move(callback));
   ASSERT_EQ(QUIC_SUCCESS, status);
 
   ASSERT_TRUE(details_.get());
@@ -490,7 +492,7 @@
 
 // Test that when CT is required (in this case, by the delegate), the
 // absence of CT information is a socket error.
-TEST_F(ProofVerifierChromiumTest, DISABLED_CTIsRequired) {
+TEST_F(ProofVerifierChromiumTest, CTIsRequired) {
   scoped_refptr<X509Certificate> test_cert = GetTestServerCertificate();
   ASSERT_TRUE(test_cert);
 
@@ -523,9 +525,9 @@
   std::unique_ptr<DummyProofVerifierCallback> callback(
       new DummyProofVerifierCallback);
   QuicAsyncStatus status = proof_verifier.VerifyProof(
-      kTestHostname, kTestPort, kTestConfig, QUIC_VERSION_35, "", certs_, "",
-      GetTestSignature(), verify_context_.get(), &error_details_, &details_,
-      std::move(callback));
+      kTestHostname, kTestPort, kTestConfig, QUIC_VERSION_35, kTestChloHash,
+      certs_, kTestEmptySCT, GetTestSignature(), verify_context_.get(),
+      &error_details_, &details_, std::move(callback));
   ASSERT_EQ(QUIC_FAILURE, status);
 
   ASSERT_TRUE(details_.get());
@@ -536,7 +538,7 @@
 }
 
 // Test that CT is considered even when HPKP fails.
-TEST_F(ProofVerifierChromiumTest, DISABLED_PKPAndCTBothTested) {
+TEST_F(ProofVerifierChromiumTest, PKPAndCTBothTested) {
   scoped_refptr<X509Certificate> test_cert = GetTestServerCertificate();
   ASSERT_TRUE(test_cert);
 
@@ -575,9 +577,9 @@
   std::unique_ptr<DummyProofVerifierCallback> callback(
       new DummyProofVerifierCallback);
   QuicAsyncStatus status = proof_verifier.VerifyProof(
-      kTestHostname, kTestPort, kTestConfig, QUIC_VERSION_35, "", certs_, "",
-      GetTestSignature(), verify_context_.get(), &error_details_, &details_,
-      std::move(callback));
+      kTestHostname, kTestPort, kTestConfig, QUIC_VERSION_35, kTestChloHash,
+      certs_, kTestEmptySCT, GetTestSignature(), verify_context_.get(),
+      &error_details_, &details_, std::move(callback));
   ASSERT_EQ(QUIC_FAILURE, status);
 
   ASSERT_TRUE(details_.get());
diff --git a/net/quic/core/quic_alarm_test.cc b/net/quic/core/quic_alarm_test.cc
index ce4d4b50..e665f313 100644
--- a/net/quic/core/quic_alarm_test.cc
+++ b/net/quic/core/quic_alarm_test.cc
@@ -134,6 +134,7 @@
 TEST_F(QuicAlarmTest, Fire) {
   QuicTime deadline = QuicTime::Zero() + QuicTime::Delta::FromSeconds(7);
   alarm_.Set(deadline);
+  EXPECT_CALL(*delegate_, OnAlarm());
   alarm_.FireAlarm();
   EXPECT_FALSE(alarm_.IsSet());
   EXPECT_FALSE(alarm_.scheduled());
diff --git a/net/quic/core/quic_connection_test.cc b/net/quic/core/quic_connection_test.cc
index 6f95275..3f31667d 100644
--- a/net/quic/core/quic_connection_test.cc
+++ b/net/quic/core/quic_connection_test.cc
@@ -4842,6 +4842,7 @@
   EXPECT_CALL(*loss_algorithm_, DetectLosses(_, _, _, _, _))
       .WillOnce(SetArgPointee<4>(lost_packets));
   EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _));
+  EXPECT_CALL(*listener, OnPacketRetransmitted(3)).Times(1);
   ProcessAckPacket(&frame);
 }
 
@@ -4874,6 +4875,7 @@
   // trigger the callback.
   EXPECT_CALL(*loss_algorithm_, DetectLosses(_, _, _, _, _));
   EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _));
+  EXPECT_CALL(*loss_algorithm_, SpuriousRetransmitDetected(_, _, _, _));
   QuicAckFrame second_ack_frame = InitAckFrame(5);
   ProcessAckPacket(&second_ack_frame);
 }
@@ -4948,6 +4950,7 @@
   // Now we get an ACK for packet 2, which was previously nacked.
   EXPECT_CALL(*listener, OnPacketAcked(3, _));
   EXPECT_CALL(*loss_algorithm_, DetectLosses(_, _, _, _, _));
+  EXPECT_CALL(*loss_algorithm_, SpuriousRetransmitDetected(_, _, _, _));
   QuicAckFrame second_ack_frame = InitAckFrame(4);
   ProcessAckPacket(&second_ack_frame);
 
diff --git a/net/quic/core/quic_crypto_client_stream_test.cc b/net/quic/core/quic_crypto_client_stream_test.cc
index 495438e9..0cb590da 100644
--- a/net/quic/core/quic_crypto_client_stream_test.cc
+++ b/net/quic/core/quic_crypto_client_stream_test.cc
@@ -50,6 +50,9 @@
   }
 
   void CompleteCryptoHandshake() {
+    EXPECT_CALL(*session_, OnProofValid(testing::_));
+    EXPECT_CALL(*session_, OnProofVerifyDetailsAvailable(testing::_))
+        .Times(testing::AnyNumber());
     stream()->CryptoConnect();
     QuicConfig config;
     crypto_test_utils::HandshakeWithFakeServer(&config, &server_helper_,
@@ -141,6 +144,7 @@
   connection_->AdvanceTime(
       QuicTime::Delta::FromSeconds(60 * 60 * 24 * 365 * 5));
 
+  EXPECT_CALL(*session_, OnProofValid(testing::_));
   stream()->CryptoConnect();
   // Check that a client hello was sent.
   ASSERT_EQ(1u, connection_->encrypted_packets_.size());
@@ -177,6 +181,8 @@
   string chlo_hash = state->chlo_hash();
   state->SetProof(certs, cert_sct, chlo_hash, signature + signature);
 
+  EXPECT_CALL(*session_, OnProofVerifyDetailsAvailable(testing::_))
+      .Times(testing::AnyNumber());
   stream()->CryptoConnect();
   // Check that a client hello was sent.
   ASSERT_EQ(1u, connection_->encrypted_packets_.size());
@@ -279,6 +285,7 @@
           new Callback(&ok, &server_config_update)));
   EXPECT_TRUE(ok);
 
+  EXPECT_CALL(*session_, OnProofValid(testing::_));
   std::unique_ptr<QuicData> data(CryptoFramer::ConstructHandshakeMessage(
       server_config_update, Perspective::IS_SERVER));
   stream()->OnStreamFrame(QuicStreamFrame(kCryptoStreamId, /*fin=*/false,
@@ -287,6 +294,10 @@
   // Recreate connection with the new config and verify a 0-RTT attempt.
   CreateConnection();
 
+  EXPECT_CALL(*connection_, OnCanWrite());
+  EXPECT_CALL(*session_, OnProofValid(testing::_));
+  EXPECT_CALL(*session_, OnProofVerifyDetailsAvailable(testing::_))
+      .Times(testing::AnyNumber());
   stream()->CryptoConnect();
   EXPECT_TRUE(session_->IsEncryptionEstablished());
 }
@@ -378,6 +389,10 @@
 
   void AdvanceHandshakeWithFakeServer() {
     client_session_->GetMutableCryptoStream()->CryptoConnect();
+    EXPECT_CALL(*server_session_->helper(), CanAcceptClientHello(_, _, _))
+        .Times(testing::AnyNumber());
+    EXPECT_CALL(*server_session_->helper(), GenerateConnectionIdForReject(_))
+        .Times(testing::AnyNumber());
     crypto_test_utils::AdvanceHandshake(
         client_connection_, client_session_->GetMutableCryptoStream(), 0,
         server_connection_, server_stream(), 0);
@@ -426,6 +441,10 @@
   EXPECT_CALL(*client_session_, OnProofValid(testing::_));
 
   InitializeFakeStatelessRejectServer();
+  EXPECT_CALL(*client_connection_,
+              CloseConnection(QUIC_CRYPTO_HANDSHAKE_STATELESS_REJECT, _, _));
+  EXPECT_CALL(*server_connection_,
+              CloseConnection(QUIC_CRYPTO_HANDSHAKE_STATELESS_REJECT, _, _));
   AdvanceHandshakeWithFakeServer();
 
   EXPECT_EQ(1, server_stream()->NumHandshakeMessages());
diff --git a/net/quic/core/quic_crypto_server_stream_test.cc b/net/quic/core/quic_crypto_server_stream_test.cc
index b60c22d..0a6ae1f0 100644
--- a/net/quic/core/quic_crypto_server_stream_test.cc
+++ b/net/quic/core/quic_crypto_server_stream_test.cc
@@ -38,6 +38,7 @@
 
 using std::string;
 using testing::_;
+using testing::NiceMock;
 
 namespace net {
 namespace test {
@@ -88,7 +89,7 @@
   // called multiple times.
   void InitializeServer() {
     TestQuicSpdyServerSession* server_session = nullptr;
-    helpers_.push_back(QuicMakeUnique<MockQuicConnectionHelper>());
+    helpers_.push_back(QuicMakeUnique<NiceMock<MockQuicConnectionHelper>>());
     alarm_factories_.push_back(QuicMakeUnique<MockAlarmFactory>());
     CreateServerSessionForTest(
         server_id_, QuicTime::Delta::FromSeconds(100000), supported_versions_,
@@ -97,6 +98,10 @@
         &server_connection_, &server_session);
     CHECK(server_session);
     server_session_.reset(server_session);
+    EXPECT_CALL(*server_session_->helper(), CanAcceptClientHello(_, _, _))
+        .Times(testing::AnyNumber());
+    EXPECT_CALL(*server_session_->helper(), GenerateConnectionIdForReject(_))
+        .Times(testing::AnyNumber());
     crypto_test_utils::FakeServerOptions options;
     options.token_binding_params = QuicTagVector{kTB10};
     crypto_test_utils::SetupCryptoServerConfigForTest(
@@ -116,7 +121,7 @@
   // testing.  May be called multiple times.
   void InitializeFakeClient(bool supports_stateless_rejects) {
     TestQuicSpdyClientSession* client_session = nullptr;
-    helpers_.push_back(QuicMakeUnique<MockQuicConnectionHelper>());
+    helpers_.push_back(QuicMakeUnique<NiceMock<MockQuicConnectionHelper>>());
     alarm_factories_.push_back(QuicMakeUnique<MockAlarmFactory>());
     CreateClientSessionForTest(
         server_id_, supports_stateless_rejects,
@@ -136,6 +141,7 @@
   int CompleteCryptoHandshake() {
     CHECK(server_connection_);
     CHECK(server_session_ != nullptr);
+
     return crypto_test_utils::HandshakeWithFakeClient(
         helpers_.back().get(), alarm_factories_.back().get(),
         server_connection_, server_stream(), server_id_, client_options_);
@@ -148,6 +154,10 @@
     CHECK(client_session_ != nullptr);
 
     EXPECT_CALL(*client_session_, OnProofValid(_)).Times(testing::AnyNumber());
+    EXPECT_CALL(*client_session_, OnProofVerifyDetailsAvailable(_))
+        .Times(testing::AnyNumber());
+    EXPECT_CALL(*client_connection_, OnCanWrite()).Times(testing::AnyNumber());
+    EXPECT_CALL(*server_connection_, OnCanWrite()).Times(testing::AnyNumber());
     client_stream()->CryptoConnect();
     crypto_test_utils::AdvanceHandshake(client_connection_, client_stream(), 0,
                                         server_connection_, server_stream(), 0);
@@ -230,10 +240,11 @@
   FLAGS_quic_reloadable_flag_enable_quic_stateless_reject_support = true;
   Initialize();
 
+  InitializeFakeClient(/* supports_stateless_rejects= */ true);
   EXPECT_CALL(*server_connection_,
               CloseConnection(QUIC_CRYPTO_HANDSHAKE_STATELESS_REJECT, _, _));
-
-  InitializeFakeClient(/* supports_stateless_rejects= */ true);
+  EXPECT_CALL(*client_connection_,
+              CloseConnection(QUIC_CRYPTO_HANDSHAKE_STATELESS_REJECT, _, _));
   AdvanceHandshakeWithFakeClient();
 
   // Check the server to make the sure the handshake did not succeed.
@@ -265,6 +276,10 @@
   Initialize();
 
   InitializeFakeClient(/* supports_stateless_rejects= */ true);
+  EXPECT_CALL(*server_connection_,
+              CloseConnection(QUIC_CRYPTO_HANDSHAKE_STATELESS_REJECT, _, _));
+  EXPECT_CALL(*client_connection_,
+              CloseConnection(QUIC_CRYPTO_HANDSHAKE_STATELESS_REJECT, _, _));
   AdvanceHandshakeWithFakeClient();
 
   // On the first round, encryption will not be established.
@@ -340,8 +355,16 @@
   InitializeFakeClient(/* supports_stateless_rejects= */ false);
   InitializeServer();
 
+  EXPECT_CALL(*client_session_, OnProofValid(_)).Times(testing::AnyNumber());
+  EXPECT_CALL(*client_session_, OnProofVerifyDetailsAvailable(_))
+      .Times(testing::AnyNumber());
+  EXPECT_CALL(*client_connection_, OnCanWrite()).Times(testing::AnyNumber());
   client_stream()->CryptoConnect();
 
+  EXPECT_CALL(*client_session_, OnProofValid(_)).Times(testing::AnyNumber());
+  EXPECT_CALL(*client_session_, OnProofVerifyDetailsAvailable(_))
+      .Times(testing::AnyNumber());
+  EXPECT_CALL(*client_connection_, OnCanWrite()).Times(testing::AnyNumber());
   crypto_test_utils::CommunicateHandshakeMessages(
       client_connection_, client_stream(), server_connection_, server_stream());
 
@@ -502,6 +525,10 @@
   Initialize();
   InitializeFakeClient(/* supports_stateless_rejects= */ false);
 
+  EXPECT_CALL(*server_session_->helper(), CanAcceptClientHello(_, _, _))
+      .WillOnce(testing::Return(true));
+  EXPECT_CALL(*server_connection_,
+              CloseConnection(QUIC_HANDSHAKE_FAILED, "Failed to get proof", _));
   // Regression test for b/31521252, in which a crash would happen here.
   AdvanceHandshakeWithFakeClient();
   EXPECT_FALSE(server_stream()->encryption_established());
diff --git a/net/quic/test_tools/crypto_test_utils.cc b/net/quic/test_tools/crypto_test_utils.cc
index 7f62005..3cc2d2c44 100644
--- a/net/quic/test_tools/crypto_test_utils.cc
+++ b/net/quic/test_tools/crypto_test_utils.cc
@@ -399,6 +399,14 @@
   TestQuicSpdyServerSession server_session(server_conn, *server_quic_config,
                                            &crypto_config,
                                            &compressed_certs_cache);
+  EXPECT_CALL(*server_session.helper(),
+              CanAcceptClientHello(testing::_, testing::_, testing::_))
+      .Times(testing::AnyNumber());
+  EXPECT_CALL(*server_session.helper(),
+              GenerateConnectionIdForReject(testing::_))
+      .Times(testing::AnyNumber());
+  EXPECT_CALL(*server_conn, OnCanWrite()).Times(testing::AnyNumber());
+  EXPECT_CALL(*client_conn, OnCanWrite()).Times(testing::AnyNumber());
 
   // The client's handshake must have been started already.
   CHECK_NE(0u, client_conn->encrypted_packets_.size());
@@ -439,6 +447,9 @@
 
   EXPECT_CALL(client_session, OnProofValid(testing::_))
       .Times(testing::AnyNumber());
+  EXPECT_CALL(client_session, OnProofVerifyDetailsAvailable(testing::_))
+      .Times(testing::AnyNumber());
+  EXPECT_CALL(*client_conn, OnCanWrite()).Times(testing::AnyNumber());
   client_session.GetMutableCryptoStream()->CryptoConnect();
   CHECK_EQ(1u, client_conn->encrypted_packets_.size());
 
diff --git a/net/socket/udp_socket_unittest.cc b/net/socket/udp_socket_unittest.cc
index 1a60212..01ed87d0 100644
--- a/net/socket/udp_socket_unittest.cc
+++ b/net/socket/udp_socket_unittest.cc
@@ -577,7 +577,6 @@
 
 TEST_F(UDPSocketTest, ClientSetDoNotFragment) {
   for (std::string ip : {"127.0.0.1", "::1"}) {
-    LOG(INFO) << "ip: " << ip;
     UDPClientSocket client(DatagramSocket::DEFAULT_BIND, RandIntCallback(),
                            nullptr, NetLogSource());
     IPAddress ip_address;
@@ -600,7 +599,6 @@
 
 TEST_F(UDPSocketTest, ServerSetDoNotFragment) {
   for (std::string ip : {"127.0.0.1", "::1"}) {
-    LOG(INFO) << "ip: " << ip;
     IPEndPoint bind_address;
     CreateUDPAddress(ip, 0, &bind_address);
     UDPServerSocket server(nullptr, NetLogSource());
diff --git a/net/tools/quic/quic_client_session_test.cc b/net/tools/quic/quic_client_session_test.cc
index c970c77b..df2a8fa6 100644
--- a/net/tools/quic/quic_client_session_test.cc
+++ b/net/tools/quic/quic_client_session_test.cc
@@ -153,6 +153,7 @@
   // Now create a second session using the same crypto config.
   Initialize();
 
+  EXPECT_CALL(*connection_, OnCanWrite());
   // Starting the handshake should move immediately to encryption
   // established and will allow streams to be created.
   session_->CryptoConnect();
@@ -516,6 +517,8 @@
   CompleteCryptoHandshake();
 
   session_->GetOrCreateStream(promised_stream_id_);
+  EXPECT_CALL(*connection_,
+              SendRstStream(promised_stream_id_, QUIC_REFUSED_STREAM, 0));
   session_->ResetPromised(promised_stream_id_, QUIC_REFUSED_STREAM);
   EXPECT_TRUE(session_->IsClosedStream(promised_stream_id_));
 }
@@ -524,6 +527,8 @@
   // Initialize crypto before the client session will create a stream.
   CompleteCryptoHandshake();
 
+  EXPECT_CALL(*connection_,
+              SendRstStream(promised_stream_id_, QUIC_REFUSED_STREAM, 0));
   session_->ResetPromised(promised_stream_id_, QUIC_REFUSED_STREAM);
   EXPECT_TRUE(session_->IsClosedStream(promised_stream_id_));
 }
diff --git a/net/tools/quic/quic_dispatcher_test.cc b/net/tools/quic/quic_dispatcher_test.cc
index 6e9b8ec..9da4da09 100644
--- a/net/tools/quic/quic_dispatcher_test.cc
+++ b/net/tools/quic/quic_dispatcher_test.cc
@@ -352,6 +352,7 @@
               ProcessUdpPacket(_, _, _))
       .WillOnce(testing::WithArgs<2>(Invoke(CreateFunctor(
           &QuicDispatcherTest::ValidatePacket, base::Unretained(this), 1))));
+  EXPECT_CALL(*dispatcher_, ShouldCreateOrBufferPacketForConnection(1));
   ProcessPacket(client_address, 1, true, SerializeCHLO());
   EXPECT_EQ(client_address, dispatcher_->current_client_address());
   EXPECT_EQ(server_address_, dispatcher_->current_server_address());
@@ -365,6 +366,7 @@
               ProcessUdpPacket(_, _, _))
       .WillOnce(testing::WithArgs<2>(Invoke(CreateFunctor(
           &QuicDispatcherTest::ValidatePacket, base::Unretained(this), 2))));
+  EXPECT_CALL(*dispatcher_, ShouldCreateOrBufferPacketForConnection(2));
   ProcessPacket(client_address, 2, true, SerializeCHLO());
 
   EXPECT_CALL(*reinterpret_cast<MockQuicConnection*>(session1_->connection()),
@@ -398,6 +400,7 @@
       .WillOnce(testing::WithArgs<2>(Invoke(CreateFunctor(
           &QuicDispatcherTest::ValidatePacket, base::Unretained(this), 1))));
 
+  EXPECT_CALL(*dispatcher_, ShouldCreateOrBufferPacketForConnection(1));
   ProcessPacket(client_address, 1, true, SerializeCHLO());
 
   EXPECT_CALL(*reinterpret_cast<MockQuicConnection*>(session1_->connection()),
@@ -422,6 +425,7 @@
       .WillOnce(testing::WithArgs<2>(Invoke(CreateFunctor(
           &QuicDispatcherTest::ValidatePacket, base::Unretained(this), 1))));
 
+  EXPECT_CALL(*dispatcher_, ShouldCreateOrBufferPacketForConnection(1));
   ProcessPacket(client_address, connection_id, true, SerializeCHLO());
 
   // Close the connection by sending public reset packet.
@@ -502,6 +506,8 @@
           &QuicDispatcherTest::ValidatePacket, base::Unretained(this), 1))));
   // A packet whose packet number is the largest that is allowed to start a
   // connection.
+  EXPECT_CALL(*dispatcher_,
+              ShouldCreateOrBufferPacketForConnection(connection_id));
   ProcessPacket(client_address, connection_id, true, SerializeCHLO(),
                 PACKET_8BYTE_CONNECTION_ID, PACKET_6BYTE_PACKET_NUMBER,
                 QuicDispatcher::kMaxReasonableInitialPacketNumber);
@@ -554,6 +560,8 @@
       .WillOnce(testing::WithArgs<2>(
           Invoke(CreateFunctor(&QuicDispatcherTest::ValidatePacket,
                                base::Unretained(this), connection_id))));
+  EXPECT_CALL(*dispatcher_,
+              ShouldCreateOrBufferPacketForConnection(connection_id));
   ProcessPacket(client_address, connection_id, true, QuicVersionMin(),
                 SerializeCHLO(), PACKET_8BYTE_CONNECTION_ID,
                 PACKET_6BYTE_PACKET_NUMBER, 1);
@@ -568,6 +576,8 @@
       .WillOnce(testing::WithArgs<2>(
           Invoke(CreateFunctor(&QuicDispatcherTest::ValidatePacket,
                                base::Unretained(this), connection_id))));
+  EXPECT_CALL(*dispatcher_,
+              ShouldCreateOrBufferPacketForConnection(connection_id));
   ProcessPacket(client_address, connection_id, true, QuicVersionMax(),
                 SerializeCHLO(), PACKET_8BYTE_CONNECTION_ID,
                 PACKET_6BYTE_PACKET_NUMBER, 1);
@@ -593,6 +603,8 @@
       .WillOnce(testing::WithArgs<2>(
           Invoke(CreateFunctor(&QuicDispatcherTest::ValidatePacket,
                                base::Unretained(this), connection_id))));
+  EXPECT_CALL(*dispatcher_,
+              ShouldCreateOrBufferPacketForConnection(connection_id));
   ProcessPacket(client_address, connection_id, true, QUIC_VERSION_40,
                 SerializeCHLO(), PACKET_8BYTE_CONNECTION_ID,
                 PACKET_6BYTE_PACKET_NUMBER, 1);
@@ -619,6 +631,8 @@
       .WillOnce(testing::WithArgs<2>(
           Invoke(CreateFunctor(&QuicDispatcherTest::ValidatePacket,
                                base::Unretained(this), connection_id))));
+  EXPECT_CALL(*dispatcher_,
+              ShouldCreateOrBufferPacketForConnection(connection_id));
   ProcessPacket(client_address, connection_id, true, QUIC_VERSION_39,
                 SerializeCHLO(), PACKET_8BYTE_CONNECTION_ID,
                 PACKET_6BYTE_PACKET_NUMBER, 1);
@@ -659,7 +673,7 @@
        << p.enable_stateless_rejects_via_flag << std::endl;
     os << " client_supports_statelesss_rejects: "
        << p.client_supports_statelesss_rejects << std::endl;
-    os << "  crypto_handshake_successful: " << p.crypto_handshake_successful
+    os << " crypto_handshake_successful: " << p.crypto_handshake_successful
        << " }";
     return os;
   }
@@ -760,9 +774,15 @@
       .WillOnce(testing::WithArgs<2>(
           Invoke(CreateFunctor(&QuicDispatcherTest::ValidatePacket,
                                base::Unretained(this), connection_id))));
+  EXPECT_CALL(*dispatcher_,
+              ShouldCreateOrBufferPacketForConnection(connection_id))
+      .Times(1);
+
   // Process the first packet for the connection.
   ProcessPacket(client_address, connection_id, true, SerializeCHLO());
   if (ExpectStatelessReject()) {
+    EXPECT_CALL(*reinterpret_cast<MockQuicConnection*>(session1_->connection()),
+                CloseConnection(QUIC_CRYPTO_HANDSHAKE_STATELESS_REJECT, _, _));
     // If this is a stateless reject, the crypto stream will close the
     // connection.
     session1_->connection()->CloseConnection(
@@ -820,6 +840,14 @@
                                      {"VER\0", "Q025"}},
                                     kClientHelloMinimumSize);
 
+  if (GetParam().enable_stateless_rejects_via_flag) {
+    EXPECT_CALL(*time_wait_list_manager_, ProcessPacket(_, _, connection_id))
+        .Times(1);
+  } else {
+    EXPECT_CALL(*dispatcher_,
+                ShouldCreateOrBufferPacketForConnection(connection_id))
+        .Times(1);
+  }
   ProcessPacket(client_address, connection_id, true,
                 client_hello.GetSerialized(Perspective::IS_CLIENT)
                     .AsStringPiece()
@@ -838,6 +866,9 @@
   const QuicSocketAddress client_address(QuicIpAddress::Loopback4(), 1);
   const QuicConnectionId connection_id = 1;
 
+  EXPECT_CALL(*dispatcher_,
+              ShouldCreateOrBufferPacketForConnection(connection_id))
+      .Times(1);
   ProcessPacket(client_address, connection_id, true, "NOT DATA FOR A CHLO");
 
   // Process the first packet for the connection.
@@ -935,6 +966,7 @@
                 ProcessUdpPacket(_, _, _))
         .WillOnce(testing::WithArgs<2>(Invoke(CreateFunctor(
             &QuicDispatcherTest::ValidatePacket, base::Unretained(this), 1))));
+    EXPECT_CALL(*dispatcher_, ShouldCreateOrBufferPacketForConnection(1));
     ProcessPacket(client_address, 1, true, SerializeCHLO());
 
     EXPECT_CALL(*dispatcher_, CreateQuicSession(_, client_address))
@@ -946,6 +978,7 @@
                 ProcessUdpPacket(_, _, _))
         .WillOnce(testing::WithArgs<2>(Invoke(CreateFunctor(
             &QuicDispatcherTest::ValidatePacket, base::Unretained(this), 2))));
+    EXPECT_CALL(*dispatcher_, ShouldCreateOrBufferPacketForConnection(2));
     ProcessPacket(client_address, 2, true, SerializeCHLO());
 
     blocked_list_ = QuicDispatcherPeer::GetWriteBlockedList(dispatcher_.get());
diff --git a/net/url_request/url_request_context.h b/net/url_request/url_request_context.h
index 206b0105..0d954a6 100644
--- a/net/url_request/url_request_context.h
+++ b/net/url_request/url_request_context.h
@@ -240,7 +240,7 @@
     return http_user_agent_settings_;
   }
   void set_http_user_agent_settings(
-      HttpUserAgentSettings* http_user_agent_settings) {
+      const HttpUserAgentSettings* http_user_agent_settings) {
     http_user_agent_settings_ = http_user_agent_settings;
   }
 
@@ -298,7 +298,7 @@
   scoped_refptr<SSLConfigService> ssl_config_service_;
   NetworkDelegate* network_delegate_;
   HttpServerProperties* http_server_properties_;
-  HttpUserAgentSettings* http_user_agent_settings_;
+  const HttpUserAgentSettings* http_user_agent_settings_;
   CookieStore* cookie_store_;
   TransportSecurityState* transport_security_state_;
   CTVerifier* cert_transparency_verifier_;
diff --git a/pdf/chunk_stream.cc b/pdf/chunk_stream.cc
index d9dae1e..4eae4a9 100644
--- a/pdf/chunk_stream.cc
+++ b/pdf/chunk_stream.cc
@@ -7,14 +7,8 @@
 #include <stddef.h>
 #include <string.h>
 
-#define __STDC_LIMIT_MACROS
-#ifdef _WIN32
-#include <limits.h>
-#else
-#include <stdint.h>
-#endif
-
 #include <algorithm>
+#include <limits>
 
 namespace chrome_pdf {
 
@@ -38,7 +32,7 @@
 }
 
 bool ChunkStream::WriteData(size_t offset, void* buffer, size_t size) {
-  if (SIZE_MAX - size < offset)
+  if (std::numeric_limits<size_t>::max() - size < offset)
     return false;
 
   if (data_.size() < offset + size)
@@ -51,28 +45,22 @@
     return true;
   }
 
-  std::map<size_t, size_t>::iterator start = chunks_.upper_bound(offset);
-  if (start != chunks_.begin())
-    --start;  // start now points to the key equal or lower than offset.
-  if (start->first + start->second < offset)
-    ++start;  // start element is entirely before current chunk, skip it.
-
-  std::map<size_t, size_t>::iterator end = chunks_.upper_bound(offset + size);
+  auto start = GetStartChunk(offset);
+  auto end = chunks_.upper_bound(offset + size);
   if (start == end) {  // No chunks to merge.
     chunks_[offset] = size;
     return true;
   }
 
-  --end;
+  auto prev = end;
+  --prev;
+  size_t prev_size = prev->first + prev->second;
 
   size_t new_offset = std::min<size_t>(start->first, offset);
-  size_t new_size =
-      std::max<size_t>(end->first + end->second, offset + size) - new_offset;
+  size_t new_size = std::max<size_t>(prev_size, offset + size) - new_offset;
 
-  chunks_.erase(start, ++end);
-
+  chunks_.erase(start, end);
   chunks_[new_offset] = new_size;
-
   return true;
 }
 
@@ -97,22 +85,15 @@
     return true;
   }
 
-  std::map<size_t, size_t>::const_iterator start = chunks_.upper_bound(offset);
-  if (start != chunks_.begin())
-    --start;  // start now points to the key equal or lower than offset.
-  if (start->first + start->second < offset)
-    ++start;  // start element is entirely before current chunk, skip it.
-
-  std::map<size_t, size_t>::const_iterator end =
-      chunks_.upper_bound(offset + size);
+  auto start = GetStartChunk(offset);
+  auto end = chunks_.upper_bound(offset + size);
   if (start == end) {  // No data in the current range available.
     ranges->push_back(std::pair<size_t, size_t>(offset, size));
     return true;
   }
 
   size_t cur_offset = offset;
-  std::map<size_t, size_t>::const_iterator it;
-  for (it = start; it != end; ++it) {
+  for (auto it = start; it != end; ++it) {
     if (cur_offset < it->first) {
       size_t new_size = it->first - cur_offset;
       ranges->push_back(std::pair<size_t, size_t>(cur_offset, new_size));
@@ -123,9 +104,10 @@
   }
 
   // Add last chunk.
-  if (cur_offset < offset + size)
+  if (cur_offset < offset + size) {
     ranges->push_back(
         std::pair<size_t, size_t>(cur_offset, offset + size - cur_offset));
+  }
 
   return true;
 }
@@ -134,28 +116,28 @@
   if (chunks_.empty())
     return false;
 
-  if (SIZE_MAX - size < offset)
+  if (std::numeric_limits<size_t>::max() - size < offset)
     return false;
 
-  std::map<size_t, size_t>::const_iterator it = chunks_.upper_bound(offset);
+  auto it = chunks_.upper_bound(offset);
   if (it == chunks_.begin())
     return false;  // No chunks includes offset byte.
 
   --it;  // Now it starts equal or before offset.
-  return (it->first + it->second) >= (offset + size);
+  return it->first + it->second >= offset + size;
 }
 
 size_t ChunkStream::GetFirstMissingByte() const {
   if (chunks_.empty())
     return 0;
-  std::map<size_t, size_t>::const_iterator begin = chunks_.begin();
+  auto begin = chunks_.begin();
   return begin->first > 0 ? 0 : begin->second;
 }
 
 size_t ChunkStream::GetFirstMissingByteInInterval(size_t offset) const {
   if (chunks_.empty())
     return 0;
-  std::map<size_t, size_t>::const_iterator it = chunks_.upper_bound(offset);
+  auto it = chunks_.upper_bound(offset);
   if (it == chunks_.begin())
     return 0;
   --it;
@@ -165,10 +147,20 @@
 size_t ChunkStream::GetLastMissingByteInInterval(size_t offset) const {
   if (chunks_.empty())
     return stream_size_ - 1;
-  std::map<size_t, size_t>::const_iterator it = chunks_.upper_bound(offset);
+  auto it = chunks_.upper_bound(offset);
   if (it == chunks_.end())
     return stream_size_ - 1;
   return it->first - 1;
 }
 
+std::map<size_t, size_t>::const_iterator ChunkStream::GetStartChunk(
+    size_t offset) const {
+  auto start = chunks_.upper_bound(offset);
+  if (start != chunks_.begin())
+    --start;  // start now points to the key equal or lower than offset.
+  if (start->first + start->second < offset)
+    ++start;  // start element is entirely before current chunk, skip it.
+  return start;
+}
+
 }  // namespace chrome_pdf
diff --git a/pdf/chunk_stream.h b/pdf/chunk_stream.h
index e669bb7..762bc39 100644
--- a/pdf/chunk_stream.h
+++ b/pdf/chunk_stream.h
@@ -41,9 +41,12 @@
   size_t GetLastMissingByteInInterval(size_t offset) const;
 
  private:
+  std::map<size_t, size_t>::const_iterator GetStartChunk(size_t offset) const;
+
   std::vector<unsigned char> data_;
 
-  // Pair, first - begining of the chunk, second - size of the chunk.
+  // Key: offset of the chunk.
+  // Value: size of the chunk.
   std::map<size_t, size_t> chunks_;
 
   size_t stream_size_;
diff --git a/pdf/document_loader.cc b/pdf/document_loader.cc
index 5a40b97..b9728eeb 100644
--- a/pdf/document_loader.cc
+++ b/pdf/document_loader.cc
@@ -52,18 +52,21 @@
 std::string GetMultiPartBoundary(const std::string& headers) {
   net::HttpUtil::HeadersIterator it(headers.begin(), headers.end(), "\n");
   while (it.GetNext()) {
-    if (base::LowerCaseEqualsASCII(it.name(), "content-type")) {
-      std::string type = base::ToLowerASCII(it.values());
-      if (base::StartsWith(type, "multipart/", base::CompareCase::SENSITIVE)) {
-        const char* boundary = strstr(type.c_str(), "boundary=");
-        if (!boundary) {
-          NOTREACHED();
-          break;
-        }
+    if (!base::LowerCaseEqualsASCII(it.name(), "content-type"))
+      continue;
 
-        return std::string(boundary + 9);
-      }
+    std::string type = base::ToLowerASCII(it.values());
+    if (!base::StartsWith(type, "multipart/", base::CompareCase::SENSITIVE))
+      continue;
+
+    static constexpr char kBoundary[] = "boundary=";
+    const char* boundary = strstr(type.c_str(), kBoundary);
+    if (!boundary) {
+      NOTREACHED();
+      return std::string();
     }
+
+    return std::string(boundary + strlen(kBoundary));
   }
   return std::string();
 }
@@ -89,6 +92,15 @@
          base::EndsWith(type, "/unknown", base::CompareCase::INSENSITIVE_ASCII);
 }
 
+bool IsDoubleNewlines(const char* buffer, int index) {
+  DCHECK_GE(index, 2);
+  static constexpr char kLF2[] = "\n\n";
+  static constexpr char kCRLF2[] = "\r\n\r\n";
+  if (strncmp(&buffer[index - 2], kLF2, strlen(kLF2)) == 0)
+    return true;
+  return index >= 4 && strncmp(&buffer[index - 4], kCRLF2, strlen(kCRLF2)) == 0;
+}
+
 }  // namespace
 
 DocumentLoader::Client::~Client() {}
@@ -220,9 +232,8 @@
 }
 
 uint32_t DocumentLoader::GetAvailableData() const {
-  if (document_size_ == 0) {  // If document size is unknown.
+  if (document_size_ == 0)  // Document size unknown.
     return current_pos_;
-  }
 
   std::vector<std::pair<size_t, size_t>> ranges;
   chunk_stream_.GetMissedRanges(0, document_size_, &ranges);
@@ -233,7 +244,7 @@
 }
 
 void DocumentLoader::ClearPendingRequests() {
-  pending_requests_.erase(pending_requests_.begin(), pending_requests_.end());
+  pending_requests_.clear();
 }
 
 bool DocumentLoader::GetBlock(uint32_t position,
@@ -401,7 +412,8 @@
     // i.e. sniff response to
     // http://www.act.org/compass/sample/pdf/geometry.pdf
     current_pos_ = 0;
-    uint32_t start_pos, end_pos;
+    uint32_t start_pos;
+    uint32_t end_pos;
     if (GetByteRange(headers, &start_pos, &end_pos)) {
       current_pos_ = start_pos;
       if (end_pos && end_pos > start_pos)
@@ -436,10 +448,9 @@
   size_t length = result;
   if (is_multipart_ && result > 2) {
     for (int i = 2; i < result; ++i) {
-      if ((buffer_[i - 1] == '\n' && buffer_[i - 2] == '\n') ||
-          (i >= 4 && buffer_[i - 1] == '\n' && buffer_[i - 2] == '\r' &&
-           buffer_[i - 3] == '\n' && buffer_[i - 4] == '\r')) {
-        uint32_t start_pos, end_pos;
+      if (IsDoubleNewlines(buffer_, i)) {
+        uint32_t start_pos;
+        uint32_t end_pos;
         if (GetByteRange(std::string(buffer_, i), &start_pos, &end_pos)) {
           current_pos_ = start_pos;
           start += i;
diff --git a/pdf/document_loader.h b/pdf/document_loader.h
index 3e1fc83..127ca5d0 100644
--- a/pdf/document_loader.h
+++ b/pdf/document_loader.h
@@ -110,7 +110,7 @@
   ChunkStream chunk_stream_;
   bool partial_document_;
   bool request_pending_;
-  typedef std::list<std::pair<size_t, size_t>> PendingRequests;
+  using PendingRequests = std::list<std::pair<size_t, size_t>>;
   PendingRequests pending_requests_;
   // The starting position of the HTTP request currently being processed.
   size_t current_request_offset_;
diff --git a/remoting/client/ui/desktop_viewport.cc b/remoting/client/ui/desktop_viewport.cc
index c150f1bb..0b243af 100644
--- a/remoting/client/ui/desktop_viewport.cc
+++ b/remoting/client/ui/desktop_viewport.cc
@@ -35,9 +35,27 @@
     return;
   }
 
+  // Only reset the viewport if both dimensions have changed, otherwise keep
+  // the offset and scale and just change the constraint. This is to cover these
+  // use cases:
+  // * Rotation => Reset
+  // * Keyboard => No reset
+  // * Settings menu => No reset
+  //
+  // TODO(yuweih): This is probably too much inferring. Let the caller to decide
+  // when to call ResizeToFit() if things don't work right.
+  bool need_to_reset =
+      surface_width != surface_size_.x && surface_height != surface_size_.y;
+
   surface_size_.x = surface_width;
   surface_size_.y = surface_height;
-  ResizeToFit();
+
+  if (need_to_reset) {
+    ResizeToFit();
+    return;
+  }
+
+  UpdateViewport();
 }
 
 void DesktopViewport::MoveDesktop(float dx, float dy) {
diff --git a/remoting/client/ui/desktop_viewport.h b/remoting/client/ui/desktop_viewport.h
index c000ba4..f22451e 100644
--- a/remoting/client/ui/desktop_viewport.h
+++ b/remoting/client/ui/desktop_viewport.h
@@ -35,10 +35,11 @@
   DesktopViewport();
   ~DesktopViewport();
 
-  // Sets the |desktop_size_| and initializes the viewport when necessary.
+  // Sets the |desktop_size_| and (re)initializes the viewport.
   void SetDesktopSize(int desktop_width, int desktop_height);
 
-  // Sets the |surface_size_| and initializes the viewport when necessary.
+  // Sets the |surface_size_| and (re)initializes the viewport if both
+  // dimensions are changed.
   void SetSurfaceSize(int surface_width, int surface_height);
 
   // Translates the desktop on the surface's reference frame by <dx, dy>.
diff --git a/remoting/resources/remoting_strings_es.xtb b/remoting/resources/remoting_strings_es.xtb
index 542d04a..09c347b 100644
--- a/remoting/resources/remoting_strings_es.xtb
+++ b/remoting/resources/remoting_strings_es.xtb
@@ -169,7 +169,7 @@
 <translation id="507204348399810022">¿Seguro que quieres inhabilitar las conexiones remotas a <ph name="HOSTNAME" />?</translation>
 <translation id="5156271271724754543">Debes introducir el mismo PIN en los dos cuadros.</translation>
 <translation id="5170982930780719864">Identificador del host no válido</translation>
-<translation id="518094545883702183">Esta información solo se utiliza para diagnosticar el problema del que has informado, solo está disponible para la persona que examine tu informe y se conserva durante un período de hasta 30 días.</translation>
+<translation id="518094545883702183">Esta información solo se utiliza para diagnosticar el problema del que has informado, solo está disponible para la persona que examine tu informe y se conserva durante un periodo de hasta 30 días.</translation>
 <translation id="5222676887888702881">Cerrar sesión</translation>
 <translation id="5254120496627797685">Si abandonas esta página, finalizará tu sesión en Escritorio Remoto de Chrome.</translation>
 <translation id="5308380583665731573">Conectar</translation>
diff --git a/remoting/resources/remoting_strings_th.xtb b/remoting/resources/remoting_strings_th.xtb
index 1e417551..6a68f05c 100644
--- a/remoting/resources/remoting_strings_th.xtb
+++ b/remoting/resources/remoting_strings_th.xtb
@@ -14,7 +14,7 @@
 สำหรับคอมพิวเตอร์ระยะไกลที่มีแป้นพิมพ์ที่ไม่ใช่แบบอังกฤษ-อเมริกา ข้อความที่ได้รับอาจไม่ถูกต้อง สำหรับการจัดวางแป้นพิมพ์แบบอื่นๆ จะมีการสนับสนุนในเร็วๆ นี้!
 
 สำหรับข้อมูลเกี่ยวกับความเป็นส่วนตัว โปรดดูนโยบายความเป็นส่วนตัวของ Google (http://goo.gl/SyrVzj) และนโยบายความเป็นส่วนตัวของ Chrome (http://goo.gl/0uXE5d)</translation>
-<translation id="1324095856329524885">(คุณลักษณะนี้ยังไม่มีให้ใช้งานในคอมพิวเตอร์ของคุณ)</translation>
+<translation id="1324095856329524885">(ฟีเจอร์นี้ยังไม่มีให้ใช้งานในคอมพิวเตอร์ของคุณ)</translation>
 <translation id="1342297293546459414">ดูและควบคุมคอมพิวเตอร์ที่ใช้งานร่วมกัน</translation>
 <translation id="1389790901665088353">ดาวน์โหลด Chrome Remote Desktop Host Installer</translation>
 <translation id="1450760146488584666">ออบเจ็กต์ที่ขอไม่มีอยู่</translation>
diff --git a/sandbox/mac/sandbox_mac_seatbelt_exec_unittest.cc b/sandbox/mac/sandbox_mac_seatbelt_exec_unittest.cc
index 86ae815..9d8b8b5 100644
--- a/sandbox/mac/sandbox_mac_seatbelt_exec_unittest.cc
+++ b/sandbox/mac/sandbox_mac_seatbelt_exec_unittest.cc
@@ -31,12 +31,10 @@
   mac::SandboxPolicy policy;
   google::protobuf::MapPair<std::string, std::string> allowed_pair(
       "ALLOWED_READ_DIR", allowed_path);
-  google::protobuf::MapPair<std::string, std::string> exec_pair(
-      "EXECUTABLE_PATH", exec_path);
   CHECK(policy.mutable_params()->insert(allowed_pair).second);
-  CHECK(policy.mutable_params()->insert(exec_pair).second);
   policy.set_profile(profile);
 
+  CHECK(exec_server.SetParameter("EXECUTABLE_PATH", exec_path));
   CHECK(exec_server.ApplySandboxProfile(policy));
 
   // Test that the sandbox profile is actually applied.
diff --git a/sandbox/mac/seatbelt_exec.cc b/sandbox/mac/seatbelt_exec.cc
index 6a1a7b94..17fe54b4 100644
--- a/sandbox/mac/seatbelt_exec.cc
+++ b/sandbox/mac/seatbelt_exec.cc
@@ -75,7 +75,7 @@
   return static_cast<uint64_t>(written) == str->size();
 }
 
-SeatbeltExecServer::SeatbeltExecServer(int fd) : fd_(fd) {}
+SeatbeltExecServer::SeatbeltExecServer(int fd) : fd_(fd), extra_params_() {}
 
 SeatbeltExecServer::~SeatbeltExecServer() {}
 
@@ -99,6 +99,10 @@
     weak_params.push_back(pair.first.c_str());
     weak_params.push_back(pair.second.c_str());
   }
+  for (const auto& pair : extra_params_) {
+    weak_params.push_back(pair.first.c_str());
+    weak_params.push_back(pair.second.c_str());
+  }
   weak_params.push_back(nullptr);
 
   char* error = nullptr;
@@ -130,4 +134,11 @@
   return true;
 }
 
+bool SeatbeltExecServer::SetParameter(const base::StringPiece key,
+                                      const base::StringPiece value) {
+  return extra_params_
+      .insert(std::make_pair(key.as_string(), value.as_string()))
+      .second;
+}
+
 }  // namespace sandbox
diff --git a/sandbox/mac/seatbelt_exec.h b/sandbox/mac/seatbelt_exec.h
index 57096cc..e606c6c 100644
--- a/sandbox/mac/seatbelt_exec.h
+++ b/sandbox/mac/seatbelt_exec.h
@@ -74,6 +74,13 @@
   // succeeds.
   bool ApplySandboxProfile(const mac::SandboxPolicy& sandbox_policy);
 
+  // Set a string parameter in the sandbox profile. This is present in the
+  // server because the process about to initialize a sandbox may need to add
+  // some extra parameters, such as the path to the executable or the current
+  // PID. This must be called before InitializeSandbox().
+  bool SetParameter(const base::StringPiece key,
+                    const base::StringPiece value) WARN_UNUSED_RESULT;
+
  private:
   // Reads from the |fd_| and stores the data into a string. This does
   // not append a NUL terminator as protobuf does not expect one.
@@ -81,6 +88,9 @@
 
   // The file descriptor used to communicate with the launcher process.
   base::ScopedFD fd_;
+
+  // Extra parameters added by the server process.
+  std::map<std::string, std::string> extra_params_;
 };
 
 }  // namespace sandbox
diff --git a/services/ui/public/interfaces/window_tree.mojom b/services/ui/public/interfaces/window_tree.mojom
index 728039e..f1a50c5 100644
--- a/services/ui/public/interfaces/window_tree.mojom
+++ b/services/ui/public/interfaces/window_tree.mojom
@@ -20,6 +20,7 @@
 import "ui/events/mojo/event.mojom";
 import "ui/events/mojo/event_constants.mojom";
 import "ui/gfx/geometry/mojo/geometry.mojom";
+import "ui/gfx/mojo/transform.mojom";
 import "ui/platform_window/mojo/text_input_state.mojom";
 
 // Windows are identified by a uint32. The upper 16 bits are the connection id,
@@ -111,6 +112,10 @@
   SetWindowBounds(uint32 change_id, uint32 window_id, gfx.mojom.Rect bounds,
                   cc.mojom.LocalSurfaceId? local_surface_id);
 
+  SetWindowTransform(uint32 change_id,
+                     uint32 window_id,
+                     gfx.mojom.Transform transform);
+
   // Sets the client area of the specified window. The client area is specified
   // by way of insets. Everything outside of the insets, and not in
   // |additional_client_areas| is considered non-client area.
@@ -374,6 +379,10 @@
                         gfx.mojom.Rect new_bounds,
                         cc.mojom.LocalSurfaceId? local_surface_id);
 
+  OnWindowTransformChanged(uint32 window,
+                           gfx.mojom.Transform old_transform,
+                           gfx.mojom.Transform new_transform);
+
   OnClientAreaChanged(uint32 window_id,
                       gfx.mojom.Insets new_client_area,
                       array<gfx.mojom.Rect> new_additional_client_areas);
diff --git a/services/ui/ws/access_policy.h b/services/ui/ws/access_policy.h
index c29e3988..1ee99a4 100644
--- a/services/ui/ws/access_policy.h
+++ b/services/ui/ws/access_policy.h
@@ -52,6 +52,7 @@
   virtual bool CanSetWindowCompositorFrameSink(
       const ServerWindow* window) const = 0;
   virtual bool CanSetWindowBounds(const ServerWindow* window) const = 0;
+  virtual bool CanSetWindowTransform(const ServerWindow* window) const = 0;
   virtual bool CanSetWindowProperties(const ServerWindow* window) const = 0;
   virtual bool CanSetWindowTextInputState(const ServerWindow* window) const = 0;
   virtual bool CanSetCapture(const ServerWindow* window) const = 0;
diff --git a/services/ui/ws/compositor_frame_sink_client_binding.cc b/services/ui/ws/compositor_frame_sink_client_binding.cc
index 4532063b..a0dc3d0b 100644
--- a/services/ui/ws/compositor_frame_sink_client_binding.cc
+++ b/services/ui/ws/compositor_frame_sink_client_binding.cc
@@ -42,9 +42,5 @@
   compositor_frame_sink_->DidNotProduceFrame(ack);
 }
 
-void CompositorFrameSinkClientBinding::EvictCurrentSurface() {
-  compositor_frame_sink_->EvictCurrentSurface();
-}
-
 }  // namespace ws
 }  // namespace ui
diff --git a/services/ui/ws/compositor_frame_sink_client_binding.h b/services/ui/ws/compositor_frame_sink_client_binding.h
index a55c8929..c588c5b2 100644
--- a/services/ui/ws/compositor_frame_sink_client_binding.h
+++ b/services/ui/ws/compositor_frame_sink_client_binding.h
@@ -34,7 +34,6 @@
                              cc::CompositorFrame frame) override;
   void SetNeedsBeginFrame(bool needs_begin_frame) override;
   void DidNotProduceFrame(const cc::BeginFrameAck& ack) override;
-  void EvictCurrentSurface() override;
 
   mojo::Binding<cc::mojom::MojoCompositorFrameSinkClient> binding_;
   cc::mojom::DisplayPrivateAssociatedPtr display_private_;
diff --git a/services/ui/ws/default_access_policy.cc b/services/ui/ws/default_access_policy.cc
index b9c8658..b8651a6 100644
--- a/services/ui/ws/default_access_policy.cc
+++ b/services/ui/ws/default_access_policy.cc
@@ -114,6 +114,11 @@
   return WasCreatedByThisClient(window);
 }
 
+bool DefaultAccessPolicy::CanSetWindowTransform(
+    const ServerWindow* window) const {
+  return WasCreatedByThisClient(window);
+}
+
 bool DefaultAccessPolicy::CanSetWindowProperties(
     const ServerWindow* window) const {
   return WasCreatedByThisClient(window);
diff --git a/services/ui/ws/default_access_policy.h b/services/ui/ws/default_access_policy.h
index 74cbde7..53f6a2cc 100644
--- a/services/ui/ws/default_access_policy.h
+++ b/services/ui/ws/default_access_policy.h
@@ -45,6 +45,7 @@
   bool CanSetWindowCompositorFrameSink(
       const ServerWindow* window) const override;
   bool CanSetWindowBounds(const ServerWindow* window) const override;
+  bool CanSetWindowTransform(const ServerWindow* window) const override;
   bool CanSetWindowProperties(const ServerWindow* window) const override;
   bool CanSetWindowTextInputState(const ServerWindow* window) const override;
   bool CanSetCapture(const ServerWindow* window) const override;
diff --git a/services/ui/ws/frame_generator_unittest.cc b/services/ui/ws/frame_generator_unittest.cc
index 179e334..c197392f 100644
--- a/services/ui/ws/frame_generator_unittest.cc
+++ b/services/ui/ws/frame_generator_unittest.cc
@@ -64,8 +64,6 @@
       begin_frame_source_->RemoveObserver(this);
   }
 
-  void EvictCurrentSurface() override {}
-
   // cc::BeginFrameObserver implementation.
   void OnBeginFrame(const cc::BeginFrameArgs& args) override {
     sink_client_->OnBeginFrame(args);
diff --git a/services/ui/ws/operation.h b/services/ui/ws/operation.h
index 9b6abe6..88fe8c1 100644
--- a/services/ui/ws/operation.h
+++ b/services/ui/ws/operation.h
@@ -33,6 +33,7 @@
   SET_WINDOW_OPACITY,
   SET_WINDOW_PREDEFINED_CURSOR,
   SET_WINDOW_PROPERTY,
+  SET_WINDOW_TRANSFORM,
   SET_WINDOW_VISIBILITY,
 };
 
diff --git a/services/ui/ws/server_window.cc b/services/ui/ws/server_window.cc
index c3760afd..0a773e8 100644
--- a/services/ui/ws/server_window.cc
+++ b/services/ui/ws/server_window.cc
@@ -320,7 +320,10 @@
   if (transform_ == transform)
     return;
 
+  const gfx::Transform old_transform = transform_;
   transform_ = transform;
+  for (auto& observer : observers_)
+    observer.OnWindowTransformChanged(this, old_transform, transform);
 }
 
 void ServerWindow::SetProperty(const std::string& name,
diff --git a/services/ui/ws/server_window_observer.h b/services/ui/ws/server_window_observer.h
index 400c087..5ded5af 100644
--- a/services/ui/ws/server_window_observer.h
+++ b/services/ui/ws/server_window_observer.h
@@ -16,13 +16,12 @@
 namespace gfx {
 class Insets;
 class Rect;
+class Transform;
 }
 
 namespace ui {
+
 struct TextInputState;
-}
-
-namespace ui {
 
 namespace ws {
 
@@ -51,6 +50,10 @@
                                      const gfx::Rect& old_bounds,
                                      const gfx::Rect& new_bounds) {}
 
+  virtual void OnWindowTransformChanged(ServerWindow* window,
+                                        const gfx::Transform& old_transform,
+                                        const gfx::Transform& new_transform) {}
+
   virtual void OnWindowClientAreaChanged(
       ServerWindow* window,
       const gfx::Insets& new_client_area,
@@ -96,7 +99,6 @@
 };
 
 }  // namespace ws
-
 }  // namespace ui
 
 #endif  // SERVICES_UI_WS_SERVER_WINDOW_OBSERVER_H_
diff --git a/services/ui/ws/test_change_tracker.cc b/services/ui/ws/test_change_tracker.cc
index c6c84a63..ac992ec 100644
--- a/services/ui/ws/test_change_tracker.cc
+++ b/services/ui/ws/test_change_tracker.cc
@@ -152,6 +152,9 @@
       return base::StringPrintf("SurfaceCreated window_id=%s surface_id=%s",
                                 WindowIdToString(change.window_id).c_str(),
                                 change.surface_id.ToString().c_str());
+    case CHANGE_TYPE_TRANSFORM_CHANGED:
+      return base::StringPrintf("TransformChanged window_id=%s",
+                                WindowIdToString(change.window_id).c_str());
   }
   return std::string();
 }
@@ -272,6 +275,13 @@
   AddChange(change);
 }
 
+void TestChangeTracker::OnWindowTransformChanged(Id window_id) {
+  Change change;
+  change.type = CHANGE_TYPE_TRANSFORM_CHANGED;
+  change.window_id = window_id;
+  AddChange(change);
+}
+
 void TestChangeTracker::OnUnembed(Id window_id) {
   Change change;
   change.type = CHANGE_TYPE_UNEMBED;
diff --git a/services/ui/ws/test_change_tracker.h b/services/ui/ws/test_change_tracker.h
index 5ee60435..6cc1d007 100644
--- a/services/ui/ws/test_change_tracker.h
+++ b/services/ui/ws/test_change_tracker.h
@@ -44,6 +44,7 @@
   CHANGE_TYPE_ON_TOP_LEVEL_CREATED,
   CHANGE_TYPE_OPACITY,
   CHANGE_TYPE_SURFACE_CHANGED,
+  CHANGE_TYPE_TRANSFORM_CHANGED,
 };
 
 // TODO(sky): consider nuking and converting directly to WindowData.
@@ -94,6 +95,7 @@
   cc::SurfaceId surface_id;
   gfx::Size frame_size;
   float device_scale_factor;
+  gfx::Transform transform;
   // Set in OnWindowInputEvent() if the event is a KeyEvent.
   std::unordered_map<std::string, std::vector<uint8_t>> key_event_properties;
 };
@@ -157,6 +159,7 @@
       const gfx::Rect& old_bounds,
       const gfx::Rect& new_bounds,
       const base::Optional<cc::LocalSurfaceId>& local_surface_id);
+  void OnWindowTransformChanged(Id window_id);
   void OnWindowHierarchyChanged(Id window_id,
                                 Id old_parent_id,
                                 Id new_parent_id,
diff --git a/services/ui/ws/test_utils.cc b/services/ui/ws/test_utils.cc
index 9ee891f..73d969b 100644
--- a/services/ui/ws/test_utils.cc
+++ b/services/ui/ws/test_utils.cc
@@ -349,6 +349,11 @@
                                  std::move(new_bounds), local_surface_id);
 }
 
+void TestWindowTreeClient::OnWindowTransformChanged(
+    uint32_t window,
+    const gfx::Transform& old_transform,
+    const gfx::Transform& new_transform) {}
+
 void TestWindowTreeClient::OnClientAreaChanged(
     uint32_t window_id,
     const gfx::Insets& new_client_area,
diff --git a/services/ui/ws/test_utils.h b/services/ui/ws/test_utils.h
index 5cadb9d..dc2803dd8fa 100644
--- a/services/ui/ws/test_utils.h
+++ b/services/ui/ws/test_utils.h
@@ -453,6 +453,9 @@
       const gfx::Rect& old_bounds,
       const gfx::Rect& new_bounds,
       const base::Optional<cc::LocalSurfaceId>& local_surface_id) override;
+  void OnWindowTransformChanged(uint32_t window,
+                                const gfx::Transform& old_transform,
+                                const gfx::Transform& new_transform) override;
   void OnClientAreaChanged(
       uint32_t window_id,
       const gfx::Insets& new_client_area,
diff --git a/services/ui/ws/window_manager_access_policy.cc b/services/ui/ws/window_manager_access_policy.cc
index 32d9cae1..7264f42 100644
--- a/services/ui/ws/window_manager_access_policy.cc
+++ b/services/ui/ws/window_manager_access_policy.cc
@@ -100,6 +100,11 @@
   return WasCreatedByThisClient(window);
 }
 
+bool WindowManagerAccessPolicy::CanSetWindowTransform(
+    const ServerWindow* window) const {
+  return WasCreatedByThisClient(window);
+}
+
 bool WindowManagerAccessPolicy::CanSetWindowProperties(
     const ServerWindow* window) const {
   return WasCreatedByThisClient(window);
diff --git a/services/ui/ws/window_manager_access_policy.h b/services/ui/ws/window_manager_access_policy.h
index 1eebe33..f12dc2e 100644
--- a/services/ui/ws/window_manager_access_policy.h
+++ b/services/ui/ws/window_manager_access_policy.h
@@ -44,6 +44,7 @@
   bool CanSetWindowCompositorFrameSink(
       const ServerWindow* window) const override;
   bool CanSetWindowBounds(const ServerWindow* window) const override;
+  bool CanSetWindowTransform(const ServerWindow* window) const override;
   bool CanSetWindowProperties(const ServerWindow* window) const override;
   bool CanSetWindowTextInputState(const ServerWindow* window) const override;
   bool CanSetCapture(const ServerWindow* window) const override;
diff --git a/services/ui/ws/window_server.cc b/services/ui/ws/window_server.cc
index 812240d..cebc3c5 100644
--- a/services/ui/ws/window_server.cc
+++ b/services/ui/ws/window_server.cc
@@ -386,6 +386,16 @@
   }
 }
 
+void WindowServer::ProcessWindowTransformChanged(
+    const ServerWindow* window,
+    const gfx::Transform& old_transform,
+    const gfx::Transform& new_transform) {
+  for (auto& pair : tree_map_) {
+    pair.second->ProcessWindowTransformChanged(
+        window, old_transform, new_transform, IsOperationSource(pair.first));
+  }
+}
+
 void WindowServer::ProcessClientAreaChanged(
     const ServerWindow* window,
     const gfx::Insets& new_client_area,
@@ -719,9 +729,17 @@
 
   ProcessWindowBoundsChanged(window, old_bounds, new_bounds,
                              window->current_local_surface_id());
-  if (!window->parent())
+  UpdateNativeCursorFromMouseLocation(window);
+}
+
+void WindowServer::OnWindowTransformChanged(
+    ServerWindow* window,
+    const gfx::Transform& old_transform,
+    const gfx::Transform& new_transform) {
+  if (in_destructor_)
     return;
 
+  ProcessWindowTransformChanged(window, old_transform, new_transform);
   UpdateNativeCursorFromMouseLocation(window);
 }
 
diff --git a/services/ui/ws/window_server.h b/services/ui/ws/window_server.h
index f072f77..a55b7bc 100644
--- a/services/ui/ws/window_server.h
+++ b/services/ui/ws/window_server.h
@@ -179,6 +179,9 @@
       const gfx::Rect& old_bounds,
       const gfx::Rect& new_bounds,
       const base::Optional<cc::LocalSurfaceId>& local_surface_id);
+  void ProcessWindowTransformChanged(const ServerWindow* window,
+                                     const gfx::Transform& old_transform,
+                                     const gfx::Transform& new_transform);
   void ProcessClientAreaChanged(
       const ServerWindow* window,
       const gfx::Insets& new_client_area,
@@ -313,6 +316,9 @@
   void OnWindowBoundsChanged(ServerWindow* window,
                              const gfx::Rect& old_bounds,
                              const gfx::Rect& new_bounds) override;
+  void OnWindowTransformChanged(ServerWindow* window,
+                                const gfx::Transform& old_transform,
+                                const gfx::Transform& new_transform) override;
   void OnWindowClientAreaChanged(
       ServerWindow* window,
       const gfx::Insets& new_client_area,
diff --git a/services/ui/ws/window_tree.cc b/services/ui/ws/window_tree.cc
index 6e8ca14..f6b0756 100644
--- a/services/ui/ws/window_tree.cc
+++ b/services/ui/ws/window_tree.cc
@@ -722,6 +722,18 @@
                                   local_surface_id);
 }
 
+void WindowTree::ProcessWindowTransformChanged(
+    const ServerWindow* window,
+    const gfx::Transform& old_transform,
+    const gfx::Transform& new_transform,
+    bool originated_change) {
+  ClientWindowId client_window_id;
+  if (originated_change || !IsWindowKnown(window, &client_window_id))
+    return;
+  client()->OnWindowTransformChanged(client_window_id.id, old_transform,
+                                     new_transform);
+}
+
 void WindowTree::ProcessClientAreaChanged(
     const ServerWindow* window,
     const gfx::Insets& new_client_area,
@@ -1562,6 +1574,35 @@
   client()->OnChangeCompleted(change_id, success);
 }
 
+void WindowTree::SetWindowTransform(uint32_t change_id,
+                                    Id window_id,
+                                    const gfx::Transform& transform) {
+  // Clients shouldn't have a need to set the transform of the embed root, so
+  // we don't bother routing it to the window-manager.
+
+  ServerWindow* window = GetWindowByClientId(ClientWindowId(window_id));
+  DVLOG(3) << "set window transform client window_id=" << window_id
+           << " global window_id="
+           << (window ? WindowIdToTransportId(window->id()) : 0)
+           << " transform=" << transform.ToString();
+
+  if (!window) {
+    DVLOG(1) << "SetWindowTransform failed (invalid window id)";
+    client()->OnChangeCompleted(change_id, false);
+    return;
+  }
+
+  // Only the owner of the window can change the bounds.
+  const bool success = access_policy_->CanSetWindowTransform(window);
+  if (success) {
+    Operation op(this, window_server_, OperationType::SET_WINDOW_TRANSFORM);
+    window->SetTransform(transform);
+  } else {
+    DVLOG(1) << "SetWindowTransform failed (access denied)";
+  }
+  client()->OnChangeCompleted(change_id, success);
+}
+
 void WindowTree::SetWindowVisibility(uint32_t change_id,
                                      Id transport_window_id,
                                      bool visible) {
diff --git a/services/ui/ws/window_tree.h b/services/ui/ws/window_tree.h
index 45fef34..42b596c7 100644
--- a/services/ui/ws/window_tree.h
+++ b/services/ui/ws/window_tree.h
@@ -232,6 +232,10 @@
       const gfx::Rect& new_bounds,
       bool originated_change,
       const base::Optional<cc::LocalSurfaceId>& local_surface_id);
+  void ProcessWindowTransformChanged(const ServerWindow* window,
+                                     const gfx::Transform& old_transform,
+                                     const gfx::Transform& new_transform,
+                                     bool originated_change);
   void ProcessClientAreaChanged(
       const ServerWindow* window,
       const gfx::Insets& new_client_area,
@@ -439,6 +443,9 @@
       Id window_id,
       const gfx::Rect& bounds,
       const base::Optional<cc::LocalSurfaceId>& local_surface_id) override;
+  void SetWindowTransform(uint32_t change_id,
+                          Id window_id,
+                          const gfx::Transform& transform) override;
   void SetWindowVisibility(uint32_t change_id,
                            Id window_id,
                            bool visible) override;
diff --git a/services/ui/ws/window_tree_client_unittest.cc b/services/ui/ws/window_tree_client_unittest.cc
index 1bbb660..a42ee87 100644
--- a/services/ui/ws/window_tree_client_unittest.cc
+++ b/services/ui/ws/window_tree_client_unittest.cc
@@ -321,6 +321,11 @@
     tracker()->OnWindowBoundsChanged(window_id, old_bounds, new_bounds,
                                      local_surface_id);
   }
+  void OnWindowTransformChanged(Id window_id,
+                                const gfx::Transform& old_transform,
+                                const gfx::Transform& new_transform) override {
+    tracker()->OnWindowTransformChanged(window_id);
+  }
   void OnClientAreaChanged(
       uint32_t window_id,
       const gfx::Insets& new_client_area,
@@ -2257,6 +2262,34 @@
             ChangeWindowDescription(*changes1()));
 }
 
+TEST_F(WindowTreeClientTest, Transform) {
+  const Id window1 = wt_client1()->NewWindow(100);
+  ASSERT_TRUE(window1);
+  ASSERT_TRUE(wt_client1()->AddWindow(root_window_id(), window1));
+
+  // Establish the second client at |window1|.
+  ASSERT_NO_FATAL_FAILURE(EstablishSecondClientWithRoot(window1));
+
+  // The first window created in the second client gets a server id of 2,1
+  // regardless of the id the client uses.
+  const Id window1_in_client2 = BuildWindowId(client_id_1(), 1);
+  const Id window2 = wt_client2()->NewWindow(11);
+  ASSERT_TRUE(wt_client2()->AddWindow(window1_in_client2, window2));
+  const Id window2_in_client1 = BuildWindowId(client_id_2(), 1);
+  wt_client1()->WaitForChangeCount(1);
+  changes1()->clear();
+
+  // Change the transform of |window2| and make sure server gets it.
+  gfx::Transform transform;
+  transform.Scale(SkIntToMScalar(2), SkIntToMScalar(2));
+  const uint32_t transform_change_id = 12;
+  wt2()->SetWindowTransform(transform_change_id, window2, transform);
+  ASSERT_TRUE(wt_client2()->WaitForChangeCompleted(transform_change_id));
+  wt_client1()->WaitForChangeCount(1);
+  EXPECT_EQ("TransformChanged window_id=" + IdToString(window2_in_client1),
+            SingleChangeToDescription(*changes1()));
+}
+
 // TODO(sky): need to better track changes to initial client. For example,
 // that SetBounsdWindows/AddWindow and the like don't result in messages to the
 // originating client.
diff --git a/testing/android/native_test/native_test_launcher.cc b/testing/android/native_test/native_test_launcher.cc
index e7f5014..50c5068 100644
--- a/testing/android/native_test/native_test_launcher.cc
+++ b/testing/android/native_test/native_test_launcher.cc
@@ -111,6 +111,9 @@
                stdout_file_path.value().c_str(), strerror(errno));
     exit(EXIT_FAILURE);
   }
+  // TODO(jbudorick): Remove this after resolving crbug.com/726880
+  AndroidLog(ANDROID_LOG_INFO, "Redirecting stdout to file: %s\n",
+             stdout_file_path.value().c_str());
   dup2(STDOUT_FILENO, STDERR_FILENO);
 
   if (command_line.HasSwitch(switches::kWaitForDebugger)) {
diff --git a/testing/buildbot/chromium.chromiumos.json b/testing/buildbot/chromium.chromiumos.json
index 30c76fd..d7bd592 100644
--- a/testing/buildbot/chromium.chromiumos.json
+++ b/testing/buildbot/chromium.chromiumos.json
@@ -44,6 +44,18 @@
       },
       {
         "args": [
+          "--mash",
+          "--test-launcher-filter-file=../../testing/buildbot/filters/ash_unittests_mash.filter"
+        ],
+        "name": "ash_unittests --mash",
+        "override_isolate_target": "ash_unittests",
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "ash_unittests"
+      },
+      {
+        "args": [
           "--mus",
           "--test-launcher-filter-file=../../testing/buildbot/filters/ash_unittests_mus.filter"
         ],
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json
index 06026343..47ce9b82 100644
--- a/testing/buildbot/chromium.fyi.json
+++ b/testing/buildbot/chromium.fyi.json
@@ -11652,6 +11652,18 @@
     "gtest_tests": [
       {
         "args": [
+          "--mash",
+          "--test-launcher-filter-file=../../testing/buildbot/filters/ash_unittests_mash.filter"
+        ],
+        "name": "ash_unittests --mash",
+        "override_isolate_target": "ash_unittests",
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "ash_unittests"
+      },
+      {
+        "args": [
           "--mus",
           "--test-launcher-filter-file=../../testing/buildbot/filters/ash_unittests_mus.filter"
         ],
diff --git a/testing/buildbot/filters/BUILD.gn b/testing/buildbot/filters/BUILD.gn
index 782e100..cba075b2 100644
--- a/testing/buildbot/filters/BUILD.gn
+++ b/testing/buildbot/filters/BUILD.gn
@@ -52,6 +52,7 @@
   testonly = true
 
   data = [
+    "//testing/buildbot/filters/ash_unittests_mash.filter",
     "//testing/buildbot/filters/ash_unittests_mus.filter",
   ]
 }
diff --git a/testing/buildbot/filters/ash_unittests_mash.filter b/testing/buildbot/filters/ash_unittests_mash.filter
new file mode 100644
index 0000000..6cd495d1
--- /dev/null
+++ b/testing/buildbot/filters/ash_unittests_mash.filter
@@ -0,0 +1,316 @@
+# Failures and crashes
+-AshNativeCursorManagerTest.FractionalScale
+-AshNativeCursorManagerTest.LockCursor
+-AshNativeCursorManagerTest.SetCursor
+-AshNativeCursorManagerTest.SetCursorSet
+-AshNativeCursorManagerTest.SetDeviceScaleFactorAndRotation
+-AshNativeCursorManagerTest.UIScaleShouldNotChangeCursor
+-CursorWindowControllerTest.DSF
+-CursorWindowControllerTest.MoveToDifferentDisplay
+-CursorWindowControllerTest.VisibilityTest
+-DIPTest.WorkArea
+-DisplayManagerFontTest.TextSubpixelPositioningWithDsf125External
+-DisplayManagerFontTest.TextSubpixelPositioningWithDsf125Internal
+-DisplayManagerFontTest.TextSubpixelPositioningWithDsf125InternalWithScaling
+-DisplayManagerFontTest.TextSubpixelPositioningWithDsf200External
+-DisplayManagerFontTest.TextSubpixelPositioningWithDsf200Internal
+-DisplayManagerOrientationTest.LockToSpecificOrientation
+-DisplayManagerOrientationTest.SaveRestoreUserRotationLock
+-DisplayManagerOrientationTest.UserRotationLockReverse
+-DisplayManagerTest.CheckInitializationOfRotationProperty
+-DisplayManagerTest.DisplayAddRemoveAtTheSameTime
+-DisplayManagerTest.DockMode
+-DisplayManagerTest.DontRegisterBadConfig
+-DisplayManagerTest.DontRememberBestResolution
+-DisplayManagerTest.EmulatorTest
+-DisplayManagerTest.FHD125DefaultsTo08UIScaling
+-DisplayManagerTest.FHD125DefaultsTo08UIScalingNoOverride
+-DisplayManagerTest.GuessDisplayIdFieldsInDisplayLayout
+-DisplayManagerTest.LayoutMorethanThreeDisplaysTest
+-DisplayManagerTest.MirroredLayout
+-DisplayManagerTest.NativeDisplaysChangedAfterPrimaryChange
+-DisplayManagerTest.NoMirrorInThreeDisplays
+-DisplayManagerTest.NoOverlappedDisplays
+-DisplayManagerTest.NoOverlappedDisplaysAfterResolutionChange
+-DisplayManagerTest.NoOverlappedDisplaysNotFitBetweenTwo
+-DisplayManagerTest.NoOverlappedDisplaysWithDetachedDisplays
+-DisplayManagerTest.NoRotateUnifiedDesktop
+-DisplayManagerTest.NotifyPrimaryChange
+-DisplayManagerTest.NotifyPrimaryChangeUndock
+-DisplayManagerTest.OverscanInsetsTest
+-DisplayManagerTest.RejectInvalidLayoutData
+-DisplayManagerTest.ResetInternalDisplayZoomFor1_25x
+-DisplayManagerTest.ResolutionChangeInUnifiedMode
+-DisplayManagerTest.ResolutionFallback
+-DisplayManagerTest.Rotate
+-DisplayManagerTest.RotateInSoftwareMirroring
+-DisplayManagerTest.ScaleOnlyChange
+-DisplayManagerTest.SingleDisplayToSoftwareMirroring
+-DisplayManagerTest.SoftwareMirroring
+-DisplayManagerTest.SoftwareMirroringWithCompositingCursor
+-DisplayManagerTest.TestDeviceScaleOnlyChange
+-DisplayManagerTest.TestNativeDisplaysChanged
+-DisplayManagerTest.TestNativeDisplaysChangedNoInternal
+-DisplayManagerTest.TesteviceScaleOnlyChange
+-DisplayManagerTest.TouchCalibrationTest
+-DisplayManagerTest.UIScale
+-DisplayManagerTest.UIScaleWithDisplayMode
+-DisplayManagerTest.UnifiedDesktopBasic
+-DisplayManagerTest.UnifiedDesktopEnabledWithExtended
+-DisplayManagerTest.UnifiedDesktopWith2xDSF
+-DisplayManagerTest.UnifiedDesktopWithHardwareMirroring
+-DisplayManagerTest.UpdateDisplayTest
+-DisplayManagerTest.UpdateDisplayWithHostOrigin
+-DisplayManagerTest.UpdateMouseCursorAfterRotateZoom
+-DisplayManagerTest.UpdateMouseCursorfterRotateZoom
+-DisplayManagerTest.UpdateThreeDisplaysWithDefaultLayout
+-DisplayManagerTest.UpdateisplayWithHostOrigin
+-DisplayManagerTest.Use125DSFForUIScaling
+-DisplayManagerTest.ZeroOverscanInsets
+-DisplayUtilTest.RotatedDisplay
+-DragDropControllerTest.CaptureLostCancelsDragDrop
+-DragDropControllerTest.DragCancelAcrossDisplays
+-DragDropControllerTest.DragCancelOnDisplayDisconnect
+-DragDropControllerTest.DragDropInMultipleViewsMultipleWidgetsTest
+-DragDropControllerTest.DragDropInMultipleViewsSingleWidgetTest
+-DragDropControllerTest.DragDropInSingleViewTest
+-DragDropControllerTest.DragDropWithZeroDragUpdates
+-DragDropControllerTest.PressingEscapeCancelsDragDrop
+-DragDropControllerTest.SyntheticEventsDuringDragDrop
+-DragDropControllerTest.TouchDragDropCancelsOnLongTap
+-DragDropControllerTest.TouchDragDropCompletesOnFling
+-DragDropControllerTest.TouchDragDropInMultipleWindows
+-DragDropControllerTest.TouchDragDropLongTapGestureIsForwarded
+-DragDropControllerTest.ViewRemovedWhileInDragDropTest
+-DragDropControllerTest.WindowDestroyedDuringDragDrop
+-DragWindowResizerTest.CursorDeviceScaleFactor
+-DragWindowResizerTest.DragWindowController
+-DragWindowResizerTest.DragWindowControllerAcrossThreeDisplays
+-DragWindowResizerTest.MoveWindowAcrossDisplays
+-DragWindowResizerTest.WarpMousePointer
+-DragWindowResizerTest.WindowDragWithMultiDisplays
+-DragWindowResizerTest.WindowDragWithMultiDisplaysActiveRoot
+-DragWindowResizerTest.WindowDragWithMultiDisplaysRightToLeft
+-DragWindowResizerTest.WindowragWithMultiisplays
+-DragWindowResizerTest.WindowragWithMultiisplaysRightToeft
+-DragWindowResizerTest.WindowragWithMultiisplaysctiveRoot
+-DragWindowResizerTest.ragWindowController
+-ExtendedDesktopTest.CaptureEventLocationHighDPI
+-ExtendedDesktopTest.ConvertPoint
+-ExtendedDesktopTest.GetRootWindowAt
+-ExtendedDesktopTest.GetRootWindowMatching
+-ExtendedDesktopTest.KeyEventsOnLockScreen
+-ExtendedDesktopTest.TestCursor
+-ExtendedMouseWarpControllerTest.IndicatorBoundsTestOnLeft
+-ExtendedMouseWarpControllerTest.IndicatorBoundsTestOnRight
+-ExtendedMouseWarpControllerTest.IndicatorBoundsTestOnTopBottom
+-ExtendedMouseWarpControllerTest.IndicatorBoundsTestThreeDisplays
+-ExtendedMouseWarpControllerTest.IndicatorBoundsTestThreeDisplaysWithLayout
+-ExtendedMouseWarpControllerTest.IndicatorBoundsTestThreeDisplaysWithLayout2
+-ExtendedesktopTest.CaptureventocationHighP
+-ExtendedesktopTest.KeyventsOnockScreen
+-LockActionHandlerLayoutManagerTest.KeyboardBounds
+-LockLayoutManagerTest.KeyboardBounds
+-LockLayoutManagerTest.MaximizedFullscreenWindowBoundsAreEqualToScreen
+-LockLayoutManagerTest.MultipleMonitors
+-LockLayoutManagerTest.NorwmalWindowBoundsArePreserved
+-MagnificationControllerTest.CenterTextCaretInViewport
+-MagnificationControllerTest.CenterTextCaretNotInsideViewport
+-MagnificationControllerTest.EnableAndDisable
+-MagnificationControllerTest.EnableMagnifierInUnifiedDesktop
+-MagnificationControllerTest.FollowFocusChanged
+-MagnificationControllerTest.FollowTextInputFieldFocus
+-MagnificationControllerTest.FollowTextInputFieldKeyPress
+-MagnificationControllerTest.MagnifyAndUnmagnify
+-MagnificationControllerTest.MoveMouseToSecondDisplay
+-MagnificationControllerTest.MoveWindow
+-MagnificationControllerTest.PanWindow2xLeftToRight
+-MagnificationControllerTest.PanWindow2xRightToLeft
+-MagnificationControllerTest.PanWindowToLeft
+-MagnificationControllerTest.PanWindowToRight
+-MagnificationControllerTest.PointOfInterest
+-MagnifierKeyScrollerTest.Basic
+-MaximizeModeControllerTest.CloseLidWhileInMaximizeMode
+-MaximizeModeControllerTest.DisplayDisconnectionDuringOverview
+-MaximizeModeControllerTest.ForceClamshellModeTest
+-MaximizeModeControllerTest.ForceTouchViewModeTest
+-MaximizeModeControllerTest.HingeAligned
+-MaximizeModeControllerTest.HingeAnglesWithLidClosed
+-MaximizeModeControllerTest.InitializedWhileTabletModeSwitchOn
+-MaximizeModeControllerTest.LaptopTest
+-MaximizeModeControllerTest.MaximizeModeAfterExitingDockedMode
+-MaximizeModeControllerTest.MaximizeModeTest
+-MaximizeModeControllerTest.NoMaximizeModeWithDisabledInternalDisplay
+-MaximizeModeControllerTest.RestoreAfterExit
+-MaximizeModeControllerTest.StableHingeAnglesWithLidOpened
+-MaximizeModeControllerTest.TabletModeTransition
+-MaximizeModeControllerTest.TabletModeTransitionNoKeyboardAccelerometer
+-MaximizeModeControllerTest.UnstableHingeAnglesWhenLidRecentlyOpened
+-MaximizeModeControllerTest.UnstableHingeAnglesWithLidOpened
+-MaximizeModeControllerTest.VerifyTouchViewEnabledDisabledCounts
+-MaximizeModeControllerTest.VerticalHingeTest
+-MaximizeModeControllerTest.VerticalHingeUnstableAnglesTest
+-MaximizeModeControllerTest.WasLidOpenedRecentlyOverTime
+-MirrorOnBootTest.MirrorOnBoot
+-MirrorWindowControllerTest.DockMode
+-MirrorWindowControllerTest.MirrorCursorBasic
+-MirrorWindowControllerTest.MirrorCursorLocations
+-MirrorWindowControllerTest.MirrorCursorMoveOnEnter
+-MirrorWindowControllerTest.MirrorCursorRotate
+-MouseCursorEventFilterTest.CursorDeviceScaleFactor
+-MouseCursorEventFilterTest.SetMouseWarpModeFlag
+-MouseCursorEventFilterTest.WarpMouse
+-MouseCursorEventFilterTest.WarpMouseDifferentScaleDisplaysInNative
+-MouseCursorEventFilterTest.WarpMouseDifferentSizeDisplays
+-MultiWindowResizeControllerTest.BasicTests
+-MultiWindowResizeControllerTest.ClickOutside
+-MultiWindowResizeControllerTest.DeleteWindow
+-MultiWindowResizeControllerTest.Drag
+-MultiWindowResizeControllerTest.IsOverWindows
+-MultiWindowResizeControllerTest.Three
+-OverviewGestureHandlerTest.HorizontalScrollInOverview
+-OverviewGestureHandlerTest.HorizontalScrollnOverview
+-OverviewGestureHandlerTest.ScrollUpDownWithoutReleasing
+-OverviewGestureHandlerTest.ScrollUpownWithoutReleasing
+-OverviewGestureHandlerTest.VerticalScrolls
+-PanelLayoutManagerTest.TouchHitTestPanel
+-PartialMagnificationControllerTest.ActivatesOnlyForPointer
+-PartialMagnificationControllerTest.ActiveOnPointerDown
+-PartialMagnificationControllerTest.DisablingDisablesActive
+-PartialMagnificationControllerTest.InactiveByDefault
+-PartialMagnificationControllerTest.MagnifierFollowsPointer
+-PartialMagnificationControllerTest.MultipleDisplays
+-PartialScreenshotControllerTest.BasicMouse
+-PartialScreenshotControllerTest.BasicTouch
+-PartialScreenshotControllerTest.JustClick
+-PartialScreenshotControllerTest.LargeCursor
+-PartialScreenshotControllerTest.MouseWarpTest
+-PartialScreenshotControllerTest.PointerEventsWorkWhenPointerOnlyActive
+-PartialScreenshotControllerTest.StartSessionWhileMousePressed
+-PartialScreenshotControllerTest.TouchMousePointerHoverIgnoredWithPointerEvents
+-PartialScreenshotControllerTest.TwoFingerTouch
+-PartialScreenshotControllerTest.VisibilityTest
+-PointerWatcherAdapterTest.MouseEvents
+-PointerWatcherAdapterTest.TouchEvents
+-PointerWatcherdapterTest.Mousevents
+-PointerWatcherdapterTest.Touchvents
+-ResizeShadowAndCursorTest.MaximizeRestore
+-ResizeShadowAndCursorTest.MouseDrag
+-ResizeShadowAndCursorTest.MouseHover
+-ResizeShadowAndCursorTest.Touch
+-ResizeShadowndCursorTest.Touch
+-ResolutionNotificationControllerTest.AcceptButton
+-ResolutionNotificationControllerTest.Basic
+-ResolutionNotificationControllerTest.ClickMeansAccept
+-ResolutionNotificationControllerTest.Close
+-ResolutionNotificationControllerTest.DisplayDisconnected
+-ResolutionNotificationControllerTest.Fallback
+-ResolutionNotificationControllerTest.MultipleResolutionChange
+-ResolutionNotificationControllerTest.Timeout
+-RootWindowTransformersTest.ConvertHostToRootCoords
+-RootWindowTransformersTest.LetterBoxPillarBox
+-RootWindowTransformersTest.RotateAndMagnify
+-RootWindowTransformersTest.ScaleAndMagnify
+-RootWindowTransformersTest.TouchScaleAndMagnify
+-ScreenLayoutObserverTest.AddingRemovingDisplayExtendedModeMessage
+-ScreenLayoutObserverTest.DisplayConfigurationChangedTwice
+-ScreenLayoutObserverTest.DisplayNotifications
+-ScreenLayoutObserverTest.DockedModeWithExternalPrimaryDisplayMessage
+-ScreenLayoutObserverTest.EnteringExitingUnifiedModeMessage
+-ScreenLayoutObserverTest.ExitMirrorModeBecauseOfDockedModeMessage
+-ScreenLayoutObserverTest.ExitMirrorModeBecauseOfThirdDisplayMessage
+-ScreenLayoutObserverTest.ExitMirrorModeNoInternalDisplayBecauseOfDisplayRemovedMessage
+-ScreenLayoutObserverTest.OverscanDisplay
+-ScreenLayoutObserverTest.RotationNotification
+-ScreenLayoutObserverTest.UpdateAfterSuppressDisplayNotification
+-ScreenPositionControllerTest.ConvertHostPointToScreen
+-ScreenPositionControllerTest.ConvertHostPointToScreenHiDPI
+-ScreenPositionControllerTest.ConvertHostPointToScreenHiP
+-ScreenPositionControllerTest.ConvertHostPointToScreenRotate
+-ScreenPositionControllerTest.ConvertHostPointToScreenUIScale
+-ScreenPositionControllerTest.ConvertToScreenWhileRemovingSecondaryDisplay
+-ScreenshotControllerTest.BreaksCapture
+-ScreenshotControllerTest.MultipleDisplays
+-SystemGestureEventFilterTest.ControlWindowGetsMultiFingerGestureEvents
+-SystemGestureEventFilterTest.DragLeftNearEdgeSnaps
+-SystemGestureEventFilterTest.DragRightNearEdgeSnaps
+-SystemGestureEventFilterTest.ThreeFingerGestureStopsDrag
+-SystemGestureEventFilterTest.TwoFingerAttemptResizeLeftAndRightEdgesSimultaneously
+-SystemGestureEventFilterTest.TwoFingerDrag
+-SystemGestureEventFilterTest.TwoFingerDragDelayed
+-SystemGestureEventFilterTest.WindowsWithMaxSizeDontSnap
+-ToastManagerTest.NullMessageHasNoDismissButton
+-ToplevelWindowEventHandlerTest.GestureDragCaptureLoss
+-TouchHudDebugTest.DualDisplays
+-TouchHudDebugTest.Headless
+-TouchHudDebugTest.MirrorDisplays
+-TouchHudDebugTest.RemovePrimaryDisplay
+-TouchHudDebugTest.RemoveSecondaryDisplay
+-TouchHudDebugTest.SingleDisplay
+-TouchHudDebugTest.SwapPrimaryDisplay
+-TouchHudDebugTest.SwapPrimaryThenMirrorDisplays
+-TouchHudProjectionTest.DisableWhileTouching
+-TouchHudProjectionTest.DoubleTouch
+-TouchHudProjectionTest.TouchMoveCancel
+-TouchHudProjectionTest.TouchMoveRelease
+-TrayRotationLockTest.CreateDefaultView
+-TrayRotationLockTest.CreateDefaultViewDuringMaximizeMode
+-TrayRotationLockTest.CreateSecondaryTrayView
+-TrayRotationLockTest.CreateTrayViewDuringMaximizeMode
+-TrayRotationLockTest.DefaultViewVisibilityChangesDuringMaximizeMode
+-TrayRotationLockTest.InternalDisplayNotAvailableAtCreation
+-TrayRotationLockTest.LockUpdatedDuringDesctruction
+-TrayRotationLockTest.PerformActionOnDefaultView
+-TrayRotationLockTest.TrayViewVisibilityChangesDuringMaximizeMode
+-TrayRotationockTest.CreateTrayViewuringMaximizeMode
+-UnifiedMouseWarpControllerTest.BoundaryTest
+-UnifiedMouseWarpControllerTest.WarpMouse
+-VirtualKeyboardAlwaysOnTopControllerTest.NotifyKeyboardBoundsChanged
+-VirtualKeyboardControllerAlwaysEnabledTest.DoesNotSuppressKeyboard
+-VirtualKeyboardControllerAutoTest.DisabledIfInternalKeyboardPresent
+-VirtualKeyboardControllerAutoTest.DisabledIfNoTouchScreen
+-VirtualKeyboardControllerAutoTest.EnabledDuringMaximizeMode
+-VirtualKeyboardControllerAutoTest.HandleMultipleKeyboardsPresent
+-VirtualKeyboardControllerAutoTest.SuppressedIfExternalKeyboardPresent
+-VirtualKeyboardControllerAutoTest.SuppressedInMaximizedMode
+-VirtualKeyboardControllerTest.RestoreKeyboardDevices
+-WindowScreenshotControllerTest.KeyboardOperation
+-WindowScreenshotControllerTest.MouseOperation
+-WindowScreenshotControllerTest.MultiDisplays
+-WindowTreeHostManagerStartupTest.Startup
+-WindowTreeHostManagerTest.BoundsUpdated
+-WindowTreeHostManagerTest.ConvertHostToRootCoords
+-WindowTreeHostManagerTest.DockToSingle
+-WindowTreeHostManagerTest.FindNearestDisplay
+-WindowTreeHostManagerTest.GetRootWindowForDisplayIdDuringDisplayDisconnection
+-WindowTreeHostManagerTest.MirrorToDockedWithFullscreen
+-WindowTreeHostManagerTest.OverscanInsets
+-WindowTreeHostManagerTest.ReplacePrimary
+-WindowTreeHostManagerTest.ReplaceSwappedPrimary
+-WindowTreeHostManagerTest.Rotate
+-WindowTreeHostManagerTest.ScaleRootWindow
+-WindowTreeHostManagerTest.SecondaryDisplayLayout
+-WindowTreeHostManagerTest.SetPrimaryWithFourDisplays
+-WindowTreeHostManagerTest.SetPrimaryWithThreeDisplays
+-WindowTreeHostManagerTest.SwapPrimaryById
+-WindowTreeHostManagerTest.UpdateMouseLocationAfterDisplayChange
+-WindowTreeHostManagerTest.UpdateMouseLocationAfterDisplayChange_2ndOnLeft
+-WindowTreeHostManagerTest.UpdateMouseLocationAfterDisplayChange_PrimaryDisconnected
+-WindowTreeHostManagerTest.UpdateMouseLocationAfterDisplayChange_SwapPrimary
+-WindowTreeHostManagerTest.UpdateMouseocationfterisplayChange
+-WorkspaceLayoutManagerKeyboardTest2.ChangeWorkAreaInNonStickyMode
+-WorkspaceLayoutManagerKeyboardTest2.IgnoreWorkAreaChangeinNonStickyMode
+-WorkspaceayoutManagerKeyboardTest2.ChangeWorkreanNonStickyMode
+-WorkspaceayoutManagerKeyboardTest2.gnoreWorkreaChangeinNonStickyMode
+
+# Timeouts
+-ToastManagerTest.PositionWithAutoHiddenBottomShelf
+-ToastManagerTest.PositionWithHiddenBottomShelf
+-ToastManagerTest.PositionWithVisibleBottomShelf
+-ToastManagerTest.QueueMessage
+-ToastManagerTest.ShowAndCloseAutomatically
+-ToastManagerTest.ShowAndCloseManually
+-ToastManagerTest.ShowAndCloseManuallyDuringAnimation
+-TrayTilesTest.ButtonStatesAddingUser
+-TrayTilesTest.ButtonStatesLockScreen
+-TrayTilesTest.ButtonStatesSupervisedUserFlow
diff --git a/third_party/WebKit/LayoutTests/FlagExpectations/enable-network-service b/third_party/WebKit/LayoutTests/FlagExpectations/enable-network-service
index 592df35..5aa171d 100644
--- a/third_party/WebKit/LayoutTests/FlagExpectations/enable-network-service
+++ b/third_party/WebKit/LayoutTests/FlagExpectations/enable-network-service
@@ -111,6 +111,7 @@
 Bug(none) editing/inserting/delete-insignificant-text-crash.html [ Timeout ]
 Bug(none) editing/inserting/insert-html-crash.html [ Timeout ]
 Bug(none) editing/style/apply-style-join-child-text-nodes-crash.html [ Timeout ]
+Bug(none) external/wpt/2dcontext/imagebitmap/createImageBitmap-drawImage.html [ Failure ]
 Bug(none) external/wpt/background-fetch/interfaces-worker.https.html [ Timeout ]
 Bug(none) external/wpt/battery-status/battery-discharging-manual.https.html [ Timeout ]
 Bug(none) external/wpt/battery-status/battery-full-manual.https.html [ Timeout ]
@@ -143,14 +144,14 @@
 Bug(none) external/wpt/content-security-policy/generic/no-default-src.sub.html [ Failure ]
 Bug(none) external/wpt/content-security-policy/inside-worker/dedicated-inheritance.html [ Failure ]
 Bug(none) external/wpt/content-security-policy/inside-worker/dedicated-script.html [ Failure Timeout ]
-Bug(none) external/wpt/content-security-policy/media-src/media-src-7_1.html [ Timeout ]
+Bug(none) external/wpt/content-security-policy/media-src/media-src-7_1.html [ Failure Timeout ]
 Bug(none) external/wpt/content-security-policy/media-src/media-src-7_1_2.sub.html [ Failure ]
-Bug(none) external/wpt/content-security-policy/media-src/media-src-7_2.html [ Timeout ]
+Bug(none) external/wpt/content-security-policy/media-src/media-src-7_2.html [ Failure Timeout ]
 Bug(none) external/wpt/content-security-policy/media-src/media-src-7_2_2.sub.html [ Failure ]
-Bug(none) external/wpt/content-security-policy/media-src/media-src-7_3.sub.html [ Timeout ]
+Bug(none) external/wpt/content-security-policy/media-src/media-src-7_3.sub.html [ Failure Timeout ]
 Bug(none) external/wpt/content-security-policy/media-src/media-src-7_3_2.sub.html [ Timeout Failure ]
 Bug(none) external/wpt/content-security-policy/media-src/media-src-blocked.sub.html [ Failure ]
-Bug(none) external/wpt/content-security-policy/media-src/media-src-redir-bug.sub.html [ Timeout ]
+Bug(none) external/wpt/content-security-policy/media-src/media-src-redir-bug.sub.html [ Failure Timeout ]
 Bug(none) external/wpt/content-security-policy/script-src/script-src-1_1.html [ Failure ]
 Bug(none) external/wpt/content-security-policy/script-src/script-src-1_10_1.html [ Failure ]
 Bug(none) external/wpt/content-security-policy/script-src/script-src-1_2.html [ Failure ]
@@ -287,18 +288,65 @@
 Bug(none) external/wpt/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-agent-formalism/canblock-serviceworker.https.html [ Timeout ]
 Bug(none) external/wpt/html/webappapis/scripting/processing-model-2/unhandled-promise-rejections/promise-rejection-events.serviceworker.https.html [ Timeout ]
 Bug(none) external/wpt/html/webappapis/the-windoworworkerglobalscope-mixin/Worker_Self_Origin.html [ Timeout ]
+Bug(none) external/wpt/IndexedDB/idb_webworkers.htm [ Failure ]
+Bug(none) external/wpt/IndexedDB/idbcursor-advance-exception-order.html [ Failure ]
 Bug(none) external/wpt/IndexedDB/idbcursor-advance-invalid.htm [ Timeout ]
-Bug(none) external/wpt/IndexedDB/idbcursor-advance.htm [ Timeout ]
-Bug(none) external/wpt/IndexedDB/idbcursor_delete_index.htm [ Timeout ]
+Bug(none) external/wpt/IndexedDB/idbcursor-advance.htm [ Failure Timeout ]
+Bug(none) external/wpt/IndexedDB/idbcursor-continue.htm [ Failure ]
+Bug(none) external/wpt/IndexedDB/idbcursor-direction.htm [ Failure ]
+Bug(none) external/wpt/IndexedDB/idbcursor-update-exception-order.htm [ Failure ]
+Bug(none) external/wpt/IndexedDB/idbcursor_advance_index.htm [ Failure ]
+Bug(none) external/wpt/IndexedDB/idbcursor_advance_objectstore4.htm [ Failure ]
+Bug(none) external/wpt/IndexedDB/idbcursor_continue_index3.htm [ Failure ]
+Bug(none) external/wpt/IndexedDB/idbcursor_continue_invalid.htm [ Failure ]
+Bug(none) external/wpt/IndexedDB/idbcursor_continue_objectstore3.htm [ Failure ]
+Bug(none) external/wpt/IndexedDB/idbcursor_delete_index.htm [ Failure Timeout ]
+Bug(none) external/wpt/IndexedDB/idbcursor_delete_index2.htm [ Failure ]
+Bug(none) external/wpt/IndexedDB/idbcursor_delete_index3.htm [ Failure ]
+Bug(none) external/wpt/IndexedDB/idbcursor_delete_objectstore3.htm [ Failure ]
+Bug(none) external/wpt/IndexedDB/idbcursor_iterating_index.htm [ Failure ]
+Bug(none) external/wpt/IndexedDB/idbcursor_iterating_index2.htm [ Failure ]
+Bug(none) external/wpt/IndexedDB/idbcursor_iterating_objectstore.htm [ Failure ]
+Bug(none) external/wpt/IndexedDB/idbcursor_update_index2.htm [ Failure ]
+Bug(none) external/wpt/IndexedDB/idbcursor_update_index6.htm [ Failure ]
+Bug(none) external/wpt/IndexedDB/idbcursor_update_index7.htm [ Failure ]
 Bug(none) external/wpt/IndexedDB/idbcursor_update_objectstore3.htm [ Timeout ]
+Bug(none) external/wpt/IndexedDB/idbcursor_update_objectstore7.htm [ Failure ]
+Bug(none) external/wpt/IndexedDB/idbcursor_update_objectstore9.htm [ Failure ]
+Bug(none) external/wpt/IndexedDB/idbdatabase_createObjectStore10-1000ends.htm [ Failure ]
 Bug(none) external/wpt/IndexedDB/idbindex-rename-errors.html [ Timeout ]
+Bug(none) external/wpt/IndexedDB/idbindex_count2.htm [ Failure ]
+Bug(none) external/wpt/IndexedDB/idbindex_get4.htm [ Failure ]
+Bug(none) external/wpt/IndexedDB/idbindex_getAll.html [ Failure ]
 Bug(none) external/wpt/IndexedDB/idbindex_getAllKeys.html [ Timeout ]
+Bug(none) external/wpt/IndexedDB/idbindex_getKey7.htm [ Failure ]
+Bug(none) external/wpt/IndexedDB/idbindex_openCursor2.htm [ Failure ]
 Bug(none) external/wpt/IndexedDB/idbobjectstore-rename-errors.html [ Timeout ]
+Bug(none) external/wpt/IndexedDB/idbobjectstore_add.htm [ Failure ]
+Bug(none) external/wpt/IndexedDB/idbobjectstore_add5.htm [ Failure ]
+Bug(none) external/wpt/IndexedDB/idbobjectstore_add8.htm [ Failure ]
+Bug(none) external/wpt/IndexedDB/idbobjectstore_createIndex15-autoincrement.htm [ Failure ]
+Bug(none) external/wpt/IndexedDB/idbobjectstore_delete5.htm [ Failure ]
+Bug(none) external/wpt/IndexedDB/idbobjectstore_deleted.htm [ Failure ]
+Bug(none) external/wpt/IndexedDB/idbobjectstore_get.htm [ Failure ]
 Bug(none) external/wpt/IndexedDB/idbobjectstore_getAll.html [ Timeout ]
 Bug(none) external/wpt/IndexedDB/idbobjectstore_getAllKeys.html [ Timeout ]
+Bug(none) external/wpt/IndexedDB/idbobjectstore_getKey.html [ Failure ]
+Bug(none) external/wpt/IndexedDB/idbobjectstore_openCursor_invalid.htm [ Failure ]
 Bug(none) external/wpt/IndexedDB/idbobjectstore_put2.htm [ Timeout ]
 Bug(none) external/wpt/IndexedDB/idbtransaction_objectStoreNames.html [ Timeout ]
 Bug(none) external/wpt/IndexedDB/key_invalid.htm [ Timeout ]
+Bug(none) external/wpt/IndexedDB/keygenerator-constrainterror.htm [ Failure ]
+Bug(none) external/wpt/IndexedDB/keygenerator.htm [ Failure ]
+Bug(none) external/wpt/IndexedDB/keypath-exceptions.htm [ Failure ]
+Bug(none) external/wpt/IndexedDB/keypath_maxsize.htm [ Failure ]
+Bug(none) external/wpt/IndexedDB/large-nested-cloning.html [ Failure ]
+Bug(none) external/wpt/IndexedDB/large-requests-abort.html [ Failure ]
+Bug(none) external/wpt/IndexedDB/request-event-ordering.html [ Failure ]
+Bug(none) external/wpt/IndexedDB/request_bubble-and-capture.htm [ Failure ]
+Bug(none) external/wpt/IndexedDB/transaction-create_in_versionchange.htm [ Failure ]
+Bug(none) external/wpt/IndexedDB/transaction-lifetime-empty.html [ Failure ]
+Bug(none) external/wpt/IndexedDB/transaction_bubble-and-capture.htm [ Failure ]
 Bug(none) external/wpt/media-source/mediasource-activesourcebuffers.html [ Timeout ]
 Bug(none) external/wpt/media-source/mediasource-append-buffer.html [ Timeout ]
 Bug(none) external/wpt/media-source/mediasource-appendwindow.html [ Timeout ]
@@ -591,6 +639,14 @@
 Bug(none) external/wpt/navigation-timing/nav2_test_attributes_values.html [ Failure ]
 Bug(none) external/wpt/navigation-timing/nav2_test_unloadEvents_previous_document_cross_origin.sub.html [ Timeout ]
 Bug(none) external/wpt/notifications/shownotification-resolve-manual.https.html [ Timeout ]
+Bug(none) external/wpt/offscreen-canvas/filter/offscreencanvas.filter.w.html [ Timeout ]
+Bug(none) external/wpt/offscreen-canvas/the-offscreen-canvas/offscreencanvas.commit.w.html [ Timeout ]
+Bug(none) external/wpt/offscreen-canvas/the-offscreen-canvas/offscreencanvas.convert.to.blob.html [ Timeout ]
+Bug(none) external/wpt/offscreen-canvas/the-offscreen-canvas/offscreencanvas.convert.to.blob.w.html [ Timeout ]
+Bug(none) external/wpt/offscreen-canvas/the-offscreen-canvas/offscreencanvas.transfer.to.imagebitmap.w.html [ Timeout ]
+Bug(none) external/wpt/offscreen-canvas/the-offscreen-canvas/offscreencanvas.transfercontrol.to.offscreen.w.html [ Timeout ]
+Bug(none) external/wpt/offscreen-canvas/the-offscreen-canvas/offscreencanvas.transferrable.html [ Timeout ]
+Bug(none) external/wpt/offscreen-canvas/the-offscreen-canvas/offscreencanvas.transferrable.w.html [ Timeout ]
 Bug(none) external/wpt/orientation-sensor/idlharness.https.html [ Timeout ]
 Bug(none) external/wpt/payment-request/allowpaymentrequest/active-document-cross-origin.https.sub.html [ Timeout ]
 Bug(none) external/wpt/payment-request/allowpaymentrequest/active-document-same-origin.https.html [ Timeout ]
@@ -1210,6 +1266,7 @@
 Bug(none) external/wpt/service-workers/service-worker/foreign-fetch-workers.https.html [ Timeout ]
 Bug(none) external/wpt/service-workers/service-worker/getregistration.https.html [ Timeout ]
 Bug(none) external/wpt/service-workers/service-worker/getregistrations.https.html [ Timeout ]
+Bug(none) external/wpt/service-workers/service-worker/http-to-https-redirect-and-register.https.html [ Timeout ]
 Bug(none) external/wpt/service-workers/service-worker/iframe-sandbox-register-link-element.https.html [ Timeout ]
 Bug(none) external/wpt/service-workers/service-worker/import-scripts-resource-map.https.html [ Timeout ]
 Bug(none) external/wpt/service-workers/service-worker/import-scripts-updated-flag.https.html [ Timeout ]
@@ -1756,7 +1813,7 @@
 Bug(none) http/tests/appcache/top-frame-1.html [ Timeout ]
 Bug(none) http/tests/appcache/top-frame-2.html [ Timeout ]
 Bug(none) http/tests/appcache/update-cache.html [ Timeout ]
-Bug(none) http/tests/appcache/video.html [ Timeout ]
+Bug(none) http/tests/appcache/video.html [ Failure Timeout ]
 Bug(none) http/tests/appcache/whitelist-wildcard.html [ Failure ]
 Bug(none) http/tests/appcache/xhr-foreign-resource.html [ Failure ]
 Bug(none) http/tests/background_fetch/background-fetch-click-event.https.html [ Timeout ]
@@ -1767,18 +1824,18 @@
 Bug(none) http/tests/background_fetch/background-fetch-manager-getTags.https.html [ Timeout ]
 Bug(none) http/tests/background_fetch/background-fetch-registration-abort.https.html [ Timeout ]
 Bug(none) http/tests/background_fetch/background-fetched-event.https.html [ Timeout ]
-Bug(none) http/tests/background_sync/chromium/stop-worker-no-crash.html [ Failure ]
-Bug(none) http/tests/background_sync/interfaces.html [ Failure ]
+Bug(none) http/tests/background_sync/chromium/stop-worker-no-crash.html [ Failure Timeout ]
+Bug(none) http/tests/background_sync/interfaces.html [ Failure Timeout ]
 Bug(none) http/tests/background_sync/oneshot-register-failure-worker-not-activated.html [ Failure ]
-Bug(none) http/tests/background_sync/oneshot.html [ Failure ]
-Bug(none) http/tests/background_sync/permission_denied.html [ Failure ]
+Bug(none) http/tests/background_sync/oneshot.html [ Failure Timeout ]
+Bug(none) http/tests/background_sync/permission_denied.html [ Failure Timeout ]
 Bug(none) http/tests/bluetooth/https/requestDevice/cross-origin-iframe.html [ Timeout ]
 Bug(none) http/tests/budget/get-budget-in-service-worker.html [ Timeout ]
 Bug(none) http/tests/budget/get-budget.html [ Timeout ]
 Bug(none) http/tests/budget/get-cost-fails-in-service-worker.html [ Timeout ]
 Bug(none) http/tests/budget/get-cost-in-service-worker.html [ Timeout ]
 Bug(none) http/tests/budget/get-cost.html [ Timeout ]
-Bug(none) http/tests/budget/interfaces-in-service-worker.html [ Failure ]
+Bug(none) http/tests/budget/interfaces-in-service-worker.html [ Failure Timeout ]
 Bug(none) http/tests/budget/reserve-in-service-worker.html [ Timeout ]
 Bug(none) http/tests/budget/reserve.html [ Timeout ]
 Bug(none) http/tests/cache/cached-main-resource.html [ Timeout ]
@@ -1794,7 +1851,7 @@
 Bug(none) http/tests/cache/subresource-failover-to-network.html [ Failure ]
 Bug(none) http/tests/cache/subresource-fragment-identifier.html [ Failure ]
 Bug(none) http/tests/cache/sync-xhr-304.html [ Failure ]
-Bug(none) http/tests/cachestorage/serviceworker/credentials.html [ Failure ]
+Bug(none) http/tests/cachestorage/serviceworker/credentials.html [ Failure Timeout ]
 Bug(none) http/tests/canvas/webgl/origin-clean-conformance.html [ Timeout ]
 Bug(none) http/tests/cookies/double-quoted-value-with-semi-colon.html [ Failure ]
 Bug(none) http/tests/cookies/http-get-cookie-set-in-js.html [ Failure ]
@@ -1849,9 +1906,9 @@
 Bug(none) http/tests/download/literal-utf-8.html [ Crash ]
 Bug(none) http/tests/encoding/meta-switch-mid-parse-with-title.html [ Timeout ]
 Bug(none) http/tests/encoding/meta-switch-mid-parse.html [ Timeout ]
-Bug(none) http/tests/fetch/referrer/origin-when-cross-origin-serviceworker-from-document.html [ Failure ]
-Bug(none) http/tests/fetch/referrer/serviceworker-echo-referrer-from-default-document.html [ Failure ]
-Bug(none) http/tests/fetch/referrer/serviceworker-from-origin-only-document.html [ Failure ]
+Bug(none) http/tests/fetch/referrer/origin-when-cross-origin-serviceworker-from-document.html [ Failure Timeout ]
+Bug(none) http/tests/fetch/referrer/serviceworker-echo-referrer-from-default-document.html [ Failure Timeout ]
+Bug(none) http/tests/fetch/referrer/serviceworker-from-origin-only-document.html [ Failure Timeout ]
 Bug(none) http/tests/fetch/serviceworker-proxied/thorough/access-control-base-https-other-https.html [ Timeout ]
 Bug(none) http/tests/fetch/serviceworker-proxied/thorough/access-control.html [ Timeout ]
 Bug(none) http/tests/fetch/serviceworker-proxied/thorough/auth-base-https-other-https.html [ Timeout ]
@@ -1902,28 +1959,28 @@
 Bug(none) http/tests/fetch/serviceworker/block-mixed-content-base-https.html [ Timeout ]
 Bug(none) http/tests/fetch/serviceworker/block-mixed-content-nocors-base-https.html [ Timeout ]
 Bug(none) http/tests/fetch/serviceworker/body-mixin-base-https-other-https.html [ Timeout ]
-Bug(none) http/tests/fetch/serviceworker/body-mixin.html [ Failure ]
+Bug(none) http/tests/fetch/serviceworker/body-mixin.html [ Failure Timeout ]
 Bug(none) http/tests/fetch/serviceworker/cache-override-base-https-other-https.html [ Timeout ]
-Bug(none) http/tests/fetch/serviceworker/cache-override.html [ Failure ]
+Bug(none) http/tests/fetch/serviceworker/cache-override.html [ Failure Timeout ]
 Bug(none) http/tests/fetch/serviceworker/fetch-base-https-other-https.html [ Timeout ]
-Bug(none) http/tests/fetch/serviceworker/fetch.html [ Failure ]
-Bug(none) http/tests/fetch/serviceworker/filtered-response-base-https-other-https.html [ Timeout ]
-Bug(none) http/tests/fetch/serviceworker/filtered-response-other-https.html [ Failure ]
-Bug(none) http/tests/fetch/serviceworker/filtered-response.html [ Failure ]
+Bug(none) http/tests/fetch/serviceworker/fetch.html [ Failure Timeout ]
+Bug(none) http/tests/fetch/serviceworker/filtered-response-base-https-other-https.html [ Timeout Failure ]
+Bug(none) http/tests/fetch/serviceworker/filtered-response-other-https.html [ Timeout ]
+Bug(none) http/tests/fetch/serviceworker/filtered-response.html [ Failure Timeout ]
 Bug(none) http/tests/fetch/serviceworker/headers-base-https-other-https.html [ Timeout ]
 Bug(none) http/tests/fetch/serviceworker/headers-guard-base-https-other-https.html [ Timeout ]
-Bug(none) http/tests/fetch/serviceworker/headers-guard.html [ Failure ]
+Bug(none) http/tests/fetch/serviceworker/headers-guard.html [ Failure Timeout ]
 Bug(none) http/tests/fetch/serviceworker/headers.html [ Failure ]
 Bug(none) http/tests/fetch/serviceworker/referrer-base-https-other-https.html [ Timeout ]
-Bug(none) http/tests/fetch/serviceworker/referrer.html [ Failure ]
+Bug(none) http/tests/fetch/serviceworker/referrer.html [ Failure Timeout ]
 Bug(none) http/tests/fetch/serviceworker/request-base-https-other-https.html [ Timeout ]
-Bug(none) http/tests/fetch/serviceworker/request.html [ Failure ]
+Bug(none) http/tests/fetch/serviceworker/request.html [ Failure Timeout ]
 Bug(none) http/tests/fetch/serviceworker/response-base-https-other-https.html [ Timeout ]
 Bug(none) http/tests/fetch/serviceworker/response-content-base-https-other-https.html [ Timeout ]
-Bug(none) http/tests/fetch/serviceworker/response-content.html [ Failure ]
-Bug(none) http/tests/fetch/serviceworker/response.html [ Failure ]
+Bug(none) http/tests/fetch/serviceworker/response-content.html [ Failure Timeout ]
+Bug(none) http/tests/fetch/serviceworker/response.html [ Failure Timeout ]
 Bug(none) http/tests/fetch/serviceworker/stream-reader-base-https-other-https.html [ Timeout ]
-Bug(none) http/tests/fetch/serviceworker/stream-reader.html [ Failure ]
+Bug(none) http/tests/fetch/serviceworker/stream-reader.html [ Failure Timeout ]
 Bug(none) http/tests/fetch/serviceworker/thorough/access-control-base-https-other-https.html [ Timeout ]
 Bug(none) http/tests/fetch/serviceworker/thorough/access-control.html [ Timeout ]
 Bug(none) http/tests/fetch/serviceworker/thorough/auth-base-https-other-https.html [ Timeout ]
@@ -2142,6 +2199,7 @@
 Bug(none) http/tests/inspector/network/network-cyrillic-xhr.html [ Timeout ]
 Bug(none) http/tests/inspector/network/network-datareceived.html [ Failure ]
 Bug(none) http/tests/inspector/network/network-empty-xhr.html [ Timeout ]
+Bug(none) http/tests/inspector/network/network-filters.html [ Failure ]
 Bug(none) http/tests/inspector/network/network-initiator.html [ Timeout ]
 Bug(none) http/tests/inspector/network/network-request-type.html [ Timeout ]
 Bug(none) http/tests/inspector/network/network-xhr-binary-content.html [ Failure ]
@@ -2176,11 +2234,11 @@
 Bug(none) http/tests/inspector/service-workers/service-worker-agents.html [ Failure ]
 Bug(none) http/tests/inspector/service-workers/service-worker-manager.html [ Failure ]
 Bug(none) http/tests/inspector/service-workers/service-worker-pause.html [ Failure ]
-Bug(none) http/tests/inspector/service-workers/service-workers-bypass-for-network-redirect.html [ Timeout ]
-Bug(none) http/tests/inspector/service-workers/service-workers-force-update-on-page-load.html [ Failure ]
-Bug(none) http/tests/inspector/service-workers/service-workers-navigation-preload.html [ Failure ]
-Bug(none) http/tests/inspector/service-workers/service-workers-redundant.html [ Failure ]
-Bug(none) http/tests/inspector/service-workers/service-workers-view.html [ Failure ]
+Bug(none) http/tests/inspector/service-workers/service-workers-bypass-for-network-redirect.html [ Crash Timeout ]
+Bug(none) http/tests/inspector/service-workers/service-workers-force-update-on-page-load.html [ Failure Timeout ]
+Bug(none) http/tests/inspector/service-workers/service-workers-navigation-preload.html [ Failure Timeout ]
+Bug(none) http/tests/inspector/service-workers/service-workers-redundant.html [ Failure Timeout ]
+Bug(none) http/tests/inspector/service-workers/service-workers-view.html [ Failure Timeout ]
 Bug(none) http/tests/inspector/service-workers/user-agent-override.html [ Failure ]
 Bug(none) http/tests/inspector/sources/debugger/pause-in-removed-frame.html [ Timeout ]
 Bug(none) http/tests/inspector/sources/ui-source-code-metadata.html [ Failure ]
@@ -2296,7 +2354,7 @@
 Bug(none) http/tests/misc/resource-timing-sizes-redirect-worker.html [ Failure ]
 Bug(none) http/tests/misc/resource-timing-sizes-redirect.html [ Failure ]
 Bug(none) http/tests/misc/resource-timing-sizes-sync-xhr-transfer-size.html [ Timeout ]
-Bug(none) http/tests/misc/resource-timing-sizes-tags.html [ Timeout ]
+Bug(none) http/tests/misc/resource-timing-sizes-tags.html [ Failure Timeout ]
 Bug(none) http/tests/misc/resource-timing-sizes-xhr-fetch-worker.html [ Failure ]
 Bug(none) http/tests/misc/resource-timing-sizes-xhr-fetch.html [ Timeout ]
 Bug(none) http/tests/misc/tests-finishing-simultaneously.html [ Timeout ]
@@ -2311,7 +2369,9 @@
 Bug(none) http/tests/navigation/ping-cookie.html [ Failure ]
 Bug(none) http/tests/navigation/ping-cross-origin-from-https.html [ Timeout ]
 Bug(none) http/tests/navigation/ping-same-origin.html [ Failure ]
+Bug(none) http/tests/navigation/post-basic.html [ Failure ]
 Bug(none) http/tests/navigation/post-frames-goback1.html [ Failure ]
+Bug(none) http/tests/navigation/post-frames.html [ Failure ]
 Bug(none) http/tests/navigation/post-goback1.html [ Failure ]
 Bug(none) http/tests/navigation/pushstate-whitelisted-at-blob-denied.html [ Timeout ]
 Bug(none) http/tests/navigation/redirect-on-back-updates-history-item.html [ Timeout ]
@@ -2322,19 +2382,19 @@
 Bug(none) http/tests/navigation/start-load-during-provisional-loader-detach.html [ Timeout ]
 Bug(none) http/tests/notifications/request-permission-in-service-workers.html [ Failure ]
 Bug(none) http/tests/notifications/serviceworker-notification-event.html [ Failure ]
-Bug(none) http/tests/notifications/serviceworker-notification-properties.html [ Failure ]
+Bug(none) http/tests/notifications/serviceworker-notification-properties.html [ Failure Timeout ]
 Bug(none) http/tests/notifications/serviceworker-notificationclick-event-action-reflection.html [ Failure ]
 Bug(none) http/tests/notifications/serviceworker-notificationclick-event-data-reflection.html [ Failure ]
-Bug(none) http/tests/notifications/serviceworker-notificationclick-event-reply-reflection.html [ Failure ]
+Bug(none) http/tests/notifications/serviceworker-notificationclick-event-reply-reflection.html [ Failure Timeout ]
 Bug(none) http/tests/notifications/serviceworker-notificationclick-openwindow-crash.html [ Failure ]
 Bug(none) http/tests/notifications/serviceworker-notificationclose-event-data-reflection.html [ Failure ]
-Bug(none) http/tests/notifications/serviceworker-throw-constructor.html [ Failure ]
+Bug(none) http/tests/notifications/serviceworker-throw-constructor.html [ Failure Timeout ]
 Bug(none) http/tests/notifications/serviceworkerregistration-document-actions-throw.html [ Failure ]
 Bug(none) http/tests/notifications/serviceworkerregistration-document-click.html [ Failure ]
 Bug(none) http/tests/notifications/serviceworkerregistration-document-close.html [ Failure ]
 Bug(none) http/tests/notifications/serviceworkerregistration-document-data-invalid.html [ Failure ]
 Bug(none) http/tests/notifications/serviceworkerregistration-document-data-throw.html [ Failure ]
-Bug(none) http/tests/notifications/serviceworkerregistration-document-direction.html [ Failure ]
+Bug(none) http/tests/notifications/serviceworkerregistration-document-direction.html [ Failure Timeout ]
 Bug(none) http/tests/notifications/serviceworkerregistration-document-fetch-resources.html [ Failure ]
 Bug(none) http/tests/notifications/serviceworkerregistration-document-image-404.html [ Failure ]
 Bug(none) http/tests/notifications/serviceworkerregistration-document-image-redirect-loop.html [ Failure ]
@@ -3347,8 +3407,8 @@
 Bug(none) media/video-transformed.html [ Timeout ]
 Bug(none) media/video-volume.html [ Timeout ]
 Bug(none) media/video-webkit-appearance.html [ Timeout ]
-Bug(none) media/video-zoom.html [ Failure Timeout ]
 Bug(none) media/video-zoom-controls.html [ Failure Timeout ]
+Bug(none) media/video-zoom.html [ Failure Timeout ]
 Bug(none) media/W3C/audio/events/event_canplay.html [ Timeout ]
 Bug(none) media/W3C/audio/events/event_canplay_manual.html [ Timeout ]
 Bug(none) media/W3C/audio/events/event_canplaythrough.html [ Timeout ]
@@ -3499,7 +3559,7 @@
 Bug(none) virtual/android/fullscreen/video-fixed-background.html [ Timeout ]
 Bug(none) virtual/android/fullscreen/video-scrolled-iframe.html [ Timeout ]
 Bug(none) virtual/android/fullscreen/video-specified-size.html [ Timeout ]
-Bug(none) virtual/android/media/mediadocument/media-document-with-download-button.html [ Timeout ]
+Bug(none) virtual/android/media/mediadocument/media-document-with-download-button.html [ Failure Timeout ]
 Bug(none) virtual/disable-spinvalidation/compositing/animation/busy-indicator.html [ Timeout ]
 Bug(none) virtual/disable-spinvalidation/compositing/iframes/iframe-in-composited-layer.html [ Failure Timeout ]
 Bug(none) virtual/disable-spinvalidation/compositing/video/video-reflection.html [ Timeout ]
@@ -3645,7 +3705,7 @@
 Bug(none) virtual/mojo-loading/http/tests/cache/subresource-failover-to-network.html [ Failure ]
 Bug(none) virtual/mojo-loading/http/tests/cache/subresource-fragment-identifier.html [ Failure ]
 Bug(none) virtual/mojo-loading/http/tests/cache/sync-xhr-304.html [ Failure ]
-Bug(none) virtual/mojo-loading/http/tests/cachestorage/serviceworker/credentials.html [ Failure ]
+Bug(none) virtual/mojo-loading/http/tests/cachestorage/serviceworker/credentials.html [ Failure Timeout ]
 Bug(none) virtual/mojo-loading/http/tests/canvas/webgl/origin-clean-conformance.html [ Timeout ]
 Bug(none) virtual/mojo-loading/http/tests/cookies/double-quoted-value-with-semi-colon.html [ Failure ]
 Bug(none) virtual/mojo-loading/http/tests/cookies/http-get-cookie-set-in-js.html [ Failure ]
@@ -3701,9 +3761,9 @@
 Bug(none) virtual/mojo-loading/http/tests/encoding/meta-switch-mid-parse-with-title.html [ Timeout ]
 Bug(none) virtual/mojo-loading/http/tests/encoding/meta-switch-mid-parse.html [ Timeout ]
 Bug(none) virtual/mojo-loading/http/tests/fetch/chromium/data-saver.html [ Timeout ]
-Bug(none) virtual/mojo-loading/http/tests/fetch/referrer/origin-when-cross-origin-serviceworker-from-document.html [ Failure ]
-Bug(none) virtual/mojo-loading/http/tests/fetch/referrer/serviceworker-echo-referrer-from-default-document.html [ Failure ]
-Bug(none) virtual/mojo-loading/http/tests/fetch/referrer/serviceworker-from-origin-only-document.html [ Failure ]
+Bug(none) virtual/mojo-loading/http/tests/fetch/referrer/origin-when-cross-origin-serviceworker-from-document.html [ Failure Timeout ]
+Bug(none) virtual/mojo-loading/http/tests/fetch/referrer/serviceworker-echo-referrer-from-default-document.html [ Failure Timeout ]
+Bug(none) virtual/mojo-loading/http/tests/fetch/referrer/serviceworker-from-origin-only-document.html [ Failure Timeout ]
 Bug(none) virtual/mojo-loading/http/tests/fetch/serviceworker-proxied/thorough/access-control-base-https-other-https.html [ Timeout ]
 Bug(none) virtual/mojo-loading/http/tests/fetch/serviceworker-proxied/thorough/access-control.html [ Timeout ]
 Bug(none) virtual/mojo-loading/http/tests/fetch/serviceworker-proxied/thorough/auth-base-https-other-https.html [ Timeout ]
@@ -3754,28 +3814,28 @@
 Bug(none) virtual/mojo-loading/http/tests/fetch/serviceworker/block-mixed-content-base-https.html [ Timeout ]
 Bug(none) virtual/mojo-loading/http/tests/fetch/serviceworker/block-mixed-content-nocors-base-https.html [ Timeout ]
 Bug(none) virtual/mojo-loading/http/tests/fetch/serviceworker/body-mixin-base-https-other-https.html [ Timeout ]
-Bug(none) virtual/mojo-loading/http/tests/fetch/serviceworker/body-mixin.html [ Failure ]
+Bug(none) virtual/mojo-loading/http/tests/fetch/serviceworker/body-mixin.html [ Failure Timeout ]
 Bug(none) virtual/mojo-loading/http/tests/fetch/serviceworker/cache-override-base-https-other-https.html [ Timeout ]
-Bug(none) virtual/mojo-loading/http/tests/fetch/serviceworker/cache-override.html [ Failure ]
+Bug(none) virtual/mojo-loading/http/tests/fetch/serviceworker/cache-override.html [ Failure Timeout ]
 Bug(none) virtual/mojo-loading/http/tests/fetch/serviceworker/fetch-base-https-other-https.html [ Timeout ]
-Bug(none) virtual/mojo-loading/http/tests/fetch/serviceworker/fetch.html [ Failure ]
+Bug(none) virtual/mojo-loading/http/tests/fetch/serviceworker/fetch.html [ Failure Timeout ]
 Bug(none) virtual/mojo-loading/http/tests/fetch/serviceworker/filtered-response-base-https-other-https.html [ Timeout ]
-Bug(none) virtual/mojo-loading/http/tests/fetch/serviceworker/filtered-response-other-https.html [ Failure ]
+Bug(none) virtual/mojo-loading/http/tests/fetch/serviceworker/filtered-response-other-https.html [ Failure Timeout ]
 Bug(none) virtual/mojo-loading/http/tests/fetch/serviceworker/filtered-response.html [ Failure ]
 Bug(none) virtual/mojo-loading/http/tests/fetch/serviceworker/headers-base-https-other-https.html [ Timeout ]
 Bug(none) virtual/mojo-loading/http/tests/fetch/serviceworker/headers-guard-base-https-other-https.html [ Timeout ]
 Bug(none) virtual/mojo-loading/http/tests/fetch/serviceworker/headers-guard.html [ Timeout Failure ]
 Bug(none) virtual/mojo-loading/http/tests/fetch/serviceworker/headers.html [ Failure ]
 Bug(none) virtual/mojo-loading/http/tests/fetch/serviceworker/referrer-base-https-other-https.html [ Timeout ]
-Bug(none) virtual/mojo-loading/http/tests/fetch/serviceworker/referrer.html [ Failure ]
+Bug(none) virtual/mojo-loading/http/tests/fetch/serviceworker/referrer.html [ Failure Timeout ]
 Bug(none) virtual/mojo-loading/http/tests/fetch/serviceworker/request-base-https-other-https.html [ Timeout ]
 Bug(none) virtual/mojo-loading/http/tests/fetch/serviceworker/request.html [ Failure ]
 Bug(none) virtual/mojo-loading/http/tests/fetch/serviceworker/response-base-https-other-https.html [ Timeout ]
 Bug(none) virtual/mojo-loading/http/tests/fetch/serviceworker/response-content-base-https-other-https.html [ Timeout ]
-Bug(none) virtual/mojo-loading/http/tests/fetch/serviceworker/response-content.html [ Failure ]
-Bug(none) virtual/mojo-loading/http/tests/fetch/serviceworker/response.html [ Failure ]
+Bug(none) virtual/mojo-loading/http/tests/fetch/serviceworker/response-content.html [ Failure Timeout ]
+Bug(none) virtual/mojo-loading/http/tests/fetch/serviceworker/response.html [ Failure Timeout ]
 Bug(none) virtual/mojo-loading/http/tests/fetch/serviceworker/stream-reader-base-https-other-https.html [ Timeout ]
-Bug(none) virtual/mojo-loading/http/tests/fetch/serviceworker/stream-reader.html [ Failure ]
+Bug(none) virtual/mojo-loading/http/tests/fetch/serviceworker/stream-reader.html [ Failure Timeout ]
 Bug(none) virtual/mojo-loading/http/tests/fetch/serviceworker/thorough/access-control-base-https-other-https.html [ Timeout ]
 Bug(none) virtual/mojo-loading/http/tests/fetch/serviceworker/thorough/access-control.html [ Timeout ]
 Bug(none) virtual/mojo-loading/http/tests/fetch/serviceworker/thorough/auth-base-https-other-https.html [ Timeout ]
@@ -4014,8 +4074,10 @@
 Bug(none) virtual/mojo-loading/http/tests/inspector/persistence/persistence-sync-content.html [ Failure ]
 Bug(none) virtual/mojo-loading/http/tests/inspector/persistence/persistence-tabbed-editor-tabs-order.html [ Failure Timeout ]
 Bug(none) virtual/mojo-loading/http/tests/inspector/resource-har-conversion.html [ Failure ]
+Bug(none) virtual/mojo-loading/http/tests/inspector/resource-parameters-ipv6.html [ Timeout ]
 Bug(none) virtual/mojo-loading/http/tests/inspector/resource-parameters.html [ Failure ]
 Bug(none) virtual/mojo-loading/http/tests/inspector/resource-tree/cached-resource-metadata.html [ Failure ]
+Bug(none) virtual/mojo-loading/http/tests/inspector/resource-tree/resource-tree-frame-navigate.html [ Failure ]
 Bug(none) virtual/mojo-loading/http/tests/inspector/resource-tree/resource-tree-no-xhrs.html [ Timeout ]
 Bug(none) virtual/mojo-loading/http/tests/inspector/search/sources-search-scope-in-files.html [ Failure ]
 Bug(none) virtual/mojo-loading/http/tests/inspector/search/sources-search-scope-many-projects.html [ Failure ]
@@ -4024,11 +4086,11 @@
 Bug(none) virtual/mojo-loading/http/tests/inspector/service-workers/service-worker-agents.html [ Failure ]
 Bug(none) virtual/mojo-loading/http/tests/inspector/service-workers/service-worker-manager.html [ Failure ]
 Bug(none) virtual/mojo-loading/http/tests/inspector/service-workers/service-worker-pause.html [ Failure ]
-Bug(none) virtual/mojo-loading/http/tests/inspector/service-workers/service-workers-bypass-for-network-redirect.html [ Timeout ]
-Bug(none) virtual/mojo-loading/http/tests/inspector/service-workers/service-workers-force-update-on-page-load.html [ Failure ]
-Bug(none) virtual/mojo-loading/http/tests/inspector/service-workers/service-workers-navigation-preload.html [ Failure ]
-Bug(none) virtual/mojo-loading/http/tests/inspector/service-workers/service-workers-redundant.html [ Failure ]
-Bug(none) virtual/mojo-loading/http/tests/inspector/service-workers/service-workers-view.html [ Failure ]
+Bug(none) virtual/mojo-loading/http/tests/inspector/service-workers/service-workers-bypass-for-network-redirect.html [ Crash Timeout ]
+Bug(none) virtual/mojo-loading/http/tests/inspector/service-workers/service-workers-force-update-on-page-load.html [ Failure Timeout ]
+Bug(none) virtual/mojo-loading/http/tests/inspector/service-workers/service-workers-navigation-preload.html [ Failure Timeout ]
+Bug(none) virtual/mojo-loading/http/tests/inspector/service-workers/service-workers-redundant.html [ Failure Timeout ]
+Bug(none) virtual/mojo-loading/http/tests/inspector/service-workers/service-workers-view.html [ Failure Timeout ]
 Bug(none) virtual/mojo-loading/http/tests/inspector/service-workers/user-agent-override.html [ Failure ]
 Bug(none) virtual/mojo-loading/http/tests/inspector/sources/debugger/pause-in-removed-frame.html [ Timeout ]
 Bug(none) virtual/mojo-loading/http/tests/inspector/sources/ui-source-code-metadata.html [ Failure ]
@@ -4141,7 +4203,7 @@
 Bug(none) virtual/mojo-loading/http/tests/misc/resource-timing-sizes-redirect-worker.html [ Failure ]
 Bug(none) virtual/mojo-loading/http/tests/misc/resource-timing-sizes-redirect.html [ Failure ]
 Bug(none) virtual/mojo-loading/http/tests/misc/resource-timing-sizes-sync-xhr-transfer-size.html [ Timeout ]
-Bug(none) virtual/mojo-loading/http/tests/misc/resource-timing-sizes-tags.html [ Timeout ]
+Bug(none) virtual/mojo-loading/http/tests/misc/resource-timing-sizes-tags.html [ Failure Timeout ]
 Bug(none) virtual/mojo-loading/http/tests/misc/resource-timing-sizes-xhr-fetch-worker.html [ Failure ]
 Bug(none) virtual/mojo-loading/http/tests/misc/resource-timing-sizes-xhr-fetch.html [ Timeout ]
 Bug(none) virtual/mojo-loading/http/tests/misc/tests-finishing-simultaneously.html [ Timeout ]
@@ -4162,46 +4224,46 @@
 Bug(none) virtual/mojo-loading/http/tests/navigation/start-load-during-provisional-loader-detach.html [ Timeout ]
 Bug(none) virtual/mojo-loading/http/tests/notifications/request-permission-in-service-workers.html [ Failure ]
 Bug(none) virtual/mojo-loading/http/tests/notifications/serviceworker-notification-event.html [ Failure ]
-Bug(none) virtual/mojo-loading/http/tests/notifications/serviceworker-notification-properties.html [ Failure ]
-Bug(none) virtual/mojo-loading/http/tests/notifications/serviceworker-notificationclick-event-action-reflection.html [ Failure ]
-Bug(none) virtual/mojo-loading/http/tests/notifications/serviceworker-notificationclick-event-data-reflection.html [ Failure ]
-Bug(none) virtual/mojo-loading/http/tests/notifications/serviceworker-notificationclick-event-reply-reflection.html [ Failure ]
-Bug(none) virtual/mojo-loading/http/tests/notifications/serviceworker-notificationclick-openwindow-crash.html [ Failure ]
-Bug(none) virtual/mojo-loading/http/tests/notifications/serviceworker-notificationclose-event-data-reflection.html [ Failure ]
-Bug(none) virtual/mojo-loading/http/tests/notifications/serviceworker-throw-constructor.html [ Failure ]
-Bug(none) virtual/mojo-loading/http/tests/notifications/serviceworkerregistration-document-actions-throw.html [ Failure ]
-Bug(none) virtual/mojo-loading/http/tests/notifications/serviceworkerregistration-document-click.html [ Failure ]
-Bug(none) virtual/mojo-loading/http/tests/notifications/serviceworkerregistration-document-close.html [ Failure ]
-Bug(none) virtual/mojo-loading/http/tests/notifications/serviceworkerregistration-document-data-invalid.html [ Failure ]
-Bug(none) virtual/mojo-loading/http/tests/notifications/serviceworkerregistration-document-data-throw.html [ Failure ]
-Bug(none) virtual/mojo-loading/http/tests/notifications/serviceworkerregistration-document-direction.html [ Failure ]
-Bug(none) virtual/mojo-loading/http/tests/notifications/serviceworkerregistration-document-fetch-resources.html [ Failure ]
-Bug(none) virtual/mojo-loading/http/tests/notifications/serviceworkerregistration-document-image-404.html [ Failure ]
-Bug(none) virtual/mojo-loading/http/tests/notifications/serviceworkerregistration-document-image-redirect-loop.html [ Failure ]
-Bug(none) virtual/mojo-loading/http/tests/notifications/serviceworkerregistration-document-image-redirect.html [ Failure ]
-Bug(none) virtual/mojo-loading/http/tests/notifications/serviceworkerregistration-document-image-slow-404.html [ Failure ]
-Bug(none) virtual/mojo-loading/http/tests/notifications/serviceworkerregistration-document-image-slow.html [ Failure ]
-Bug(none) virtual/mojo-loading/http/tests/notifications/serviceworkerregistration-document-no-permission.html [ Failure ]
+Bug(none) virtual/mojo-loading/http/tests/notifications/serviceworker-notification-properties.html [ Failure Timeout ]
+Bug(none) virtual/mojo-loading/http/tests/notifications/serviceworker-notificationclick-event-action-reflection.html [ Failure Timeout ]
+Bug(none) virtual/mojo-loading/http/tests/notifications/serviceworker-notificationclick-event-data-reflection.html [ Failure Timeout ]
+Bug(none) virtual/mojo-loading/http/tests/notifications/serviceworker-notificationclick-event-reply-reflection.html [ Failure Timeout ]
+Bug(none) virtual/mojo-loading/http/tests/notifications/serviceworker-notificationclick-openwindow-crash.html [ Failure Timeout ]
+Bug(none) virtual/mojo-loading/http/tests/notifications/serviceworker-notificationclose-event-data-reflection.html [ Failure Timeout ]
+Bug(none) virtual/mojo-loading/http/tests/notifications/serviceworker-throw-constructor.html [ Failure Timeout ]
+Bug(none) virtual/mojo-loading/http/tests/notifications/serviceworkerregistration-document-actions-throw.html [ Failure Timeout ]
+Bug(none) virtual/mojo-loading/http/tests/notifications/serviceworkerregistration-document-click.html [ Failure Timeout ]
+Bug(none) virtual/mojo-loading/http/tests/notifications/serviceworkerregistration-document-close.html [ Failure Timeout ]
+Bug(none) virtual/mojo-loading/http/tests/notifications/serviceworkerregistration-document-data-invalid.html [ Failure Timeout ]
+Bug(none) virtual/mojo-loading/http/tests/notifications/serviceworkerregistration-document-data-throw.html [ Failure Timeout ]
+Bug(none) virtual/mojo-loading/http/tests/notifications/serviceworkerregistration-document-direction.html [ Failure Timeout ]
+Bug(none) virtual/mojo-loading/http/tests/notifications/serviceworkerregistration-document-fetch-resources.html [ Failure Timeout ]
+Bug(none) virtual/mojo-loading/http/tests/notifications/serviceworkerregistration-document-image-404.html [ Failure Timeout ]
+Bug(none) virtual/mojo-loading/http/tests/notifications/serviceworkerregistration-document-image-redirect-loop.html [ Failure Timeout ]
+Bug(none) virtual/mojo-loading/http/tests/notifications/serviceworkerregistration-document-image-redirect.html [ Failure Timeout ]
+Bug(none) virtual/mojo-loading/http/tests/notifications/serviceworkerregistration-document-image-slow-404.html [ Failure Timeout ]
+Bug(none) virtual/mojo-loading/http/tests/notifications/serviceworkerregistration-document-image-slow.html [ Failure Timeout ]
+Bug(none) virtual/mojo-loading/http/tests/notifications/serviceworkerregistration-document-no-permission.html [ Failure Timeout ]
 Bug(none) virtual/mojo-loading/http/tests/notifications/serviceworkerregistration-document-not-activated.html [ Failure ]
-Bug(none) virtual/mojo-loading/http/tests/notifications/serviceworkerregistration-document-vibrate-throw.html [ Failure ]
-Bug(none) virtual/mojo-loading/http/tests/notifications/serviceworkerregistration-get-close.html [ Failure ]
-Bug(none) virtual/mojo-loading/http/tests/notifications/serviceworkerregistration-get-empty.html [ Failure ]
-Bug(none) virtual/mojo-loading/http/tests/notifications/serviceworkerregistration-get-filter.html [ Failure ]
-Bug(none) virtual/mojo-loading/http/tests/notifications/serviceworkerregistration-get-from-service-worker.html [ Failure ]
-Bug(none) virtual/mojo-loading/http/tests/notifications/serviceworkerregistration-get-replacement.html [ Failure ]
-Bug(none) virtual/mojo-loading/http/tests/notifications/serviceworkerregistration-get.html [ Failure ]
-Bug(none) virtual/mojo-loading/http/tests/notifications/serviceworkerregistration-page-notification-fetch-resources.html [ Failure ]
-Bug(none) virtual/mojo-loading/http/tests/notifications/serviceworkerregistration-service-worker-click.html [ Failure ]
-Bug(none) virtual/mojo-loading/http/tests/notifications/serviceworkerregistration-service-worker-fetch-resources.html [ Failure ]
-Bug(none) virtual/mojo-loading/http/tests/notifications/serviceworkerregistration-service-worker-get-filter.html [ Failure ]
-Bug(none) virtual/mojo-loading/http/tests/notifications/serviceworkerregistration-service-worker-get.html [ Failure ]
-Bug(none) virtual/mojo-loading/http/tests/notifications/serviceworkerregistration-service-worker-image-404.html [ Failure ]
-Bug(none) virtual/mojo-loading/http/tests/notifications/serviceworkerregistration-service-worker-image-abort.html [ Failure ]
-Bug(none) virtual/mojo-loading/http/tests/notifications/serviceworkerregistration-service-worker-image-redirect-loop.html [ Failure ]
-Bug(none) virtual/mojo-loading/http/tests/notifications/serviceworkerregistration-service-worker-image-redirect.html [ Failure ]
-Bug(none) virtual/mojo-loading/http/tests/notifications/serviceworkerregistration-service-worker-image-slow-404.html [ Failure ]
-Bug(none) virtual/mojo-loading/http/tests/notifications/serviceworkerregistration-service-worker-image-slow.html [ Failure ]
-Bug(none) virtual/mojo-loading/http/tests/notifications/serviceworkerregistration-service-worker-no-permission.html [ Failure ]
+Bug(none) virtual/mojo-loading/http/tests/notifications/serviceworkerregistration-document-vibrate-throw.html [ Failure Timeout ]
+Bug(none) virtual/mojo-loading/http/tests/notifications/serviceworkerregistration-get-close.html [ Failure Timeout ]
+Bug(none) virtual/mojo-loading/http/tests/notifications/serviceworkerregistration-get-empty.html [ Failure Timeout ]
+Bug(none) virtual/mojo-loading/http/tests/notifications/serviceworkerregistration-get-filter.html [ Failure Timeout ]
+Bug(none) virtual/mojo-loading/http/tests/notifications/serviceworkerregistration-get-from-service-worker.html [ Failure Timeout ]
+Bug(none) virtual/mojo-loading/http/tests/notifications/serviceworkerregistration-get-replacement.html [ Failure Timeout ]
+Bug(none) virtual/mojo-loading/http/tests/notifications/serviceworkerregistration-get.html [ Failure Timeout ]
+Bug(none) virtual/mojo-loading/http/tests/notifications/serviceworkerregistration-page-notification-fetch-resources.html [ Failure Timeout ]
+Bug(none) virtual/mojo-loading/http/tests/notifications/serviceworkerregistration-service-worker-click.html [ Failure Timeout ]
+Bug(none) virtual/mojo-loading/http/tests/notifications/serviceworkerregistration-service-worker-fetch-resources.html [ Failure Timeout ]
+Bug(none) virtual/mojo-loading/http/tests/notifications/serviceworkerregistration-service-worker-get-filter.html [ Failure Timeout ]
+Bug(none) virtual/mojo-loading/http/tests/notifications/serviceworkerregistration-service-worker-get.html [ Failure Timeout ]
+Bug(none) virtual/mojo-loading/http/tests/notifications/serviceworkerregistration-service-worker-image-404.html [ Failure Timeout ]
+Bug(none) virtual/mojo-loading/http/tests/notifications/serviceworkerregistration-service-worker-image-abort.html [ Failure Timeout ]
+Bug(none) virtual/mojo-loading/http/tests/notifications/serviceworkerregistration-service-worker-image-redirect-loop.html [ Failure  Timeout ]
+Bug(none) virtual/mojo-loading/http/tests/notifications/serviceworkerregistration-service-worker-image-redirect.html [ Failure Timeout ]
+Bug(none) virtual/mojo-loading/http/tests/notifications/serviceworkerregistration-service-worker-image-slow-404.html [ Failure Timeout ]
+Bug(none) virtual/mojo-loading/http/tests/notifications/serviceworkerregistration-service-worker-image-slow.html [ Failure Timeout ]
+Bug(none) virtual/mojo-loading/http/tests/notifications/serviceworkerregistration-service-worker-no-permission.html [ Failure Timeout ]
 Bug(none) virtual/mojo-loading/http/tests/origin_trials/sample-api-workers.html [ Failure ]
 Bug(none) virtual/mojo-loading/http/tests/origin_trials/webexposed/budget-api-origin-trial-interfaces.html [ Failure ]
 Bug(none) virtual/mojo-loading/http/tests/origin_trials/webexposed/foreignfetch-origin-trial-interfaces.html [ Failure ]
@@ -4798,6 +4860,7 @@
 Bug(none) virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/foreign-fetch-workers.https.html [ Timeout ]
 Bug(none) virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/getregistration.https.html [ Timeout ]
 Bug(none) virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/getregistrations.https.html [ Timeout ]
+Bug(none) virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/http-to-https-redirect-and-register.https.html [ Timeout ]
 Bug(none) virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/iframe-sandbox-register-link-element.https.html [ Timeout ]
 Bug(none) virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/import-scripts-resource-map.https.html [ Timeout ]
 Bug(none) virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/import-scripts-updated-flag.https.html [ Timeout ]
@@ -4880,6 +4943,7 @@
 Bug(none) virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/update.https.html [ Timeout ]
 Bug(none) virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/waiting.https.html [ Timeout ]
 Bug(none) virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/websocket.https.html [ Timeout ]
+Bug(none) virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/windowclient-navigate.https.html [ Timeout ]
 Bug(none) virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/worker-interception.https.html [ Timeout ]
 Bug(none) virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/xhr.https.html [ Timeout ]
 Bug(none) virtual/off-main-thread-fetch/http/tests/fetch/workers/block-mixed-content-base-https.html [ Timeout ]
@@ -5084,6 +5148,7 @@
 Bug(none) virtual/stable/media/stable/video-object-fit-stable.html [ Timeout ]
 Bug(none) virtual/threaded/animations/animation-end-event-destroy-renderer.html [ Timeout ]
 Bug(none) virtual/threaded/animations/responsive-neutral-keyframe.html [ Timeout ]
+Bug(none) virtual/threaded/animations/visited-link-color-animation.html [ Timeout ]
 Bug(none) virtual/threaded/fast/compositorworker/animation-worklet-animator-registration.html [ Timeout ]
 Bug(none) virtual/threaded/fast/compositorworker/basic-plumbing-worker-to-main.html [ Failure Timeout ]
 Bug(none) virtual/threaded/fast/idleToBlob/OffscreenCanvas-convertToBlob-2d-main.html [ Timeout ]
@@ -5093,7 +5158,10 @@
 Bug(none) virtual/threaded/fast/scroll-behavior/smooth-scroll/main-thread-scrolling-reason-added.html [ Failure Timeout ]
 Bug(none) virtual/threaded/inspector/tracing/timeline-network/timeline-network-resource-details.html [ Failure ]
 Bug(none) virtual/threaded/inspector/tracing/timeline-network/timeline-network-resource.html [ Failure ]
+Bug(none) virtual/threaded/inspector/tracing/timeline-paint/timeline-paint-with-layout-invalidations.html [ Failure ]
 Bug(none) virtual/threaded/printing/subframes-percentage-height.html [ Failure Timeout ]
+Bug(none) virtual/threaded/transitions/mismatched-shadow-styles.html [ Timeout ]
+Bug(none) virtual/threaded/transitions/move-after-transition.html [ Timeout ]
 Bug(none) virtual/threaded/transitions/transition-end-event-multiple-03.html [ Failure Timeout ]
 Bug(none) virtual/wheelscrolllatching/fast/events/wheel/mainthread-touchpad-fling-latching.html [ Failure Timeout ]
 Bug(none) vr/events_vrdisplayactivate.html [ Timeout ]
diff --git a/third_party/WebKit/LayoutTests/TestExpectations b/third_party/WebKit/LayoutTests/TestExpectations
index bc8b5b1d..936d1f2 100644
--- a/third_party/WebKit/LayoutTests/TestExpectations
+++ b/third_party/WebKit/LayoutTests/TestExpectations
@@ -2709,6 +2709,10 @@
 crbug.com/707359 [ Mac ] fast/css-grid-layout/grid-self-baseline-vertical-rl-04.html [ Failure ]
 crbug.com/707359 [ Mac ] fast/css-grid-layout/grid-self-baseline-vertical-rl-05.html [ Failure ]
 
+# [css-align]
+crbug.com/668639 external/wpt/css/css-align-3/default-alignment/place-items-shorthand-006.html [ Failure ]
+crbug.com/668639 external/wpt/css/css-align-3/self-alignment/place-self-shorthand-006.html [ Failure ]
+
 # [selectors-4]
 crbug.com/706118 external/wpt/css/selectors4/hover-001-manual.html [ Skip ]
 crbug.com/576815 external/wpt/css/selectors4/selectors-dir-selector-ltr-001.html [ Failure ]
diff --git a/third_party/WebKit/LayoutTests/css3/flexbox/css-properties-expected.txt b/third_party/WebKit/LayoutTests/css3/flexbox/css-properties-expected.txt
index 8ac700e..9880226f 100644
--- a/third_party/WebKit/LayoutTests/css3/flexbox/css-properties-expected.txt
+++ b/third_party/WebKit/LayoutTests/css3/flexbox/css-properties-expected.txt
@@ -31,12 +31,12 @@
 PASS flexbox.style.justifyContent is ""
 PASS window.getComputedStyle(flexbox, null).justifyContent is "normal"
 PASS flexbox.style.alignSelf is ""
-PASS window.getComputedStyle(flexbox, null).alignSelf is "auto"
-PASS window.getComputedStyle(document.documentElement, null).alignSelf is "auto"
+PASS window.getComputedStyle(flexbox, null).alignSelf is "normal"
+PASS window.getComputedStyle(document.documentElement, null).alignSelf is "normal"
 PASS flexbox.style.alignSelf is ""
-PASS window.getComputedStyle(flexbox, null).alignSelf is "auto"
+PASS window.getComputedStyle(flexbox, null).alignSelf is "normal"
 PASS flexbox.style.alignSelf is "auto"
-PASS window.getComputedStyle(flexbox, null).alignSelf is "auto"
+PASS window.getComputedStyle(flexbox, null).alignSelf is "normal"
 PASS flexbox.style.alignSelf is "flex-start"
 PASS window.getComputedStyle(flexbox, null).alignSelf is "flex-start"
 PASS flexbox.style.alignSelf is "flex-end"
@@ -48,41 +48,41 @@
 PASS flexbox.style.alignSelf is "baseline"
 PASS window.getComputedStyle(flexbox, null).alignSelf is "baseline"
 PASS flexbox.style.alignSelf is ""
-PASS window.getComputedStyle(flexbox, null).alignSelf is "auto"
+PASS window.getComputedStyle(flexbox, null).alignSelf is "normal"
 PASS flexbox.style.alignItems is ""
 PASS flexitem.style.alignSelf is ""
 PASS window.getComputedStyle(flexbox, null).alignItems is "normal"
-PASS window.getComputedStyle(flexitem, null).alignSelf is "auto"
+PASS window.getComputedStyle(flexitem, null).alignSelf is "normal"
 PASS flexbox.style.alignItems is ""
 PASS flexitem.style.alignSelf is ""
 PASS window.getComputedStyle(flexbox, null).alignItems is "normal"
-PASS window.getComputedStyle(flexitem, null).alignSelf is "auto"
+PASS window.getComputedStyle(flexitem, null).alignSelf is "normal"
 PASS flexbox.style.alignItems is ""
 PASS flexitem.style.alignSelf is ""
 PASS window.getComputedStyle(flexbox, null).alignItems is "normal"
-PASS window.getComputedStyle(flexitem, null).alignSelf is "auto"
+PASS window.getComputedStyle(flexitem, null).alignSelf is "normal"
 PASS flexbox.style.alignItems is "flex-start"
 PASS flexitem.style.alignSelf is ""
 PASS window.getComputedStyle(flexbox, null).alignItems is "flex-start"
-FAIL window.getComputedStyle(flexitem, null).alignSelf should be flex-start. Was auto.
+PASS window.getComputedStyle(flexitem, null).alignSelf is "flex-start"
 PASS flexbox.style.alignItems is "flex-end"
 PASS window.getComputedStyle(flexbox, null).alignItems is "flex-end"
-FAIL window.getComputedStyle(flexitem, null).alignSelf should be flex-end. Was auto.
+PASS window.getComputedStyle(flexitem, null).alignSelf is "flex-end"
 PASS flexbox.style.alignItems is "center"
 PASS window.getComputedStyle(flexbox, null).alignItems is "center"
-FAIL window.getComputedStyle(flexitem, null).alignSelf should be center. Was auto.
+PASS window.getComputedStyle(flexitem, null).alignSelf is "center"
 PASS flexbox.style.alignItems is "stretch"
 PASS window.getComputedStyle(flexbox, null).alignItems is "stretch"
-FAIL window.getComputedStyle(flexitem, null).alignSelf should be stretch. Was auto.
+PASS window.getComputedStyle(flexitem, null).alignSelf is "stretch"
 PASS flexbox.style.alignItems is "baseline"
 PASS window.getComputedStyle(flexbox, null).alignItems is "baseline"
-FAIL window.getComputedStyle(flexitem, null).alignSelf should be baseline. Was auto.
+PASS window.getComputedStyle(flexitem, null).alignSelf is "baseline"
 PASS flexbox.style.alignItems is ""
 PASS window.getComputedStyle(flexbox, null).alignItems is "normal"
-PASS window.getComputedStyle(flexitem, null).alignSelf is "auto"
+PASS window.getComputedStyle(flexitem, null).alignSelf is "normal"
 PASS flexbox.style.alignItems is ""
 PASS window.getComputedStyle(flexbox, null).alignItems is "normal"
-PASS window.getComputedStyle(flexitem, null).alignSelf is "auto"
+PASS window.getComputedStyle(flexitem, null).alignSelf is "normal"
 PASS window.getComputedStyle(detachedFlexbox, null).alignSelf is ""
 PASS window.getComputedStyle(detachedFlexItem, null).alignSelf is ""
 PASS flexbox.style.flexDirection is ""
diff --git a/third_party/WebKit/LayoutTests/css3/flexbox/css-properties.html b/third_party/WebKit/LayoutTests/css3/flexbox/css-properties.html
index 75e796e3..b95bb5a1 100644
--- a/third_party/WebKit/LayoutTests/css3/flexbox/css-properties.html
+++ b/third_party/WebKit/LayoutTests/css3/flexbox/css-properties.html
@@ -84,17 +84,17 @@
 shouldBeEqualToString('window.getComputedStyle(flexbox, null).justifyContent', 'normal');
 
 shouldBeEqualToString('flexbox.style.alignSelf', '');
-// The initial value is 'auto'.
-shouldBeEqualToString('window.getComputedStyle(flexbox, null).alignSelf', 'auto');
-shouldBeEqualToString('window.getComputedStyle(document.documentElement, null).alignSelf', 'auto');
+// The initial value is 'auto', which will be resolved depending on parent's style (except for the 'document' element).
+shouldBeEqualToString('window.getComputedStyle(flexbox, null).alignSelf', 'normal');
+shouldBeEqualToString('window.getComputedStyle(document.documentElement, null).alignSelf', 'normal');
 
 flexbox.style.alignSelf = 'foo';
 shouldBeEqualToString('flexbox.style.alignSelf', '');
-shouldBeEqualToString('window.getComputedStyle(flexbox, null).alignSelf', 'auto');
+shouldBeEqualToString('window.getComputedStyle(flexbox, null).alignSelf', 'normal');
 
 flexbox.style.alignSelf = 'auto';
 shouldBeEqualToString('flexbox.style.alignSelf', 'auto');
-shouldBeEqualToString('window.getComputedStyle(flexbox, null).alignSelf', 'auto');
+shouldBeEqualToString('window.getComputedStyle(flexbox, null).alignSelf', 'normal');
 
 flexbox.style.alignSelf = 'flex-start';
 shouldBeEqualToString('flexbox.style.alignSelf', 'flex-start');
@@ -118,26 +118,26 @@
 
 flexbox.style.alignSelf = '';
 shouldBeEqualToString('flexbox.style.alignSelf', '');
-shouldBeEqualToString('window.getComputedStyle(flexbox, null).alignSelf', 'auto');
+shouldBeEqualToString('window.getComputedStyle(flexbox, null).alignSelf', 'normal');
 
 shouldBeEqualToString('flexbox.style.alignItems', '');
 shouldBeEqualToString('flexitem.style.alignSelf', '');
-// The initial value is 'auto'.
+// The initial value is 'auto', which will be resolved to 'normal' in case of flexbox containers.
 shouldBeEqualToString('window.getComputedStyle(flexbox, null).alignItems', 'normal');
-shouldBeEqualToString('window.getComputedStyle(flexitem, null).alignSelf', 'auto');
+shouldBeEqualToString('window.getComputedStyle(flexitem, null).alignSelf', 'normal');
 
 flexbox.style.alignItems = 'foo';
 shouldBeEqualToString('flexbox.style.alignItems', '');
 shouldBeEqualToString('flexitem.style.alignSelf', '');
 shouldBeEqualToString('window.getComputedStyle(flexbox, null).alignItems', 'normal');
-shouldBeEqualToString('window.getComputedStyle(flexitem, null).alignSelf', 'auto');
+shouldBeEqualToString('window.getComputedStyle(flexitem, null).alignSelf', 'normal');
 
 // The 'auto' value is not valid for the align-items property.
 flexbox.style.alignItems = 'auto';
 shouldBeEqualToString('flexbox.style.alignItems', '');
 shouldBeEqualToString('flexitem.style.alignSelf', '');
 shouldBeEqualToString('window.getComputedStyle(flexbox, null).alignItems', 'normal');
-shouldBeEqualToString('window.getComputedStyle(flexitem, null).alignSelf', 'auto');
+shouldBeEqualToString('window.getComputedStyle(flexitem, null).alignSelf', 'normal');
 
 flexbox.style.alignItems = 'flex-start';
 shouldBeEqualToString('flexbox.style.alignItems', 'flex-start');
@@ -168,12 +168,12 @@
 flexbox.style.alignItems = '';
 shouldBeEqualToString('flexbox.style.alignItems', '');
 shouldBeEqualToString('window.getComputedStyle(flexbox, null).alignItems', 'normal');
-shouldBeEqualToString('window.getComputedStyle(flexitem, null).alignSelf', 'auto');
+shouldBeEqualToString('window.getComputedStyle(flexitem, null).alignSelf', 'normal');
 
 flexbox.style.display = 'none';
 shouldBeEqualToString('flexbox.style.alignItems', '');
 shouldBeEqualToString('window.getComputedStyle(flexbox, null).alignItems', 'normal');
-shouldBeEqualToString('window.getComputedStyle(flexitem, null).alignSelf', 'auto');
+shouldBeEqualToString('window.getComputedStyle(flexitem, null).alignSelf', 'normal');
 flexbox.style.display = 'flex';
 
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-align-3/default-alignment/place-items-shorthand-006.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-align-3/default-alignment/place-items-shorthand-006.html
index 4af3ad5..7aa3e88 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/css/css-align-3/default-alignment/place-items-shorthand-006.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-align-3/default-alignment/place-items-shorthand-006.html
@@ -10,7 +10,7 @@
 <script>
     var values = ["normal", "stretch"].concat(selfPositionValues, baselineValues);
     values.forEach(function(alignValue) {
-        [""].concat(values).forEach(function(justifyValue) {
+        ["", "auto"].concat(values).forEach(function(justifyValue) {
             var value = (alignValue + " " + justifyValue).trim();
             test(function() {
                 checkPlaceShorhand("place-items", alignValue, justifyValue)
diff --git a/third_party/WebKit/LayoutTests/fast/alignment/alignment-and-anomymous-boxes-expected.html b/third_party/WebKit/LayoutTests/fast/alignment/alignment-and-anomymous-boxes-expected.html
index 6104f18..008235b 100644
--- a/third_party/WebKit/LayoutTests/fast/alignment/alignment-and-anomymous-boxes-expected.html
+++ b/third_party/WebKit/LayoutTests/fast/alignment/alignment-and-anomymous-boxes-expected.html
@@ -8,18 +8,18 @@
 }
 .grid { display: grid; }
 .flex { display: flex; }
-.selfCenter {
-   align-self: center;
-   justify-self: center;
+.itemsCenter {
+   align-items: center;
+   justify-items: center;
 }
 </style>
 
 <p>Grid item created as anonymous box to contain the text element. The text element should be centered in both axis due to the Default Alignment 'center' value on its container.</p>
-<div class="container grid">
-    <div class="selfCenter">foobar</div>
+<div class="container grid itemsCenter">
+    <div>foobar</div>
 </div>
 
-<p>Flex item created as anonymous box to contain the text element. The text element should be centered in cross axis due to the Default Alignment 'center' value on its container.</p>
-<div class="container flex">
-    <div class="selfCenter">foobar</div>
+<p>Flex item created as anonymous box to contain the text element. The text element should be centered in both axis due to the Default Alignment 'center' value on its container.</p>
+<div class="container flex itemsCenter">
+    <div>foobar</div>
 </div>
diff --git a/third_party/WebKit/LayoutTests/fast/alignment/alignment-and-anomymous-boxes.html b/third_party/WebKit/LayoutTests/fast/alignment/alignment-and-anomymous-boxes.html
index e05e095..f7de8d7 100644
--- a/third_party/WebKit/LayoutTests/fast/alignment/alignment-and-anomymous-boxes.html
+++ b/third_party/WebKit/LayoutTests/fast/alignment/alignment-and-anomymous-boxes.html
@@ -19,7 +19,7 @@
     foobar
 </div>
 
-<p>Flex item created as anonymous box to contain the text element. The text element should be centered in cross axis due to the Default Alignment 'center' value on its container.</p>
+<p>Flex item created as anonymous box to contain the text element. The text element should be centered in both axis due to the Default Alignment 'center' value on its container.</p>
 <div class="container flex itemsCenter">
     foobar
 </div>
diff --git a/third_party/WebKit/LayoutTests/fast/alignment/ensure-flexbox-compatibility-with-initial-values-expected.txt b/third_party/WebKit/LayoutTests/fast/alignment/ensure-flexbox-compatibility-with-initial-values-expected.txt
index 1e0e745..b1a3b03c5 100644
--- a/third_party/WebKit/LayoutTests/fast/alignment/ensure-flexbox-compatibility-with-initial-values-expected.txt
+++ b/third_party/WebKit/LayoutTests/fast/alignment/ensure-flexbox-compatibility-with-initial-values-expected.txt
@@ -6,37 +6,37 @@
 
 Verifying initial values are supported when grid is ENABLED.
 PASS CSS.supports('align-items', 'normal') is true
-PASS CSS.supports('align-self', 'auto') is true
+PASS CSS.supports('align-self', 'normal') is true
 PASS CSS.supports('align-content', 'normal') is true
 PASS CSS.supports('justify-content', 'normal') is true
 PASS CSS.supports('align-items', 'normal') is true
-PASS CSS.supports('align-self', 'auto') is true
+PASS CSS.supports('align-self', 'normal') is true
 PASS CSS.supports('align-content', 'normal') is true
 PASS CSS.supports('justify-content', 'normal') is true
 PASS CSS.supports('align-items', 'normal') is true
-PASS CSS.supports('align-self', 'auto') is true
+PASS CSS.supports('align-self', 'normal') is true
 PASS CSS.supports('align-content', 'normal') is true
 PASS CSS.supports('justify-content', 'normal') is true
 PASS CSS.supports('align-items', 'normal') is true
-PASS CSS.supports('align-self', 'auto') is true
+PASS CSS.supports('align-self', 'normal') is true
 PASS CSS.supports('align-content', 'normal') is true
 PASS CSS.supports('justify-content', 'normal') is true
 
 Verifying initial values are supported when grid is DISABLED.
 PASS CSS.supports('align-items', 'stretch') is true
-PASS CSS.supports('align-self', 'auto') is true
+PASS CSS.supports('align-self', 'stretch') is true
 PASS CSS.supports('align-content', 'stretch') is true
 PASS CSS.supports('justify-content', 'flex-start') is true
 PASS CSS.supports('align-items', 'stretch') is true
-PASS CSS.supports('align-self', 'auto') is true
+PASS CSS.supports('align-self', 'stretch') is true
 PASS CSS.supports('align-content', 'stretch') is true
 PASS CSS.supports('justify-content', 'flex-start') is true
 PASS CSS.supports('align-items', 'stretch') is true
-PASS CSS.supports('align-self', 'auto') is true
+PASS CSS.supports('align-self', 'stretch') is true
 PASS CSS.supports('align-content', 'stretch') is true
 PASS CSS.supports('justify-content', 'flex-start') is true
 PASS CSS.supports('align-items', 'stretch') is true
-PASS CSS.supports('align-self', 'auto') is true
+PASS CSS.supports('align-self', 'stretch') is true
 PASS CSS.supports('align-content', 'stretch') is true
 PASS CSS.supports('justify-content', 'flex-start') is true
 PASS successfullyParsed is true
diff --git a/third_party/WebKit/LayoutTests/fast/alignment/new-alignment-values-invalid-if-grid-not-enabled.html b/third_party/WebKit/LayoutTests/fast/alignment/new-alignment-values-invalid-if-grid-not-enabled.html
index b767aa9..5bd8055 100644
--- a/third_party/WebKit/LayoutTests/fast/alignment/new-alignment-values-invalid-if-grid-not-enabled.html
+++ b/third_party/WebKit/LayoutTests/fast/alignment/new-alignment-values-invalid-if-grid-not-enabled.html
@@ -29,10 +29,10 @@
     container.style.webkitAlignItems = value;
     if (gridEnabled) {
         checkValues(container, "alignItems", "align-items", value, computedValue);
-        checkValues(item, "alignSelf", "align-self", "auto", "auto");
+        checkValues(item, "alignSelf", "align-self", "auto", computedValue);
     } else {
         checkValues(container, "alignItems", "align-items", "flex-end", "flex-end");
-        checkValues(item, "alignSelf", "align-self", "auto", "auto");
+        checkValues(item, "alignSelf", "align-self", "auto", "flex-end");
     }
 }
 
diff --git a/third_party/WebKit/LayoutTests/fast/alignment/parse-align-self.html b/third_party/WebKit/LayoutTests/fast/alignment/parse-align-self.html
index 8e81f78..149c1a0 100644
--- a/third_party/WebKit/LayoutTests/fast/alignment/parse-align-self.html
+++ b/third_party/WebKit/LayoutTests/fast/alignment/parse-align-self.html
@@ -16,10 +16,6 @@
     align-self: stretch;
 }
 
-#alignSelfNormal {
-    align-self: normal;
-}
-
 #alignSelfStart {
     align-self: start;
 }
@@ -93,7 +89,6 @@
 <div id="alignSelfFirstBaseline"></div>
 <div id="alignSelfLastBaseline"></div>
 <div id="alignSelfStretch"></div>
-<div id="alignSelfNormal"></div>
 <div id="alignSelfStart"></div>
 <div id="alignSelfEnd"></div>
 <div id="alignSelfCenter"></div>
@@ -125,8 +120,6 @@
     checkValues(alignSelfLastBaseline, "alignSelf", "align-self", "", "last baseline");
     var alignSelfStretch = document.getElementById("alignSelfStretch");
     checkValues(alignSelfStretch, "alignSelf", "align-self", "", "stretch");
-    var alignSelfNormal = document.getElementById("alignSelfNormal");
-    checkValues(alignSelfNormal, "alignSelf", "align-self", "", "normal");
     var alignSelfStart = document.getElementById("alignSelfStart");
     checkValues(alignSelfStart, "alignSelf", "align-self", "", "start");
     var alignSelfEnd = document.getElementById("alignSelfEnd");
@@ -167,7 +160,7 @@
 test(function() {
     element = document.createElement("div");
     document.body.appendChild(element);
-    checkValues(element, "alignSelf", "align-self", "", "auto");
+    checkValues(element, "alignSelf", "align-self", "", "normal");
 }, "Test initial value of align-self through JS");
 
 test(function() {
@@ -193,19 +186,16 @@
     element.style.alignSelf = "self-start";
     checkValues(element, "alignSelf", "align-self",  "self-start", "self-start");
 
-    element.style.alignSelf = "normal";
-    checkValues(element, "alignSelf", "align-self",  "normal", "normal");
-
     element.style.alignSelf = "auto";
-    checkValues(element, "alignSelf", "align-self",  "auto", "auto");
+    checkValues(element, "alignSelf", "align-self",  "auto", "normal");
 
     container.style.display = "flex";
     element.style.alignSelf = "auto";
-    checkValues(element, "alignSelf", "align-self",  "auto", "auto");
+    checkValues(element, "alignSelf", "align-self",  "auto", "normal");
 
     container.style.display = "grid";
     element.style.alignSelf = "auto";
-    checkValues(element, "alignSelf", "align-self",  "auto", "auto");
+    checkValues(element, "alignSelf", "align-self",  "auto", "normal");
 
     element.style.alignSelf = "self-end";
     checkValues(element, "alignSelf", "align-self",  "self-end", "self-end");
@@ -213,7 +203,7 @@
 
 test(function() {
     document.documentElement.style.alignSelf = "auto";
-    checkValues(document.documentElement, "alignSelf", "align-self",  "auto", "auto");
+    checkValues(document.documentElement, "alignSelf", "align-self",  "auto", "normal");
 }, "Test 'auto' value resolution for the root node");
 
 test(function() {
@@ -224,9 +214,6 @@
 
     checkBadValues(element, "alignSelf", "align-self",  "auto safe");
     checkBadValues(element, "alignSelf", "align-self",  "auto left");
-    checkBadValues(element, "alignSelf", "align-self",  "normal unsafe");
-    checkBadValues(element, "alignSelf", "align-self",  "normal stretch");
-    checkBadValues(element, "alignSelf", "align-self",  "baseline normal");
     checkBadValues(element, "alignSelf", "align-self",  "baseline safe");
     checkBadValues(element, "alignSelf", "align-self",  "baseline center");
     checkBadValues(element, "alignSelf", "align-self",  "stretch unsafe");
@@ -252,35 +239,35 @@
 
 test(function() {
     container.style.display = "";
-    checkInitialValues(element, "alignSelf", "align-self", "center", "auto");
+    checkInitialValues(element, "alignSelf", "align-self", "center", "normal");
 }, "Test the value 'initial'");
 
 test(function() {
     container.style.display = "grid";
-    checkInitialValues(element, "alignSelf", "align-self", "left safe", "auto");
+    checkInitialValues(element, "alignSelf", "align-self", "left safe", "normal");
 }, "Test the value 'initial' for grid containers");
 
 test(function() {
     container.style.display = "flex";
-    checkInitialValues(element, "alignSelf", "align-self", "right unsafe", "auto");
+    checkInitialValues(element, "alignSelf", "align-self", "right unsafe", "normal");
 }, "Test the value 'initial' for flex containers");
 
 test(function() {
     container.style.display = "";
     element.style.position = "absolute";
-    checkInitialValues(element, "alignSelf", "align-self", "left", "auto");
+    checkInitialValues(element, "alignSelf", "align-self", "left", "normal");
 }, "Test the value 'initial' for positioned elements");
 
 test(function() {
     container.style.display = "grid";
     element.style.position = "absolute";
-    checkInitialValues(element, "alignSelf", "align-self", "right", "auto");
+    checkInitialValues(element, "alignSelf", "align-self", "right", "normal");
 }, "Test the value 'initial' for positioned elements in grid containers");
 
 test(function() {
     container.style.display = "flex";
     element.style.position = "absolute";
-    checkInitialValues(element, "alignSelf", "align-self", "end", "auto");
+    checkInitialValues(element, "alignSelf", "align-self", "end", "normal");
 }, "Test the value 'initial' for positioned elements in grid containers");
 
 test(function() {
diff --git a/third_party/WebKit/LayoutTests/fast/alignment/parse-alignment-of-root-elements-expected.txt b/third_party/WebKit/LayoutTests/fast/alignment/parse-alignment-of-root-elements-expected.txt
new file mode 100644
index 0000000..7f36c08
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/fast/alignment/parse-alignment-of-root-elements-expected.txt
@@ -0,0 +1,30 @@
+CONSOLE MESSAGE: line 17: 
+CONSOLE MESSAGE: line 18: *** Test 'auto' value resolution for the document root node. ***
+CONSOLE MESSAGE: line 96: 
+CONSOLE MESSAGE: line 97: *** Test 'auto' value resolution for the shadow DOM root node. ***
+CONSOLE MESSAGE: line 104: 
+CONSOLE MESSAGE: line 149: 
+CONSOLE MESSAGE: line 150: *** Test 'auto' value resolution for the shadow DOM 'slotted' elements. ***
+This is a testharness.js-based test.
+Harness Error. harness_status.status = 1 , harness_status.message = 1 duplicate test name: "Check out how the DOM's root element align-items's value is used to resolve its children's align-self 'auto' values."
+PASS Check out how the DOM's root element resolves the align-self 'auto' values. 
+PASS Check out how the DOM's root element align-items's value is used to resolve its children's align-self 'auto' values. 
+PASS Check out how the DOM's root element deals with 'auto' value in align-items. 
+PASS Check out how the DOM's root element resolves the justify-self 'auto' values. 
+PASS Check out how the DOM's root element align-items's value is used to resolve its children's align-self 'auto' values. 
+PASS Check out how the DOM's root element deals with 'auto' value in justify-items. 
+PASS Check out how the DOM's root element justify-items's value with 'legacy' keyword is used to resolve any descendant's justify-items 'auto' values. 
+PASS Check out how the DOM's root element recomputes its descendant's style when 'legacy' keyword is removed from its justify-items value. 
+PASS Shadow Node inherits from ShadowHost to resolve the 'auto' values for align-self. 
+PASS Shadow Node inherits from ShadowHost to resolve the 'auto' values for justify-self. 
+PASS Check out how the 'legacy' keyword in justify-items propagates from the DOM Tree to the Shadow Node. 
+PASS Check out how align-self uses the 'shadowHost' as 'slotted' element's parent while 'slot' is not assigned. 
+PASS Check out how justify-self uses the 'shadowHost' as 'slotted' element's parent while 'slot' is not assigned. 
+PASS Check out how the 'legacy' keyword in justify-items affects the 'slotted' elements while 'slot' is not assigned. 
+PASS Check out how align-self uses the 'slot' element's parent (Shadow Node) as 'slotted' element' s parent after the 'slot' is assigned. 
+PASS Check out how justify-self uses the 'slot' element's parent (Shadow Node) as 'slotted' element' s parent after the 'slot' is assigned. 
+PASS Check out how the 'legacy' keyword affects the 'slotted' elements after the 'slot' is assigned. 
+PASS The 'slot' element should not use its parent inside the ShadowDOM tree to resolve the align-self 'auto' values because Blink does not support slots in the flat tree. 
+PASS The 'slot' element should not use its parent inside the ShadowDOM tree to resolve the justify-self 'auto' values because Blink does not support slots in the flat tree. 
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/fast/alignment/parse-alignment-of-root-elements.html b/third_party/WebKit/LayoutTests/fast/alignment/parse-alignment-of-root-elements.html
index 2143395..f55eb56 100644
--- a/third_party/WebKit/LayoutTests/fast/alignment/parse-alignment-of-root-elements.html
+++ b/third_party/WebKit/LayoutTests/fast/alignment/parse-alignment-of-root-elements.html
@@ -21,7 +21,7 @@
     document.documentElement.style.alignSelf = "center";
     checkValues(document.documentElement, "alignSelf", "align-self", "center", "center");
     document.documentElement.style.alignSelf = "auto";
-    checkValues(document.documentElement, "alignSelf", "align-self", "auto", "auto");
+    checkValues(document.documentElement, "alignSelf", "align-self", "auto", "normal");
 }, "Check out how the DOM's root element resolves the align-self 'auto' values.");
 
 test(function() {
@@ -30,11 +30,11 @@
     document.body.style.alignItems = "auto"; // The 'auto' value is not valid for align-items.
     document.body.style.alignSelf = "auto";
     checkValues(document.body, "alignItems", "align-items", "", "normal");
-    checkValues(document.body, "alignSelf", "align-self", "auto", "auto");
+    checkValues(document.body, "alignSelf", "align-self", "auto", "center");
     block.style.alignItems = ""; // Default value is 'normal' for align-items.
     block.style.alignSelf = "auto";
     checkValues(block, "alignItems", "align-items", "", "normal");
-    checkValues(block, "alignSelf", "align-self", "auto", "auto");
+    checkValues(block, "alignSelf", "align-self", "auto", "normal");
 }, "Check out how the DOM's root element align-items's value is used to resolve its children's align-self 'auto' values.");
 
 test(function() {
@@ -48,7 +48,7 @@
     document.documentElement.style.justifySelf = "left";
     checkValues(document.documentElement, "justifySelf", "justify-self", "left", "left");
     document.documentElement.style.justifySelf = "auto";
-    checkValues(document.documentElement, "justifySelf", "justify-self", "auto", "auto");
+    checkValues(document.documentElement, "justifySelf", "justify-self", "auto", "normal");
 }, "Check out how the DOM's root element resolves the justify-self 'auto' values.");
 
 test(function() {
@@ -58,18 +58,18 @@
     document.body.style.justifyItems = "auto";
     document.body.style.justifySelf = "auto";
     checkValues(document.body, "justifyItems", "justify-items", "auto", "normal");
-    checkValues(document.body, "justifySelf", "justify-self", "auto", "auto");
+    checkValues(document.body, "justifySelf", "justify-self", "auto", "center");
     block.style.justifyItems = "auto";
     block.style.justifySelf = "auto";
     checkValues(block, "justifyItems", "justify-items",  "auto", "normal");
-    checkValues(block, "justifySelf", "justify-self",  "auto", "auto");
-}, "Check out how the DOM's root element justify-items's value is used to resolve its children's justify-self 'auto' values.");
+    checkValues(block, "justifySelf", "justify-self",  "auto", "normal");
+}, "Check out how the DOM's root element align-items's value is used to resolve its children's align-self 'auto' values.");
 
 test(function() {
     document.documentElement.style.justifyItems = "auto";
     checkValues(document.documentElement, "justifyItems", "justify-items", "auto", "normal");
-    checkValues(document.body, "justifySelf", "justify-self",  "auto", "auto");
-    checkValues(block, "justifySelf", "justify-self",  "auto", "auto");
+    checkValues(document.body, "justifySelf", "justify-self",  "auto", "normal");
+    checkValues(block, "justifySelf", "justify-self",  "auto", "normal");
 }, "Check out how the DOM's root element deals with 'auto' value in justify-items.");
 
 test(function() {
@@ -78,19 +78,19 @@
     document.body.style.justifyItems = "auto";
     document.body.style.justifySelf = "auto";
     checkValues(document.body, "justifyItems", "justify-items",  "auto", "legacy center");
-    checkValues(document.body, "justifySelf", "justify-self",  "auto", "auto");
+    checkValues(document.body, "justifySelf", "justify-self",  "auto", "center");
     block.style.justifyItems = "auto";
     block.style.justifySelf = "auto";
     checkValues(block, "justifyItems", "justify-items",  "auto", "legacy center");
-    checkValues(block, "justifySelf", "justify-self",  "auto", "auto");
+    checkValues(block, "justifySelf", "justify-self",  "auto", "center");
 }, "Check out how the DOM's root element justify-items's value with 'legacy' keyword is used to resolve any descendant's justify-items 'auto' values.");
 
 test(function() {
     document.documentElement.style.justifyItems = "auto";
     checkValues(document.body, "justifyItems", "justify-items",  "auto", "normal");
-    checkValues(document.body, "justifySelf", "justify-self",  "auto", "auto");
+    checkValues(document.body, "justifySelf", "justify-self",  "auto", "normal");
     checkValues(block, "justifyItems", "justify-items",  "auto", "normal");
-    checkValues(block, "justifySelf", "justify-self",  "auto", "auto");
+    checkValues(block, "justifySelf", "justify-self",  "auto", "normal");
 }, "Check out how the DOM's root element recomputes its descendant's style when 'legacy' keyword is removed from its justify-items value.");
 
 console.log("");
@@ -112,7 +112,7 @@
     shadowNode.style.alignItems = "";
     checkValues(shadowNode, "alignItems", "align-items", "", "normal");
     shadowNode.style.alignSelf = "auto";
-    checkValues(shadowNode, "alignSelf", "align-self", "auto", "auto");
+    checkValues(shadowNode, "alignSelf", "align-self", "auto", "center");
 }, "Shadow Node inherits from ShadowHost to resolve the 'auto' values for align-self.");
 
 test(function() {
@@ -123,7 +123,7 @@
     shadowNode.style.justifyItems = "";
     checkValues(shadowNode, "justifyItems", "justify-items", "", "normal");
     shadowNode.style.justifySelf = "auto";
-    checkValues(shadowNode, "justifySelf", "justify-self", "auto", "auto");
+    checkValues(shadowNode, "justifySelf", "justify-self", "auto", "center");
 }, "Shadow Node inherits from ShadowHost to resolve the 'auto' values for justify-self.");
 
 test(function() {
@@ -132,14 +132,14 @@
     shadowNode.style.justifySelf = "auto";
     checkValues(shadowHost, "justifyItems", "justify-items", "auto", "normal");
     checkValues(shadowNode, "justifyItems", "justify-items", "right", "right");
-    checkValues(shadowNode, "justifySelf", "justify-self", "auto", "auto");
+    checkValues(shadowNode, "justifySelf", "justify-self", "auto", "normal");
 
     checkValues(shadowHost, "justifyItems", "justify-items", "auto", "normal");
     document.documentElement.style.justifyItems = "legacy center";
     checkValues(document.documentElement, "justifyItems", "justify-items",  "legacy center", "legacy center");
     checkValues(shadowHost, "justifyItems", "justify-items",  "auto", "legacy center");
     checkValues(shadowNode, "justifyItems", "justify-items", "right", "right");
-    checkValues(shadowNode, "justifySelf", "justify-self", "auto", "auto");
+    checkValues(shadowNode, "justifySelf", "justify-self", "auto", "center");
     shadowNode.style.justifyItems = "auto";
     checkValues(shadowNode, "justifyItems", "justify-items", "auto", "legacy center");
     document.documentElement.style.justifyItems = "auto";
@@ -161,7 +161,7 @@
     slotted.style.alignSelf = "start";
     checkValues(slotted, "alignSelf", "align-self", "start", "start");
     slotted.style.alignSelf = "auto";
-    checkValues(slotted, "alignSelf", "align-self", "auto", "auto");
+    checkValues(slotted, "alignSelf", "align-self", "auto", "normal");
 }, "Check out how align-self uses the 'shadowHost' as 'slotted' element's parent while 'slot' is not assigned.");
 
 test(function() {
@@ -174,7 +174,7 @@
     slotted.style.justifySelf = "start";
     checkValues(slotted, "justifySelf", "justify-self", "start", "start");
     slotted.style.justifySelf = "auto";
-    checkValues(slotted, "justifySelf", "justify-self", "auto", "auto");
+    checkValues(slotted, "justifySelf", "justify-self", "auto", "normal");
 }, "Check out how justify-self uses the 'shadowHost' as 'slotted' element's parent while 'slot' is not assigned.");
 
 test(function() {
@@ -188,11 +188,11 @@
     slotted.style.justifyItems = "auto";
     checkValues(slotted, "justifyItems", "justify-items",  "auto", "normal");
     slotted.style.justifySelf = "auto";
-    checkValues(slotted, "justifySelf", "justify-self",  "auto", "auto");
+    checkValues(slotted, "justifySelf", "justify-self",  "auto", "normal");
     shadowNode.style.justifyItems = "auto";
     checkValues(shadowNode, "justifyItems", "justify-items", "auto", "legacy center");
     checkValues(slotted, "justifyItems", "justify-items", "auto", "normal");
-    checkValues(slotted, "justifySelf", "justify-self", "auto", "auto");
+    checkValues(slotted, "justifySelf", "justify-self", "auto", "normal");
     document.documentElement.style.justifyItems = "auto";
 }, "Check out how the 'legacy' keyword in justify-items affects the 'slotted' elements while 'slot' is not assigned.");
 
@@ -211,7 +211,7 @@
     slotted.style.alignSelf = "start";
     checkValues(slotted, "alignSelf", "align-self", "start", "start");
     slotted.style.alignSelf = "auto";
-    checkValues(slotted, "alignSelf", "align-self", "auto", "auto");
+    checkValues(slotted, "alignSelf", "align-self", "auto", "right");
 }, "Check out how align-self uses the 'slot' element's parent (Shadow Node) as 'slotted' element' s parent after the 'slot' is assigned.");
 
 test(function() {
@@ -224,7 +224,7 @@
     slotted.style.justifySelf = "start";
     checkValues(slotted, "justifySelf", "justify-self", "start", "start");
     slotted.style.justifySelf = "auto";
-    checkValues(slotted, "justifySelf", "justify-self", "auto", "auto");
+    checkValues(slotted, "justifySelf", "justify-self", "auto", "right");
 }, "Check out how justify-self uses the 'slot' element's parent (Shadow Node) as 'slotted' element' s parent after the 'slot' is assigned.");
 
 test(function() {
@@ -238,11 +238,11 @@
     slotted.style.justifyItems = "auto";
     checkValues(slotted, "justifyItems", "justify-items", "auto", "normal"); // Shadow host is not the parent now, but ShadowNode.
     slotted.style.justifySelf = "auto";
-    checkValues(slotted, "justifySelf", "justify-self", "auto", "auto"); // Shadow host is not the parent now, but ShadowNode.
+    checkValues(slotted, "justifySelf", "justify-self", "auto", "right"); // Shadow host is not the parent now, but ShadowNode.
     shadowNode.style.justifyItems = "auto";
     checkValues(shadowNode, "justifyItems", "justify-items", "auto", "legacy center");
     checkValues(slotted, "justifyItems", "justify-items", "auto", "legacy center"); // Now that shadowNode is auto, 'legacy' applies.
-    checkValues(slotted, "justifySelf", "justify-self", "auto", "auto"); // Now that shadowNode is auto, 'legacy' applies.
+    checkValues(slotted, "justifySelf", "justify-self", "auto", "center"); // Now that shadowNode is auto, 'legacy' applies.
     document.documentElement.style.justifyItems = "auto";
 }, "Check out how the 'legacy' keyword affects the 'slotted' elements after the 'slot' is assigned.");
 
@@ -256,7 +256,7 @@
     slot.style.alignSelf = "left";
     checkValues(slot, "alignSelf", "align-self",  "left", "left");
     slot.style.alignSelf = "auto";
-    checkValues(slot, "alignSelf", "align-self",  "auto", "auto");
+    checkValues(slot, "alignSelf", "align-self",  "auto", "normal");
 }, "The 'slot' element should not use its parent inside the ShadowDOM tree to resolve the align-self 'auto' values because Blink does not support slots in the flat tree.");
 
 test(function() {
@@ -270,7 +270,7 @@
     slot.style.justifySelf = "left";
     checkValues(slot, "justifySelf", "justify-self",  "left", "left");
     slot.style.justifySelf = "auto";
-    checkValues(slot, "justifySelf", "justify-self",  "auto", "auto");
+    checkValues(slot, "justifySelf", "justify-self",  "auto", "normal");
 }, "The 'slot' element should not use its parent inside the ShadowDOM tree to resolve the justify-self 'auto' values because Blink does not support slots in the flat tree.");
 
 </script>
diff --git a/third_party/WebKit/LayoutTests/fast/alignment/parse-justify-self.html b/third_party/WebKit/LayoutTests/fast/alignment/parse-justify-self.html
index 4e11e1e..4a4b760 100644
--- a/third_party/WebKit/LayoutTests/fast/alignment/parse-justify-self.html
+++ b/third_party/WebKit/LayoutTests/fast/alignment/parse-justify-self.html
@@ -16,10 +16,6 @@
     justify-self: stretch;
 }
 
-#justifySelfNormal {
-    justify-self: normal;
-}
-
 #justifySelfStart {
     justify-self: start;
 }
@@ -93,7 +89,6 @@
 <div id="justifySelfFirstBaseline"></div>
 <div id="justifySelfLastBaseline"></div>
 <div id="justifySelfStretch"></div>
-<div id="justifySelfNormal"></div>
 <div id="justifySelfStart"></div>
 <div id="justifySelfEnd"></div>
 <div id="justifySelfCenter"></div>
@@ -125,8 +120,6 @@
     checkValues(justifySelfLastBaseline, "justifySelf", "justify-self", "", "last baseline");
     var justifySelfStretch = document.getElementById("justifySelfStretch");
     checkValues(justifySelfStretch, "justifySelf", "justify-self", "", "stretch");
-    var justifySelfNormal = document.getElementById("justifySelfNormal");
-    checkValues(justifySelfNormal, "justifySelf", "justify-self", "", "normal");
     var justifySelfStart = document.getElementById("justifySelfStart");
     checkValues(justifySelfStart, "justifySelf", "justify-self", "", "start");
     var justifySelfEnd = document.getElementById("justifySelfEnd");
@@ -167,7 +160,7 @@
 test(function() {
     element = document.createElement("div");
     document.body.appendChild(element);
-    checkValues(element, "justifySelf", "justify-self", "", "auto");
+    checkValues(element, "justifySelf", "justify-self", "", "normal");
 }, "Test initial value of justify-self through JS");
 
 test(function() {
@@ -193,19 +186,16 @@
     element.style.justifySelf = "self-start";
     checkValues(element, "justifySelf", "justify-self",  "self-start", "self-start");
 
-    element.style.justifySelf = "normal";
-    checkValues(element, "justifySelf", "justify-self",  "normal", "normal");
-
     element.style.justifySelf = "auto";
-    checkValues(element, "justifySelf", "justify-self",  "auto", "auto");
+    checkValues(element, "justifySelf", "justify-self",  "auto", "normal");
 
     container.style.display = "flex";
     element.style.justifySelf = "auto";
-    checkValues(element, "justifySelf", "justify-self",  "auto", "auto");
+    checkValues(element, "justifySelf", "justify-self",  "auto", "normal");
 
     container.style.display = "grid";
     element.style.justifySelf = "auto";
-    checkValues(element, "justifySelf", "justify-self",  "auto", "auto");
+    checkValues(element, "justifySelf", "justify-self",  "auto", "normal");
 
     element.style.justifySelf = "self-end";
     checkValues(element, "justifySelf", "justify-self",  "self-end", "self-end");
@@ -213,7 +203,7 @@
 
 test(function() {
     document.documentElement.style.justifySelf = "auto";
-    checkValues(document.documentElement, "justifySelf", "justify-self",  "auto", "auto");
+    checkValues(document.documentElement, "justifySelf", "justify-self",  "auto", "normal");
 }, "Test 'auto' value resolution for the root node");
 
 test(function() {
@@ -225,9 +215,6 @@
     checkBadValues(element, "justifySelf", "justify-self",  "unsafe auto");
     checkBadValues(element, "justifySelf", "justify-self",  "auto safe");
     checkBadValues(element, "justifySelf", "justify-self",  "auto left");
-    checkBadValues(element, "justifySelf", "justify-self",  "normal unsafe");
-    checkBadValues(element, "justifySelf", "justify-self",  "normal stretch");
-    checkBadValues(element, "justifySelf", "justify-self",  "baseline normal");
     checkBadValues(element, "justifySelf", "justify-self",  "baseline safe");
     checkBadValues(element, "justifySelf", "justify-self",  "baseline center");
     checkBadValues(element, "justifySelf", "justify-self",  "stretch unsafe");
@@ -253,35 +240,35 @@
 
 test(function() {
     container.style.display = "";
-    checkInitialValues(element, "justifySelf", "justify-self", "center", "auto");
+    checkInitialValues(element, "justifySelf", "justify-self", "center", "normal");
 }, "Test the value 'initial'");
 
 test(function() {
     container.style.display = "grid";
-    checkInitialValues(element, "justifySelf", "justify-self", "left safe", "auto");
+    checkInitialValues(element, "justifySelf", "justify-self", "left safe", "normal");
 }, "Test the value 'initial' for grid containers");
 
 test(function() {
     container.style.display = "flex";
-    checkInitialValues(element, "justifySelf", "justify-self", "right unsafe", "auto");
+    checkInitialValues(element, "justifySelf", "justify-self", "right unsafe", "normal");
 }, "Test the value 'initial' for flex containers");
 
 test(function() {
     container.style.display = "";
     element.style.position = "absolute";
-    checkInitialValues(element, "justifySelf", "justify-self", "left", "auto");
+    checkInitialValues(element, "justifySelf", "justify-self", "left", "normal");
 }, "Test the value 'initial' for positioned elements");
 
 test(function() {
     container.style.display = "grid";
     element.style.position = "absolute";
-    checkInitialValues(element, "justifySelf", "justify-self", "right", "auto");
+    checkInitialValues(element, "justifySelf", "justify-self", "right", "normal");
 }, "Test the value 'initial' for positioned elements in grid containers");
 
 test(function() {
     container.style.display = "flex";
     element.style.position = "absolute";
-    checkInitialValues(element, "justifySelf", "justify-self", "end", "auto");
+    checkInitialValues(element, "justifySelf", "justify-self", "end", "normal");
 }, "Test the value 'initial' for positioned elements in grid containers");
 
 test(function() {
diff --git a/third_party/WebKit/LayoutTests/fast/alignment/parse-place-content.html b/third_party/WebKit/LayoutTests/fast/alignment/parse-place-content.html
index 1da45347..36cf4816 100644
--- a/third_party/WebKit/LayoutTests/fast/alignment/parse-place-content.html
+++ b/third_party/WebKit/LayoutTests/fast/alignment/parse-place-content.html
@@ -49,9 +49,6 @@
 #placeContentStartSafe {
     place-content: start safe;
 }
-#placeContentBaselineSafe {
-    place-content: baseline safe;
-}
 #placeContentStartEndLeft {
     place-content: start end left;
 }
@@ -207,8 +204,8 @@
 }, "Test setting 'start safe' as incorrect value through CSS.");
 
 test(function() {
-    checkValues(placeContentBaselineSafe, "placeContent", "place-content", "", "normal normal");
-    checkPlaceContentValues(placeContentBaselineSafe, "", "normal", "normal");
+    checkValues(placeContentStartSafe, "placeContent", "place-content", "", "normal normal");
+    checkPlaceContentValues(placeContentStartSafe, "", "normal", "normal");
 }, "Test setting 'baseline safe' as incorrect value through CSS.");
 
 test(function() {
diff --git a/third_party/WebKit/LayoutTests/fast/alignment/parse-place-items.html b/third_party/WebKit/LayoutTests/fast/alignment/parse-place-items.html
index 712bd1e9..407da5cc 100644
--- a/third_party/WebKit/LayoutTests/fast/alignment/parse-place-items.html
+++ b/third_party/WebKit/LayoutTests/fast/alignment/parse-place-items.html
@@ -58,9 +58,6 @@
 #placeItemsStartSafe {
   place-items: start safe;
 }
-#placeItemsBaselineSafe {
-  place-items: baseline safe;
-}
 #placeItemsStartEndLeft {
   place-items: start end left;
 }
@@ -210,8 +207,8 @@
 }, "Test setting 'start safe' as incorrect value through CSS.");
 
 test(function() {
-  checkValues(placeItemsBaselineSafe, "placeItems", "place-items", "", "normal normal");
-  checkPlaceItemsValues(placeItemsBaselineSafe, "", "normal", "normal");
+  checkValues(placeItemsStartSafe, "placeItems", "place-items", "", "normal normal");
+  checkPlaceItemsValues(placeItemsStartSafe, "", "normal", "normal");
 }, "Test setting 'baseline safe' as incorrect value through CSS.");
 
 test(function() {
@@ -227,16 +224,16 @@
 }, "Test setting values through JS.");
 
 test(function() {
-  checkPlaceItemsValuesBadJS("auto normal");
-  checkPlaceItemsValuesBadJS("space-between");
-  checkPlaceItemsValuesBadJS("center safe");
-  checkPlaceItemsValuesBadJS("center self-start center");
-  checkPlaceItemsValuesBadJS("asrt", "normal");
-  checkPlaceItemsValuesBadJS("auto", "normal");
-  checkPlaceItemsValuesBadJS("10px", "normal");
-  checkPlaceItemsValuesBadJS("stretch safe");
-  checkPlaceItemsValuesBadJS("self-start start end");
-  checkPlaceItemsValuesBadJS("");
+  checkPlaceItemsValuesBadJS("auto normal", "normal", "normal");
+  checkPlaceItemsValuesBadJS("space-between", "normal", "normal");
+  checkPlaceItemsValuesBadJS("center safe", "normal", "normal");
+  checkPlaceItemsValuesBadJS("center self-start center", "normal", "normal");
+  checkPlaceItemsValuesBadJS("asrt", "normal", "normal");
+  checkPlaceItemsValuesBadJS("auto", "normal", "normal");
+  checkPlaceItemsValuesBadJS("10px", "normal", "normal");
+  checkPlaceItemsValuesBadJS("stretch safe", "normal", "normal");
+  checkPlaceItemsValuesBadJS("self-start start end", "normal", "normal");
+  checkPlaceItemsValuesBadJS("", "normal", "normal");
 }, "Test setting incorrect values through JS.");
 
 test(function() {
diff --git a/third_party/WebKit/LayoutTests/fast/alignment/parse-place-self.html b/third_party/WebKit/LayoutTests/fast/alignment/parse-place-self.html
index 4967bdc..a8e6c0e 100644
--- a/third_party/WebKit/LayoutTests/fast/alignment/parse-place-self.html
+++ b/third_party/WebKit/LayoutTests/fast/alignment/parse-place-self.html
@@ -58,9 +58,6 @@
 #placeSelfStartSafe {
   place-self: start safe;
 }
-#placeSelfBaselineSafe {
-  place-self: baseline safe;
-}
 #placeSelfStartEndLeft {
   place-self: start end left;
 }
@@ -116,7 +113,7 @@
 {
   element.style.placeSelf = "";
   element.style.placeSelf = value;
-  checkPlaceSelfValues(element, "", "auto", "auto")
+  checkPlaceSelfValues(element, "", "normal", "normal")
 }
 
 test(function() {
@@ -125,8 +122,8 @@
 }, "Test getting the Computed Value of place-self's longhand properties when setting 'normal' value through CSS.");
 
 test(function() {
-  checkValues(placeSelfCenterAuto, "placeSelf", "place-self", "", "center auto");
-  checkPlaceSelfValues(placeSelfCenterAuto, "", "center", "auto");
+  checkValues(placeSelfCenterAuto, "placeSelf", "place-self", "", "center normal");
+  checkPlaceSelfValues(placeSelfCenterAuto, "", "center", "normal");
 }, "Test getting the Computed Value of place-self's longhand properties when setting 'center auto' value through CSS.");
 
 test(function() {
@@ -185,38 +182,38 @@
 }, "Test getting the Computed Value of place-self's longhand properties when setting 'start baseline' value through CSS.");
 
 test(function() {
-  checkValues(placeSelfEmpty, "placeSelf", "place-self", "", "auto auto");
-  checkPlaceSelfValues(placeSelfEmpty, "", "auto", "auto");
+  checkValues(placeSelfAuto, "placeSelf", "place-self", "", "normal normal");
+  checkPlaceSelfValues(placeSelfAuto, "", "normal", "normal");
 }, "Test setting '' as incorrect value through CSS.");
 
 test(function() {
-  checkValues(placeSelfAuto, "placeSelf", "place-self", "", "auto auto");
-  checkPlaceSelfValues(placeSelfAuto, "", "auto", "auto");
+  checkValues(placeSelfAuto, "placeSelf", "place-self", "", "normal normal");
+  checkPlaceSelfValues(placeSelfAuto, "", "normal", "normal");
 }, "Test setting 'auto' as incorrect value through CSS.");
 
 test(function() {
-  checkValues(placeSelfNone, "placeSelf", "place-self", "", "auto auto");
-  checkPlaceSelfValues(placeSelfNone, "", "auto", "auto");
+  checkValues(placeSelfNone, "placeSelf", "place-self", "", "normal normal");
+  checkPlaceSelfValues(placeSelfNone, "", "normal", "normal");
 }, "Test setting 'none' as incorrect value through CSS.");
 
 test(function() {
-  checkValues(placeSelfSafe, "placeSelf", "place-self", "", "auto auto");
-  checkPlaceSelfValues(placeSelfSafe, "", "auto", "auto");
+  checkValues(placeSelfSafe, "placeSelf", "place-self", "", "normal normal");
+  checkPlaceSelfValues(placeSelfSafe, "", "normal", "normal");
 }, "Test setting 'safe' as incorrect value through CSS.");
 
 test(function() {
-  checkValues(placeSelfStartSafe, "placeSelf", "place-self", "", "auto auto");
-  checkPlaceSelfValues(placeSelfStartSafe, "", "auto", "auto");
+  checkValues(placeSelfStartSafe, "placeSelf", "place-self", "", "normal normal");
+  checkPlaceSelfValues(placeSelfStartSafe, "", "normal", "normal");
 }, "Test setting 'start safe' as incorrect value through CSS.");
 
 test(function() {
-  checkValues(placeSelfBaselineSafe, "placeSelf", "place-self", "", "auto auto");
-  checkPlaceSelfValues(placeSelfBaselineSafe, "", "auto", "auto");
+  checkValues(placeSelfStartSafe, "placeSelf", "place-self", "", "normal normal");
+  checkPlaceSelfValues(placeSelfStartSafe, "", "normal", "normal");
 }, "Test setting 'baseline safe' as incorrect value through CSS.");
 
 test(function() {
-  checkValues(placeSelfStartEndLeft, "placeSelf", "place-self", "", "auto auto");
-  checkPlaceSelfValues(placeSelfStartEndLeft, "", "auto", "auto");
+  checkValues(placeSelfStartEndLeft, "placeSelf", "place-self", "", "normal normal");
+  checkPlaceSelfValues(placeSelfStartEndLeft, "", "normal", "normal");
 }, "Test setting 'start end left' as incorrect value through CSS.");
 
 test(function() {
@@ -224,36 +221,35 @@
   checkPlaceSelfValuesJS("center start", "center", "start");
   checkPlaceSelfValuesJS("self-start end", "self-start", "end");
   checkPlaceSelfValuesJS("normal end", "normal", "end");
-  checkPlaceSelfValuesJS("auto right", "auto", "right");
 }, "Test setting values through JS.");
 
 test(function() {
-  checkPlaceSelfValuesBadJS("space-between");
-  checkPlaceSelfValuesBadJS("center safe");
-  checkPlaceSelfValuesBadJS("center self-start center");
-  checkPlaceSelfValuesBadJS("asrt");
-  checkPlaceSelfValuesBadJS("10px");
-  checkPlaceSelfValuesBadJS("stretch safe");
-  checkPlaceSelfValuesBadJS("self-start start end");
-  checkPlaceSelfValuesBadJS("");
+  checkPlaceSelfValuesBadJS("space-between", "normal", "normal");
+  checkPlaceSelfValuesBadJS("center safe", "normal", "normal");
+  checkPlaceSelfValuesBadJS("center self-start center", "normal", "normal");
+  checkPlaceSelfValuesBadJS("asrt", "normal", "normal");
+  checkPlaceSelfValuesBadJS("10px", "normal", "normal");
+  checkPlaceSelfValuesBadJS("stretch safe", "normal", "normal");
+  checkPlaceSelfValuesBadJS("self-start start end", "normal", "normal");
+  checkPlaceSelfValuesBadJS("", "normal", "normal");
 }, "Test setting incorrect values through JS.");
 
 test(function() {
   element = document.createElement("div");
   document.body.appendChild(element);
-  checkValues(element, "placeSelf", "place-self", "", "auto auto");
+  checkValues(element, "placeSelf", "place-self", "", "normal normal");
   element.style.placeSelf = "center";
   checkPlaceSelfValues(element, "center", "center", "center");
   element.style.placeSelf = "initial";
-  checkValues(element, "placeSelf", "place-self", "initial", "auto auto");
-  checkPlaceSelfValues(element, "initial", "auto", "auto");
+  checkValues(element, "placeSelf", "place-self", "initial", "normal normal");
+  checkPlaceSelfValues(element, "initial", "normal", "normal");
 }, "Test the 'initial' value of the place-self shorthand and its longhand properties' Computed value");
 
 test(function() {
   document.body.style.placeSelf = "start";
   var anotherElement = document.createElement("div");
   document.body.appendChild(anotherElement);
-  checkPlaceSelfValues(anotherElement, "", "auto", "auto");
+  checkPlaceSelfValues(anotherElement, "", "normal", "normal");
   anotherElement.style.placeSelf = "inherit";
   checkPlaceSelfValues(anotherElement, "inherit", "start", "start");
 }, "Test the 'inherit' value of the place-self shorthand and its longhand properties' Computed value");
diff --git a/third_party/WebKit/LayoutTests/fast/css/getComputedStyle/computed-style-listing-expected.txt b/third_party/WebKit/LayoutTests/fast/css/getComputedStyle/computed-style-listing-expected.txt
index e1e19f09..cdc5172 100644
--- a/third_party/WebKit/LayoutTests/fast/css/getComputedStyle/computed-style-listing-expected.txt
+++ b/third_party/WebKit/LayoutTests/fast/css/getComputedStyle/computed-style-listing-expected.txt
@@ -60,7 +60,7 @@
 -webkit-writing-mode: horizontal-tb
 align-content: normal
 align-items: normal
-align-self: auto
+align-self: normal
 alignment-baseline: auto
 animation-delay: 0s
 animation-direction: normal
@@ -181,7 +181,7 @@
 isolation: auto
 justify-content: normal
 justify-items: normal
-justify-self: auto
+justify-self: normal
 left: auto
 letter-spacing: normal
 lighting-color: rgb(255, 255, 255)
diff --git a/third_party/WebKit/LayoutTests/fast/css/getComputedStyle/computed-style-without-renderer-listing-expected.txt b/third_party/WebKit/LayoutTests/fast/css/getComputedStyle/computed-style-without-renderer-listing-expected.txt
index 95a01f87..0fc97ee 100644
--- a/third_party/WebKit/LayoutTests/fast/css/getComputedStyle/computed-style-without-renderer-listing-expected.txt
+++ b/third_party/WebKit/LayoutTests/fast/css/getComputedStyle/computed-style-without-renderer-listing-expected.txt
@@ -60,7 +60,7 @@
 -webkit-writing-mode: horizontal-tb
 align-content: normal
 align-items: normal
-align-self: auto
+align-self: normal
 alignment-baseline: auto
 animation-delay: 0s
 animation-direction: normal
@@ -181,7 +181,7 @@
 isolation: auto
 justify-content: normal
 justify-items: normal
-justify-self: auto
+justify-self: normal
 left: auto
 letter-spacing: normal
 lighting-color: rgb(255, 255, 255)
diff --git a/third_party/WebKit/LayoutTests/http/tests/inspector-enabled/console-promise-reject-and-handle-expected.txt b/third_party/WebKit/LayoutTests/http/tests/inspector-enabled/console-promise-reject-and-handle-expected.txt
index 6d73ef2b..2225cea6 100644
--- a/third_party/WebKit/LayoutTests/http/tests/inspector-enabled/console-promise-reject-and-handle-expected.txt
+++ b/third_party/WebKit/LayoutTests/http/tests/inspector-enabled/console-promise-reject-and-handle-expected.txt
@@ -6,11 +6,11 @@
 Tests that evt.preventDefault() in window.onunhandledrejection suppresses console output.
 
 ----console messages start----
-console-promise-reject-and-handle.html:15 onunhandledrejection1
-console-promise-reject-and-handle.html:22 onrejectionhandled1
-console-promise-reject-and-handle.html:31 onunhandledrejection2
-console-promise-reject-and-handle.html:29 Uncaught (in promise) Error: e
-    at setupPromise2 (console-promise-reject-and-handle.html:29)
-console-promise-reject-and-handle.html:37 onrejectionhandled2
+console-promise-reje…-and-handle.html:15 onunhandledrejection1
+console-promise-reje…-and-handle.html:22 onrejectionhandled1
+console-promise-reje…-and-handle.html:31 onunhandledrejection2
+console-promise-reje…-and-handle.html:29 Uncaught (in promise) Error: e
+    at setupPromise2 (console-promise-reje…-and-handle.html:29)
+console-promise-reje…-and-handle.html:37 onrejectionhandled2
 ----console messages end----
 
diff --git a/third_party/WebKit/LayoutTests/http/tests/inspector/console-cross-origin-iframe-logging-expected.txt b/third_party/WebKit/LayoutTests/http/tests/inspector/console-cross-origin-iframe-logging-expected.txt
index 7c6bac9..bb57dd3 100644
--- a/third_party/WebKit/LayoutTests/http/tests/inspector/console-cross-origin-iframe-logging-expected.txt
+++ b/third_party/WebKit/LayoutTests/http/tests/inspector/console-cross-origin-iframe-logging-expected.txt
@@ -2,7 +2,7 @@
 Tests that cross origin errors are logged with source url and line number.
 
 
-console-cross-origin-iframe-logging.html:19 Failed to execute 'postMessage' on 'DOMWindow': The target origin provided ('http://127.0.0.1:8000') does not match the recipient window's origin ('http://localhost:8000').
-accessFrame @ console-cross-origin-iframe-logging.html:19
+console-cross-origin…ame-logging.html:19 Failed to execute 'postMessage' on 'DOMWindow': The target origin provided ('http://127.0.0.1:8000') does not match the recipient window's origin ('http://localhost:8000').
+accessFrame @ console-cross-origin…ame-logging.html:19
 (anonymous) @ VM:1
 
diff --git a/third_party/WebKit/LayoutTests/http/tests/inspector/network/script-as-text-loading-with-caret-expected.txt b/third_party/WebKit/LayoutTests/http/tests/inspector/network/script-as-text-loading-with-caret-expected.txt
index aa1c83a..d2013675 100644
--- a/third_party/WebKit/LayoutTests/http/tests/inspector/network/script-as-text-loading-with-caret-expected.txt
+++ b/third_party/WebKit/LayoutTests/http/tests/inspector/network/script-as-text-loading-with-caret-expected.txt
@@ -1,7 +1,7 @@
 Tests console message when script is loaded with incorrect text/html mime type and the URL contains the '^' character.
 
 Bug 103248
-script-as-text-loading-with-caret.html:10 GET http://127.0.0.1:8000/inspector/network/resources/this-is-a-weird?querystri…=with^carats^like^these^because^who^doesnt^love^strange^characters^in^urls 404 (Not Found)
-loadScript @ script-as-text-loading-with-caret.html:10
+script-as-text-loadi…-with-caret.html:10 GET http://127.0.0.1:8000/inspector/network/resources/this-is-a-weird?querystri…=with^carats^like^these^because^who^doesnt^love^strange^characters^in^urls 404 (Not Found)
+loadScript @ script-as-text-loadi…-with-caret.html:10
 (anonymous) @ VM:1
 
diff --git a/third_party/WebKit/LayoutTests/http/tests/inspector/service-workers/lazy-addeventlisteners-expected.txt b/third_party/WebKit/LayoutTests/http/tests/inspector/service-workers/lazy-addeventlisteners-expected.txt
index d98c308..8d9b376 100644
--- a/third_party/WebKit/LayoutTests/http/tests/inspector/service-workers/lazy-addeventlisteners-expected.txt
+++ b/third_party/WebKit/LayoutTests/http/tests/inspector/service-workers/lazy-addeventlisteners-expected.txt
@@ -1,8 +1,8 @@
 Tests that a warning is shown in the console if addEventListener is called after initial evaluation of the service worker script.
 
 Message count: 1
-service-worker-lazy-addeventlistener.js:2 Event handler of 'install' event must be added on the initial evaluation of worker script.
-setTimeout @ service-worker-lazy-addeventlistener.js:2
+service-worker-lazy-…deventlistener.js:2 Event handler of 'install' event must be added on the initial evaluation of worker script.
+setTimeout @ service-worker-lazy-…deventlistener.js:2
 setTimeout (async)
-(anonymous) @ service-worker-lazy-addeventlistener.js:1
+(anonymous) @ service-worker-lazy-…deventlistener.js:1
 
diff --git a/third_party/WebKit/LayoutTests/http/tests/inspector/sources/debugger/async-callstack-network-initiator-expected.txt b/third_party/WebKit/LayoutTests/http/tests/inspector/sources/debugger/async-callstack-network-initiator-expected.txt
index 34ce22c6..0151ba5 100644
--- a/third_party/WebKit/LayoutTests/http/tests/inspector/sources/debugger/async-callstack-network-initiator-expected.txt
+++ b/third_party/WebKit/LayoutTests/http/tests/inspector/sources/debugger/async-callstack-network-initiator-expected.txt
@@ -1,18 +1,18 @@
 Tests asynchronous call stacks printed in console for a Network.Initiator.
 
 Set timer for test function.
-async-callstack-network-initiator.html:11 Console was cleared
-async-callstack-network-initiator.html:29 POST http://127.0.0.1:8000/failure/foo 404 (Not Found)
+async-callstack-netw…k-initiator.html:11 Console was cleared
+async-callstack-netw…k-initiator.html:29 POST http://127.0.0.1:8000/failure/foo 404 (Not Found)
 
-sendXHR @ async-callstack-network-initiator.html:29
+sendXHR @ async-callstack-netw…k-initiator.html:29
 
-timeout2 @ async-callstack-network-initiator.html:22
+timeout2 @ async-callstack-netw…k-initiator.html:22
 
 setTimeout (async)
 
-timeout1 @ async-callstack-network-initiator.html:17
+timeout1 @ async-callstack-netw…k-initiator.html:17
 
 setTimeout (async)
 
-testFunction @ async-callstack-network-initiator.html:12
+testFunction @ async-callstack-netw…k-initiator.html:12
 
diff --git a/third_party/WebKit/LayoutTests/http/tests/misc/client-hint-accept-on-subresource.html b/third_party/WebKit/LayoutTests/http/tests/misc/client-hint-accept-on-subresource.html
index 1b3a54c..abbb62f9 100644
--- a/third_party/WebKit/LayoutTests/http/tests/misc/client-hint-accept-on-subresource.html
+++ b/third_party/WebKit/LayoutTests/http/tests/misc/client-hint-accept-on-subresource.html
@@ -12,11 +12,18 @@
             assert_unreached("Image should not have loaded.");
         };
 
+        var loadDeviceRAMImage = function() {
+            var img = new Image();
+            img.src = 'resources/image-checks-for-device-ram.php';
+            img.onload = t.step_func(unreached);
+            img.onerror = t.step_func(function(){ t.done(); });
+            body.appendChild(img);
+        };
         var loadRWImage = function() {
             var img = new Image();
             img.src = 'resources/image-checks-for-width.php';
             img.onload = t.step_func(unreached);
-            img.onerror = t.step_func(function(){ t.done(); });
+            img.onerror = t.step_func(loadDeviceRAMImage);
             body.appendChild(img);
         };
         t.step(function() {
diff --git a/third_party/WebKit/LayoutTests/http/tests/misc/client-hints-accept-meta.html b/third_party/WebKit/LayoutTests/http/tests/misc/client-hints-accept-meta.html
index d463e57f..ea44f4a 100644
--- a/third_party/WebKit/LayoutTests/http/tests/misc/client-hints-accept-meta.html
+++ b/third_party/WebKit/LayoutTests/http/tests/misc/client-hints-accept-meta.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html>
-<meta http-equiv="Accept-CH" content="DPR, Width, Viewport-Width">
+<meta http-equiv="Accept-CH" content="DPR, Width, Viewport-Width, Device-RAM">
 <script src="../resources/testharness.js"></script>
 <script src="../resources/testharnessreport.js"></script>
 <body>
@@ -9,11 +9,18 @@
             assert_unreached("Image should have loaded.");
         };
 
+        var loadDeviceRAMImage = function() {
+            var img = new Image();
+            img.src = 'resources/image-checks-for-device-ram.php';
+            img.onload = t.step_func(function(){ t.done(); });
+            img.onerror = t.step_func(unreached);
+            document.body.appendChild(img);
+        };
         var loadRWImage = function() {
             var img = new Image();
             img.src = 'resources/image-checks-for-width.php';
             img.sizes = '100vw';
-            img.onload = t.step_func(function(){ t.done(); });
+            img.onload = t.step_func(loadDeviceRAMImage);
             img.onerror = t.step_func(unreached);
             document.body.appendChild(img);
         };
diff --git a/third_party/WebKit/LayoutTests/http/tests/misc/client-hints-accept.php b/third_party/WebKit/LayoutTests/http/tests/misc/client-hints-accept.php
index 72f78b09..9e51aa40 100644
--- a/third_party/WebKit/LayoutTests/http/tests/misc/client-hints-accept.php
+++ b/third_party/WebKit/LayoutTests/http/tests/misc/client-hints-accept.php
@@ -1,5 +1,5 @@
 <?php
-    header("ACCEPT-CH: DPR, Width, Viewport-Width");
+    header("ACCEPT-CH: DPR, Width, Viewport-Width, Device-RAM");
 ?>
 <!DOCTYPE html>
 <script src="../resources/testharness.js"></script>
@@ -11,11 +11,18 @@
             assert_unreached("Image should have loaded.");
         };
 
+        var loadDeviceRAMImage = function() {
+            var img = new Image();
+            img.src = 'resources/image-checks-for-device-ram.php';
+            img.onload = t.step_func(function(){ t.done(); });
+            img.onerror = t.step_func(unreached);
+            document.body.appendChild(img);
+        };
         var loadRWImage = function() {
             var img = new Image();
             img.src = 'resources/image-checks-for-width.php';
             img.sizes = '500';
-            img.onload = t.step_func(function(){ t.done(); });
+            img.onload = t.step_func(loadDeviceRAMImage);
             img.onerror = t.step_func(unreached);
             document.body.appendChild(img);
         };
diff --git a/third_party/WebKit/LayoutTests/http/tests/misc/client-hints-invalid-accept.php b/third_party/WebKit/LayoutTests/http/tests/misc/client-hints-invalid-accept.php
index aa31dd4c..1d155195 100644
--- a/third_party/WebKit/LayoutTests/http/tests/misc/client-hints-invalid-accept.php
+++ b/third_party/WebKit/LayoutTests/http/tests/misc/client-hints-invalid-accept.php
@@ -11,11 +11,18 @@
             assert_unreached("Image should not have loaded.");
         };
 
+        var loadDeviceRAMImage = function() {
+            var img = new Image();
+            img.src = 'resources/image-checks-for-device-ram.php';
+            img.onload = t.step_func(unreached);
+            img.onerror = t.step_func(function(){ t.done(); });
+            document.body.appendChild(img);
+        };
         var loadRWImage = function() {
             var img = new Image();
             img.src = 'resources/image-checks-for-rw.php';
             img.onload = t.step_func(unreached);
-            img.onerror = t.step_func(function(){ t.done(); });
+            img.onerror = t.step_func(loadDeviceRAMImage);
             document.body.appendChild(img);
         };
         t.step(function() {
diff --git a/third_party/WebKit/LayoutTests/http/tests/misc/client-hints-no-accept.html b/third_party/WebKit/LayoutTests/http/tests/misc/client-hints-no-accept.html
index 2e35251..96ca3696 100644
--- a/third_party/WebKit/LayoutTests/http/tests/misc/client-hints-no-accept.html
+++ b/third_party/WebKit/LayoutTests/http/tests/misc/client-hints-no-accept.html
@@ -9,11 +9,18 @@
             assert_unreached("Image should not have loaded.");
         };
 
+        var loadDeviceRAMImage = function() {
+            var img = new Image();
+            img.src = 'resources/image-checks-for-device-ram.php';
+            img.onload = t.step_func(unreached);
+            img.onerror = t.step_func(function(){ t.done(); });
+            body.appendChild(img);
+        };
         var loadRWImage = function() {
             var img = new Image();
             img.src = 'resources/image-checks-for-width.php';
             img.onload = t.step_func(unreached);
-            img.onerror = t.step_func(function(){ t.done(); });
+            img.onerror = t.step_func(loadDeviceRAMImage);
             body.appendChild(img);
         };
         t.step(function() {
diff --git a/third_party/WebKit/LayoutTests/http/tests/misc/resources/iframe-accept-ch.php b/third_party/WebKit/LayoutTests/http/tests/misc/resources/iframe-accept-ch.php
index de7c0183..f36e2cc 100644
--- a/third_party/WebKit/LayoutTests/http/tests/misc/resources/iframe-accept-ch.php
+++ b/third_party/WebKit/LayoutTests/http/tests/misc/resources/iframe-accept-ch.php
@@ -1,5 +1,5 @@
 <?php
-    header("ACCEPT-CH: DPR, Width, Viewport-Width");
+    header("ACCEPT-CH: DPR, Width, Viewport-Width, Device-RAM");
 ?>
 <!DOCTYPE html>
 <body>
@@ -14,11 +14,18 @@
             parent.postMessage("success", "*");
         };
 
+        var loadDeviceRAMImage = function() {
+            var img = new Image();
+            img.src = 'image-checks-for-device-ram.php';
+            img.onload = success;
+            img.onerror = fail(4);
+            document.body.appendChild(img);
+        };
         var loadRWImage = function() {
             var img = new Image();
             img.src = 'image-checks-for-width.php';
             img.sizes = '500';
-            img.onload = success
+            img.onload = loadDeviceRAMImage;
             img.onerror = fail(3);
             document.body.appendChild(img);
         };
diff --git a/third_party/WebKit/LayoutTests/http/tests/misc/resources/image-checks-for-device-ram.php b/third_party/WebKit/LayoutTests/http/tests/misc/resources/image-checks-for-device-ram.php
new file mode 100644
index 0000000..3a4b0d1
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/http/tests/misc/resources/image-checks-for-device-ram.php
@@ -0,0 +1,12 @@
+<?php
+    $device_ram = $_SERVER["HTTP_DEVICE_RAM"];
+
+    if(isset($device_ram) && $device_ram != 0
+    	 && ($device_ram & ($device_ram - 1)) == 0) {
+        $fn = fopen("compass.jpg", "r");
+        fpassthru($fn);
+        fclose($fn);
+        exit;
+    }
+    header("HTTP/1.1 417 Expectation failed");
+?>
diff --git a/third_party/WebKit/LayoutTests/inspector-enabled/console/console-uncaught-promise-no-inspector-expected.txt b/third_party/WebKit/LayoutTests/inspector-enabled/console/console-uncaught-promise-no-inspector-expected.txt
index e8973fd1..0797fcd 100644
--- a/third_party/WebKit/LayoutTests/inspector-enabled/console/console-uncaught-promise-no-inspector-expected.txt
+++ b/third_party/WebKit/LayoutTests/inspector-enabled/console/console-uncaught-promise-no-inspector-expected.txt
@@ -3,7 +3,7 @@
 CONSOLE ERROR: line 47: Uncaught (in promise) NotFoundError: Failed to execute 'removeChild' on 'Node': The node to be removed is not a child of this node.
 Tests that uncaught promise rejection messages have line numbers when the inspector is closed and stack traces are not collected.
 
-console-uncaught-promise-no-inspector.html:9 Uncaught (in promise) Error: err1
-console-uncaught-promise-no-inspector.html:28 Uncaught (in promise) Error: err2
-console-uncaught-promise-no-inspector.html:47 Uncaught (in promise) DOMException: Failed to execute 'removeChild' on 'Node': The node to be removed is not a child of this node.
+console-uncaught-pro…no-inspector.html:9 Uncaught (in promise) Error: err1
+console-uncaught-pro…o-inspector.html:28 Uncaught (in promise) Error: err2
+console-uncaught-pro…o-inspector.html:47 Uncaught (in promise) DOMException: Failed to execute 'removeChild' on 'Node': The node to be removed is not a child of this node.
 
diff --git a/third_party/WebKit/LayoutTests/inspector-enabled/sources/debugger/script-formatter-console-expected.txt b/third_party/WebKit/LayoutTests/inspector-enabled/sources/debugger/script-formatter-console-expected.txt
index a1600241..85dde10c 100644
--- a/third_party/WebKit/LayoutTests/inspector-enabled/sources/debugger/script-formatter-console-expected.txt
+++ b/third_party/WebKit/LayoutTests/inspector-enabled/sources/debugger/script-formatter-console-expected.txt
@@ -8,7 +8,7 @@
 script-formatter-console.html:12 
 Pre-format row message list:
 [11]
-script-formatter-console.html:formatted:15 
+script-formatter-con…e.html:formatted:15 
 Post-format row message list:
 [14]
 
diff --git a/third_party/WebKit/LayoutTests/inspector/console/console-log-before-inspector-open-expected.txt b/third_party/WebKit/LayoutTests/inspector/console/console-log-before-inspector-open-expected.txt
index 93dfd983..5c8a7de 100644
--- a/third_party/WebKit/LayoutTests/inspector/console/console-log-before-inspector-open-expected.txt
+++ b/third_party/WebKit/LayoutTests/inspector/console/console-log-before-inspector-open-expected.txt
@@ -8,6 +8,6 @@
 console-log-before-inspector-open.html:8 info
 console-log-before-inspector-open.html:9 warn
 (anonymous) @ console-log-before-inspector-open.html:9
-console-log-before-inspector-open.html:10 error
-(anonymous) @ console-log-before-inspector-open.html:10
+console-log-before-i…pector-open.html:10 error
+(anonymous) @ console-log-before-i…pector-open.html:10
 
diff --git a/third_party/WebKit/LayoutTests/inspector/console/console-log-linkify-stack-in-errors-expected.txt b/third_party/WebKit/LayoutTests/inspector/console/console-log-linkify-stack-in-errors-expected.txt
index 0e8abce..5edb94c3 100644
--- a/third_party/WebKit/LayoutTests/inspector/console/console-log-linkify-stack-in-errors-expected.txt
+++ b/third_party/WebKit/LayoutTests/inspector/console/console-log-linkify-stack-in-errors-expected.txt
@@ -64,63 +64,63 @@
 foob.js:5 Error: Some test
     at namedFunction (foob.js:5)
     at foob.js:8 console-message > source-code > console-message-anchor > devtools-link > hidden console-message-badge > hide-badge-title > console-message-text > devtools-link > devtools-link
-console-log-linkify-stack-in-errors.html:4 Error: line
+console-log-linkify-…ck-in-errors.html:4 Error: line
 break
-    at forStack (console-log-linkify-stack-in-errors.html:4)
-    at console-log-linkify-stack-in-errors.html:7 console-message > source-code > console-message-anchor > devtools-link > hidden console-message-badge > hide-badge-title > console-message-text > devtools-link > devtools-link
-console-log-linkify-stack-in-errors.html:23 TypeError: Cannot read property 'removeChild' of null
-    at domError (console-log-linkify-stack-in-errors.html:21)
-    at console-log-linkify-stack-in-errors.html:27 console-message > source-code > console-message-anchor > devtools-link > hidden console-message-badge > hide-badge-title > console-message-text > devtools-link > devtools-link
-console-log-linkify-stack-in-errors.html:34 Error: some error
-    at logError (console-log-linkify-stack-in-errors.html:32)
-    at console-log-linkify-stack-in-errors.html:38 console-message > source-code > console-message-anchor > devtools-link > hidden console-message-badge > hide-badge-title > console-message-text > object-value-error source-code > devtools-link > devtools-link
-console-log-linkify-stack-in-errors.html:40 Error message without stacks http://www.chromium.org/ console-message > source-code > console-message-anchor > devtools-link > hidden console-message-badge > hide-badge-title > console-message-text > devtools-link
-console-log-linkify-stack-in-errors.html:42 Error valid stack #2
+    at forStack (console-log-linkify-…ck-in-errors.html:4)
+    at console-log-linkify-…ck-in-errors.html:7 console-message > source-code > console-message-anchor > devtools-link > devtools-link-ellipsis > hidden console-message-badge > hide-badge-title > console-message-text > devtools-link > devtools-link-ellipsis > devtools-link > devtools-link-ellipsis
+console-log-linkify-…k-in-errors.html:23 TypeError: Cannot read property 'removeChild' of null
+    at domError (console-log-linkify-…k-in-errors.html:21)
+    at console-log-linkify-…k-in-errors.html:27 console-message > source-code > console-message-anchor > devtools-link > devtools-link-ellipsis > hidden console-message-badge > hide-badge-title > console-message-text > devtools-link > devtools-link-ellipsis > devtools-link > devtools-link-ellipsis
+console-log-linkify-…k-in-errors.html:34 Error: some error
+    at logError (console-log-linkify-…k-in-errors.html:32)
+    at console-log-linkify-…k-in-errors.html:38 console-message > source-code > console-message-anchor > devtools-link > devtools-link-ellipsis > hidden console-message-badge > hide-badge-title > console-message-text > object-value-error source-code > devtools-link > devtools-link-ellipsis > devtools-link > devtools-link-ellipsis
+console-log-linkify-…k-in-errors.html:40 Error message without stacks http://www.chromium.org/ console-message > source-code > console-message-anchor > devtools-link > devtools-link-ellipsis > hidden console-message-badge > hide-badge-title > console-message-text > devtools-link
+console-log-linkify-…k-in-errors.html:42 Error valid stack #2
     at www.chromium.org/boo.js:40
-    at foo(www.chromium.org/foo.js:10) console-message > source-code > console-message-anchor > devtools-link > hidden console-message-badge > hide-badge-title > console-message-text > devtools-link > devtools-link
-console-log-linkify-stack-in-errors.html:43 Error valid stack #3
-    at www.chromium.org/foo.js:40 console-message > source-code > console-message-anchor > devtools-link > hidden console-message-badge > hide-badge-title > console-message-text > devtools-link
-console-log-linkify-stack-in-errors.html:44 Error: MyError
+    at foo(www.chromium.org/foo.js:10) console-message > source-code > console-message-anchor > devtools-link > devtools-link-ellipsis > hidden console-message-badge > hide-badge-title > console-message-text > devtools-link > devtools-link
+console-log-linkify-…k-in-errors.html:43 Error valid stack #3
+    at www.chromium.org/foo.js:40 console-message > source-code > console-message-anchor > devtools-link > devtools-link-ellipsis > hidden console-message-badge > hide-badge-title > console-message-text > devtools-link
+console-log-linkify-…k-in-errors.html:44 Error: MyError
     at throwError (www.chromium.org/foo.js:40)
     at eval (eval at <anonymous> (www.chromium.org/foo.js:42), <anonymous>:1:1)
-    at www.chromium.org/foo.js:239 console-message > source-code > console-message-anchor > devtools-link > hidden console-message-badge > hide-badge-title > console-message-text > devtools-link > devtools-link > devtools-link
-console-log-linkify-stack-in-errors.html:13 ReferenceError: valid stack
-    at stack2 (console-log-linkify-stack-in-errors.html:13)
-    at stack1 (console-log-linkify-stack-in-errors.html:15)
-    at console-log-linkify-stack-in-errors.html:46 console-message > source-code > console-message-anchor > devtools-link > hidden console-message-badge > hide-badge-title > console-message-text > devtools-link > devtools-link > devtools-link
-console-log-linkify-stack-in-errors.html:13 EvalError: valid stack
-    at stack2 (console-log-linkify-stack-in-errors.html:13)
-    at stack1 (console-log-linkify-stack-in-errors.html:15)
-    at console-log-linkify-stack-in-errors.html:47 console-message > source-code > console-message-anchor > devtools-link > hidden console-message-badge > hide-badge-title > console-message-text > devtools-link > devtools-link > devtools-link
-console-log-linkify-stack-in-errors.html:13 SyntaxError: valid stack
-    at stack2 (console-log-linkify-stack-in-errors.html:13)
-    at stack1 (console-log-linkify-stack-in-errors.html:15)
-    at console-log-linkify-stack-in-errors.html:48 console-message > source-code > console-message-anchor > devtools-link > hidden console-message-badge > hide-badge-title > console-message-text > devtools-link > devtools-link > devtools-link
-console-log-linkify-stack-in-errors.html:13 RangeError: valid stack
-    at stack2 (console-log-linkify-stack-in-errors.html:13)
-    at stack1 (console-log-linkify-stack-in-errors.html:15)
-    at console-log-linkify-stack-in-errors.html:49 console-message > source-code > console-message-anchor > devtools-link > hidden console-message-badge > hide-badge-title > console-message-text > devtools-link > devtools-link > devtools-link
-console-log-linkify-stack-in-errors.html:13 TypeError: valid stack
-    at stack2 (console-log-linkify-stack-in-errors.html:13)
-    at stack1 (console-log-linkify-stack-in-errors.html:15)
-    at console-log-linkify-stack-in-errors.html:50 console-message > source-code > console-message-anchor > devtools-link > hidden console-message-badge > hide-badge-title > console-message-text > devtools-link > devtools-link > devtools-link
-console-log-linkify-stack-in-errors.html:13 URIError: valid stack
-    at stack2 (console-log-linkify-stack-in-errors.html:13)
-    at stack1 (console-log-linkify-stack-in-errors.html:15)
-    at console-log-linkify-stack-in-errors.html:51 console-message > source-code > console-message-anchor > devtools-link > hidden console-message-badge > hide-badge-title > console-message-text > devtools-link > devtools-link > devtools-link
-console-log-linkify-stack-in-errors.html:53 Error broken stack
+    at www.chromium.org/foo.js:239 console-message > source-code > console-message-anchor > devtools-link > devtools-link-ellipsis > hidden console-message-badge > hide-badge-title > console-message-text > devtools-link > devtools-link > devtools-link
+console-log-linkify-…k-in-errors.html:13 ReferenceError: valid stack
+    at stack2 (console-log-linkify-…k-in-errors.html:13)
+    at stack1 (console-log-linkify-…k-in-errors.html:15)
+    at console-log-linkify-…k-in-errors.html:46 console-message > source-code > console-message-anchor > devtools-link > devtools-link-ellipsis > hidden console-message-badge > hide-badge-title > console-message-text > devtools-link > devtools-link-ellipsis > devtools-link > devtools-link-ellipsis > devtools-link > devtools-link-ellipsis
+console-log-linkify-…k-in-errors.html:13 EvalError: valid stack
+    at stack2 (console-log-linkify-…k-in-errors.html:13)
+    at stack1 (console-log-linkify-…k-in-errors.html:15)
+    at console-log-linkify-…k-in-errors.html:47 console-message > source-code > console-message-anchor > devtools-link > devtools-link-ellipsis > hidden console-message-badge > hide-badge-title > console-message-text > devtools-link > devtools-link-ellipsis > devtools-link > devtools-link-ellipsis > devtools-link > devtools-link-ellipsis
+console-log-linkify-…k-in-errors.html:13 SyntaxError: valid stack
+    at stack2 (console-log-linkify-…k-in-errors.html:13)
+    at stack1 (console-log-linkify-…k-in-errors.html:15)
+    at console-log-linkify-…k-in-errors.html:48 console-message > source-code > console-message-anchor > devtools-link > devtools-link-ellipsis > hidden console-message-badge > hide-badge-title > console-message-text > devtools-link > devtools-link-ellipsis > devtools-link > devtools-link-ellipsis > devtools-link > devtools-link-ellipsis
+console-log-linkify-…k-in-errors.html:13 RangeError: valid stack
+    at stack2 (console-log-linkify-…k-in-errors.html:13)
+    at stack1 (console-log-linkify-…k-in-errors.html:15)
+    at console-log-linkify-…k-in-errors.html:49 console-message > source-code > console-message-anchor > devtools-link > devtools-link-ellipsis > hidden console-message-badge > hide-badge-title > console-message-text > devtools-link > devtools-link-ellipsis > devtools-link > devtools-link-ellipsis > devtools-link > devtools-link-ellipsis
+console-log-linkify-…k-in-errors.html:13 TypeError: valid stack
+    at stack2 (console-log-linkify-…k-in-errors.html:13)
+    at stack1 (console-log-linkify-…k-in-errors.html:15)
+    at console-log-linkify-…k-in-errors.html:50 console-message > source-code > console-message-anchor > devtools-link > devtools-link-ellipsis > hidden console-message-badge > hide-badge-title > console-message-text > devtools-link > devtools-link-ellipsis > devtools-link > devtools-link-ellipsis > devtools-link > devtools-link-ellipsis
+console-log-linkify-…k-in-errors.html:13 URIError: valid stack
+    at stack2 (console-log-linkify-…k-in-errors.html:13)
+    at stack1 (console-log-linkify-…k-in-errors.html:15)
+    at console-log-linkify-…k-in-errors.html:51 console-message > source-code > console-message-anchor > devtools-link > devtools-link-ellipsis > hidden console-message-badge > hide-badge-title > console-message-text > devtools-link > devtools-link-ellipsis > devtools-link > devtools-link-ellipsis > devtools-link > devtools-link-ellipsis
+console-log-linkify-…k-in-errors.html:53 Error broken stack
     at function_name(foob.js foob.js:30:1)
- at foob.js:40:70 console-message > source-code > console-message-anchor > devtools-link > hidden console-message-badge > hide-badge-title > console-message-text
-console-log-linkify-stack-in-errors.html:54 Error broken stack #2
-    at function_name(foob.js:20:30 console-message > source-code > console-message-anchor > devtools-link > hidden console-message-badge > hide-badge-title > console-message-text
-console-log-linkify-stack-in-errors.html:55 Error broken stack #3
-    at function_name(foob:20.js:30   bla console-message > source-code > console-message-anchor > devtools-link > hidden console-message-badge > hide-badge-title > console-message-text
-console-log-linkify-stack-in-errors.html:56 Error broken stack #4
-    at function_name)foob.js:20:30( console-message > source-code > console-message-anchor > devtools-link > hidden console-message-badge > hide-badge-title > console-message-text
-console-log-linkify-stack-in-errors.html:57 Error broken stack #5
-    at function_name foob.js:20:30) console-message > source-code > console-message-anchor > devtools-link > hidden console-message-badge > hide-badge-title > console-message-text
-console-log-linkify-stack-in-errors.html:58 Error broken stack #6
-    at foob.js foob.js:40:70 console-message > source-code > console-message-anchor > devtools-link > hidden console-message-badge > hide-badge-title > console-message-text
+ at foob.js:40:70 console-message > source-code > console-message-anchor > devtools-link > devtools-link-ellipsis > hidden console-message-badge > hide-badge-title > console-message-text
+console-log-linkify-…k-in-errors.html:54 Error broken stack #2
+    at function_name(foob.js:20:30 console-message > source-code > console-message-anchor > devtools-link > devtools-link-ellipsis > hidden console-message-badge > hide-badge-title > console-message-text
+console-log-linkify-…k-in-errors.html:55 Error broken stack #3
+    at function_name(foob:20.js:30   bla console-message > source-code > console-message-anchor > devtools-link > devtools-link-ellipsis > hidden console-message-badge > hide-badge-title > console-message-text
+console-log-linkify-…k-in-errors.html:56 Error broken stack #4
+    at function_name)foob.js:20:30( console-message > source-code > console-message-anchor > devtools-link > devtools-link-ellipsis > hidden console-message-badge > hide-badge-title > console-message-text
+console-log-linkify-…k-in-errors.html:57 Error broken stack #5
+    at function_name foob.js:20:30) console-message > source-code > console-message-anchor > devtools-link > devtools-link-ellipsis > hidden console-message-badge > hide-badge-title > console-message-text
+console-log-linkify-…k-in-errors.html:58 Error broken stack #6
+    at foob.js foob.js:40:70 console-message > source-code > console-message-anchor > devtools-link > devtools-link-ellipsis > hidden console-message-badge > hide-badge-title > console-message-text
 stack-with-sourceMap.coffee:3 Error
     at Failure.letsFailWithStack (stack-with-sourceMap.coffee:3)
     at window.failure (stack-with-sourceMap.coffee:7)
diff --git a/third_party/WebKit/LayoutTests/inspector/console/console-uncaught-exception-in-eval-expected.txt b/third_party/WebKit/LayoutTests/inspector/console/console-uncaught-exception-in-eval-expected.txt
index 1ba06c7..ea97f3ec 100644
--- a/third_party/WebKit/LayoutTests/inspector/console/console-uncaught-exception-in-eval-expected.txt
+++ b/third_party/WebKit/LayoutTests/inspector/console/console-uncaught-exception-in-eval-expected.txt
@@ -13,7 +13,7 @@
 evalSource @ evalURL.js:13
 (anonymous) @ evalURL.js:14
 setTimeout (async)
-doEvalWithSourceURL @ console-uncaught-exception-in-eval.html:25
+doEvalWithSourceURL @ console-uncaught-exc…ion-in-eval.html:25
 (anonymous) @ VM:1
 VM:5 Uncaught Error: Exception in eval:anonymous
     at b (eval at <anonymous> (unknown source), <anonymous>:5:15)
@@ -26,6 +26,6 @@
 evalSource @ VM:13
 (anonymous) @ VM:14
 setTimeout (async)
-doAnonymousEvalWith @ console-uncaught-exception-in-eval.html:31
+doAnonymousEvalWith @ console-uncaught-exc…ion-in-eval.html:31
 (anonymous) @ VM:1
 
diff --git a/third_party/WebKit/LayoutTests/inspector/console/function-name-in-console-message-stack-expected.txt b/third_party/WebKit/LayoutTests/inspector/console/function-name-in-console-message-stack-expected.txt
index f82fb59..fa42c1d5 100644
--- a/third_party/WebKit/LayoutTests/inspector/console/function-name-in-console-message-stack-expected.txt
+++ b/third_party/WebKit/LayoutTests/inspector/console/function-name-in-console-message-stack-expected.txt
@@ -1,10 +1,10 @@
 CONSOLE ERROR: line 8: Uncaught Error
 Tests exception message contains stack with correct function name.
 
-function-name-in-console-message-stack.html:8 Uncaught Error
-foo.displayName @ function-name-in-console-message-stack.html:8
-bar.displayName @ function-name-in-console-message-stack.html:16
-baz.function.name @ function-name-in-console-message-stack.html:23
+function-name-in-con…essage-stack.html:8 Uncaught Error
+foo.displayName @ function-name-in-con…essage-stack.html:8
+bar.displayName @ function-name-in-con…ssage-stack.html:16
+baz.function.name @ function-name-in-con…ssage-stack.html:23
 setTimeout (async)
 (anonymous) @ VM:1
 
diff --git a/third_party/WebKit/LayoutTests/inspector/sources/debugger-pause/debugger-eval-on-call-frame-inside-iframe-expected.txt b/third_party/WebKit/LayoutTests/inspector/sources/debugger-pause/debugger-eval-on-call-frame-inside-iframe-expected.txt
index 5601e96..c3806044 100644
--- a/third_party/WebKit/LayoutTests/inspector/sources/debugger-pause/debugger-eval-on-call-frame-inside-iframe-expected.txt
+++ b/third_party/WebKit/LayoutTests/inspector/sources/debugger-pause/debugger-eval-on-call-frame-inside-iframe-expected.txt
@@ -13,9 +13,9 @@
 clear = 
 x: = VM:1 Uncaught SyntaxError: Unexpected end of input
     at Object.pauseInsideIframe (<anonymous>:6:5)
-    at testFunction (debugger-eval-on-call-frame-inside-iframe.html:35)
+    at testFunction (debugger-eval-on-cal…side-iframe.html:35)
 pauseInsideIframe @ VM:6
-testFunction @ debugger-eval-on-call-frame-inside-iframe.html:35
+testFunction @ debugger-eval-on-cal…side-iframe.html:35
 setTimeout (async)
 scheduleTestFunction @ debugger-test.js:3
 (anonymous) @ VM:1
@@ -27,9 +27,9 @@
 clear = "local in top frame"
 x: = VM:1 Uncaught SyntaxError: Unexpected end of input
     at Object.pauseInsideIframe (<anonymous>:6:5)
-    at testFunction (debugger-eval-on-call-frame-inside-iframe.html:35)
+    at testFunction (debugger-eval-on-cal…side-iframe.html:35)
 pauseInsideIframe @ VM:6
-testFunction @ debugger-eval-on-call-frame-inside-iframe.html:35
+testFunction @ debugger-eval-on-cal…side-iframe.html:35
 setTimeout (async)
 scheduleTestFunction @ debugger-test.js:3
 (anonymous) @ VM:1
diff --git a/third_party/WebKit/LayoutTests/inspector/sources/debugger-pause/debugger-eval-while-paused-throws-expected.txt b/third_party/WebKit/LayoutTests/inspector/sources/debugger-pause/debugger-eval-while-paused-throws-expected.txt
index 167325f3..34f9d27e 100644
--- a/third_party/WebKit/LayoutTests/inspector/sources/debugger-pause/debugger-eval-while-paused-throws-expected.txt
+++ b/third_party/WebKit/LayoutTests/inspector/sources/debugger-pause/debugger-eval-while-paused-throws-expected.txt
@@ -7,7 +7,7 @@
 VM:6 Uncaught Error: injectedObj.func
     at Object.func (<anonymous>:6:23)
     at injectedFunction (<anonymous>:9:28)
-    at eval (eval at testFunction (debugger-eval-while-paused-throws.html:18), <anonymous>:1:1)
+    at eval (eval at testFunction (debugger-eval-while-…used-throws.html:18), <anonymous>:1:1)
     at testFunction (test.js:18)
 func @ VM:6
 injectedFunction @ VM:9
@@ -19,7 +19,7 @@
 localObj.func()
 test.js:15 Uncaught Error: localObj.func
     at Object.func (test.js:15)
-    at eval (eval at testFunction (debugger-eval-while-paused-throws.html:18), <anonymous>:1:10)
+    at eval (eval at testFunction (debugger-eval-while-…used-throws.html:18), <anonymous>:1:10)
     at testFunction (test.js:18)
 func @ test.js:15
 (anonymous) @ VM:1
@@ -30,7 +30,7 @@
 globalObj.func()
 test.js:6 Uncaught Error: globalObj.func
     at Object.func (test.js:6)
-    at eval (eval at testFunction (debugger-eval-while-paused-throws.html:18), <anonymous>:1:11)
+    at eval (eval at testFunction (debugger-eval-while-…used-throws.html:18), <anonymous>:1:11)
     at testFunction (test.js:18)
 func @ test.js:6
 (anonymous) @ VM:1
diff --git a/third_party/WebKit/LayoutTests/inspector/sources/debugger-ui/error-in-watch-expressions.html b/third_party/WebKit/LayoutTests/inspector/sources/debugger-ui/error-in-watch-expressions.html
index af2ae8b9..aff2084 100644
--- a/third_party/WebKit/LayoutTests/inspector/sources/debugger-ui/error-in-watch-expressions.html
+++ b/third_party/WebKit/LayoutTests/inspector/sources/debugger-ui/error-in-watch-expressions.html
@@ -18,7 +18,7 @@
 
     function step1()
     {
-        InspectorTest.addResult(watchExpressionsPane.element.textContent.indexOf("<not available>") !== -1 ? "SUCCESS" : "FAILED");
+        InspectorTest.addResult(watchExpressionsPane.contentElement.textContent.indexOf("<not available>") !== -1 ? "SUCCESS" : "FAILED");
 
         // Clear watch expressions after execution.
         watchExpressionsPane._deleteAllButtonClicked();
diff --git a/third_party/WebKit/LayoutTests/inspector/sources/debugger/rethrow-error-from-bindings-crash-expected.txt b/third_party/WebKit/LayoutTests/inspector/sources/debugger/rethrow-error-from-bindings-crash-expected.txt
index d02736b..41a2c5d0 100644
--- a/third_party/WebKit/LayoutTests/inspector/sources/debugger/rethrow-error-from-bindings-crash-expected.txt
+++ b/third_party/WebKit/LayoutTests/inspector/sources/debugger/rethrow-error-from-bindings-crash-expected.txt
@@ -9,117 +9,117 @@
 Tests that pausing on uncaught exceptions thrown from C++ bindings will not crash.
 
 Set timer for test function.
-rethrow-error-from-bindings-crash.html:11 Console was cleared
-rethrow-error-from-bindings-crash.html:25 Uncaught TypeError: Failed to execute 'compareBoundaryPoints' on 'Range': parameter 2 is not of type 'Range'.
-    at f2 (rethrow-error-from-bindings-crash.html:25)
-    at testFunction (rethrow-error-from-bindings-crash.html:15)
-f2 @ rethrow-error-from-bindings-crash.html:25
-testFunction @ rethrow-error-from-bindings-crash.html:15
+rethrow-error-from-b…dings-crash.html:11 Console was cleared
+rethrow-error-from-b…dings-crash.html:25 Uncaught TypeError: Failed to execute 'compareBoundaryPoints' on 'Range': parameter 2 is not of type 'Range'.
+    at f2 (rethrow-error-from-b…dings-crash.html:25)
+    at testFunction (rethrow-error-from-b…dings-crash.html:15)
+f2 @ rethrow-error-from-b…dings-crash.html:25
+testFunction @ rethrow-error-from-b…dings-crash.html:15
 setTimeout (async)
 scheduleTestFunction @ debugger-test.js:3
 (anonymous) @ VM:1
-rethrow-error-from-bindings-crash.html:20 Uncaught TypeError: Failed to execute 'appendChild' on 'Node': parameter 1 is not of type 'Node'.
-    at f1 (rethrow-error-from-bindings-crash.html:20)
-f1 @ rethrow-error-from-bindings-crash.html:20
+rethrow-error-from-b…dings-crash.html:20 Uncaught TypeError: Failed to execute 'appendChild' on 'Node': parameter 1 is not of type 'Node'.
+    at f1 (rethrow-error-from-b…dings-crash.html:20)
+f1 @ rethrow-error-from-b…dings-crash.html:20
 setTimeout (async)
-f2 @ rethrow-error-from-bindings-crash.html:24
-testFunction @ rethrow-error-from-bindings-crash.html:15
+f2 @ rethrow-error-from-b…dings-crash.html:24
+testFunction @ rethrow-error-from-b…dings-crash.html:15
 setTimeout (async)
 scheduleTestFunction @ debugger-test.js:3
 (anonymous) @ VM:1
-rethrow-error-from-bindings-crash.html:25 Uncaught TypeError: Failed to execute 'compareBoundaryPoints' on 'Range': parameter 2 is not of type 'Range'.
-    at f2 (rethrow-error-from-bindings-crash.html:25)
-f2 @ rethrow-error-from-bindings-crash.html:25
+rethrow-error-from-b…dings-crash.html:25 Uncaught TypeError: Failed to execute 'compareBoundaryPoints' on 'Range': parameter 2 is not of type 'Range'.
+    at f2 (rethrow-error-from-b…dings-crash.html:25)
+f2 @ rethrow-error-from-b…dings-crash.html:25
 setTimeout (async)
-f1 @ rethrow-error-from-bindings-crash.html:19
+f1 @ rethrow-error-from-b…dings-crash.html:19
 setTimeout (async)
-f2 @ rethrow-error-from-bindings-crash.html:24
-testFunction @ rethrow-error-from-bindings-crash.html:15
+f2 @ rethrow-error-from-b…dings-crash.html:24
+testFunction @ rethrow-error-from-b…dings-crash.html:15
 setTimeout (async)
 scheduleTestFunction @ debugger-test.js:3
 (anonymous) @ VM:1
-rethrow-error-from-bindings-crash.html:20 Uncaught TypeError: Failed to execute 'appendChild' on 'Node': parameter 1 is not of type 'Node'.
-    at f1 (rethrow-error-from-bindings-crash.html:20)
-f1 @ rethrow-error-from-bindings-crash.html:20
+rethrow-error-from-b…dings-crash.html:20 Uncaught TypeError: Failed to execute 'appendChild' on 'Node': parameter 1 is not of type 'Node'.
+    at f1 (rethrow-error-from-b…dings-crash.html:20)
+f1 @ rethrow-error-from-b…dings-crash.html:20
 setTimeout (async)
-f2 @ rethrow-error-from-bindings-crash.html:24
+f2 @ rethrow-error-from-b…dings-crash.html:24
 setTimeout (async)
-f1 @ rethrow-error-from-bindings-crash.html:19
+f1 @ rethrow-error-from-b…dings-crash.html:19
 setTimeout (async)
-f2 @ rethrow-error-from-bindings-crash.html:24
-testFunction @ rethrow-error-from-bindings-crash.html:15
+f2 @ rethrow-error-from-b…dings-crash.html:24
+testFunction @ rethrow-error-from-b…dings-crash.html:15
 setTimeout (async)
 scheduleTestFunction @ debugger-test.js:3
 (anonymous) @ VM:1
-rethrow-error-from-bindings-crash.html:25 Uncaught TypeError: Failed to execute 'compareBoundaryPoints' on 'Range': parameter 2 is not of type 'Range'.
-    at f2 (rethrow-error-from-bindings-crash.html:25)
-f2 @ rethrow-error-from-bindings-crash.html:25
+rethrow-error-from-b…dings-crash.html:25 Uncaught TypeError: Failed to execute 'compareBoundaryPoints' on 'Range': parameter 2 is not of type 'Range'.
+    at f2 (rethrow-error-from-b…dings-crash.html:25)
+f2 @ rethrow-error-from-b…dings-crash.html:25
 setTimeout (async)
-f1 @ rethrow-error-from-bindings-crash.html:19
+f1 @ rethrow-error-from-b…dings-crash.html:19
 setTimeout (async)
-f2 @ rethrow-error-from-bindings-crash.html:24
+f2 @ rethrow-error-from-b…dings-crash.html:24
 setTimeout (async)
-f1 @ rethrow-error-from-bindings-crash.html:19
+f1 @ rethrow-error-from-b…dings-crash.html:19
 setTimeout (async)
-f2 @ rethrow-error-from-bindings-crash.html:24
-testFunction @ rethrow-error-from-bindings-crash.html:15
+f2 @ rethrow-error-from-b…dings-crash.html:24
+testFunction @ rethrow-error-from-b…dings-crash.html:15
 setTimeout (async)
 scheduleTestFunction @ debugger-test.js:3
 (anonymous) @ VM:1
-rethrow-error-from-bindings-crash.html:20 Uncaught TypeError: Failed to execute 'appendChild' on 'Node': parameter 1 is not of type 'Node'.
-    at f1 (rethrow-error-from-bindings-crash.html:20)
-f1 @ rethrow-error-from-bindings-crash.html:20
+rethrow-error-from-b…dings-crash.html:20 Uncaught TypeError: Failed to execute 'appendChild' on 'Node': parameter 1 is not of type 'Node'.
+    at f1 (rethrow-error-from-b…dings-crash.html:20)
+f1 @ rethrow-error-from-b…dings-crash.html:20
 setTimeout (async)
-f2 @ rethrow-error-from-bindings-crash.html:24
+f2 @ rethrow-error-from-b…dings-crash.html:24
 setTimeout (async)
-f1 @ rethrow-error-from-bindings-crash.html:19
+f1 @ rethrow-error-from-b…dings-crash.html:19
 setTimeout (async)
-f2 @ rethrow-error-from-bindings-crash.html:24
+f2 @ rethrow-error-from-b…dings-crash.html:24
 setTimeout (async)
-f1 @ rethrow-error-from-bindings-crash.html:19
+f1 @ rethrow-error-from-b…dings-crash.html:19
 setTimeout (async)
-f2 @ rethrow-error-from-bindings-crash.html:24
-testFunction @ rethrow-error-from-bindings-crash.html:15
+f2 @ rethrow-error-from-b…dings-crash.html:24
+testFunction @ rethrow-error-from-b…dings-crash.html:15
 setTimeout (async)
 scheduleTestFunction @ debugger-test.js:3
 (anonymous) @ VM:1
-rethrow-error-from-bindings-crash.html:25 Uncaught TypeError: Failed to execute 'compareBoundaryPoints' on 'Range': parameter 2 is not of type 'Range'.
-    at f2 (rethrow-error-from-bindings-crash.html:25)
-f2 @ rethrow-error-from-bindings-crash.html:25
+rethrow-error-from-b…dings-crash.html:25 Uncaught TypeError: Failed to execute 'compareBoundaryPoints' on 'Range': parameter 2 is not of type 'Range'.
+    at f2 (rethrow-error-from-b…dings-crash.html:25)
+f2 @ rethrow-error-from-b…dings-crash.html:25
 setTimeout (async)
-f1 @ rethrow-error-from-bindings-crash.html:19
+f1 @ rethrow-error-from-b…dings-crash.html:19
 setTimeout (async)
-f2 @ rethrow-error-from-bindings-crash.html:24
+f2 @ rethrow-error-from-b…dings-crash.html:24
 setTimeout (async)
-f1 @ rethrow-error-from-bindings-crash.html:19
+f1 @ rethrow-error-from-b…dings-crash.html:19
 setTimeout (async)
-f2 @ rethrow-error-from-bindings-crash.html:24
+f2 @ rethrow-error-from-b…dings-crash.html:24
 setTimeout (async)
-f1 @ rethrow-error-from-bindings-crash.html:19
+f1 @ rethrow-error-from-b…dings-crash.html:19
 setTimeout (async)
-f2 @ rethrow-error-from-bindings-crash.html:24
-testFunction @ rethrow-error-from-bindings-crash.html:15
+f2 @ rethrow-error-from-b…dings-crash.html:24
+testFunction @ rethrow-error-from-b…dings-crash.html:15
 setTimeout (async)
 scheduleTestFunction @ debugger-test.js:3
 (anonymous) @ VM:1
-rethrow-error-from-bindings-crash.html:20 Uncaught TypeError: Failed to execute 'appendChild' on 'Node': parameter 1 is not of type 'Node'.
-    at f1 (rethrow-error-from-bindings-crash.html:20)
-f1 @ rethrow-error-from-bindings-crash.html:20
+rethrow-error-from-b…dings-crash.html:20 Uncaught TypeError: Failed to execute 'appendChild' on 'Node': parameter 1 is not of type 'Node'.
+    at f1 (rethrow-error-from-b…dings-crash.html:20)
+f1 @ rethrow-error-from-b…dings-crash.html:20
 setTimeout (async)
-f2 @ rethrow-error-from-bindings-crash.html:24
+f2 @ rethrow-error-from-b…dings-crash.html:24
 setTimeout (async)
-f1 @ rethrow-error-from-bindings-crash.html:19
+f1 @ rethrow-error-from-b…dings-crash.html:19
 setTimeout (async)
-f2 @ rethrow-error-from-bindings-crash.html:24
+f2 @ rethrow-error-from-b…dings-crash.html:24
 setTimeout (async)
-f1 @ rethrow-error-from-bindings-crash.html:19
+f1 @ rethrow-error-from-b…dings-crash.html:19
 setTimeout (async)
-f2 @ rethrow-error-from-bindings-crash.html:24
+f2 @ rethrow-error-from-b…dings-crash.html:24
 setTimeout (async)
-f1 @ rethrow-error-from-bindings-crash.html:19
+f1 @ rethrow-error-from-b…dings-crash.html:19
 setTimeout (async)
-f2 @ rethrow-error-from-bindings-crash.html:24
-testFunction @ rethrow-error-from-bindings-crash.html:15
+f2 @ rethrow-error-from-b…dings-crash.html:24
+testFunction @ rethrow-error-from-b…dings-crash.html:15
 setTimeout (async)
 scheduleTestFunction @ debugger-test.js:3
 (anonymous) @ VM:1
diff --git a/third_party/WebKit/LayoutTests/media/controls/controls-video-keynav-no-controls.html b/third_party/WebKit/LayoutTests/media/controls/controls-video-keynav-no-controls.html
new file mode 100644
index 0000000..fe078711
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/media/controls/controls-video-keynav-no-controls.html
@@ -0,0 +1,47 @@
+<DOCTYPE html>
+<title>Test media controls video keyboard navigation</title>
+<script src="../../resources/testharness.js"></script>
+<script src="../../resources/testharnessreport.js"></script>
+<script src="../media-file.js"></script>
+<script src="../media-controls.js"></script>
+<video></video>
+<script>
+test(_ => {
+  assert_true('eventSender' in window);
+}, 'eventSender required');
+
+async_test(function(t) {
+    var video = document.querySelector("video");
+    video.src = findMediaFile("video", "../content/test");
+    assert_equals(video.volume, 1);
+    assert_equals(video.currentTime, 0);
+
+    video.oncanplaythrough = t.step_func_done(function() {
+      // Focus the video.
+      video.focus();
+
+      // 'Enter' does not play the video.
+      eventSender.keyDown("Enter");
+      assert_true(video.paused);
+
+      // 'Down' does not reduce volume.
+      eventSender.keyDown("ArrowDown");
+      assert_equals(video.volume, 1);
+
+      // 'Space' also does not pauses/plays the video.
+      eventSender.keyDown(" ");
+      assert_true(video.paused);
+
+      var cur = video.currentTime;
+
+      // 'Right' does not scrub the timeline forward.
+      eventSender.keyDown("ArrowRight");
+      assert_equals(video.currentTime, cur);
+
+      // 'End' does not set the timeline to end.
+      eventSender.keyDown("End");
+      assert_equals(video.currentTime, cur);
+    });
+});
+</script>
+
diff --git a/third_party/WebKit/LayoutTests/media/controls/controls-video-keynav.html b/third_party/WebKit/LayoutTests/media/controls/controls-video-keynav.html
new file mode 100644
index 0000000..4c69aef
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/media/controls/controls-video-keynav.html
@@ -0,0 +1,67 @@
+<DOCTYPE html>
+<title>Test media controls video keyboard navigation</title>
+<script src="../../resources/testharness.js"></script>
+<script src="../../resources/testharnessreport.js"></script>
+<script src="../media-file.js"></script>
+<script src="../media-controls.js"></script>
+<video controls></video>
+<script>
+test(_ => {
+  assert_true('eventSender' in window);
+}, 'eventSender required');
+
+async_test(function(t) {
+    var video = document.querySelector("video");
+    video.src = findMediaFile("video", "../content/test");
+    assert_equals(video.volume, 1);
+    assert_equals(video.currentTime, 0);
+
+    video.oncanplaythrough = t.step_func_done(function() {
+      // Focus the video.
+      video.focus();
+
+      // 'Enter' plays the video.
+      eventSender.keyDown("Enter");
+      assert_false(video.paused);
+
+      // 'Down' reduces volume.
+      eventSender.keyDown("ArrowDown");
+      assert_less_than(video.volume, 1);
+
+      // 'Up' increases volume.
+      eventSender.keyDown("ArrowUp");
+      assert_equals(video.volume, 1);
+
+      // 'Enter' again pauses the video.
+      eventSender.keyDown("Enter");
+      assert_true(video.paused);
+
+      // 'Space' also pauses/plays the video.
+      eventSender.keyDown(" ");
+      assert_false(video.paused);
+
+      eventSender.keyDown(" ");
+      assert_true(video.paused);
+
+      var cur = video.currentTime;
+
+      // 'Right' scrubs the timeline forward.
+      // Used to move the timeline off the first frame which is neccessary to
+      // test 'Home', otherwise 'Home' is a no-op.
+      eventSender.keyDown("ArrowRight");
+      assert_greater_than(video.currentTime, cur);
+
+      // 'Home' sets the timeline to 0.
+      eventSender.keyDown("Home");
+      assert_equals(video.currentTime, 0);
+
+      // 'End' sets the timeline to end.
+      eventSender.keyDown("End");
+      assert_equals(video.currentTime, video.duration);
+
+      // 'Left' scrubs the timeline back.
+      eventSender.keyDown("ArrowLeft");
+      assert_less_than(video.currentTime, video.duration);
+    });
+});
+</script>
diff --git a/third_party/WebKit/LayoutTests/svg/css/getComputedStyle-listing-expected.txt b/third_party/WebKit/LayoutTests/svg/css/getComputedStyle-listing-expected.txt
index 3f261c2..f69ece8 100644
--- a/third_party/WebKit/LayoutTests/svg/css/getComputedStyle-listing-expected.txt
+++ b/third_party/WebKit/LayoutTests/svg/css/getComputedStyle-listing-expected.txt
@@ -60,7 +60,7 @@
 -webkit-writing-mode: horizontal-tb
 align-content: normal
 align-items: normal
-align-self: auto
+align-self: normal
 alignment-baseline: auto
 animation-delay: 0s
 animation-direction: normal
@@ -181,7 +181,7 @@
 isolation: auto
 justify-content: normal
 justify-items: normal
-justify-self: auto
+justify-self: normal
 left: auto
 letter-spacing: normal
 lighting-color: rgb(255, 255, 255)
diff --git a/third_party/WebKit/LayoutTests/webaudio/BiquadFilter/tail-time-allpass.html b/third_party/WebKit/LayoutTests/webaudio/BiquadFilter/tail-time-allpass.html
new file mode 100644
index 0000000..b902f42
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/webaudio/BiquadFilter/tail-time-allpass.html
@@ -0,0 +1,103 @@
+<!doctype html>
+<html>
+  <head>
+    <title>Test Biquad Tail-Time</title>
+    <script src="../../resources/testharness.js"></script>
+    <script src="../../resources/testharnessreport.js"></script>
+    <script src="../resources/audit-util.js"></script>
+    <script src="../resources/audit.js"></script>
+    <script src="../resources/biquad-filters.js"></script>
+    <script src="test-tail-time.js"></script>
+  </head>
+
+  <body>
+    <script>
+      let audit = Audit.createTaskRunner();
+
+      let sampleRate = 16384;
+      let renderSeconds = 1;
+      let renderFrames = renderSeconds * sampleRate;
+
+      // For an allpass filter:
+      //   b0 = 1 - alpha
+      //   b1 = -2*cos(w0)
+      //   b2 = 1 + alpha
+      //   a0 = 1 + alpha
+      //   a1 = -2*cos(w0)
+      //   a2 = 1 - alpha
+      //
+      // where alpha = sin(w0)/(2*Q) and w0 = 2*%pi*f0/Fs.
+      //
+      // Equivalently a1 = -2*cos(w0)/(1+alpha), a2 = (1-alpha)/(1+alpha).  The
+      // poles of this filter are at
+      //
+      //   (2*Q*cos(w0) +/- sqrt(1-4*Q^2)*sin(w0))/(2*Q + sin(w0))
+      //
+      // Thus, if 1-4*Q^2 < 0, the poles are complex.  For 1-4*Q^2 > 0, the
+      // poles are real and distinct.  For 1-4*Q^2 = 0, there are two identical
+      // real poles.
+
+      // Array of tests to run.  |descripton| is the task description for
+      // audit.define.  |parameters| is option for |testTailTime|.
+      let tests = [
+        {
+          description:
+              {label: 'allpass-complex-roots', description: 'complex roots'},
+          parameters: {
+            prefix: 'Complex roots',
+            // Choose a fairly large Q to make the tail long.  Frequency is
+            // fairly arbitrary.
+            filterOptions: {type: 'allpass', Q: 200, frequency: sampleRate / 4},
+            // This filter the actual real tail frame is 2317, and the node
+            // computed frame is 2316.81.  Thus, the tail output should be
+            // exactly 0.
+            threshold: 0
+          }
+        },
+        {
+          description: {
+            label: 'allpass-real-distinct-roots',
+            description: 'real distinct roots'
+          },
+          parameters: {
+            prefix: 'Distinct roots',
+            filterOptions: {
+              type: 'allpass',
+              Q: 0.001,
+              frequency: sampleRate / 8,
+            },
+            // With this particular filter, the real tail frame is 4822, but
+            // the node way overestimates it to be 7136.  Thus, the actual
+            // tail frames won't be exactly zero.
+            threshold: 1 / 32768
+          }
+        },
+        {
+          description: {
+            label: 'allpass-repeated-roots',
+            description: 'repeated real root'
+          },
+          parameters: {
+            prefix: 'Repeated roots',
+            // 1-4*Q^2 = 0 iff Q = 1/2.
+            filterOptions: {type: 'allpass', Q: 0.5, frequency: sampleRate / 8},
+            // The node estimated tail time is 16.8 frames, but the actual is
+            // 106.  Thus, the outupt should be exactly 0.
+            threshold: 0
+          }
+        }
+      ];
+
+      // Define an appropriate task for each test.
+      tests.forEach(entry => {
+        audit.define(entry.description, (task, should) => {
+          let context = new OfflineAudioContext(1, renderFrames, sampleRate);
+          testTailTime(should, context, entry.parameters)
+              .then(() => task.done());
+        });
+      });
+
+      audit.run();
+    </script>
+  </body>
+</html>
diff --git a/third_party/WebKit/LayoutTests/webaudio/BiquadFilter/tail-time-bandpass.html b/third_party/WebKit/LayoutTests/webaudio/BiquadFilter/tail-time-bandpass.html
new file mode 100644
index 0000000..6eb0ad1
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/webaudio/BiquadFilter/tail-time-bandpass.html
@@ -0,0 +1,95 @@
+<!doctype html>
+<html>
+  <head>
+    <title>Test Biquad Tail-Time</title>
+    <script src="../../resources/testharness.js"></script>
+    <script src="../../resources/testharnessreport.js"></script>
+    <script src="../resources/audit-util.js"></script>
+    <script src="../resources/audit.js"></script>
+    <script src="../resources/biquad-filters.js"></script>
+    <script src="test-tail-time.js"></script>
+  </head>
+
+  <body>
+    <script>
+      let audit = Audit.createTaskRunner();
+
+      let sampleRate = 16384;
+      let renderSeconds = 1;
+      let renderFrames = renderSeconds * sampleRate;
+
+      // For a bandpass filter:
+      //   b0 = alpha
+      //   b1 = 0
+      //   b2 = -alpha
+      //   a0 = 1 + alpha
+      //   a1 = -2*cos(w0)
+      //   a2 = 1 - alpha
+      //
+      // where alpha = sin(w0)/(2*Q) and w0 = 2*%pi*f0/Fs.
+      //
+      // Equivalently a1 = -2*cos(w0)/(1+alpha), a2 = (1-alpha)/(1+alpha).  The
+      // poles of this filter are at
+      //
+      //   (2*Q*cos(w0) +/- sqrt(1-4*Q^2)*sin(w0))/(2*Q + sin(w0))
+      //
+      // Thus, if 1-4*Q^2 < 0, the poles are complex.  For 1-4*Q^2 > 0, the
+      // poles are real and distinct.  For 1-4*Q^2 = 0, there are two identical
+      // real poles.
+
+      // Array of tests to run.  |descripton| is the task description for
+      // audit.define.  |parameters| is option for |testTailTime|.
+      let tests = [
+        {
+          descripton:
+              {label: 'bpf-complex-roots', description: 'complex roots'},
+          parameters: {
+            prefix: 'BPF complex roots',
+            filterOptions:
+                {type: 'bandpass', Q: 200, frequency: sampleRate / 4},
+            // The node estimated tail frame is 2039.55, which matches the
+            // true tail frame so output should be exactly 0
+            threshold: 0
+          }
+        },
+        {
+          descripton: {
+            label: 'bpf-real-distinct-roots',
+            description: 'real distinct roots'
+          },
+          parameters: {
+            prefix: 'BPF real distinct roots',
+            filterOptions:
+                {type: 'bandpass', Q: 0.001, frequency: sampleRate / 4},
+            // The node estimated tail frame is 2437, which matches the
+            // true tail frame so output should be exactly 0
+            threshold: 0
+          }
+        },
+        {
+          descripton:
+              {label: 'bpf-repeated-roots', description: 'repeated real root'},
+          parameters: {
+            prefix: 'BPF repeated roots',
+            filterOptions:
+                {type: 'bandpass', Q: 0.5, frequency: sampleRate / 8},
+            // The node estimated tail frame is 15.9, which matches the true
+            // tail frame so output should be exactly 0
+            threshold: 0
+          }
+        }
+      ];
+
+      // Define an appropriate task for each test.
+      tests.forEach(entry => {
+        audit.define(entry.descripton, (task, should) => {
+          let context = new OfflineAudioContext(1, renderFrames, sampleRate);
+          testTailTime(should, context, entry.parameters)
+              .then(() => task.done());
+        });
+      });
+
+      audit.run();
+    </script>
+  </body>
+</html>
diff --git a/third_party/WebKit/LayoutTests/webaudio/BiquadFilter/tail-time-highpass.html b/third_party/WebKit/LayoutTests/webaudio/BiquadFilter/tail-time-highpass.html
new file mode 100644
index 0000000..90bd15a3
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/webaudio/BiquadFilter/tail-time-highpass.html
@@ -0,0 +1,116 @@
+<!doctype html>
+<html>
+  <head>
+    <title>Test Biquad Tail-Time</title>
+    <script src="../../resources/testharness.js"></script>
+    <script src="../../resources/testharnessreport.js"></script>
+    <script src="../resources/audit-util.js"></script>
+    <script src="../resources/audit.js"></script>
+    <script src="../resources/biquad-filters.js"></script>
+    <script src="test-tail-time.js"></script>
+  </head>
+
+  <body>
+    <script>
+      let audit = Audit.createTaskRunner();
+
+      let sampleRate = 16384;
+      let renderSeconds = 1;
+      let renderFrames = renderSeconds * sampleRate;
+
+      // For a highpass filter:
+      //   b0 = (1+cos(w0))/2
+      //   b1 = -(1+cos(w0))
+      //   b2 = (1+cos(w0))/2
+      //   a0 = 1 + alpha
+      //   a1 = -2*cos(w0)
+      //   a2 = 1 - alpha
+      //
+      // where alpha = sin(w0)/(2*10^(Q/20)) and w0 = 2*%pi*f0/Fs.
+      //
+      // Equivalently a1 = -2*cos(w0)/(1+alpha), a2 = (1-alpha)/(1+alpha).  The
+      // poles of this filter are at
+      //
+      //   cos(w0)/(1+alpha) +/- sqrt(alpha^2-sin(w0)^2)/(1+alpha)
+      //
+      // But alpha^2-sin(w0)^2 = sin(w0)^2*(1/4/10^(Q/10) - 1).  Thus the poles
+      // are complex if 1/4/10^(Q/10) < 1; real distinct if 1/4/10^(Q/10) > 1;
+      // and repeated if 1/4/10^(Q/10) = 1.
+
+      // Array of tests to run.  |descripton| is the task description for
+      // audit.define.  |parameters| is option for |testTailTime|.
+      let tests = [
+        {
+          descripton:
+              {label: 'hpf-complex-roots', description: 'complex roots'},
+          parameters: {
+            prefix: 'HPF complex roots',
+            filterOptions: {type: 'highpass', Q: 40, frequency: sampleRate / 4},
+            // Node computed tail frame is 2079.4, which matches the actual tail
+            // frome so output should be exactly 0.
+            threshold: 0
+          }
+        },
+        {
+          descripton: {
+            label: 'hpf-real-distinct-roots',
+            description: 'real distinct roots'
+          },
+          parameters: {
+            prefix: 'HPF real distinct roots',
+            filterOptions:
+                {type: 'highpass', Q: -50, frequency: sampleRate / 8},
+            // With these filter parameters, the real tail time is 408, but
+            // the node overestimates it to be 2367.  Thus, the actual tail
+            // frames won't be exactly zero.
+            threshold: 1 / 32768
+          }
+        },
+        {
+          descripton:
+              {label: 'hpf-repeated-root', description: 'repeated real root'},
+          parameters: {
+            prefix: 'HPF repeated roots (approximately)',
+            // For a repeated root, we need 1/4/10^(Q/10) = 1, or Q =
+            // -10*log(4)/log(10). This isn't exactly representable as a float,
+            // so the roots might not actually be repeated.  In fact the roots
+            // are complex at 6.40239e-5*exp(i*1.570596).
+            filterOptions: {
+              type: 'highpass',
+              Q: -10 * Math.log10(4),
+              frequency: sampleRate / 4
+            },
+            // Node computed tail frame is 2.9, which matches the actual tail
+            // frome so output should be exactly 0.
+            threshold: 0
+          }
+        },
+        {
+          descripton: {label: 'hpf-real-roots-2', description: 'complex roots'},
+          parameters: {
+            prefix: 'HPF repeated roots 2',
+            // This tests an extreme case where approximate impulse response is
+            // h(n) = C*r^(n-1) and C < 1/32768.  Thus, the impulse response is
+            // always less than the response threshold of 1/32768.
+            filterOptions:
+                {type: 'highpass', Q: -100, frequency: sampleRate / 4},
+            // Node computed tail frame is 0, which matches the actual tail
+            // frame so output should be exactly 0.
+            threshold: 0
+          }
+        }
+      ];
+
+      // Define an appropriate task for each test.
+      tests.forEach(entry => {
+        audit.define(entry.descripton, (task, should) => {
+          let context = new OfflineAudioContext(1, renderFrames, sampleRate);
+          testTailTime(should, context, entry.parameters)
+              .then(() => task.done());
+        });
+      });
+
+      audit.run();
+    </script>
+  </body>
+</html>
diff --git a/third_party/WebKit/LayoutTests/webaudio/BiquadFilter/tail-time-highshelf.html b/third_party/WebKit/LayoutTests/webaudio/BiquadFilter/tail-time-highshelf.html
new file mode 100644
index 0000000..0b3a2ae
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/webaudio/BiquadFilter/tail-time-highshelf.html
@@ -0,0 +1,81 @@
+<!doctype html>
+<html>
+  <head>
+    <title>Test Biquad Tail-Time</title>
+    <script src="../../resources/testharness.js"></script>
+    <script src="../../resources/testharnessreport.js"></script>
+    <script src="../resources/audit-util.js"></script>
+    <script src="../resources/audit.js"></script>
+    <script src="../resources/biquad-filters.js"></script>
+    <script src="test-tail-time.js"></script>
+  </head>
+
+  <body>
+    <script>
+      let audit = Audit.createTaskRunner();
+
+      let sampleRate = 16384;
+      let renderSeconds = 1;
+      let renderFrames = renderSeconds * sampleRate;
+
+      // For a highshelf filter:
+      //   b0 = A*[(A+1)+(A−1)*cos(w0)+2*as*sqrt(A)]
+      //   b1 = 2*A*[(A-1)+(A+1)*cos(w0)]
+      //   b2 = A*[(A+1)+(A−1)*cos(w0)-2*as*sqrt(A)]
+      //   a0 = (A+1)-(A-1)*cos(w0)+2*as*sqrt(A)
+      //   a1 = -2*[(A-1)-(A+1)*cos(w0)]
+      //   a2 = (A+1)-(A-1)*cos(w0)-2*as*sqrt(A)
+      //
+      // where as = sin(w0)/sqrt(2), w0 = 2*%pi*f0/Fs, and A = 10^(G/40)
+      //
+      // The poles of this filter are
+      //
+      //   -a2/(2*a0) +/- sqrt(a1^2-4*a0*a2)/(2*a0).
+      //
+      // Thus, the poles depend on the sign of d = a1^2-4*a0*a2 =
+      // 16*A*(as^2-sin(w0)^2) = -8*A*sin(w0)^2.  Thus, the poles are always
+      // complex except if w0 = 0, in which case there is a repeated pole at 0.
+
+      // Array of tests to run.  |descripton| is the task description for
+      // audit.define.  |parameters| is option for |testTailTime|.
+      let tests = [
+        {
+          descripton:
+              {label: 'highshelf-complex-roots', description: 'complex roots'},
+          parameters: {
+            prefix: 'Highshelf complex roots',
+            filterOptions:
+                {type: 'highshelf', gain: 40, frequency: sampleRate / 8},
+            // Node computed tail frame is 18.6 frames, which matches the actual
+            // tail, so tail output should be exactly zero.
+            threshold: 0
+          }
+        },
+        {
+          descripton: {
+            label: 'highshelf-repeated-roots',
+            description: 'repeated real root'
+          },
+          parameters: {
+            prefix: 'Highshelf repeated roots',
+            filterOptions: {type: 'highshelf', gain: 40, frequency: 0},
+            // Node computed tail frame is 2 frames, which matches the actual
+            // tail, so tail output should be exactly zero.
+            threshold: 0
+          }
+        },
+      ];
+
+      // Define an appropriate task for each test.
+      tests.forEach(entry => {
+        audit.define(entry.descripton, (task, should) => {
+          let context = new OfflineAudioContext(1, renderFrames, sampleRate);
+          testTailTime(should, context, entry.parameters)
+              .then(() => task.done());
+        });
+      });
+
+      audit.run();
+    </script>
+  </body>
+</html>
diff --git a/third_party/WebKit/LayoutTests/webaudio/BiquadFilter/tail-time-lowpass.html b/third_party/WebKit/LayoutTests/webaudio/BiquadFilter/tail-time-lowpass.html
new file mode 100644
index 0000000..dc042637
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/webaudio/BiquadFilter/tail-time-lowpass.html
@@ -0,0 +1,168 @@
+<!doctype html>
+<html>
+  <head>
+    <title>Test Biquad Tail-Time</title>
+    <script src="../../resources/testharness.js"></script>
+    <script src="../../resources/testharnessreport.js"></script>
+    <script src="../resources/audit-util.js"></script>
+    <script src="../resources/audit.js"></script>
+    <script src="../resources/biquad-filters.js"></script>
+    <script src="test-tail-time.js"></script>
+  </head>
+
+  <body>
+    <script>
+      let audit = Audit.createTaskRunner();
+
+      let sampleRate = 16384;
+      let renderSeconds = 1;
+
+      // For a lowpass filter:
+      //   b0 = (1-cos(w0))/2
+      //   b1 = 1-cos(w0)
+      //   b2 = (1-cos(w0))/2
+      //   a0 = 1 + alpha
+      //   a1 = -2*cos(w0)
+      //   a2 = 1 - alpha
+      //
+      // where alpha = sin(w0)/(2*10^(Q/20)) and w0 = 2*%pi*f0/Fs.
+      //
+      // Equivalently a1 = -2*cos(w0)/(1+alpha), a2 = (1-alpha)/(1+alpha).  The
+      // poles of this filter are at
+      //
+      //   cos(w0)/(1+alpha) +/- sqrt(alpha^2-sin(w0)^2)/(1+alpha)
+      //
+      // But alpha^2-sin(w0)^2 = sin(w0)^2*(1/4/10^(Q/10) - 1).  Thus the poles
+      // are complex if 1/4/10^(Q/10) < 1; real distinct if 1/4/10^(Q/10) > 1;
+      // and repeated if 1/4/10^(Q/10) = 1.
+
+      // Array of tests to run.  |descripton| is the task description for
+      // audit.define.  |parameters| is option for |testTailTime|.
+      let tests = [
+        {
+          descripton:
+              {label: 'lpf-complex-roots', description: 'complex roots'},
+          sampleRate: sampleRate,
+          renderDuration: renderSeconds,
+          parameters: {
+            prefix: 'LPF complex roots',
+            filterOptions: {type: 'lowpass', Q: 40, frequency: sampleRate / 4}
+          },
+          // Node computed tail frame is 2079.4 which matches the real tail, so
+          // tail output should be exactly 0.
+          threshold: 0,
+        },
+        {
+          descripton: {
+            label: 'lpf-real-distinct-roots',
+            description: 'real distinct roots'
+          },
+          sampleRate: sampleRate,
+          renderDuration: renderSeconds,
+          parameters: {
+            prefix: 'LPF real distinct roots',
+            filterOptions:
+                {type: 'lowpass', Q: -50, frequency: sampleRate / 8}
+          },
+          // Node computed tail frame is 1699 which matches the real tail, so
+          // tail output should be exactly 0.
+          threshold: 0,
+        },
+        {
+          descripton:
+              {label: 'lpf-repeated-root', description: 'repeated real root'},
+          sampleRate: sampleRate,
+          renderDuration: renderSeconds,
+          parameters: {
+            prefix: 'LPF repeated roots (approximately)',
+            // For a repeated root, we need 1/4/10^(Q/10) = 1, or Q =
+            // -10*log(4)/log(10). This isn't exactly representable as a float,
+            // we the roots might not actually be repeated.  In fact the roots
+            // are actually complex at 6.402396e-5*exp(i*1.570796).
+            filterOptions: {
+              type: 'lowpass',
+              Q: -10 * Math.log10(4),
+              frequency: sampleRate / 4
+            }
+          },
+          // Node computed tail frame is 2.9 which matches the real tail, so
+          // tail output should be exactly 0.
+          threshold: 0,
+        },
+        {
+          descripton: {label: 'lpf-real-roots-2', description: 'complex roots'},
+          sampleRate: sampleRate,
+          renderDuration: renderSeconds,
+          parameters: {
+            prefix: 'LPF repeated roots 2',
+            // This tests an extreme case where approximate impulse response is
+            // h(n) = C*r^(n-1) and C < 1/32768.  Thus, the impulse response is
+            // always less than the response threshold of 1/32768.
+            filterOptions:
+                {type: 'lowpass', Q: -100, frequency: sampleRate / 4}
+          },
+          // Node computed tail frame is 0 which matches the real tail, so
+          // tail output should be exactly 0.
+          threshold: 0,
+        },
+        {
+          descripton: 'huge tail',
+          // The BiquadFilter has an internal maximum tail of 30 sec so we want
+          // to render for at least 30 sec to test this.  Use the smallest
+          // sample rate we can to limit memory and CPU usage!
+          sampleRate: 3000,
+          renderDuration: 31,
+          parameters: {
+            prefix: 'LPF repeated roots (approximately)',
+            hugeTaileTime: true,
+            // For the record, for this lowpass filter, the computed tail time
+            // is approximately 2830.23 sec, with poles at
+            // 0.999998960442086*exp(i*0.209439510236777). This is very close to
+            // being marginally stable.
+            filterOptions: {
+              type: 'lowpass',
+              Q: 100,
+              frequency: 100,
+            },
+            // Node computed tail frame is 8.49069e6 which is clamped to 30 sec
+            // so tail output should be exactly 0 after 30 sec.
+            threshold: 0,
+          },
+        },
+        {
+          descripton: 'ginormous tail',
+          // Or this lowpass filter, the complex poles are actually computed to
+          // be on the unit circle so the tail infinite.  This just tests that
+          // nothing bad happens in computing the tail time. Thus, any small
+          // sample rate and short duration for the test; the results aren't
+          // really interesting. (But they must pass, of course!)
+          sampleRate: 3000,
+          renderDuration: 0.25,
+          parameters: {
+            prefix: 'LPF repeated roots (approximately)',
+            filterOptions: {
+              type: 'lowpass',
+              Q: 500,
+              frequency: 100,
+            },
+          },
+          // Node computed tail frame is 90000 which matches the real tail, so
+          // tail output should be exactly 0.
+          threshold: 0,
+        }
+      ]
+
+      // Define an appropriate task for each test.
+      tests.forEach(entry => {
+        audit.define(entry.descripton, (task, should) => {
+          let context = new OfflineAudioContext(
+              1, entry.renderDuration * entry.sampleRate, entry.sampleRate);
+          testTailTime(should, context, entry.parameters)
+              .then(() => task.done());
+        });
+      });
+
+      audit.run();
+    </script>
+  </body>
+</html>
diff --git a/third_party/WebKit/LayoutTests/webaudio/BiquadFilter/tail-time-lowshelf.html b/third_party/WebKit/LayoutTests/webaudio/BiquadFilter/tail-time-lowshelf.html
new file mode 100644
index 0000000..b8af1f3
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/webaudio/BiquadFilter/tail-time-lowshelf.html
@@ -0,0 +1,83 @@
+<!doctype html>
+<html>
+  <head>
+    <title>Test Biquad Tail-Time</title>
+    <script src="../../resources/testharness.js"></script>
+    <script src="../../resources/testharnessreport.js"></script>
+    <script src="../resources/audit-util.js"></script>
+    <script src="../resources/audit.js"></script>
+    <script src="../resources/biquad-filters.js"></script>
+    <script src="test-tail-time.js"></script>
+  </head>
+
+  <body>
+    <script>
+      let audit = Audit.createTaskRunner();
+
+      let sampleRate = 16384;
+      let renderSeconds = 1;
+      let renderFrames = renderSeconds * sampleRate;
+      let renderQuantumFrames = 128;
+
+      // For a lowshelf filter:
+      //   b0 = A*[(A+1)−(A−1)*cos(w0)+2*as*sqrt(A)]
+      //   b1 = 2*A*[(A+1)-(A-1)*cos(w0)]
+      //   b2 = A*[(A+1)−(A−1)*cos(w0)-2*as*sqrt(A)]
+      //   a0 = (A+1)+(A-1)*cos(w0)+2*as*sqrt(A)
+      //   a1 = -2*[(A-1)+(A+1)*cos(w0)]
+      //   a2 = (A+1)+(A-1)*cos(w0)-2*as*sqrt(A)
+      //
+      // where as = sin(w0)/sqrt(2), w0 = 2*%pi*f0/Fs, and A = 10^(G/40)
+      //
+      // The poles of this filter are
+      //
+      //   -a2/(2*a0) +/- sqrt(a1^2-4*a0*a2)/(2*a0).
+      //
+      // Thus, the poles depend on the sign of d = a1^2-4*a0*a2 =
+      // 16*A*(as^2-sin(w0)^2) = -8*A*sin(w0)^2.  Thus, the poles are always
+      // complex except if w0 = 0, in which case there is a repeated pole at 0.
+
+      // Array of tests to run.  |descripton| is the task description for
+      // audit.define.  |parameters| is option for |testTailTime|.
+      let tests = [
+        {
+          descripton:
+              {label: 'lowshelf-complex-roots', description: 'complex roots'},
+          parameters: {
+            prefix: 'Lowshelf complex roots',
+            filterOptions:
+                {type: 'lowshelf', gain: 40, frequency: sampleRate / 8},
+            // Node computed tail frame is 75.5 frames, which matches the actual
+            // tail, so tail output should be exactly zero.
+            threshold: 0
+          },
+        },
+        {
+          descripton: {
+            label: 'lowshelf-repeated-roots',
+            description: 'repeated real root'
+          },
+          parameters: {
+            prefix: 'Lowshelf repeated roots',
+            filterOptions:
+                {type: 'lowshelf', Q: 1 / 20, gain: 40, frequency: 0},
+            // Node computed tail frame is 2 frames, which matches the actual
+            // tail, so tail output should be exactly zero.
+            threshold: 0
+          },
+        },
+      ];
+
+      // Define an appropriate task for each test.
+      tests.forEach(entry => {
+        audit.define(entry.descripton, (task, should) => {
+          let context = new OfflineAudioContext(1, renderFrames, sampleRate);
+          testTailTime(should, context, entry.parameters)
+              .then(() => task.done());
+        });
+      });
+
+      audit.run();
+    </script>
+  </body>
+</html>
diff --git a/third_party/WebKit/LayoutTests/webaudio/BiquadFilter/tail-time-notch.html b/third_party/WebKit/LayoutTests/webaudio/BiquadFilter/tail-time-notch.html
new file mode 100644
index 0000000..0b38d4bc
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/webaudio/BiquadFilter/tail-time-notch.html
@@ -0,0 +1,98 @@
+<!doctype html>
+<html>
+  <head>
+    <title>Test Biquad Tail-Time</title>
+    <script src="../../resources/testharness.js"></script>
+    <script src="../../resources/testharnessreport.js"></script>
+    <script src="../resources/audit-util.js"></script>
+    <script src="../resources/audit.js"></script>
+    <script src="../resources/biquad-filters.js"></script>
+    <script src="test-tail-time.js"></script>
+  </head>
+
+  <body>
+    <script>
+      let audit = Audit.createTaskRunner();
+
+      let sampleRate = 16384;
+      let renderSeconds = 1;
+      let renderFrames = renderSeconds * sampleRate;
+      let renderQuantumFrames = 128;
+
+      // For a notch filter:
+      //   b0 = 1
+      //   b1 = -2*cos(w0)
+      //   b2 = 1
+      //   a0 = 1 + alpha
+      //   a1 = -2*cos(w0)
+      //   a2 = 1 - alpha
+      //
+      // where alpha = sin(w0)/(2*Q) and w0 = 2*%pi*f0/Fs.
+      //
+      // Equivalently a1 = -2*cos(w0)/(1+alpha), a2 = (1-alpha)/(1+alpha).  The
+      // poles of this filter are at
+      //
+      //   (2*Q*cos(w0) +/- sqrt(1-4*Q^2)*sin(w0))/(2*Q + sin(w0))
+      //
+      // Thus, if 1-4*Q^2 < 0, the poles are complex.  For 1-4*Q^2 > 0, the
+      // poles are real and distinct.  For 1-4*Q^2 = 0, there are two identical
+      // real poles.
+
+      // Array of tests to run.  |descripton| is the task description for
+      // audit.define.  |parameters| is option for |testTailTime|.
+      let tests = [
+        {
+          descripton:
+              {label: 'notch-complex-roots', description: 'complex roots'},
+          parameters: {
+            prefix: 'Notch complex roots',
+            filterOptions: {type: 'notch', Q: 200, frequency: sampleRate / 4},
+            // Node computed tail frame is 2039.5 frames, which matches the
+            // actual tail, so tail output should be exactly zero.
+            threshold: 0
+          },
+        },
+        {
+          descripton: {
+            label: 'notch-real-distinct-roots',
+            description: 'real distinct roots'
+          },
+          parameters: {
+            prefix: 'Notch real distinct roots',
+            filterOptions: {type: 'notch', Q: 0.001, frequency: sampleRate / 4},
+            // Node computed tail frame is 2437 frames, which matches the actual
+            // tail, so tail output should be exactly zero.
+            threshold: 0
+          },
+        },
+        {
+          descripton: {
+            label: 'notch-repeated-roots',
+            description: 'repeated real root'
+          },
+          parameters: {
+            prefix: 'Notch repeated roots',
+            // Note that while the roots are mathematically repeated,
+            // numerical roundoff in compute the filter coefficients causes
+            // the resulting filter to have roots at 0 and 6.123e-17.
+            filterOptions: {type: 'notch', Q: 0.5, frequency: sampleRate / 4},
+            // Node computed tail frame is 2 frames, which matches the actual
+            // tail, so tail output should be exactly zero.
+            threshold: 0
+          }
+        },
+      ];
+
+      // Define an appropriate task for each test.
+      tests.forEach(entry => {
+        audit.define(entry.descripton, (task, should) => {
+          let context = new OfflineAudioContext(1, renderFrames, sampleRate);
+          testTailTime(should, context, entry.parameters)
+              .then(() => task.done());
+        });
+      });
+
+      audit.run();
+    </script>
+  </body>
+</html>
diff --git a/third_party/WebKit/LayoutTests/webaudio/BiquadFilter/tail-time-peaking.html b/third_party/WebKit/LayoutTests/webaudio/BiquadFilter/tail-time-peaking.html
new file mode 100644
index 0000000..973d8361
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/webaudio/BiquadFilter/tail-time-peaking.html
@@ -0,0 +1,115 @@
+<!doctype html>
+<html>
+  <head>
+    <title>Test Biquad Tail-Time</title>
+    <script src="../../resources/testharness.js"></script>
+    <script src="../../resources/testharnessreport.js"></script>
+    <script src="../resources/audit-util.js"></script>
+    <script src="../resources/audit.js"></script>
+    <script src="../resources/biquad-filters.js"></script>
+    <script src="test-tail-time.js"></script>
+  </head>
+
+  <body>
+    <script>
+      let audit = Audit.createTaskRunner();
+
+      let sampleRate = 16384;
+      let renderSeconds = 1;
+      let renderFrames = renderSeconds * sampleRate;
+
+      // For a peaking filter:
+      //   b0 = 1 - alpha*A
+      //   b1 = -2*cos(w0)
+      //   b2 = 1 + alpha*A
+      //   a0 = 1 + alpha/A
+      //   a1 = -2*cos(w0)
+      //   a2 = 1 - alpha/A
+      //
+      // where alpha = sin(w0)/(2*Q), w0 = 2*%pi*f0/Fs, and A = 10^(G/40)
+      //
+      // Equivalently a1 = -2*cos(w0)/(1+alpha/A), a2 = (1-alpha/A)/(1+alpha/A).
+      // The poles of this filter are at
+      //
+      //   A*cos(w0)/(A + alpha) +/- sqrt(alpha^2-A^2*sin(w0)^2)/(A + alpha)
+      //
+      // But alpha^2-A^2*sin(w0)^2 = sin(w0)^2*(1/4/Q^2-1).
+      // Thus, the poles are complex if 1/(4*Q^2) < A^2; real and distinct if
+      // 1/(4*Q^2)>A^2; and repeated if 1/(4*Q^2) = A^2 or w0 = 0.
+
+      // Array of tests to run.  |descripton| is the task description for
+      // audit.define.  |parameters| is option for |testTailTime|.
+      let tests = [
+        {
+          descripton:
+              {label: 'peaking-complex-roots', description: 'complex roots'},
+          parameters: {
+            prefix: 'Peaking complex roots',
+            // A gain of 40 gives A = 10.
+            filterOptions:
+                {type: 'peaking', Q: 10, gain: 40, frequency: sampleRate / 4},
+            // Node computed tail frame is 2077.4 frames, which matches the
+            // actual tail, so tail output should be exactly zero.
+            threshold: 0
+          }
+        },
+        {
+          descripton: {
+            label: 'peaking-real-distinct-roots',
+            description: 'real distinct roots'
+          },
+          parameters: {
+            prefix: 'Peaking real distinct roots',
+            filterOptions: {
+              type: 'peaking',
+              Q: 0.001,
+              gain: 40,
+              frequency: sampleRate / 4
+            },
+            // Node computed tail frame is 588 frames, which matches the actual
+            // tail, so tail output should be exactly zero.
+            threshold: 0
+          }
+        },
+        {
+          descripton: {
+            label: 'peaking-repeated-roots',
+            description: 'repeated real root'
+          },
+          parameters: {
+            prefix: 'Peaking repeated roots',
+            filterOptions:
+                {type: 'peaking', Q: 1 / 2, gain: 0, frequency: sampleRate / 8},
+            // Node computed tail frame is 0 frames, which matches the actual
+            // tail, so tail output should be exactly zero.
+            threshold: 0
+
+          }
+        },
+        {
+          descripton: {
+            label: 'peaking-repeated-roots 2',
+            description: 'repeated real root'
+          },
+          parameters: {
+            prefix: 'Peaking repeated roots 2',
+            filterOptions: {type: 'peaking', Q: 1, gain: 40, frequency: 0},
+            // Node computed tail frame is 1 frames, which matches the actual
+            // tail, so tail output should be exactly zero.
+            threshold: 0
+          }
+        }
+      ];
+
+      // Define an appropriate task for each test.
+      tests.forEach(entry => {
+        audit.define(entry.descripton, (task, should) => {
+          let context = new OfflineAudioContext(1, renderFrames, sampleRate);
+          testTailTime(should, context, entry.parameters).then(() => task.done());
+        });
+      });
+
+      audit.run();
+    </script>
+  </body>
+</html>
diff --git a/third_party/WebKit/LayoutTests/webaudio/BiquadFilter/test-tail-time.js b/third_party/WebKit/LayoutTests/webaudio/BiquadFilter/test-tail-time.js
new file mode 100644
index 0000000..94f1449
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/webaudio/BiquadFilter/test-tail-time.js
@@ -0,0 +1,90 @@
+function testTailTime(should, context, options) {
+  let src = new ConstantSourceNode(context, {offset: 1});
+  let f = new BiquadFilterNode(context, options.filterOptions);
+
+  src.connect(f).connect(context.destination);
+  src.start();
+  src.stop(1 / context.sampleRate);
+
+  let expectedTailFrame = computeTailFrame(f);
+
+  // The internal Biquad time computation limits he tail time to a
+  // maximum of 30 sec. We need to limit the computed tail frame to
+  // that limit as well.
+  expectedTailFrame = Math.min(expectedTailFrame, 30 * context.sampleRate);
+
+  return context.startRendering().then(renderedBuffer => {
+    let s = renderedBuffer.getChannelData(0);
+    let prefix = options.prefix + ': Biquad(' +
+        JSON.stringify(options.filterOptions) + ')';
+
+    // Round actual tail frame to a render boundary
+    let quantumIndex = Math.floor(expectedTailFrame / RENDER_QUANTUM_FRAMES);
+    let expectedTailBoundary = RENDER_QUANTUM_FRAMES * quantumIndex;
+
+    // Find the actual tail frame.  That is, the last point where the
+    // output is not zero.
+    let actualTailFrame;
+
+    for (actualTailFrame = s.length; actualTailFrame > 0; --actualTailFrame) {
+      if (Math.abs(s[actualTailFrame - 1]) > 0)
+        break;
+    }
+
+    should(actualTailFrame, `${prefix}: Actual Tail Frame ${actualTailFrame}`)
+        .beGreaterThanOrEqualTo(expectedTailFrame);
+
+    // Verify each render quanta is not identically zero up to the
+    // boundary.
+    for (let k = 0; k <= quantumIndex; ++k) {
+      let firstFrame = RENDER_QUANTUM_FRAMES * k;
+      let lastFrame = firstFrame + RENDER_QUANTUM_FRAMES - 1;
+      should(
+          s.slice(firstFrame, lastFrame + 1),
+          `${prefix}: output[${firstFrame}:${lastFrame}]`)
+          .notBeConstantValueOf(0);
+    }
+    // The frames after the tail should be zero.  Because the
+    // implementation uses approximations to simplify the
+    // computations, the nodes tail time may be greater than the real
+    // impulse response tail.  Thus, we just verify that the output
+    // over the tail is less than the tail threshold value.
+    let zero = new Float32Array(s.length);
+    should(
+        s.slice(expectedTailBoundary + RENDER_QUANTUM_FRAMES + 256),
+        prefix + ': output[' +
+            (expectedTailBoundary + RENDER_QUANTUM_FRAMES + 256) + ':]')
+        .beCloseToArray(
+            zero.slice(expectedTailBoundary + RENDER_QUANTUM_FRAMES + 256),
+            {absoluteThreshold: options.threshold || 0});
+  })
+}
+
+function computeTailFrame(filterNode) {
+  // Compute the impuluse response for the filter |filterNode| by
+  // filtering the impulse directly ourself.
+  let coef = createFilter(
+      filterNode.type,
+      filterNode.frequency.value / filterNode.context.sampleRate * 2,
+      filterNode.Q.value, filterNode.gain.value);
+
+  let impulse = new Float32Array(filterNode.context.length);
+  impulse[0] = 1;
+
+  let filtered = filterData(coef, impulse, impulse.length);
+
+  // Compute the magnitude and find out where the imuplse is small enough.
+  let tailFrame = 0;
+  if (Math.abs(filtered[filtered.length - 1]) >= 1 / 32768) {
+    tailFrame = filtered.length - 1;
+  } else {
+    for (let k = filtered.length - 1; k >= 0; --k) {
+      if (Math.abs(filtered[k]) >= 1 / 32768) {
+        tailFrame = k + 1;
+        break;
+      }
+    }
+  }
+
+  return tailFrame;
+}
diff --git a/third_party/WebKit/LayoutTests/webaudio/resources/audit-util.js b/third_party/WebKit/LayoutTests/webaudio/resources/audit-util.js
index 671bcf1..1e39c87 100644
--- a/third_party/WebKit/LayoutTests/webaudio/resources/audit-util.js
+++ b/third_party/WebKit/LayoutTests/webaudio/resources/audit-util.js
@@ -8,6 +8,8 @@
  *                test.
  */
 
+// How many frames in a WebAudio render quantum.
+let RENDER_QUANTUM_FRAMES = 128;
 
 function writeString(s, a, offset) {
   for (let i = 0; i < s.length; ++i) {
diff --git a/third_party/WebKit/Source/core/css/AffectedByPseudoTest.cpp b/third_party/WebKit/Source/core/css/AffectedByPseudoTest.cpp
index 7679aff..f4837ca 100644
--- a/third_party/WebKit/Source/core/css/AffectedByPseudoTest.cpp
+++ b/third_party/WebKit/Source/core/css/AffectedByPseudoTest.cpp
@@ -22,7 +22,6 @@
  protected:
   struct ElementResult {
     const blink::HTMLQualifiedName tag;
-    bool affected_by;
     bool children_or_siblings_affected_by;
   };
 
@@ -61,8 +60,6 @@
        element = Traversal<HTMLElement>::Next(*element), ++i) {
     ASSERT_TRUE(element->HasTagName(expected[i].tag));
     DCHECK(element->GetComputedStyle());
-    ASSERT_EQ(expected[i].affected_by,
-              element->GetComputedStyle()->AffectedByFocus());
     ASSERT_EQ(expected[i].children_or_siblings_affected_by,
               element->ChildrenOrSiblingsAffectedByFocus());
   }
@@ -71,34 +68,14 @@
   DCHECK_EQ(i, expected_count);
 }
 
-// A global :focus rule in html.css currently causes every single element to be
-// affectedByFocus. Check that all elements in a document with no :focus rules
-// gets the affectedByFocus set on ComputedStyle and not
-// childrenOrSiblingsAffectedByFocus.
-TEST_F(AffectedByPseudoTest, UAUniversalFocusRule) {
-  ElementResult expected[] = {{bodyTag, true, false},
-                              {divTag, true, false},
-                              {divTag, true, false},
-                              {divTag, true, false},
-                              {spanTag, true, false}};
-
-  SetHtmlInnerHTML(
-      "<body>"
-      "<div><div></div></div>"
-      "<div><span></span></div>"
-      "</body>");
-
-  CheckElementsForFocus(expected, sizeof(expected) / sizeof(ElementResult));
-}
-
 // ":focus div" will mark ascendants of all divs with
 // childrenOrSiblingsAffectedByFocus.
 TEST_F(AffectedByPseudoTest, FocusedAscendant) {
-  ElementResult expected[] = {{bodyTag, true, true},
-                              {divTag, true, true},
-                              {divTag, true, false},
-                              {divTag, true, false},
-                              {spanTag, true, false}};
+  ElementResult expected[] = {{bodyTag, true},
+                              {divTag, true},
+                              {divTag, false},
+                              {divTag, false},
+                              {spanTag, false}};
 
   SetHtmlInnerHTML(
       "<head>"
@@ -115,11 +92,11 @@
 // "body:focus div" will mark the body element with
 // childrenOrSiblingsAffectedByFocus.
 TEST_F(AffectedByPseudoTest, FocusedAscendantWithType) {
-  ElementResult expected[] = {{bodyTag, true, true},
-                              {divTag, true, false},
-                              {divTag, true, false},
-                              {divTag, true, false},
-                              {spanTag, true, false}};
+  ElementResult expected[] = {{bodyTag, true},
+                              {divTag, false},
+                              {divTag, false},
+                              {divTag, false},
+                              {spanTag, false}};
 
   SetHtmlInnerHTML(
       "<head>"
@@ -139,11 +116,11 @@
 // is checked and the childrenOrSiblingsAffectedByFocus flag set before the
 // negated type selector is found.
 TEST_F(AffectedByPseudoTest, FocusedAscendantWithNegatedType) {
-  ElementResult expected[] = {{bodyTag, true, false},
-                              {divTag, true, true},
-                              {divTag, true, false},
-                              {divTag, true, false},
-                              {spanTag, true, false}};
+  ElementResult expected[] = {{bodyTag, false},
+                              {divTag, true},
+                              {divTag, false},
+                              {divTag, false},
+                              {spanTag, false}};
 
   SetHtmlInnerHTML(
       "<head>"
@@ -164,10 +141,8 @@
 // though none of the children are affected. There are other mechanisms that
 // makes sure the sibling also gets its styles recalculated.
 TEST_F(AffectedByPseudoTest, FocusedSibling) {
-  ElementResult expected[] = {{bodyTag, true, false},
-                              {divTag, true, true},
-                              {spanTag, true, false},
-                              {divTag, true, false}};
+  ElementResult expected[] = {
+      {bodyTag, false}, {divTag, true}, {spanTag, false}, {divTag, false}};
 
   SetHtmlInnerHTML(
       "<head>"
diff --git a/third_party/WebKit/Source/core/css/CSSDefaultStyleSheets.cpp b/third_party/WebKit/Source/core/css/CSSDefaultStyleSheets.cpp
index e0ba880..694cc60 100644
--- a/third_party/WebKit/Source/core/css/CSSDefaultStyleSheets.cpp
+++ b/third_party/WebKit/Source/core/css/CSSDefaultStyleSheets.cpp
@@ -90,6 +90,15 @@
                         LayoutTheme::GetTheme().ExtraQuirksStyleSheet();
   quirks_style_sheet_ = ParseUASheet(quirks_rules);
   default_quirks_style_->AddRulesFromSheet(QuirksStyleSheet(), ScreenEval());
+
+#if DCHECK_IS_ON()
+  default_style_->CompactRulesIfNeeded();
+  default_print_style_->CompactRulesIfNeeded();
+  default_quirks_style_->CompactRulesIfNeeded();
+  DCHECK(default_style_->UniversalRules()->IsEmpty());
+  DCHECK(default_print_style_->UniversalRules()->IsEmpty());
+  DCHECK(default_quirks_style_->UniversalRules()->IsEmpty());
+#endif
 }
 
 RuleSet* CSSDefaultStyleSheets::DefaultViewSourceStyle() {
diff --git a/third_party/WebKit/Source/core/css/CSSPrimitiveValueMappings.h b/third_party/WebKit/Source/core/css/CSSPrimitiveValueMappings.h
index 70fe4f8..2b0f5a4 100644
--- a/third_party/WebKit/Source/core/css/CSSPrimitiveValueMappings.h
+++ b/third_party/WebKit/Source/core/css/CSSPrimitiveValueMappings.h
@@ -2744,7 +2744,9 @@
     : CSSValue(kIdentifierClass) {
   switch (item_position) {
     case kItemPositionAuto:
-      value_id_ = CSSValueAuto;
+      // The 'auto' values might have been already resolved.
+      NOTREACHED();
+      value_id_ = CSSValueNormal;
       break;
     case kItemPositionNormal:
       value_id_ = CSSValueNormal;
diff --git a/third_party/WebKit/Source/core/css/ComputedStyleCSSValueMapping.cpp b/third_party/WebKit/Source/core/css/ComputedStyleCSSValueMapping.cpp
index 76d4faa..5b39e1a 100644
--- a/third_party/WebKit/Source/core/css/ComputedStyleCSSValueMapping.cpp
+++ b/third_party/WebKit/Source/core/css/ComputedStyleCSSValueMapping.cpp
@@ -503,7 +503,13 @@
   CSSValueList* result = CSSValueList::CreateSpaceSeparated();
   if (data.PositionType() == kLegacyPosition)
     result->Append(*CSSIdentifierValue::Create(CSSValueLegacy));
-  if (data.GetPosition() == kItemPositionBaseline) {
+  if (data.GetPosition() == kItemPositionAuto) {
+    // To avoid needing to copy the RareNonInheritedData, we repurpose the
+    // 'auto' flag to not just mean 'auto' prior to running the StyleAdjuster
+    // but also mean 'normal' after running it.
+    result->Append(*CSSIdentifierValue::Create(
+        ComputedStyle::InitialDefaultAlignment().GetPosition()));
+  } else if (data.GetPosition() == kItemPositionBaseline) {
     result->Append(
         *CSSValuePair::Create(CSSIdentifierValue::Create(CSSValueBaseline),
                               CSSIdentifierValue::Create(CSSValueBaseline),
@@ -2607,10 +2613,7 @@
     case CSSPropertyIsolation:
       return CSSIdentifierValue::Create(style.Isolation());
     case CSSPropertyJustifyItems:
-      return ValueForItemPositionWithOverflowAlignment(
-          style.JustifyItems().GetPosition() == kItemPositionAuto
-              ? ComputedStyle::InitialDefaultAlignment()
-              : style.JustifyItems());
+      return ValueForItemPositionWithOverflowAlignment(style.JustifyItems());
     case CSSPropertyJustifySelf:
       return ValueForItemPositionWithOverflowAlignment(style.JustifySelf());
     case CSSPropertyLeft:
diff --git a/third_party/WebKit/Source/core/css/ComputedStyleExtraFields.json5 b/third_party/WebKit/Source/core/css/ComputedStyleExtraFields.json5
index 0f46ad8..8038a50 100644
--- a/third_party/WebKit/Source/core/css/ComputedStyleExtraFields.json5
+++ b/third_party/WebKit/Source/core/css/ComputedStyleExtraFields.json5
@@ -85,13 +85,6 @@
     },
     // Whether this style is affected by these pseudo-classes.
     {
-      name: "AffectedByFocus",
-      field_template: "monotonic_flag",
-      default_value: "false",
-      custom_copy: true,
-      custom_compare: true,
-    },
-    {
       name: "AffectedByFocusWithin",
       field_template: "monotonic_flag",
       default_value: "false",
diff --git a/third_party/WebKit/Source/core/css/RuleSet.cpp b/third_party/WebKit/Source/core/css/RuleSet.cpp
index ad60c3d..a3ae17a 100644
--- a/third_party/WebKit/Source/core/css/RuleSet.cpp
+++ b/third_party/WebKit/Source/core/css/RuleSet.cpp
@@ -147,11 +147,12 @@
   rules->Push(rule_data);
 }
 
-static void ExtractValuesforSelector(const CSSSelector* selector,
-                                     AtomicString& id,
-                                     AtomicString& class_name,
-                                     AtomicString& custom_pseudo_element_name,
-                                     AtomicString& tag_name) {
+static void ExtractSelectorValues(const CSSSelector* selector,
+                                  AtomicString& id,
+                                  AtomicString& class_name,
+                                  AtomicString& custom_pseudo_element_name,
+                                  AtomicString& tag_name,
+                                  CSSSelector::PseudoType& pseudo_type) {
   switch (selector->Match()) {
     case CSSSelector::kId:
       id = selector->Value();
@@ -163,12 +164,31 @@
       if (selector->TagQName().LocalName() != g_star_atom)
         tag_name = selector->TagQName().LocalName();
       break;
+    case CSSSelector::kPseudoClass:
+    case CSSSelector::kPseudoElement:
+    case CSSSelector::kPagePseudoClass:
+      // Must match the cases in RuleSet::FindBestRuleSetAndAdd.
+      switch (selector->GetPseudoType()) {
+        case CSSSelector::kPseudoCue:
+        case CSSSelector::kPseudoLink:
+        case CSSSelector::kPseudoVisited:
+        case CSSSelector::kPseudoAnyLink:
+        case CSSSelector::kPseudoFocus:
+        case CSSSelector::kPseudoPlaceholder:
+        case CSSSelector::kPseudoHost:
+        case CSSSelector::kPseudoHostContext:
+          pseudo_type = selector->GetPseudoType();
+          break;
+        case CSSSelector::kPseudoWebKitCustomElement:
+        case CSSSelector::kPseudoBlinkInternalElement:
+          custom_pseudo_element_name = selector->Value();
+          break;
+        default:
+          break;
+      }
     default:
       break;
   }
-  if (selector->GetPseudoType() == CSSSelector::kPseudoWebKitCustomElement ||
-      selector->GetPseudoType() == CSSSelector::kPseudoBlinkInternalElement)
-    custom_pseudo_element_name = selector->Value();
 }
 
 bool RuleSet::FindBestRuleSetAndAdd(const CSSSelector& component,
@@ -177,6 +197,7 @@
   AtomicString class_name;
   AtomicString custom_pseudo_element_name;
   AtomicString tag_name;
+  CSSSelector::PseudoType pseudo_type = CSSSelector::kPseudoUnknown;
 
 #ifndef NDEBUG
   all_rules_.push_back(rule_data);
@@ -184,26 +205,30 @@
 
   const CSSSelector* it = &component;
   for (; it && it->Relation() == CSSSelector::kSubSelector;
-       it = it->TagHistory())
-    ExtractValuesforSelector(it, id, class_name, custom_pseudo_element_name,
-                             tag_name);
-  if (it)
-    ExtractValuesforSelector(it, id, class_name, custom_pseudo_element_name,
-                             tag_name);
+       it = it->TagHistory()) {
+    ExtractSelectorValues(it, id, class_name, custom_pseudo_element_name,
+                          tag_name, pseudo_type);
+  }
+  if (it) {
+    ExtractSelectorValues(it, id, class_name, custom_pseudo_element_name,
+                          tag_name, pseudo_type);
+  }
 
   // Prefer rule sets in order of most likely to apply infrequently.
   if (!id.IsEmpty()) {
     AddToRuleSet(id, EnsurePendingRules()->id_rules, rule_data);
     return true;
   }
+
   if (!class_name.IsEmpty()) {
     AddToRuleSet(class_name, EnsurePendingRules()->class_rules, rule_data);
     return true;
   }
+
   if (!custom_pseudo_element_name.IsEmpty()) {
     // Custom pseudos come before ids and classes in the order of tagHistory,
     // and have a relation of ShadowPseudo between them. Therefore we should
-    // never be a situation where extractValuesforSelector finsd id and
+    // never be a situation where ExtractSelectorValues finds id and
     // className in addition to custom pseudo.
     DCHECK(id.IsEmpty());
     DCHECK(class_name.IsEmpty());
@@ -212,7 +237,7 @@
     return true;
   }
 
-  switch (component.GetPseudoType()) {
+  switch (pseudo_type) {
     case CSSSelector::kPseudoCue:
       cue_pseudo_rules_.push_back(rule_data);
       return true;
@@ -227,6 +252,10 @@
     case CSSSelector::kPseudoPlaceholder:
       placeholder_pseudo_rules_.push_back(rule_data);
       return true;
+    case CSSSelector::kPseudoHost:
+    case CSSSelector::kPseudoHostContext:
+      shadow_host_rules_.push_back(rule_data);
+      return true;
     default:
       break;
   }
@@ -236,11 +265,6 @@
     return true;
   }
 
-  if (component.IsHostPseudoClass()) {
-    shadow_host_rules_.push_back(rule_data);
-    return true;
-  }
-
   return false;
 }
 
diff --git a/third_party/WebKit/Source/core/css/RuleSetTest.cpp b/third_party/WebKit/Source/core/css/RuleSetTest.cpp
index 7190d6ff..31798e2 100644
--- a/third_party/WebKit/Source/core/css/RuleSetTest.cpp
+++ b/third_party/WebKit/Source/core/css/RuleSetTest.cpp
@@ -196,6 +196,50 @@
   ASSERT_EQ(0u, rules->size());
 }
 
+TEST(RuleSetTest, findBestRuleSetAndAdd_Focus) {
+  CSSTestHelper helper;
+
+  helper.AddCSSRules(":focus { }");
+  helper.AddCSSRules("[attr]:focus { }");
+  RuleSet& rule_set = helper.GetRuleSet();
+  const HeapVector<RuleData>* rules = rule_set.FocusPseudoClassRules();
+  ASSERT_EQ(2u, rules->size());
+}
+
+TEST(RuleSetTest, findBestRuleSetAndAdd_LinkVisited) {
+  CSSTestHelper helper;
+
+  helper.AddCSSRules(":link { }");
+  helper.AddCSSRules("[attr]:link { }");
+  helper.AddCSSRules(":visited { }");
+  helper.AddCSSRules("[attr]:visited { }");
+  helper.AddCSSRules(":-webkit-any-link { }");
+  helper.AddCSSRules("[attr]:-webkit-any-link { }");
+  RuleSet& rule_set = helper.GetRuleSet();
+  const HeapVector<RuleData>* rules = rule_set.LinkPseudoClassRules();
+  ASSERT_EQ(6u, rules->size());
+}
+
+TEST(RuleSetTest, findBestRuleSetAndAdd_Cue) {
+  CSSTestHelper helper;
+
+  helper.AddCSSRules("::cue(b) { }");
+  helper.AddCSSRules("video::cue(u) { }");
+  RuleSet& rule_set = helper.GetRuleSet();
+  const HeapVector<RuleData>* rules = rule_set.CuePseudoRules();
+  ASSERT_EQ(2u, rules->size());
+}
+
+TEST(RuleSetTest, findBestRuleSetAndAdd_PlaceholderPseudo) {
+  CSSTestHelper helper;
+
+  helper.AddCSSRules("::placeholder { }");
+  helper.AddCSSRules("input::placeholder { }");
+  RuleSet& rule_set = helper.GetRuleSet();
+  const HeapVector<RuleData>* rules = rule_set.PlaceholderPseudoRules();
+  ASSERT_EQ(2u, rules->size());
+}
+
 TEST(RuleSetTest, SelectorIndexLimit) {
   StringBuilder builder;
 
diff --git a/third_party/WebKit/Source/core/css/SelectorChecker.cpp b/third_party/WebKit/Source/core/css/SelectorChecker.cpp
index 4aa01663..d572d16 100644
--- a/third_party/WebKit/Source/core/css/SelectorChecker.cpp
+++ b/third_party/WebKit/Source/core/css/SelectorChecker.cpp
@@ -928,13 +928,9 @@
     case CSSSelector::kPseudoFocus:
       if (mode_ == kSharingRules)
         return true;
-      if (mode_ == kResolvingStyle) {
-        if (context.in_rightmost_compound) {
-          element_style_->SetAffectedByFocus();
-        } else {
-          element_style_->SetUnique();
-          element.SetChildrenOrSiblingsAffectedByFocus();
-        }
+      if (mode_ == kResolvingStyle && !context.in_rightmost_compound) {
+        element_style_->SetUnique();
+        element.SetChildrenOrSiblingsAffectedByFocus();
       }
       return MatchesFocusPseudoClass(element);
     case CSSSelector::kPseudoFocusWithin:
diff --git a/third_party/WebKit/Source/core/css/resolver/SharedStyleFinderTest.cpp b/third_party/WebKit/Source/core/css/resolver/SharedStyleFinderTest.cpp
index 939ec89..dd53b56 100644
--- a/third_party/WebKit/Source/core/css/resolver/SharedStyleFinderTest.cpp
+++ b/third_party/WebKit/Source/core/css/resolver/SharedStyleFinderTest.cpp
@@ -153,7 +153,9 @@
   EXPECT_FALSE(a->IsFocused());
   EXPECT_FALSE(b->IsFocused());
 
-  EXPECT_TRUE(MatchesUncommonAttributeRuleSet(*a));
+  // :focus rules do not end up in uncommon attribute rule sets. Style sharing
+  // is skipped for focused elements in Element::SupportsStyleSharing().
+  EXPECT_FALSE(MatchesUncommonAttributeRuleSet(*a));
   EXPECT_FALSE(MatchesUncommonAttributeRuleSet(*b));
 }
 
diff --git a/third_party/WebKit/Source/core/css/resolver/StyleAdjuster.cpp b/third_party/WebKit/Source/core/css/resolver/StyleAdjuster.cpp
index 051088e..bb67e278 100644
--- a/third_party/WebKit/Source/core/css/resolver/StyleAdjuster.cpp
+++ b/third_party/WebKit/Source/core/css/resolver/StyleAdjuster.cpp
@@ -159,6 +159,38 @@
   style.SetPosition(EPosition::kStatic);
 }
 
+void StyleAdjuster::AdjustStyleForAlignment(
+    ComputedStyle& style,
+    const ComputedStyle& layout_parent_style) {
+  // To avoid needing to copy the RareNonInheritedData, we repurpose the 'auto'
+  // flag to not just mean 'auto' prior to running the StyleAdjuster but also
+  // mean 'normal' after running it.
+
+  // If the inherited value of justify-items includes the 'legacy' keyword,
+  // 'auto' computes to the the inherited value.  Otherwise, 'auto' computes to
+  // 'normal'.
+  if (style.JustifyItemsPosition() == kItemPositionAuto) {
+    if (layout_parent_style.JustifyItemsPositionType() == kLegacyPosition)
+      style.SetJustifyItems(layout_parent_style.JustifyItems());
+  }
+
+  // The 'auto' keyword computes the computed value of justify-items on the
+  // parent (minus any legacy keywords), or 'normal' if the box has no parent.
+  if (style.JustifySelfPosition() == kItemPositionAuto) {
+    if (layout_parent_style.JustifyItemsPositionType() == kLegacyPosition)
+      style.SetJustifySelfPosition(layout_parent_style.JustifyItemsPosition());
+    else if (layout_parent_style.JustifyItemsPosition() != kItemPositionAuto)
+      style.SetJustifySelf(layout_parent_style.JustifyItems());
+  }
+
+  // The 'auto' keyword computes the computed value of align-items on the parent
+  // or 'normal' if the box has no parent.
+  if (style.AlignSelfPosition() == kItemPositionAuto &&
+      layout_parent_style.AlignItemsPosition() !=
+          ComputedStyle::InitialDefaultAlignment().GetPosition())
+    style.SetAlignSelf(layout_parent_style.AlignItems());
+}
+
 static void AdjustStyleForHTMLElement(ComputedStyle& style,
                                       HTMLElement& element) {
   // <div> and <span> are the most common elements on the web, we skip all the
@@ -479,6 +511,7 @@
     if (isSVGTextElement(*element))
       style.ClearMultiCol();
   }
+  AdjustStyleForAlignment(style, layout_parent_style);
 
   // If this node is sticky it marks the creation of a sticky subtree, which we
   // must track to properly handle document lifecycle in some cases.
@@ -488,14 +521,6 @@
   // inheritance from the ancestor and there is no harm to setting it again.
   if (style.GetPosition() == EPosition::kSticky)
     style.SetSubtreeIsSticky(true);
-
-  // If the inherited value of justify-items includes the 'legacy' keyword,
-  // 'auto' computes to the the inherited value.  Otherwise, 'auto' computes to
-  // 'normal'.
-  if (style.JustifyItemsPosition() == kItemPositionAuto) {
-    if (parent_style.JustifyItemsPositionType() == kLegacyPosition)
-      style.SetJustifyItems(parent_style.JustifyItems());
-  }
 }
 
 }  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/resolver/StyleAdjuster.h b/third_party/WebKit/Source/core/css/resolver/StyleAdjuster.h
index 3ca8e7c..9690f9d8 100644
--- a/third_party/WebKit/Source/core/css/resolver/StyleAdjuster.h
+++ b/third_party/WebKit/Source/core/css/resolver/StyleAdjuster.h
@@ -42,6 +42,8 @@
                                   const ComputedStyle& layout_parent_style,
                                   Element*);
   static void AdjustStyleForEditing(ComputedStyle&);
+  static void AdjustStyleForAlignment(ComputedStyle&,
+                                      const ComputedStyle& parent_style);
 };
 
 }  // namespace blink
diff --git a/third_party/WebKit/Source/core/dom/ContainerNode.cpp b/third_party/WebKit/Source/core/dom/ContainerNode.cpp
index 61d8770..1e8a3c9 100644
--- a/third_party/WebKit/Source/core/dom/ContainerNode.cpp
+++ b/third_party/WebKit/Source/core/dom/ContainerNode.cpp
@@ -1067,16 +1067,15 @@
   if (!GetLayoutObject())
     return;
 
-  if (GetComputedStyle()->AffectedByFocus()) {
-    StyleChangeType change_type =
-        GetComputedStyle()->HasPseudoStyle(kPseudoIdFirstLetter)
-            ? kSubtreeStyleChange
-            : kLocalStyleChange;
-    SetNeedsStyleRecalc(
-        change_type,
-        StyleChangeReasonForTracing::CreateWithExtraData(
-            StyleChangeReason::kPseudoClass, StyleChangeExtraData::g_focus));
-  }
+  StyleChangeType change_type =
+      GetComputedStyle()->HasPseudoStyle(kPseudoIdFirstLetter)
+          ? kSubtreeStyleChange
+          : kLocalStyleChange;
+  SetNeedsStyleRecalc(
+      change_type,
+      StyleChangeReasonForTracing::CreateWithExtraData(
+          StyleChangeReason::kPseudoClass, StyleChangeExtraData::g_focus));
+
   if (IsElementNode() && ToElement(this)->ChildrenOrSiblingsAffectedByFocus())
     ToElement(this)->PseudoStateChanged(CSSSelector::kPseudoFocus);
 
diff --git a/third_party/WebKit/Source/core/editing/BUILD.gn b/third_party/WebKit/Source/core/editing/BUILD.gn
index 1ee533e..41a2b8c 100644
--- a/third_party/WebKit/Source/core/editing/BUILD.gn
+++ b/third_party/WebKit/Source/core/editing/BUILD.gn
@@ -308,6 +308,7 @@
     "iterators/TextSearcherICUTest.cpp",
     "markers/CompositionMarkerListImplTest.cpp",
     "markers/DocumentMarkerControllerTest.cpp",
+    "markers/DocumentMarkerListEditorTest.cpp",
     "markers/DocumentMarkerTest.cpp",
     "markers/GrammarMarkerListImplTest.cpp",
     "markers/SpellingMarkerListImplTest.cpp",
diff --git a/third_party/WebKit/Source/core/editing/markers/DocumentMarkerController.cpp b/third_party/WebKit/Source/core/editing/markers/DocumentMarkerController.cpp
index 68b952a..c0e1f718 100644
--- a/third_party/WebKit/Source/core/editing/markers/DocumentMarkerController.cpp
+++ b/third_party/WebKit/Source/core/editing/markers/DocumentMarkerController.cpp
@@ -122,29 +122,26 @@
   possibly_existing_marker_types_ = 0;
 }
 
-void DocumentMarkerController::AddSpellingMarker(const Position& start,
-                                                 const Position& end,
+void DocumentMarkerController::AddSpellingMarker(const EphemeralRange& range,
                                                  const String& description) {
-  AddSpellCheckMarker(start, end, DocumentMarker::kSpelling, description);
+  AddSpellCheckMarker(range, DocumentMarker::kSpelling, description);
 }
 
-void DocumentMarkerController::AddGrammarMarker(const Position& start,
-                                                const Position& end,
+void DocumentMarkerController::AddGrammarMarker(const EphemeralRange& range,
                                                 const String& description) {
-  AddSpellCheckMarker(start, end, DocumentMarker::kGrammar, description);
+  AddSpellCheckMarker(range, DocumentMarker::kGrammar, description);
 }
 
 void DocumentMarkerController::AddSpellCheckMarker(
-    const Position& start,
-    const Position& end,
+    const EphemeralRange& range,
     DocumentMarker::MarkerType type,
     const String& description) {
   DCHECK(type == DocumentMarker::kSpelling || type == DocumentMarker::kGrammar)
       << type;
   // Use a TextIterator to visit the potentially multiple nodes the range
   // covers.
-  for (TextIterator marked_text(start, end); !marked_text.AtEnd();
-       marked_text.Advance()) {
+  for (TextIterator marked_text(range.StartPosition(), range.EndPosition());
+       !marked_text.AtEnd(); marked_text.Advance()) {
     AddMarker(marked_text.CurrentContainer(),
               new DocumentMarker(
                   type, marked_text.StartOffsetInCurrentContainer(),
diff --git a/third_party/WebKit/Source/core/editing/markers/DocumentMarkerController.h b/third_party/WebKit/Source/core/editing/markers/DocumentMarkerController.h
index 746aeb7..513af1c 100644
--- a/third_party/WebKit/Source/core/editing/markers/DocumentMarkerController.h
+++ b/third_party/WebKit/Source/core/editing/markers/DocumentMarkerController.h
@@ -53,11 +53,9 @@
   explicit DocumentMarkerController(Document&);
 
   void Clear();
-  void AddSpellingMarker(const Position& start,
-                         const Position& end,
+  void AddSpellingMarker(const EphemeralRange&,
                          const String& description = g_empty_string);
-  void AddGrammarMarker(const Position& start,
-                        const Position& end,
+  void AddGrammarMarker(const EphemeralRange&,
                         const String& description = g_empty_string);
   void AddTextMatchMarker(const EphemeralRange&, DocumentMarker::MatchStatus);
   void AddCompositionMarker(const EphemeralRange&,
@@ -112,8 +110,7 @@
 
  private:
   void AddMarker(Node*, DocumentMarker*);
-  void AddSpellCheckMarker(const Position& start,
-                           const Position& end,
+  void AddSpellCheckMarker(const EphemeralRange&,
                            DocumentMarker::MarkerType,
                            const String& description = g_empty_string);
 
diff --git a/third_party/WebKit/Source/core/editing/markers/DocumentMarkerControllerTest.cpp b/third_party/WebKit/Source/core/editing/markers/DocumentMarkerControllerTest.cpp
index 0e7d578..bde1c9d 100644
--- a/third_party/WebKit/Source/core/editing/markers/DocumentMarkerControllerTest.cpp
+++ b/third_party/WebKit/Source/core/editing/markers/DocumentMarkerControllerTest.cpp
@@ -72,8 +72,7 @@
   // DocumentMarkerControllerTest::addMarker(), needs them.
   GetDocument().UpdateStyleAndLayout();
   auto range = EphemeralRange::RangeOfContents(*node);
-  MarkerController().AddSpellingMarker(range.StartPosition(),
-                                       range.EndPosition());
+  MarkerController().AddSpellingMarker(range);
 }
 
 void DocumentMarkerControllerTest::MarkNodeContentsTextMatch(Node* node) {
@@ -316,8 +315,7 @@
 
   // Add a spelling marker and a text match marker to "foo".
   const EphemeralRange marker_range(Position(text, 0), Position(text, 3));
-  MarkerController().AddSpellingMarker(marker_range.StartPosition(),
-                                       marker_range.EndPosition());
+  MarkerController().AddSpellingMarker(marker_range);
   MarkerController().AddTextMatchMarker(marker_range,
                                         DocumentMarker::MatchStatus::kInactive);
 
diff --git a/third_party/WebKit/Source/core/editing/markers/DocumentMarkerListEditor.h b/third_party/WebKit/Source/core/editing/markers/DocumentMarkerListEditor.h
index 5da0620..f0ba08f2 100644
--- a/third_party/WebKit/Source/core/editing/markers/DocumentMarkerListEditor.h
+++ b/third_party/WebKit/Source/core/editing/markers/DocumentMarkerListEditor.h
@@ -12,7 +12,7 @@
 
 class DocumentMarker;
 
-class DocumentMarkerListEditor {
+class CORE_EXPORT DocumentMarkerListEditor final {
  public:
   using MarkerList = HeapVector<Member<DocumentMarker>>;
 
diff --git a/third_party/WebKit/Source/core/editing/markers/DocumentMarkerListEditorTest.cpp b/third_party/WebKit/Source/core/editing/markers/DocumentMarkerListEditorTest.cpp
new file mode 100644
index 0000000..87a5818
--- /dev/null
+++ b/third_party/WebKit/Source/core/editing/markers/DocumentMarkerListEditorTest.cpp
@@ -0,0 +1,367 @@
+// Copyright 2017 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 "core/editing/markers/DocumentMarkerListEditor.h"
+
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace blink {
+
+class DocumentMarkerListEditorTest : public ::testing::Test {
+ protected:
+  DocumentMarker* CreateMarker(unsigned startOffset, unsigned endOffset) {
+    return new DocumentMarker(startOffset, endOffset,
+                              DocumentMarker::MatchStatus::kInactive);
+  }
+};
+
+TEST_F(DocumentMarkerListEditorTest,
+       ContentDependentMarker_ReplaceStartOfMarker) {
+  DocumentMarkerListEditor::MarkerList markers;
+  markers.push_back(CreateMarker(0, 10));
+
+  DocumentMarkerListEditor::ShiftMarkersContentDependent(&markers, 0, 5, 5);
+
+  EXPECT_EQ(0u, markers.size());
+}
+
+TEST_F(DocumentMarkerListEditorTest,
+       ContentIndependentMarker_ReplaceStartOfMarker) {
+  DocumentMarkerListEditor::MarkerList markers;
+  markers.push_back(CreateMarker(0, 10));
+
+  // Replace with shorter text
+  DocumentMarkerListEditor::ShiftMarkersContentIndependent(&markers, 0, 5, 4);
+
+  EXPECT_EQ(1u, markers.size());
+  EXPECT_EQ(0u, markers[0]->StartOffset());
+  EXPECT_EQ(9u, markers[0]->EndOffset());
+
+  // Replace with longer text
+  DocumentMarkerListEditor::ShiftMarkersContentIndependent(&markers, 0, 4, 5);
+
+  EXPECT_EQ(1u, markers.size());
+  EXPECT_EQ(0u, markers[0]->StartOffset());
+  EXPECT_EQ(10u, markers[0]->EndOffset());
+
+  // Replace with text of same length
+  DocumentMarkerListEditor::ShiftMarkersContentIndependent(&markers, 0, 5, 5);
+
+  EXPECT_EQ(1u, markers.size());
+  EXPECT_EQ(0u, markers[0]->StartOffset());
+  EXPECT_EQ(10u, markers[0]->EndOffset());
+}
+
+TEST_F(DocumentMarkerListEditorTest,
+       ContentDependentMarker_ReplaceContainsStartOfMarker) {
+  DocumentMarkerListEditor::MarkerList markers;
+  markers.push_back(CreateMarker(5, 15));
+
+  DocumentMarkerListEditor::ShiftMarkersContentDependent(&markers, 0, 10, 10);
+
+  EXPECT_EQ(0u, markers.size());
+}
+
+TEST_F(DocumentMarkerListEditorTest,
+       ContentIndependentMarker_ReplaceContainsStartOfMarker) {
+  DocumentMarkerListEditor::MarkerList markers;
+  markers.push_back(CreateMarker(5, 15));
+
+  DocumentMarkerListEditor::ShiftMarkersContentIndependent(&markers, 0, 10, 10);
+
+  EXPECT_EQ(1u, markers.size());
+  EXPECT_EQ(10u, markers[0]->StartOffset());
+  EXPECT_EQ(15u, markers[0]->EndOffset());
+}
+
+TEST_F(DocumentMarkerListEditorTest,
+       ContentDependentMarker_ReplaceEndOfMarker) {
+  DocumentMarkerListEditor::MarkerList markers;
+  markers.push_back(CreateMarker(0, 10));
+
+  DocumentMarkerListEditor::ShiftMarkersContentDependent(&markers, 5, 5, 5);
+
+  EXPECT_EQ(0u, markers.size());
+}
+
+TEST_F(DocumentMarkerListEditorTest,
+       ContentIndependentMarker_ReplaceEndOfMarker) {
+  DocumentMarkerListEditor::MarkerList markers;
+  markers.push_back(CreateMarker(0, 10));
+
+  // Replace with shorter text
+  DocumentMarkerListEditor::ShiftMarkersContentIndependent(&markers, 5, 5, 4);
+
+  EXPECT_EQ(1u, markers.size());
+  EXPECT_EQ(0u, markers[0]->StartOffset());
+  EXPECT_EQ(9u, markers[0]->EndOffset());
+
+  // Replace with longer text
+  DocumentMarkerListEditor::ShiftMarkersContentIndependent(&markers, 5, 4, 5);
+
+  EXPECT_EQ(1u, markers.size());
+  EXPECT_EQ(0u, markers[0]->StartOffset());
+  EXPECT_EQ(10u, markers[0]->EndOffset());
+
+  // Replace with text of same length
+  DocumentMarkerListEditor::ShiftMarkersContentIndependent(&markers, 5, 5, 5);
+
+  EXPECT_EQ(1u, markers.size());
+  EXPECT_EQ(0u, markers[0]->StartOffset());
+  EXPECT_EQ(10u, markers[0]->EndOffset());
+}
+
+TEST_F(DocumentMarkerListEditorTest,
+       ContentDependentMarker_ReplaceContainsEndOfMarker) {
+  DocumentMarkerListEditor::MarkerList markers;
+  markers.push_back(CreateMarker(0, 10));
+
+  DocumentMarkerListEditor::ShiftMarkersContentDependent(&markers, 5, 10, 10);
+
+  EXPECT_EQ(0u, markers.size());
+}
+
+TEST_F(DocumentMarkerListEditorTest,
+       ContentIndependentMarker_ReplaceContainsEndOfMarker) {
+  DocumentMarkerListEditor::MarkerList markers;
+  markers.push_back(CreateMarker(0, 10));
+
+  DocumentMarkerListEditor::ShiftMarkersContentIndependent(&markers, 5, 10, 10);
+
+  EXPECT_EQ(1u, markers.size());
+  EXPECT_EQ(0u, markers[0]->StartOffset());
+  EXPECT_EQ(5u, markers[0]->EndOffset());
+}
+
+TEST_F(DocumentMarkerListEditorTest,
+       ContentDependentMarker_ReplaceEntireMarker) {
+  DocumentMarkerListEditor::MarkerList markers;
+  markers.push_back(CreateMarker(0, 10));
+
+  DocumentMarkerListEditor::ShiftMarkersContentDependent(&markers, 0, 10, 10);
+
+  EXPECT_EQ(0u, markers.size());
+}
+
+TEST_F(DocumentMarkerListEditorTest,
+       ContentIndependentMarker_ReplaceEntireMarker) {
+  DocumentMarkerListEditor::MarkerList markers;
+  markers.push_back(CreateMarker(0, 10));
+
+  // Replace with shorter text
+  DocumentMarkerListEditor::ShiftMarkersContentIndependent(&markers, 0, 10, 9);
+
+  EXPECT_EQ(1u, markers.size());
+  EXPECT_EQ(0u, markers[0]->StartOffset());
+  EXPECT_EQ(9u, markers[0]->EndOffset());
+
+  // Replace with longer text
+  DocumentMarkerListEditor::ShiftMarkersContentIndependent(&markers, 0, 9, 10);
+
+  EXPECT_EQ(1u, markers.size());
+  EXPECT_EQ(0u, markers[0]->StartOffset());
+  EXPECT_EQ(10u, markers[0]->EndOffset());
+
+  // Replace with text of same length
+  DocumentMarkerListEditor::ShiftMarkersContentIndependent(&markers, 0, 10, 10);
+
+  EXPECT_EQ(1u, markers.size());
+  EXPECT_EQ(0u, markers[0]->StartOffset());
+  EXPECT_EQ(10u, markers[0]->EndOffset());
+}
+
+TEST_F(DocumentMarkerListEditorTest,
+       ContentDependentMarker_ReplaceTextWithMarkerAtBeginning) {
+  DocumentMarkerListEditor::MarkerList markers;
+  markers.push_back(CreateMarker(0, 10));
+
+  DocumentMarkerListEditor::ShiftMarkersContentDependent(&markers, 0, 15, 15);
+
+  EXPECT_EQ(0u, markers.size());
+}
+
+TEST_F(DocumentMarkerListEditorTest,
+       ContentIndependentMarker_ReplaceTextWithMarkerAtBeginning) {
+  DocumentMarkerListEditor::MarkerList markers;
+  markers.push_back(CreateMarker(0, 10));
+
+  DocumentMarkerListEditor::ShiftMarkersContentIndependent(&markers, 0, 15, 15);
+
+  EXPECT_EQ(0u, markers.size());
+}
+
+TEST_F(DocumentMarkerListEditorTest,
+       ContentDependentMarker_ReplaceTextWithMarkerAtEnd) {
+  DocumentMarkerListEditor::MarkerList markers;
+  markers.push_back(CreateMarker(5, 15));
+
+  DocumentMarkerListEditor::ShiftMarkersContentDependent(&markers, 0, 15, 15);
+
+  EXPECT_EQ(0u, markers.size());
+}
+
+TEST_F(DocumentMarkerListEditorTest,
+       ContentIndependentMarker_ReplaceTextWithMarkerAtEnd) {
+  DocumentMarkerListEditor::MarkerList markers;
+  markers.push_back(CreateMarker(5, 15));
+
+  DocumentMarkerListEditor::ShiftMarkersContentIndependent(&markers, 0, 15, 15);
+
+  EXPECT_EQ(0u, markers.size());
+}
+
+TEST_F(DocumentMarkerListEditorTest, ContentDependentMarker_Deletions) {
+  DocumentMarkerListEditor::MarkerList markers;
+  markers.push_back(CreateMarker(0, 5));
+  markers.push_back(CreateMarker(5, 10));
+  markers.push_back(CreateMarker(10, 15));
+  markers.push_back(CreateMarker(15, 20));
+  markers.push_back(CreateMarker(20, 25));
+
+  // Delete range containing the end of the second marker, the entire third
+  // marker, and the start of the fourth marker
+  DocumentMarkerListEditor::ShiftMarkersContentDependent(&markers, 8, 9, 0);
+
+  EXPECT_EQ(2u, markers.size());
+
+  EXPECT_EQ(0u, markers[0]->StartOffset());
+  EXPECT_EQ(5u, markers[0]->EndOffset());
+
+  EXPECT_EQ(11u, markers[1]->StartOffset());
+  EXPECT_EQ(16u, markers[1]->EndOffset());
+}
+
+TEST_F(DocumentMarkerListEditorTest, ContentIndependentMarker_Deletions) {
+  DocumentMarkerListEditor::MarkerList markers;
+  markers.push_back(CreateMarker(0, 5));
+  markers.push_back(CreateMarker(5, 10));
+  markers.push_back(CreateMarker(10, 15));
+  markers.push_back(CreateMarker(15, 20));
+  markers.push_back(CreateMarker(20, 25));
+
+  // Delete range containing the end of the second marker, the entire third
+  // marker, and the start of the fourth marker
+  DocumentMarkerListEditor::ShiftMarkersContentIndependent(&markers, 8, 9, 0);
+
+  EXPECT_EQ(4u, markers.size());
+
+  EXPECT_EQ(0u, markers[0]->StartOffset());
+  EXPECT_EQ(5u, markers[0]->EndOffset());
+
+  EXPECT_EQ(5u, markers[1]->StartOffset());
+  EXPECT_EQ(8u, markers[1]->EndOffset());
+
+  EXPECT_EQ(8u, markers[2]->StartOffset());
+  EXPECT_EQ(11u, markers[2]->EndOffset());
+
+  EXPECT_EQ(11u, markers[3]->StartOffset());
+  EXPECT_EQ(16u, markers[3]->EndOffset());
+}
+
+TEST_F(DocumentMarkerListEditorTest,
+       ContentDependentMarker_DeleteExactlyOnMarker) {
+  DocumentMarkerListEditor::MarkerList markers;
+  markers.push_back(CreateMarker(0, 10));
+
+  DocumentMarkerListEditor::ShiftMarkersContentDependent(&markers, 0, 10, 0);
+
+  EXPECT_EQ(0u, markers.size());
+}
+
+TEST_F(DocumentMarkerListEditorTest,
+       ContentIndependentMarker_DeleteExactlyOnMarker) {
+  DocumentMarkerListEditor::MarkerList markers;
+  markers.push_back(CreateMarker(0, 10));
+
+  DocumentMarkerListEditor::ShiftMarkersContentIndependent(&markers, 0, 10, 0);
+
+  EXPECT_EQ(0u, markers.size());
+}
+
+TEST_F(DocumentMarkerListEditorTest,
+       ContentDependentMarker_InsertInMarkerInterior) {
+  DocumentMarkerListEditor::MarkerList markers;
+  markers.push_back(CreateMarker(0, 5));
+  markers.push_back(CreateMarker(5, 10));
+  markers.push_back(CreateMarker(10, 15));
+
+  // insert in middle of second marker
+  DocumentMarkerListEditor::ShiftMarkersContentDependent(&markers, 7, 0, 5);
+
+  EXPECT_EQ(2u, markers.size());
+
+  EXPECT_EQ(0u, markers[0]->StartOffset());
+  EXPECT_EQ(5u, markers[0]->EndOffset());
+
+  EXPECT_EQ(15u, markers[1]->StartOffset());
+  EXPECT_EQ(20u, markers[1]->EndOffset());
+}
+
+TEST_F(DocumentMarkerListEditorTest,
+       ContentIndependentMarker_InsertInMarkerInterior) {
+  DocumentMarkerListEditor::MarkerList markers;
+  markers.push_back(CreateMarker(0, 5));
+  markers.push_back(CreateMarker(5, 10));
+  markers.push_back(CreateMarker(10, 15));
+
+  // insert in middle of second marker
+  DocumentMarkerListEditor::ShiftMarkersContentIndependent(&markers, 7, 0, 5);
+
+  EXPECT_EQ(3u, markers.size());
+
+  EXPECT_EQ(0u, markers[0]->StartOffset());
+  EXPECT_EQ(5u, markers[0]->EndOffset());
+
+  EXPECT_EQ(5u, markers[1]->StartOffset());
+  EXPECT_EQ(15u, markers[1]->EndOffset());
+
+  EXPECT_EQ(15u, markers[2]->StartOffset());
+  EXPECT_EQ(20u, markers[2]->EndOffset());
+}
+
+TEST_F(DocumentMarkerListEditorTest,
+       ContentDependentMarker_InsertBetweenMarkers) {
+  DocumentMarkerListEditor::MarkerList markers;
+  markers.push_back(CreateMarker(0, 5));
+  markers.push_back(CreateMarker(5, 10));
+  markers.push_back(CreateMarker(10, 15));
+
+  // insert before second marker
+  DocumentMarkerListEditor::ShiftMarkersContentDependent(&markers, 5, 0, 5);
+
+  EXPECT_EQ(3u, markers.size());
+
+  EXPECT_EQ(0u, markers[0]->StartOffset());
+  EXPECT_EQ(5u, markers[0]->EndOffset());
+
+  EXPECT_EQ(10u, markers[1]->StartOffset());
+  EXPECT_EQ(15u, markers[1]->EndOffset());
+
+  EXPECT_EQ(15u, markers[2]->StartOffset());
+  EXPECT_EQ(20u, markers[2]->EndOffset());
+}
+
+TEST_F(DocumentMarkerListEditorTest,
+       ContentIndependentMarker_InsertBetweenMarkers) {
+  DocumentMarkerListEditor::MarkerList markers;
+  markers.push_back(CreateMarker(0, 5));
+  markers.push_back(CreateMarker(5, 10));
+  markers.push_back(CreateMarker(10, 15));
+
+  // insert before second marker
+  DocumentMarkerListEditor::ShiftMarkersContentIndependent(&markers, 5, 0, 5);
+
+  EXPECT_EQ(3u, markers.size());
+
+  EXPECT_EQ(0u, markers[0]->StartOffset());
+  EXPECT_EQ(5u, markers[0]->EndOffset());
+
+  EXPECT_EQ(10u, markers[1]->StartOffset());
+  EXPECT_EQ(15u, markers[1]->EndOffset());
+
+  EXPECT_EQ(15u, markers[2]->StartOffset());
+  EXPECT_EQ(20u, markers[2]->EndOffset());
+}
+
+}  // namespace blink
diff --git a/third_party/WebKit/Source/core/editing/spellcheck/SpellChecker.cpp b/third_party/WebKit/Source/core/editing/spellcheck/SpellChecker.cpp
index 9ebfbdea..051fd2e 100644
--- a/third_party/WebKit/Source/core/editing/spellcheck/SpellChecker.cpp
+++ b/third_party/WebKit/Source/core/editing/spellcheck/SpellChecker.cpp
@@ -305,8 +305,7 @@
                                             .Build());
     GetFrame().Selection().RevealSelection();
     GetSpellCheckerClient().UpdateSpellingUIWithMisspelledWord(misspelled_word);
-    GetFrame().GetDocument()->Markers().AddSpellingMarker(
-        misspelling_range.StartPosition(), misspelling_range.EndPosition());
+    GetFrame().GetDocument()->Markers().AddSpellingMarker(misspelling_range);
   }
 }
 
@@ -550,15 +549,12 @@
     return;
 
   if (type == DocumentMarker::kSpelling) {
-    document->Markers().AddSpellingMarker(range_to_mark.StartPosition(),
-                                          range_to_mark.EndPosition(),
-                                          description);
+    document->Markers().AddSpellingMarker(range_to_mark, description);
     return;
   }
 
   DCHECK_EQ(type, DocumentMarker::kGrammar);
-  document->Markers().AddGrammarMarker(
-      range_to_mark.StartPosition(), range_to_mark.EndPosition(), description);
+  document->Markers().AddGrammarMarker(range_to_mark, description);
 }
 
 void SpellChecker::MarkAndReplaceFor(
diff --git a/third_party/WebKit/Source/core/exported/WebViewBase.h b/third_party/WebKit/Source/core/exported/WebViewBase.h
index 2f9129c1..1a98e39 100644
--- a/third_party/WebKit/Source/core/exported/WebViewBase.h
+++ b/third_party/WebKit/Source/core/exported/WebViewBase.h
@@ -181,7 +181,7 @@
   virtual CompositorAnimationHost* AnimationHost() const = 0;
   virtual HitTestResult CoreHitTestResultAt(const WebPoint&) = 0;
 
-  virtual class ChromeClient& ChromeClient() const = 0;
+  virtual class ChromeClient& GetChromeClient() const = 0;
 
   // These methods are consumed by test code only.
   virtual BrowserControls& GetBrowserControls() = 0;
diff --git a/third_party/WebKit/Source/core/frame/UseCounter.h b/third_party/WebKit/Source/core/frame/UseCounter.h
index b5e4f8d9..ef0ece5 100644
--- a/third_party/WebKit/Source/core/frame/UseCounter.h
+++ b/third_party/WebKit/Source/core/frame/UseCounter.h
@@ -1621,6 +1621,7 @@
     kTableSectionDirectionDifferentFromTable = 2016,
     // The above items are available in M60 branch.
 
+    kClientHintsDeviceRAM = 2017,
     // Add new features immediately above this line. Don't change assigned
     // numbers of any item, and don't reuse removed slots.
     // Also, run update_use_counter_feature_enum.py in
diff --git a/third_party/WebKit/Source/core/html/forms/TextControlInnerElements.cpp b/third_party/WebKit/Source/core/html/forms/TextControlInnerElements.cpp
index 9a41b09..985cf2c 100644
--- a/third_party/WebKit/Source/core/html/forms/TextControlInnerElements.cpp
+++ b/third_party/WebKit/Source/core/html/forms/TextControlInnerElements.cpp
@@ -89,6 +89,9 @@
   style->SetUserModify(EUserModify::kReadOnly);
   style->SetUnique();
 
+  if (const ComputedStyle* parent_style = ParentComputedStyle())
+    StyleAdjuster::AdjustStyleForAlignment(*style, *parent_style);
+
   return style.Release();
 }
 
@@ -146,6 +149,8 @@
   // Using StyleAdjuster::adjustComputedStyle updates unwanted style. We'd like
   // to apply only editing-related and alignment-related.
   StyleAdjuster::AdjustStyleForEditing(*inner_editor_style);
+  if (const ComputedStyle* parent_style = ParentComputedStyle())
+    StyleAdjuster::AdjustStyleForAlignment(*inner_editor_style, *parent_style);
   return inner_editor_style.Release();
 }
 
diff --git a/third_party/WebKit/Source/core/layout/LayoutBox.cpp b/third_party/WebKit/Source/core/layout/LayoutBox.cpp
index da017f7..8cbc40d 100644
--- a/third_party/WebKit/Source/core/layout/LayoutBox.cpp
+++ b/third_party/WebKit/Source/core/layout/LayoutBox.cpp
@@ -2883,14 +2883,15 @@
     // Flexbox Items, which obviously should have a container.
     return false;
   }
+  const ComputedStyle* parent_style = IsAnonymous() ? cb->Style() : nullptr;
   if (cb->IsHorizontalWritingMode() != IsHorizontalWritingMode())
     return style
                .ResolvedAlignSelf(cb->SelfAlignmentNormalBehavior(this),
-                                  cb->Style())
+                                  parent_style)
                .GetPosition() == kItemPositionStretch;
   return style
              .ResolvedJustifySelf(cb->SelfAlignmentNormalBehavior(this),
-                                  cb->Style())
+                                  parent_style)
              .GetPosition() == kItemPositionStretch;
 }
 
diff --git a/third_party/WebKit/Source/core/layout/LayoutFlexibleBox.cpp b/third_party/WebKit/Source/core/layout/LayoutFlexibleBox.cpp
index 3b10dde9..79ca9899 100644
--- a/third_party/WebKit/Source/core/layout/LayoutFlexibleBox.cpp
+++ b/third_party/WebKit/Source/core/layout/LayoutFlexibleBox.cpp
@@ -325,13 +325,14 @@
   intrinsic_size_along_main_axis_.erase(child);
 }
 
+// TODO (lajava): Is this function still needed ? Every time the flex
+// container's align-items value changes we propagate the diff to its children
+// (see ComputedStyle::stylePropagationDiff).
 void LayoutFlexibleBox::StyleDidChange(StyleDifference diff,
                                        const ComputedStyle* old_style) {
   LayoutBlock::StyleDidChange(diff, old_style);
 
-  if (old_style &&
-      old_style->ResolvedAlignItems(SelfAlignmentNormalBehavior())
-              .GetPosition() == kItemPositionStretch &&
+  if (old_style && old_style->AlignItemsPosition() == kItemPositionStretch &&
       diff.NeedsFullLayout()) {
     // Flex items that were previously stretching need to be relayed out so we
     // can compute new available cross axis space. This is only necessary for
@@ -1705,7 +1706,8 @@
     const LayoutBox& child) const {
   ItemPosition align =
       child.StyleRef()
-          .ResolvedAlignSelf(SelfAlignmentNormalBehavior(), Style())
+          .ResolvedAlignSelf(SelfAlignmentNormalBehavior(),
+                             child.IsAnonymous() ? Style() : nullptr)
           .GetPosition();
   DCHECK_NE(align, kItemPositionAuto);
   DCHECK_NE(align, kItemPositionNormal);
diff --git a/third_party/WebKit/Source/core/layout/LayoutGrid.cpp b/third_party/WebKit/Source/core/layout/LayoutGrid.cpp
index 99bc7c6..7fc73fa 100644
--- a/third_party/WebKit/Source/core/layout/LayoutGrid.cpp
+++ b/third_party/WebKit/Source/core/layout/LayoutGrid.cpp
@@ -97,67 +97,12 @@
   DirtyGrid();
 }
 
-StyleSelfAlignmentData LayoutGrid::SelfAlignmentForChild(
-    GridAxis axis,
-    const LayoutBox& child,
-    const ComputedStyle* style) const {
-  return axis == kGridRowAxis ? JustifySelfForChild(child, style)
-                              : AlignSelfForChild(child, style);
-}
-
-bool LayoutGrid::SelfAlignmentChangedToStretch(GridAxis axis,
-                                               const ComputedStyle& old_style,
-                                               const ComputedStyle& new_style,
-                                               const LayoutBox& child) const {
-  return SelfAlignmentForChild(axis, child, &old_style).GetPosition() !=
-             kItemPositionStretch &&
-         SelfAlignmentForChild(axis, child, &new_style).GetPosition() ==
-             kItemPositionStretch;
-}
-
-bool LayoutGrid::SelfAlignmentChangedFromStretch(GridAxis axis,
-                                                 const ComputedStyle& old_style,
-                                                 const ComputedStyle& new_style,
-                                                 const LayoutBox& child) const {
-  return SelfAlignmentForChild(axis, child, &old_style).GetPosition() ==
-             kItemPositionStretch &&
-         SelfAlignmentForChild(axis, child, &new_style).GetPosition() !=
-             kItemPositionStretch;
-}
-
 void LayoutGrid::StyleDidChange(StyleDifference diff,
                                 const ComputedStyle* old_style) {
   LayoutBlock::StyleDidChange(diff, old_style);
   if (!old_style)
     return;
 
-  const ComputedStyle& new_style = StyleRef();
-  if (old_style &&
-      old_style->ResolvedAlignItems(SelfAlignmentNormalBehavior(this))
-              .GetPosition() == kItemPositionStretch &&
-      diff.NeedsFullLayout()) {
-    // Style changes on the grid container implying stretching (to-stretch) or
-    // shrinking (from-stretch) require the affected items to be laid out again.
-    // These logic only applies to 'stretch' since the rest of the alignment
-    // values don't change the size of the box.
-    // In any case, the items' overrideSize will be cleared and recomputed (if
-    // necessary)  as part of the Grid layout logic, triggered by this style
-    // change.
-    for (LayoutBox* child = FirstInFlowChildBox(); child;
-         child = child->NextInFlowSiblingBox()) {
-      if (SelfAlignmentChangedToStretch(kGridRowAxis, *old_style, new_style,
-                                        *child) ||
-          SelfAlignmentChangedFromStretch(kGridRowAxis, *old_style, new_style,
-                                          *child) ||
-          SelfAlignmentChangedToStretch(kGridColumnAxis, *old_style, new_style,
-                                        *child) ||
-          SelfAlignmentChangedFromStretch(kGridColumnAxis, *old_style,
-                                          new_style, *child)) {
-        child->SetNeedsLayout(LayoutInvalidationReason::kGridChanged);
-      }
-    }
-  }
-
   // FIXME: The following checks could be narrowed down if we kept track of
   // which type of grid items we have:
   // - explicit grid size changes impact negative explicitely positioned and
@@ -1585,21 +1530,29 @@
 }
 
 StyleSelfAlignmentData LayoutGrid::AlignSelfForChild(
-    const LayoutBox& child,
-    const ComputedStyle* style) const {
-  if (!style)
-    style = Style();
+    const LayoutBox& child) const {
+  if (!child.IsAnonymous()) {
+    return child.StyleRef().ResolvedAlignSelf(
+        SelfAlignmentNormalBehavior(&child));
+  }
+  // All the 'auto' values has been solved by the StyleAdjuster, but it's
+  // possible that some grid items generate Anonymous boxes, which need to be
+  // solved during layout.
   return child.StyleRef().ResolvedAlignSelf(SelfAlignmentNormalBehavior(&child),
-                                            style);
+                                            Style());
 }
 
 StyleSelfAlignmentData LayoutGrid::JustifySelfForChild(
-    const LayoutBox& child,
-    const ComputedStyle* style) const {
-  if (!style)
-    style = Style();
+    const LayoutBox& child) const {
+  if (!child.IsAnonymous()) {
+    return child.StyleRef().ResolvedJustifySelf(
+        SelfAlignmentNormalBehavior(&child));
+  }
+  // All the 'auto' values has been solved by the StyleAdjuster, but it's
+  // possible that some grid items generate Anonymous boxes, which need to be
+  // solved during layout.
   return child.StyleRef().ResolvedJustifySelf(
-      SelfAlignmentNormalBehavior(&child), style);
+      SelfAlignmentNormalBehavior(&child), Style());
 }
 
 GridTrackSizingDirection LayoutGrid::FlowAwareDirectionForChild(
@@ -1827,9 +1780,11 @@
 
 bool LayoutGrid::IsBaselineAlignmentForChild(const LayoutBox& child,
                                              GridAxis baseline_axis) const {
-  ItemPosition align =
-      SelfAlignmentForChild(baseline_axis, child).GetPosition();
-  bool has_auto_margins = baseline_axis == kGridColumnAxis
+  bool is_column_axis_baseline = baseline_axis == kGridColumnAxis;
+  ItemPosition align = is_column_axis_baseline
+                           ? AlignSelfForChild(child).GetPosition()
+                           : JustifySelfForChild(child).GetPosition();
+  bool has_auto_margins = is_column_axis_baseline
                               ? HasAutoMarginsInColumnAxis(child)
                               : HasAutoMarginsInRowAxis(child);
   return IsBaselinePosition(align) && !has_auto_margins;
@@ -1849,8 +1804,9 @@
                                            : col_axis_alignment_context_;
   auto* context = contexts_map.at(span.StartLine());
   DCHECK(context);
-  ItemPosition align =
-      SelfAlignmentForChild(baseline_axis, child).GetPosition();
+  ItemPosition align = is_column_axis_baseline
+                           ? AlignSelfForChild(child).GetPosition()
+                           : JustifySelfForChild(child).GetPosition();
   return context->GetSharedGroup(child, align);
 }
 
@@ -1968,8 +1924,9 @@
   auto add_result = contexts_map.insert(span.StartLine(), nullptr);
 
   // Looking for a compatible baseline-sharing group.
-  ItemPosition align =
-      SelfAlignmentForChild(baseline_axis, child).GetPosition();
+  ItemPosition align = is_column_axis_baseline
+                           ? AlignSelfForChild(child).GetPosition()
+                           : JustifySelfForChild(child).GetPosition();
   if (add_result.is_new_entry) {
     add_result.stored_value->value =
         WTF::MakeUnique<BaselineContext>(child, align, ascent, descent);
diff --git a/third_party/WebKit/Source/core/layout/LayoutGrid.h b/third_party/WebKit/Source/core/layout/LayoutGrid.h
index 7a82d7a..cf5354f 100644
--- a/third_party/WebKit/Source/core/layout/LayoutGrid.h
+++ b/third_party/WebKit/Source/core/layout/LayoutGrid.h
@@ -128,14 +128,6 @@
                 LayoutObject* before_child = nullptr) override;
   void RemoveChild(LayoutObject*) override;
 
-  bool SelfAlignmentChangedToStretch(GridAxis,
-                                     const ComputedStyle& old_style,
-                                     const ComputedStyle& new_style,
-                                     const LayoutBox&) const;
-  bool SelfAlignmentChangedFromStretch(GridAxis,
-                                       const ComputedStyle& old_style,
-                                       const ComputedStyle& new_style,
-                                       const LayoutBox&) const;
   void StyleDidChange(StyleDifference, const ComputedStyle*) override;
 
   Optional<LayoutUnit> AvailableSpaceForGutters(GridTrackSizingDirection) const;
@@ -220,16 +212,8 @@
   LayoutUnit AvailableAlignmentSpaceForChildBeforeStretching(
       LayoutUnit grid_area_breadth_for_child,
       const LayoutBox&) const;
-  StyleSelfAlignmentData JustifySelfForChild(
-      const LayoutBox&,
-      const ComputedStyle* = nullptr) const;
-  StyleSelfAlignmentData AlignSelfForChild(
-      const LayoutBox&,
-      const ComputedStyle* = nullptr) const;
-  StyleSelfAlignmentData SelfAlignmentForChild(
-      GridAxis,
-      const LayoutBox& child,
-      const ComputedStyle* = nullptr) const;
+  StyleSelfAlignmentData JustifySelfForChild(const LayoutBox&) const;
+  StyleSelfAlignmentData AlignSelfForChild(const LayoutBox&) const;
   void ApplyStretchAlignmentToChildIfNeeded(LayoutBox&);
   bool HasAutoSizeInColumnAxis(const LayoutBox& child) const {
     return IsHorizontalWritingMode() ? child.StyleRef().Height().IsAuto()
diff --git a/third_party/WebKit/Source/core/loader/FrameFetchContext.cpp b/third_party/WebKit/Source/core/loader/FrameFetchContext.cpp
index c0bc426e..3c0095486 100644
--- a/third_party/WebKit/Source/core/loader/FrameFetchContext.cpp
+++ b/third_party/WebKit/Source/core/loader/FrameFetchContext.cpp
@@ -614,6 +614,22 @@
   GetFrame()->Loader().ModifyRequestForCSP(resource_request, GetDocument());
 }
 
+float FrameFetchContext::ClientHintsDeviceRAM(int64_t physical_memory_mb) {
+  // TODO(fmeawad): The calculations in this method are still evolving as the
+  // spec gets updated: https://github.com/WICG/device-ram. The reported
+  // device-ram is rounded down to next power of 2 in GB. Ex. 3072MB will return
+  // 2, and 768MB will return 0.5.
+  DCHECK_GT(physical_memory_mb, 0);
+  int power = 0;
+  // Extract the MSB location.
+  while (physical_memory_mb > 1) {
+    physical_memory_mb >>= 1;
+    power++;
+  }
+  // Restore to the power of 2, and convert to GB.
+  return static_cast<float>(1 << power) / 1024.0;
+}
+
 void FrameFetchContext::AddClientHintsIfNecessary(
     const ClientHintsPreferences& hints_preferences,
     const FetchParameters::ResourceWidth& resource_width,
@@ -621,6 +637,9 @@
   if (!RuntimeEnabledFeatures::clientHintsEnabled() || !GetDocument())
     return;
 
+  bool should_send_device_ram =
+      GetDocument()->GetClientHintsPreferences().ShouldSendDeviceRAM() ||
+      hints_preferences.ShouldSendDeviceRAM();
   bool should_send_dpr =
       GetDocument()->GetClientHintsPreferences().ShouldSendDPR() ||
       hints_preferences.ShouldSendDPR();
@@ -631,6 +650,13 @@
       GetDocument()->GetClientHintsPreferences().ShouldSendViewportWidth() ||
       hints_preferences.ShouldSendViewportWidth();
 
+  if (should_send_device_ram) {
+    int64_t physical_memory = MemoryCoordinator::GetPhysicalMemoryMB();
+    request.AddHTTPHeaderField(
+        "device-ram",
+        AtomicString(String::Number(ClientHintsDeviceRAM(physical_memory))));
+  }
+
   if (should_send_dpr) {
     request.AddHTTPHeaderField(
         "DPR", AtomicString(String::Number(GetDocument()->DevicePixelRatio())));
diff --git a/third_party/WebKit/Source/core/loader/FrameFetchContext.h b/third_party/WebKit/Source/core/loader/FrameFetchContext.h
index 41749c210..d93ad791 100644
--- a/third_party/WebKit/Source/core/loader/FrameFetchContext.h
+++ b/third_party/WebKit/Source/core/loader/FrameFetchContext.h
@@ -148,6 +148,7 @@
   void AddClientHintsIfNecessary(const ClientHintsPreferences&,
                                  const FetchParameters::ResourceWidth&,
                                  ResourceRequest&);
+  static float ClientHintsDeviceRAM(int64_t physical_memory_mb);
 
   MHTMLArchive* Archive() const override;
 
diff --git a/third_party/WebKit/Source/core/loader/FrameFetchContextTest.cpp b/third_party/WebKit/Source/core/loader/FrameFetchContextTest.cpp
index 192a2a4..1b4fc8e 100644
--- a/third_party/WebKit/Source/core/loader/FrameFetchContextTest.cpp
+++ b/third_party/WebKit/Source/core/loader/FrameFetchContextTest.cpp
@@ -524,6 +524,24 @@
   }
 };
 
+TEST_F(FrameFetchContextHintsTest, MonitorDeviceRAMHints) {
+  ExpectHeader("http://www.example.com/1.gif", "device-ram", false, "");
+  ClientHintsPreferences preferences;
+  preferences.SetShouldSendDeviceRAM(true);
+  document->GetClientHintsPreferences().UpdateFrom(preferences);
+  MemoryCoordinator::SetPhysicalMemoryMBForTesting(4096);
+  ExpectHeader("http://www.example.com/1.gif", "device-ram", true, "4");
+  MemoryCoordinator::SetPhysicalMemoryMBForTesting(2048);
+  ExpectHeader("http://www.example.com/1.gif", "device-ram", true, "2");
+  MemoryCoordinator::SetPhysicalMemoryMBForTesting(64385);
+  ExpectHeader("http://www.example.com/1.gif", "device-ram", true, "32");
+  MemoryCoordinator::SetPhysicalMemoryMBForTesting(768);
+  ExpectHeader("http://www.example.com/1.gif", "device-ram", true, "0.5");
+  ExpectHeader("http://www.example.com/1.gif", "DPR", false, "");
+  ExpectHeader("http://www.example.com/1.gif", "Width", false, "");
+  ExpectHeader("http://www.example.com/1.gif", "Viewport-Width", false, "");
+}
+
 TEST_F(FrameFetchContextHintsTest, MonitorDPRHints) {
   ExpectHeader("http://www.example.com/1.gif", "DPR", false, "");
   ClientHintsPreferences preferences;
@@ -564,20 +582,43 @@
 }
 
 TEST_F(FrameFetchContextHintsTest, MonitorAllHints) {
+  ExpectHeader("http://www.example.com/1.gif", "device-ram", false, "");
   ExpectHeader("http://www.example.com/1.gif", "DPR", false, "");
   ExpectHeader("http://www.example.com/1.gif", "Viewport-Width", false, "");
   ExpectHeader("http://www.example.com/1.gif", "Width", false, "");
 
   ClientHintsPreferences preferences;
+  preferences.SetShouldSendDeviceRAM(true);
   preferences.SetShouldSendDPR(true);
   preferences.SetShouldSendResourceWidth(true);
   preferences.SetShouldSendViewportWidth(true);
+  MemoryCoordinator::SetPhysicalMemoryMBForTesting(4096);
   document->GetClientHintsPreferences().UpdateFrom(preferences);
+  ExpectHeader("http://www.example.com/1.gif", "device-ram", true, "4");
   ExpectHeader("http://www.example.com/1.gif", "DPR", true, "1");
   ExpectHeader("http://www.example.com/1.gif", "Width", true, "400", 400);
   ExpectHeader("http://www.example.com/1.gif", "Viewport-Width", true, "500");
 }
 
+TEST_F(FrameFetchContextHintsTest, ClientHintsDeviceRAM) {
+  EXPECT_EQ(0.125, FrameFetchContext::ClientHintsDeviceRAM(128));  // 128MB
+  EXPECT_EQ(0.25, FrameFetchContext::ClientHintsDeviceRAM(256));   // 256MB
+  EXPECT_EQ(0.25, FrameFetchContext::ClientHintsDeviceRAM(510));   // <512MB
+  EXPECT_EQ(0.5, FrameFetchContext::ClientHintsDeviceRAM(512));    // 512MB
+  EXPECT_EQ(0.5, FrameFetchContext::ClientHintsDeviceRAM(640));    // 512+128MB
+  EXPECT_EQ(0.5, FrameFetchContext::ClientHintsDeviceRAM(768));    // 512+256MB
+  EXPECT_EQ(0.5, FrameFetchContext::ClientHintsDeviceRAM(1000));   // <1GB
+  EXPECT_EQ(1, FrameFetchContext::ClientHintsDeviceRAM(1024));     // 1GB
+  EXPECT_EQ(1, FrameFetchContext::ClientHintsDeviceRAM(1536));     // 1.5GB
+  EXPECT_EQ(1, FrameFetchContext::ClientHintsDeviceRAM(2000));     // <2GB
+  EXPECT_EQ(2, FrameFetchContext::ClientHintsDeviceRAM(2048));     // 2GB
+  EXPECT_EQ(4, FrameFetchContext::ClientHintsDeviceRAM(5120));     // 5GB
+  EXPECT_EQ(8, FrameFetchContext::ClientHintsDeviceRAM(8192));     // 8GB
+  EXPECT_EQ(16, FrameFetchContext::ClientHintsDeviceRAM(16384));   // 16GB
+  EXPECT_EQ(32, FrameFetchContext::ClientHintsDeviceRAM(32768));   // 32GB
+  EXPECT_EQ(32, FrameFetchContext::ClientHintsDeviceRAM(64385));   // <64GB
+}
+
 TEST_F(FrameFetchContextTest, MainResourceCachePolicy) {
   // Default case
   ResourceRequest request("http://www.example.com");
diff --git a/third_party/WebKit/Source/core/loader/private/FrameClientHintsPreferencesContext.cpp b/third_party/WebKit/Source/core/loader/private/FrameClientHintsPreferencesContext.cpp
index 2f2ec6e9..cca8ec2 100644
--- a/third_party/WebKit/Source/core/loader/private/FrameClientHintsPreferencesContext.cpp
+++ b/third_party/WebKit/Source/core/loader/private/FrameClientHintsPreferencesContext.cpp
@@ -12,6 +12,10 @@
     LocalFrame* frame)
     : frame_(frame) {}
 
+void FrameClientHintsPreferencesContext::CountClientHintsDeviceRAM() {
+  UseCounter::Count(frame_, UseCounter::kClientHintsDeviceRAM);
+}
+
 void FrameClientHintsPreferencesContext::CountClientHintsDPR() {
   UseCounter::Count(frame_, UseCounter::kClientHintsDPR);
 }
diff --git a/third_party/WebKit/Source/core/loader/private/FrameClientHintsPreferencesContext.h b/third_party/WebKit/Source/core/loader/private/FrameClientHintsPreferencesContext.h
index d0981ce..9949e034 100644
--- a/third_party/WebKit/Source/core/loader/private/FrameClientHintsPreferencesContext.h
+++ b/third_party/WebKit/Source/core/loader/private/FrameClientHintsPreferencesContext.h
@@ -19,6 +19,7 @@
  public:
   explicit FrameClientHintsPreferencesContext(LocalFrame*);
 
+  void CountClientHintsDeviceRAM() override;
   void CountClientHintsDPR() override;
   void CountClientHintsResourceWidth() override;
   void CountClientHintsViewportWidth() override;
diff --git a/third_party/WebKit/Source/core/page/SpatialNavigation.h b/third_party/WebKit/Source/core/page/SpatialNavigation.h
index 5fa5da3a..d8dddf33 100644
--- a/third_party/WebKit/Source/core/page/SpatialNavigation.h
+++ b/third_party/WebKit/Source/core/page/SpatialNavigation.h
@@ -21,6 +21,7 @@
 #ifndef SpatialNavigation_h
 #define SpatialNavigation_h
 
+#include "core/CoreExport.h"
 #include "core/dom/Node.h"
 #include "platform/geometry/LayoutRect.h"
 #include "public/platform/WebFocusType.h"
@@ -41,7 +42,7 @@
   return 2;
 }
 
-bool IsSpatialNavigationEnabled(const LocalFrame*);
+CORE_EXPORT bool IsSpatialNavigationEnabled(const LocalFrame*);
 bool SpatialNavigationIgnoresEventHandlers(const LocalFrame*);
 
 // Spatially speaking, two given elements in a web page can be:
diff --git a/third_party/WebKit/Source/core/page/ValidationMessageClientImpl.cpp b/third_party/WebKit/Source/core/page/ValidationMessageClientImpl.cpp
index 39d3d2e..f2e3c3b 100644
--- a/third_party/WebKit/Source/core/page/ValidationMessageClientImpl.cpp
+++ b/third_party/WebKit/Source/core/page/ValidationMessageClientImpl.cpp
@@ -85,7 +85,7 @@
   web_view_.Client()->ShowValidationMessage(
       anchor_in_viewport, message_, ToWebTextDirection(message_dir),
       sub_message, ToWebTextDirection(sub_message_dir));
-  web_view_.ChromeClient().RegisterPopupOpeningObserver(this);
+  web_view_.GetChromeClient().RegisterPopupOpeningObserver(this);
 
   finish_time_ =
       MonotonicallyIncreasingTime() +
@@ -107,7 +107,7 @@
   message_ = String();
   finish_time_ = 0;
   web_view_.Client()->HideValidationMessage();
-  web_view_.ChromeClient().UnregisterPopupOpeningObserver(this);
+  web_view_.GetChromeClient().UnregisterPopupOpeningObserver(this);
 }
 
 bool ValidationMessageClientImpl::IsValidationMessageVisible(
diff --git a/third_party/WebKit/Source/core/style/ComputedStyle.cpp b/third_party/WebKit/Source/core/style/ComputedStyle.cpp
index 3e9803db..5a5a4a57 100644
--- a/third_party/WebKit/Source/core/style/ComputedStyle.cpp
+++ b/third_party/WebKit/Source/core/style/ComputedStyle.cpp
@@ -199,6 +199,7 @@
   }
 
   if (!old_style->LoadingCustomFontsEqual(*new_style) ||
+      old_style->AlignItems() != new_style->AlignItems() ||
       old_style->JustifyItems() != new_style->JustifyItems())
     return kInherit;
 
@@ -219,6 +220,9 @@
 StyleSelfAlignmentData ResolvedSelfAlignment(
     const StyleSelfAlignmentData& value,
     ItemPosition normal_value_behavior) {
+  // To avoid needing to copy the RareNonInheritedData, we repurpose the 'auto'
+  // flag to not just mean 'auto' prior to running the StyleAdjuster but also
+  // mean 'normal' after running it.
   if (value.GetPosition() == kItemPositionNormal ||
       value.GetPosition() == kItemPositionAuto)
     return {normal_value_behavior, kOverflowAlignmentDefault};
@@ -240,6 +244,9 @@
   if (!parent_style || AlignSelfPosition() != kItemPositionAuto)
     return ResolvedSelfAlignment(AlignSelf(), normal_value_behaviour);
 
+  // We shouldn't need to resolve any 'auto' value in post-adjusment
+  // ComputedStyle, but some layout models can generate anonymous boxes that may
+  // need 'auto' value resolution during layout.
   // The 'auto' keyword computes to the parent's align-items computed value.
   return parent_style->ResolvedAlignItems(normal_value_behaviour);
 }
@@ -259,6 +266,9 @@
   if (!parent_style || JustifySelfPosition() != kItemPositionAuto)
     return ResolvedSelfAlignment(JustifySelf(), normal_value_behaviour);
 
+  // We shouldn't need to resolve any 'auto' value in post-adjusment
+  // ComputedStyle, but some layout models can generate anonymous boxes that may
+  // need 'auto' value resolution during layout.
   // The auto keyword computes to the parent's justify-items computed value.
   return parent_style->ResolvedJustifyItems(normal_value_behaviour);
 }
diff --git a/third_party/WebKit/Source/core/style/ComputedStyleConstants.h b/third_party/WebKit/Source/core/style/ComputedStyleConstants.h
index 5bbe48c..42b84ced 100644
--- a/third_party/WebKit/Source/core/style/ComputedStyleConstants.h
+++ b/third_party/WebKit/Source/core/style/ComputedStyleConstants.h
@@ -343,7 +343,8 @@
 }
 
 enum ItemPosition {
-  kItemPositionAuto,
+  kItemPositionAuto,  // It will mean 'normal' after running the StyleAdjuster
+                      // to avoid resolving the initial values.
   kItemPositionNormal,
   kItemPositionStretch,
   kItemPositionBaseline,
diff --git a/third_party/WebKit/Source/core/testing/Internals.cpp b/third_party/WebKit/Source/core/testing/Internals.cpp
index 74b38a4..3b40be5 100644
--- a/third_party/WebKit/Source/core/testing/Internals.cpp
+++ b/third_party/WebKit/Source/core/testing/Internals.cpp
@@ -930,13 +930,10 @@
   }
 
   document->UpdateStyleAndLayoutIgnorePendingStylesheets();
-  if (type == DocumentMarker::kSpelling) {
-    document->Markers().AddSpellingMarker(range->StartPosition(),
-                                          range->EndPosition());
-  } else {
-    document->Markers().AddGrammarMarker(range->StartPosition(),
-                                         range->EndPosition());
-  }
+  if (type == DocumentMarker::kSpelling)
+    document->Markers().AddSpellingMarker(EphemeralRange(range));
+  else
+    document->Markers().AddGrammarMarker(EphemeralRange(range));
 }
 
 unsigned Internals::markerCountForNode(Node* node,
diff --git a/third_party/WebKit/Source/devtools/BUILD.gn b/third_party/WebKit/Source/devtools/BUILD.gn
index d883a119..98f59d6 100644
--- a/third_party/WebKit/Source/devtools/BUILD.gn
+++ b/third_party/WebKit/Source/devtools/BUILD.gn
@@ -585,6 +585,7 @@
   "front_end/sources/TabbedEditorContainer.js",
   "front_end/sources/threadsSidebarPane.css",
   "front_end/sources/ThreadsSidebarPane.js",
+  "front_end/sources/watchExpressionsSidebarPane.css",
   "front_end/sources/WatchExpressionsSidebarPane.js",
   "front_end/sources/WorkspaceMappingTip.js",
   "front_end/sources/XHRBreakpointsSidebarPane.js",
diff --git a/third_party/WebKit/Source/devtools/front_end/components/Linkifier.js b/third_party/WebKit/Source/devtools/front_end/components/Linkifier.js
index b7741cdd..2807648a 100644
--- a/third_party/WebKit/Source/devtools/front_end/components/Linkifier.js
+++ b/third_party/WebKit/Source/devtools/front_end/components/Linkifier.js
@@ -149,8 +149,10 @@
    * @return {?Element}
    */
   maybeLinkifyScriptLocation(target, scriptId, sourceURL, lineNumber, columnNumber, classes) {
-    var fallbackAnchor =
-        sourceURL ? Components.Linkifier.linkifyURL(sourceURL, undefined, classes, lineNumber, columnNumber) : null;
+    var fallbackAnchor = sourceURL ?
+        Components.Linkifier.linkifyURL(
+            sourceURL, undefined, classes, lineNumber, columnNumber, undefined, this._maxLength) :
+        null;
     if (!target || target.isDisposed())
       return fallbackAnchor;
     var debuggerModel = target.model(SDK.DebuggerModel);
@@ -187,7 +189,8 @@
    */
   linkifyScriptLocation(target, scriptId, sourceURL, lineNumber, columnNumber, classes) {
     return this.maybeLinkifyScriptLocation(target, scriptId, sourceURL, lineNumber, columnNumber, classes) ||
-        Components.Linkifier.linkifyURL(sourceURL, undefined, classes, lineNumber, columnNumber);
+        Components.Linkifier.linkifyURL(
+            sourceURL, undefined, classes, lineNumber, columnNumber, undefined, this._maxLength);
   }
 
   /**
@@ -223,8 +226,8 @@
     console.assert(stackTrace.callFrames && stackTrace.callFrames.length);
 
     var topFrame = stackTrace.callFrames[0];
-    var fallbackAnchor =
-        Components.Linkifier.linkifyURL(topFrame.url, undefined, classes, topFrame.lineNumber, topFrame.columnNumber);
+    var fallbackAnchor = Components.Linkifier.linkifyURL(
+        topFrame.url, undefined, classes, topFrame.lineNumber, topFrame.columnNumber, undefined, this._maxLength);
     if (target.isDisposed())
       return fallbackAnchor;
 
@@ -326,9 +329,10 @@
    * @param {number=} lineNumber
    * @param {number=} columnNumber
    * @param {boolean=} preventClick
+   * @param {number=} maxLength
    * @return {!Element}
    */
-  static linkifyURL(url, text, className, lineNumber, columnNumber, preventClick) {
+  static linkifyURL(url, text, className, lineNumber, columnNumber, preventClick, maxLength) {
     if (!url || url.trim().toLowerCase().startsWith('javascript:')) {
       var element = createElementWithClass('span', className);
       element.textContent = text || url || Common.UIString('(unknown)');
@@ -340,7 +344,7 @@
       linkText += ':' + (lineNumber + 1);
     var title = linkText !== url ? url : '';
     var link = Components.Linkifier._createLink(
-        linkText, className || '', UI.MaxLengthForDisplayedURLs, title, url, preventClick);
+        linkText, className || '', maxLength || UI.MaxLengthForDisplayedURLs, title, url, preventClick);
     var info = Components.Linkifier._linkInfo(link);
     if (typeof lineNumber === 'number')
       info.lineNumber = lineNumber;
diff --git a/third_party/WebKit/Source/devtools/front_end/console/ConsoleView.js b/third_party/WebKit/Source/devtools/front_end/console/ConsoleView.js
index 7d9b296..e038414 100644
--- a/third_party/WebKit/Source/devtools/front_end/console/ConsoleView.js
+++ b/third_party/WebKit/Source/devtools/front_end/console/ConsoleView.js
@@ -143,7 +143,7 @@
 
     this._messagesElement.addEventListener('contextmenu', this._handleContextMenuEvent.bind(this), false);
 
-    this._linkifier = new Components.Linkifier();
+    this._linkifier = new Components.Linkifier(Console.ConsoleViewMessage.MaxLengthForLinks);
     this._badgePool = new ProductRegistry.BadgePool();
 
     /** @type {!Array.<!Console.ConsoleViewMessage>} */
diff --git a/third_party/WebKit/Source/devtools/front_end/console/ConsoleViewMessage.js b/third_party/WebKit/Source/devtools/front_end/console/ConsoleViewMessage.js
index 3d4bc672..9f25c5e 100644
--- a/third_party/WebKit/Source/devtools/front_end/console/ConsoleViewMessage.js
+++ b/third_party/WebKit/Source/devtools/front_end/console/ConsoleViewMessage.js
@@ -285,7 +285,9 @@
         anchorElement = this._linkifyLocation(this._message.url, this._message.line, this._message.column);
       }
     } else if (this._message.url) {
-      anchorElement = Components.Linkifier.linkifyURL(this._message.url, undefined);
+      anchorElement = Components.Linkifier.linkifyURL(
+          this._message.url, undefined, undefined, undefined, undefined, undefined,
+          Console.ConsoleViewMessage.MaxLengthForLinks);
     }
 
     // Append a space to prevent the anchor text from being glued to the console message when the user selects and copies the console messages.
@@ -1277,3 +1279,9 @@
     return this._element;
   }
 };
+
+/**
+ * @const
+ * @type {number}
+ */
+Console.ConsoleViewMessage.MaxLengthForLinks = 40;
diff --git a/third_party/WebKit/Source/devtools/front_end/sources/WatchExpressionsSidebarPane.js b/third_party/WebKit/Source/devtools/front_end/sources/WatchExpressionsSidebarPane.js
index 7685f595..b4f74a8 100644
--- a/third_party/WebKit/Source/devtools/front_end/sources/WatchExpressionsSidebarPane.js
+++ b/third_party/WebKit/Source/devtools/front_end/sources/WatchExpressionsSidebarPane.js
@@ -35,8 +35,9 @@
  */
 Sources.WatchExpressionsSidebarPane = class extends UI.ThrottledWidget {
   constructor() {
-    super();
+    super(true);
     this.registerRequiredCSS('object_ui/objectValue.css');
+    this.registerRequiredCSS('sources/watchExpressionsSidebarPane.css');
 
     /** @type {!Array.<!Sources.WatchExpression>} */
     this._watchExpressions = [];
@@ -47,8 +48,8 @@
     this._refreshButton = new UI.ToolbarButton(Common.UIString('Refresh'), 'largeicon-refresh');
     this._refreshButton.addEventListener(UI.ToolbarButton.Events.Click, this.update, this);
 
-    this._bodyElement = this.element.createChild('div', 'vbox watch-expressions');
-    this._bodyElement.addEventListener('contextmenu', this._contextMenu.bind(this), false);
+    this.contentElement.classList.add('watch-expressions');
+    this.contentElement.addEventListener('contextmenu', this._contextMenu.bind(this), false);
     this._expandController = new ObjectUI.ObjectPropertiesSectionExpandController();
 
     UI.context.addFlavorChangeListener(SDK.ExecutionContext, this.update, this);
@@ -93,9 +94,9 @@
    */
   doUpdate() {
     this._linkifier.reset();
-    this._bodyElement.removeChildren();
+    this.contentElement.removeChildren();
     this._watchExpressions = [];
-    this._emptyElement = this._bodyElement.createChild('div', 'gray-info-message');
+    this._emptyElement = this.contentElement.createChild('div', 'gray-info-message');
     this._emptyElement.textContent = Common.UIString('No Watch Expressions');
     var watchExpressionStrings = this._watchExpressionsSetting.get();
     for (var i = 0; i < watchExpressionStrings.length; ++i) {
@@ -117,7 +118,7 @@
     var watchExpression = new Sources.WatchExpression(expression, this._expandController, this._linkifier);
     watchExpression.addEventListener(
         Sources.WatchExpression.Events.ExpressionUpdated, this._watchExpressionUpdated, this);
-    this._bodyElement.appendChild(watchExpression.element());
+    this.contentElement.appendChild(watchExpression.element());
     this._watchExpressions.push(watchExpression);
     return watchExpression;
   }
@@ -129,7 +130,7 @@
     var watchExpression = /** @type {!Sources.WatchExpression} */ (event.data);
     if (!watchExpression.expression()) {
       this._watchExpressions.remove(watchExpression);
-      this._bodyElement.removeChild(watchExpression.element());
+      this.contentElement.removeChild(watchExpression.element());
       this._emptyElement.classList.toggle('hidden', !!this._watchExpressions.length);
     }
 
diff --git a/third_party/WebKit/Source/devtools/front_end/sources/module.json b/third_party/WebKit/Source/devtools/front_end/sources/module.json
index 1242c5e..3dfa1de 100644
--- a/third_party/WebKit/Source/devtools/front_end/sources/module.json
+++ b/third_party/WebKit/Source/devtools/front_end/sources/module.json
@@ -670,6 +670,7 @@
         "sourcesSearch.css",
         "sourcesView.css",
         "threadsSidebarPane.css",
+        "watchExpressionsSidebarPane.css",
         "dialog.css"
     ]
 }
diff --git a/third_party/WebKit/Source/devtools/front_end/sources/sourcesPanel.css b/third_party/WebKit/Source/devtools/front_end/sources/sourcesPanel.css
index cc1be1f..790456602 100644
--- a/third_party/WebKit/Source/devtools/front_end/sources/sourcesPanel.css
+++ b/third_party/WebKit/Source/devtools/front_end/sources/sourcesPanel.css
@@ -68,107 +68,6 @@
     cursor: auto;
 }
 
-.watch-expression-delete-button {
-    width: 10px;
-    height: 10px;
-    background-image: url(Images/deleteIcon.png);
-    background-position: 0 0;
-    background-color: transparent;
-    background-repeat: no-repeat;
-    border: 0 none transparent;
-    position: absolute;
-    top: 4px;
-    right: 3px;
-    display: none;
-}
-
-.watch-expression-header:hover .watch-expression-delete-button {
-    display: inline;
-}
-
-.watch-expressions {
-    overflow-x: hidden;
-    min-height: 26px;
-}
-
-.watch-expressions .dimmed {
-    opacity: 0.6;
-}
-
-.watch-expression-title {
-    white-space: nowrap;
-    text-overflow: ellipsis;
-    overflow: hidden;
-    line-height: 16px;
-    margin-left: 11px;
-}
-
-.watch-expression-object-header .watch-expression-title {
-    margin-left: 1px;
-}
-
-.watch-expression {
-    position: relative;
-    padding: 1px 0px 1px 6px;
-    flex: none;
-    min-height: 20px;
-}
-
-.watch-expressions .name {
-    color: rgb(136, 19, 145);
-    flex: none;
-    white-space: nowrap;
-    text-overflow: ellipsis ;
-    overflow: hidden;
-}
-
-.watch-expression-error {
-    color: red;
-}
-
-.-theme-with-dark-background .watch-expression-error {
-    color: hsl(0, 100%, 65%);
-}
-
-.watch-expressions-separator {
-    flex: none;
-}
-
-.watch-expressions .value {
-    white-space: nowrap;
-    display: inline;
-}
-
-.watch-expression .text-prompt {
-    text-overflow: clip;
-    overflow: hidden;
-    white-space: nowrap;
-    padding-left: 4px;
-    -webkit-user-select: text;
-}
-
-.watch-expression-text-prompt-proxy {
-    margin-left: 12px;
-}
-
-.watch-expression-header {
-    flex: auto;
-}
-
-.watch-expression-object-header {
-    margin-left: -12px;
-    padding-left: 12px;
-}
-
-.watch-expression-header:hover {
-    background-color: #F0F0F0;
-    padding-right: 14px;
-}
-
-.sidebar-pane-stack .watch-expressions {
-    margin-top: 0px;
-}
-
 .event-listeners-sidebar-pane .toolbar {
     border-bottom: 1px solid #eee;
 }
diff --git a/third_party/WebKit/Source/devtools/front_end/sources/watchExpressionsSidebarPane.css b/third_party/WebKit/Source/devtools/front_end/sources/watchExpressionsSidebarPane.css
new file mode 100644
index 0000000..c9431eb0
--- /dev/null
+++ b/third_party/WebKit/Source/devtools/front_end/sources/watchExpressionsSidebarPane.css
@@ -0,0 +1,102 @@
+/*
+ * Copyright 2017 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.
+ */
+
+.watch-expression-delete-button {
+    width: 10px;
+    height: 10px;
+    background-image: url(Images/deleteIcon.png);
+    background-position: 0 0;
+    background-color: transparent;
+    background-repeat: no-repeat;
+    border: 0 none transparent;
+    position: absolute;
+    top: 4px;
+    right: 3px;
+    display: none;
+}
+
+.watch-expression-header:hover .watch-expression-delete-button {
+    display: inline;
+}
+
+.watch-expressions {
+    overflow-x: hidden;
+    min-height: 26px;
+}
+
+.watch-expressions .dimmed {
+    opacity: 0.6;
+}
+
+.watch-expression-title {
+    white-space: nowrap;
+    text-overflow: ellipsis;
+    overflow: hidden;
+    line-height: 16px;
+    margin-left: 11px;
+}
+
+.watch-expression-object-header .watch-expression-title {
+    margin-left: 1px;
+}
+
+.watch-expression {
+    position: relative;
+    padding: 1px 0px 1px 6px;
+    flex: none;
+    min-height: 20px;
+}
+
+.watch-expressions .name {
+    color: rgb(136, 19, 145);
+    flex: none;
+    white-space: nowrap;
+    text-overflow: ellipsis ;
+    overflow: hidden;
+}
+
+.watch-expression-error {
+    color: red;
+}
+
+:host-context(.-theme-with-dark-background) .watch-expression-error {
+    color: hsl(0, 100%, 65%);
+}
+
+.watch-expressions-separator {
+    flex: none;
+}
+
+.watch-expressions .value {
+    white-space: nowrap;
+    display: inline;
+}
+
+.watch-expression .text-prompt {
+    text-overflow: clip;
+    overflow: hidden;
+    white-space: nowrap;
+    padding-left: 4px;
+    -webkit-user-select: text;
+}
+
+.watch-expression-text-prompt-proxy {
+    margin-left: 12px;
+}
+
+.watch-expression-header {
+    flex: auto;
+}
+
+.watch-expression-object-header {
+    margin-left: -12px;
+    padding-left: 12px;
+}
+
+.watch-expression-header:hover {
+    background-color: #F0F0F0;
+    padding-right: 14px;
+}
diff --git a/third_party/WebKit/Source/modules/media_controls/MediaControlsImpl.cpp b/third_party/WebKit/Source/modules/media_controls/MediaControlsImpl.cpp
index f5a7ef2..f571a762 100644
--- a/third_party/WebKit/Source/modules/media_controls/MediaControlsImpl.cpp
+++ b/third_party/WebKit/Source/modules/media_controls/MediaControlsImpl.cpp
@@ -36,6 +36,7 @@
 #include "core/dom/ResizeObserver.h"
 #include "core/dom/ResizeObserverEntry.h"
 #include "core/dom/TaskRunnerHelper.h"
+#include "core/events/KeyboardEvent.h"
 #include "core/events/MouseEvent.h"
 #include "core/frame/Settings.h"
 #include "core/frame/UseCounter.h"
@@ -46,6 +47,7 @@
 #include "core/html/track/TextTrackList.h"
 #include "core/layout/LayoutObject.h"
 #include "core/layout/LayoutTheme.h"
+#include "core/page/SpatialNavigation.h"
 #include "modules/media_controls/MediaControlsMediaEventListener.h"
 #include "modules/media_controls/MediaControlsOrientationLockDelegate.h"
 #include "modules/media_controls/MediaControlsRotateToFullscreenDelegate.h"
@@ -849,6 +851,24 @@
   if (event->type() == EventTypeNames::focusin ||
       event->type() == EventTypeNames::input)
     ResetHideMediaControlsTimer();
+
+  if (event->IsKeyboardEvent() &&
+      !IsSpatialNavigationEnabled(GetDocument().GetFrame())) {
+    const String& key = ToKeyboardEvent(event)->key();
+    if (key == "Enter" || ToKeyboardEvent(event)->keyCode() == ' ') {
+      play_button_->OnMediaKeyboardEvent(event);
+      return;
+    }
+    if (key == "ArrowLeft" || key == "ArrowRight" || key == "Home" ||
+        key == "End") {
+      timeline_->OnMediaKeyboardEvent(event);
+      return;
+    }
+    if (key == "ArrowDown" || key == "ArrowUp") {
+      volume_slider_->OnMediaKeyboardEvent(event);
+      return;
+    }
+  }
 }
 
 void MediaControlsImpl::HideMediaControlsTimerFired(TimerBase*) {
diff --git a/third_party/WebKit/Source/modules/media_controls/MediaControlsImpl.h b/third_party/WebKit/Source/modules/media_controls/MediaControlsImpl.h
index 02d6d9a..4013981 100644
--- a/third_party/WebKit/Source/modules/media_controls/MediaControlsImpl.h
+++ b/third_party/WebKit/Source/modules/media_controls/MediaControlsImpl.h
@@ -209,6 +209,7 @@
   void OnEnteredFullscreen();
   void OnExitedFullscreen();
   void OnPanelKeypress();
+  void OnMediaKeyboardEvent(Event* event) { DefaultEventHandler(event); }
 
   // Media control elements.
   Member<MediaControlOverlayEnclosureElement> overlay_enclosure_;
diff --git a/third_party/WebKit/Source/modules/media_controls/MediaControlsMediaEventListener.cpp b/third_party/WebKit/Source/modules/media_controls/MediaControlsMediaEventListener.cpp
index 69df9e8..093d15c 100644
--- a/third_party/WebKit/Source/modules/media_controls/MediaControlsMediaEventListener.cpp
+++ b/third_party/WebKit/Source/modules/media_controls/MediaControlsMediaEventListener.cpp
@@ -35,6 +35,9 @@
   GetMediaElement().addEventListener(EventTypeNames::error, this, false);
   GetMediaElement().addEventListener(EventTypeNames::loadedmetadata, this,
                                      false);
+  GetMediaElement().addEventListener(EventTypeNames::keypress, this, false);
+  GetMediaElement().addEventListener(EventTypeNames::keydown, this, false);
+  GetMediaElement().addEventListener(EventTypeNames::keyup, this, false);
 
   // Listen to two different fullscreen events in order to make sure the new and
   // old APIs are handled.
@@ -181,8 +184,16 @@
 
   // Keypress events.
   if (event->type() == EventTypeNames::keypress) {
-    if (event->currentTarget() == media_controls_->PanelElement())
+    if (event->currentTarget() == media_controls_->PanelElement()) {
       media_controls_->OnPanelKeypress();
+      return;
+    }
+  }
+
+  if (event->type() == EventTypeNames::keypress ||
+      event->type() == EventTypeNames::keydown ||
+      event->type() == EventTypeNames::keyup) {
+    media_controls_->OnMediaKeyboardEvent(event);
     return;
   }
 
diff --git a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlPlayButtonElement.h b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlPlayButtonElement.h
index b9e75df..ab42606 100644
--- a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlPlayButtonElement.h
+++ b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlPlayButtonElement.h
@@ -22,6 +22,8 @@
   WebLocalizedString::Name GetOverflowStringName() override;
   bool HasOverflowButton() override;
 
+  void OnMediaKeyboardEvent(Event* event) { DefaultEventHandler(event); }
+
  private:
   void DefaultEventHandler(Event*) override;
 };
diff --git a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlTimelineElement.h b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlTimelineElement.h
index ea412ba6..9f3034c 100644
--- a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlTimelineElement.h
+++ b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlTimelineElement.h
@@ -27,6 +27,8 @@
 
   void OnPlaying();
 
+  void OnMediaKeyboardEvent(Event* event) { DefaultEventHandler(event); }
+
  private:
   void DefaultEventHandler(Event*) override;
   bool KeepEventInNode(Event*) override;
diff --git a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlVolumeSliderElement.h b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlVolumeSliderElement.h
index 1bb2b658..2e3c434 100644
--- a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlVolumeSliderElement.h
+++ b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlVolumeSliderElement.h
@@ -23,6 +23,8 @@
   bool WillRespondToMouseMoveEvents() override;
   bool WillRespondToMouseClickEvents() override;
 
+  void OnMediaKeyboardEvent(Event* event) { DefaultEventHandler(event); }
+
  private:
   void DefaultEventHandler(Event*) override;
   bool KeepEventInNode(Event*) override;
diff --git a/third_party/WebKit/Source/modules/webaudio/BiquadDSPKernel.cpp b/third_party/WebKit/Source/modules/webaudio/BiquadDSPKernel.cpp
index 85fda7fa..1b2c73d 100644
--- a/third_party/WebKit/Source/modules/webaudio/BiquadDSPKernel.cpp
+++ b/third_party/WebKit/Source/modules/webaudio/BiquadDSPKernel.cpp
@@ -31,13 +31,6 @@
 
 namespace blink {
 
-// FIXME: As a recursive linear filter, depending on its parameters, a biquad
-// filter can have an infinite tailTime. In practice, Biquad filters do not
-// usually (except for very high resonance values) have a tailTime of longer
-// than approx. 200ms. This value could possibly be calculated based on the
-// settings of the Biquad.
-static const double kMaxBiquadDelayTime = 0.2;
-
 void BiquadDSPKernel::UpdateCoefficientsIfNecessary(int frames_to_process) {
   if (GetBiquadProcessor()->FilterCoefficientsDirty()) {
     float cutoff_frequency[AudioUtilities::kRenderQuantumFrames];
@@ -121,6 +114,23 @@
         break;
     }
   }
+
+  UpdateTailTime(number_of_frames - 1);
+}
+
+void BiquadDSPKernel::UpdateTailTime(int coef_index) {
+  // A reasonable upper limit for the tail time.  While it's easy to
+  // create biquad filters whose tail time can be much larger than
+  // this, limit the maximum to this value so that we don't keep such
+  // nodes alive "forever".
+  // TODO: What is a reasonable upper limit?
+  const double kMaxTailTime = 30;
+
+  double sample_rate = SampleRate();
+  double tail =
+      biquad_.TailFrame(coef_index, kMaxTailTime * sample_rate) / sample_rate;
+
+  tail_time_ = clampTo(tail, 0.0, kMaxTailTime);
 }
 
 void BiquadDSPKernel::Process(const float* source,
@@ -199,7 +209,7 @@
 }
 
 double BiquadDSPKernel::TailTime() const {
-  return kMaxBiquadDelayTime;
+  return tail_time_;
 }
 
 double BiquadDSPKernel::LatencyTime() const {
diff --git a/third_party/WebKit/Source/modules/webaudio/BiquadDSPKernel.h b/third_party/WebKit/Source/modules/webaudio/BiquadDSPKernel.h
index efeb3eb0..99069ef 100644
--- a/third_party/WebKit/Source/modules/webaudio/BiquadDSPKernel.h
+++ b/third_party/WebKit/Source/modules/webaudio/BiquadDSPKernel.h
@@ -75,8 +75,15 @@
                           const float* detune);
 
  private:
+  // Compute the tail time using the BiquadFilter coefficients at
+  // index |coef_index|.
+  void UpdateTailTime(int coef_index);
+
   // Synchronize process() with getting and setting the filter coefficients.
   mutable Mutex process_lock_;
+
+  // The current tail time for biquad filter.
+  double tail_time_;
 };
 
 }  // namespace blink
diff --git a/third_party/WebKit/Source/platform/MemoryCoordinator.cpp b/third_party/WebKit/Source/platform/MemoryCoordinator.cpp
index c157501..e9cf30e 100644
--- a/third_party/WebKit/Source/platform/MemoryCoordinator.cpp
+++ b/third_party/WebKit/Source/platform/MemoryCoordinator.cpp
@@ -14,6 +14,7 @@
 
 // static
 bool MemoryCoordinator::is_low_end_device_ = false;
+int64_t MemoryCoordinator::physical_memory_mb_ = 0;
 
 // static
 bool MemoryCoordinator::IsLowEndDevice() {
@@ -21,8 +22,20 @@
 }
 
 // static
+int64_t MemoryCoordinator::GetPhysicalMemoryMB() {
+  return physical_memory_mb_;
+}
+
+// static
+void MemoryCoordinator::SetPhysicalMemoryMBForTesting(
+    int64_t physical_memory_mb) {
+  physical_memory_mb_ = physical_memory_mb;
+}
+
+// static
 void MemoryCoordinator::Initialize() {
   is_low_end_device_ = ::base::SysInfo::IsLowEndDevice();
+  physical_memory_mb_ = ::base::SysInfo::AmountOfPhysicalMemoryMB();
 }
 
 // static
diff --git a/third_party/WebKit/Source/platform/MemoryCoordinator.h b/third_party/WebKit/Source/platform/MemoryCoordinator.h
index 087eb534..c8e137b0 100644
--- a/third_party/WebKit/Source/platform/MemoryCoordinator.h
+++ b/third_party/WebKit/Source/platform/MemoryCoordinator.h
@@ -39,9 +39,16 @@
   // Can be overridden in layout tests via internals.
   static bool IsLowEndDevice();
 
-  // Caches whether this device is a low-end device in a static member.
-  // instance() is not used as it's a heap allocated object - meaning it's not
-  // thread-safe as well as might break tests counting the heap size.
+  // Returns the amount of physical memory in megabytes on the device.
+  static int64_t GetPhysicalMemoryMB();
+
+  // Override the value of the physical memory for testing.
+  static void SetPhysicalMemoryMBForTesting(int64_t);
+
+  // Caches whether this device is a low-end device and the device physical
+  // memory in static members. instance() is not used as it's a heap allocated
+  // object - meaning it's not thread-safe as well as might break tests counting
+  // the heap size.
   static void Initialize();
 
   void RegisterClient(MemoryCoordinatorClient*);
@@ -67,6 +74,7 @@
   void ClearMemory();
 
   static bool is_low_end_device_;
+  static int64_t physical_memory_mb_;
 
   HeapHashSet<WeakMember<MemoryCoordinatorClient>> clients_;
 };
diff --git a/third_party/WebKit/Source/platform/RuntimeEnabledFeatures.json5 b/third_party/WebKit/Source/platform/RuntimeEnabledFeatures.json5
index 70e102ed6..4175f08 100644
--- a/third_party/WebKit/Source/platform/RuntimeEnabledFeatures.json5
+++ b/third_party/WebKit/Source/platform/RuntimeEnabledFeatures.json5
@@ -348,6 +348,10 @@
       status: "experimental",
     },
     {
+      name: "DeviceRAMHeader",
+      status: "test",
+    },
+    {
       name: "DisplayList2dCanvas",
       status: "stable",
     },
diff --git a/third_party/WebKit/Source/platform/audio/Biquad.cpp b/third_party/WebKit/Source/platform/audio/Biquad.cpp
index 64d6b26..8505bda 100644
--- a/third_party/WebKit/Source/platform/audio/Biquad.cpp
+++ b/third_party/WebKit/Source/platform/audio/Biquad.cpp
@@ -591,4 +591,298 @@
   }
 }
 
+static double RepeatedRootResponse(double n,
+                                   double c1,
+                                   double c2,
+                                   double r,
+                                   double log_eps) {
+  // The response is h(n) = r^(n-2)*[c1*(n+1)*r^2+c2]. We're looking
+  // for n such that |h(n)| = eps.  Equivalently, we want a root
+  // of the equation log(|h(n)|) - log(eps) = 0 or
+  //
+  //   (n-2)*log(r) + log(|c1*(n+1)*r^2+c2|) - log(eps)
+  //
+  // This helps with finding a nuemrical solution because this
+  // approximately linearizes the response for large n.
+
+  return (n - 2) * log(r) + log(fabs(c1 * (n + 1) * r * r + c2)) - log_eps;
+}
+
+// Regula Falsi root finder, Illinois variant
+// (https://en.wikipedia.org/wiki/False_position_method#The_Illinois_algorithm).
+//
+// This finds a root of the repeated root response where the root is
+// assumed to lie between |low| and |high|.  The response is given by
+// |c1|, |c2|, and |r| as determined by |RepeatedRootResponse|.
+// |log_eps| is the log the the maximum allowed amplitude in the
+// response.
+static double RootFinder(double low,
+                         double high,
+                         double log_eps,
+                         double c1,
+                         double c2,
+                         double r) {
+  // Desired accuray of the root (in frames).  This doesn't need to be
+  // super-accurate, so half frame is good enough, and should be less
+  // than 1 because the algorithm may prematurely terminate.
+  const double kAccuracyThreshold = 0.5;
+  // Max number of iterations to do.  If we haven't converged by now,
+  // just return whatever we've found.
+  const int kMaxIterations = 10;
+
+  int side = 0;
+  double root = 0;
+  double f_low = RepeatedRootResponse(low, c1, c2, r, log_eps);
+  double f_high = RepeatedRootResponse(high, c1, c2, r, log_eps);
+
+  // The function values must be finite and have opposite signs!
+  DCHECK(std::isfinite(f_low));
+  DCHECK(std::isfinite(f_high));
+  DCHECK_LE(f_low * f_high, 0);
+
+  int iteration;
+  for (iteration = 0; iteration < kMaxIterations; ++iteration) {
+    root = (f_low * high - f_high * low) / (f_low - f_high);
+    if (fabs(high - low) < kAccuracyThreshold * fabs(high + low))
+      break;
+    double fr = RepeatedRootResponse(root, c1, c2, r, log_eps);
+
+    DCHECK(std::isfinite(fr));
+
+    if (fr * f_high > 0) {
+      // fr and f_high have same sign.  Copy root to f_high
+      high = root;
+      f_high = fr;
+      side = -1;
+    } else if (f_low * fr > 0) {
+      // fr and f_low have same sign. Copy root to f_low
+      low = root;
+      f_low = fr;
+      if (side == 1)
+        f_high /= 2;
+      side = 1;
+    } else {
+      // f_low * fr looks like zero, so assume we've converged.
+      break;
+    }
+  }
+
+  // Want to know if the max number of iterations is ever exceeded so
+  // we can understand why that happened.
+  DCHECK_LT(iteration, kMaxIterations);
+
+  return root;
+}
+
+double Biquad::TailFrame(int coef_index, double max_frame) {
+  // The Biquad filter is given by
+  //
+  //   H(z) = (b0 + b1/z + b2/z^2)/(1 + a1/z + a2/z^2).
+  //
+  // To compute the tail time, compute the impulse response, h(n), of
+  // H(z), which we can do analytically.  From this impulse response,
+  // find the value n0 where |h(n)| <= eps for n >= n0.
+  //
+  // Assume first that the two poles of H(z) are not repeated, say r1
+  // and r2.  Then, we can compute a partial fraction expansion of
+  // H(z):
+  //
+  //   H(z) = (b0+b1/z+b2/z^2)/[(1-r1/z)*(1-r2/z)]
+  //        = b0 + C2/(z-r2) - C1/(z-r1)
+  //
+  //  where
+  //    C2 = (b0*r2^2+b1*r2+b2)/(r2-r1)
+  //    C1 = (b0*r1^2+b1*r1+b2)/(r2-r1)
+  //
+  // Expand H(z) then this in powers of 1/z gives:
+  //
+  //   H(z) = b0 -(C2/r2+C1/r1) + sum(C2*r2^(i-1)/z^i + C1*r1^(i-1)/z^i)
+  //
+  // Thus, for n > 1 (we don't care about small n),
+  //
+  //   h(n) = C2*r2^(n-1) + C1*r1^(n-1)
+  //
+  // We need to find n0 such that |h(n)| < eps for n > n0.
+  //
+  // Case 1: r1 and r2 are real and distinct, with |r1|>=|r2|.
+  //
+  // Then
+  //
+  //   h(n) = C1*r1^(n-1)*(1 + C2/C1*(r2/r1)^(n-1))
+  //
+  // so
+  //
+  //   |h(n)| = |C1|*|r|^(n-1)*|1+C2/C1*(r2/r1)^(n-1)|
+  //          <= |C1|*|r|^(n-1)*[1 + |C2/C1|*|r2/r1|^(n-1)]
+  //          <= |C1|*|r|^(n-1)*[1 + |C2/C1|]
+  //
+  // by using the triangle inequality and the fact that |r2|<=|r1|.
+  // And we want |h(n)|<=eps which is true if
+  //
+  //   |C1|*|r|^(n-1)*[1 + |C2/C1|] <= eps
+  //
+  // or
+  //
+  //   n >= 1 + log(eps/C)/log(|r1|)
+  //
+  // where C = |C1|*[1+|C2/C1|] = |C1| + |C2|.
+  //
+  // Case 2: r1 and r2 are complex
+  //
+  // Thne we can write r1=r*exp(i*p) and r2=r*exp(-i*p).  So,
+  //
+  //   |h(n)| = |C2*r^(n-1)*exp(-i*p*(n-1)) + C1*r^(n-1)*exp(i*p*(n-1))|
+  //          = |C1|*r^(n-1)*|1 + C2/C1*exp(-i*p*(n-1))/exp(i*n*(n-1))|
+  //          <= |C1|*r^(n-1)*[1 + |C2/C1|]
+  //
+  // Again, this is easily solved to give
+  //
+  //   n >= 1 + log(eps/C)/log(r)
+  //
+  // where C = |C1|*[1+|C2/C1|] = |C1| + |C2|.
+  //
+  // Case 3: Repeated roots, r1=r2=r.
+  //
+  // In this case,
+  //
+  //   H(z) = (b0+b1/z+b2/z^2)/[(1-r/z)^2
+  //
+  // Expanding this in powers of 1/z gives:
+  //
+  //   H(z) = C1*sum((i+1)*r^i/z^i) - C2 * sum(r^(i-2)/z^i) + b2/r^2
+  //        = b2/r^2 + sum([C1*(i+1)*r^i + C2*r^(i-2)]/z^i)
+  // where
+  //   C1 = (b0*r^2+b1*r+b2)/r^2
+  //   C2 = b1*r+2*b2
+  //
+  // Thus, the impulse response is
+  //
+  //   h(n) = C1*(n+1)*r^n + C2*r^(n-2)
+  //        = r^(n-2)*[C1*(n+1)*r^2+C2]
+  //
+  // So
+  //
+  //   |h(n)| = |r|^(n-2)*|C1*(n+1)*r^2+C2|
+  //
+  // To find n such that |h(n)| < eps, we need a numerical method in
+  // general, so there's no real reason to simplify this or use other
+  // approximations.  Just solve |h(n)|=eps directly.
+  //
+  // Thus, for an set of filter coefficients, we can compute the tail
+  // time.
+  //
+
+  // If the maximum amplitude of the impulse response is less than
+  // this, we assume that we've reached the tail of the response.
+  // Currently, this means that the impulse is less than 1 bit of a
+  // 16-bit PCM value.
+  const double kMaxTailAmplitude = 1 / 32768.0;
+
+  // Find the roots of 1+a1/z+a2/z^2 = 0.  Or equivalently,
+  // z^2+a1*z+a2 = 0.  From the quadratic formula the roots are
+  // (-a1+/-sqrt(a1^2-4*a2))/2.
+
+  double a1 = a1_[coef_index];
+  double a2 = a2_[coef_index];
+  double b0 = b0_[coef_index];
+  double b1 = b1_[coef_index];
+  double b2 = b2_[coef_index];
+
+  double tail_frame = 0;
+  double discrim = a1 * a1 - 4 * a2;
+
+  if (discrim > 0) {
+    // Compute the real roots so that r1 has the largest magnitude.
+    double r1;
+    double r2;
+    if (a1 < 0) {
+      r1 = (-a1 + sqrt(discrim)) / 2;
+    } else {
+      r1 = (-a1 - sqrt(discrim)) / 2;
+    }
+    r2 = a2 / r1;
+
+    double c1 = (b0 * r1 * r1 + b1 * r1 + b2) / (r2 - r1);
+    double c2 = (b0 * r2 * r2 + b1 * r2 + b2) / (r2 - r1);
+
+    DCHECK(std::isfinite(r1));
+    DCHECK(std::isfinite(r2));
+    DCHECK(std::isfinite(c1));
+    DCHECK(std::isfinite(c2));
+
+    // It's possible for kMaxTailAmplitude to be greater than c1 + c2.
+    // This may produce a negative tail frame.  Just clamp the tail
+    // frame to 0.
+    tail_frame = clampTo(
+        1 + log(kMaxTailAmplitude / (fabs(c1) + fabs(c2))) / log(r1), 0);
+
+    DCHECK(std::isfinite(tail_frame));
+  } else if (discrim < 0) {
+    // Two complex roots.
+    // One root is -a1/2 + i*sqrt(-discrim)/2.
+    double x = -a1 / 2;
+    double y = sqrt(-discrim) / 2;
+    std::complex<double> r1(x, y);
+    std::complex<double> r2(x, -y);
+    double r = hypot(x, y);
+
+    DCHECK(std::isfinite(r));
+
+    // It's possible for r to be 1. (LPF with Q very large can cause this.)
+    if (r == 1) {
+      tail_frame = max_frame;
+    } else {
+      double c1 = abs((b0 * r1 * r1 + b1 * r1 + b2) / (r2 - r1));
+      double c2 = abs((b0 * r2 * r2 + b1 * r2 + b2) / (r2 - r1));
+
+      DCHECK(std::isfinite(c1));
+      DCHECK(std::isfinite(c2));
+
+      tail_frame = 1 + log(kMaxTailAmplitude / (c1 + c2)) / log(r);
+      DCHECK(std::isfinite(tail_frame));
+    }
+  } else {
+    // Repeated roots.  This should be pretty rare because all the
+    // coefficients need to be just the right values to get a
+    // discriminant of exactly zero.
+    double r = -a1 / 2;
+
+    if (r == 0) {
+      // Double pole at 0.  This just delays the signal by 2 frames,
+      // so set the tail frame to 2.
+      tail_frame = 2;
+    } else {
+      double c1 = (b0 * r * r + b1 * r + b2) / (r * r);
+      double c2 = b1 * r + 2 * b2;
+
+      DCHECK(std::isfinite(c1));
+      DCHECK(std::isfinite(c2));
+
+      // It can happen that c1=c2=0.  This basically means that H(z) =
+      // constant, which is the limiting case for several of the
+      // biquad filters.
+      if (c1 == 0 && c2 == 0) {
+        tail_frame = 0;
+      } else {
+        // The function c*(n+1)*r^n is not monotonic, but it's easy to
+        // find the max point since the derivative is
+        // c*r^n*(1+(n+1)*log(r)).  This has a root at
+        // -(1+log(r))/log(r). so we can start our search from that
+        // point to max_frames.
+
+        double low = clampTo(-(1 + log(r)) / log(r), 1.0,
+                             static_cast<double>(max_frame - 1));
+        double high = max_frame;
+
+        DCHECK(std::isfinite(low));
+        DCHECK(std::isfinite(high));
+
+        tail_frame = RootFinder(low, high, log(kMaxTailAmplitude), c1, c2, r);
+      }
+    }
+  }
+
+  return tail_frame;
+}
+
 }  // namespace blink
diff --git a/third_party/WebKit/Source/platform/audio/Biquad.h b/third_party/WebKit/Source/platform/audio/Biquad.h
index 7a6bde19..9d51ba3 100644
--- a/third_party/WebKit/Source/platform/audio/Biquad.h
+++ b/third_party/WebKit/Source/platform/audio/Biquad.h
@@ -70,6 +70,13 @@
   // Resets filter state
   void Reset();
 
+  // Compute tail frame based on the filter coefficents at index
+  // |coef_index|.  The tail frame is the frame number where the
+  // impulse response of the filter falls below a threshold value.
+  // The maximum allowed frame value is given by |max_frame|.  This
+  // limits how much work is done in computing the frame numer.
+  double TailFrame(int coef_index, double max_frame);
+
   // Filter response at a set of n frequencies. The magnitude and
   // phase response are returned in magResponse and phaseResponse.
   // The phase response is in radians.
diff --git a/third_party/WebKit/Source/platform/graphics/ImageFrameGenerator.cpp b/third_party/WebKit/Source/platform/graphics/ImageFrameGenerator.cpp
index 034144f..5ed0c32 100644
--- a/third_party/WebKit/Source/platform/graphics/ImageFrameGenerator.cpp
+++ b/third_party/WebKit/Source/platform/graphics/ImageFrameGenerator.cpp
@@ -101,15 +101,12 @@
   if (!decoder->CanDecodeToYUV())
     return false;
 
-  IntSize size = decoder->DecodedYUVSize(0);
-  component_sizes[0].set(size.Width(), size.Height());
-  component_width_bytes[0] = decoder->DecodedYUVWidthBytes(0);
-  size = decoder->DecodedYUVSize(1);
-  component_sizes[1].set(size.Width(), size.Height());
-  component_width_bytes[1] = decoder->DecodedYUVWidthBytes(1);
-  size = decoder->DecodedYUVSize(2);
-  component_sizes[2].set(size.Width(), size.Height());
-  component_width_bytes[2] = decoder->DecodedYUVWidthBytes(2);
+  for (int yuv_index = 0; yuv_index < 3; ++yuv_index) {
+    IntSize size = decoder->DecodedYUVSize(yuv_index);
+    component_sizes[yuv_index].set(size.Width(), size.Height());
+    component_width_bytes[yuv_index] = decoder->DecodedYUVWidthBytes(yuv_index);
+  }
+
   return true;
 }
 
diff --git a/third_party/WebKit/Source/platform/loader/fetch/ClientHintsPreferences.cpp b/third_party/WebKit/Source/platform/loader/fetch/ClientHintsPreferences.cpp
index 4e0a5ed8..4c3a6340 100644
--- a/third_party/WebKit/Source/platform/loader/fetch/ClientHintsPreferences.cpp
+++ b/third_party/WebKit/Source/platform/loader/fetch/ClientHintsPreferences.cpp
@@ -10,12 +10,14 @@
 namespace blink {
 
 ClientHintsPreferences::ClientHintsPreferences()
-    : should_send_dpr_(false),
+    : should_send_device_ram_(false),
+      should_send_dpr_(false),
       should_send_resource_width_(false),
       should_send_viewport_width_(false) {}
 
 void ClientHintsPreferences::UpdateFrom(
     const ClientHintsPreferences& preferences) {
+  should_send_device_ram_ = preferences.should_send_device_ram_;
   should_send_dpr_ = preferences.should_send_dpr_;
   should_send_resource_width_ = preferences.should_send_resource_width_;
   should_send_viewport_width_ = preferences.should_send_viewport_width_;
@@ -29,6 +31,13 @@
 
   CommaDelimitedHeaderSet accept_client_hints_header;
   ParseCommaDelimitedHeader(header_value, accept_client_hints_header);
+  if (RuntimeEnabledFeatures::deviceRAMHeaderEnabled() &&
+      accept_client_hints_header.Contains("device-ram")) {
+    if (context)
+      context->CountClientHintsDeviceRAM();
+    should_send_device_ram_ = true;
+  }
+
   if (accept_client_hints_header.Contains("dpr")) {
     if (context)
       context->CountClientHintsDPR();
diff --git a/third_party/WebKit/Source/platform/loader/fetch/ClientHintsPreferences.h b/third_party/WebKit/Source/platform/loader/fetch/ClientHintsPreferences.h
index a25e218..3de29e0f 100644
--- a/third_party/WebKit/Source/platform/loader/fetch/ClientHintsPreferences.h
+++ b/third_party/WebKit/Source/platform/loader/fetch/ClientHintsPreferences.h
@@ -17,6 +17,7 @@
  public:
   class Context {
    public:
+    virtual void CountClientHintsDeviceRAM() = 0;
     virtual void CountClientHintsDPR() = 0;
     virtual void CountClientHintsResourceWidth() = 0;
     virtual void CountClientHintsViewportWidth() = 0;
@@ -30,6 +31,9 @@
   void UpdateFrom(const ClientHintsPreferences&);
   void UpdateFromAcceptClientHintsHeader(const String& header_value, Context*);
 
+  bool ShouldSendDeviceRAM() const { return should_send_device_ram_; }
+  void SetShouldSendDeviceRAM(bool should) { should_send_device_ram_ = should; }
+
   bool ShouldSendDPR() const { return should_send_dpr_; }
   void SetShouldSendDPR(bool should) { should_send_dpr_ = should; }
 
@@ -44,6 +48,7 @@
   }
 
  private:
+  bool should_send_device_ram_;
   bool should_send_dpr_;
   bool should_send_resource_width_;
   bool should_send_viewport_width_;
diff --git a/third_party/WebKit/Source/web/WebDevToolsAgentImpl.cpp b/third_party/WebKit/Source/web/WebDevToolsAgentImpl.cpp
index 1e3a696..6118ed2f 100644
--- a/third_party/WebKit/Source/web/WebDevToolsAgentImpl.cpp
+++ b/third_party/WebKit/Source/web/WebDevToolsAgentImpl.cpp
@@ -167,7 +167,7 @@
     // 1. Disable input events.
     WebFrameWidgetBase::SetIgnoreInputEvents(true);
     for (const auto view : WebViewBase::AllInstances())
-      view->ChromeClient().NotifyPopupOpeningObservers();
+      view->GetChromeClient().NotifyPopupOpeningObservers();
 
     // 2. Notify embedder about pausing.
     if (agent->Client())
diff --git a/third_party/WebKit/Source/web/WebViewImpl.h b/third_party/WebKit/Source/web/WebViewImpl.h
index 0d2ef17..157d72a 100644
--- a/third_party/WebKit/Source/web/WebViewImpl.h
+++ b/third_party/WebKit/Source/web/WebViewImpl.h
@@ -496,7 +496,7 @@
     return last_frame_time_monotonic_;
   }
 
-  class ChromeClient& ChromeClient() const override {
+  class ChromeClient& GetChromeClient() const override {
     return *chrome_client_.Get();
   }
 
@@ -603,9 +603,7 @@
   WebViewClient* client_;  // Can be 0 (e.g. unittests, shared workers, etc.)
   WebSpellCheckClient* spell_check_client_;
 
-  // ChromeClient needs blink:: qualifier so it doesn't clash with ChromeClient
-  // method. TODO(sashab): Rename getter to GetChromeClient to fix this.
-  Persistent<blink::ChromeClient> chrome_client_;
+  Persistent<ChromeClient> chrome_client_;
   ContextMenuClientImpl context_menu_client_impl_;
   EditorClientImpl editor_client_impl_;
   SpellCheckerClientImpl spell_checker_client_impl_;
diff --git a/third_party/WebKit/Source/web/tests/WebFrameTest.cpp b/third_party/WebKit/Source/web/tests/WebFrameTest.cpp
index c6b01b6..ef3de09 100644
--- a/third_party/WebKit/Source/web/tests/WebFrameTest.cpp
+++ b/third_party/WebKit/Source/web/tests/WebFrameTest.cpp
@@ -6879,10 +6879,8 @@
 
   EXPECT_FALSE(exception_state.HadException());
   auto range = EphemeralRange::RangeOfContents(*element);
-  document->Markers().AddSpellingMarker(range.StartPosition(),
-                                        range.EndPosition());
-  document->Markers().AddGrammarMarker(range.StartPosition(),
-                                       range.EndPosition());
+  document->Markers().AddSpellingMarker(range);
+  document->Markers().AddGrammarMarker(range);
   EXPECT_EQ(2U, document->Markers().Markers().size());
 
   textcheck.KickNoResults();
diff --git a/tools/chrome_proxy/OWNERS b/tools/chrome_proxy/OWNERS
index 217a164..38db9df 100644
--- a/tools/chrome_proxy/OWNERS
+++ b/tools/chrome_proxy/OWNERS
@@ -1,3 +1,5 @@
 file://components/data_reduction_proxy/OWNERS
 
 bustamante@chromium.org
+
+# COMPONENT: Internals>Network>DataProxy
diff --git a/tools/chrome_proxy/webdriver/common.py b/tools/chrome_proxy/webdriver/common.py
index df9b022..04819c5 100644
--- a/tools/chrome_proxy/webdriver/common.py
+++ b/tools/chrome_proxy/webdriver/common.py
@@ -742,6 +742,8 @@
     Args:
       run_all_tests: If True, all tests in the directory will be run, Otherwise
         only the tests in the file given on the command line will be run.
+    Returns:
+      the TestResult object from the test runner
     """
     flags = ParseFlags()
     logger = GetLogger()
@@ -767,4 +769,4 @@
             tests.addTest(test)
     testRunner = unittest.runner.TextTestRunner(verbosity=2,
       failfast=flags.failfast, buffer=(not flags.disable_buffer))
-    testRunner.run(tests)
+    return testRunner.run(tests)
diff --git a/tools/chrome_proxy/webdriver/lite_page.py b/tools/chrome_proxy/webdriver/lite_page.py
index 711194a6..59b7c40 100644
--- a/tools/chrome_proxy/webdriver/lite_page.py
+++ b/tools/chrome_proxy/webdriver/lite_page.py
@@ -89,15 +89,12 @@
         self.assertIn(response.status, [200, 204])
 
   # Lo-Fi fallback is not currently supported via the client. Check that
-  # no Lo-Fi response is received if the user is in the
-  # DataCompressionProxyLitePageFallback field trial and a Lite Page is not
-  # served.
+  # no Lo-Fi response is received if a Lite Page is not served.
   def testLitePageFallback(self):
     with TestDriver() as test_driver:
       test_driver.AddChromeArg('--enable-spdy-proxy-auth')
       test_driver.AddChromeArg('--force-fieldtrials='
-                               'DataCompressionProxyLoFi/Enabled_Preview/'
-                               'DataCompressionProxyLitePageFallback/Enabled')
+                               'DataCompressionProxyLoFi/Enabled_Preview/')
       test_driver.AddChromeArg('--force-fieldtrial-params='
                                'DataCompressionProxyLoFi.Enabled_Preview:'
                                'effective_connection_type/4G')
diff --git a/tools/chrome_proxy/webdriver/variations_combinations.py b/tools/chrome_proxy/webdriver/variations_combinations.py
index 3471a41..83715059 100644
--- a/tools/chrome_proxy/webdriver/variations_combinations.py
+++ b/tools/chrome_proxy/webdriver/variations_combinations.py
@@ -2,60 +2,69 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
+import io
 import os
-import re
+import platform
 import sys
 import time
 import unittest
 
 import common
 
+sys.path.append(os.path.join(os.path.dirname(__file__), os.pardir, os.pardir,
+  os.pardir, 'tools', 'variations'))
+import fieldtrial_util
 
-combinations = [
-  # One object for each set of tests to run with the given variations.
-  {
-    'label': 'dummy example',
-    'tests': [
-      # Of the form <file_name>.<class_name>.<method_name>
-      # Also accepts wildcard (*) as matching anything.
-      "lite_page.LitePage.testLitePage",
-      "lite_page.LitePage.testLitePageFallback",
-      "quic*"
-    ],
-    'variations': [
-      "DataReductionProxyUseQuic/Enabled",
-      "DataCompressionProxyLoFi/Enabled_Preview",
-      "DataCompressionProxyLitePageFallback/Enabled"
-    ],
-    'variations-params': [
-      "DataCompressionProxyLoFi.Enabled_Preview:effective_connection_type/4G"
-    ]
-  }
+test_blacklist = [
+  # These tests set their own field trials and should be ignored.
+  'lofi.LoFi.testLoFiSlowConnection',
+  'lofi.LoFi.testLoFiIfHeavyFastConnection',
+  'quic.Quic.testCheckPageWithQuicProxy',
+  'quic.Quic.testCheckPageWithQuicProxyTransaction',
+  'lite_page.LitePage.testLitePageFallback',
 ]
 
+def GetExperimentArgs():
+  """Returns a list of arguments with all tested field trials.
 
-def GetAllTestsFromRegexList(test_list, test_suite_iter):
-  """A helper function to make a test suite from tests matching the given list.
+  This function is a simple wrapper around the variation team's fieldtrail_util
+  script that generates command line arguments to test Chromium field trials.
 
-  Args:
-    test_list: a string list of all tests to run, allowing for simple regex
-    test_suite_iter: An iterator of all test suites to search
   Returns:
-    a test suite with all the tests specified by the test_list
+    an array of command line arguments to pass to chrome
   """
-  id_to_test_map = {}
-  for test_suite in test_suite_iter:
+  config_path = os.path.join(os.path.dirname(__file__), os.pardir, os.pardir,
+    os.pardir, 'testing', 'variations', 'fieldtrial_testing_config.json')
+  my_platform = ''
+  if common.ParseFlags().android:
+    my_platform = 'android'
+  elif platform.system().lower() == 'linux':
+    my_platform = 'linux'
+  elif platform.system().lower() == 'windows':
+    my_platform = 'win'
+  elif platform.system().lower() == 'darwin':
+    my_platform = 'mac'
+  else:
+    raise Exception('unknown platform!')
+  return fieldtrial_util.GenerateArgs(config_path, my_platform)
+
+def GenerateTestSuites():
+  """A generator function that yields non-blacklisted tests to run.
+
+  This function yeilds test suites each with a single test case whose id is not
+  blacklisted in the array at the top of this file.
+
+  Yields:
+    non-blacklisted test suites to run
+  """
+  loader = unittest.TestLoader()
+  for test_suite in loader.discover(os.path.dirname(__file__), pattern='*.py'):
     for test_case in test_suite:
       for test_method in test_case:
-        id_to_test_map[test_method.id()] = test_method
-  my_test_suite = unittest.TestSuite()
-  for test_spec in test_list:
-    regex = re.compile('^' + test_spec.replace('.', '\\.').replace('*', '.*')
-      + '$')
-    for test_id in sorted(id_to_test_map):
-      if regex.match(test_id):
-        my_test_suite.addTest(id_to_test_map[test_id])
-  return my_test_suite
+        if test_method.id() not in test_blacklist:
+          ts = unittest.TestSuite()
+          ts.addTest(test_method)
+          yield (ts, test_method.id())
 
 def ParseFlagsWithExtraBrowserArgs(extra_args):
   """Generates a function to override common.ParseFlags.
@@ -76,26 +85,36 @@
   return AddExtraBrowserArgs
 
 def main():
-  """Runs each set of tests against its set of variations.
+  """Runs all non-blacklisted tests against Chromium field trials.
 
-  For each test combination, the above variation specifications will be used to
-  setup the browser arguments for each test given above that will be run.
+  This script run all chrome proxy integration tests that haven't been
+  blacklisted against the field trial testing configuration used by Chromium
+  perf bots.
   """
   flags = common.ParseFlags()
-  for variation_test in combinations:
-    # Set browser arguments to use the given variations.
-    extra_args = '--force-fieldtrials=' + '/'.join(variation_test['variations'])
-    extra_args += ' --force-fieldtrial-params=' + ','.join(
-      variation_test['variations-params'])
-    common.ParseFlags = ParseFlagsWithExtraBrowserArgs(extra_args)
-    # Run the given tests.
-    loader = unittest.TestLoader()
-    test_suite_iter = loader.discover(os.path.dirname(__file__), pattern='*.py')
-    my_test_suite = GetAllTestsFromRegexList(variation_test['tests'],
-      test_suite_iter)
-    testRunner = unittest.runner.TextTestRunner(verbosity=2,
-      failfast=flags.failfast, buffer=(not flags.disable_buffer))
-    testRunner.run(my_test_suite)
+  experiment_args = ' '.join(GetExperimentArgs())
+  common.ParseFlags = ParseFlagsWithExtraBrowserArgs(experiment_args)
+  # Each test is wrapped in its own test suite so results can be evaluated
+  # individually.
+  for test_suite, test_id in GenerateTestSuites():
+    buf = io.BytesIO()
+    sys.stdout.write('%s... ' % test_id)
+    sys.stdout.flush()
+    testRunner = unittest.runner.TextTestRunner(stream=buf, verbosity=2,
+      buffer=(not flags.disable_buffer))
+    result = testRunner.run(test_suite)
+    if result.wasSuccessful():
+      print 'ok'
+    else:
+      print 'failed'
+      print buf.getvalue()
+      print 'To repeat this test, run: '
+      print "%s %s %s --test_filter=%s --browser_args='%s'" % (sys.executable,
+        os.path.join(os.path.dirname(__file__), 'run_all_tests.py'),
+        ' '.join(sys.argv[1:]), '.'.join(test_id.split('.')[1:]),
+        experiment_args)
+      if flags.failfast:
+        return
 
 if __name__ == '__main__':
   main()
diff --git a/tools/mb/mb_config.pyl b/tools/mb/mb_config.pyl
index 7d0095a..6e598d4c 100644
--- a/tools/mb/mb_config.pyl
+++ b/tools/mb/mb_config.pyl
@@ -140,7 +140,7 @@
 
       'CrWinClang(dbg)': 'clang_debug_bot_minimal_symbols_x86',
       'CrWinClang64': 'clang_official_release_bot_minimal_symbols',
-      'CrWinClang64(dll)': 'clang_shared_release_bot',
+      'CrWinClang64(dll)': 'clang_shared_release_bot_dcheck',
       'CrWinClangGoma': 'clang_official_optimize_release_bot_minimal_symbols_x86',
       'CrWinGoma': 'release_bot_x86',
       'CrWinGoma(dll)': 'shared_release_bot_x86',
@@ -161,19 +161,19 @@
       'ClangToTMacASan': 'asan_disable_nacl_clang_tot_full_symbols_static_release',
       'ClangToTWin': 'clang_tot_official_minimal_symbols_static_release_x86',
       'ClangToTWin(dbg)': 'clang_tot_shared_debug_x86',
-      'ClangToTWin(dll)': 'clang_tot_minimal_symbols_shared_release_x86',
+      'ClangToTWin(dll)': 'clang_tot_minimal_symbols_shared_release_x86_dcheck',
       'ClangToTWin64': 'clang_tot_official_minimal_symbols_static_release',
       'ClangToTWin64(dbg)': 'clang_tot_shared_debug',
-      'ClangToTWin64(dll)': 'clang_tot_shared_release',
+      'ClangToTWin64(dll)': 'clang_tot_shared_release_dcheck',
       'ClangToTiOS': 'ios',
       'Closure Compilation Linux': 'closure_compilation',
       'CrWinAsan': 'asan_clang_fuzzer_static_v8_heap_x86_full_symbols_release',
       'CrWinAsan(dll)': 'asan_clang_shared_v8_heap_x86_full_symbols_release',
       'CrWinAsanCov': 'asan_clang_edge_fuzzer_static_v8_heap_x86_full_symbols_release',
-      'CrWinClang(shared)': 'clang_minimal_symbols_shared_release_bot_x86',
+      'CrWinClang(shared)': 'clang_minimal_symbols_shared_release_bot_x86_dcheck',
       'CrWinClang64(dbg)': 'win_clang_debug_bot',
       'CrWinClangLLD': 'clang_tot_official_static_use_lld_x86',
-      'CrWinClangLLD64': 'clang_tot_shared_release_use_lld',
+      'CrWinClangLLD64': 'clang_tot_shared_release_use_lld_dcheck',
       'CrWinClngLLD64dbg': 'clang_tot_full_symbols_shared_debug_use_lld',
       'CrWinClngLLDdbg': 'clang_tot_full_symbols_shared_debug_use_lld_x86',
       'EarlGreyiOS': 'ios',
@@ -1047,8 +1047,8 @@
       'clang', 'release_bot', 'minimal_symbols', 'x86',
     ],
 
-    'clang_minimal_symbols_shared_release_bot_x86': [
-      'clang', 'minimal_symbols', 'shared_release_bot', 'x86',
+    'clang_minimal_symbols_shared_release_bot_x86_dcheck': [
+      'clang', 'minimal_symbols', 'shared_release_bot', 'x86', 'dcheck_always_on',
     ],
 
     'clang_official_release_bot_minimal_symbols': [
@@ -1071,8 +1071,8 @@
       'clang', 'official', 'release_trybot', 'x86',
     ],
 
-    'clang_shared_release_bot': [
-      'clang', 'shared_release_bot',
+    'clang_shared_release_bot_dcheck': [
+      'clang', 'shared_release_bot', 'dcheck_always_on',
     ],
 
     'clang_tot_asan_lsan_static_release': [
@@ -1105,9 +1105,9 @@
       'clang_tot', 'shared', 'debug', 'x86',
     ],
 
-    'clang_tot_shared_release_use_lld': [
+    'clang_tot_shared_release_use_lld_dcheck': [
       # TODO(crbug.com/706492): Enable symbols when LLD makes PDBs.
-      'clang_tot', 'no_symbols', 'shared', 'release', 'use_lld',
+      'clang_tot', 'no_symbols', 'shared', 'release', 'use_lld', 'dcheck_always_on',
     ],
 
     'clang_tot_official_static_use_lld_x86': [
@@ -1119,12 +1119,12 @@
       'clang_tot', 'minimal_symbols', 'shared', 'release',
     ],
 
-    'clang_tot_shared_release': [
-      'clang_tot', 'shared', 'release',
+    'clang_tot_shared_release_dcheck': [
+      'clang_tot', 'shared', 'release', 'dcheck_always_on',
     ],
 
-    'clang_tot_minimal_symbols_shared_release_x86': [
-      'clang_tot', 'minimal_symbols', 'shared', 'release', 'x86',
+    'clang_tot_minimal_symbols_shared_release_x86_dcheck': [
+      'clang_tot', 'minimal_symbols', 'shared', 'release', 'x86', 'dcheck_always_on',
     ],
 
     'clang_tot_official_minimal_symbols_static_release': [
diff --git a/tools/metrics/actions/actions.xml b/tools/metrics/actions/actions.xml
index 8ebcddc..3fc8d78 100644
--- a/tools/metrics/actions/actions.xml
+++ b/tools/metrics/actions/actions.xml
@@ -5127,6 +5127,81 @@
   <description>Please enter the description of this user action.</description>
 </action>
 
+<action name="InProductHelp.Dismissed">
+  <owner>nyquist@chromium.org</owner>
+  <owner>xingliu@chromium.org</owner>
+  <description>The user dismissed the in-product help.</description>
+</action>
+
+<action name="InProductHelp.NotifyEvent.IPH_DataSaverPreview">
+  <owner>nyquist@chromium.org</owner>
+  <owner>xingliu@chromium.org</owner>
+  <description>The user triggered an event in in-product help.</description>
+</action>
+
+<action name="InProductHelp.NotifyEvent.IPH_DownloadHome">
+  <owner>nyquist@chromium.org</owner>
+  <owner>xingliu@chromium.org</owner>
+  <description>The user triggered an event in in-product help.</description>
+</action>
+
+<action name="InProductHelp.NotifyEvent.IPH_DownloadPage">
+  <owner>nyquist@chromium.org</owner>
+  <owner>xingliu@chromium.org</owner>
+  <description>The user triggered an event in in-product help.</description>
+</action>
+
+<action name="InProductHelp.NotifyUsedEvent.IPH_DataSaverPreview">
+  <owner>nyquist@chromium.org</owner>
+  <owner>xingliu@chromium.org</owner>
+  <description>
+    The user triggered an used event in in-product help.
+  </description>
+</action>
+
+<action name="InProductHelp.NotifyUsedEvent.IPH_DownloadHome">
+  <owner>nyquist@chromium.org</owner>
+  <owner>xingliu@chromium.org</owner>
+  <description>
+    The user triggered an used event in in-product help.
+  </description>
+</action>
+
+<action name="InProductHelp.NotifyUsedEvent.IPH_DownloadPage">
+  <owner>nyquist@chromium.org</owner>
+  <owner>xingliu@chromium.org</owner>
+  <description>
+    The user triggered an used event in in-product help.
+  </description>
+</action>
+
+<action name="InProductHelp.ShouldTriggerHelpUI.IPH_DataSaverPreview">
+  <owner>nyquist@chromium.org</owner>
+  <owner>xingliu@chromium.org</owner>
+  <description>
+    The feature engagement tracker tried to determine whether in-product help
+    should be shown to the user.
+  </description>
+</action>
+
+<action name="InProductHelp.ShouldTriggerHelpUI.IPH_DownloadHome">
+  <owner>nyquist@chromium.org</owner>
+  <owner>xingliu@chromium.org</owner>
+  <description>
+    The feature engagement tracker tried to determine whether in-product help
+    should be shown to the user.
+  </description>
+</action>
+
+<action name="InProductHelp.ShouldTriggerHelpUI.IPH_DownloadPage">
+  <owner>nyquist@chromium.org</owner>
+  <owner>xingliu@chromium.org</owner>
+  <description>
+    The feature engagement tracker tried to determine whether in-product help
+    should be shown to the user.
+  </description>
+</action>
+
 <action name="Indent">
   <owner>Please list the metric's owners. Add more owner tags as needed.</owner>
   <description>Please enter the description of this user action.</description>
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index d0115d2..29d30f0 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -4957,6 +4957,20 @@
   <int value="5" label="Try to override the status when its valus is error."/>
 </enum>
 
+<enum name="ConfigParsingEvent" type="int">
+  <int value="0" label="SUCCESS"/>
+  <int value="1" label="FAILURE"/>
+  <int value="2" label="FAILURE_NO_FIELD_TRIAL"/>
+  <int value="3" label="FAILURE_USED_EVENT_PARSE"/>
+  <int value="4" label="FAILURE_USED_EVENT_MISSING"/>
+  <int value="5" label="FAILURE_TRIGGER_EVENT_PARSE"/>
+  <int value="6" label="FAILURE_TRIGGER_EVENT_MISSING"/>
+  <int value="7" label="FAILURE_OTHER_EVENT_PARSE"/>
+  <int value="8" label="FAILURE_SESSION_RATE_PARSE"/>
+  <int value="9" label="FAILURE_AVAILABILITY_PARSE"/>
+  <int value="10" label="FAILURE_UNKNOWN_KEY"/>
+</enum>
+
 <enum name="ConnectionDiagnosticsIssue" type="int">
   <int value="0" label="IP collision detected."/>
   <int value="1" label="Routing problem detected."/>
@@ -15078,6 +15092,7 @@
   <int value="2014" label="V8SpeechRecognition_Start_Method"/>
   <int value="2015" label="TableRowDirectionDifferentFromTable"/>
   <int value="2016" label="TableSectionDirectionDifferentFromTable"/>
+  <int value="2017" label="ClientHintsDeviceRAM"/>
 </enum>
 
 <enum name="FeedbackSource" type="int">
@@ -18798,6 +18813,16 @@
   </int>
 </enum>
 
+<enum name="IDBException" type="int">
+  <int value="0" label="Unknown error"/>
+  <int value="1" label="Constraint error"/>
+  <int value="2" label="Data error"/>
+  <int value="3" label="Version error"/>
+  <int value="4" label="Abort error"/>
+  <int value="5" label="Quota error"/>
+  <int value="6" label="Timeout error"/>
+</enum>
+
 <enum name="IDBKeyPathType" type="int">
   <int value="0" label="None">No key path.</int>
   <int value="1" label="String">Key path is a string.</int>
@@ -21222,6 +21247,22 @@
   <int value="20" label="OTHER_LIBSECRET"/>
 </enum>
 
+<enum name="LinuxDistro" type="int">
+  <int value="0" label="Unknown"/>
+  <int value="1" label="Ubuntu Other"/>
+  <int value="2" label="Ubuntu 14.04"/>
+  <int value="3" label="Ubuntu 16.04"/>
+  <int value="4" label="Ubuntu 16.10"/>
+  <int value="5" label="Ubuntu 17.04"/>
+  <int value="6" label="Debian Other"/>
+  <int value="7" label="Debian 8"/>
+  <int value="8" label="openSUSE Other"/>
+  <int value="9" label="openSUSE Leap 42.2"/>
+  <int value="10" label="Fedora Other"/>
+  <int value="11" label="Fedora 24"/>
+  <int value="12" label="Fedora 25"/>
+</enum>
+
 <enum name="LinuxGlibcVersion" type="int">
   <int value="0" label="Not Parseable"/>
   <int value="1" label="Unknown"/>
@@ -35697,6 +35738,21 @@
   <int value="2" label="unexpected other schemes"/>
 </enum>
 
+<enum name="TriggerHelpUIResult" type="int">
+  <int value="0" label="SUCCESS"/>
+  <int value="1" label="FAILURE"/>
+  <int value="2" label="FAILURE_MODEL_NOT_READY"/>
+  <int value="3" label="FAILURE_CURRENTLY_SHOWING"/>
+  <int value="4" label="FAILURE_FEATURE_DISABLED"/>
+  <int value="5" label="FAILURE_CONFIG_INVALID"/>
+  <int value="6" label="FAILURE_USED_PRECONDITION_UNMET"/>
+  <int value="7" label="FAILURE_TRIGGER_PRECONDITION_UNMET"/>
+  <int value="8" label="FAILURE_OTHER_PRECONDITION_UNMET"/>
+  <int value="9" label="FAILURE_SESSION_RATE"/>
+  <int value="10" label="FAILURE_AVAILABILITY_MODEL_NOT_READY"/>
+  <int value="11" label="FAILURE_AVAILABILITY_PRECONDITION_UNMET"/>
+</enum>
+
 <enum name="TrimMemoryLevel" type="int">
   <summary>
     The level provided by Android's ComponentCallbacks2.onTrimMemory().
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml
index ca99234..bff0523 100644
--- a/tools/metrics/histograms/histograms.xml
+++ b/tools/metrics/histograms/histograms.xml
@@ -24646,6 +24646,77 @@
   </summary>
 </histogram>
 
+<histogram name="InProductHelp.Config.ParsingEvent" enum="ConfigParsingEvent">
+  <owner>nyquist@chromium.org</owner>
+  <owner>xingliu@chromium.org</owner>
+  <summary>
+    Records if in-product help configuration is parsed correctly, and the
+    failure reasons for parsing failures.
+  </summary>
+</histogram>
+
+<histogram base="true" name="InProductHelp.Db.Init" enum="BooleanSuccess">
+  <owner>nyquist@chromium.org</owner>
+  <owner>xingliu@chromium.org</owner>
+<!-- Name completed by histogram_suffixes name="IPHDatabase" -->
+
+  <summary>
+    Records if database initialization succeeds for in-product help.
+  </summary>
+</histogram>
+
+<histogram base="true" name="InProductHelp.Db.Load" enum="BooleanSuccess">
+  <owner>nyquist@chromium.org</owner>
+  <owner>xingliu@chromium.org</owner>
+<!-- Name completed by histogram_suffixes name="IPHDatabase" -->
+
+  <summary>
+    Records if database successfully loads the data for in-product help.
+  </summary>
+</histogram>
+
+<histogram name="InProductHelp.Db.TotalEvents" units="events">
+  <owner>nyquist@chromium.org</owner>
+  <owner>xingliu@chromium.org</owner>
+  <summary>
+    Records the total number of event records in the database for in-product
+    help after the event model is loaded.
+  </summary>
+</histogram>
+
+<histogram base="true" name="InProductHelp.Db.Update" enum="BooleanSuccess">
+  <owner>nyquist@chromium.org</owner>
+  <owner>xingliu@chromium.org</owner>
+<!-- Name completed by histogram_suffixes name="IPHDatabase" -->
+
+  <summary>
+    Records if each database update succeeds for in-product help.
+  </summary>
+</histogram>
+
+<histogram base="true" name="InProductHelp.NotifyEventReadyState"
+    enum="BooleanSuccess">
+  <owner>nyquist@chromium.org</owner>
+  <owner>xingliu@chromium.org</owner>
+<!-- Name completed by histogram_suffixes name="IPHFeatures" -->
+
+  <summary>
+    Records if the model is ready when in-product help event happens.
+  </summary>
+</histogram>
+
+<histogram base="true" name="InProductHelp.ShouldTriggerHelpUI"
+    enum="TriggerHelpUIResult">
+  <owner>nyquist@chromium.org</owner>
+  <owner>xingliu@chromium.org</owner>
+<!-- Name completed by histogram_suffixes name="IPHFeatures" -->
+
+  <summary>
+    Records if in-product help is shown to the user, and the failure reasons if
+    in-product help is not shown.
+  </summary>
+</histogram>
+
 <histogram name="InputMethod.ActiveCount">
   <owner>shuchen@chromium.org</owner>
   <summary>
@@ -26438,6 +26509,11 @@
   </summary>
 </histogram>
 
+<histogram name="Linux.Distro" enum="LinuxDistro">
+  <owner>timbrown@chromium.org</owner>
+  <summary>The Linux distro used. Logged on each start up.</summary>
+</histogram>
+
 <histogram name="Linux.GlibcVersion" enum="LinuxGlibcVersion">
   <owner>thestig@chromium.org</owner>
   <summary>
@@ -57085,6 +57161,14 @@
   </summary>
 </histogram>
 
+<histogram name="Printing.CUPS.PrintersDiscovered" units="printers">
+  <owner>skau@chromium.org</owner>
+  <summary>
+    The number of printers shown in the discovered printers dialog during
+    printer set up.  Only recorded on Chrome OS.
+  </summary>
+</histogram>
+
 <histogram name="Printing.CUPS.PrintJobsQueued" units="count">
   <owner>skau@chromium.org</owner>
   <summary>
@@ -81566,6 +81650,16 @@
   </summary>
 </histogram>
 
+<histogram name="WebCore.IndexedDB.TransactionAbortReason" enum="IDBException">
+  <owner>dmurph@chromium.org</owner>
+  <summary>
+    Recorded on the browser side (back end) when an IndexedDB transaction is
+    aborted, specifically recording the reason for the abort. This can be
+    triggered by javascript code on the renderer, errors or force closes on the
+    backend, or by the transaction timeout timer.
+  </summary>
+</histogram>
+
 <histogram name="WebCore.PreloadDelayMs" units="ms">
   <owner>csharrison@chromium.org</owner>
   <summary>
@@ -88027,6 +88121,23 @@
   <affected-histogram name="Tabs.iOS_PostRedirectPLT"/>
 </histogram_suffixes>
 
+<histogram_suffixes name="IPHDatabase" separator=".">
+  <affected-histogram name="InProductHelp.Db.Init"/>
+  <affected-histogram name="InProductHelp.Db.Load"/>
+  <affected-histogram name="InProductHelp.Db.Update"/>
+  <suffix name="EventStore" label="Event store."/>
+  <suffix name="AvailabilityStore" label="Availability store."/>
+</histogram_suffixes>
+
+<histogram_suffixes name="IPHFeatures" separator=".">
+  <affected-histogram name="InProductHelp.NotifyEventReadyState"/>
+  <affected-histogram name="InProductHelp.ShouldTriggerHelpUI"/>
+  <suffix name="IPH_DataSaverPreview"
+      label="In product help data saver preview."/>
+  <suffix name="IPH_DownloadPage" label="In product help download page."/>
+  <suffix name="IPH_DownloadHome" label="In product help download home."/>
+</histogram_suffixes>
+
 <histogram_suffixes name="IPProtocolType" separator="_">
   <suffix name="UDP"/>
   <suffix name="TCP"/>
@@ -92228,37 +92339,43 @@
 </histogram_suffixes>
 
 <histogram_suffixes name="PurgeAndSuspendExperiment" separator=".">
-  <suffix name="BlinkGCKB">
+  <suffix base="true" name="BlinkGCKB"
+      label="Constrained to the BlinkGC allocator">
     <obsolete>
       Derecated as of 05/2017. Replaced with BlinkGCKB.30min, 60min, and 90min
       to investigate growth of BlinkGC memory usage more deeply.
     </obsolete>
   </suffix>
-  <suffix name="DiscardableKB">
+  <suffix base="true" name="DiscardableKB"
+      label="Constrained to discardable memory usage">
     <obsolete>
       Derecated as of 05/2017. Replaced with DiscardableKB.30min, 60min, and
       90min to investigate growth of discardable memory usage more deeply.
     </obsolete>
   </suffix>
-  <suffix name="PartitionAllocKB">
+  <suffix base="true" name="PartitionAllocKB"
+      label="Constrained to the ParitionAlloc allocator">
     <obsolete>
       Derecated as of 05/2017. Replaced with PartitionAllocKB.30min, 60min, and
       90min to investigate growth of PartitionAlloc memory usage more deeply.
     </obsolete>
   </suffix>
-  <suffix name="MallocKB">
+  <suffix base="true" name="MallocKB" label="Constrained to malloc usage">
     <obsolete>
       Derecated as of 05/2017. Replaced with MallocKB.30min, 60min, and 90min to
       investigate growth of malloc memory usage more deeply.
     </obsolete>
   </suffix>
-  <suffix name="TotalAllocatedKB">
+  <suffix base="true" name="TotalAllocatedKB"
+      label="Summed over the PartitionAlloc, malloc, discardable memory,
+             mainThreadIsolate() and BlinkGC allocators">
     <obsolete>
       Derecated as of 05/2017. Replaced with TotalAllocatedKB.30min, 60min, and
       90min to investigate growth of renderer total memory usage more deeply.
     </obsolete>
   </suffix>
-  <suffix name="V8MainThreadIsolateKB">
+  <suffix base="true" name="V8MainThreadIsolateKB"
+      label="Constrained to memory usage by mainThreadIsolate()">
     <obsolete>
       Derecated as of 05/2017. Replaced with V8MainThreadIsolateKB.30min, 60min,
       and 90min to investigate growth of v8 memory usage more deeply.
@@ -92274,14 +92391,18 @@
       label="Constrained to each allocator 60min after purging"/>
   <suffix name="90min"
       label="Constrained to each allocator 90min after purging"/>
-  <affected-histogram name="PurgeAndSuspend.Experimental.MemoryGrowth">
-    <with-suffix name="BlinkGCKB"/>
-    <with-suffix name="DiscardableKB"/>
-    <with-suffix name="MallocKB"/>
-    <with-suffix name="PartitionAllocKB"/>
-    <with-suffix name="TotalAllocatedKB"/>
-    <with-suffix name="V8MainThreadIsolateKB"/>
-  </affected-histogram>
+  <affected-histogram
+      name="PurgeAndSuspend.Experimental.MemoryGrowth.BlinkGCKB"/>
+  <affected-histogram
+      name="PurgeAndSuspend.Experimental.MemoryGrowth.DiscardableKB"/>
+  <affected-histogram
+      name="PurgeAndSuspend.Experimental.MemoryGrowth.MallocKB"/>
+  <affected-histogram
+      name="PurgeAndSuspend.Experimental.MemoryGrowth.PartitionAllocKB"/>
+  <affected-histogram
+      name="PurgeAndSuspend.Experimental.MemoryGrowth.TotalAllocatedKB"/>
+  <affected-histogram
+      name="PurgeAndSuspend.Experimental.MemoryGrowth.V8MainThreadIsolateKB"/>
 </histogram_suffixes>
 
 <histogram_suffixes name="QueryTimeSuffix" separator=".">
diff --git a/tools/perf/metrics/unittest_data/OWNERS b/tools/perf/metrics/unittest_data/OWNERS
deleted file mode 100644
index b4a4e10..0000000
--- a/tools/perf/metrics/unittest_data/OWNERS
+++ /dev/null
@@ -1,3 +0,0 @@
-per-file *chrome_proxy*=bengr@chromium.org
-per-file *chrome_proxy*=bolian@chromium.org
-per-file *chrome_proxy*=marq@chromium.org
diff --git a/ui/android/java/src/org/chromium/ui/display/DisplayAndroidManager.java b/ui/android/java/src/org/chromium/ui/display/DisplayAndroidManager.java
index ddb2686..dc6abde9 100644
--- a/ui/android/java/src/org/chromium/ui/display/DisplayAndroidManager.java
+++ b/ui/android/java/src/org/chromium/ui/display/DisplayAndroidManager.java
@@ -170,8 +170,11 @@
         public void onDisplayChanged(int sdkDisplayId) {
             PhysicalDisplayAndroid displayAndroid =
                     (PhysicalDisplayAndroid) mIdMap.get(sdkDisplayId);
-            if (displayAndroid != null) {
-                displayAndroid.updateFromDisplay(getDisplayManager().getDisplay(sdkDisplayId));
+            Display display = getDisplayManager().getDisplay(sdkDisplayId);
+            // Note display null check here is needed because there appear to be an edge case in
+            // android display code, similar to onDisplayAdded.
+            if (displayAndroid != null && display != null) {
+                displayAndroid.updateFromDisplay(display);
             }
         }
     }
diff --git a/ui/android/java/strings/translations/android_ui_strings_fi.xtb b/ui/android/java/strings/translations/android_ui_strings_fi.xtb
index e68e643..de874d09 100644
--- a/ui/android/java/strings/translations/android_ui_strings_fi.xtb
+++ b/ui/android/java/strings/translations/android_ui_strings_fi.xtb
@@ -1,7 +1,7 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="fi">
-<translation id="1620510694547887537">kameraasi</translation>
+<translation id="1620510694547887537">Kamera</translation>
 <translation id="1768717197362323622">Millisekunti</translation>
 <translation id="1822429046913737220">AP/IP</translation>
 <translation id="1989112275319619282">Selaa</translation>
diff --git a/ui/aura/local/window_port_local.cc b/ui/aura/local/window_port_local.cc
index 2ca8fd74..688393f1 100644
--- a/ui/aura/local/window_port_local.cc
+++ b/ui/aura/local/window_port_local.cc
@@ -82,6 +82,10 @@
 void WindowPortLocal::OnDidChangeBounds(const gfx::Rect& old_bounds,
                                         const gfx::Rect& new_bounds) {}
 
+void WindowPortLocal::OnDidChangeTransform(
+    const gfx::Transform& old_transform,
+    const gfx::Transform& new_transform) {}
+
 std::unique_ptr<ui::PropertyData> WindowPortLocal::OnWillChangeProperty(
     const void* key) {
   return nullptr;
diff --git a/ui/aura/local/window_port_local.h b/ui/aura/local/window_port_local.h
index 5d55472..6599abc 100644
--- a/ui/aura/local/window_port_local.h
+++ b/ui/aura/local/window_port_local.h
@@ -34,6 +34,8 @@
   void OnVisibilityChanged(bool visible) override;
   void OnDidChangeBounds(const gfx::Rect& old_bounds,
                          const gfx::Rect& new_bounds) override;
+  void OnDidChangeTransform(const gfx::Transform& old_transform,
+                            const gfx::Transform& new_transform) override;
   std::unique_ptr<ui::PropertyData> OnWillChangeProperty(
       const void* key) override;
   void OnPropertyChanged(const void* key,
diff --git a/ui/aura/mus/in_flight_change.cc b/ui/aura/mus/in_flight_change.cc
index d806f5b..9b7e2987 100644
--- a/ui/aura/mus/in_flight_change.cc
+++ b/ui/aura/mus/in_flight_change.cc
@@ -66,6 +66,28 @@
 
 void InFlightDragChange::Revert() {}
 
+// InFlightTransformChange -----------------------------------------------------
+
+InFlightTransformChange::InFlightTransformChange(
+    WindowTreeClient* window_tree_client,
+    WindowMus* window,
+    const gfx::Transform& revert_transform)
+    : InFlightChange(window, ChangeType::TRANSFORM),
+      window_tree_client_(window_tree_client),
+      revert_transform_(revert_transform) {}
+
+InFlightTransformChange::~InFlightTransformChange() {}
+
+void InFlightTransformChange::SetRevertValueFrom(const InFlightChange& change) {
+  revert_transform_ =
+      static_cast<const InFlightTransformChange&>(change).revert_transform_;
+}
+
+void InFlightTransformChange::Revert() {
+  window_tree_client_->SetWindowTransformFromServer(window(),
+                                                    revert_transform_);
+}
+
 // CrashInFlightChange --------------------------------------------------------
 
 CrashInFlightChange::CrashInFlightChange(WindowMus* window, ChangeType type)
diff --git a/ui/aura/mus/in_flight_change.h b/ui/aura/mus/in_flight_change.h
index 738237f8..a4b7887 100644
--- a/ui/aura/mus/in_flight_change.h
+++ b/ui/aura/mus/in_flight_change.h
@@ -19,6 +19,7 @@
 #include "ui/base/cursor/cursor_data.h"
 #include "ui/base/ui_base_types.h"
 #include "ui/gfx/geometry/rect.h"
+#include "ui/gfx/transform.h"
 
 namespace ui {
 
@@ -53,6 +54,7 @@
   REMOVE_TRANSIENT_WINDOW_FROM_PARENT,
   REORDER,
   SET_MODAL,
+  TRANSFORM,
   VISIBLE,
 };
 
@@ -173,6 +175,24 @@
   DISALLOW_COPY_AND_ASSIGN(InFlightDragChange);
 };
 
+class InFlightTransformChange : public InFlightChange {
+ public:
+  InFlightTransformChange(WindowTreeClient* window_tree_client,
+                          WindowMus* window,
+                          const gfx::Transform& revert_transform);
+  ~InFlightTransformChange() override;
+
+  // InFlightChange:
+  void SetRevertValueFrom(const InFlightChange& change) override;
+  void Revert() override;
+
+ private:
+  WindowTreeClient* window_tree_client_;
+  gfx::Transform revert_transform_;
+
+  DISALLOW_COPY_AND_ASSIGN(InFlightTransformChange);
+};
+
 // Inflight change that crashes on failure. This is useful for changes that are
 // expected to always complete.
 class CrashInFlightChange : public InFlightChange {
diff --git a/ui/aura/mus/window_mus.h b/ui/aura/mus/window_mus.h
index af7692c..2f31f33 100644
--- a/ui/aura/mus/window_mus.h
+++ b/ui/aura/mus/window_mus.h
@@ -20,6 +20,7 @@
 
 namespace gfx {
 class Rect;
+class Transform;
 }
 
 namespace ui {
@@ -79,6 +80,7 @@
   virtual void SetBoundsFromServer(
       const gfx::Rect& bounds,
       const base::Optional<cc::LocalSurfaceId>& local_surface_id) = 0;
+  virtual void SetTransformFromServer(const gfx::Transform& transform) = 0;
   virtual void SetVisibleFromServer(bool visible) = 0;
   virtual void SetOpacityFromServer(float opacity) = 0;
   virtual void SetCursorFromServer(const ui::CursorData& cursor) = 0;
diff --git a/ui/aura/mus/window_port_mus.cc b/ui/aura/mus/window_port_mus.cc
index e32e474..7f2a083 100644
--- a/ui/aura/mus/window_port_mus.cc
+++ b/ui/aura/mus/window_port_mus.cc
@@ -173,6 +173,10 @@
         if (iter->data.property_name == data.property_name)
           return iter;
         break;
+      case ServerChangeType::TRANSFORM:
+        if (iter->data.transform == data.transform)
+          return iter;
+        break;
       case ServerChangeType::VISIBLE:
         if (iter->data.visible == data.visible)
           return iter;
@@ -234,6 +238,13 @@
   window_->SetBounds(bounds);
 }
 
+void WindowPortMus::SetTransformFromServer(const gfx::Transform& transform) {
+  ServerChangeData data;
+  data.transform = transform;
+  ScopedServerChange change(this, ServerChangeType::TRANSFORM, data);
+  window_->SetTransform(transform);
+}
+
 void WindowPortMus::SetVisibleFromServer(bool visible) {
   ServerChangeData data;
   data.visible = visible;
@@ -460,6 +471,16 @@
     client_surface_embedder_->UpdateSizeAndGutters();
 }
 
+void WindowPortMus::OnDidChangeTransform(const gfx::Transform& old_transform,
+                                         const gfx::Transform& new_transform) {
+  ServerChangeData change_data;
+  change_data.transform = new_transform;
+  if (!RemoveChangeByTypeAndData(ServerChangeType::TRANSFORM, change_data)) {
+    window_tree_client_->OnWindowMusTransformChanged(this, old_transform,
+                                                     new_transform);
+  }
+}
+
 std::unique_ptr<ui::PropertyData> WindowPortMus::OnWillChangeProperty(
     const void* key) {
   // |window_| is null if a property is set on the aura::Window before
diff --git a/ui/aura/mus/window_port_mus.h b/ui/aura/mus/window_port_mus.h
index 4af5ba6..70f8dcd 100644
--- a/ui/aura/mus/window_port_mus.h
+++ b/ui/aura/mus/window_port_mus.h
@@ -125,6 +125,7 @@
     REMOVE,
     REMOVE_TRANSIENT,
     REORDER,
+    TRANSFORM,
     // This is used when a REORDER *may* occur as the result of a transient
     // child being added or removed. As there is no guarantee the move will
     // actually happen (the window may be in place already) this change is not
@@ -144,6 +145,8 @@
     bool visible;
     // Applies to PROPERTY.
     std::string property_name;
+    // Applies to TRANSFORM.
+    gfx::Transform transform;
   };
 
   // Used to identify a change the server.
@@ -210,6 +213,7 @@
   void SetBoundsFromServer(
       const gfx::Rect& bounds,
       const base::Optional<cc::LocalSurfaceId>& local_surface_id) override;
+  void SetTransformFromServer(const gfx::Transform& transform) override;
   void SetVisibleFromServer(bool visible) override;
   void SetOpacityFromServer(float opacity) override;
   void SetCursorFromServer(const ui::CursorData& cursor) override;
@@ -245,6 +249,8 @@
   void OnVisibilityChanged(bool visible) override;
   void OnDidChangeBounds(const gfx::Rect& old_bounds,
                          const gfx::Rect& new_bounds) override;
+  void OnDidChangeTransform(const gfx::Transform& old_transform,
+                            const gfx::Transform& new_transform) override;
   std::unique_ptr<ui::PropertyData> OnWillChangeProperty(
       const void* key) override;
   void OnPropertyChanged(const void* key,
diff --git a/ui/aura/mus/window_tree_client.cc b/ui/aura/mus/window_tree_client.cc
index 6bb5e41f..89481a1 100644
--- a/ui/aura/mus/window_tree_client.cc
+++ b/ui/aura/mus/window_tree_client.cc
@@ -665,6 +665,12 @@
       local_surface_id);
 }
 
+void WindowTreeClient::SetWindowTransformFromServer(
+    WindowMus* window,
+    const gfx::Transform& transform) {
+  window->SetTransformFromServer(transform);
+}
+
 void WindowTreeClient::SetWindowVisibleFromServer(WindowMus* window,
                                                   bool visible) {
   if (!IsRoot(window)) {
@@ -816,6 +822,15 @@
       gfx::ConvertRectToPixel(device_scale_factor, new_bounds));
 }
 
+void WindowTreeClient::OnWindowMusTransformChanged(
+    WindowMus* window,
+    const gfx::Transform& old_transform,
+    const gfx::Transform& new_transform) {
+  const uint32_t change_id = ScheduleInFlightChange(
+      base::MakeUnique<InFlightTransformChange>(this, window, old_transform));
+  tree_->SetWindowTransform(change_id, window->server_id(), new_transform);
+}
+
 void WindowTreeClient::OnWindowMusAddChild(WindowMus* parent,
                                            WindowMus* child) {
   // TODO: add checks to ensure this can work.
@@ -1139,6 +1154,21 @@
   SetWindowBoundsFromServer(window, new_bounds, local_surface_id);
 }
 
+void WindowTreeClient::OnWindowTransformChanged(
+    Id window_id,
+    const gfx::Transform& old_transform,
+    const gfx::Transform& new_transform) {
+  WindowMus* window = GetWindowByServerId(window_id);
+  if (!window)
+    return;
+
+  InFlightTransformChange new_change(this, window, new_transform);
+  if (ApplyServerChangeToExistingInFlightChange(new_change))
+    return;
+
+  SetWindowTransformFromServer(window, new_transform);
+}
+
 void WindowTreeClient::OnClientAreaChanged(
     uint32_t window_id,
     const gfx::Insets& new_client_area,
diff --git a/ui/aura/mus/window_tree_client.h b/ui/aura/mus/window_tree_client.h
index 888f628..a297e32 100644
--- a/ui/aura/mus/window_tree_client.h
+++ b/ui/aura/mus/window_tree_client.h
@@ -184,6 +184,7 @@
   friend class InFlightBoundsChange;
   friend class InFlightFocusChange;
   friend class InFlightPropertyChange;
+  friend class InFlightTransformChange;
   friend class InFlightVisibleChange;
   friend class WindowPortMus;
   friend class WindowTreeClientPrivate;
@@ -291,6 +292,8 @@
       WindowMus* window,
       const gfx::Rect& revert_bounds_in_pixels,
       const base::Optional<cc::LocalSurfaceId>& local_surface_id);
+  void SetWindowTransformFromServer(WindowMus* window,
+                                    const gfx::Transform& transform);
   void SetWindowVisibleFromServer(WindowMus* window, bool visible);
 
   // Called from OnWindowMusBoundsChanged() and SetRootWindowBounds().
@@ -304,6 +307,9 @@
   void OnWindowMusBoundsChanged(WindowMus* window,
                                 const gfx::Rect& old_bounds,
                                 const gfx::Rect& new_bounds);
+  void OnWindowMusTransformChanged(WindowMus* window,
+                                   const gfx::Transform& old_transform,
+                                   const gfx::Transform& new_transform);
   void OnWindowMusAddChild(WindowMus* parent, WindowMus* child);
   void OnWindowMusRemoveChild(WindowMus* parent, WindowMus* child);
   void OnWindowMusMoveChild(WindowMus* parent,
@@ -347,6 +353,9 @@
       const gfx::Rect& old_bounds,
       const gfx::Rect& new_bounds,
       const base::Optional<cc::LocalSurfaceId>& local_surface_id) override;
+  void OnWindowTransformChanged(Id window_id,
+                                const gfx::Transform& old_transform,
+                                const gfx::Transform& new_transform) override;
   void OnClientAreaChanged(
       uint32_t window_id,
       const gfx::Insets& new_client_area,
diff --git a/ui/aura/mus/window_tree_client_unittest.cc b/ui/aura/mus/window_tree_client_unittest.cc
index a43ba75..a2b76d0 100644
--- a/ui/aura/mus/window_tree_client_unittest.cc
+++ b/ui/aura/mus/window_tree_client_unittest.cc
@@ -474,6 +474,31 @@
   EXPECT_EQ(original_bounds, root_window()->bounds());
 }
 
+TEST_F(WindowTreeClientWmTest, TwoInFlightTransformsChangesBothCanceled) {
+  const gfx::Transform original_transform(root_window()->layer()->transform());
+  gfx::Transform transform1;
+  transform1.Scale(SkIntToMScalar(2), SkIntToMScalar(2));
+  gfx::Transform transform2;
+  transform2.Scale(SkIntToMScalar(3), SkIntToMScalar(3));
+  root_window()->SetTransform(transform1);
+  EXPECT_EQ(transform1, root_window()->layer()->transform());
+
+  root_window()->SetTransform(transform2);
+  EXPECT_EQ(transform2, root_window()->layer()->transform());
+
+  // Tell the client the first transform failed. As there is a still a change in
+  // flight nothing should happen.
+  ASSERT_TRUE(window_tree()->AckFirstChangeOfType(
+      WindowTreeChangeType::TRANSFORM, false));
+  EXPECT_EQ(transform2, root_window()->layer()->transform());
+
+  // Tell the client the seconds transform failed. Should now fallback to
+  // original value.
+  ASSERT_TRUE(window_tree()->AckSingleChangeOfType(
+      WindowTreeChangeType::TRANSFORM, false));
+  EXPECT_EQ(original_transform, root_window()->layer()->transform());
+}
+
 // Verifies properties are set if the server replied that the change succeeded.
 TEST_F(WindowTreeClientWmTest, SetPropertySucceeded) {
   ASSERT_FALSE(root_window()->GetProperty(client::kAlwaysOnTopKey));
diff --git a/ui/aura/test/mus/test_window_tree.cc b/ui/aura/test/mus/test_window_tree.cc
index fdf553f..a20c1eb 100644
--- a/ui/aura/test/mus/test_window_tree.cc
+++ b/ui/aura/test/mus/test_window_tree.cc
@@ -143,6 +143,12 @@
   OnChangeReceived(change_id, WindowTreeChangeType::BOUNDS);
 }
 
+void TestWindowTree::SetWindowTransform(uint32_t change_id,
+                                        uint32_t window_id,
+                                        const gfx::Transform& transform) {
+  OnChangeReceived(change_id, WindowTreeChangeType::TRANSFORM);
+}
+
 void TestWindowTree::SetClientArea(
     uint32_t window_id,
     const gfx::Insets& insets,
diff --git a/ui/aura/test/mus/test_window_tree.h b/ui/aura/test/mus/test_window_tree.h
index 5f7bc7c..13fed01 100644
--- a/ui/aura/test/mus/test_window_tree.h
+++ b/ui/aura/test/mus/test_window_tree.h
@@ -27,6 +27,7 @@
   PROPERTY,
   REMOVE_TRANSIENT,
   REORDER,
+  TRANSFORM,
   VISIBLE,
 
   // This covers all cases that aren't used in tests.
@@ -125,6 +126,9 @@
       uint32_t window_id,
       const gfx::Rect& bounds,
       const base::Optional<cc::LocalSurfaceId>& local_surface_id) override;
+  void SetWindowTransform(uint32_t change_id,
+                          uint32_t window_id,
+                          const gfx::Transform& transform) override;
   void SetClientArea(uint32_t window_id,
                      const gfx::Insets& insets,
                      const base::Optional<std::vector<gfx::Rect>>&
diff --git a/ui/aura/window.cc b/ui/aura/window.cc
index 44bb18b..7c1d01a 100644
--- a/ui/aura/window.cc
+++ b/ui/aura/window.cc
@@ -261,7 +261,9 @@
 void Window::SetTransform(const gfx::Transform& transform) {
   for (WindowObserver& observer : observers_)
     observer.OnWindowTransforming(this);
+  gfx::Transform old_transform = layer()->transform();
   layer()->SetTransform(transform);
+  port_->OnDidChangeTransform(old_transform, transform);
   for (WindowObserver& observer : observers_)
     observer.OnWindowTransformed(this);
   NotifyAncestorWindowTransformed(this);
diff --git a/ui/aura/window_port.h b/ui/aura/window_port.h
index 6774dc6..bd41ffb 100644
--- a/ui/aura/window_port.h
+++ b/ui/aura/window_port.h
@@ -23,6 +23,7 @@
 
 namespace gfx {
 class Rect;
+class Transform;
 }
 
 namespace aura {
@@ -64,6 +65,9 @@
   virtual void OnDidChangeBounds(const gfx::Rect& old_bounds,
                                  const gfx::Rect& new_bounds) = 0;
 
+  virtual void OnDidChangeTransform(const gfx::Transform& old_transform,
+                                    const gfx::Transform& new_transform) = 0;
+
   // Called before a property is changed. The return value from this is supplied
   // into OnPropertyChanged() so that WindowPort may pass data between the two
   // calls.
diff --git a/ui/aura/window_port_for_shutdown.cc b/ui/aura/window_port_for_shutdown.cc
index 78ca06cb..3c1cc2e 100644
--- a/ui/aura/window_port_for_shutdown.cc
+++ b/ui/aura/window_port_for_shutdown.cc
@@ -37,6 +37,10 @@
 void WindowPortForShutdown::OnDidChangeBounds(const gfx::Rect& old_bounds,
                                               const gfx::Rect& new_bounds) {}
 
+void WindowPortForShutdown::OnDidChangeTransform(
+    const gfx::Transform& old_transform,
+    const gfx::Transform& new_transform) {}
+
 std::unique_ptr<ui::PropertyData> WindowPortForShutdown::OnWillChangeProperty(
     const void* key) {
   return nullptr;
diff --git a/ui/aura/window_port_for_shutdown.h b/ui/aura/window_port_for_shutdown.h
index 894e2c72..56473cd 100644
--- a/ui/aura/window_port_for_shutdown.h
+++ b/ui/aura/window_port_for_shutdown.h
@@ -28,6 +28,8 @@
   void OnVisibilityChanged(bool visible) override;
   void OnDidChangeBounds(const gfx::Rect& old_bounds,
                          const gfx::Rect& new_bounds) override;
+  void OnDidChangeTransform(const gfx::Transform& old_transform,
+                            const gfx::Transform& new_transform) override;
   std::unique_ptr<ui::PropertyData> OnWillChangeProperty(
       const void* key) override;
   void OnPropertyChanged(const void* key,
diff --git a/ui/chromeos/touch_exploration_controller.cc b/ui/chromeos/touch_exploration_controller.cc
index 6fce4a30..c756b0a0 100644
--- a/ui/chromeos/touch_exploration_controller.cc
+++ b/ui/chromeos/touch_exploration_controller.cc
@@ -72,6 +72,11 @@
   exclude_bounds_ = bounds;
 }
 
+void TouchExplorationController::SetLiftActivationBounds(
+    const gfx::Rect& bounds) {
+  lift_activation_bounds_ = bounds;
+}
+
 ui::EventRewriteStatus TouchExplorationController::RewriteEvent(
     const ui::Event& event,
     std::unique_ptr<ui::Event>* rewritten_event) {
@@ -323,6 +328,7 @@
       passthrough_timer_.Stop();
     if (current_touch_ids_.size() == 0 &&
         event.pointer_details().id == initial_press_->pointer_details().id) {
+      MaybeSendSimulatedTapInLiftActivationBounds(event);
       SET_STATE(SINGLE_TAP_RELEASED);
     } else if (current_touch_ids_.size() == 0) {
       SET_STATE(NO_FINGERS_DOWN);
@@ -433,7 +439,7 @@
     if (current_touch_ids_.size() != 0)
       return EVENT_REWRITE_DISCARD;
 
-    SendSimulatedClick();
+    SendSimulatedClickOrTap();
 
     SET_STATE(NO_FINGERS_DOWN);
     return ui::EVENT_REWRITE_DISCARD;
@@ -452,7 +458,7 @@
     if (current_touch_ids_.size() != 0)
       return EVENT_REWRITE_DISCARD;
 
-    SendSimulatedClick();
+    SendSimulatedClickOrTap();
     SET_STATE(NO_FINGERS_DOWN);
     return ui::EVENT_REWRITE_DISCARD;
   }
@@ -473,6 +479,7 @@
   } else if (type == ui::ET_TOUCH_RELEASED || type == ui::ET_TOUCH_CANCELLED) {
     initial_press_.reset(new TouchEvent(event));
     StartTapTimer();
+    MaybeSendSimulatedTapInLiftActivationBounds(event);
     SET_STATE(TOUCH_EXPLORE_RELEASED);
   } else if (type != ui::ET_TOUCH_MOVED) {
     NOTREACHED();
@@ -614,7 +621,7 @@
     if (current_touch_ids_.size() != 1)
       return EVENT_REWRITE_DISCARD;
 
-    SendSimulatedClick();
+    SendSimulatedClickOrTap();
 
     SET_STATE(TOUCH_EXPLORATION);
     EnterTouchToMouseMode();
@@ -636,19 +643,17 @@
   delegate_->PlayVolumeAdjustEarcon();
 }
 
-void TouchExplorationController::SendSimulatedClick() {
+void TouchExplorationController::SendSimulatedClickOrTap() {
   // If we got an anchor point from ChromeVox, send a double-tap gesture
   // and let ChromeVox handle the click.
   if (anchor_point_state_ == ANCHOR_POINT_EXPLICITLY_SET) {
     delegate_->HandleAccessibilityGesture(ui::AX_GESTURE_CLICK);
     return;
   }
+  SendSimulatedTap();
+}
 
-  // If we don't have an anchor point, we can't send a simulated click.
-  if (anchor_point_state_ == ANCHOR_POINT_NONE)
-    return;
-
-  // Otherwise send a simulated press/release at the anchor point.
+void TouchExplorationController::SendSimulatedTap() {
   std::unique_ptr<ui::TouchEvent> touch_press;
   touch_press.reset(new ui::TouchEvent(ui::ET_TOUCH_PRESSED, gfx::Point(),
                                        Now(),
@@ -666,6 +671,16 @@
   DispatchEvent(touch_release.get());
 }
 
+void TouchExplorationController::MaybeSendSimulatedTapInLiftActivationBounds(
+    const ui::TouchEvent& event) {
+  gfx::Point location = event.location();
+  root_window_->GetHost()->ConvertScreenInPixelsToDIP(&location);
+  if (lift_activation_bounds_.Contains(anchor_point_.x(), anchor_point_.y()) &&
+      lift_activation_bounds_.Contains(location)) {
+    SendSimulatedTap();
+  }
+}
+
 ui::EventRewriteStatus TouchExplorationController::InSlideGesture(
     const ui::TouchEvent& event,
     std::unique_ptr<ui::Event>* rewritten_event) {
diff --git a/ui/chromeos/touch_exploration_controller.h b/ui/chromeos/touch_exploration_controller.h
index 6727c2a..4076433f 100644
--- a/ui/chromeos/touch_exploration_controller.h
+++ b/ui/chromeos/touch_exploration_controller.h
@@ -194,6 +194,10 @@
   // |bounds| are in root window coordinates.
   void SetExcludeBounds(const gfx::Rect& bounds);
 
+  // Updates |lift_activation_bounds_|. See |lift_activation_bounds_| for more
+  // information.
+  void SetLiftActivationBounds(const gfx::Rect& bounds);
+
  private:
   friend class TouchExplorationControllerTestApi;
 
@@ -296,7 +300,16 @@
 
   void PlaySoundForTimer();
 
-  void SendSimulatedClick();
+  // Sends a simulated click, if an anchor point was set explicitly. Otherwise,
+  // sends a simulated tap at anchor point.
+  void SendSimulatedClickOrTap();
+
+  // Sends a simulated tap at anchor point.
+  void SendSimulatedTap();
+
+  // Sends a simulated tap, if the anchor point falls within lift activation
+  // bounds.
+  void MaybeSendSimulatedTapInLiftActivationBounds(const ui::TouchEvent& event);
 
   // Some constants used in touch_exploration_controller:
 
@@ -514,6 +527,11 @@
   // rewritten when TouchExplorationController is running.
   TouchAccessibilityEnabler* touch_accessibility_enabler_;
 
+  // Any touch exploration that both starts and ends (touch pressed, and
+  // released) within this rectangle, triggers a simulated single finger tap at
+  // the anchor point on release.
+  gfx::Rect lift_activation_bounds_;
+
   DISALLOW_COPY_AND_ASSIGN(TouchExplorationController);
 };
 
diff --git a/ui/chromeos/touch_exploration_controller_unittest.cc b/ui/chromeos/touch_exploration_controller_unittest.cc
index c05e181..0879c61f 100644
--- a/ui/chromeos/touch_exploration_controller_unittest.cc
+++ b/ui/chromeos/touch_exploration_controller_unittest.cc
@@ -190,6 +190,10 @@
     touch_exploration_controller_->SetExcludeBounds(bounds);
   }
 
+  void SetLiftActivationBounds(const gfx::Rect& bounds) {
+    touch_exploration_controller_->SetLiftActivationBounds(bounds);
+  }
+
  private:
   std::unique_ptr<TouchExplorationController> touch_exploration_controller_;
 
@@ -413,6 +417,10 @@
     touch_exploration_controller_->SetExcludeBounds(bounds);
   }
 
+  void SetLiftActivationBounds(const gfx::Rect& bounds) {
+    touch_exploration_controller_->SetLiftActivationBounds(bounds);
+  }
+
   std::unique_ptr<test::EventGenerator> generator_;
   ui::GestureDetector::Config gesture_detector_config_;
   // Owned by |ui|.
@@ -1976,4 +1984,83 @@
   }
 }
 
+TEST_F(TouchExplorationTest, SingleTapInLiftActivationArea) {
+  SwitchTouchExplorationMode(true);
+
+  gfx::Rect lift_activation = BoundsOfRootWindowInDIP();
+  lift_activation.Inset(0, 0, 0, 30);
+  SetLiftActivationBounds(lift_activation);
+
+  // Tap at one location, and get tap and mouse move events.
+  gfx::Point tap_location = lift_activation.CenterPoint();
+
+  // The user has to have previously selected something.
+  SetTouchAccessibilityAnchorPoint(tap_location);
+
+  generator_->set_current_location(tap_location);
+  generator_->PressTouchId(1);
+  generator_->ReleaseTouchId(1);
+  AdvanceSimulatedTimePastTapDelay();
+
+  const EventList& captured_events = GetCapturedEvents();
+  ASSERT_EQ(3U, captured_events.size());
+  EXPECT_EQ(ui::ET_TOUCH_PRESSED, captured_events[0]->type());
+  EXPECT_EQ(ui::ET_TOUCH_RELEASED, captured_events[1]->type());
+  EXPECT_EQ(ui::ET_MOUSE_MOVED, captured_events[2]->type());
+  ClearCapturedEvents();
+
+  gfx::Point out_tap_location(tap_location.x(), lift_activation.bottom() + 20);
+  SetTouchAccessibilityAnchorPoint(out_tap_location);
+  generator_->set_current_location(out_tap_location);
+  generator_->PressTouchId(1);
+  generator_->ReleaseTouchId(1);
+  AdvanceSimulatedTimePastTapDelay();
+
+  const EventList& out_captured_events = GetCapturedEvents();
+  ASSERT_EQ(1U, out_captured_events.size());
+  EXPECT_EQ(ui::ET_MOUSE_MOVED, out_captured_events[0]->type());
+}
+
+TEST_F(TouchExplorationTest, TouchExploreLiftInLiftActivationArea) {
+  SwitchTouchExplorationMode(true);
+
+  gfx::Rect lift_activation = BoundsOfRootWindowInDIP();
+  lift_activation.Inset(0, 0, 0, 30);
+  SetLiftActivationBounds(lift_activation);
+
+  // Explore at one location, and get tap and mouse move events.
+  gfx::Point tap_location = lift_activation.CenterPoint();
+  EnterTouchExplorationModeAtLocation(tap_location);
+  ClearCapturedEvents();
+
+  // A touch release should trigger a tap.
+  ui::TouchEvent touch_explore_release(
+      ui::ET_TOUCH_RELEASED, tap_location, Now(),
+      ui::PointerDetails(ui::EventPointerType::POINTER_TYPE_TOUCH, 0));
+  generator_->Dispatch(&touch_explore_release);
+  AdvanceSimulatedTimePastTapDelay();
+
+  const EventList& captured_events = GetCapturedEvents();
+  ASSERT_EQ(3U, captured_events.size());
+  EXPECT_EQ(ui::ET_TOUCH_PRESSED, captured_events[0]->type());
+  EXPECT_EQ(ui::ET_TOUCH_RELEASED, captured_events[1]->type());
+  EXPECT_EQ(ui::ET_MOUSE_MOVED, captured_events[2]->type());
+  ClearCapturedEvents();
+
+  // Touch explore inside the activation bounds, but lift outside.
+  gfx::Point out_tap_location(tap_location.x(), lift_activation.bottom() + 20);
+  SetTouchAccessibilityAnchorPoint(out_tap_location);
+  EnterTouchExplorationModeAtLocation(tap_location);
+  ClearCapturedEvents();
+  ui::TouchEvent out_touch_explore_release(
+      ui::ET_TOUCH_RELEASED, out_tap_location, Now(),
+      ui::PointerDetails(ui::EventPointerType::POINTER_TYPE_TOUCH, 0));
+  generator_->Dispatch(&out_touch_explore_release);
+  AdvanceSimulatedTimePastTapDelay();
+
+  const EventList& out_captured_events = GetCapturedEvents();
+  ASSERT_EQ(1U, out_captured_events.size());
+  EXPECT_EQ(ui::ET_MOUSE_MOVED, out_captured_events[0]->type());
+}
+
 }  // namespace ui
diff --git a/ui/message_center/views/message_bubble_base.cc b/ui/message_center/views/message_bubble_base.cc
index 4089234..f3fe0b3 100644
--- a/ui/message_center/views/message_bubble_base.cc
+++ b/ui/message_center/views/message_bubble_base.cc
@@ -8,7 +8,6 @@
 #include "base/location.h"
 #include "base/single_thread_task_runner.h"
 #include "base/threading/thread_task_runner_handle.h"
-#include "ui/message_center/message_center_style.h"
 #include "ui/views/widget/widget.h"
 #include "ui/views/widget/widget_observer.h"
 
@@ -64,14 +63,4 @@
     bubble_view_->SetMaxHeight(max_height_);
 }
 
-views::TrayBubbleView::InitParams MessageBubbleBase::GetDefaultInitParams(
-    views::TrayBubbleView::AnchorAlignment anchor_alignment) {
-  views::TrayBubbleView::InitParams init_params(
-      anchor_alignment,
-      kNotificationWidth,
-      kNotificationWidth);
-  init_params.bg_color = kBackgroundDarkColor;
-  return init_params;
-}
-
 }  // namespace message_center
diff --git a/ui/message_center/views/message_bubble_base.h b/ui/message_center/views/message_bubble_base.h
index 0c9718a..779b9b3 100644
--- a/ui/message_center/views/message_bubble_base.h
+++ b/ui/message_center/views/message_bubble_base.h
@@ -8,6 +8,7 @@
 #include <memory>
 
 #include "base/macros.h"
+#include "ui/gfx/native_widget_types.h"
 #include "ui/message_center/message_center.h"
 #include "ui/message_center/message_center_export.h"
 #include "ui/views/bubble/tray_bubble_view.h"
@@ -31,10 +32,6 @@
   void SetMaxHeight(int height);
   int max_height() const { return max_height_; }
 
-  // Gets the init params for the implementation.
-  virtual views::TrayBubbleView::InitParams GetInitParams(
-      views::TrayBubbleView::AnchorAlignment anchor_alignment) = 0;
-
   // Called after the bubble view has been constructed. Creates and initializes
   // the bubble contents.
   virtual void InitializeContents(views::TrayBubbleView* bubble_view) = 0;
@@ -58,8 +55,6 @@
   views::TrayBubbleView* bubble_view() const { return bubble_view_; }
 
  protected:
-  views::TrayBubbleView::InitParams GetDefaultInitParams(
-      views::TrayBubbleView::AnchorAlignment anchor_alignment);
   MessageCenter* message_center() { return message_center_; }
   MessageCenterTray* tray() { return tray_; }
   void set_bubble_view(views::TrayBubbleView* bubble_view) {
diff --git a/ui/message_center/views/message_center_bubble.cc b/ui/message_center/views/message_center_bubble.cc
index 3045bfd2..8ecf7a5 100644
--- a/ui/message_center/views/message_center_bubble.cc
+++ b/ui/message_center/views/message_center_bubble.cc
@@ -79,17 +79,6 @@
     initially_settings_visible_ = true;
 }
 
-views::TrayBubbleView::InitParams MessageCenterBubble::GetInitParams(
-    views::TrayBubbleView::AnchorAlignment anchor_alignment) {
-  views::TrayBubbleView::InitParams init_params =
-      GetDefaultInitParams(anchor_alignment);
-  init_params.min_width += kMarginBetweenItems * 2;
-  init_params.max_width += kMarginBetweenItems * 2;
-  init_params.max_height = max_height();
-  init_params.can_activate = true;
-  return init_params;
-}
-
 void MessageCenterBubble::InitializeContents(
     views::TrayBubbleView* new_bubble_view) {
   set_bubble_view(new_bubble_view);
diff --git a/ui/message_center/views/message_center_bubble.h b/ui/message_center/views/message_center_bubble.h
index 4364a124..138c562 100644
--- a/ui/message_center/views/message_center_bubble.h
+++ b/ui/message_center/views/message_center_bubble.h
@@ -33,8 +33,6 @@
   void OnWidgetClosing(views::Widget* widget) override;
 
   // Overridden from MessageBubbleBase:
-  views::TrayBubbleView::InitParams GetInitParams(
-      views::TrayBubbleView::AnchorAlignment anchor_alignment) override;
   void InitializeContents(views::TrayBubbleView* bubble_view) override;
   void OnBubbleViewDestroyed() override;
   void UpdateBubbleView() override;
diff --git a/ui/resources/default_100_percent/common/close_4_button.png b/ui/resources/default_100_percent/common/close_4_button.png
deleted file mode 100644
index 8b48ada8..0000000
--- a/ui/resources/default_100_percent/common/close_4_button.png
+++ /dev/null
Binary files differ
diff --git a/ui/resources/default_100_percent/common/message_close.png b/ui/resources/default_100_percent/common/message_close.png
deleted file mode 100644
index d6cf272..0000000
--- a/ui/resources/default_100_percent/common/message_close.png
+++ /dev/null
Binary files differ
diff --git a/ui/resources/default_100_percent/legacy/menu_check.png b/ui/resources/default_100_percent/legacy/menu_check.png
deleted file mode 100644
index 1fa1ff6..0000000
--- a/ui/resources/default_100_percent/legacy/menu_check.png
+++ /dev/null
Binary files differ
diff --git a/ui/resources/default_200_percent/common/close_4_button.png b/ui/resources/default_200_percent/common/close_4_button.png
deleted file mode 100644
index ece0d61..0000000
--- a/ui/resources/default_200_percent/common/close_4_button.png
+++ /dev/null
Binary files differ
diff --git a/ui/resources/default_200_percent/common/message_close.png b/ui/resources/default_200_percent/common/message_close.png
deleted file mode 100644
index 13fa4885..0000000
--- a/ui/resources/default_200_percent/common/message_close.png
+++ /dev/null
Binary files differ
diff --git a/ui/resources/default_200_percent/legacy/menu_check.png b/ui/resources/default_200_percent/legacy/menu_check.png
deleted file mode 100644
index 057364e..0000000
--- a/ui/resources/default_200_percent/legacy/menu_check.png
+++ /dev/null
Binary files differ
diff --git a/ui/resources/ui_resources.grd b/ui/resources/ui_resources.grd
index 94d676d..20cba9c 100644
--- a/ui/resources/ui_resources.grd
+++ b/ui/resources/ui_resources.grd
@@ -88,7 +88,6 @@
       <structure type="chrome_scaled_image" name="IDR_CLOSE_2_MASK" file="close_2_mask.png" />
       <structure type="chrome_scaled_image" name="IDR_CLOSE_2_P" file="close_2_pressed.png" />
       <structure type="chrome_scaled_image" name="IDR_CLOSE_3_MASK" file="common/close_3_mask.png" />
-      <structure type="chrome_scaled_image" name="IDR_CLOSE_4_BUTTON" file="common/close_4_button.png" />
       <structure type="chrome_scaled_image" name="IDR_CLOSE_DIALOG" file="close_dialog.png" />
       <structure type="chrome_scaled_image" name="IDR_CLOSE_DIALOG_H" file="close_dialog_hover.png" />
       <structure type="chrome_scaled_image" name="IDR_CLOSE_DIALOG_P" file="close_dialog_pressed.png" />
@@ -117,7 +116,6 @@
       <structure type="chrome_scaled_image" name="IDR_FOLDER_CLOSED" file="common/folder_closed.png" />
       <structure type="chrome_scaled_image" name="IDR_FOLDER_CLOSED_RTL" file="common/folder_closed_rtl.png" />
       <if expr="is_macosx">
-        <structure type="chrome_scaled_image" name="IDR_MENU_CHECK_CHECKED" file="legacy/menu_check.png" />
         <structure type="chrome_scaled_image" name="IDR_MENU_OVERFLOW_UP" file="common/menu_overflow_up.png" />
         <structure type="chrome_scaled_image" name="IDR_MENU_OVERFLOW_DOWN" file="common/menu_overflow_down.png" />
       </if>
@@ -125,7 +123,6 @@
         <structure type="chrome_scaled_image" name="IDR_MENU_HIERARCHY_ARROW" file="mac/menu_hierarchy_arrow.png" />
       </if>
       <structure type="chrome_scaled_image" name="IDR_MENU_DROPARROW" file="cros/menu_droparrow.png" />
-      <structure type="chrome_scaled_image" name="IDR_MESSAGE_CLOSE" file="common/message_close.png" />
       <if expr="toolkit_views or is_macosx or is_ios">
         <structure type="chrome_scaled_image" name="IDR_NOTIFICATION_ARROW" file="common/notification_arrow.png"/>
         <structure type="chrome_scaled_image" name="IDR_NOTIFICATION_ARROW_HOVER" file="common/notification_arrow_hover.png"/>
@@ -196,7 +193,6 @@
         <structure type="chrome_scaled_image" name="IDR_TOUCH_DRAG_TIP_LINK" file="common/drag_tip_link.png" />
         <structure type="chrome_scaled_image" name="IDR_TOUCH_DRAG_TIP_NODROP" file="common/drag_tip_nodrop.png" />
       </if>
-      <structure type="chrome_scaled_image" name="IDR_TRANSLATE_ICON_BUBBLE" file="common/translate.png" />
     </structures>
   </release>
 </grit>
diff --git a/ui/strings/translations/ui_strings_th.xtb b/ui/strings/translations/ui_strings_th.xtb
index d9732f2..15f8c6ce 100644
--- a/ui/strings/translations/ui_strings_th.xtb
+++ b/ui/strings/translations/ui_strings_th.xtb
@@ -67,7 +67,7 @@
 <translation id="5046499563572181734">แตะที่นี่</translation>
 <translation id="5076340679995252485">&amp;วาง</translation>
 <translation id="5120799197269191491">ค้นหา+<ph name="KEY_COMBO_NAME" /></translation>
-<translation id="5153297660536091054">คุณลักษณะการปลดล็อกด้วย PIN</translation>
+<translation id="5153297660536091054">ฟีเจอร์การปลดล็อกด้วย PIN</translation>
 <translation id="520299402983819650"><ph name="QUANTITY" /> PB</translation>
 <translation id="528468243742722775">End</translation>
 <translation id="5329858601952122676">&amp;ลบ</translation>
@@ -120,7 +120,7 @@
 <translation id="7814458197256864873">&amp;คัดลอก</translation>
 <translation id="7850320739366109486">ห้ามรบกวน</translation>
 <translation id="7907591526440419938">เปิดไฟล์</translation>
-<translation id="8054029954190364711">คุณลักษณะการปลดล็อกด้วยลายนิ้วมือ</translation>
+<translation id="8054029954190364711">ฟีเจอร์การปลดล็อกด้วยลายนิ้วมือ</translation>
 <translation id="8106081041558092062">{HOURS,plural, =1{1 ชั่วโมงที่ผ่านมา}other{# ชั่วโมงที่ผ่านมา}}</translation>
 <translation id="8131263257437993507">{SECONDS,plural, =1{เหลือ 1 วินาที}other{เหลือ # วินาที}}</translation>
 <translation id="815598010540052116">เลื่อนลง</translation>
diff --git a/ui/views/animation/ink_drop_host.h b/ui/views/animation/ink_drop_host.h
index fa77f3e..8360d62 100644
--- a/ui/views/animation/ink_drop_host.h
+++ b/ui/views/animation/ink_drop_host.h
@@ -54,6 +54,7 @@
 
   // Creates and returns the visual effect used for hover and focus. Used by
   // InkDropImpl instances.
+  // Note: InkDropHostView does not accept null return values.
   virtual std::unique_ptr<InkDropHighlight> CreateInkDropHighlight() const = 0;
 
  private:
diff --git a/ui/views/animation/ink_drop_host_view.cc b/ui/views/animation/ink_drop_host_view.cc
index cbf80ff..1856e89 100644
--- a/ui/views/animation/ink_drop_host_view.cc
+++ b/ui/views/animation/ink_drop_host_view.cc
@@ -271,12 +271,17 @@
   return nullptr;
 }
 
+bool InkDropHostView::HasInkDrop() const {
+  return !!ink_drop_;
+}
+
 InkDrop* InkDropHostView::GetInkDrop() {
   if (!ink_drop_) {
     if (ink_drop_mode_ == InkDropMode::OFF || !PlatformStyle::kUseRipples)
       ink_drop_ = base::MakeUnique<InkDropStub>();
     else
       ink_drop_ = CreateInkDrop();
+    OnInkDropCreated();
   }
   return ink_drop_.get();
 }
diff --git a/ui/views/animation/ink_drop_host_view.h b/ui/views/animation/ink_drop_host_view.h
index 68e5b60b..8ac475f 100644
--- a/ui/views/animation/ink_drop_host_view.h
+++ b/ui/views/animation/ink_drop_host_view.h
@@ -111,6 +111,12 @@
   // crbug.com/713359.
   virtual std::unique_ptr<views::InkDropMask> CreateInkDropMask() const;
 
+  // Called after a new InkDrop instance is created.
+  virtual void OnInkDropCreated() {}
+
+  // Returns true if an ink drop instance has been created.
+  bool HasInkDrop() const;
+
   // Provides access to |ink_drop_|. Implements lazy initialization of
   // |ink_drop_| so as to avoid virtual method calls during construction since
   // subclasses should be able to call SetInkDropMode() during construction.
diff --git a/ui/views/animation/ink_drop_host_view_unittest.cc b/ui/views/animation/ink_drop_host_view_unittest.cc
index 5849c53..50ac035 100644
--- a/ui/views/animation/ink_drop_host_view_unittest.cc
+++ b/ui/views/animation/ink_drop_host_view_unittest.cc
@@ -19,15 +19,27 @@
 namespace test {
 using InkDropMode = InkDropHostViewTestApi::InkDropMode;
 
-class InkDropHostViewColor : public InkDropHostView {
+class TestInkDropHostView : public InkDropHostView {
  public:
+  TestInkDropHostView() {}
+
   // Accessors to InkDropHostView internals.
   ui::EventHandler* GetTargetHandler() { return target_handler(); }
 
+  int on_ink_drop_created_count() const { return on_ink_drop_created_count_; }
+
  protected:
   SkColor GetInkDropBaseColor() const override {
     return gfx::kPlaceholderColor;
   }
+
+  // InkDropHostView:
+  void OnInkDropCreated() override { ++on_ink_drop_created_count_; }
+
+ private:
+  int on_ink_drop_created_count_ = 0;
+
+  DISALLOW_COPY_AND_ASSIGN(TestInkDropHostView);
 };
 
 class InkDropHostViewTest : public testing::Test {
@@ -37,7 +49,7 @@
 
  protected:
   // Test target.
-  InkDropHostViewColor host_view_;
+  TestInkDropHostView host_view_;
 
   // Provides internal access to |host_view_| test target.
   InkDropHostViewTestApi test_api_;
@@ -71,6 +83,33 @@
   EXPECT_EQ(gfx::Point(5, 6), test_api_.GetInkDropCenterBasedOnLastEvent());
 }
 
+TEST_F(InkDropHostViewTest, HasInkDrop) {
+  EXPECT_FALSE(test_api_.HasInkDrop());
+
+  test_api_.GetInkDrop();
+  EXPECT_TRUE(test_api_.HasInkDrop());
+
+  test_api_.SetInkDropMode(InkDropMode::OFF);
+  EXPECT_FALSE(test_api_.HasInkDrop());
+}
+
+TEST_F(InkDropHostViewTest, OnInkDropCreatedOnlyNotfiedOnCreation) {
+  EXPECT_EQ(0, host_view_.on_ink_drop_created_count());
+
+  test_api_.GetInkDrop();
+  EXPECT_EQ(1, host_view_.on_ink_drop_created_count());
+
+  test_api_.GetInkDrop();
+  EXPECT_EQ(1, host_view_.on_ink_drop_created_count());
+
+  test_api_.SetInkDropMode(InkDropMode::OFF);
+  test_api_.SetInkDropMode(InkDropMode::ON);
+  EXPECT_EQ(1, host_view_.on_ink_drop_created_count());
+
+  test_api_.GetInkDrop();
+  EXPECT_EQ(2, host_view_.on_ink_drop_created_count());
+}
+
 // Verifies that SetInkDropMode() sets up gesture handling properly.
 TEST_F(InkDropHostViewTest, SetInkDropModeGestureHandler) {
   EXPECT_FALSE(test_api_.HasGestureHandler());
diff --git a/ui/views/animation/ink_drop_impl.cc b/ui/views/animation/ink_drop_impl.cc
index 8bf9a3c..9a5a7ca 100644
--- a/ui/views/animation/ink_drop_impl.cc
+++ b/ui/views/animation/ink_drop_impl.cc
@@ -703,10 +703,8 @@
   DestroyInkDropHighlight();
 
   highlight_ = ink_drop_host_->CreateInkDropHighlight();
-  // TODO(bruthig): Remove check for null since all CreateInkDropHighlight()
-  // methods should return a valid instance.
-  if (!highlight_)
-    return;
+  DCHECK(highlight_);
+
   highlight_->set_observer(this);
   root_layer_->Add(highlight_->layer());
   AddRootLayerToHostIfNeeded();
@@ -787,10 +785,7 @@
 
   if (should_highlight) {
     CreateInkDropHighlight();
-    // TODO(bruthig): Remove check for null since all CreateInkDropHighlight()
-    // methods should return a valid instance.
-    if (highlight_)
-      highlight_->FadeIn(animation_duration);
+    highlight_->FadeIn(animation_duration);
   } else {
     highlight_->FadeOut(animation_duration, explode);
   }
diff --git a/ui/views/animation/test/ink_drop_host_view_test_api.cc b/ui/views/animation/test/ink_drop_host_view_test_api.cc
index a831f34..5921c06b 100644
--- a/ui/views/animation/test/ink_drop_host_view_test_api.cc
+++ b/ui/views/animation/test/ink_drop_host_view_test_api.cc
@@ -28,6 +28,10 @@
   SetInkDrop(std::move(ink_drop), true);
 }
 
+bool InkDropHostViewTestApi::HasInkDrop() const {
+  return host_view_->HasInkDrop();
+}
+
 InkDrop* InkDropHostViewTestApi::GetInkDrop() {
   return host_view_->GetInkDrop();
 }
diff --git a/ui/views/animation/test/ink_drop_host_view_test_api.h b/ui/views/animation/test/ink_drop_host_view_test_api.h
index 0402b62..263e375 100644
--- a/ui/views/animation/test/ink_drop_host_view_test_api.h
+++ b/ui/views/animation/test/ink_drop_host_view_test_api.h
@@ -32,6 +32,9 @@
 
   InkDrop* ink_drop() { return host_view_->ink_drop_.get(); }
 
+  // Wrapper for InkDropHostView::HasInkDrop().
+  bool HasInkDrop() const;
+
   // Wrapper for InkDropHostView::GetInkDrop() which lazily creates the ink drop
   // instance if it doesn't already exist. If you need direct access to
   // InkDropHostView::ink_drop_ use ink_drop() instead.
diff --git a/ui/views/bubble/bubble_dialog_delegate.h b/ui/views/bubble/bubble_dialog_delegate.h
index ac934267..81a3a4c 100644
--- a/ui/views/bubble/bubble_dialog_delegate.h
+++ b/ui/views/bubble/bubble_dialog_delegate.h
@@ -99,7 +99,6 @@
   virtual gfx::Rect GetAnchorRect() const;
 
   // Allows delegates to provide custom parameters before widget initialization.
-  // For example, mus needs to set a custom ui::Window* parent.
   virtual void OnBeforeBubbleWidgetInit(Widget::InitParams* params,
                                         Widget* widget) const;
 
diff --git a/ui/views/bubble/tray_bubble_view.cc b/ui/views/bubble/tray_bubble_view.cc
index 6d29a97d..a7657e9 100644
--- a/ui/views/bubble/tray_bubble_view.cc
+++ b/ui/views/bubble/tray_bubble_view.cc
@@ -171,33 +171,16 @@
 using internal::TrayBubbleContentMask;
 using internal::BottomAlignedBoxLayout;
 
-TrayBubbleView::InitParams::InitParams(AnchorAlignment anchor_alignment,
-                                       int min_width,
-                                       int max_width)
-    : anchor_alignment(anchor_alignment),
-      min_width(min_width),
-      max_width(max_width),
-      max_height(0),
-      can_activate(false),
-      close_on_deactivate(true) {}
+TrayBubbleView::InitParams::InitParams() = default;
 
 TrayBubbleView::InitParams::InitParams(const InitParams& other) = default;
 
-// static
-TrayBubbleView* TrayBubbleView::Create(View* anchor,
-                                       Delegate* delegate,
-                                       InitParams* init_params) {
-  return new TrayBubbleView(anchor, delegate, *init_params);
-}
-
-TrayBubbleView::TrayBubbleView(View* anchor,
-                               Delegate* delegate,
-                               const InitParams& init_params)
-    : BubbleDialogDelegateView(anchor,
+TrayBubbleView::TrayBubbleView(const InitParams& init_params)
+    : BubbleDialogDelegateView(init_params.anchor_view,
                                GetArrowAlignment(init_params.anchor_alignment)),
       params_(init_params),
       layout_(new BottomAlignedBoxLayout(this)),
-      delegate_(delegate),
+      delegate_(init_params.delegate),
       preferred_width_(init_params.min_width),
       bubble_border_(new BubbleBorder(
           arrow(),
@@ -206,11 +189,14 @@
       owned_bubble_border_(bubble_border_),
       is_gesture_dragging_(false),
       mouse_actively_entered_(false) {
+  DCHECK(delegate_);
+  DCHECK(params_.parent_window);
+  DCHECK(anchor_widget());  // Computed by BubbleDialogDelegateView().
   bubble_border_->set_use_theme_background_color(!init_params.bg_color);
   bubble_border_->set_alignment(BubbleBorder::ALIGN_EDGE_TO_ANCHOR_EDGE);
   bubble_border_->set_paint_arrow(BubbleBorder::PAINT_NONE);
+  set_parent_window(params_.parent_window);
   set_can_activate(params_.can_activate);
-  DCHECK(anchor_widget());  // Computed by BubbleDialogDelegateView().
   set_notify_enter_exit_on_child(true);
   set_close_on_deactivate(init_params.close_on_deactivate);
   set_margins(gfx::Insets());
@@ -283,8 +269,6 @@
 
 void TrayBubbleView::OnBeforeBubbleWidgetInit(Widget::InitParams* params,
                                               Widget* bubble_widget) const {
-  if (delegate_)
-    delegate_->OnBeforeBubbleWidgetInit(anchor_widget(), bubble_widget, params);
   // Apply a WM-provided shadow (see ui/wm/core/).
   params->shadow_type = Widget::InitParams::SHADOW_TYPE_DROP;
   params->shadow_elevation = wm::ShadowElevation::LARGE;
diff --git a/ui/views/bubble/tray_bubble_view.h b/ui/views/bubble/tray_bubble_view.h
index ccd7b77..81042a8 100644
--- a/ui/views/bubble/tray_bubble_view.h
+++ b/ui/views/bubble/tray_bubble_view.h
@@ -9,6 +9,7 @@
 
 #include "base/macros.h"
 #include "base/optional.h"
+#include "ui/gfx/native_widget_types.h"
 #include "ui/views/bubble/bubble_dialog_delegate.h"
 #include "ui/views/mouse_watcher.h"
 #include "ui/views/views_export.h"
@@ -61,15 +62,6 @@
     // accessible name for the bubble.
     virtual base::string16 GetAccessibleNameForBubble() = 0;
 
-    // Called before Widget::Init() on |bubble_widget|. Allows |params| to be
-    // modified.
-    // TODO(jamescook): Eliminate this method. It was introduced to let mash set
-    // the widget container back when mash could not use aura::Window. Now the
-    // anchor view should be sufficient.
-    virtual void OnBeforeBubbleWidgetInit(Widget* anchor_widget,
-                                          Widget* bubble_widget,
-                                          Widget::InitParams* params) const = 0;
-
     // Called when a bubble wants to hide/destroy itself (e.g. last visible
     // child view was closed).
     virtual void HideBubble(const TrayBubbleView* bubble_view) = 0;
@@ -79,23 +71,22 @@
   };
 
   struct VIEWS_EXPORT InitParams {
-    InitParams(AnchorAlignment anchor_alignment, int min_width, int max_width);
+    InitParams();
     InitParams(const InitParams& other);
-    AnchorAlignment anchor_alignment;
-    int min_width;
-    int max_width;
-    int max_height;
-    bool can_activate;
-    bool close_on_deactivate;
+    Delegate* delegate = nullptr;
+    gfx::NativeWindow parent_window = nullptr;
+    View* anchor_view = nullptr;
+    AnchorAlignment anchor_alignment = ANCHOR_ALIGNMENT_BOTTOM;
+    int min_width = 0;
+    int max_width = 0;
+    int max_height = 0;
+    bool can_activate = false;
+    bool close_on_deactivate = true;
     // If not provided, the bg color will be derived from the NativeTheme.
     base::Optional<SkColor> bg_color;
   };
 
-  // Constructs and returns a TrayBubbleView. |init_params| may be modified.
-  static TrayBubbleView* Create(views::View* anchor,
-                                Delegate* delegate,
-                                InitParams* init_params);
-
+  explicit TrayBubbleView(const InitParams& init_params);
   ~TrayBubbleView() override;
 
   // Returns whether a tray bubble is active.
@@ -152,10 +143,6 @@
   void MouseMovedOutOfHost() override;
 
  protected:
-  TrayBubbleView(views::View* anchor,
-                 Delegate* delegate,
-                 const InitParams& init_params);
-
   // Overridden from views::BubbleDialogDelegateView.
   int GetDialogButtons() const override;
 
diff --git a/ui/views/controls/button/checkbox.cc b/ui/views/controls/button/checkbox.cc
index eaf1a86..52a5d69 100644
--- a/ui/views/controls/button/checkbox.cc
+++ b/ui/views/controls/button/checkbox.cc
@@ -160,6 +160,12 @@
     UpdateImage();
 }
 
+std::unique_ptr<InkDrop> Checkbox::CreateInkDrop() {
+  std::unique_ptr<InkDrop> ink_drop = LabelButton::CreateInkDrop();
+  ink_drop->SetShowHighlightOnHover(false);
+  return ink_drop;
+}
+
 std::unique_ptr<InkDropRipple> Checkbox::CreateInkDropRipple() const {
   // The "small" size is 21dp, the large size is 1.33 * 21dp = 28dp.
   const gfx::Size size(21, 21);
@@ -170,11 +176,6 @@
   return ripple;
 }
 
-std::unique_ptr<views::InkDropHighlight> Checkbox::CreateInkDropHighlight()
-    const {
-  return nullptr;
-}
-
 SkColor Checkbox::GetInkDropBaseColor() const {
   return GetNativeTheme()->GetSystemColor(
       ui::NativeTheme::kColorId_ButtonEnabledColor);
diff --git a/ui/views/controls/button/checkbox.h b/ui/views/controls/button/checkbox.h
index 4a965ac..e45ea53a 100644
--- a/ui/views/controls/button/checkbox.h
+++ b/ui/views/controls/button/checkbox.h
@@ -47,8 +47,8 @@
   void OnFocus() override;
   void OnBlur() override;
   void OnNativeThemeChanged(const ui::NativeTheme* theme) override;
+  std::unique_ptr<InkDrop> CreateInkDrop() override;
   std::unique_ptr<InkDropRipple> CreateInkDropRipple() const override;
-  std::unique_ptr<InkDropHighlight> CreateInkDropHighlight() const override;
   SkColor GetInkDropBaseColor() const override;
   gfx::ImageSkia GetImage(ButtonState for_state) const override;