diff --git a/DEPS b/DEPS
index c08423d..8f22ef7 100644
--- a/DEPS
+++ b/DEPS
@@ -39,11 +39,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': '43f610f693d6d5db115d68ecde8e3fd52e725c6a',
+  'skia_revision': 'fbd87d611a16d6e1397226d1c8418c810c76b598',
   # 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': 'b6e94609f69820b8eb5737555770da4b9c939a42',
+  'v8_revision': '0a4246b40ef3c36b6980507ba0381cfef697100c',
   # 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.
@@ -55,11 +55,11 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling build tools
   # and whatever else without interference from each other.
-  'buildtools_revision': 'c2f259809d5ede3275df5ea0842f0431990c4f98',
+  'buildtools_revision': '4a95614772d9bcbd8bc197e1d9bd034e088fc740',
   # 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': '34bb6c58fe60206a08dc0a1f37b7cfe83e8c762c',
+  'pdfium_revision': '211cab5b58151f09fbeafe2b18da77b63664c39d',
   # 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.
@@ -127,7 +127,7 @@
    Var('chromium_git') + '/external/colorama.git' + '@' + '799604a1041e9b3bc5d2789ecbd7e8db2e18e6b8',
 
   'src/third_party/crashpad/crashpad':
-   Var('chromium_git') + '/crashpad/crashpad.git' + '@' + '6c0d42ce9dee55eaa906865191e28df35b32910d',
+   Var('chromium_git') + '/crashpad/crashpad.git' + '@' + '97b0f86d0ccb095391ca64b3948f0d6c02975ac1',
 
   'src/third_party/icu':
    Var('chromium_git') + '/chromium/deps/icu.git' + '@' + '42c58d4e49f2250039f0e98d43e0b76e8f5ca024',
@@ -190,10 +190,10 @@
    Var('chromium_git') + '/webm/libvpx.git' + '@' +  'eba14ddbe7e7b69803dab770ba25ae2ba75c65e2',
 
   'src/third_party/ffmpeg':
-   Var('chromium_git') + '/chromium/third_party/ffmpeg.git' + '@' + 'd2733b2c43f65f0e779d5d014777fb8ea1e89873',
+   Var('chromium_git') + '/chromium/third_party/ffmpeg.git' + '@' + 'b1b22ffc6a5c809c41cc27910e3e8b479c15d3a2',
 
   'src/third_party/libjingle/source/talk':
-    Var('chromium_git') + '/external/webrtc/trunk/talk.git' + '@' + '1da435bae87437b4dcfdb9e13e59615ed2cadad5', # commit position 10491
+    Var('chromium_git') + '/external/webrtc/trunk/talk.git' + '@' + '38c50da122a671f174cb4f1f41ec7ed4c9af048c', # commit position 10588
 
   'src/third_party/usrsctp/usrsctplib':
     Var('chromium_git') + '/external/usrsctplib.git' + '@' + '36444a999739e9e408f8f587cb4c3ffeef2e50ac', # from svn revision 9215
@@ -217,7 +217,7 @@
    Var('chromium_git') + '/native_client/src/third_party/scons-2.0.1.git' + '@' + '1c1550e17fc26355d08627fbdec13d8291227067',
 
   'src/third_party/webrtc':
-    Var('chromium_git') + '/external/webrtc/trunk/webrtc.git' + '@' + '7ad9e661f8a035d49d049ccdb87c77ae8ecdfa35', # commit position 10537
+    Var('chromium_git') + '/external/webrtc/trunk/webrtc.git' + '@' + 'ca8da3c95807a2fffb3eb3acde59ff095e89516f', # commit position 10588
 
   'src/third_party/openmax_dl':
     Var('chromium_git') + '/external/webrtc/deps/third_party/openmax.git' + '@' +  Var('openmax_dl_revision'),
@@ -226,7 +226,7 @@
     Var('chromium_git') + '/external/github.com/open-source-parsers/jsoncpp.git' + '@' + 'f572e8e42e22cfcf5ab0aea26574f408943edfa4', # from svn 248
 
   'src/third_party/libyuv':
-    Var('chromium_git') + '/libyuv/libyuv.git' + '@' + '98eb102bead73b6fd16a11c0fa7bdc85be69246f', # from version 1533
+    Var('chromium_git') + '/libyuv/libyuv.git' + '@' + '6100f50f136829b9769baf79306b31e0665ec16a', # from version 1536
 
   'src/third_party/smhasher/src':
     Var('chromium_git') + '/external/smhasher.git' + '@' + 'e87738e57558e0ec472b2fc3a643b838e5b6e88f',
diff --git a/PRESUBMIT.py b/PRESUBMIT.py
index 293d9dd3..23594dd 100644
--- a/PRESUBMIT.py
+++ b/PRESUBMIT.py
@@ -274,7 +274,6 @@
 _VALID_OS_MACROS = (
     # Please keep sorted.
     'OS_ANDROID',
-    'OS_ANDROID_HOST',
     'OS_BSD',
     'OS_CAT',       # For testing.
     'OS_CHROMEOS',
diff --git a/android_webview/native/aw_autofill_client.cc b/android_webview/native/aw_autofill_client.cc
index 2ac1b40..2b2c2667 100644
--- a/android_webview/native/aw_autofill_client.cc
+++ b/android_webview/native/aw_autofill_client.cc
@@ -217,12 +217,23 @@
   NOTIMPLEMENTED();
 }
 
-void AwAutofillClient::OnUnmaskVerificationResult(GetRealPanResult result) {
+void AwAutofillClient::OnUnmaskVerificationResult(PaymentsRpcResult result) {
   NOTIMPLEMENTED();
 }
 
-void AwAutofillClient::ConfirmSaveCreditCard(
-    const base::Closure& save_card_callback) {
+void AwAutofillClient::ConfirmSaveCreditCardLocally(
+    const base::Closure& callback) {
+  NOTIMPLEMENTED();
+}
+
+void AwAutofillClient::ConfirmSaveCreditCardToCloud(
+    const base::Closure& callback,
+    scoped_ptr<base::DictionaryValue> legal_message) {
+  NOTIMPLEMENTED();
+}
+
+void AwAutofillClient::LoadRiskData(
+    const base::Callback<void(const std::string&)>& callback) {
   NOTIMPLEMENTED();
 }
 
diff --git a/android_webview/native/aw_autofill_client.h b/android_webview/native/aw_autofill_client.h
index a884949..c869ddb 100644
--- a/android_webview/native/aw_autofill_client.h
+++ b/android_webview/native/aw_autofill_client.h
@@ -66,8 +66,13 @@
   void ShowUnmaskPrompt(
       const autofill::CreditCard& card,
       base::WeakPtr<autofill::CardUnmaskDelegate> delegate) override;
-  void OnUnmaskVerificationResult(GetRealPanResult result) override;
-  void ConfirmSaveCreditCard(const base::Closure& save_card_callback) override;
+  void OnUnmaskVerificationResult(PaymentsRpcResult result) override;
+  void ConfirmSaveCreditCardLocally(const base::Closure& callback) override;
+  void ConfirmSaveCreditCardToCloud(
+      const base::Closure& callback,
+      scoped_ptr<base::DictionaryValue> legal_message) override;
+  void LoadRiskData(
+      const base::Callback<void(const std::string&)>& callback) override;
   bool HasCreditCardScanFeature() override;
   void ScanCreditCard(const CreditCardScanCallback& callback) override;
   void ShowRequestAutocompleteDialog(const autofill::FormData& form,
diff --git a/ash/ash_strings.grd b/ash/ash_strings.grd
index 219b3dc..0bec772 100644
--- a/ash/ash_strings.grd
+++ b/ash/ash_strings.grd
@@ -226,10 +226,10 @@
         Cast screen
       </message>
       <message name="IDS_ASH_STATUS_TRAY_CAST_CAST_DESKTOP" desc="The label used in the tray popup to tell the user we are casting the desktop.">
-        Casting screen to $1
+        Casting screen to <ph name="RECEIVER_NAME">$1<ex>Living Room</ex></ph>
       </message>
       <message name="IDS_ASH_STATUS_TRAY_CAST_CAST_TAB" desc="The title label used in the tray popup to tell the user we are casting a tab.">
-        Casting $1 to $2
+        Casting <ph name="TAB_NAME">$1<ex>YouTube</ex></ph> to <ph name="RECEIVER_NAME">$2<ex>Living Room</ex></ph>
       </message>
       <message name="IDS_ASH_STATUS_TRAY_CAST_CAST_UNKNOWN" desc="The label used when we have detected we are casting but do not know what we are casting or who we are casting to.">
         Casting to an unknown receiver
diff --git a/ash/shell/app_list.cc b/ash/shell/app_list.cc
index e0b9fe2..3f4b9aae 100644
--- a/ash/shell/app_list.cc
+++ b/ash/shell/app_list.cc
@@ -335,7 +335,8 @@
     // Nothing needs to be done.
   }
 
-  void ToggleSpeechRecognition() override { NOTIMPLEMENTED(); }
+  void StartSpeechRecognition() override { NOTIMPLEMENTED(); }
+  void StopSpeechRecognition() override { NOTIMPLEMENTED(); }
 
   void ShowForProfileByPath(const base::FilePath& profile_path) override {
     // Nothing needs to be done.
diff --git a/base/base.gypi b/base/base.gypi
index 7e09e306..04fa6c1 100644
--- a/base/base.gypi
+++ b/base/base.gypi
@@ -864,9 +864,6 @@
             ],
           }],
           ['OS == "android" and _toolset == "host" and host_os == "linux"', {
-            'defines': [
-              'OS_ANDROID_HOST=Linux',
-            ],
             'sources/': [
               # Pull in specific files for host builds.
               ['include', '^threading/platform_thread_linux\\.cc$'],
diff --git a/base/logging.cc b/base/logging.cc
index dc0b8b2..650351d 100644
--- a/base/logging.cc
+++ b/base/logging.cc
@@ -16,6 +16,8 @@
 // Windows doesn't define STDERR_FILENO.  Define it here.
 #define STDERR_FILENO 2
 #elif defined(OS_MACOSX)
+#include <asl.h>
+#include <CoreFoundation/CoreFoundation.h>
 #include <mach/mach.h>
 #include <mach/mach_time.h>
 #include <mach-o/dyld.h>
@@ -30,10 +32,12 @@
 
 #if defined(OS_POSIX)
 #include <errno.h>
+#include <paths.h>
 #include <pthread.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <sys/stat.h>
 #include <unistd.h>
 #define MAX_PATH PATH_MAX
 typedef FILE* FileHandle;
@@ -56,6 +60,7 @@
 #include "base/strings/string_piece.h"
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
+#include "base/strings/sys_string_conversions.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/synchronization/lock_impl.h"
 #include "base/threading/platform_thread.h"
@@ -516,6 +521,121 @@
   if ((g_logging_destination & LOG_TO_SYSTEM_DEBUG_LOG) != 0) {
 #if defined(OS_WIN)
     OutputDebugStringA(str_newline.c_str());
+#elif defined(OS_MACOSX)
+    // In LOG_TO_SYSTEM_DEBUG_LOG mode, log messages are always written to
+    // stderr. If stderr is /dev/null, also log via ASL (Apple System Log). If
+    // there's something weird about stderr, assume that log messages are going
+    // nowhere and log via ASL too. Messages logged via ASL show up in
+    // Console.app.
+    //
+    // Programs started by launchd, as UI applications normally are, have had
+    // stderr connected to /dev/null since OS X 10.8. Prior to that, stderr was
+    // a pipe to launchd, which logged what it received (see log_redirect_fd in
+    // 10.7.5 launchd-392.39/launchd/src/launchd_core_logic.c).
+    //
+    // Another alternative would be to determine whether stderr is a pipe to
+    // launchd and avoid logging via ASL only in that case. See 10.7.5
+    // CF-635.21/CFUtilities.c also_do_stderr(). This would result in logging to
+    // both stderr and ASL even in tests, where it's undesirable to log to the
+    // system log at all.
+    //
+    // Note that the ASL client by default discards messages whose levels are
+    // below ASL_LEVEL_NOTICE. It's possible to change that with
+    // asl_set_filter(), but this is pointless because syslogd normally applies
+    // the same filter.
+    const bool log_via_asl = []() {
+      struct stat stderr_stat;
+      if (fstat(fileno(stderr), &stderr_stat) == -1) {
+        return true;
+      }
+      if (!S_ISCHR(stderr_stat.st_mode)) {
+        return false;
+      }
+
+      struct stat dev_null_stat;
+      if (stat(_PATH_DEVNULL, &dev_null_stat) == -1) {
+        return true;
+      }
+
+      return !S_ISCHR(dev_null_stat.st_mode) ||
+             stderr_stat.st_rdev == dev_null_stat.st_rdev;
+    }();
+
+    if (log_via_asl) {
+      // Log roughly the same way that CFLog() and NSLog() would. See 10.10.5
+      // CF-1153.18/CFUtilities.c __CFLogCString().
+      //
+      // The ASL facility is set to the main bundle ID if available. Otherwise,
+      // "com.apple.console" is used.
+      CFBundleRef main_bundle = CFBundleGetMainBundle();
+      CFStringRef main_bundle_id_cf =
+          main_bundle ? CFBundleGetIdentifier(main_bundle) : nullptr;
+      std::string asl_facility =
+          main_bundle_id_cf ? base::SysCFStringRefToUTF8(main_bundle_id_cf)
+                            : std::string("com.apple.console");
+
+      class ASLClient {
+       public:
+        explicit ASLClient(const std::string& asl_facility)
+            : client_(asl_open(nullptr,
+                               asl_facility.c_str(),
+                               ASL_OPT_NO_DELAY)) {}
+        ~ASLClient() { asl_close(client_); }
+
+        aslclient get() const { return client_; }
+
+       private:
+        aslclient client_;
+        DISALLOW_COPY_AND_ASSIGN(ASLClient);
+      } asl_client(asl_facility);
+
+      class ASLMessage {
+       public:
+        ASLMessage() : message_(asl_new(ASL_TYPE_MSG)) {}
+        ~ASLMessage() { asl_free(message_); }
+
+        aslmsg get() const { return message_; }
+
+       private:
+        aslmsg message_;
+        DISALLOW_COPY_AND_ASSIGN(ASLMessage);
+      } asl_message;
+
+      // By default, messages are only readable by the admin group. Explicitly
+      // make them readable by the user generating the messages.
+      char euid_string[12];
+      snprintf(euid_string, arraysize(euid_string), "%d", geteuid());
+      asl_set(asl_message.get(), ASL_KEY_READ_UID, euid_string);
+
+      // Map Chrome log severities to ASL log levels.
+      const char* const asl_level_string = [](LogSeverity severity) {
+        // ASL_LEVEL_* are ints, but ASL needs equivalent strings. This
+        // non-obvious two-step macro trick achieves what's needed.
+        // https://gcc.gnu.org/onlinedocs/cpp/Stringification.html
+#define ASL_LEVEL_STR(level) ASL_LEVEL_STR_X(level)
+#define ASL_LEVEL_STR_X(level) #level
+        switch (severity) {
+          case LOG_INFO:
+            return ASL_LEVEL_STR(ASL_LEVEL_INFO);
+          case LOG_WARNING:
+            return ASL_LEVEL_STR(ASL_LEVEL_WARNING);
+          case LOG_ERROR:
+            return ASL_LEVEL_STR(ASL_LEVEL_ERR);
+          case LOG_FATAL:
+            return ASL_LEVEL_STR(ASL_LEVEL_CRIT);
+          default:
+            return severity < 0 ? ASL_LEVEL_STR(ASL_LEVEL_DEBUG)
+                                : ASL_LEVEL_STR(ASL_LEVEL_NOTICE);
+        }
+#undef ASL_LEVEL_STR
+#undef ASL_LEVEL_STR_X
+      }(severity_);
+      asl_set(asl_message.get(), ASL_KEY_LEVEL, asl_level_string);
+
+      asl_set(asl_message.get(), ASL_KEY_MSG, str_newline.c_str());
+
+      asl_send(asl_client.get(), asl_message.get());
+    }
 #elif defined(OS_ANDROID)
     android_LogPriority priority =
         (severity_ < 0) ? ANDROID_LOG_VERBOSE : ANDROID_LOG_UNKNOWN;
diff --git a/blimp/common/BUILD.gn b/blimp/common/BUILD.gn
index 17e52f7..49afa02 100644
--- a/blimp/common/BUILD.gn
+++ b/blimp/common/BUILD.gn
@@ -20,6 +20,5 @@
     "//skia",
     "//ui/gfx/geometry",
     "//ui/gl",
-    "//ui/native_theme",
   ]
 }
diff --git a/blimp/net/blimp_connection.h b/blimp/net/blimp_connection.h
index 5bd115d6..87abc946 100644
--- a/blimp/net/blimp_connection.h
+++ b/blimp/net/blimp_connection.h
@@ -25,6 +25,8 @@
  private:
   scoped_ptr<PacketReader> reader_;
   scoped_ptr<PacketWriter> writer_;
+
+  DISALLOW_COPY_AND_ASSIGN(BlimpConnection);
 };
 
 }  // namespace blimp
diff --git a/blimp/net/tcp_client_transport.cc b/blimp/net/tcp_client_transport.cc
index 8ac24a8..6bdd18f 100644
--- a/blimp/net/tcp_client_transport.cc
+++ b/blimp/net/tcp_client_transport.cc
@@ -20,36 +20,34 @@
 TCPClientTransport::~TCPClientTransport() {}
 
 int TCPClientTransport::Connect(const net::CompletionCallback& callback) {
-  DCHECK(!connection_);
+  DCHECK(!socket_);
   DCHECK(!callback.is_null());
 
-  scoped_ptr<net::StreamSocket> socket;
-  socket.reset(
+  socket_.reset(
       new net::TCPClientSocket(addresses_, net_log_, net::NetLog::Source()));
   net::CompletionCallback completion_callback = base::Bind(
       &TCPClientTransport::OnTCPConnectComplete, base::Unretained(this));
 
-  int result = socket->Connect(completion_callback);
-  connection_.reset(new StreamSocketConnection(socket.Pass()));
+  int result = socket_->Connect(completion_callback);
   if (result == net::ERR_IO_PENDING) {
     connect_callback_ = callback;
   } else if (result != net::OK) {
-    connection_ = nullptr;
+    socket_ = nullptr;
   }
 
   return result;
 }
 
 scoped_ptr<BlimpConnection> TCPClientTransport::TakeConnection() {
-  DCHECK(connection_);
   DCHECK(connect_callback_.is_null());
-  return connection_.Pass();
+  DCHECK(socket_);
+  return make_scoped_ptr(new StreamSocketConnection(socket_.Pass()));
 }
 
 void TCPClientTransport::OnTCPConnectComplete(int result) {
-  DCHECK(connection_);
+  DCHECK(socket_);
   if (result != net::OK) {
-    connection_ = nullptr;
+    socket_ = nullptr;
   }
   base::ResetAndReturn(&connect_callback_).Run(result);
 }
diff --git a/blimp/net/tcp_client_transport.h b/blimp/net/tcp_client_transport.h
index 77ca287..c5f5c6a 100644
--- a/blimp/net/tcp_client_transport.h
+++ b/blimp/net/tcp_client_transport.h
@@ -14,6 +14,7 @@
 
 namespace net {
 class NetLog;
+class StreamSocket;
 }  // namespace net
 
 namespace blimp {
@@ -36,7 +37,7 @@
 
   net::AddressList addresses_;
   net::NetLog* net_log_;
-  scoped_ptr<BlimpConnection> connection_;
+  scoped_ptr<net::StreamSocket> socket_;
   net::CompletionCallback connect_callback_;
 
   DISALLOW_COPY_AND_ASSIGN(TCPClientTransport);
diff --git a/build/android/lint/suppressions.xml b/build/android/lint/suppressions.xml
index a6cf6fc..61d062d 100644
--- a/build/android/lint/suppressions.xml
+++ b/build/android/lint/suppressions.xml
@@ -108,10 +108,6 @@
     <ignore path="content/shell/android/shell_apk/res/values/strings.xml" />
   </issue>
   <issue id="SignatureOrSystemPermissions" severity="ignore"/>
-  <issue id="TrulyRandom">
-    <!-- TODO(qinmin): address this warning. crbug.com/553698 -->
-    <ignore path="org/chromium/chrome/browser/externalnav/IntentWithGesturesHandler.class"/>
-  </issue>
   <issue id="UnusedAttribute" severity="ignore"/>
   <issue id="ViewConstructor" severity="ignore"/>
   <issue id="WrongCall" severity="ignore"/>
diff --git a/build/config/BUILDCONFIG.gn b/build/config/BUILDCONFIG.gn
index 5c79736..3eed120 100644
--- a/build/config/BUILDCONFIG.gn
+++ b/build/config/BUILDCONFIG.gn
@@ -118,7 +118,7 @@
   is_debug = true
 
   # Whether we're a traditional desktop unix.
-  is_desktop_linux = current_os == "linux" && current_os != "chromeos"
+  is_desktop_linux = current_os == "linux"
 
   # Set to true when compiling with the Clang compiler. Typically this is used
   # to configure warnings.
diff --git a/build/toolchain/gcc_toolchain.gni b/build/toolchain/gcc_toolchain.gni
index d6a9002ea..eb343a1 100644
--- a/build/toolchain/gcc_toolchain.gni
+++ b/build/toolchain/gcc_toolchain.gni
@@ -174,13 +174,16 @@
     lib_switch = "-l"
     lib_dir_switch = "-L"
 
+    # Object files go in this directory.
+    object_subdir = "{{target_out_dir}}/{{label_name}}"
+
     tool("cc") {
       depfile = "{{output}}.d"
       command = "$cc -MMD -MF $depfile ${rebuild_string}{{defines}} {{include_dirs}} {{cflags}} {{cflags_c}} -c {{source}} -o {{output}}"
       depsformat = "gcc"
       description = "CC {{output}}"
       outputs = [
-        "{{target_out_dir}}/{{target_output_name}}/{{source_name_part}}.o",
+        "$object_subdir/{{source_name_part}}.o",
       ]
     }
 
@@ -190,7 +193,7 @@
       depsformat = "gcc"
       description = "CXX {{output}}"
       outputs = [
-        "{{target_out_dir}}/{{target_output_name}}/{{source_name_part}}.o",
+        "$object_subdir/{{source_name_part}}.o",
       ]
     }
 
@@ -201,7 +204,7 @@
       depsformat = "gcc"
       description = "ASM {{output}}"
       outputs = [
-        "{{target_out_dir}}/{{target_output_name}}/{{source_name_part}}.o",
+        "$object_subdir/{{source_name_part}}.o",
       ]
     }
 
diff --git a/build/toolchain/mac/BUILD.gn b/build/toolchain/mac/BUILD.gn
index fea76e1..a64387f 100644
--- a/build/toolchain/mac/BUILD.gn
+++ b/build/toolchain/mac/BUILD.gn
@@ -52,9 +52,7 @@
     # Object files go in this directory. Use label_name instead of
     # target_output_name since labels will generally have no spaces and will be
     # unique in the directory.
-    # TODO(brettw) enable the label_name variant when binary support is rolled in to GN.
-    #object_subdir = "{{target_out_dir}}/{{label_name}}"
-    object_subdir = "{{target_out_dir}}/{{target_output_name}}"
+    object_subdir = "{{target_out_dir}}/{{label_name}}"
 
     tool("cc") {
       depfile = "{{output}}.d"
diff --git a/build/toolchain/win/BUILD.gn b/build/toolchain/win/BUILD.gn
index 4b55052..97dca966 100644
--- a/build/toolchain/win/BUILD.gn
+++ b/build/toolchain/win/BUILD.gn
@@ -2,15 +2,6 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-declare_args() {
-  # Path to the directory containing the VC binaries for the right
-  # combination of host and target architectures. Currently only the
-  # 64-bit host toolchain is supported, with either 32-bit or 64-bit targets.
-  # If vc_bin_dir is not specified on the command line (and it normally
-  # isn't), we will dynamically determine the right value to use at runtime.
-  vc_bin_dir = ""
-}
-
 import("//build/config/win/visual_studio_version.gni")
 import("//build/toolchain/goma.gni")
 import("//build/toolchain/toolchain.gni")
@@ -26,20 +17,6 @@
 gyp_win_tool_path =
     rebase_path("//tools/gyp/pylib/gyp/win_tool.py", root_build_dir)
 
-toolchain_data = exec_script("setup_toolchain.py",
-                             [
-                               visual_studio_path,
-                               gyp_win_tool_path,
-                               windows_sdk_path,
-                               visual_studio_runtime_dirs,
-                               current_cpu,
-                             ],
-                             "scope")
-
-if (vc_bin_dir == "") {
-  vc_bin_dir = toolchain_data.vc_bin_dir
-}
-
 if (use_goma) {
   goma_prefix = "$goma_dir/gomacc.exe "
 } else {
@@ -84,6 +61,9 @@
     lib_switch = ""
     lib_dir_switch = "/LIBPATH:"
 
+    # Object files go in this directory.
+    object_subdir = "{{target_out_dir}}/{{label_name}}"
+
     tool("cc") {
       rspfile = "{{output}}.rsp"
       precompiled_header_type = "msvc"
@@ -92,7 +72,7 @@
       depsformat = "msvc"
       description = "CC {{output}}"
       outputs = [
-        "{{target_out_dir}}/{{target_output_name}}/{{source_name_part}}.obj",
+        "$object_subdir/{{source_name_part}}.obj",
       ]
       rspfile_content = "{{defines}} {{include_dirs}} {{cflags}} {{cflags_c}}"
     }
@@ -107,7 +87,7 @@
       depsformat = "msvc"
       description = "CXX {{output}}"
       outputs = [
-        "{{target_out_dir}}/{{target_output_name}}/{{source_name_part}}.obj",
+        "$object_subdir/{{source_name_part}}.obj",
       ]
       rspfile_content = "{{defines}} {{include_dirs}} {{cflags}} {{cflags_cc}}"
     }
@@ -115,7 +95,7 @@
     tool("rc") {
       command = "$python_path gyp-win-tool rc-wrapper $env rc.exe {{defines}} {{include_dirs}} /fo{{output}} {{source}}"
       outputs = [
-        "{{target_out_dir}}/{{target_output_name}}/{{source_name_part}}.res",
+        "$object_subdir/{{source_name_part}}.res",
       ]
       description = "RC {{output}}"
     }
@@ -129,7 +109,7 @@
       command = "$python_path gyp-win-tool asm-wrapper $env $ml {{defines}} {{include_dirs}} {{asmflags}} /c /Fo{{output}} {{source}}"
       description = "ASM {{output}}"
       outputs = [
-        "{{target_out_dir}}/{{target_output_name}}/{{source_name_part}}.obj",
+        "$object_subdir/{{source_name_part}}.obj",
       ]
     }
 
@@ -244,17 +224,27 @@
   }
 }
 
-# TODO(dpranke): Declare both toolchains all of the time when we
-# get it sorted out how we want to support them both in a single build.
-# Right now only one of these can be enabled at a time because the
-# runtime libraries get copied to root_build_dir and would collide.
-if (current_cpu == "x86") {
+# 32-bit toolchains. Only define these when the target architecture is 32-bit
+# since we don't do any 32-bit cross compiles when targeting 64-bit (the
+# build does generate some 64-bit stuff from 32-bit target builds).
+if (target_cpu == "x86") {
+  x86_toolchain_data = exec_script("setup_toolchain.py",
+                                   [
+                                     visual_studio_path,
+                                     gyp_win_tool_path,
+                                     windows_sdk_path,
+                                     visual_studio_runtime_dirs,
+                                     "x86",
+                                   ],
+                                   "scope")
+
   msvc_toolchain("x86") {
     environment = "environment.x86"
     current_cpu = "x86"
-    cl = "${goma_prefix}\"${vc_bin_dir}/cl.exe\""
+    cl = "${goma_prefix}\"${x86_toolchain_data.vc_bin_dir}/cl.exe\""
     is_clang = false
   }
+
   msvc_toolchain("clang_x86") {
     environment = "environment.x86"
     current_cpu = "x86"
@@ -266,39 +256,56 @@
   }
 }
 
-if (current_cpu == "x64") {
-  msvc_toolchain("x64") {
-    environment = "environment.x64"
-    current_cpu = "x64"
+# 64-bit toolchains.
+x64_toolchain_data = exec_script("setup_toolchain.py",
+                                 [
+                                   visual_studio_path,
+                                   gyp_win_tool_path,
+                                   windows_sdk_path,
+                                   visual_studio_runtime_dirs,
+                                   "x64",
+                                 ],
+                                 "scope")
+
+msvc_toolchain("x64") {
+  environment = "environment.x64"
+  current_cpu = "x64"
+  cl = "${goma_prefix}\"${x64_toolchain_data.vc_bin_dir}/cl.exe\""
+  is_clang = false
+}
+
+msvc_toolchain("clang_x64") {
+  environment = "environment.x64"
+  current_cpu = "x64"
+  prefix = rebase_path("//third_party/llvm-build/Release+Asserts/bin",
+                       root_build_dir)
+  cl = "${goma_prefix}$prefix/clang-cl.exe"
+  current_os = "win"
+  is_clang = true
+}
+
+# WinRT toolchains. Only define these when targeting them.
+#
+# NOTE: This is currently broken because it references vc_bin_dir. brettw@
+# changed this around a bit, and I don't know what this should be set to
+# in terms of what setup_toolchain returns for a certain CPU architecture.
+if (target_os == "winrt_81" || target_os == "winrt_81_phone" ||
+    target_os == "winrt_10") {
+  msvc_toolchain("winrt_x86") {
+    environment = "environment.winrt_x86"
     cl = "${goma_prefix}\"${vc_bin_dir}/cl.exe\""
     is_clang = false
+
+    current_cpu = "x86"
+    current_os = current_os
   }
-  msvc_toolchain("clang_x64") {
-    environment = "environment.x64"
+
+  msvc_toolchain("winrt_x64") {
+    environment = "environment.winrt_x64"
+    cl = "${goma_prefix}\"${vc_bin_dir}/cl.exe\""
+    is_clang = false
+
     current_cpu = "x64"
-    prefix = rebase_path("//third_party/llvm-build/Release+Asserts/bin",
-                         root_build_dir)
-    cl = "${goma_prefix}$prefix/clang-cl.exe"
-    current_os = "win"
-    is_clang = true
+    current_os = current_os
   }
 }
-
-# WinRT toolchains
-msvc_toolchain("winrt_x86") {
-  environment = "environment.winrt_x86"
-  cl = "${goma_prefix}\"${vc_bin_dir}/cl.exe\""
-  is_clang = false
-
-  current_cpu = "x86"
-  current_os = current_os
-}
-
-msvc_toolchain("winrt_x64") {
-  environment = "environment.winrt_x64"
-  cl = "${goma_prefix}\"${vc_bin_dir}/cl.exe\""
-  is_clang = false
-
-  current_cpu = "x64"
-  current_os = current_os
-}
diff --git a/cc/test/test_gpu_memory_buffer_manager.cc b/cc/test/test_gpu_memory_buffer_manager.cc
index ed5e713..af86cbb 100644
--- a/cc/test/test_gpu_memory_buffer_manager.cc
+++ b/cc/test/test_gpu_memory_buffer_manager.cc
@@ -17,16 +17,19 @@
   GpuMemoryBufferImpl(const gfx::Size& size,
                       gfx::BufferFormat format,
                       scoped_ptr<base::SharedMemory> shared_memory,
-                      size_t offset)
+                      size_t offset,
+                      size_t stride)
       : size_(size),
         format_(format),
         shared_memory_(shared_memory.Pass()),
         offset_(offset),
+        stride_(stride),
         mapped_(false) {}
 
   // Overridden from gfx::GpuMemoryBuffer:
   bool Map() override {
     DCHECK(!mapped_);
+    DCHECK_EQ(stride_, gfx::RowSizeForBufferFormat(size_.width(), format_, 0));
     if (!shared_memory_->Map(offset_ +
                              gfx::BufferSizeForBufferFormat(size_, format_)))
       return false;
@@ -60,6 +63,7 @@
     handle.type = gfx::SHARED_MEMORY_BUFFER;
     handle.handle = shared_memory_->handle();
     handle.offset = base::checked_cast<uint32_t>(offset_);
+    handle.stride = base::checked_cast<int32_t>(stride_);
     return handle;
   }
   ClientBuffer AsClientBuffer() override {
@@ -71,6 +75,7 @@
   gfx::BufferFormat format_;
   scoped_ptr<base::SharedMemory> shared_memory_;
   size_t offset_;
+  size_t stride_;
   bool mapped_;
 };
 
@@ -90,8 +95,10 @@
   const size_t buffer_size = gfx::BufferSizeForBufferFormat(size, format);
   if (!shared_memory->CreateAnonymous(buffer_size))
     return nullptr;
-  return make_scoped_ptr<gfx::GpuMemoryBuffer>(
-      new GpuMemoryBufferImpl(size, format, shared_memory.Pass(), 0));
+  return make_scoped_ptr<gfx::GpuMemoryBuffer>(new GpuMemoryBufferImpl(
+      size, format, shared_memory.Pass(), 0,
+      base::checked_cast<int>(
+          gfx::RowSizeForBufferFormat(size.width(), format, 0))));
 }
 
 scoped_ptr<gfx::GpuMemoryBuffer>
@@ -105,7 +112,7 @@
   return make_scoped_ptr<gfx::GpuMemoryBuffer>(new GpuMemoryBufferImpl(
       size, format,
       make_scoped_ptr(new base::SharedMemory(handle.handle, false)),
-      handle.offset));
+      handle.offset, handle.stride));
 }
 
 gfx::GpuMemoryBuffer*
diff --git a/cc/test/test_image_factory.cc b/cc/test/test_image_factory.cc
index 69070e7..79c2e7e 100644
--- a/cc/test/test_image_factory.cc
+++ b/cc/test/test_image_factory.cc
@@ -4,6 +4,7 @@
 
 #include "cc/test/test_image_factory.h"
 
+#include "base/numerics/safe_conversions.h"
 #include "ui/gl/gl_image_shared_memory.h"
 
 namespace cc {
@@ -24,7 +25,8 @@
 
   scoped_refptr<gl::GLImageSharedMemory> image(
       new gl::GLImageSharedMemory(size, internalformat));
-  if (!image->Initialize(handle.handle, handle.id, format, handle.offset))
+  if (!image->Initialize(handle.handle, handle.id, format, handle.offset,
+                         base::checked_cast<size_t>(handle.stride)))
     return nullptr;
 
   return image;
diff --git a/chrome/BUILD.gn b/chrome/BUILD.gn
index 703cb14..104001af 100644
--- a/chrome/BUILD.gn
+++ b/chrome/BUILD.gn
@@ -123,7 +123,7 @@
       deps += [
         ":chrome_dll",
         ":chrome_exe_version",
-        ":image_pre_reader",
+        ":file_pre_reader",
 
         # 'chrome_nacl_win64" TODO(GYP) bug 512869
         # '../win8/delegate_execute/delegate_execute.gyp:*', TODO(GYP) bug 512867
@@ -517,10 +517,10 @@
     output = "$target_gen_dir/other_version.rc"
   }
 
-  source_set("image_pre_reader") {
+  source_set("file_pre_reader") {
     sources = [
-      "app/image_pre_reader_win.cc",
-      "app/image_pre_reader_win.h",
+      "app/file_pre_reader_win.cc",
+      "app/file_pre_reader_win.h",
     ]
     deps = [
       "//base",
diff --git a/chrome/android/java/res/drawable-hdpi/eb_item_more.png b/chrome/android/java/res/drawable-hdpi/eb_item_more.png
deleted file mode 100644
index 0e803870..0000000
--- a/chrome/android/java/res/drawable-hdpi/eb_item_more.png
+++ /dev/null
Binary files differ
diff --git a/chrome/android/java/res/drawable-mdpi/eb_item_more.png b/chrome/android/java/res/drawable-mdpi/eb_item_more.png
deleted file mode 100644
index 980f1682..0000000
--- a/chrome/android/java/res/drawable-mdpi/eb_item_more.png
+++ /dev/null
Binary files differ
diff --git a/chrome/android/java/res/drawable-xhdpi/eb_item_more.png b/chrome/android/java/res/drawable-xhdpi/eb_item_more.png
deleted file mode 100644
index aa2a88a..0000000
--- a/chrome/android/java/res/drawable-xhdpi/eb_item_more.png
+++ /dev/null
Binary files differ
diff --git a/chrome/android/java/res/drawable-xxhdpi/eb_item_more.png b/chrome/android/java/res/drawable-xxhdpi/eb_item_more.png
deleted file mode 100644
index 739e14b4..0000000
--- a/chrome/android/java/res/drawable-xxhdpi/eb_item_more.png
+++ /dev/null
Binary files differ
diff --git a/chrome/android/java/res/drawable-xxxhdpi/eb_item_more.png b/chrome/android/java/res/drawable-xxxhdpi/eb_item_more.png
deleted file mode 100644
index 08a9656..0000000
--- a/chrome/android/java/res/drawable-xxxhdpi/eb_item_more.png
+++ /dev/null
Binary files differ
diff --git a/chrome/android/java/res/layout/eb_row_content.xml b/chrome/android/java/res/layout/eb_row_content.xml
index 82871cd..b973bc9 100644
--- a/chrome/android/java/res/layout/eb_row_content.xml
+++ b/chrome/android/java/res/layout/eb_row_content.xml
@@ -57,7 +57,7 @@
             android:contentDescription="@string/accessibility_enhanced_bookmark_more_info"
             android:paddingEnd="16dp"
             android:paddingStart="16dp"
-            android:src="@drawable/eb_item_more"
+            android:src="@drawable/btn_menu"
             chrome:tint="@color/dark_mode_tint" />
     </LinearLayout>
 
diff --git a/chrome/android/java/res/layout/reader_mode_text_view.xml b/chrome/android/java/res/layout/reader_mode_text_view.xml
new file mode 100644
index 0000000..822e1bd
--- /dev/null
+++ b/chrome/android/java/res/layout/reader_mode_text_view.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright 2015 The Chromium Authors. All rights reserved.
+     Use of this source code is governed by a BSD-style license that can be
+     found in the LICENSE file. -->
+
+<!-- Reader Mode bar text -->
+<FrameLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/reader_mode_text_view"
+    style="@style/ContextualSearchTextViewLayout" >
+    <TextView
+        android:id="@+id/reader_mode_text"
+        android:text="@string/reader_view_text"
+        style="@style/ContextualSearchTextView"
+        android:layout_width="match_parent"
+        android:layout_gravity="bottom"
+        android:background="#FFF"
+        android:layout_marginStart="7dp"
+        android:layout_marginEnd="7dp" />
+</FrameLayout>
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeSwitches.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeSwitches.java
index 8d66589..9bbaf26 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeSwitches.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeSwitches.java
@@ -115,9 +115,6 @@
     public static final String ENABLE_READER_MODE_BUTTON_ANIMATION =
             "enable-dom-distiller-button-animation";
 
-    /** Enable the native app banners. */
-    public static final String ENABLE_APP_INSTALL_ALERTS = "enable-app-install-alerts";
-
     /**
      * Use sandbox Wallet environment for requestAutocomplete.
      * Native switch - autofill::switches::kWalletServiceUseSandbox.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayContentDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayContentDelegate.java
index e2032a76..f19c564b 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayContentDelegate.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayContentDelegate.java
@@ -17,15 +17,17 @@
     /**
      * Called when the panel's ContentViewCore navigates in the main frame.
      * @param url The URL being navigated to.
+     * @param isExternalUrl Whether the URL is different from the initially loaded URL.
      */
-    public void onMainFrameLoadStarted(String url) {}
+    public void onMainFrameLoadStarted(String url, boolean isExternalUrl) {}
 
     /**
      * Called when a page navigation results in an error page.
      * @param url The URL that caused the failure.
-     * @param isFailure If the loaded page is an error page.
+     * @param isExternalUrl Whether the URL is different from the initially loaded URL.
+     * @param isFailure Whether the loaded page is an error page.
      */
-    public void onMainFrameNavigation(String url, boolean isFailure) {}
+    public void onMainFrameNavigation(String url, boolean isExternalUrl, boolean isFailure) {}
 
     /**
      * Called when content started loading in the panel.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanel.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanel.java
index 6cc9cbb..f0e68cf 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanel.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanel.java
@@ -8,6 +8,7 @@
 
 import org.chromium.base.VisibleForTesting;
 import org.chromium.chrome.browser.ChromeActivity;
+import org.chromium.chrome.browser.compositor.bottombar.OverlayPanelManager.PanelPriority;
 import org.chromium.chrome.browser.compositor.bottombar.contextualsearch.ContextualSearchPanelAnimation;
 import org.chromium.chrome.browser.compositor.layouts.LayoutUpdateHost;
 import org.chromium.chrome.browser.compositor.scene_layer.SceneLayer;
@@ -55,7 +56,9 @@
         FLING,
         OPTIN,
         OPTOUT,
-        CLOSE_BUTTON;
+        CLOSE_BUTTON,
+        SUPPRESS,
+        UNSUPPRESS;
     }
 
     /**
@@ -88,6 +91,11 @@
      */
     private OverlayPanelHost mOverlayPanelHost;
 
+    /**
+     * OverlayPanel manager handle for notifications of opening and closing.
+     */
+    protected OverlayPanelManager mPanelManager;
+
     // ============================================================================================
     // Constructor
     // ============================================================================================
@@ -95,10 +103,15 @@
     /**
      * @param context The current Android {@link Context}.
      * @param updateHost The {@link LayoutUpdateHost} used to request updates in the Layout.
+     * @param panelManager The {@link OverlayPanelManager} responsible for showing panels.
      */
-    public OverlayPanel(Context context, LayoutUpdateHost updateHost) {
+    public OverlayPanel(Context context, LayoutUpdateHost updateHost,
+                OverlayPanelManager panelManager) {
         super(context, updateHost);
         mContentFactory = this;
+
+        mPanelManager = panelManager;
+        mPanelManager.registerPanel(this);
     }
 
     /**
@@ -110,6 +123,7 @@
 
     @Override
     protected void onClosed(StateChangeReason reason) {
+        mPanelManager.notifyPanelClosed(this, reason);
         destroy();
     }
 
@@ -144,10 +158,36 @@
     }
 
     /**
+     * Request that this panel be shown.
+     * @param reason The reason the panel is being shown.
+     */
+    public void requestPanelShow(StateChangeReason reason) {
+        if (mPanelManager != null) {
+            mPanelManager.requestPanelShow(this, reason);
+        }
+    }
+
+    @Override
+    public void peekPanel(StateChangeReason reason) {
+        // TODO(mdjones): This is making a protected API public and should be removed. Animation
+        // should only be controlled by the OverlayPanelManager.
+        super.peekPanel(reason);
+    }
+
+    /**
      * @param url The URL that the panel should load.
      */
     public void loadUrlInPanel(String url) {
-        getOverlayPanelContent().loadUrl(url);
+        getOverlayPanelContent().loadUrl(url, true);
+    }
+
+    /**
+     * @param url The URL that the panel should load.
+     * @param shouldLoadImmediately If the URL should be loaded immediately when this method is
+     *                              called.
+     */
+    public void loadUrlInPanel(String url, boolean shouldLoadImmediately) {
+        getOverlayPanelContent().loadUrl(url, shouldLoadImmediately);
     }
 
     /**
@@ -164,6 +204,37 @@
         mActivity = activity;
     }
 
+    /**
+     * Notify the panel's content that it has been touched.
+     */
+    public void notifyPanelTouched() {
+        getOverlayPanelContent().notifyPanelTouched();
+    }
+
+    /**
+     * Acknowledges that there was a touch in the search content view, though no immediate action
+     * needs to be taken. This should be overridden by child classes.
+     * TODO(mdjones): Get a better name for this.
+     */
+    public void onTouchSearchContentViewAck() {
+    }
+
+    /**
+     * Get a panel's display priority. This has a default to MEDIUM and should be overridden by
+     * child classes.
+     * @return The panel's display priority.
+     */
+    public PanelPriority getPriority() {
+        return PanelPriority.MEDIUM;
+    }
+
+    /**
+     * @return True if a panel can be suppressed. This should be overridden by each panel.
+     */
+    public boolean canBeSuppressed() {
+        return false;
+    }
+
     // ============================================================================================
     // Content
     // ============================================================================================
@@ -332,6 +403,16 @@
     public void updateSceneLayer(ResourceManager resourceManager) {
     }
 
+    /**
+     * Determine if using a second layout for showing the overlay panel is possible. This should
+     * be overridden by each panel and returns true by default.
+     * @return True if the layout is supported.
+     * TODO(mdjones): Rename to supportsOverlayPanelLayout once the corresponding class is renamed.
+     */
+    public boolean supportsContextualSearchLayout() {
+        return true;
+    }
+
     // ============================================================================================
     // Generic Event Handling
     // ============================================================================================
@@ -427,6 +508,15 @@
         return false;
     }
 
+    /**
+     * If the panel is intercepting the initial bar swipe event. This should be overridden per
+     * panel.
+     * @return True if the panel intercepted the initial bar swipe.
+     */
+    public boolean onInterceptBarSwipe() {
+        return false;
+    }
+
     // ============================================================================================
     // Gesture Event helpers
     // ============================================================================================
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelContent.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelContent.java
index 23e7907b..4dbf65ad 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelContent.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelContent.java
@@ -4,6 +4,8 @@
 
 package org.chromium.chrome.browser.compositor.bottombar;
 
+import android.text.TextUtils;
+
 import org.chromium.base.VisibleForTesting;
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.chrome.browser.ChromeActivity;
@@ -53,6 +55,11 @@
     private WebContentsObserver mWebContentsObserver;
 
     /**
+     * The URL that was directly loaded using the {@link #loadUrl(String)} method.
+     */
+    private String mLoadedUrl;
+
+    /**
      * Whether the ContentViewCore has started loading a URL.
      */
     private boolean mDidStartLoadingUrl;
@@ -90,6 +97,11 @@
      */
     private OverlayContentProgressObserver mProgressObserver;
 
+    /**
+     * If a URL is set to delayed load (load on user interaction), it will be stored here.
+     */
+    private String mPendingUrl;
+
     // http://crbug.com/522266 : An instance of InterceptNavigationDelegateImpl should be kept in
     // java layer. Otherwise, the instance could be garbage-collected unexpectedly.
     private InterceptNavigationDelegate mInterceptNavigationDelegate;
@@ -205,7 +217,8 @@
                             boolean isMainFrame, String validatedUrl, boolean isErrorPage,
                             boolean isIframeSrcdoc) {
                         if (isMainFrame) {
-                            mContentDelegate.onMainFrameLoadStarted(validatedUrl);
+                            mContentDelegate.onMainFrameLoadStarted(validatedUrl,
+                                    !TextUtils.equals(validatedUrl, mLoadedUrl));
                         }
                     }
 
@@ -215,6 +228,7 @@
                             int httpResultCode) {
                         mIsProcessingPendingNavigation = false;
                         mContentDelegate.onMainFrameNavigation(url,
+                                !TextUtils.equals(url, mLoadedUrl),
                                 isHttpFailureCode(httpResultCode));
                     }
 
@@ -257,13 +271,20 @@
     }
 
     /**
-     * Load a URL, this will trigger creation of a new ContentViewCore.
+     * Load a URL; this will trigger creation of a new ContentViewCore if being loaded immediately,
+     * otherwise one is created when the panel's content becomes visible.
      * @param url The URL that should be loaded.
+     * @param shouldLoadImmediately If a URL should be loaded immediately or wait until visibility
+     *                        changes.
      */
-    public void loadUrl(String url) {
-        createNewContentView();
+    public void loadUrl(String url, boolean shouldLoadImmediately) {
+        mPendingUrl = null;
 
-        if (mContentViewCore != null && mContentViewCore.getWebContents() != null) {
+        if (!shouldLoadImmediately) {
+            mPendingUrl = url;
+        } else {
+            createNewContentView();
+            mLoadedUrl = url;
             mDidStartLoadingUrl = true;
             mIsProcessingPendingNavigation = true;
             mContentViewCore.getWebContents().getNavigationController().loadUrl(
@@ -331,6 +352,11 @@
         mIsContentViewShowing = isVisible;
 
         if (isVisible) {
+            // If the last call to loadUrl was sepcified to be delayed, load it now.
+            if (!TextUtils.isEmpty(mPendingUrl)) {
+                loadUrl(mPendingUrl, false);
+            }
+
             // The CVC is created with the search request, but if none was made we'll need
             // one in order to display an empty panel.
             if (mContentViewCore == null) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelManager.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelManager.java
new file mode 100644
index 0000000..6f04cde62
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelManager.java
@@ -0,0 +1,190 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser.compositor.bottombar;
+
+import android.view.ViewGroup;
+
+import org.chromium.chrome.browser.compositor.bottombar.OverlayPanel.StateChangeReason;
+
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * Used to decide which panel should be showing on screen at any moment.
+ * NOTE(mdjones): Currently only supports two panels.
+ */
+public class OverlayPanelManager {
+
+    /**
+     * Priority of an OverlayPanel; used for deciding which panel will be shown when there are
+     * multiple candidates.
+     */
+    public static enum PanelPriority {
+        LOW,
+        MEDIUM,
+        HIGH;
+    }
+
+    /**
+     * A map of panels that this class is managing.
+     */
+    private final Set<OverlayPanel> mPanelSet;
+
+    /**
+     * The panel that is currently being displayed.
+     */
+    private OverlayPanel mActivePanel;
+
+    /**
+     * If a panel was being shown and another panel with higher priority was requested to show,
+     * the lower priority one is stored here.
+     * TODO(mdjones): This should be a list in the case that there are more than two panels.
+     */
+    private OverlayPanel mSuppressedPanel;
+
+    /**
+     * When a panel is suppressed, this is the panel waiting for the close animation to finish.
+     */
+    private OverlayPanel mPendingPanel;
+
+    /**
+     * When a panel is suppressed, this the reason the pending panel is to be shown.
+     */
+    private StateChangeReason mPendingReason;
+
+    /**
+     * Default constructor.
+     */
+    public OverlayPanelManager() {
+        mPanelSet = new HashSet<>();
+    }
+
+    /**
+     * Request that a panel with the specified ID be shown. This does not necessarily mean the
+     * panel will be shown.
+     * @param panel The panel to show.
+     * @param reason The reason the panel is going to be shown.
+     */
+    public void requestPanelShow(OverlayPanel panel, StateChangeReason reason) {
+        if (panel == null || panel == mActivePanel) return;
+
+        if (mActivePanel == null) {
+            // If no panel is currently showing, simply show the requesting panel.
+            mActivePanel = panel;
+            // TODO(mdjones): peekPanel should not be exposed publicly since the manager
+            // controls if a panel should show or not.
+            mActivePanel.peekPanel(reason);
+
+        } else if (panel.getPriority().ordinal() > mActivePanel.getPriority().ordinal()) {
+            // If a panel with higher priority than the active one requests to be shown, suppress
+            // the active panel and show the requesting one.
+            // NOTE(mdjones): closePanel will trigger notifyPanelClosed.
+            mPendingPanel = panel;
+            mPendingReason = reason;
+            mActivePanel.closePanel(StateChangeReason.SUPPRESS, true);
+
+        } else if (panel.canBeSuppressed()) {
+            // If a panel was showing and the requesting panel has a lower priority, suppress it
+            // if possible.
+            mSuppressedPanel = panel;
+        }
+    }
+
+    /**
+     * Notify the manager that some other object hid the panel.
+     * NOTE(mdjones): It is possible that a panel other than the one currently showing was hidden.
+     * @param panel The panel that was closed.
+     */
+    public void notifyPanelClosed(OverlayPanel panel, StateChangeReason reason) {
+        // TODO(mdjones): Close should behave like "requestShowPanel". The reason it currently does
+        // not is because closing will cancel animation for that panel. This method waits for the
+        // panel's "onClosed" event to fire, thus preserving the animation.
+        if (panel == null) return;
+
+        // If the reason to close was to suppress, only suppress the panel.
+        if (reason == StateChangeReason.SUPPRESS) {
+            if (mActivePanel == panel) {
+                if (mActivePanel.canBeSuppressed()) {
+                    mSuppressedPanel = mActivePanel;
+                }
+                mActivePanel = mPendingPanel;
+                mActivePanel.peekPanel(mPendingReason);
+                mPendingPanel = null;
+                mPendingReason = StateChangeReason.UNKNOWN;
+            }
+        } else {
+            // Normal close panel flow.
+            if (panel == mActivePanel) {
+                mActivePanel = null;
+                if (mSuppressedPanel != null) {
+                    mActivePanel = mSuppressedPanel;
+                    mActivePanel.peekPanel(StateChangeReason.UNSUPPRESS);
+                }
+            }
+            mSuppressedPanel = null;
+        }
+    }
+
+    /**
+     * Get the panel that has been determined to be active.
+     * @return The active OverlayPanel.
+     */
+    public OverlayPanel getActivePanel() {
+        return mActivePanel;
+    }
+
+    /**
+     * Destroy all panels owned by this manager.
+     */
+    public void destroy() {
+        for (OverlayPanel p : mPanelSet) {
+            p.destroy();
+        }
+        mPanelSet.clear();
+        mActivePanel = null;
+        mSuppressedPanel = null;
+    }
+
+    /**
+     * Set the panel host for all OverlayPanels.
+     * @param host The OverlayPanel host.
+     */
+    public void setPanelHost(OverlayPanelHost host) {
+        // TODO(mdjones): Possibly store this for late additions to the panel set.
+        for (OverlayPanel p : mPanelSet) {
+            p.setHost(host);
+        }
+    }
+
+    /**
+     * Set the ViewGroup for all panels.
+     * @param container The ViewGroup objects will be displayed in.
+     */
+    public void setContainerView(ViewGroup container) {
+        for (OverlayPanel p : mPanelSet) {
+            p.setContainerView(container);
+        }
+    }
+
+    /**
+     * Send size change event to all panels.
+     * @param width The new width.
+     * @param height The new height.
+     * @param toolbarVisible True if the toolbar is visible.
+     */
+    public void onSizeChanged(float width, float height, boolean toolbarVisible) {
+        for (OverlayPanel p : mPanelSet) {
+            p.onSizeChanged(width, height, toolbarVisible);
+        }
+    }
+
+    /**
+     * Add a panel to the collection that is managed by this class.
+     * @param panel An OverlayPanel to be managed.
+     */
+    public void registerPanel(OverlayPanel panel) {
+        mPanelSet.add(panel);
+    }
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchInflater.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchInflater.java
index 1f063ebd..5e1e28aa 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchInflater.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchInflater.java
@@ -14,8 +14,9 @@
 
 /**
  * A helper class for inflating Contextual Search Views.
+ * TODO(mdjones): Refactor to OverlayPanelInflater.
  */
-abstract class ContextualSearchInflater extends ViewResourceInflater {
+public abstract class ContextualSearchInflater extends ViewResourceInflater {
 
     /**
      * The panel delegate used to get information about the panel layout.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchPanel.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchPanel.java
index 45c795d..961c20e 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchPanel.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchPanel.java
@@ -12,6 +12,8 @@
 import org.chromium.chrome.browser.compositor.bottombar.OverlayContentProgressObserver;
 import org.chromium.chrome.browser.compositor.bottombar.OverlayPanel;
 import org.chromium.chrome.browser.compositor.bottombar.OverlayPanelContent;
+import org.chromium.chrome.browser.compositor.bottombar.OverlayPanelManager;
+import org.chromium.chrome.browser.compositor.bottombar.OverlayPanelManager.PanelPriority;
 import org.chromium.chrome.browser.compositor.layouts.LayoutUpdateHost;
 import org.chromium.chrome.browser.compositor.scene_layer.ContextualSearchSceneLayer;
 import org.chromium.chrome.browser.compositor.scene_layer.SceneLayer;
@@ -67,9 +69,11 @@
     /**
      * @param context The current Android {@link Context}.
      * @param updateHost The {@link LayoutUpdateHost} used to request updates in the Layout.
+     * @param panelManager The object managing the how different panels are shown.
      */
-    public ContextualSearchPanel(Context context, LayoutUpdateHost updateHost) {
-        super(context, updateHost);
+    public ContextualSearchPanel(Context context, LayoutUpdateHost updateHost,
+                OverlayPanelManager panelManager) {
+        super(context, updateHost, panelManager);
         mSceneLayer = createNewContextualSearchSceneLayer();
         mPanelMetrics = new ContextualSearchPanelMetrics();
     }
@@ -293,6 +297,18 @@
 
     @Override
     public boolean onInterceptBarClick() {
+        return onInterceptOpeningPanel();
+    }
+
+    @Override
+    public boolean onInterceptBarSwipe() {
+        return onInterceptOpeningPanel();
+    }
+
+    /**
+     * @return True if the event on the bar was intercepted.
+     */
+    private boolean onInterceptOpeningPanel() {
         if (mManagementDelegate.isRunningInCompatibilityMode()) {
             mManagementDelegate.openResolvedSearchUrlInNewTab();
             return true;
@@ -301,6 +317,27 @@
     }
 
     // ============================================================================================
+    // Panel base methods
+    // ============================================================================================
+
+    @Override
+    public PanelPriority getPriority() {
+        return PanelPriority.HIGH;
+    }
+
+    @Override
+    public boolean canBeSuppressed() {
+        // The selected text on the page is lost when the panel is closed, thus, this panel cannot
+        // be restored if it is suppressed.
+        return false;
+    }
+
+    @Override
+    public boolean supportsContextualSearchLayout() {
+        return mManagementDelegate != null && !mManagementDelegate.isRunningInCompatibilityMode();
+    }
+
+    // ============================================================================================
     // Animation Handling
     // ============================================================================================
 
@@ -696,25 +733,12 @@
     // Panel Content
     // ============================================================================================
 
-    // TODO(pedrosimonetti): move content code to its own section.
-
-    /**
-     * Acknowledges that there was a touch in the search content view, though no immediate action
-     * needs to be taken.
-     * TODO(mdjones): Get a better name for this.
-     */
+    @Override
     public void onTouchSearchContentViewAck() {
         mHasContentBeenTouched = true;
     }
 
     /**
-     * Notify the panel that it's content has been touched.
-     */
-    public void notifyPanelTouched() {
-        getOverlayPanelContent().notifyPanelTouched();
-    }
-
-    /**
      * Destroy the current content in the panel.
      * NOTE(mdjones): This should not be exposed. The only use is in ContextualSearchManager for a
      * bug related to loading new panel content.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/readermode/ReaderModeBarControl.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/readermode/ReaderModeBarControl.java
new file mode 100644
index 0000000..4d61e4b7
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/readermode/ReaderModeBarControl.java
@@ -0,0 +1,58 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser.compositor.bottombar.readermode;
+
+import android.content.Context;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+import org.chromium.chrome.R;
+import org.chromium.chrome.browser.compositor.bottombar.OverlayPanel;
+import org.chromium.chrome.browser.compositor.bottombar.contextualsearch.ContextualSearchInflater;
+import org.chromium.ui.resources.dynamics.DynamicResourceLoader;
+
+/**
+ * Controls the Search Term View that is used as a dynamic resource.
+ */
+public class ReaderModeBarControl extends ContextualSearchInflater {
+    /**
+     * The search term View.
+     */
+    private TextView mReaderText;
+
+    /**
+     * @param panel             The panel.
+     * @param context           The Android Context used to inflate the View.
+     * @param container         The container View used to inflate the View.
+     * @param resourceLoader    The resource loader that will handle the snapshot capturing.
+     */
+    public ReaderModeBarControl(OverlayPanel panel,
+                                  Context context,
+                                  ViewGroup container,
+                                  DynamicResourceLoader resourceLoader) {
+        super(panel, R.layout.reader_mode_text_view, R.id.reader_mode_text_view,
+                context, container, resourceLoader);
+        invalidate();
+    }
+
+    /**
+     * Set the text in the reader mode panel.
+     * @param stringId The resource ID of the string to set the text to.
+     */
+    public void setBarText(int stringId) {
+        inflate();
+        mReaderText.setText(stringId);
+        invalidate();
+    }
+
+    @Override
+    protected void onFinishInflate() {
+        super.onFinishInflate();
+
+        View view = getView();
+        mReaderText = (TextView) view.findViewById(R.id.reader_mode_text);
+    }
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/ContextualSearchSupportedLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/ContextualSearchSupportedLayout.java
index 8071843..906b7a1 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/ContextualSearchSupportedLayout.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/ContextualSearchSupportedLayout.java
@@ -12,6 +12,7 @@
 import org.chromium.chrome.browser.compositor.LayerTitleCache;
 import org.chromium.chrome.browser.compositor.bottombar.OverlayPanel;
 import org.chromium.chrome.browser.compositor.bottombar.OverlayPanelHost;
+import org.chromium.chrome.browser.compositor.bottombar.OverlayPanelManager;
 import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager;
 import org.chromium.chrome.browser.compositor.layouts.eventfilter.EventFilter;
 import org.chromium.chrome.browser.compositor.scene_layer.SceneLayer;
@@ -34,9 +35,9 @@
     protected final OverlayPanelHost mOverlayPanelHost;
 
     /**
-     * The {@link OverlayPanel} that represents the Contextual Search UI.
+     * The {@link OverlayPanelManager} used to get the active panel.
      */
-    protected final OverlayPanel mSearchPanel;
+    protected final OverlayPanelManager mPanelManager;
 
     /**
      * Size of half pixel in dps.
@@ -48,10 +49,11 @@
      * @param updateHost The {@link LayoutUpdateHost} view for this layout.
      * @param renderHost The {@link LayoutRenderHost} view for this layout.
      * @param eventFilter The {@link EventFilter} that is needed for this view.
-     * @param panel The {@link OverlayPanel} that represents the Contextual Search UI.
+     * @param panelManager The {@link OverlayPanelManager} responsible for showing panels.
      */
     public ContextualSearchSupportedLayout(Context context, LayoutUpdateHost updateHost,
-            LayoutRenderHost renderHost, EventFilter eventFilter, OverlayPanel panel) {
+            LayoutRenderHost renderHost, EventFilter eventFilter,
+            OverlayPanelManager panelManager) {
         super(context, updateHost, renderHost, eventFilter);
 
         mOverlayPanelHost = new OverlayPanelHost() {
@@ -61,22 +63,23 @@
             }
         };
 
-        mSearchPanel = panel;
+        mPanelManager = panelManager;
         float dpToPx = context.getResources().getDisplayMetrics().density;
         mHalfPixelDp = 0.5f / dpToPx;
     }
 
     @Override
     public void attachViews(ViewGroup container) {
-        mSearchPanel.setContainerView(container);
+        mPanelManager.setContainerView(container);
     }
 
     @Override
     public void getAllViews(List<View> views) {
         // TODO(dtrainor): If we move ContextualSearch to an overlay, pull the views from there
         // instead in Layout.java.
-        if (mSearchPanel != null) {
-            ContentViewCore content = mSearchPanel.getContentViewCore();
+        OverlayPanel panel = mPanelManager.getActivePanel();
+        if (panel != null) {
+            ContentViewCore content = panel.getContentViewCore();
             if (content != null) views.add(content.getContainerView());
         }
         super.getAllViews(views);
@@ -86,9 +89,9 @@
     public void getAllContentViewCores(List<ContentViewCore> contents) {
         // TODO(dtrainor): If we move ContextualSearch to an overlay, pull the content from there
         // instead in Layout.java.
-        if (mSearchPanel != null) {
-            ContentViewCore content =
-                    mSearchPanel.getContentViewCore();
+        OverlayPanel panel = mPanelManager.getActivePanel();
+        if (panel != null) {
+            ContentViewCore content = panel.getContentViewCore();
             if (content != null) contents.add(content);
         }
         super.getAllContentViewCores(contents);
@@ -96,7 +99,7 @@
 
     @Override
     public void show(long time, boolean animate) {
-        mSearchPanel.setHost(mOverlayPanelHost);
+        mPanelManager.setPanelHost(mOverlayPanelHost);
         super.show(time, animate);
     }
 
@@ -117,19 +120,23 @@
         // visible. For this reason, we're comparing to see if the difference between them
         // is less than half pixel. If so, it means the Toolbar is visible.
         final boolean isToolbarVisible = getHeight() - getHeightMinusTopControls() <= mHalfPixelDp;
-        mSearchPanel.onSizeChanged(width, height, isToolbarVisible);
+
+        mPanelManager.onSizeChanged(width, height, isToolbarVisible);
     }
 
     @Override
     protected boolean onUpdateAnimation(long time, boolean jumpToEnd) {
         boolean parentAnimating = super.onUpdateAnimation(time, jumpToEnd);
-        boolean panelAnimating = mSearchPanel.onUpdateAnimation(time, jumpToEnd);
+        OverlayPanel panel = mPanelManager.getActivePanel();
+        boolean panelAnimating = panel != null && panel.onUpdateAnimation(time, jumpToEnd);
         return panelAnimating || parentAnimating;
     }
 
     @Override
     protected SceneLayer getSceneLayer() {
-        return mSearchPanel.getSceneLayer();
+        OverlayPanel panel = mPanelManager.getActivePanel();
+        if (panel == null) return null;
+        return panel.getSceneLayer();
     }
 
     @Override
@@ -138,8 +145,9 @@
             ResourceManager resourceManager, ChromeFullscreenManager fullscreenManager) {
         super.updateSceneLayer(viewport, contentViewport, layerTitleCache, tabContentManager,
                 resourceManager, fullscreenManager);
-        if (!mSearchPanel.isShowing()) return;
+        OverlayPanel panel = mPanelManager.getActivePanel();
+        if (panel == null || !panel.isShowing()) return;
 
-        mSearchPanel.updateSceneLayer(resourceManager);
+        panel.updateSceneLayer(resourceManager);
     }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerDocument.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerDocument.java
index c65a3d1..b3ed7ec 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerDocument.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerDocument.java
@@ -14,7 +14,9 @@
 
 import org.chromium.chrome.browser.ChromeApplication;
 import org.chromium.chrome.browser.UrlConstants;
+import org.chromium.chrome.browser.compositor.bottombar.OverlayPanel;
 import org.chromium.chrome.browser.compositor.bottombar.OverlayPanelContentViewDelegate;
+import org.chromium.chrome.browser.compositor.bottombar.OverlayPanelManager;
 import org.chromium.chrome.browser.compositor.bottombar.contextualsearch.ContextualSearchPanel;
 import org.chromium.chrome.browser.compositor.layouts.components.LayoutTab;
 import org.chromium.chrome.browser.compositor.layouts.components.VirtualView;
@@ -74,12 +76,13 @@
     // Event Filter Handlers
     /** A {@link GestureHandler} that will delegate all events to {@link #getActiveLayout()}. */
     protected final GestureHandler mGestureHandler;
-    private final EdgeSwipeHandler mContextualSearchEdgeSwipeHandler;
+    private final EdgeSwipeHandler mOverlayPanelEdgeSwipeHandler;
     private final EdgeSwipeHandler mReaderModeEdgeSwipeHandler;
 
     // Internal State
     private final SparseArray<LayoutTab> mTabCache = new SparseArray<LayoutTab>();
     private final ContextualSearchPanel mContextualSearchPanel;
+    private final OverlayPanelManager mOverlayPanelManager;
     /** A delegate for interacting with the Contextual Search manager. */
     protected ContextualSearchManagementDelegate mContextualSearchDelegate;
 
@@ -95,7 +98,8 @@
         Context context = host.getContext();
         LayoutRenderHost renderHost = host.getLayoutRenderHost();
 
-        mContextualSearchPanel = new ContextualSearchPanel(context, this);
+        mOverlayPanelManager = new OverlayPanelManager();
+        mContextualSearchPanel = new ContextualSearchPanel(context, this, mOverlayPanelManager);
 
         mReaderModePanelSelector = new ReaderModePanelSelector() {
             @Override
@@ -109,7 +113,7 @@
         };
 
         // Build Event Filter Handlers
-        mContextualSearchEdgeSwipeHandler = new ContextualSearchEdgeSwipeHandler(this);
+        mOverlayPanelEdgeSwipeHandler = new OverlayPanelEdgeSwipeHandler(this);
         mReaderModeEdgeSwipeHandler = new ReaderModeEdgeSwipeHandler(
                 mReaderModePanelSelector, this);
         mGestureHandler = new GestureHandlerLayoutDelegate(this);
@@ -119,9 +123,9 @@
         mStaticEdgeEventFilter =
                 new EdgeSwipeEventFilter(context, this, new StaticEdgeSwipeHandler());
         mContextualSearchEventFilter = new ContextualSearchEventFilter(
-                context, this, mGestureHandler, mContextualSearchPanel);
+                context, this, mGestureHandler, mOverlayPanelManager);
         EventFilter contextualSearchStaticEventFilter = new ContextualSearchStaticEventFilter(
-                context, this, mContextualSearchPanel, mContextualSearchEdgeSwipeHandler, this);
+                context, this, mOverlayPanelManager, mOverlayPanelEdgeSwipeHandler, this);
         EventFilter readerModeStaticEventFilter = new ReaderModeStaticEventFilter(
                 context, this, mReaderModePanelSelector, mReaderModeEdgeSwipeHandler, this);
         EventFilter staticCascadeEventFilter = new CascadeEventFilter(context, this,
@@ -130,9 +134,9 @@
 
         // Build Layouts
         mStaticLayout = new StaticLayout(
-                context, this, renderHost, staticCascadeEventFilter, mContextualSearchPanel);
+                context, this, renderHost, staticCascadeEventFilter, mOverlayPanelManager);
         mContextualSearchLayout = new ContextualSearchLayout(
-                context, this, renderHost, mContextualSearchEventFilter, mContextualSearchPanel);
+                context, this, renderHost, mContextualSearchEventFilter, mOverlayPanelManager);
 
         // Set up layout parameters
         mStaticLayout.setLayoutHandlesTabLifecycles(true);
@@ -191,7 +195,7 @@
 
         if (mStaticLayout != null) mStaticLayout.destroy();
         if (mContextualSearchLayout != null) mContextualSearchLayout.destroy();
-        if (mContextualSearchPanel != null) mContextualSearchPanel.destroy();
+        if (mOverlayPanelManager != null) mOverlayPanelManager.destroy();
         if (mTabModelSelectorTabObserver != null) mTabModelSelectorTabObserver.destroy();
     }
 
@@ -314,7 +318,8 @@
     @Override
     public void handleTapContextualSearchBar(long time, float x, float y) {
         if (getActiveLayout() == mContextualSearchLayout) return;
-        if (mContextualSearchDelegate == null) return;
+
+        OverlayPanel panel = mOverlayPanelManager.getActivePanel();
 
         // When not in compatibility mode, tapping on the Search Bar will expand the Panel,
         // therefore we must start showing the ContextualSearchLayout.
@@ -323,11 +328,11 @@
         // ContextualSearchLayout. Coordinate with dtrainor@ to solve this. It might be
         // necessary for the ContextualSearchPanel to be able to trigger the display of the
         // ContextualSearchLayout.
-        if (!mContextualSearchDelegate.isRunningInCompatibilityMode()) {
+        if (panel != null && panel.supportsContextualSearchLayout()) {
             showContextualSearchLayout(true);
         }
 
-        mContextualSearchPanel.handleClick(time, x, y);
+        mOverlayPanelManager.getActivePanel().handleClick(time, x, y);
     }
 
     @Override
@@ -360,35 +365,28 @@
         }
     }
 
-    private class ContextualSearchEdgeSwipeHandler extends EdgeSwipeHandlerLayoutDelegate {
-        public ContextualSearchEdgeSwipeHandler(LayoutProvider provider) {
+    private class OverlayPanelEdgeSwipeHandler extends EdgeSwipeHandlerLayoutDelegate {
+        public OverlayPanelEdgeSwipeHandler(LayoutProvider provider) {
             super(provider);
         }
 
         @Override
         public void swipeStarted(ScrollDirection direction, float x, float y) {
-            if (isCompatabilityMode()) {
-                mContextualSearchDelegate.openResolvedSearchUrlInNewTab();
-                return;
-            }
-
-            if (getActiveLayout() != mContextualSearchLayout) {
+            OverlayPanel panel = mOverlayPanelManager.getActivePanel();
+            if (getActiveLayout() != mContextualSearchLayout && panel != null
+                    && panel.supportsContextualSearchLayout()) {
                 showContextualSearchLayout(false);
             }
 
-            super.swipeStarted(direction, x, y);
+            if (panel != null && !panel.onInterceptBarSwipe()) {
+                super.swipeStarted(direction, x, y);
+            }
         }
 
         @Override
         public boolean isSwipeEnabled(ScrollDirection direction) {
-            return direction == ScrollDirection.UP
-                    && mContextualSearchDelegate != null
-                    && mContextualSearchDelegate.isShowingSearchPanel();
-        }
-
-        private boolean isCompatabilityMode() {
-            return mContextualSearchDelegate != null
-                    && mContextualSearchDelegate.isRunningInCompatibilityMode();
+            OverlayPanel panel = mOverlayPanelManager.getActivePanel();
+            return direction == ScrollDirection.UP && panel != null && panel.isShowing();
         }
     }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/StaticLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/StaticLayout.java
index dd3c329..91ba105 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/StaticLayout.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/StaticLayout.java
@@ -10,7 +10,8 @@
 
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.compositor.LayerTitleCache;
-import org.chromium.chrome.browser.compositor.bottombar.contextualsearch.ContextualSearchPanel;
+import org.chromium.chrome.browser.compositor.bottombar.OverlayPanel;
+import org.chromium.chrome.browser.compositor.bottombar.OverlayPanelManager;
 import org.chromium.chrome.browser.compositor.layouts.components.LayoutTab;
 import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager;
 import org.chromium.chrome.browser.compositor.layouts.eventfilter.EventFilter;
@@ -67,10 +68,11 @@
      * @param updateHost          The {@link LayoutUpdateHost} view for this layout.
      * @param renderHost          The {@link LayoutRenderHost} view for this layout.
      * @param eventFilter         The {@link EventFilter} that is needed for this view.
+     * @param panelManager        The {@link OverlayPanelManager} responsible for showing panels.
      */
     public StaticLayout(Context context, LayoutUpdateHost updateHost, LayoutRenderHost renderHost,
-            EventFilter eventFilter, ContextualSearchPanel panel) {
-        super(context, updateHost, renderHost, eventFilter, panel);
+            EventFilter eventFilter, OverlayPanelManager panelManager) {
+        super(context, updateHost, renderHost, eventFilter, panelManager);
 
         mHandler = new Handler();
         mUnstallRunnable = new UnstallRunnable();
@@ -302,7 +304,8 @@
 
         // TODO(pedrosimonetti): Coordinate w/ dtrainor@ to improve integration with TreeProvider.
         SceneLayer overlayLayer = null;
-        if (mSearchPanel.isShowing()) {
+        OverlayPanel panel = mPanelManager.getActivePanel();
+        if (panel != null && panel.isShowing()) {
             overlayLayer = super.getSceneLayer();
         } else if (mReaderModePanel != null && mReaderModePanel.isShowing()) {
             mReaderModePanel.updateSceneLayer(resourceManager);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/eventfilter/ContextualSearchEventFilter.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/eventfilter/ContextualSearchEventFilter.java
index 504006e6..18fceee 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/eventfilter/ContextualSearchEventFilter.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/eventfilter/ContextualSearchEventFilter.java
@@ -10,7 +10,8 @@
 import android.view.ViewConfiguration;
 
 import org.chromium.base.VisibleForTesting;
-import org.chromium.chrome.browser.compositor.bottombar.contextualsearch.ContextualSearchPanel;
+import org.chromium.chrome.browser.compositor.bottombar.OverlayPanel;
+import org.chromium.chrome.browser.compositor.bottombar.OverlayPanelManager;
 
 import java.util.ArrayList;
 
@@ -46,9 +47,9 @@
     private static final float VERTICAL_DETERMINATION_BOOST = 1.25f;
 
     /**
-     * The shared state of the UI.
+     * Manager to get the active OverlayPanel from.
      */
-    private ContextualSearchPanel mSearchPanel;
+    private OverlayPanelManager mPanelManager;
 
     /**
      * The {@link GestureDetector} used to distinguish tap and scroll gestures.
@@ -135,13 +136,17 @@
 
     /**
      * Creates a {@link GestureEventFilter} with offset touch events.
+     * @param context The {@link Context} for Android.
+     * @param host The {@link EventFilterHost} for this event filter.
+     * @param handler The {@link GestureHandler} for this event filter.
+     * @param panelManager The {@link OverlayPanelManager} responsible for showing panels.
      */
     public ContextualSearchEventFilter(Context context, EventFilterHost host,
-            GestureHandler handler, ContextualSearchPanel contextualSearchPanel) {
+            GestureHandler handler, OverlayPanelManager panelManager) {
         super(context, host, handler, false, false);
 
         mGestureDetector = new GestureDetector(context, new InternalGestureDetector());
-        mSearchPanel = contextualSearchPanel;
+        mPanelManager = panelManager;
 
         // Store the square of the platform touch slop in pixels to use in the scroll detection.
         // See {@link ContextualSearchEventFilter#isDistanceGreaterThanTouchSlop}.
@@ -158,7 +163,10 @@
      */
     @VisibleForTesting
     protected float getSearchContentViewVerticalScroll() {
-        return mSearchPanel.getContentVerticalScroll();
+        OverlayPanel panel = mPanelManager.getActivePanel();
+        if (panel == null) return 0;
+
+        return panel.getContentVerticalScroll();
     }
 
     @Override
@@ -167,7 +175,8 @@
 
         if (!mIsDeterminingEventTarget && action == MotionEvent.ACTION_DOWN) {
             mInitialEventY = e.getY();
-            if (mSearchPanel.isCoordinateInsideContent(
+            OverlayPanel panel = mPanelManager.getActivePanel();
+            if (panel != null && panel.isCoordinateInsideContent(
                     e.getX() * mPxToDp, mInitialEventY * mPxToDp)) {
                 // If the DOWN event happened inside the Search Content View, we'll need
                 // to wait until the user has moved the finger beyond a certain threshold,
@@ -237,6 +246,9 @@
      * @param e The {@link MotionEvent} to be propagated after resuming the pending events.
      */
     private void resumeAndPropagateEvent(MotionEvent e) {
+        OverlayPanel panel = mPanelManager.getActivePanel();
+        if (panel == null) return;
+
         if (mIsRecordingEvents) {
             resumeRecordedEvents();
         }
@@ -255,8 +267,7 @@
             // happening. See {@link ContextualSearchEventFilter#propagateEventToSearchContentView}.
             mWasActionDownEventSynthetic = true;
             mSyntheticActionDownX = syntheticActionDownEvent.getX();
-            mSyntheticActionDownY = syntheticActionDownEvent.getY()
-                    - mSearchPanel.getContentY() / mPxToDp;
+            mSyntheticActionDownY = syntheticActionDownEvent.getY() - panel.getContentY() / mPxToDp;
 
             propagateAndRecycleEvent(syntheticActionDownEvent, mEventTarget);
 
@@ -312,11 +323,13 @@
      */
     @VisibleForTesting
     protected void propagateEventToSearchContentView(MotionEvent e) {
+        OverlayPanel panel = mPanelManager.getActivePanel();
+        if (panel == null) return;
+
         MotionEvent event = e;
         int action = event.getActionMasked();
         boolean isSyntheticEvent = false;
-        if (mGestureOrientation == GestureOrientation.HORIZONTAL
-                && !mSearchPanel.isMaximized()) {
+        if (mGestureOrientation == GestureOrientation.HORIZONTAL && !panel.isMaximized()) {
             // Ignores multitouch events to prevent the Search Result Page from from scrolling.
             if (action == MotionEvent.ACTION_POINTER_UP
                     || action == MotionEvent.ACTION_POINTER_DOWN) {
@@ -344,8 +357,8 @@
             isSyntheticEvent = true;
         }
 
-        final float contentViewOffsetXPx = mSearchPanel.getContentX() / mPxToDp;
-        final float contentViewOffsetYPx = mSearchPanel.getContentY() / mPxToDp;
+        final float contentViewOffsetXPx = panel.getContentX() / mPxToDp;
+        final float contentViewOffsetYPx = panel.getContentY() / mPxToDp;
 
         // Adjust the offset to be relative to the Search Contents View.
         event.offsetLocation(-contentViewOffsetXPx, -contentViewOffsetYPx);
@@ -364,7 +377,7 @@
                 wasEventCanceled = true;
             }
         } else if (action == MotionEvent.ACTION_DOWN) {
-            mSearchPanel.onTouchSearchContentViewAck();
+            panel.onTouchSearchContentViewAck();
         }
 
         // Propagate the event to the appropriate view
@@ -392,10 +405,12 @@
      * @return Whether the event has been consumed.
      */
     private boolean handleSingleTapUp(MotionEvent e) {
-        setEventTarget(mSearchPanel.isCoordinateInsideContent(
-                e.getX() * mPxToDp, e.getY() * mPxToDp)
-                ? EventTarget.SEARCH_CONTENT_VIEW : EventTarget.SEARCH_PANEL);
-
+        OverlayPanel panel = mPanelManager.getActivePanel();
+        if (panel != null) {
+            setEventTarget(panel.isCoordinateInsideContent(
+                    e.getX() * mPxToDp, e.getY() * mPxToDp)
+                    ? EventTarget.SEARCH_CONTENT_VIEW : EventTarget.SEARCH_PANEL);
+        }
         return false;
     }
 
@@ -452,7 +467,8 @@
         boolean isVertical = mGestureOrientation == GestureOrientation.VERTICAL;
 
         boolean shouldPropagateEventsToSearchPanel;
-        if (mSearchPanel.isMaximized()) {
+        OverlayPanel panel = mPanelManager.getActivePanel();
+        if (panel != null && panel.isMaximized()) {
             // Allow overscroll in the Search Content View to move the Search Panel instead
             // of scrolling the Search Result Page.
             boolean isMovingDown = distanceY < 0;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/ContextualSearchLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/ContextualSearchLayout.java
index 8d42cff5..da8d2399 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/ContextualSearchLayout.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/ContextualSearchLayout.java
@@ -9,8 +9,9 @@
 import android.view.View;
 
 import org.chromium.chrome.browser.compositor.LayerTitleCache;
+import org.chromium.chrome.browser.compositor.bottombar.OverlayPanel;
 import org.chromium.chrome.browser.compositor.bottombar.OverlayPanel.StateChangeReason;
-import org.chromium.chrome.browser.compositor.bottombar.contextualsearch.ContextualSearchPanel;
+import org.chromium.chrome.browser.compositor.bottombar.OverlayPanelManager;
 import org.chromium.chrome.browser.compositor.layouts.ContextualSearchSupportedLayout;
 import org.chromium.chrome.browser.compositor.layouts.Layout;
 import org.chromium.chrome.browser.compositor.layouts.LayoutRenderHost;
@@ -49,19 +50,18 @@
      * @param updateHost The {@link LayoutUpdateHost} view for this layout.
      * @param renderHost The {@link LayoutRenderHost} view for this layout.
      * @param eventFilter The {@link EventFilter} that is needed for this view.
+     * @param panelManager The {@link OverlayPanelManager} for getting the active panel.
      */
     public ContextualSearchLayout(Context context, LayoutUpdateHost updateHost,
-            LayoutRenderHost renderHost, EventFilter eventFilter, ContextualSearchPanel panel) {
-        super(context, updateHost, renderHost, eventFilter, panel);
+            LayoutRenderHost renderHost, EventFilter eventFilter,
+            OverlayPanelManager panelManager) {
+        super(context, updateHost, renderHost, eventFilter, panelManager);
         mTabListSceneLayer = new TabListSceneLayer();
-        // TODO(changwan): use SceneOverlayTree's setContentTree() instead once we refactor
-        // ContextualSearchSupportedLayout into LayoutHelper.
-        mTabListSceneLayer.setContentTree(super.getSceneLayer());
     }
 
     @Override
     public View getViewForInteraction() {
-        ContentViewCore content = mSearchPanel.getContentViewCore();
+        ContentViewCore content = mPanelManager.getActivePanel().getContentViewCore();
         if (content != null) return content.getContainerView();
         return super.getViewForInteraction();
     }
@@ -73,7 +73,7 @@
 
     @Override
     public float getTopControlsOffset(float currentOffsetDp) {
-        return MathUtils.clamp(mBaseTab.getY(), -mSearchPanel.getToolbarHeight(),
+        return MathUtils.clamp(mBaseTab.getY(), -mPanelManager.getActivePanel().getToolbarHeight(),
                 Math.min(currentOffsetDp, 0f));
     }
 
@@ -82,8 +82,11 @@
         super.updateLayout(time, dt);
         if (mBaseTab == null) return;
 
-        mBaseTab.setY(mSearchPanel.getBasePageY());
-        mBaseTab.setBrightness(mSearchPanel.getBasePageBrightness());
+        OverlayPanel panel = mPanelManager.getActivePanel();
+        if (panel != null) {
+            mBaseTab.setY(panel.getBasePageY());
+            mBaseTab.setBrightness(panel.getBasePageBrightness());
+        }
 
         boolean needUpdate = mBaseTab.updateSnap(dt);
         if (needUpdate) requestUpdate();
@@ -99,13 +102,16 @@
         // if the SearchContentView's vertical scroll position is zero. Otherwise the
         // ContentView will appear to jump in the screen. Coordinate with @dtrainor to solve
         // this problem.
-        mSearchPanel.updateTopControlsState(TopControlsState.BOTH, false);
+        mPanelManager.getActivePanel().updateTopControlsState(TopControlsState.BOTH, false);
         return true;
     }
 
     @Override
     public void show(long time, boolean animate) {
+        // TODO(changwan): use SceneOverlayTree's setContentTree() instead once we refactor
+        // ContextualSearchSupportedLayout into LayoutHelper.
         mTabListSceneLayer.setContentTree(super.getSceneLayer());
+
         super.show(time, animate);
 
         resetLayout();
@@ -161,29 +167,29 @@
     @Override
     public void onDown(long time, float x, float y) {
         mInitialPanelTouchY = y;
-        mSearchPanel.handleSwipeStart();
+        mPanelManager.getActivePanel().handleSwipeStart();
     }
 
     @Override
     public void drag(long time, float x, float y, float deltaX, float deltaY) {
         final float ty = y - mInitialPanelTouchY;
 
-        mSearchPanel.handleSwipeMove(ty);
+        mPanelManager.getActivePanel().handleSwipeMove(ty);
     }
 
     @Override
     public void onUpOrCancel(long time) {
-        mSearchPanel.handleSwipeEnd();
+        mPanelManager.getActivePanel().handleSwipeEnd();
     }
 
     @Override
     public void fling(long time, float x, float y, float velocityX, float velocityY) {
-        mSearchPanel.handleFling(velocityY);
+        mPanelManager.getActivePanel().handleFling(velocityY);
     }
 
     @Override
     public void click(long time, float x, float y) {
-        mSearchPanel.handleClick(time, x, y);
+        mPanelManager.getActivePanel().handleClick(time, x, y);
     }
 
     // ============================================================================================
@@ -192,23 +198,23 @@
 
     @Override
     public void swipeStarted(long time, ScrollDirection direction, float x, float y) {
-        mSearchPanel.handleSwipeStart();
+        mPanelManager.getActivePanel().handleSwipeStart();
     }
 
     @Override
     public void swipeUpdated(long time, float x, float y, float dx, float dy, float tx, float ty) {
-        mSearchPanel.handleSwipeMove(ty);
+        mPanelManager.getActivePanel().handleSwipeMove(ty);
     }
 
     @Override
     public void swipeFlingOccurred(
             long time, float x, float y, float tx, float ty, float vx, float vy) {
-        mSearchPanel.handleFling(vy);
+        mPanelManager.getActivePanel().handleFling(vy);
     }
 
     @Override
     public void swipeFinished(long time) {
-        mSearchPanel.handleSwipeEnd();
+        mPanelManager.getActivePanel().handleSwipeEnd();
     }
 
     @Override
@@ -218,7 +224,7 @@
 
     @Override
     public boolean onBackPressed() {
-        mSearchPanel.closePanel(StateChangeReason.BACK_PRESS, true);
+        mPanelManager.getActivePanel().closePanel(StateChangeReason.BACK_PRESS, true);
         return true;
     }
 
@@ -245,7 +251,7 @@
 
     @Override
     public float getToolbarBrightness() {
-        return mSearchPanel.getBasePageBrightness();
+        return mPanelManager.getActivePanel().getBasePageBrightness();
     }
 
     @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManager.java b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManager.java
index 2943b2b..5f40198 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManager.java
@@ -532,7 +532,7 @@
         // Refactor to show the bar and set the text at the same time!
         // TODO(donnd): If there was a previously ongoing contextual search, we should ensure
         // it's registered as closed.
-        mSearchPanel.peekPanel(stateChangeReason);
+        mSearchPanel.requestPanelShow(stateChangeReason);
 
         assert mSelectionController.getSelectionType() != SelectionType.UNDETERMINED;
         mWasActivatedByTap = mSelectionController.getSelectionType() == SelectionType.TAP;
@@ -863,15 +863,15 @@
         public SearchOverlayContentDelegate() {}
 
         @Override
-        public void onMainFrameLoadStarted(String url) {
-            onExternalNavigation(url);
+        public void onMainFrameLoadStarted(String url, boolean isExternalUrl) {
+            if (isExternalUrl) {
+                onExternalNavigation(url);
+            }
         }
 
         @Override
-        public void onMainFrameNavigation(String url, boolean isFailure) {
-            if (shouldPromoteSearchNavigation()) {
-                onExternalNavigation(url);
-            } else {
+        public void onMainFrameNavigation(String url, boolean isExternalUrl, boolean isFailure) {
+            if (!isExternalUrl) {
                 // Could be just prefetching, check if that failed.
                 onContextualSearchRequestNavigation(isFailure);
             }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchStaticEventFilter.java b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchStaticEventFilter.java
index 177bb3f..6daf40f 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchStaticEventFilter.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchStaticEventFilter.java
@@ -7,7 +7,8 @@
 import android.content.Context;
 import android.view.MotionEvent;
 
-import org.chromium.chrome.browser.compositor.bottombar.contextualsearch.ContextualSearchPanel;
+import org.chromium.chrome.browser.compositor.bottombar.OverlayPanel;
+import org.chromium.chrome.browser.compositor.bottombar.OverlayPanelManager;
 import org.chromium.chrome.browser.compositor.layouts.eventfilter.EdgeSwipeHandler;
 import org.chromium.chrome.browser.compositor.layouts.eventfilter.EventFilter;
 import org.chromium.chrome.browser.compositor.layouts.eventfilter.EventFilterHost;
@@ -18,9 +19,9 @@
  */
 public class ContextualSearchStaticEventFilter extends EventFilter {
     /**
-     * The @{link ContextualSearchPanel} that controls Contextual Search's UI.
+     * The @{link OverlayPanelManager} that controls panel's UI.
      */
-    private final ContextualSearchPanel mSearchPanel;
+    private final OverlayPanelManager mPanelManager;
 
     /**
      * The @{link SwipeRecognizer} that recognizes directional swipe gestures.
@@ -47,15 +48,15 @@
      *
      * @param context The current Android {@link Context}.
      * @param host The @{link EventFilterHost} associated to this filter.
-     * @param searchPanel The @{link ContextualSearchPanel} that controls Contextual Seach's UI.
+     * @param panelManager The @{link OverlayPanelManager} responsible for showing different panels.
      * @param swipeHandler The @{link EdgeSwipeHandler} for Contextual Search events.
      */
     public ContextualSearchStaticEventFilter(Context context, EventFilterHost host,
-            ContextualSearchPanel searchPanel, EdgeSwipeHandler swipeHandler,
+            OverlayPanelManager panelManager, EdgeSwipeHandler swipeHandler,
             ContextualSearchTapHandler tapHandler) {
         super(context, host);
 
-        mSearchPanel = searchPanel;
+        mPanelManager = panelManager;
         mSwipeRecognizer = new SwipeRecognizerImpl(context);
         mSwipeRecognizer.setSwipeHandler(swipeHandler);
         mTapHandler = tapHandler;
@@ -68,9 +69,10 @@
         // keyboard is showing here because Contextual Search's Panel will
         // be closed, if opened, when the keyboard shows up. Even so,
         // it would be nice fixing this problem in Chrome-Android.
-        return mSearchPanel.isPeeking()
-                && mSearchPanel.isCoordinateInsideBar(event.getX() * mPxToDp,
-                        mSearchPanel.getFullscreenY(event.getY()) * mPxToDp);
+        OverlayPanel activePanel = mPanelManager.getActivePanel();
+        return activePanel != null && activePanel.isPeeking()
+                && activePanel.isCoordinateInsideBar(event.getX() * mPxToDp,
+                        activePanel.getFullscreenY(event.getY()) * mPxToDp);
     }
 
     @Override
@@ -81,7 +83,7 @@
             // TODO(pedrosimonetti): Once we implement "side-swipe to dismiss"
             // we'll have to revisit this because we don't want to set the
             // Content View visibility to true when the side-swipe is detected.
-            mSearchPanel.notifyPanelTouched();
+            mPanelManager.getActivePanel().notifyPanelTouched();
         }
 
         mSwipeRecognizer.onTouchEvent(event);
@@ -97,7 +99,8 @@
         public boolean onSingleTapUp(MotionEvent event) {
             if (mTapHandler == null) return true;
             mTapHandler.handleTapContextualSearchBar(event.getEventTime(),
-                    event.getX() * mPxToDp, mSearchPanel.getFullscreenY(event.getY()) * mPxToDp);
+                    event.getX() * mPxToDp,
+                    mPanelManager.getActivePanel().getFullscreenY(event.getY()) * mPxToDp);
             return true;
         }
     }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/datausage/DataUseTabUIManager.java b/chrome/android/java/src/org/chromium/chrome/browser/datausage/DataUseTabUIManager.java
index bfe8427..c353b1f 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/datausage/DataUseTabUIManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/datausage/DataUseTabUIManager.java
@@ -14,6 +14,7 @@
 import android.view.View;
 import android.widget.CheckBox;
 
+import org.chromium.base.metrics.RecordHistogram;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.EmbedContentViewActivity;
 import org.chromium.chrome.browser.profiles.Profile;
@@ -30,6 +31,23 @@
     private static final String SHARED_PREF_DATA_USE_DIALOG_OPT_OUT = "data_use_dialog_opt_out";
 
     /**
+     * Represents the possible user actions with the data use snackbars and dialog. This must
+     * remain in sync with DataUse.UIAction in tools/metrics/histograms/histograms.xml.
+     */
+    public static class DataUseUIActions {
+        public static final int STARTED_SNACKBAR_SHOWN = 0;
+        public static final int STARTED_SNACKBAR_MORE_CLICKED = 1;
+        public static final int ENDED_SNACKBAR_SHOWN = 2;
+        public static final int ENDED_SNACKBAR_MORE_CLICKED = 3;
+        public static final int DIALOG_SHOWN = 4;
+        public static final int DIALOG_CONTINUE_CLICKED = 5;
+        public static final int DIALOG_CANCEL_CLICKED = 6;
+        public static final int DIALOG_LEARN_MORE_CLICKED = 7;
+        public static final int DIALOG_OPTED_OUT = 8;
+        public static final int INDEX_BOUNDARY = 9;
+    }
+
+    /**
      * Returns true if data use tracking has started within a Tab. When data use tracking has
      * started, returns true only once to signify the started event.
      *
@@ -109,6 +127,7 @@
             public void onClick(View v) {
                 EmbedContentViewActivity.show(activity, R.string.data_use_learn_more_title,
                         R.string.data_use_learn_more_link_url);
+                recordDataUseUIAction(DataUseUIActions.DIALOG_LEARN_MORE_CLICKED);
             }
         });
         new AlertDialog.Builder(activity, R.style.AlertDialogTheme)
@@ -127,15 +146,18 @@
                                     loadUrlParams.setReferrer(referrer);
                                 }
                                 tab.loadUrl(loadUrlParams);
+                                recordDataUseUIAction(DataUseUIActions.DIALOG_CONTINUE_CLICKED);
                             }
                         })
                 .setNegativeButton(R.string.cancel, new OnClickListener() {
                     @Override
                     public void onClick(DialogInterface dialog, int which) {
                         setOptedOutOfDataUseDialog(activity, checkBox.isChecked());
+                        recordDataUseUIAction(DataUseUIActions.DIALOG_CANCEL_CLICKED);
                     }
                 })
                 .show();
+        recordDataUseUIAction(DataUseUIActions.DIALOG_SHOWN);
     }
 
     /**
@@ -159,6 +181,20 @@
         PreferenceManager.getDefaultSharedPreferences(context).edit()
                 .putBoolean(SHARED_PREF_DATA_USE_DIALOG_OPT_OUT, optedOut)
                 .apply();
+        if (optedOut) {
+            recordDataUseUIAction(DataUseUIActions.DIALOG_OPTED_OUT);
+        }
+    }
+
+    /**
+     * Record the DataUse.UIAction histogram.
+     * @param action Action with the data use tracking snackbar or dialog.
+     */
+    public static void recordDataUseUIAction(int action) {
+        assert action >= 0 && action < DataUseUIActions.INDEX_BOUNDARY;
+        RecordHistogram.recordEnumeratedHistogram(
+                "DataReductionProxy.UIAction", action,
+                DataUseUIActions.INDEX_BOUNDARY);
     }
 
     private static native boolean nativeCheckDataUseTrackingStarted(int tabId, Profile profile);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarkEditActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarkEditActivity.java
index 88d4aa5..89933b5 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarkEditActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarkEditActivity.java
@@ -30,7 +30,6 @@
 import org.chromium.chrome.browser.widget.TintedDrawable;
 import org.chromium.components.bookmarks.BookmarkId;
 import org.chromium.content_public.browser.WebContents;
-import org.chromium.ui.base.ActivityWindowAndroid;
 
 /**
  * The activity that enables the user to modify the title, url and parent folder of a bookmark.
@@ -61,7 +60,6 @@
 
     private OfflineButtonType mOfflineButtonType = OfflineButtonType.NONE;
     private OfflinePageModelObserver mOfflinePageModelObserver;
-    private ActivityWindowAndroid mActivityWindowAndroid;
 
     private BookmarkModelObserver mBookmarkModelObserver = new BookmarkModelObserver() {
         @Override
@@ -146,7 +144,6 @@
             findViewById(R.id.offline_page_group).setVisibility(View.VISIBLE);
             getIntent().setExtrasClassLoader(WebContents.class.getClassLoader());
             mWebContents = getIntent().getParcelableExtra(INTENT_WEB_CONTENTS);
-            mActivityWindowAndroid = new ActivityWindowAndroid(this, false);
             updateOfflineSection();
         }
 
@@ -201,19 +198,6 @@
     }
 
     @Override
-    public void onRequestPermissionsResult(
-            int requestCode, String[] permissions, int[] grantResults) {
-        if (mActivityWindowAndroid != null) {
-            if (mActivityWindowAndroid.onRequestPermissionsResult(
-                    requestCode, permissions, grantResults)) {
-                return;
-            }
-        }
-
-        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
-    }
-
-    @Override
     protected void onStop() {
         if (mEnhancedBookmarksModel.doesBookmarkExist(mBookmarkId)) {
             final String title = mTitleEditText.getTrimmedText();
@@ -280,7 +264,7 @@
             public void onClick(View v) {
                 recordOfflineButtonAction(true);
                 mEnhancedBookmarksModel.getOfflinePageBridge().deletePage(
-                        mBookmarkId, mActivityWindowAndroid, new DeletePageCallback() {
+                        mBookmarkId, new DeletePageCallback() {
                             @Override
                             public void onDeletePageDone(int deletePageResult) {
                                 // TODO(fgorski): Add snackbar upon failure.
@@ -301,7 +285,7 @@
             public void onClick(View v) {
                 recordOfflineButtonAction(true);
                 mEnhancedBookmarksModel.getOfflinePageBridge().savePage(
-                        mWebContents, mBookmarkId, mActivityWindowAndroid, new SavePageCallback() {
+                        mWebContents, mBookmarkId, new SavePageCallback() {
                             @Override
                             public void onSavePageDone(int savePageResult, String url) {
                                 // TODO(fgorski): Add snackbar upon failure.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarkRow.java b/chrome/android/java/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarkRow.java
index 6f459e4..9ea1328 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarkRow.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarkRow.java
@@ -5,7 +5,6 @@
 package org.chromium.chrome.browser.enhancedbookmarks;
 
 import android.content.Context;
-import android.graphics.PorterDuff;
 import android.util.AttributeSet;
 import android.view.View;
 import android.view.View.OnClickListener;
@@ -187,7 +186,6 @@
 
             mMoreIcon = (TintedImageButton) findViewById(R.id.more);
             mMoreIcon.setVisibility(VISIBLE);
-            mMoreIcon.setColorFilterMode(PorterDuff.Mode.MULTIPLY);
             mMoreIcon.setOnClickListener(new OnClickListener() {
                 @Override
                 public void onClick(View view) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarksModel.java b/chrome/android/java/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarksModel.java
index dbc3ccb..35f24c1 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarksModel.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarksModel.java
@@ -20,7 +20,6 @@
 import org.chromium.components.bookmarks.BookmarkType;
 import org.chromium.components.dom_distiller.core.DomDistillerUrlUtils;
 import org.chromium.components.offlinepages.SavePageResult;
-import org.chromium.content.browser.ContentViewCore;
 import org.chromium.content_public.browser.WebContents;
 
 import java.util.ArrayList;
@@ -237,22 +236,20 @@
             final AddBookmarkCallback callback) {
         assert bookmarkId.getId() != ChromeBrowserProviderClient.INVALID_BOOKMARK_ID;
         if (mOfflinePageBridge != null) {
-            mOfflinePageBridge.savePage(webContents, bookmarkId,
-                    ContentViewCore.fromWebContents(webContents).getWindowAndroid(),
-                    new SavePageCallback() {
-                        @Override
-                        public void onSavePageDone(int savePageResult, String url) {
-                            int saveResult;
-                            if (savePageResult == SavePageResult.SUCCESS) {
-                                saveResult = AddBookmarkCallback.SAVED;
-                            } else if (savePageResult == SavePageResult.SKIPPED) {
-                                saveResult = AddBookmarkCallback.SKIPPED;
-                            } else {
-                                saveResult = AddBookmarkCallback.ERROR;
-                            }
-                            callback.onBookmarkAdded(bookmarkId, saveResult);
-                        }
-                    });
+            mOfflinePageBridge.savePage(webContents, bookmarkId, new SavePageCallback() {
+                @Override
+                public void onSavePageDone(int savePageResult, String url) {
+                    int saveResult;
+                    if (savePageResult == SavePageResult.SUCCESS) {
+                        saveResult = AddBookmarkCallback.SAVED;
+                    } else if (savePageResult == SavePageResult.SKIPPED) {
+                        saveResult = AddBookmarkCallback.SKIPPED;
+                    } else {
+                        saveResult = AddBookmarkCallback.ERROR;
+                    }
+                    callback.onBookmarkAdded(bookmarkId, saveResult);
+                }
+            });
         }
     }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/externalnav/IntentWithGesturesHandler.java b/chrome/android/java/src/org/chromium/chrome/browser/externalnav/IntentWithGesturesHandler.java
index 1fd2e78..2a7538b 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/externalnav/IntentWithGesturesHandler.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/externalnav/IntentWithGesturesHandler.java
@@ -4,11 +4,16 @@
 
 package org.chromium.chrome.browser.externalnav;
 
+import android.annotation.SuppressLint;
 import android.content.Intent;
 
+import org.chromium.base.Log;
+import org.chromium.base.SecureRandomInitializer;
 import org.chromium.chrome.browser.IntentHandler;
 import org.chromium.chrome.browser.util.IntentUtils;
 
+import java.io.IOException;
+import java.security.NoSuchAlgorithmException;
 import java.security.SecureRandom;
 import java.util.Arrays;
 
@@ -27,6 +32,8 @@
     public static final String EXTRA_USER_GESTURE_TOKEN =
             "org.chromium.chrome.browser.user_gesture_token";
 
+    private static final String TAG = "IntentGestureHandler";
+
     private static final Object INSTANCE_LOCK = new Object();
     private static IntentWithGesturesHandler sIntentWithGesturesHandler;
     private SecureRandom mSecureRandom;
@@ -45,8 +52,20 @@
         return sIntentWithGesturesHandler;
     }
 
+    @SuppressLint("TrulyRandom")
+    // SecureRandomInitializer addresses the bug in SecureRandom that "TrulyRandom"
+    // warns about, so this lint warning can safely be suppressed.
     private IntentWithGesturesHandler() {
-        mSecureRandom = new SecureRandom();
+        try {
+            mSecureRandom = SecureRandom.getInstance("SHA1PRNG");
+            SecureRandomInitializer.initialize(mSecureRandom);
+        } catch (NoSuchAlgorithmException e) {
+            Log.e(TAG, "Cannot create SecureRandom", e);
+            mSecureRandom = null;
+        } catch (IOException ioe) {
+            Log.e(TAG, "Cannot initialize SecureRandom", ioe);
+            mSecureRandom = null;
+        }
     }
 
     /**
@@ -56,6 +75,7 @@
      * @param intent Intent with user gesture.
      */
     public void onNewIntentWithGesture(Intent intent) {
+        if (mSecureRandom == null) return;
         mIntentToken = new byte[32];
         mSecureRandom.nextBytes(mIntentToken);
         intent.putExtra(EXTRA_USER_GESTURE_TOKEN, mIntentToken);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunFlowSequencer.java b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunFlowSequencer.java
index 843d9c1..97a0ef6 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunFlowSequencer.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunFlowSequencer.java
@@ -113,7 +113,8 @@
     }
 
     protected boolean shouldShowDataReductionPage() {
-        return FieldTrialList.findFullName("DataReductionProxyFREPromo").startsWith("Enabled");
+        return FieldTrialList.findFullName("DataReductionProxyFREPromo").startsWith("Enabled")
+                || ChromeVersionInfo.isLocalBuild() || ChromeVersionInfo.isCanaryBuild();
     }
 
     @VisibleForTesting
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageBridge.java
index b395998..0ec3d0e 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageBridge.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageBridge.java
@@ -4,7 +4,6 @@
 
 package org.chromium.chrome.browser.offlinepages;
 
-import android.content.pm.PackageManager;
 import android.os.AsyncTask;
 
 import org.chromium.base.ObserverList;
@@ -17,11 +16,7 @@
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.components.bookmarks.BookmarkId;
 import org.chromium.components.bookmarks.BookmarkType;
-import org.chromium.components.offlinepages.DeletePageResult;
-import org.chromium.components.offlinepages.SavePageResult;
 import org.chromium.content_public.browser.WebContents;
-import org.chromium.ui.base.WindowAndroid;
-import org.chromium.ui.base.WindowAndroid.PermissionCallback;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -194,38 +189,15 @@
      *
      * @param webContents Contents of the page to save.
      * @param bookmarkId Id of the bookmark related to the offline page.
-     * @param windowAndroid The Android window used to access the file system.
      * @param callback Interface that contains a callback.
      * @see SavePageCallback
      */
     @VisibleForTesting
     public void savePage(final WebContents webContents, final BookmarkId bookmarkId,
-            WindowAndroid windowAndroid, final SavePageCallback callback) {
+            final SavePageCallback callback) {
         assert mIsNativeOfflinePageModelLoaded;
+        assert webContents != null;
 
-        if (windowAndroid == null) {
-            callback.onSavePageDone(SavePageResult.CONTENT_UNAVAILABLE, webContents.getUrl());
-        } else if (OfflinePageUtils.hasFileAccessPermission(windowAndroid)) {
-            doSavePage(callback, webContents, bookmarkId);
-        } else {
-            PermissionCallback permissionCallback = new PermissionCallback() {
-                @Override
-                public void onRequestPermissionsResult(String[] permission, int[] grantResults) {
-                    if (grantResults.length > 0
-                            && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
-                        doSavePage(callback, webContents, bookmarkId);
-                    } else {
-                        callback.onSavePageDone(SavePageResult.CANCELLED, webContents.getUrl());
-                    }
-                }
-            };
-
-            OfflinePageUtils.requestFileAccessPermission(windowAndroid, permissionCallback);
-        }
-    }
-
-    private void doSavePage(SavePageCallback callback, WebContents webContents,
-            BookmarkId bookmarkId) {
         recordFreeSpaceHistograms(
                 "OfflinePages.SavePage.FreeSpacePercentage", "OfflinePages.SavePage.FreeSpaceMB");
         nativeSavePage(mNativeOfflinePageBridge, callback, webContents, bookmarkId.getId());
@@ -245,36 +217,13 @@
      * Deletes an offline page related to a specified bookmark.
      *
      * @param bookmarkId Bookmark ID for which the offline copy will be deleted.
-     * @param windowAndroid The Android window used to access the file system.
      * @param callback Interface that contains a callback.
      * @see DeletePageCallback
      */
     @VisibleForTesting
-    public void deletePage(final BookmarkId bookmarkId, WindowAndroid windowAndroid,
-            final DeletePageCallback callback) {
+    public void deletePage(final BookmarkId bookmarkId, final DeletePageCallback callback) {
         assert mIsNativeOfflinePageModelLoaded;
-        assert windowAndroid != null;
 
-        if (OfflinePageUtils.hasFileAccessPermission(windowAndroid)) {
-            doDeletePage(callback, bookmarkId);
-        } else {
-            PermissionCallback permissionCallback = new PermissionCallback() {
-                @Override
-                public void onRequestPermissionsResult(String[] permission, int[] grantResults) {
-                    if (grantResults.length > 0
-                            && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
-                        doDeletePage(callback, bookmarkId);
-                    } else {
-                        callback.onDeletePageDone(DeletePageResult.DEVICE_FAILURE);
-                    }
-                }
-            };
-
-            OfflinePageUtils.requestFileAccessPermission(windowAndroid, permissionCallback);
-        }
-    }
-
-    private void doDeletePage(DeletePageCallback callback, BookmarkId bookmarkId) {
         recordFreeSpaceHistograms("OfflinePages.DeletePage.FreeSpacePercentage",
                 "OfflinePages.DeletePage.FreeSpaceMB");
         nativeDeletePage(mNativeOfflinePageBridge, callback, bookmarkId.getId());
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageUtils.java
index 5b6c4706..523e226f 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageUtils.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageUtils.java
@@ -4,7 +4,6 @@
 
 package org.chromium.chrome.browser.offlinepages;
 
-import android.Manifest.permission;
 import android.content.Context;
 import android.net.ConnectivityManager;
 import android.net.NetworkInfo;
@@ -23,8 +22,6 @@
 import org.chromium.components.bookmarks.BookmarkType;
 import org.chromium.content_public.browser.LoadUrlParams;
 import org.chromium.ui.base.PageTransition;
-import org.chromium.ui.base.WindowAndroid;
-import org.chromium.ui.base.WindowAndroid.PermissionCallback;
 
 /**
  * A class holding static util functions for offline pages.
@@ -117,30 +114,6 @@
     }
 
     /**
-     * Returns whether file access is allowed.
-     *
-     * @param windowAndroid The Android window used to access the file system.
-     * @return true if allowed, or false otherwise.
-     */
-    public static boolean hasFileAccessPermission(WindowAndroid windowAndroid) {
-        assert windowAndroid != null;
-        return windowAndroid.hasPermission(permission.WRITE_EXTERNAL_STORAGE);
-    }
-
-    /**
-     * Called to prompt user with the file access permission.
-     *
-     * @param windowAndroid The Android window used to access the file system.
-     * @param callback Callback for the permission request.
-     */
-    public static void requestFileAccessPermission(
-            WindowAndroid windowAndroid, PermissionCallback callback) {
-        assert windowAndroid != null;
-        windowAndroid.requestPermissions(
-                new String[] {android.Manifest.permission.WRITE_EXTERNAL_STORAGE}, callback);
-    }
-
-    /**
      * Shows the snackbar for the current tab to provide offline specific information.
      * @param activity The activity owning the tab.
      * @param tabId The ID of current tab.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/snackbar/DataUseSnackbarController.java b/chrome/android/java/src/org/chromium/chrome/browser/snackbar/DataUseSnackbarController.java
index eb295d86..898835c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/snackbar/DataUseSnackbarController.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/snackbar/DataUseSnackbarController.java
@@ -8,6 +8,8 @@
 
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.EmbedContentViewActivity;
+import org.chromium.chrome.browser.datausage.DataUseTabUIManager;
+import org.chromium.chrome.browser.datausage.DataUseTabUIManager.DataUseUIActions;
 
 /**
  * The controller for two data use snackbars:
@@ -19,6 +21,10 @@
  * data use tracking has ended.
  */
 public class DataUseSnackbarController implements SnackbarManager.SnackbarController {
+    /** Snackbar types */
+    private static final int STARTED_SNACKBAR = 0;
+    private static final int ENDED_SNACKBAR = 1;
+
     private final SnackbarManager mSnackbarManager;
     private final Context mContext;
 
@@ -36,16 +42,16 @@
         mSnackbarManager.showSnackbar(Snackbar.make(
                 mContext.getString(R.string.data_use_tracking_started_snackbar_message), this)
                 .setAction(mContext.getString(R.string.data_use_tracking_snackbar_action),
-                        null));
-        // TODO(megjablon): Add metrics.
+                        STARTED_SNACKBAR));
+        DataUseTabUIManager.recordDataUseUIAction(DataUseUIActions.STARTED_SNACKBAR_SHOWN);
     }
 
     public void showDataUseTrackingEndedBar() {
         mSnackbarManager.showSnackbar(Snackbar.make(
                 mContext.getString(R.string.data_use_tracking_ended_snackbar_message), this)
                 .setAction(mContext.getString(R.string.data_use_tracking_snackbar_action),
-                        null));
-        // TODO(megjablon): Add metrics.
+                        ENDED_SNACKBAR));
+        DataUseTabUIManager.recordDataUseUIAction(DataUseUIActions.ENDED_SNACKBAR_SHOWN);
     }
 
     /**
@@ -60,9 +66,24 @@
      */
     @Override
     public void onAction(Object actionData) {
-        // TODO(megjablon): Add metrics.
         EmbedContentViewActivity.show(mContext, R.string.data_use_learn_more_title,
                 R.string.data_use_learn_more_link_url);
+
+        if (actionData == null) return;
+        int snackbarType = (int) actionData;
+        switch (snackbarType) {
+            case STARTED_SNACKBAR:
+                DataUseTabUIManager.recordDataUseUIAction(
+                        DataUseUIActions.STARTED_SNACKBAR_MORE_CLICKED);
+                break;
+            case ENDED_SNACKBAR:
+                DataUseTabUIManager.recordDataUseUIAction(
+                        DataUseUIActions.ENDED_SNACKBAR_MORE_CLICKED);
+                break;
+            default:
+                assert false;
+                break;
+        }
     }
 
     @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java
index fc0b4ae..c51d656 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java
@@ -1061,8 +1061,7 @@
      *         {@link java.util.Iterator#remove()} will throw an
      *         {@link UnsupportedOperationException}.
      */
-    @VisibleForTesting
-    public ObserverList.RewindableIterator<TabObserver> getTabObservers() {
+    protected ObserverList.RewindableIterator<TabObserver> getTabObservers() {
         return mObservers.rewindableIterator();
     }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/CustomTabToolbar.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/CustomTabToolbar.java
index 8230379..a32944c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/CustomTabToolbar.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/CustomTabToolbar.java
@@ -22,6 +22,7 @@
 import android.widget.TextView;
 
 import org.chromium.base.ApiCompatibilityUtils;
+import org.chromium.base.ThreadUtils;
 import org.chromium.base.VisibleForTesting;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.WindowDelegate;
@@ -50,6 +51,8 @@
  */
 public class CustomTabToolbar extends ToolbarLayout implements LocationBar,
         View.OnLongClickListener {
+    private static final int TITLE_ANIM_DELAY_MS = 200;
+
     private View mLocationBarFrameLayout;
     private View mTitleUrlContainer;
     private UrlBar mUrlBar;
@@ -65,6 +68,14 @@
 
     private CustomTabToolbarAnimationDelegate mAnimDelegate;
     private boolean mBackgroundColorSet;
+    private long mInitializeTimeStamp;
+
+    private Runnable mTitleAnimationStarter = new Runnable() {
+        @Override
+        public void run() {
+            mAnimDelegate.startTitleAnimation(getContext());
+        }
+    };
 
     /**
      * Constructor for getting this class inflated from an xml layout file.
@@ -105,6 +116,7 @@
             ToolbarTabController tabController, AppMenuButtonHelper appMenuButtonHelper) {
         super.initialize(toolbarDataProvider, tabController, appMenuButtonHelper);
         updateVisualsForState();
+        mInitializeTimeStamp = System.currentTimeMillis();
     }
 
     @Override
@@ -203,7 +215,13 @@
         // It takes some time to parse the title of the webcontent, and before that Tab#getTitle
         // always return the url. We postpone the title animation until the title is authentic.
         if (mShouldShowTitle && !TextUtils.equals(currentTab.getTitle(), currentTab.getUrl())) {
-            mAnimDelegate.startTitleAnimation(getContext());
+            long duration = System.currentTimeMillis() - mInitializeTimeStamp;
+            if (duration >= TITLE_ANIM_DELAY_MS) {
+                mTitleAnimationStarter.run();
+            } else {
+                ThreadUtils.postOnUiThreadDelayed(mTitleAnimationStarter,
+                        TITLE_ANIM_DELAY_MS - duration);
+            }
         }
 
         mTitleBar.setText(currentTab.getTitle());
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/TintedImageButton.java b/chrome/android/java/src/org/chromium/chrome/browser/widget/TintedImageButton.java
index c5f489c..139d14e 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/widget/TintedImageButton.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/widget/TintedImageButton.java
@@ -19,7 +19,6 @@
  */
 public class TintedImageButton extends ImageButton {
     private ColorStateList mTint;
-    private PorterDuff.Mode mColorFilterMode = PorterDuff.Mode.SRC_IN;
 
     public TintedImageButton(Context context) {
         super(context);
@@ -58,22 +57,12 @@
         updateTintColor();
     }
 
-    /**
-     * Sets the Porter-Duff mode to use when tinting the image.
-     * @param mode The porterduff mode to use to set color filter.
-     */
-    public void setColorFilterMode(PorterDuff.Mode mode) {
-        if (mColorFilterMode == mode) return;
-        mColorFilterMode = mode;
-        updateTintColor();
-    }
-
     private void setTintInternal(ColorStateList tint) {
         mTint = tint;
     }
 
     private void updateTintColor() {
         if (mTint == null) return;
-        setColorFilter(mTint.getColorForState(getDrawableState(), 0), mColorFilterMode);
+        setColorFilter(mTint.getColorForState(getDrawableState(), 0), PorterDuff.Mode.SRC_IN);
     }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/findinpage/FindToolbar.java b/chrome/android/java/src/org/chromium/chrome/browser/widget/findinpage/FindToolbar.java
index 81930074..c1bd4232 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/widget/findinpage/FindToolbar.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/widget/findinpage/FindToolbar.java
@@ -5,6 +5,8 @@
 package org.chromium.chrome.browser.widget.findinpage;
 
 import android.annotation.SuppressLint;
+import android.content.ClipData;
+import android.content.ClipboardManager;
 import android.content.Context;
 import android.graphics.Rect;
 import android.os.Handler;
@@ -13,6 +15,7 @@
 import android.support.v4.view.accessibility.AccessibilityEventCompat;
 import android.text.Editable;
 import android.text.InputType;
+import android.text.Selection;
 import android.text.TextWatcher;
 import android.util.AttributeSet;
 import android.view.ActionMode;
@@ -122,6 +125,39 @@
             }
             return super.onKeyDown(keyCode, event);
         }
+
+        @Override
+        public boolean onTextContextMenuItem(int id) {
+            if (id == android.R.id.paste) {
+                ClipboardManager clipboard = (ClipboardManager) getContext()
+                        .getSystemService(Context.CLIPBOARD_SERVICE);
+                ClipData clipData = clipboard.getPrimaryClip();
+                if (clipData != null) {
+                    // Convert the clip data to a simple string
+                    StringBuilder builder = new StringBuilder();
+                    for (int i = 0; i < clipData.getItemCount(); i++) {
+                        builder.append(clipData.getItemAt(i).coerceToText(getContext()));
+                    }
+
+                    // Identify how much of the original text should be replaced
+                    int min = 0;
+                    int max = getText().length();
+
+                    if (isFocused()) {
+                        final int selStart = getSelectionStart();
+                        final int selEnd = getSelectionEnd();
+
+                        min = Math.max(0, Math.min(selStart, selEnd));
+                        max = Math.max(0, Math.max(selStart, selEnd));
+                    }
+
+                    Selection.setSelection(getText(), max);
+                    getText().replace(min, max, builder.toString());
+                    return true;
+                }
+            }
+            return super.onTextContextMenuItem(id);
+        }
     }
 
     public FindToolbar(Context context, AttributeSet attrs) {
diff --git a/chrome/android/java/strings/android_chrome_strings.grd b/chrome/android/java/strings/android_chrome_strings.grd
index bf7939b7..9a0035b 100644
--- a/chrome/android/java/strings/android_chrome_strings.grd
+++ b/chrome/android/java/strings/android_chrome_strings.grd
@@ -778,16 +778,16 @@
 
       <!-- Data Use -->
       <message name="IDS_DATA_USE_TRACKING_STARTED_SNACKBAR_MESSAGE" desc="Message shown when data use tracking starts.">
-        Data use is being tracked
+        Data use is being measured
       </message>
       <message name="IDS_DATA_USE_TRACKING_SNACKBAR_ACTION" desc="Button to learn more when data use tracking starts or ends.">
         More
       </message>
       <message name="IDS_DATA_USE_TRACKING_ENDED_SNACKBAR_MESSAGE" desc="Message shown when data use tracking has ended.">
-        Data use tracking has ended
+        Data use measuring has ended
       </message>
       <message name="IDS_DATA_USE_TRACKING_ENDED_TITLE" desc="Message shown on the dialog when data use tracking has ended.">
-        Data use tracking ended
+        Data use measuring ended
       </message>
       <message name="IDS_DATA_USE_TRACKING_ENDED_MESSAGE" desc="Message shown on the dialog when data use tracking has ended.">
         Your data use will no longer be measured.
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/AutofillKeyboardAccessoryTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/AutofillKeyboardAccessoryTest.java
index 676a4d6..54fee236 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/AutofillKeyboardAccessoryTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/AutofillKeyboardAccessoryTest.java
@@ -7,6 +7,7 @@
 import android.test.suitebuilder.annotation.MediumTest;
 import android.view.View;
 import android.view.ViewGroup;
+import android.widget.HorizontalScrollView;
 
 import org.chromium.base.ThreadUtils;
 import org.chromium.base.test.util.CommandLineFlags;
@@ -35,6 +36,7 @@
 public class AutofillKeyboardAccessoryTest extends ChromeActivityTestCaseBase<ChromeActivity> {
     private final AtomicReference<ContentViewCore> mViewCoreRef =
             new AtomicReference<ContentViewCore>();
+    private final AtomicReference<WebContents> mWebContentsRef = new AtomicReference<WebContents>();
     private final AtomicReference<ViewGroup> mContainerRef = new AtomicReference<ViewGroup>();
     private final AtomicReference<ViewGroup> mKeyboardAccessoryRef =
             new AtomicReference<ViewGroup>();
@@ -44,8 +46,12 @@
     }
 
     @Override
-    public void startMainActivity() throws InterruptedException {
-        startMainActivityWithURL(UrlUtils.encodeHtmlDataUri("<html><head>"
+    public void startMainActivity() throws InterruptedException {}
+
+    private void loadTestPage(boolean isRtl) throws InterruptedException, ExecutionException {
+        startMainActivityWithURL(UrlUtils.encodeHtmlDataUri("<html"
+                + (isRtl ? " dir=\"rtl\"" : "")
+                + "><head>"
                 + "<meta name=\"viewport\""
                 + "content=\"width=device-width, initial-scale=1.0, maximum-scale=1.0\" /></head>"
                 + "<body><form method=\"POST\">"
@@ -54,7 +60,7 @@
                 + "<textarea id=\"sa\" autocomplete=\"street-address\"></textarea><br>"
                 + "<input type=\"text\" id=\"a1\" autocomplete=\"address-line1\" /><br>"
                 + "<input type=\"text\" id=\"a2\" autocomplete=\"address-line2\" /><br>"
-                + "<input type=\"text\" id=\"ct\" autocomplete=\"locality\" /><br>"
+                + "<input type=\"text\" id=\"ct\" autocomplete=\"address-level2\" /><br>"
                 + "<input type=\"text\" id=\"zc\" autocomplete=\"postal-code\" /><br>"
                 + "<input type=\"text\" id=\"em\" autocomplete=\"email\" /><br>"
                 + "<input type=\"text\" id=\"ph\" autocomplete=\"tel\" /><br>"
@@ -65,26 +71,27 @@
                 + "</select>"
                 + "<input type=\"submit\" />"
                 + "</form></body></html>"));
-        try {
-            new AutofillTestHelper().setProfile(new AutofillProfile("", "https://www.example.com",
-                    "John Smith", "Acme Inc", "1 Main\nApt A", "CA", "San Francisco", "", "94102",
-                    "", "US", "(415) 888-9999", "john@acme.inc", "en"));
-        } catch (ExecutionException e) {
-            assertTrue("Could not set an autofill profile.", false);
-        }
-
-        final AtomicReference<WebContents> webContentsRef = new AtomicReference<WebContents>();
+        new AutofillTestHelper().setProfile(new AutofillProfile("", "https://www.example.com",
+                "Johnononononononononononononononononononononononononononononononononon "
+                        + "Smiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiith",
+                "Acme Inc", "1 Main\nApt A", "CA", "San Francisco", "", "94102", "", "US",
+                "(415) 888-9999", "john@acme.inc", "en"));
+        new AutofillTestHelper().setProfile(new AutofillProfile("", "https://www.example.com",
+                "Janenenenenenenenenenenenenenenenenenenenenenenenenenenenenenenenenene "
+                        + "Doooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooe",
+                "Acme Inc", "1 Main\nApt A", "CA", "San Francisco", "", "94102", "", "US",
+                "(415) 999-0000", "jane@acme.inc", "en"));
         ThreadUtils.runOnUiThreadBlocking(new Runnable() {
             @Override
             public void run() {
                 mViewCoreRef.set(getActivity().getCurrentContentViewCore());
-                webContentsRef.set(mViewCoreRef.get().getWebContents());
+                mWebContentsRef.set(mViewCoreRef.get().getWebContents());
                 mContainerRef.set(mViewCoreRef.get().getContainerView());
                 mKeyboardAccessoryRef.set(
                         getActivity().getWindowAndroid().getKeyboardAccessoryView());
             }
         });
-        assertTrue(DOMUtils.waitForNonZeroNodeBounds(webContentsRef.get(), "fn"));
+        assertTrue(DOMUtils.waitForNonZeroNodeBounds(mWebContentsRef.get(), "fn"));
     }
 
     /**
@@ -92,7 +99,9 @@
      */
     @MediumTest
     @Feature({"keyboard-accessory"})
-    public void testAutofocusedFieldDoesNotShowKeyboardAccessory() throws ExecutionException {
+    public void testAutofocusedFieldDoesNotShowKeyboardAccessory() throws InterruptedException,
+           ExecutionException {
+        loadTestPage(false);
         assertTrue("Keyboard accessory should be hidden.",
                 ThreadUtils.runOnUiThreadBlocking(new Callable<Boolean>() {
                     @Override
@@ -109,6 +118,7 @@
     @Feature({"keyboard-accessory"})
     public void testTapInputFieldShowsKeyboardAccessory() throws ExecutionException,
              InterruptedException, TimeoutException {
+        loadTestPage(false);
         DOMUtils.clickNode(this, mViewCoreRef.get(), "fn");
         assertTrue("Keyboard should be showing.",
                 CriteriaHelper.pollForUIThreadCriteria(new Criteria() {
@@ -127,13 +137,13 @@
     }
 
     /**
-     * Selecting a keyboard accessory suggestion should hide the keyboard and its keyboard
-     * accessory.
+     * Switching fields should re-scroll the keyboard accessory to the left.
      */
     @MediumTest
     @Feature({"keyboard-accessory"})
-    public void testSelectSuggestionHidesKeyboardAccessory() throws ExecutionException,
+    public void testSwitchFieldsRescrollsKeyboardAccessory() throws ExecutionException,
              InterruptedException, TimeoutException {
+        loadTestPage(false);
         DOMUtils.clickNode(this, mViewCoreRef.get(), "fn");
         assertTrue("Keyboard should be showing.",
                 CriteriaHelper.pollForUIThreadCriteria(new Criteria() {
@@ -145,13 +155,112 @@
         ThreadUtils.runOnUiThreadBlocking(new Runnable() {
             @Override
             public void run() {
-                // The view hierarchy:
-                //   Keyboard accessory.
-                //    \--> A list of suggestions.
-                //          \--> A suggestion that can be clicked.
-                ((ViewGroup) mKeyboardAccessoryRef.get().getChildAt(0))
-                        .getChildAt(0)
-                        .performClick();
+                ((HorizontalScrollView) mKeyboardAccessoryRef.get()).scrollTo(2000, 0);
+            }
+        });
+        assertTrue("First suggestion should be off the screen after manual scroll.",
+                CriteriaHelper.pollForUIThreadCriteria(new Criteria() {
+                    @Override
+                    public boolean isSatisfied() {
+                        View suggestion = getSuggestionAt(0);
+                        if (suggestion != null) {
+                            int[] location = new int[2];
+                            suggestion.getLocationOnScreen(location);
+                            return location[0] < 0;
+                        } else {
+                            return false;
+                        }
+                    }
+                }));
+        DOMUtils.clickNode(this, mViewCoreRef.get(), "ln");
+        assertTrue("First suggestion should be on the screen after switching fields.",
+                CriteriaHelper.pollForUIThreadCriteria(new Criteria() {
+                    @Override
+                    public boolean isSatisfied() {
+                        int[] location = new int[2];
+                        getSuggestionAt(0).getLocationOnScreen(location);
+                        return location[0] > 0;
+                    }
+                }));
+    }
+
+    /**
+     * Switching fields in RTL should re-scroll the keyboard accessory to the right.
+     */
+    @MediumTest
+    @Feature({"keyboard-accessory"})
+    public void testSwitchFieldsRescrollsKeyboardAccessoryRtl() throws ExecutionException,
+             InterruptedException, TimeoutException {
+        loadTestPage(true);
+        DOMUtils.clickNode(this, mViewCoreRef.get(), "fn");
+        assertTrue("Keyboard should be showing.",
+                CriteriaHelper.pollForUIThreadCriteria(new Criteria() {
+                    @Override
+                    public boolean isSatisfied() {
+                        return UiUtils.isKeyboardShowing(getActivity(), mContainerRef.get());
+                    }
+                }));
+        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
+            @Override
+            public void run() {
+                ((HorizontalScrollView) mKeyboardAccessoryRef.get()).scrollTo(0, 0);
+            }
+        });
+        assertTrue("Last suggestion should be on the screen after manual scroll.",
+                CriteriaHelper.pollForUIThreadCriteria(new Criteria() {
+                    @Override
+                    public boolean isSatisfied() {
+                        View suggestion = getSuggestionAt(2);
+                        if (suggestion != null) {
+                            int[] location = new int[2];
+                            suggestion.getLocationOnScreen(location);
+                            return location[0] > 0;
+                        } else {
+                            return false;
+                        }
+                    }
+                }));
+        DOMUtils.clickNode(this, mViewCoreRef.get(), "ln");
+        assertTrue("Last suggestion should be off the screen after switching fields.",
+                CriteriaHelper.pollForUIThreadCriteria(new Criteria() {
+                    @Override
+                    public boolean isSatisfied() {
+                        View suggestion = getSuggestionAt(2);
+                        if (suggestion != null) {
+                            int[] location = new int[2];
+                            suggestion.getLocationOnScreen(location);
+                            return location[0] < 0;
+                        } else {
+                            return false;
+                        }
+                    }
+                }));
+    }
+
+    /**
+     * Selecting a keyboard accessory suggestion should hide the keyboard and its keyboard
+     * accessory.
+     */
+    @MediumTest
+    @Feature({"keyboard-accessory"})
+    public void testSelectSuggestionHidesKeyboardAccessory() throws ExecutionException,
+             InterruptedException, TimeoutException {
+        loadTestPage(false);
+        DOMUtils.clickNode(this, mViewCoreRef.get(), "fn");
+        assertTrue("Keyboard should be showing.",
+                CriteriaHelper.pollForUIThreadCriteria(new Criteria() {
+                    @Override
+                    public boolean isSatisfied() {
+                        return UiUtils.isKeyboardShowing(getActivity(), mContainerRef.get());
+                    }
+                }));
+        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
+            @Override
+            public void run() {
+                View suggestion = getSuggestionAt(0);
+                if (suggestion != null) {
+                    suggestion.performClick();
+                }
             }
         });
         assertTrue("Keyboard should be hidden.",
@@ -169,4 +278,15 @@
                     }
                 }).booleanValue());
     }
+
+    private View getSuggestionAt(int index) {
+        // The view hierarchy:
+        //   Keyboard accessory.
+        //    \--> A list of suggestions.
+        //          \--> A suggestion that can be clicked.
+        return mKeyboardAccessoryRef.get() != null
+                        && mKeyboardAccessoryRef.get().getChildAt(0) != null
+                ? ((ViewGroup) mKeyboardAccessoryRef.get().getChildAt(0)).getChildAt(index)
+                : null;
+    }
 }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/banners/AppBannerManagerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/banners/AppBannerManagerTest.java
index da264d5..3d28f8e9 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/banners/AppBannerManagerTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/banners/AppBannerManagerTest.java
@@ -21,10 +21,8 @@
 import android.widget.TextView;
 
 import org.chromium.base.ThreadUtils;
-import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.infobar.AnimationHelper;
 import org.chromium.chrome.browser.infobar.AppBannerInfoBarAndroid;
 import org.chromium.chrome.browser.infobar.AppBannerInfoBarDelegateAndroid;
@@ -44,7 +42,6 @@
 /**
  * Tests the app banners.
  */
-@CommandLineFlags.Add(ChromeSwitches.ENABLE_APP_INSTALL_ALERTS)
 public class AppBannerManagerTest extends ChromeTabbedActivityTestBase {
     private static final String NATIVE_APP_URL =
             TestHttpServerClient.getUrl("chrome/test/data/banners/play_app_test_page.html");
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelManagerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelManagerTest.java
new file mode 100644
index 0000000..5fbbdc8
--- /dev/null
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelManagerTest.java
@@ -0,0 +1,188 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser.contextualsearch;
+
+import android.content.Context;
+import android.test.InstrumentationTestCase;
+import android.test.suitebuilder.annotation.SmallTest;
+
+import org.chromium.base.test.util.Feature;
+import org.chromium.chrome.browser.compositor.bottombar.OverlayPanel;
+import org.chromium.chrome.browser.compositor.bottombar.OverlayPanel.StateChangeReason;
+import org.chromium.chrome.browser.compositor.bottombar.OverlayPanelContent;
+import org.chromium.chrome.browser.compositor.bottombar.OverlayPanelManager;
+import org.chromium.chrome.browser.compositor.bottombar.OverlayPanelManager.PanelPriority;
+import org.chromium.chrome.browser.compositor.layouts.LayoutUpdateHost;
+
+/**
+ * Class responsible for testing the OverlayPanelManager.
+ */
+public class OverlayPanelManagerTest extends InstrumentationTestCase {
+
+    // --------------------------------------------------------------------------------------------
+    // MockOverlayPanel
+    // --------------------------------------------------------------------------------------------
+
+    /**
+     * Mocks the ContextualSearchPanel, so it doesn't create ContentViewCore.
+     */
+    public static class MockOverlayPanel extends OverlayPanel {
+
+        private PanelPriority mPriority;
+        private boolean mCanBeSuppressed;
+
+        public MockOverlayPanel(Context context, LayoutUpdateHost updateHost,
+                OverlayPanelManager panelManager, PanelPriority priority,
+                boolean canBeSuppressed) {
+            super(context, updateHost, panelManager);
+            mPriority = priority;
+            mCanBeSuppressed = canBeSuppressed;
+        }
+
+        @Override
+        public OverlayPanelContent createNewOverlayPanelContent() {
+            return new MockOverlayPanelContent();
+        }
+
+        @Override
+        public PanelPriority getPriority() {
+            return mPriority;
+        }
+
+        @Override
+        public boolean canBeSuppressed() {
+            return mCanBeSuppressed;
+        }
+
+        @Override
+        public void closePanel(StateChangeReason reason, boolean animate) {
+            // Immediately call onClosed rather than wait for animation to finish.
+            onClosed(reason);
+        }
+
+        /**
+         * Override creation and destruction of the ContentViewCore as they rely on native methods.
+         */
+        private static class MockOverlayPanelContent extends OverlayPanelContent {
+            public MockOverlayPanelContent() {
+                super(null, null, null);
+            }
+
+            @Override
+            public void removeLastHistoryEntry(String url, long timeInMs) {}
+        }
+
+        @Override
+        protected float getPeekPromoHeight() {
+            // Android Views are not used in this test so we cannot get the actual height.
+            return 0.f;
+        }
+    }
+
+    // --------------------------------------------------------------------------------------------
+    // Test Suite
+    // --------------------------------------------------------------------------------------------
+
+    @SmallTest
+    @Feature({"OverlayPanel"})
+    public void testPanelRequestingShow() {
+        Context context = getInstrumentation().getTargetContext();
+
+        OverlayPanelManager panelManager = new OverlayPanelManager();
+        OverlayPanel panel =
+                new MockOverlayPanel(context, null, panelManager, PanelPriority.MEDIUM, false);
+
+        panel.requestPanelShow(StateChangeReason.UNKNOWN);
+
+        assertTrue(panelManager.getActivePanel() == panel);
+    }
+
+    @SmallTest
+    @Feature({"OverlayPanel"})
+    public void testPanelClosed() {
+        Context context = getInstrumentation().getTargetContext();
+
+        OverlayPanelManager panelManager = new OverlayPanelManager();
+        OverlayPanel panel =
+                new MockOverlayPanel(context, null, panelManager, PanelPriority.MEDIUM, false);
+
+        panel.requestPanelShow(StateChangeReason.UNKNOWN);
+        panel.closePanel(StateChangeReason.UNKNOWN, false);
+
+        assertTrue(panelManager.getActivePanel() == null);
+    }
+
+    @SmallTest
+    @Feature({"OverlayPanel"})
+    public void testHighPrioritySuppressingLowPriority() {
+        Context context = getInstrumentation().getTargetContext();
+
+        OverlayPanelManager panelManager = new OverlayPanelManager();
+        OverlayPanel lowPriorityPanel =
+                new MockOverlayPanel(context, null, panelManager, PanelPriority.LOW, false);
+        OverlayPanel highPriorityPanel =
+                new MockOverlayPanel(context, null, panelManager, PanelPriority.HIGH, false);
+
+        lowPriorityPanel.requestPanelShow(StateChangeReason.UNKNOWN);
+        highPriorityPanel.requestPanelShow(StateChangeReason.UNKNOWN);
+
+        assertTrue(panelManager.getActivePanel() == highPriorityPanel);
+    }
+
+    @SmallTest
+    @Feature({"OverlayPanel"})
+    public void testSuppressedPanelRestored() {
+        Context context = getInstrumentation().getTargetContext();
+
+        OverlayPanelManager panelManager = new OverlayPanelManager();
+        OverlayPanel lowPriorityPanel =
+                new MockOverlayPanel(context, null, panelManager, PanelPriority.LOW, true);
+        OverlayPanel highPriorityPanel =
+                new MockOverlayPanel(context, null, panelManager, PanelPriority.HIGH, false);
+
+        lowPriorityPanel.requestPanelShow(StateChangeReason.UNKNOWN);
+        highPriorityPanel.requestPanelShow(StateChangeReason.UNKNOWN);
+        highPriorityPanel.closePanel(StateChangeReason.UNKNOWN, false);
+
+        assertTrue(panelManager.getActivePanel() == lowPriorityPanel);
+    }
+
+    @SmallTest
+    @Feature({"OverlayPanel"})
+    public void testUnsuppressiblePanelNotRestored() {
+        Context context = getInstrumentation().getTargetContext();
+
+        OverlayPanelManager panelManager = new OverlayPanelManager();
+        OverlayPanel lowPriorityPanel =
+                new MockOverlayPanel(context, null, panelManager, PanelPriority.LOW, false);
+        OverlayPanel highPriorityPanel =
+                new MockOverlayPanel(context, null, panelManager, PanelPriority.HIGH, false);
+
+        lowPriorityPanel.requestPanelShow(StateChangeReason.UNKNOWN);
+        highPriorityPanel.requestPanelShow(StateChangeReason.UNKNOWN);
+        highPriorityPanel.closePanel(StateChangeReason.UNKNOWN, false);
+
+        assertTrue(panelManager.getActivePanel() == null);
+    }
+
+    @SmallTest
+    @Feature({"OverlayPanel"})
+    public void testSuppressedPanelClosedBeforeRestore() {
+        Context context = getInstrumentation().getTargetContext();
+
+        OverlayPanelManager panelManager = new OverlayPanelManager();
+        OverlayPanel lowPriorityPanel =
+                new MockOverlayPanel(context, null, panelManager, PanelPriority.LOW, true);
+        OverlayPanel highPriorityPanel =
+                new MockOverlayPanel(context, null, panelManager, PanelPriority.HIGH, false);
+
+        lowPriorityPanel.requestPanelShow(StateChangeReason.UNKNOWN);
+        highPriorityPanel.requestPanelShow(StateChangeReason.UNKNOWN);
+        lowPriorityPanel.closePanel(StateChangeReason.UNKNOWN, false);
+        highPriorityPanel.closePanel(StateChangeReason.UNKNOWN, false);
+
+        assertTrue(panelManager.getActivePanel() == null);
+    }
+}
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchEventFilterTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchEventFilterTest.java
index 95bc4cc..ac8d0521 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchEventFilterTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchEventFilterTest.java
@@ -13,7 +13,9 @@
 import android.view.ViewConfiguration;
 
 import org.chromium.base.test.util.Feature;
+import org.chromium.chrome.browser.compositor.bottombar.OverlayPanel;
 import org.chromium.chrome.browser.compositor.bottombar.OverlayPanelContent;
+import org.chromium.chrome.browser.compositor.bottombar.OverlayPanelManager;
 import org.chromium.chrome.browser.compositor.bottombar.contextualsearch.ContextualSearchPanel;
 import org.chromium.chrome.browser.compositor.eventfilter.MockEventFilterHost;
 import org.chromium.chrome.browser.compositor.layouts.LayoutUpdateHost;
@@ -105,8 +107,8 @@
      */
     public class ContextualSearchEventFilterWrapper extends ContextualSearchEventFilter {
         public ContextualSearchEventFilterWrapper(Context context, EventFilterHost host,
-                GestureHandler handler, ContextualSearchPanel contextualSearchPanel) {
-            super(context, host, handler, contextualSearchPanel);
+                GestureHandler handler, OverlayPanelManager panelManager) {
+            super(context, host, handler, panelManager);
         }
 
         @Override
@@ -131,8 +133,9 @@
      */
     public static class MockContextualSearchPanel extends ContextualSearchPanel {
 
-        public MockContextualSearchPanel(Context context, LayoutUpdateHost updateHost) {
-            super(context, updateHost);
+        public MockContextualSearchPanel(Context context, LayoutUpdateHost updateHost,
+                OverlayPanelManager panelManager) {
+            super(context, updateHost, panelManager);
         }
 
         @Override
@@ -165,6 +168,30 @@
     }
 
     // --------------------------------------------------------------------------------------------
+    // MockOverlayPanelManager
+    // --------------------------------------------------------------------------------------------
+
+    /**
+     * OverlayPanelManager that always returns the MockContextualSearchPanel as the active
+     * panel.
+     */
+    private static class MockOverlayPanelManager extends OverlayPanelManager {
+        private OverlayPanel mPanel;
+
+        public MockOverlayPanelManager() {
+        }
+
+        public void setOverlayPanel(OverlayPanel panel) {
+            mPanel = panel;
+        }
+
+        @Override
+        public OverlayPanel getActivePanel() {
+            return mPanel;
+        }
+    }
+
+    // --------------------------------------------------------------------------------------------
     // Test Suite
     // --------------------------------------------------------------------------------------------
 
@@ -178,9 +205,11 @@
         mTouchSlopDp = ViewConfiguration.get(context).getScaledTouchSlop() / mDpToPx;
 
         EventFilterHost eventFilterHost = new MockEventFilterHostWrapper(context);
-        mContextualSearchPanel = new MockContextualSearchPanel(context, null);
+        MockOverlayPanelManager panelManager = new MockOverlayPanelManager();
+        mContextualSearchPanel = new MockContextualSearchPanel(context, null, panelManager);
+        panelManager.setOverlayPanel(mContextualSearchPanel);
         mEventFilter = new ContextualSearchEventFilterWrapper(context, eventFilterHost, this,
-                mContextualSearchPanel);
+                panelManager);
 
         mContextualSearchPanel.setSearchBarHeightForTesting(SEARCH_BAR_HEIGHT_DP);
         mContextualSearchPanel.setHeightForTesting(LAYOUT_HEIGHT_DP);
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchFakeServer.java b/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchFakeServer.java
index 1538001..1648061a 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchFakeServer.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchFakeServer.java
@@ -270,10 +270,10 @@
         }
 
         @Override
-        public void loadUrl(String url) {
+        public void loadUrl(String url, boolean shouldLoadImmediately) {
             mLoadedUrl = url;
             mLoadedUrlCount++;
-            super.loadUrl(url);
+            super.loadUrl(url, shouldLoadImmediately);
         }
 
         @Override
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManagerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManagerTest.java
index ea6d261..521b80b 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManagerTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManagerTest.java
@@ -380,7 +380,7 @@
      */
     private void fakeContentViewDidNavigate(boolean isFailure) {
         String url = mFakeServer.getLoadedUrl();
-        mManager.getOverlayContentDelegate().onMainFrameNavigation(url, isFailure);
+        mManager.getOverlayContentDelegate().onMainFrameNavigation(url, false, isFailure);
     }
 
     /**
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/OfflinePageBridgeTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/OfflinePageBridgeTest.java
index 1f95aaf..d99121d 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/OfflinePageBridgeTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/OfflinePageBridgeTest.java
@@ -151,7 +151,7 @@
                         getActivity().getActivityTab().getWebContents());
 
                 mOfflinePageBridge.savePage(getActivity().getActivityTab().getWebContents(),
-                        BOOKMARK_ID, getActivity().getWindowAndroid(), new SavePageCallback() {
+                        BOOKMARK_ID, new SavePageCallback() {
                             @Override
                             public void onSavePageDone(int savePageResult, String url) {
                                 assertEquals(
@@ -190,15 +190,13 @@
         ThreadUtils.runOnUiThreadBlocking(new Runnable() {
             @Override
             public void run() {
-                mOfflinePageBridge.deletePage(
-                        BOOKMARK_ID, getActivity().getWindowAndroid(), new DeletePageCallback() {
-                            @Override
-                            public void onDeletePageDone(int deletePageResult) {
-                                assertEquals("Delete result incorrect.", expectedResult,
-                                        deletePageResult);
-                                semaphore.release();
-                            }
-                        });
+                mOfflinePageBridge.deletePage(BOOKMARK_ID, new DeletePageCallback() {
+                    @Override
+                    public void onDeletePageDone(int deletePageResult) {
+                        assertEquals("Delete result incorrect.", expectedResult, deletePageResult);
+                        semaphore.release();
+                    }
+                });
             }
         });
         assertTrue(semaphore.tryAcquire(TIMEOUT_MS, TimeUnit.MILLISECONDS));
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/tab/TabTestUtils.java b/chrome/android/javatests/src/org/chromium/chrome/browser/tab/TabTestUtils.java
new file mode 100644
index 0000000..41b4f7b8
--- /dev/null
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/tab/TabTestUtils.java
@@ -0,0 +1,61 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser.tab;
+
+import org.chromium.base.ObserverList.RewindableIterator;
+
+/**
+ * Exposes helper functions to be used in tests to instrument tab interaction.
+ */
+public class TabTestUtils {
+
+    /**
+     * Simulates the first visually non empty paint for the given |tab|.
+     * @param tab Tab on which the simulated event will be sent.
+     */
+    public static void simulateFirstVisuallyNonEmptyPaint(Tab tab) {
+        RewindableIterator<TabObserver> observers = tab.getTabObservers();
+        while (observers.hasNext()) observers.next().didFirstVisuallyNonEmptyPaint(tab);
+    }
+
+    /**
+     * Simulates page loaded for the given |tab|.
+     * @param tab Tab on which the simulated event will be sent.
+     */
+    public static void simulatePageLoadFinished(Tab tab) {
+        RewindableIterator<TabObserver> observers = tab.getTabObservers();
+        while (observers.hasNext()) observers.next().onPageLoadFinished(tab);
+    }
+
+    /**
+     * Simulates page load failed for the given |tab|.
+     * @param tab Tab on which the simulated event will be sent.
+     * @param errorCode Errorcode to send to the page.
+     */
+    public static void simulatePageLoadFailed(Tab tab, int errorCode) {
+        RewindableIterator<TabObserver> observers = tab.getTabObservers();
+        while (observers.hasNext()) observers.next().onPageLoadFailed(tab, errorCode);
+    }
+
+    /**
+     * Simulates a crash of the given |tab|.
+     * @param tab Tab on which the simulated event will be sent.
+     * @param sadTabShown Whether the sad tab was shown.
+     */
+    public static void simulateCrash(Tab tab, boolean sadTabShown) {
+        RewindableIterator<TabObserver> observers = tab.getTabObservers();
+        while (observers.hasNext()) observers.next().onCrash(tab, sadTabShown);
+    }
+
+    /**
+     * Simulates a change of theme color for the given |tab|.
+     * @param tab Tab on which the simulated event will be sent.
+     * @param color Color to send to the tab.
+     */
+    public static void simulateChangeThemeColor(Tab tab, int color) {
+        RewindableIterator<TabObserver> observers = tab.getTabObservers();
+        while (observers.hasNext()) observers.next().onDidChangeThemeColor(tab, color);
+    }
+}
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappSplashScreenTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappSplashScreenTest.java
index 45a0833e..db1a9d2 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappSplashScreenTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappSplashScreenTest.java
@@ -19,14 +19,14 @@
 import android.widget.TextView;
 
 import org.chromium.base.ApiCompatibilityUtils;
-import org.chromium.base.ObserverList.RewindableIterator;
 import org.chromium.base.ThreadUtils;
 import org.chromium.base.metrics.RecordHistogram;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ShortcutHelper;
 import org.chromium.chrome.browser.metrics.WebappUma;
-import org.chromium.chrome.browser.tab.TabObserver;
+import org.chromium.chrome.browser.tab.Tab;
+import org.chromium.chrome.browser.tab.TabTestUtils;
 
 /**
  * Tests for splash screens.
@@ -82,11 +82,7 @@
         ThreadUtils.runOnUiThread(new Runnable() {
             @Override
             public void run() {
-                RewindableIterator<TabObserver> observers =
-                        getActivity().getActivityTab().getTabObservers();
-                while (observers.hasNext()) {
-                    observers.next().didFirstVisuallyNonEmptyPaint(getActivity().getActivityTab());
-                }
+                TabTestUtils.simulateFirstVisuallyNonEmptyPaint(getActivity().getActivityTab());
             }
         });
 
@@ -102,11 +98,7 @@
         ThreadUtils.runOnUiThread(new Runnable() {
             @Override
             public void run() {
-                RewindableIterator<TabObserver> observers =
-                        getActivity().getActivityTab().getTabObservers();
-                while (observers.hasNext()) {
-                    observers.next().onCrash(getActivity().getActivityTab(), true);
-                }
+                TabTestUtils.simulateCrash(getActivity().getActivityTab(), true);
             }
         });
 
@@ -122,11 +114,7 @@
         ThreadUtils.runOnUiThread(new Runnable() {
             @Override
             public void run() {
-                RewindableIterator<TabObserver> observers =
-                        getActivity().getActivityTab().getTabObservers();
-                while (observers.hasNext()) {
-                    observers.next().onPageLoadFinished(getActivity().getActivityTab());
-                }
+                TabTestUtils.simulatePageLoadFinished(getActivity().getActivityTab());
             }
         });
 
@@ -142,11 +130,7 @@
         ThreadUtils.runOnUiThread(new Runnable() {
             @Override
             public void run() {
-                RewindableIterator<TabObserver> observers =
-                        getActivity().getActivityTab().getTabObservers();
-                while (observers.hasNext()) {
-                    observers.next().onPageLoadFailed(getActivity().getActivityTab(), 0);
-                }
+                TabTestUtils.simulatePageLoadFailed(getActivity().getActivityTab(), 0);
             }
         });
 
@@ -162,21 +146,11 @@
         ThreadUtils.runOnUiThread(new Runnable() {
             @Override
             public void run() {
-                RewindableIterator<TabObserver> observers =
-                        getActivity().getActivityTab().getTabObservers();
-                while (observers.hasNext()) {
-                    observers.next().onPageLoadFinished(getActivity().getActivityTab());
-                }
+                Tab tab = getActivity().getActivityTab();
 
-                observers.rewind();
-                while (observers.hasNext()) {
-                    observers.next().onPageLoadFailed(getActivity().getActivityTab(), 0);
-                }
-
-                observers.rewind();
-                while (observers.hasNext()) {
-                    observers.next().didFirstVisuallyNonEmptyPaint(getActivity().getActivityTab());
-                }
+                TabTestUtils.simulatePageLoadFinished(tab);
+                TabTestUtils.simulatePageLoadFailed(tab, 0);
+                TabTestUtils.simulateFirstVisuallyNonEmptyPaint(tab);
             }
         });
 
@@ -223,11 +197,7 @@
         ThreadUtils.runOnUiThread(new Runnable() {
             @Override
             public void run() {
-                RewindableIterator<TabObserver> observers =
-                        getActivity().getActivityTab().getTabObservers();
-                while (observers.hasNext()) {
-                    observers.next().didFirstVisuallyNonEmptyPaint(getActivity().getActivityTab());
-                }
+                TabTestUtils.simulateFirstVisuallyNonEmptyPaint(getActivity().getActivityTab());
             }
         });
 
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappSplashScreenThemeColorTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappSplashScreenThemeColorTest.java
index 5efeb9b..3bfecf3 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappSplashScreenThemeColorTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappSplashScreenThemeColorTest.java
@@ -10,13 +10,12 @@
 import android.os.Build;
 import android.test.suitebuilder.annotation.SmallTest;
 
-import org.chromium.base.ObserverList.RewindableIterator;
 import org.chromium.base.ThreadUtils;
 import org.chromium.base.metrics.RecordHistogram;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.browser.ShortcutHelper;
 import org.chromium.chrome.browser.metrics.WebappUma;
-import org.chromium.chrome.browser.tab.TabObserver;
+import org.chromium.chrome.browser.tab.TabTestUtils;
 import org.chromium.chrome.browser.util.ColorUtils;
 import org.chromium.content.browser.test.util.Criteria;
 import org.chromium.content.browser.test.util.CriteriaHelper;
@@ -59,12 +58,7 @@
         ThreadUtils.runOnUiThread(new Runnable() {
             @Override
             public void run() {
-                RewindableIterator<TabObserver> observers =
-                        getActivity().getActivityTab().getTabObservers();
-                while (observers.hasNext()) {
-                    observers.next().onDidChangeThemeColor(
-                            getActivity().getActivityTab(), Color.GREEN);
-                }
+                TabTestUtils.simulateChangeThemeColor(getActivity().getActivityTab(), Color.GREEN);
             }
         });
 
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/widget/findinpage/FindTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/widget/findinpage/FindTest.java
index ccb4f7b..163b5c9 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/widget/findinpage/FindTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/widget/findinpage/FindTest.java
@@ -10,8 +10,13 @@
 
 package org.chromium.chrome.browser.widget.findinpage;
 
+import android.content.ClipData;
+import android.content.ClipboardManager;
+import android.content.Context;
 import android.test.suitebuilder.annotation.MediumTest;
 import android.test.suitebuilder.annotation.SmallTest;
+import android.text.Spannable;
+import android.text.style.StyleSpan;
 import android.view.KeyCharacterMap;
 import android.view.KeyEvent;
 import android.view.View;
@@ -80,10 +85,9 @@
             throws InterruptedException {
         findInPageFromMenu();
         // FindToolbar should automatically get focus.
-        assertTrue("FindToolbar should have focus",
-                getActivity().findViewById(R.id.find_query).hasFocus());
-        final TextView findQueryText = (TextView) getActivity().findViewById(R.id.find_query);
-        assertNotNull(findQueryText);
+        final TextView findQueryText = getFindQueryText();
+        assertTrue("FindToolbar should have focus", findQueryText.hasFocus());
+
         // We have to send each key 1-by-1 to trigger the right listeners in the toolbar.
         KeyCharacterMap keyCharacterMap = KeyCharacterMap.load(KeyCharacterMap.VIRTUAL_KEYBOARD);
         final KeyEvent[] events = keyCharacterMap.getEvents(query.toCharArray());
@@ -110,6 +114,18 @@
                 findResults.contains(expectedResult));
     }
 
+    private FindToolbar getFindToolbar() {
+        final FindToolbar findToolbar = (FindToolbar) getActivity().findViewById(R.id.find_toolbar);
+        assertNotNull("FindToolbar not found", findToolbar);
+        return findToolbar;
+    }
+
+    private EditText getFindQueryText() {
+        final EditText findQueryText = (EditText) getActivity().findViewById(R.id.find_query);
+        assertNotNull("FindQueryText not found", findQueryText);
+        return findQueryText;
+    }
+
     /**
      * Verify Find In Page is not case sensitive.
      */
@@ -188,8 +204,9 @@
     public void testResultsBarInitiallyVisible() throws InterruptedException {
         loadUrl(TestHttpServerClient.getUrl(FILEPATH));
         findInPageFromMenu();
-        FindToolbar findToolbar = (FindToolbar) getActivity().findViewById(R.id.find_toolbar);
-        View resultBar = findToolbar.getFindResultBar();
+        final FindToolbar findToolbar = getFindToolbar();
+        final View resultBar = findToolbar.getFindResultBar();
+        assertNotNull(resultBar);
         assertEquals(View.VISIBLE, resultBar.getVisibility());
     }
 
@@ -198,11 +215,10 @@
     public void testResultsBarVisibleAfterTypingText() throws InterruptedException {
         loadUrl(TestHttpServerClient.getUrl(FILEPATH));
         findInPageFromMenu();
-        FindToolbar findToolbar = (FindToolbar) getActivity().findViewById(R.id.find_toolbar);
-        View resultBar = findToolbar.getFindResultBar();
+        final FindToolbar findToolbar = getFindToolbar();
+        final View resultBar = findToolbar.getFindResultBar();
         assertNotNull(resultBar);
-        final TextView findQueryText = (TextView) findToolbar.findViewById(R.id.find_query);
-        assertNotNull(findQueryText);
+        final TextView findQueryText = getFindQueryText();
 
         KeyUtils.singleKeyEventView(getInstrumentation(), findQueryText, KeyEvent.KEYCODE_T);
         assertEquals(View.VISIBLE, resultBar.getVisibility());
@@ -220,11 +236,9 @@
         loadUrl(TestHttpServerClient.getUrl(FILEPATH));
         findInPageFromMenu();
 
-        FindToolbar findToolbar = (FindToolbar) getActivity().findViewById(R.id.find_toolbar);
-        assertNotNull(findToolbar);
+        final FindToolbar findToolbar = getFindToolbar();
         assertEquals(View.VISIBLE, findToolbar.getVisibility());
-        final TextView findQueryText = (TextView) findToolbar.findViewById(R.id.find_query);
-        assertNotNull(findQueryText);
+        final TextView findQueryText = getFindQueryText();
         KeyUtils.singleKeyEventView(getInstrumentation(), findQueryText, KeyEvent.KEYCODE_T);
         KeyUtils.singleKeyEventView(getInstrumentation(), findQueryText, KeyEvent.KEYCODE_DEL);
         KeyUtils.singleKeyEventView(getInstrumentation(), findQueryText, KeyEvent.KEYCODE_ENTER);
@@ -268,11 +282,43 @@
         findInPageFromMenu();
         UiUtils.settleDownUI(getInstrumentation());
         // Verify the text content.
-        EditText e = (EditText) getActivity().findViewById(R.id.find_query);
+        final EditText e = getFindQueryText();
         String myText = e.getText().toString();
         assertTrue("expected empty string : " + myText, myText.isEmpty());
     }
 
+    /**
+     * Verify pasted text in the FindQuery text box doesn't retain formatting
+     */
+    @SmallTest
+    @Feature({"FindInPage"})
+    public void testPastedTextStylingRemoved() throws InterruptedException {
+        loadUrl(TestHttpServerClient.getUrl(FILEPATH));
+        findInPageFromMenu();
+
+        final FindToolbar findToolbar = getFindToolbar();
+        assertEquals(View.VISIBLE, findToolbar.getVisibility());
+        final EditText findQueryText = getFindQueryText();
+
+        // Setup the clipboard with a selection of stylized text
+        ClipboardManager clipboard = (ClipboardManager) (getInstrumentation().getTargetContext())
+                .getSystemService(Context.CLIPBOARD_SERVICE);
+        clipboard.setPrimaryClip(ClipData.newHtmlText("label", "text", "<b>text</b>"));
+
+        // Emulate pasting the text into the find query text box
+        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
+            @Override
+            public void run() {
+                findQueryText.onTextContextMenuItem(android.R.id.paste);
+            }
+        });
+
+        // Resulting text in the find query box should be unstyled
+        final Spannable text = findQueryText.getText();
+        final StyleSpan[] spans = text.getSpans(0, text.length(), StyleSpan.class);
+        assertEquals(0, spans.length);
+    }
+
     @Override
     public void startMainActivity() throws InterruptedException {
         startMainActivityOnBlankPage();
diff --git a/chrome/app/chromium_strings.grd b/chrome/app/chromium_strings.grd
index 4e2cbfe..11496fa0 100644
--- a/chrome/app/chromium_strings.grd
+++ b/chrome/app/chromium_strings.grd
@@ -1190,9 +1190,6 @@
       </message>
 
       <!-- SSL Interstitial V2 strings -->
-      <message name="IDS_SSL_NONOVERRIDABLE_MORE_INVALID_SP3" desc="Body text for the explanation shown if the user clicks on the details windows, the certificate is invalid and the user has an old version of Windows (before WINDOWS XP SP3) running.">
-      Your computer is running an old version of Microsoft Windows that cannot process this website's security certificate. Because of this problem, Chromium can't tell whether the certificate came from <ph name="SITE">$1<ex>google.com</ex></ph> or from someone on your network pretending to be <ph name="SITE">$1<ex>google.com</ex></ph>. Please update your computer to a more recent version of Windows.
-      </message>
       <message name="IDS_SSL_NONOVERRIDABLE_MORE" desc="Body text for the explanation shown if user clicks on the Details button.">
         <ph name="SITE">$1<ex>google.com</ex></ph> normally uses encryption to protect your information. When Chromium tried to connect to <ph name="SITE">$1<ex>google.com</ex></ph> this time, the website sent back unusual
 and incorrect credentials. This may happen when an attacker is trying to pretend to be <ph name="SITE">$1<ex>google.com</ex></ph>, or a Wi-Fi sign-in screen has interrupted the connection. Your information is still secure because Chromium stopped the connection before any data was exchanged.
diff --git a/chrome/app/file_pre_reader_win.cc b/chrome/app/file_pre_reader_win.cc
new file mode 100644
index 0000000..fb8febb
--- /dev/null
+++ b/chrome/app/file_pre_reader_win.cc
@@ -0,0 +1,104 @@
+// 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 "chrome/app/file_pre_reader_win.h"
+
+#include <windows.h>
+#include <stdint.h>
+
+#include "base/files/file.h"
+#include "base/logging.h"
+#include "base/scoped_native_library.h"
+#include "base/threading/thread_restrictions.h"
+#include "base/win/pe_image.h"
+#include "base/win/windows_version.h"
+
+namespace {
+
+// A helper function to touch all pages in the range
+// [base_addr, base_addr + length).
+void TouchPagesInRange(const void* base_addr, uint32_t length) {
+  DCHECK(base_addr);
+  DCHECK_GT(length, static_cast<uint32_t>(0));
+
+  // Get the system info so we know the page size. Also, make sure we use a
+  // non-zero value for the page size; GetSystemInfo() is hookable/patchable,
+  // and you never know what shenanigans someone could get up to.
+  SYSTEM_INFO system_info = {};
+  ::GetSystemInfo(&system_info);
+  if (system_info.dwPageSize == 0)
+    system_info.dwPageSize = 4096;
+
+  // We don't want to read outside the byte range (which could trigger an
+  // access violation), so let's figure out the exact locations of the first
+  // and final bytes we want to read.
+  volatile uint8_t const* touch_ptr =
+      reinterpret_cast<uint8_t const*>(base_addr);
+  volatile uint8_t const* final_touch_ptr = touch_ptr + length - 1;
+
+  // Read the memory in the range [touch_ptr, final_touch_ptr] with a stride
+  // of the system page size, to ensure that it's been paged in.
+  uint8_t dummy;
+  for (; touch_ptr < final_touch_ptr; touch_ptr += system_info.dwPageSize)
+    dummy = *touch_ptr;
+  dummy = *final_touch_ptr;
+}
+
+}  // namespace
+
+bool PreReadFile(const base::FilePath& file_path, int step_size) {
+  DCHECK_GT(step_size, 0);
+  base::ThreadRestrictions::AssertIOAllowed();
+
+  if (base::win::GetVersion() > base::win::VERSION_XP) {
+    // Vista+ branch. On these OSes, the forced reads through the file actually
+    // slows warm starts. The solution is to sequentially read file contents.
+    base::File file(file_path, base::File::FLAG_OPEN | base::File::FLAG_READ |
+                                   base::File::FLAG_SEQUENTIAL_SCAN);
+    if (!file.IsValid())
+      return false;
+
+    char* buffer = reinterpret_cast<char*>(::VirtualAlloc(
+        nullptr, static_cast<DWORD>(step_size), MEM_COMMIT, PAGE_READWRITE));
+    if (!buffer)
+      return false;
+
+    while (file.ReadAtCurrentPos(buffer, step_size) > 0) {}
+
+    ::VirtualFree(buffer, 0, MEM_RELEASE);
+  } else {
+    // WinXP branch. Here, reading the DLL from disk doesn't do what we want so
+    // instead we pull the pages into memory and touch pages at a stride. We use
+    // the system's page size as the stride, ignoring the passed in |step_size|,
+    // to make sure each page in the range is touched.
+
+    // Don't show an error popup when |file_path| is not a valid PE file.
+    UINT previous_error_mode = ::SetErrorMode(SEM_FAILCRITICALERRORS);
+    ::SetErrorMode(previous_error_mode | SEM_FAILCRITICALERRORS);
+
+    base::ScopedNativeLibrary dll_module(::LoadLibraryExW(
+        file_path.value().c_str(), NULL,
+        LOAD_WITH_ALTERED_SEARCH_PATH | DONT_RESOLVE_DLL_REFERENCES));
+
+    ::SetErrorMode(previous_error_mode);
+
+    // Pre-reading non-PE files is not supported on XP.
+    if (!dll_module.is_valid())
+      return false;
+
+    base::win::PEImage pe_image(dll_module.get());
+    if (!pe_image.VerifyMagic())
+      return false;
+
+    // We don't want to read past the end of the module (which could trigger
+    // an access violation), so make sure to check the image size.
+    PIMAGE_NT_HEADERS nt_headers = pe_image.GetNTHeaders();
+    const uint32_t dll_module_length = nt_headers->OptionalHeader.SizeOfImage;
+
+    // Page in the module.
+    TouchPagesInRange(dll_module.get(), dll_module_length);
+  }
+
+  return true;
+}
diff --git a/chrome/app/file_pre_reader_win.h b/chrome/app/file_pre_reader_win.h
new file mode 100644
index 0000000..bf7008b
--- /dev/null
+++ b/chrome/app/file_pre_reader_win.h
@@ -0,0 +1,23 @@
+// 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.
+
+// This file defines a function to pre-read a file in order to avoid touching
+// the disk when it is subsequently used.
+
+#ifndef CHROME_APP_FILE_PRE_READER_WIN_H_
+#define CHROME_APP_FILE_PRE_READER_WIN_H_
+
+namespace base {
+class FilePath;
+}
+
+// Reads |file_path| to avoid touching the disk when the file is actually used.
+// The function checks the Windows version to determine which pre-reading
+// mechanism to use. On Vista+, chunks of |step_size| bytes are read into a
+// buffer. The bigger |step_size| is, the faster the file is pre-read (up to
+// about 4MB according to local tests), but also the more memory is allocated
+// for the buffer. On XP, pre-reading non-PE files is not supported.
+bool PreReadFile(const base::FilePath& file_path, int step_size);
+
+#endif  // CHROME_APP_FILE_PRE_READER_WIN_H_
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd
index 94319662..06591e4 100644
--- a/chrome/app/generated_resources.grd
+++ b/chrome/app/generated_resources.grd
@@ -5918,14 +5918,6 @@
       <message name="IDS_FLAGS_ALLOW_NACL_SOCKET_API_DESCRIPTION" desc="Description for the NaCl Socket API feature.">
         Allows applications to use NaCl Socket API. Use only to test NaCl plugins.
       </message>
-      <if expr="enable_plugins">
-        <message name="IDS_FLAGS_ENABLE_PLUGIN_POWER_SAVER_NAME" desc="Name for the flag to force on the Plugin Power Saver feature.">
-          Enable Plugin Power Saver
-        </message>
-        <message name="IDS_FLAGS_ENABLE_PLUGIN_POWER_SAVER_DESCRIPTION" desc="Description of the flag to force on the Plugin Power Saver feature.">
-          Force on the experimental power saver mode for peripheral plugin content. Overrides content settings.
-        </message>
-      </if>
       <message name="IDS_FLAGS_ENABLE_PINCH_SCALE_NAME" desc="Name of the flag to turn on experiental pinch to scale.">
         Enable pinch scale.
       </message>
diff --git a/chrome/app/google_chrome_strings.grd b/chrome/app/google_chrome_strings.grd
index 0e715e5..83e23ef 100644
--- a/chrome/app/google_chrome_strings.grd
+++ b/chrome/app/google_chrome_strings.grd
@@ -1192,9 +1192,6 @@
       </message>
 
       <!-- SSL Interstitial V2 strings -->
-      <message name="IDS_SSL_NONOVERRIDABLE_MORE_INVALID_SP3" desc="Body text for the explanation shown if the user clicks on the details windows, the certificate is invalid and the user has an old version of Windows (before WINDOWS XP SP3) running.">
-      Your computer is running an old version of Microsoft Windows that cannot process this website's security certificate. Because of this problem, Google Chrome can't tell whether the certificate came from <ph name="SITE">$1<ex>google.com</ex></ph> or from someone on your network pretending to be <ph name="SITE">$1<ex>google.com</ex></ph>. Please update your computer to a more recent version of Windows.
-      </message>
       <message name="IDS_SSL_NONOVERRIDABLE_MORE" desc="Body text for the explanation shown if user clicks on the Details button.">
         <ph name="SITE">$1<ex>google.com</ex></ph> normally uses encryption to protect your information. When Chrome tried to connect to <ph name="SITE">$1<ex>google.com</ex></ph> this time, the website sent back unusual
   and incorrect credentials. This may happen when an attacker is trying to pretend to be <ph name="SITE">$1<ex>google.com</ex></ph>, or a Wi-Fi sign-in screen has interrupted the connection. Your information is still secure because Chrome stopped the connection before any data was exchanged.
diff --git a/chrome/app/image_pre_reader_win.cc b/chrome/app/image_pre_reader_win.cc
deleted file mode 100644
index 9998a036..0000000
--- a/chrome/app/image_pre_reader_win.cc
+++ /dev/null
@@ -1,419 +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 "chrome/app/image_pre_reader_win.h"
-
-#include <windows.h>
-#include <algorithm>
-#include <limits>
-#include <vector>
-
-#include "base/logging.h"
-#include "base/memory/scoped_ptr.h"
-#include "base/threading/thread_restrictions.h"
-#include "base/win/pe_image.h"
-#include "base/win/scoped_handle.h"
-#include "base/win/windows_version.h"
-
-namespace {
-
-// The minimum buffer size to allocate when reading the PE file headers.
-//
-// The PE file headers usually fit into a single 1KB page, and a PE file must
-// at least contain the initial page with the headers. That said, as long as
-// we expect at least sizeof(IMAGE_DOS_HEADER) bytes, we're ok.
-const size_t kMinHeaderBufferSize = 0x400;
-
-// A handy symbolic constant.
-const size_t kOneHundredPercent = 100;
-
-static_assert(kMinHeaderBufferSize >= sizeof(IMAGE_DOS_HEADER),
-              "kMinHeaderBufferSize must be at least as big as the dos header");
-
-// This struct provides a deallocation functor for use with scoped_ptr<T>
-// allocated with ::VirtualAlloc().
-struct VirtualFreeDeleter {
-  void operator() (void* ptr) {
-    ::VirtualFree(ptr, 0, MEM_RELEASE);
-  }
-};
-
-// A wrapper for the Win32 ::SetFilePointer() function with some error checking.
-bool SetFilePointer(HANDLE file_handle, size_t position) {
-  return position <= static_cast<size_t>(std::numeric_limits<LONG>::max()) &&
-      ::SetFilePointer(file_handle,
-                       static_cast<LONG>(position),
-                       NULL,
-                       FILE_BEGIN) != INVALID_SET_FILE_POINTER;
-}
-
-// A helper function to read the next |bytes_to_read| bytes from the file
-// given by |file_handle| into |buffer|.
-bool ReadNextBytes(HANDLE file_handle, void* buffer, size_t bytes_to_read) {
-  DCHECK(file_handle != INVALID_HANDLE_VALUE);
-  DCHECK(buffer != NULL);
-  DCHECK(bytes_to_read > 0);
-
-  DWORD bytes_read = 0;
-  return bytes_to_read <= std::numeric_limits<DWORD>::max() &&
-      ::ReadFile(file_handle,
-                 buffer,
-                 static_cast<DWORD>(bytes_to_read),
-                 &bytes_read,
-                 NULL) &&
-      bytes_read == bytes_to_read;
-}
-
-// A helper function to extend the |current_buffer| of bytes such that it
-// contains |desired_length| bytes read from the file given by |file_handle|.
-//
-// It is assumed that |file_handle| has been used to sequentially populate
-// |current_buffer| thus far and is already positioned at the appropriate
-// read location.
-bool ReadMissingBytes(HANDLE file_handle,
-                      std::vector<uint8>* current_buffer,
-                      size_t desired_length) {
-  DCHECK(file_handle != INVALID_HANDLE_VALUE);
-  DCHECK(current_buffer != NULL);
-
-  size_t current_length = current_buffer->size();
-  if (current_length >= desired_length)
-    return true;
-
-  size_t bytes_to_read = desired_length - current_length;
-  current_buffer->resize(desired_length);
-  return ReadNextBytes(file_handle,
-                       &(current_buffer->at(current_length)),
-                       bytes_to_read);
-}
-
-// Return a |percentage| of the number of initialized bytes in the given
-// |section|.
-//
-// This returns a percentage of the lesser of the size of the raw data in
-// the section and the virtual size of the section.
-//
-// Note that sections can have their tails implicitly initialized to zero
-// (i.e., their virtual size is larger than the raw size) and that raw data
-// is padded to the PE page size if the entire section is initialized (i.e.,
-// their raw data size will be larger than the virtual size).
-//
-// Any data after the initialized portion of the section will be soft-faulted
-// in (very quickly) as needed, so we don't need to include it in the returned
-// length.
-size_t GetPercentageOfSectionLength(const IMAGE_SECTION_HEADER* section,
-                                    size_t percentage) {
-  DCHECK(section != NULL);
-  DCHECK_GT(percentage, 0u);
-  DCHECK_LE(percentage, kOneHundredPercent);
-
-  size_t initialized_length = std::min(section->SizeOfRawData,
-                                       section->Misc.VirtualSize);
-
-  if (initialized_length == 0)
-    return 0;
-
-  size_t length = (initialized_length * percentage) / kOneHundredPercent;
-
-  return std::max<size_t>(length, 1);
-}
-
-// Helper function to read through a |percentage| of the given |section|
-// of the file denoted by |file_handle|. The |temp_buffer| is (re)used as
-// a transient storage area as the section is read in chunks of
-// |temp_buffer_size| bytes.
-bool ReadThroughSection(HANDLE file_handle,
-                        const IMAGE_SECTION_HEADER* section,
-                        size_t percentage,
-                        void* temp_buffer,
-                        size_t temp_buffer_size) {
-  DCHECK(file_handle != INVALID_HANDLE_VALUE);
-  DCHECK(section != NULL);
-  DCHECK_LE(percentage, kOneHundredPercent);
-  DCHECK(temp_buffer != NULL);
-  DCHECK(temp_buffer_size > 0);
-
-  size_t bytes_to_read = GetPercentageOfSectionLength(section, percentage);
-  if (bytes_to_read == 0)
-    return true;
-
-  if (!SetFilePointer(file_handle, section->PointerToRawData))
-    return false;
-
-  // Read all chunks except the last one.
-  while (bytes_to_read > temp_buffer_size) {
-    if (!ReadNextBytes(file_handle, temp_buffer, temp_buffer_size))
-      return false;
-    bytes_to_read -= temp_buffer_size;
-  }
-
-  // Read the last (possibly partial) chunk and return.
-  DCHECK(bytes_to_read > 0);
-  DCHECK(bytes_to_read <= temp_buffer_size);
-  return ReadNextBytes(file_handle, temp_buffer, bytes_to_read);
-}
-
-// A helper function to touch all pages in the range
-// [base_addr, base_addr + length).
-void TouchPagesInRange(void* base_addr, size_t length) {
-  DCHECK(base_addr != NULL);
-  DCHECK(length > 0);
-
-  // Get the system info so we know the page size. Also, make sure we use a
-  // non-zero value for the page size; GetSystemInfo() is hookable/patchable,
-  // and you never know what shenanigans someone could get up to.
-  SYSTEM_INFO system_info = {};
-  GetSystemInfo(&system_info);
-  if (system_info.dwPageSize == 0)
-    system_info.dwPageSize = 4096;
-
-  // We don't want to read outside the byte range (which could trigger an
-  // access violation), so let's figure out the exact locations of the first
-  // and final bytes we want to read.
-  volatile uint8* touch_ptr = reinterpret_cast<uint8*>(base_addr);
-  volatile uint8* final_touch_ptr = touch_ptr + length - 1;
-
-  // Read the memory in the range [touch_ptr, final_touch_ptr] with a stride
-  // of the system page size, to ensure that it's been paged in.
-  uint8 dummy;
-  while (touch_ptr < final_touch_ptr) {
-    dummy = *touch_ptr;
-    touch_ptr += system_info.dwPageSize;
-  }
-  dummy = *final_touch_ptr;
-}
-
-}  // namespace
-
-bool ImagePreReader::PartialPreReadImageOnDisk(const wchar_t* file_path,
-                                               size_t percentage,
-                                               size_t max_chunk_size) {
-  // TODO(rogerm): change this to have the number of bytes pre-read per
-  //     section be driven by a static table within the PE file (defaulting to
-  //     full read if it's not there?) that's initialized by the optimization
-  //     toolchain.
-  DCHECK(file_path != NULL);
-
-  if (percentage == 0)
-    return true;
-
-  if (percentage > kOneHundredPercent)
-    percentage = kOneHundredPercent;
-
-  // Validate/setup max_chunk_size, imposing a 1MB minimum on the chunk size.
-  const size_t kMinChunkSize = 1024 * 1024;
-  max_chunk_size = std::max(max_chunk_size, kMinChunkSize);
-
-  // Open the file.
-  base::win::ScopedHandle file(
-      CreateFile(file_path,
-                 GENERIC_READ,
-                 FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
-                 NULL,
-                 OPEN_EXISTING,
-                 FILE_FLAG_SEQUENTIAL_SCAN,
-                 NULL));
-
-  if (!file.IsValid())
-    return false;
-
-  // Allocate a resizable buffer for the headers. We initially reserve as much
-  // space as we typically see as the header size for chrome.dll and other
-  // PE images.
-  std::vector<uint8> headers;
-  headers.reserve(kMinHeaderBufferSize);
-
-  // Read, hopefully, all of the headers.
-  if (!ReadMissingBytes(file.Get(), &headers, kMinHeaderBufferSize))
-    return false;
-
-  // The DOS header starts at offset 0 and allows us to get the offset of the
-  // NT headers. Let's ensure we've read enough to capture the NT headers.
-  size_t nt_headers_start =
-      reinterpret_cast<IMAGE_DOS_HEADER*>(&headers[0])->e_lfanew;
-  size_t nt_headers_end = nt_headers_start + sizeof(IMAGE_NT_HEADERS);
-  if (!ReadMissingBytes(file.Get(), &headers, nt_headers_end))
-    return false;
-
-  // Now that we've got the NT headers we can get the total header size,
-  // including all of the section headers. Let's ensure we've read enough
-  // to capture all of the header data.
-  size_t size_of_headers = reinterpret_cast<IMAGE_NT_HEADERS*>(
-      &headers[nt_headers_start])->OptionalHeader.SizeOfHeaders;
-  if (!ReadMissingBytes(file.Get(), &headers, size_of_headers))
-    return false;
-
-  // Now we have all of the headers. This is enough to let us use the PEImage
-  // wrapper to query the structure of the image.
-  base::win::PEImage pe_image(reinterpret_cast<HMODULE>(&headers[0]));
-  CHECK(pe_image.VerifyMagic());
-
-  // Allocate a buffer to hold the pre-read bytes.
-  scoped_ptr<uint8, VirtualFreeDeleter> buffer(
-      static_cast<uint8*>(
-          ::VirtualAlloc(NULL, max_chunk_size, MEM_COMMIT, PAGE_READWRITE)));
-  if (buffer.get() == NULL)
-    return false;
-
-  // Iterate over each section, reading in a percentage of each.
-  const IMAGE_SECTION_HEADER* section = NULL;
-  for (UINT i = 0; (section = pe_image.GetSectionHeader(i)) != NULL; ++i) {
-    CHECK_LE(reinterpret_cast<const uint8*>(section + 1),
-             &headers[0] + headers.size());
-    if (!ReadThroughSection(file.Get(), section, percentage, buffer.get(),
-                            max_chunk_size)) {
-      return false;
-    }
-  }
-
-  // We're done.
-  return true;
-}
-
-bool ImagePreReader::PartialPreReadImageInMemory(const wchar_t* file_path,
-                                                 size_t percentage) {
-  // TODO(rogerm): change this to have the number of bytes pre-read per
-  //     section be driven by a static table within the PE file (defaulting to
-  //     full read if it's not there?) that's initialized by the optimization
-  //     toolchain.
-  DCHECK(file_path != NULL);
-
-  if (percentage == 0)
-    return true;
-
-  if (percentage > kOneHundredPercent)
-    percentage = kOneHundredPercent;
-
-  HMODULE dll_module = ::LoadLibraryExW(
-      file_path,
-      NULL,
-      LOAD_WITH_ALTERED_SEARCH_PATH | DONT_RESOLVE_DLL_REFERENCES);
-
-  if (!dll_module)
-    return false;
-
-  base::win::PEImage pe_image(dll_module);
-  CHECK(pe_image.VerifyMagic());
-
-  // Iterate over each section, stepping through a percentage of each to page
-  // it in off the disk.
-  const IMAGE_SECTION_HEADER* section = NULL;
-  for (UINT i = 0; (section = pe_image.GetSectionHeader(i)) != NULL; ++i) {
-    // Get the extent we want to touch.
-    size_t length = GetPercentageOfSectionLength(section, percentage);
-    if (length == 0)
-      continue;
-    uint8* start =
-        static_cast<uint8*>(pe_image.RVAToAddr(section->VirtualAddress));
-
-    // Verify that the extent we're going to touch falls inside the section
-    // we expect it to (and by implication, inside the pe_image).
-    CHECK_EQ(section,
-             pe_image.GetImageSectionFromAddr(start));
-    CHECK_EQ(section,
-             pe_image.GetImageSectionFromAddr(start + length - 1));
-
-    // Page in the section range.
-    TouchPagesInRange(start, length);
-  }
-
-  FreeLibrary(dll_module);
-
-  return true;
-}
-
-bool ImagePreReader::PreReadImage(const wchar_t* file_path,
-                                  size_t size_to_read,
-                                  size_t step_size) {
-  base::ThreadRestrictions::AssertIOAllowed();
-  if (base::win::GetVersion() > base::win::VERSION_XP) {
-    // Vista+ branch. On these OSes, the forced reads through the DLL actually
-    // slows warm starts. The solution is to sequentially read file contents
-    // with an optional cap on total amount to read.
-    base::win::ScopedHandle file(
-        CreateFile(file_path,
-                   GENERIC_READ,
-                   FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
-                   NULL,
-                   OPEN_EXISTING,
-                   FILE_FLAG_SEQUENTIAL_SCAN,
-                   NULL));
-
-    if (!file.IsValid())
-      return false;
-
-    // Default to 1MB sequential reads.
-    const DWORD actual_step_size = std::max(static_cast<DWORD>(step_size),
-                                            static_cast<DWORD>(1024*1024));
-    LPVOID buffer = ::VirtualAlloc(NULL,
-                                   actual_step_size,
-                                   MEM_COMMIT,
-                                   PAGE_READWRITE);
-
-    if (buffer == NULL)
-      return false;
-
-    DWORD len;
-    size_t total_read = 0;
-    while (::ReadFile(file.Get(), buffer, actual_step_size, &len, NULL) &&
-           len > 0 &&
-           (size_to_read ? total_read < size_to_read : true)) {
-      total_read += static_cast<size_t>(len);
-    }
-    ::VirtualFree(buffer, 0, MEM_RELEASE);
-  } else {
-    // WinXP branch. Here, reading the DLL from disk doesn't do
-    // what we want so instead we pull the pages into memory by loading
-    // the DLL and touching pages at a stride. We use the system's page
-    // size as the stride, ignoring the passed in step_size, to make sure
-    // each page in the range is touched.
-    HMODULE dll_module = ::LoadLibraryExW(
-        file_path,
-        NULL,
-        LOAD_WITH_ALTERED_SEARCH_PATH | DONT_RESOLVE_DLL_REFERENCES);
-
-    if (!dll_module)
-      return false;
-
-    base::win::PEImage pe_image(dll_module);
-    CHECK(pe_image.VerifyMagic());
-
-    // We don't want to read past the end of the module (which could trigger
-    // an access violation), so make sure to check the image size.
-    PIMAGE_NT_HEADERS nt_headers = pe_image.GetNTHeaders();
-    size_t dll_module_length = std::min(
-        size_to_read ? size_to_read : ~0,
-        static_cast<size_t>(nt_headers->OptionalHeader.SizeOfImage));
-
-    // Page in then release the module.
-    TouchPagesInRange(dll_module, dll_module_length);
-    FreeLibrary(dll_module);
-  }
-
-  return true;
-}
-
-bool ImagePreReader::PartialPreReadImage(const wchar_t* file_path,
-                                         size_t percentage,
-                                         size_t max_chunk_size) {
-  base::ThreadRestrictions::AssertIOAllowed();
-
-  if (percentage >= kOneHundredPercent) {
-    // If we're reading the whole image, we don't need to parse headers and
-    // navigate sections, the basic PreReadImage() can be used to just step
-    // blindly through the entire file / address-space.
-    return PreReadImage(file_path, 0, max_chunk_size);
-  }
-
-  if (base::win::GetVersion() > base::win::VERSION_XP) {
-    // Vista+ branch. On these OSes, we warm up the Image by reading its
-    // file off the disk.
-    return PartialPreReadImageOnDisk(file_path, percentage, max_chunk_size);
-  }
-
-  // WinXP branch. For XP, reading the image from disk doesn't do what we want
-  // so instead we pull the pages into memory by loading the DLL and touching
-  // initialized pages at a stride.
-  return PartialPreReadImageInMemory(file_path, percentage);
-}
diff --git a/chrome/app/image_pre_reader_win.h b/chrome/app/image_pre_reader_win.h
deleted file mode 100644
index e32e0190..0000000
--- a/chrome/app/image_pre_reader_win.h
+++ /dev/null
@@ -1,73 +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.
-
-// This file defines utility functions to pre-read a PE Image in order to
-// avoid hard page faults when the image is subsequently loaded into memory
-// for execution.
-
-#ifndef CHROME_APP_IMAGE_PRE_READER_WIN_H_
-#define CHROME_APP_IMAGE_PRE_READER_WIN_H_
-
-#include "base/basictypes.h"
-
-// This class defines static helper functions to pre-read a PE Image in order
-// to avoid hard page faults when the image is subsequently loaded into memory
-// for execution.
-class ImagePreReader {
- public:
-  // Reads the file passed in as a PE Image and touches pages to avoid
-  // subsequent hard page faults during LoadLibrary. The size to be pre-read
-  // is passed in. If it is 0 then the whole file is paged in. The step size
-  // which indicates the number of bytes to skip after every page touched is
-  // also passed in.
-  //
-  // This function checks the Windows version to determine which pre-reading
-  // mechanism to use.
-  static bool PreReadImage(const wchar_t* file_path,
-                           size_t size_to_read,
-                           size_t step_size);
-
-  // Loads the file passed in as PE Image and touches a percentage of the
-  // pages in each of the image's sections to avoid subsequent hard page
-  // faults during LoadLibrary.
-  //
-  // This function checks the Windows version to determine which pre-reading
-  // mechanism to use.
-  //
-  // The percentage of the file to be read is an integral value between 0 and
-  // 100, inclusive. If it is 0 then this is a NOP, if it is 100 (or greater)
-  // then the whole file is paged in sequentially via PreReadImage. Otherwise,
-  // for each section, in order, the given percentage of the blocks in that
-  // section are paged in, starting at the beginning of each section. For
-  // example: if percentage is 30 and there is a .text section and a .data
-  // section, then the first 30% of .text will be paged and the first 30% of
-  // .data will be paged in.
-  //
-  // The max_chunk_size indicates the number of bytes to read off the disk in
-  // each step (for Vista and greater, where this is the way the pages are
-  // warmed).
-  //
-  // This function is intended to be used in the context of a PE image with
-  // an optimized layout, such that the blocks in each section are arranged
-  // with the data and code most needed for startup moved to the front.
-  // See also: http://code.google.com/p/chromium/issues/detail?id=98508
-  static bool PartialPreReadImage(const wchar_t* file_path,
-                                  size_t percentage,
-                                  size_t max_chunk_size);
-
-  // Helper function used by PartialPreReadImage on Windows versions (Vista+)
-  // where reading through the file on disk serves to warm up the page cache.
-  // Exported for unit-testing purposes.
-  static bool PartialPreReadImageOnDisk(const wchar_t* file_path,
-                                        size_t percentage,
-                                        size_t max_chunk_size);
-
-  // Helper function used by PartialPreReadImage on Windows versions (XP) where
-  // cheaply loading the image then stepping through its address space serves
-  // to warm up the page cache. Exported for unit-testing purposes.
-  static bool PartialPreReadImageInMemory(const wchar_t* file_path,
-                                          size_t percentage);
-};  // namespace internal
-
-#endif  // CHROME_APP_IMAGE_PRE_READER_WIN_H_
diff --git a/chrome/app/main_dll_loader_win.cc b/chrome/app/main_dll_loader_win.cc
index 4f831ff6..ba14dba 100644
--- a/chrome/app/main_dll_loader_win.cc
+++ b/chrome/app/main_dll_loader_win.cc
@@ -26,7 +26,7 @@
 #include "chrome/app/chrome_crash_reporter_client.h"
 #include "chrome/app/chrome_watcher_client_win.h"
 #include "chrome/app/chrome_watcher_command_line_win.h"
-#include "chrome/app/image_pre_reader_win.h"
+#include "chrome/app/file_pre_reader_win.h"
 #include "chrome/app/kasko_client.h"
 #include "chrome/chrome_watcher/chrome_watcher_main_api.h"
 #include "chrome/common/chrome_constants.h"
@@ -63,9 +63,7 @@
     // We pre-read the binary to warm the memory caches (fewer hard faults to
     // page parts of the binary in).
     const size_t kStepSize = 1024 * 1024;
-    size_t percent = 100;
-    ImagePreReader::PartialPreReadImage(module.value().c_str(), percent,
-                                        kStepSize);
+    PreReadFile(module, kStepSize);
   }
 
   return ::LoadLibraryExW(module.value().c_str(), nullptr,
diff --git a/chrome/app/nibs/WrenchMenu.xib b/chrome/app/nibs/WrenchMenu.xib
index c87da6c..f5ac76238 100644
--- a/chrome/app/nibs/WrenchMenu.xib
+++ b/chrome/app/nibs/WrenchMenu.xib
@@ -6,7 +6,7 @@
         <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="5056"/>
     </dependencies>
     <objects>
-        <customObject id="-2" userLabel="File's Owner" customClass="WrenchMenuButtonViewController">
+        <customObject id="-2" userLabel="File's Owner" customClass="AppMenuButtonViewController">
             <connections>
                 <outlet property="editCopy" destination="20" id="31"/>
                 <outlet property="editCut" destination="21" id="32"/>
@@ -40,7 +40,7 @@
                                 <font key="font" metaFont="smallSystem"/>
                             </buttonCell>
                             <connections>
-                                <action selector="dispatchWrenchMenuCommand:" target="-2" id="42"/>
+                                <action selector="dispatchAppMenuCommand:" target="-2" id="42"/>
                             </connections>
                         </button>
                         <button verticalHuggingPriority="750" tag="36001" id="20" customClass="MenuTrackedButton">
@@ -51,7 +51,7 @@
                                 <font key="font" metaFont="smallSystem"/>
                             </buttonCell>
                             <connections>
-                                <action selector="dispatchWrenchMenuCommand:" target="-2" id="46"/>
+                                <action selector="dispatchAppMenuCommand:" target="-2" id="46"/>
                             </connections>
                         </button>
                         <button verticalHuggingPriority="750" tag="36003" id="19" customClass="MenuTrackedButton">
@@ -62,7 +62,7 @@
                                 <font key="font" metaFont="smallSystem"/>
                             </buttonCell>
                             <connections>
-                                <action selector="dispatchWrenchMenuCommand:" target="-2" id="47"/>
+                                <action selector="dispatchAppMenuCommand:" target="-2" id="47"/>
                             </connections>
                         </button>
                     </subviews>
@@ -123,7 +123,7 @@
                                 <font key="font" metaFont="smallSystem"/>
                             </buttonCell>
                             <connections>
-                                <action selector="dispatchWrenchMenuCommand:" target="-2" id="43"/>
+                                <action selector="dispatchAppMenuCommand:" target="-2" id="43"/>
                             </connections>
                         </button>
                         <button verticalHuggingPriority="750" tag="38001" id="9" customClass="MenuTrackedButton">
@@ -134,7 +134,7 @@
                                 <font key="font" metaFont="smallSystem"/>
                             </buttonCell>
                             <connections>
-                                <action selector="dispatchWrenchMenuCommand:" target="-2" id="45"/>
+                                <action selector="dispatchAppMenuCommand:" target="-2" id="45"/>
                             </connections>
                         </button>
                         <button verticalHuggingPriority="750" tag="38004" id="8">
@@ -153,7 +153,7 @@
                                 <font key="font" metaFont="smallSystem"/>
                             </buttonCell>
                             <connections>
-                                <action selector="dispatchWrenchMenuCommand:" target="-2" id="44"/>
+                                <action selector="dispatchAppMenuCommand:" target="-2" id="44"/>
                             </connections>
                         </button>
                     </subviews>
diff --git a/chrome/app/settings_strings.grdp b/chrome/app/settings_strings.grdp
index 54a8f27..2c1d566a 100644
--- a/chrome/app/settings_strings.grdp
+++ b/chrome/app/settings_strings.grdp
@@ -102,6 +102,23 @@
   </message>
 
 
+  <!-- Passwords and Autofill Page -->
+  <message name="IDS_SETTINGS_PASSWORDS_AND_AUTOFILL_PAGE_TITLE" desc="Name of the settings page which allows managing passwords and autofill settings.">
+    Passwords and Forms
+  </message>
+  <message name="IDS_SETTINGS_AUTOFILL" desc="Name for the autofill section and toggle.">
+    Autofill settings
+  </message>
+  <message name="IDS_SETTINGS_AUTOFILL_DETAIL" desc="Description of what toggling the 'Autofill' setting does. Immediately underneath IDS_SETTINGS_AUTOFILL">
+    Enable Autofill to fill out forms in a single click
+  </message>
+  <message name="IDS_SETTINGS_PASSWORDS" desc="Name for the password section and toggle">
+    Manage passwords
+  </message>
+  <message name="IDS_SETTINGS_PASSWORDS_DETAIL" desc="Description of what toggling the 'Manage passwords' setting does. Immediately underneath IDS_SETTINGS_PASSWORDS">
+    Offer to save your web passwords
+  </message>
+
   <!-- Basic Page -->
   <message name="IDS_SETTINGS_BASIC" desc="Name of the settings page which displays advanced preferences.">
     Basic
diff --git a/chrome/app/theme/material_100_percent/common/omnibox_https_invalid.png b/chrome/app/theme/material_100_percent/common/omnibox_https_invalid.png
deleted file mode 100644
index 6f238a5..0000000
--- a/chrome/app/theme/material_100_percent/common/omnibox_https_invalid.png
+++ /dev/null
Binary files differ
diff --git a/chrome/app/theme/material_100_percent/common/omnibox_https_valid.png b/chrome/app/theme/material_100_percent/common/omnibox_https_valid.png
deleted file mode 100644
index 6f9ffcc..0000000
--- a/chrome/app/theme/material_100_percent/common/omnibox_https_valid.png
+++ /dev/null
Binary files differ
diff --git a/chrome/app/theme/material_100_percent/common/omnibox_keyword_hint_tab.png b/chrome/app/theme/material_100_percent/common/omnibox_keyword_hint_tab.png
deleted file mode 100644
index 1896fda..0000000
--- a/chrome/app/theme/material_100_percent/common/omnibox_keyword_hint_tab.png
+++ /dev/null
Binary files differ
diff --git a/chrome/app/theme/material_100_percent/common/omnibox_tts.png b/chrome/app/theme/material_100_percent/common/omnibox_tts.png
deleted file mode 100644
index 6fe107b..0000000
--- a/chrome/app/theme/material_100_percent/common/omnibox_tts.png
+++ /dev/null
Binary files differ
diff --git a/chrome/app/theme/material_200_percent/common/omnibox_https_invalid.png b/chrome/app/theme/material_200_percent/common/omnibox_https_invalid.png
deleted file mode 100644
index 63f1b7c..0000000
--- a/chrome/app/theme/material_200_percent/common/omnibox_https_invalid.png
+++ /dev/null
Binary files differ
diff --git a/chrome/app/theme/material_200_percent/common/omnibox_https_valid.png b/chrome/app/theme/material_200_percent/common/omnibox_https_valid.png
deleted file mode 100644
index a2b3edd..0000000
--- a/chrome/app/theme/material_200_percent/common/omnibox_https_valid.png
+++ /dev/null
Binary files differ
diff --git a/chrome/app/theme/material_200_percent/common/omnibox_keyword_hint_tab.png b/chrome/app/theme/material_200_percent/common/omnibox_keyword_hint_tab.png
deleted file mode 100644
index 03d4c91d..0000000
--- a/chrome/app/theme/material_200_percent/common/omnibox_keyword_hint_tab.png
+++ /dev/null
Binary files differ
diff --git a/chrome/app/theme/material_200_percent/common/omnibox_tts.png b/chrome/app/theme/material_200_percent/common/omnibox_tts.png
deleted file mode 100644
index f3e873f..0000000
--- a/chrome/app/theme/material_200_percent/common/omnibox_tts.png
+++ /dev/null
Binary files differ
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index 7c57cfa..2835fdc 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -227,6 +227,9 @@
     sources += rebase_path(gypi_values.chrome_browser_content_settings_sources,
                            ".",
                            "//chrome")
+    sources += rebase_path(gypi_values.chrome_browser_data_usage_sources,
+                           ".",
+                           "//chrome")
     sources += rebase_path(gypi_values.chrome_browser_engagement_sources,
                            ".",
                            "//chrome")
@@ -299,7 +302,6 @@
       "//components/network_hints/common",
       "//components/password_manager/content/browser",
       "//components/password_manager/sync/browser",
-      "//components/plugins/common",
       "//components/profile_metrics",
       "//components/proxy_config",
       "//components/resources",
diff --git a/chrome/browser/DEPS b/chrome/browser/DEPS
index 9317f69a..93ca2195 100644
--- a/chrome/browser/DEPS
+++ b/chrome/browser/DEPS
@@ -71,7 +71,6 @@
   "+components/os_crypt",
   "+components/password_manager",
   "+components/pdf/browser",
-  "+components/plugins/common",
   "+components/policy",
   "+components/power",
   "+components/precache",
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index 720aff7d..c680e83 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -37,7 +37,6 @@
 #include "components/offline_pages/offline_page_switches.h"
 #include "components/omnibox/browser/omnibox_switches.h"
 #include "components/password_manager/core/common/password_manager_switches.h"
-#include "components/plugins/common/plugins_switches.h"
 #include "components/proximity_auth/switches.h"
 #include "components/search/search_switches.h"
 #include "components/signin/core/common/signin_switches.h"
@@ -1726,14 +1725,6 @@
      IDS_FLAGS_REDUCED_REFERRER_GRANULARITY_DESCRIPTION,
      kOsAll,
      SINGLE_VALUE_TYPE(switches::kReducedReferrerGranularity)},
-#if defined(ENABLE_PLUGINS)
-    {"enable-plugin-power-saver",
-     IDS_FLAGS_ENABLE_PLUGIN_POWER_SAVER_NAME,
-     IDS_FLAGS_ENABLE_PLUGIN_POWER_SAVER_DESCRIPTION,
-     kOsDesktop,
-     ENABLE_DISABLE_VALUE_TYPE(plugins::switches::kEnablePluginPowerSaver,
-                               plugins::switches::kDisablePluginPowerSaver)},
-#endif
 #if defined(OS_CHROMEOS)
     {"disable-new-zip-unpacker",
      IDS_FLAGS_DISABLE_NEW_ZIP_UNPACKER_NAME,
@@ -2018,7 +2009,8 @@
      IDS_FLAGS_ENABLE_CLEAR_BROWSING_DATA_COUNTERS_NAME,
      IDS_FLAGS_ENABLE_CLEAR_BROWSING_DATA_COUNTERS_DESCRIPTION,
      kOsAll,
-     SINGLE_VALUE_TYPE(switches::kEnableClearBrowsingDataCounters)
+     ENABLE_DISABLE_VALUE_TYPE(switches::kEnableClearBrowsingDataCounters,
+                               switches::kDisableClearBrowsingDataCounters)
     },
 #if defined(ENABLE_TASK_MANAGER)
     {"disable-new-task-manager",
diff --git a/chrome/browser/android/data_usage/data_use_tab_model.cc b/chrome/browser/android/data_usage/data_use_tab_model.cc
new file mode 100644
index 0000000..c4d8e36
--- /dev/null
+++ b/chrome/browser/android/data_usage/data_use_tab_model.cc
@@ -0,0 +1,198 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/android/data_usage/data_use_tab_model.h"
+
+#include "base/time/time.h"
+#include "chrome/browser/android/data_usage/external_data_use_observer.h"
+#include "chrome/browser/android/data_usage/tab_data_use_entry.h"
+
+namespace {
+
+// TODO(rajendrant): To be changeable via field trial.
+// Indicates the maximum number of tabs to maintain session information about.
+const size_t kMaxTabEntries = 200;
+
+// Returns true if |tab_id| is a valid tab ID.
+bool IsValidTabID(int32_t tab_id) {
+  return tab_id >= 0;
+}
+
+}  // namespace
+
+namespace chrome {
+
+namespace android {
+
+size_t DataUseTabModel::GetMaxTabEntriesForTests() {
+  return kMaxTabEntries;
+}
+
+DataUseTabModel::DataUseTabModel(
+    const ExternalDataUseObserver* data_use_observer,
+    scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner)
+    : data_use_observer_(data_use_observer),
+      observer_list_(new base::ObserverListThreadSafe<TabDataUseObserver>),
+      weak_factory_(this) {}
+
+DataUseTabModel::~DataUseTabModel() {
+  DCHECK(thread_checker_.CalledOnValidThread());
+}
+
+base::WeakPtr<DataUseTabModel> DataUseTabModel::GetWeakPtr() {
+  DCHECK(thread_checker_.CalledOnValidThread());
+  return weak_factory_.GetWeakPtr();
+}
+
+void DataUseTabModel::OnNavigationEvent(int32_t tab_id,
+                                        TransitionType transition,
+                                        const GURL& url,
+                                        const std::string& package) {
+  DCHECK(thread_checker_.CalledOnValidThread());
+  DCHECK(IsValidTabID(tab_id));
+
+  // TODO(rajendrant): implementation to use package.
+  switch (transition) {
+    case TRANSITION_OMNIBOX_SEARCH:
+    case TRANSITION_FROM_EXTERNAL_APP: {
+      // Enter events.
+      std::string label;
+      if (data_use_observer_->Matches(url, &label)) {
+        // TODO(rajendrant): Need to handle scenarios where these labels change
+        // in the middle of a tab session. Should |data_use_observer_| notify us
+        // about a cleanup. What happens to currently active tab sessions.
+        DCHECK(!label.empty());
+        StartTrackingDataUse(tab_id, label);
+      }
+      break;
+    }
+
+    case TRANSITION_FROM_NAVSUGGEST:
+    case TRANSITION_OMNIBOX_NAVIGATION:
+    case TRANSITION_BOOKMARK:
+    case TRANSITION_HISTORY_ITEM:
+    case TRANSITION_TO_EXTERNAL_APP:
+      // Exit events.
+      EndTrackingDataUse(tab_id);
+      break;
+
+    default:
+      NOTREACHED();
+      break;
+  }
+}
+
+void DataUseTabModel::OnTabCloseEvent(int32_t tab_id) {
+  DCHECK(thread_checker_.CalledOnValidThread());
+  DCHECK(IsValidTabID(tab_id));
+
+  TabEntryMap::iterator tab_entry_iterator = active_tabs_.find(tab_id);
+  if (tab_entry_iterator == active_tabs_.end())
+    return;
+
+  TabDataUseEntry& tab_entry = tab_entry_iterator->second;
+  if (tab_entry.IsTrackingDataUse())
+    tab_entry.EndTracking();
+  tab_entry.OnTabCloseEvent();
+}
+
+bool DataUseTabModel::GetLabelForDataUse(const data_usage::DataUse& data_use,
+                                         std::string* output_label) const {
+  DCHECK(thread_checker_.CalledOnValidThread());
+
+  *output_label = "";
+
+  // Data use that cannot be attributed to a tab will not be labeled.
+  if (!IsValidTabID(data_use.tab_id))
+    return false;
+
+  TabEntryMap::const_iterator tab_entry_iterator =
+      active_tabs_.find(data_use.tab_id);
+  if (tab_entry_iterator != active_tabs_.end()) {
+    return tab_entry_iterator->second.GetLabel(data_use.request_start,
+                                               output_label);
+  }
+
+  return false;  // Tab session not found.
+}
+
+void DataUseTabModel::AddObserver(TabDataUseObserver* observer) {
+  observer_list_->AddObserver(observer);
+}
+
+void DataUseTabModel::RemoveObserver(TabDataUseObserver* observer) {
+  observer_list_->RemoveObserver(observer);
+}
+
+void DataUseTabModel::NotifyObserversOfTrackingStarting(int32_t tab_id) {
+  observer_list_->Notify(FROM_HERE, &TabDataUseObserver::NotifyTrackingStarting,
+                         tab_id);
+}
+
+void DataUseTabModel::NotifyObserversOfTrackingEnding(int32_t tab_id) {
+  observer_list_->Notify(FROM_HERE, &TabDataUseObserver::NotifyTrackingEnding,
+                         tab_id);
+}
+
+void DataUseTabModel::StartTrackingDataUse(int32_t tab_id,
+                                           const std::string& label) {
+  // TODO(rajendrant): Explore ability to handle changes in label for current
+  // session.
+  bool new_tab_entry_added = false;
+  TabEntryMap::iterator tab_entry_iterator = active_tabs_.find(tab_id);
+  if (tab_entry_iterator == active_tabs_.end()) {
+    auto new_entry =
+        active_tabs_.insert(TabEntryMap::value_type(tab_id, TabDataUseEntry()));
+    tab_entry_iterator = new_entry.first;
+    DCHECK(tab_entry_iterator != active_tabs_.end());
+    DCHECK(!tab_entry_iterator->second.IsTrackingDataUse());
+    new_tab_entry_added = true;
+  }
+  if (tab_entry_iterator->second.StartTracking(label))
+    NotifyObserversOfTrackingStarting(tab_id);
+
+  if (new_tab_entry_added)
+    CompactTabEntries();  // Keep total number of tab entries within limit.
+}
+
+void DataUseTabModel::EndTrackingDataUse(int32_t tab_id) {
+  TabEntryMap::iterator tab_entry_iterator = active_tabs_.find(tab_id);
+  if (tab_entry_iterator != active_tabs_.end() &&
+      tab_entry_iterator->second.EndTracking()) {
+    NotifyObserversOfTrackingEnding(tab_id);
+  }
+}
+
+void DataUseTabModel::CompactTabEntries() {
+  // Remove expired tab entries.
+  for (TabEntryMap::iterator tab_entry_iterator = active_tabs_.begin();
+       tab_entry_iterator != active_tabs_.end();) {
+    if (tab_entry_iterator->second.IsExpired())
+      active_tabs_.erase(tab_entry_iterator++);
+    else
+      ++tab_entry_iterator;
+  }
+
+  if (active_tabs_.size() <= kMaxTabEntries)
+    return;
+
+  // Remove oldest unexpired tab entries.
+  while (active_tabs_.size() > kMaxTabEntries) {
+    // Find oldest tab entry.
+    TabEntryMap::iterator oldest_tab_entry_iterator = active_tabs_.begin();
+    for (TabEntryMap::iterator tab_entry_iterator = active_tabs_.begin();
+         tab_entry_iterator != active_tabs_.end(); ++tab_entry_iterator) {
+      if (oldest_tab_entry_iterator->second.GetLatestStartOrEndTime() >
+          tab_entry_iterator->second.GetLatestStartOrEndTime()) {
+        oldest_tab_entry_iterator = tab_entry_iterator;
+      }
+    }
+    DCHECK(oldest_tab_entry_iterator != active_tabs_.end());
+    active_tabs_.erase(oldest_tab_entry_iterator);
+  }
+}
+
+}  // namespace android
+
+}  // namespace chrome
diff --git a/chrome/browser/android/data_usage/data_use_tab_model.h b/chrome/browser/android/data_usage/data_use_tab_model.h
new file mode 100644
index 0000000..43a07bd
--- /dev/null
+++ b/chrome/browser/android/data_usage/data_use_tab_model.h
@@ -0,0 +1,174 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_ANDROID_DATA_USAGE_DATA_USE_TAB_MODEL_H_
+#define CHROME_BROWSER_ANDROID_DATA_USAGE_DATA_USE_TAB_MODEL_H_
+
+#include <stdint.h>
+
+#include <string>
+
+#include "base/containers/hash_tables.h"
+#include "base/gtest_prod_util.h"
+#include "base/macros.h"
+#include "base/memory/ref_counted.h"
+#include "base/memory/weak_ptr.h"
+#include "base/observer_list_threadsafe.h"
+#include "base/threading/thread_checker.h"
+#include "chrome/browser/android/data_usage/tab_data_use_entry.h"
+#include "components/data_usage/core/data_use.h"
+#include "url/gurl.h"
+
+namespace chrome {
+
+namespace android {
+
+class ExternalDataUseObserver;
+
+// Models tracking and labeling of data usage within each Tab. Within each tab,
+// the model tracks the data use of a sequence of navigations in a "tracking
+// session" beginning with an entry event and ending with an exit event.
+// Typically, these events are navigations matching a URL pattern, or various
+// types of browser-initiated navigations. A single tab may have several
+// disjoint "tracking sessions" depending on the sequence of entry and exit
+// events that took place.
+class DataUseTabModel {
+ public:
+  // TransitionType enumerates the types of possible browser navigation events
+  // and transitions.
+  enum TransitionType {
+    // Navigation from the omnibox to the SRP.
+    TRANSITION_OMNIBOX_SEARCH,
+
+    // Navigation from external apps such as AGSA app.
+    // TODO(rajendrant): Remove this if not needed.
+    TRANSITION_FROM_EXTERNAL_APP,
+
+    // Navigating to another app.
+    TRANSITION_TO_EXTERNAL_APP,
+
+    // Navigation from NavSuggest below omnibox.
+    TRANSITION_FROM_NAVSUGGEST,
+
+    // Navigation from the omnibox when typing a URL.
+    TRANSITION_OMNIBOX_NAVIGATION,
+
+    // Navigation from a bookmark.
+    TRANSITION_BOOKMARK,
+
+    // Navigating from history.
+    TRANSITION_HISTORY_ITEM,
+  };
+
+  // TabDataUseObserver provides the interface for getting notifications from
+  // the DataUseTabModel.
+  class TabDataUseObserver {
+   public:
+    virtual ~TabDataUseObserver() {}
+
+    // Notification callback when tab tracking sessions are started and ended.
+    // The callback will be received on the same thread AddObserver was called
+    // from.
+    virtual void NotifyTrackingStarting(int32_t tab_id) = 0;
+    virtual void NotifyTrackingEnding(int32_t tab_id) = 0;
+  };
+
+  DataUseTabModel(const ExternalDataUseObserver* data_use_observer,
+                  scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner);
+
+  ~DataUseTabModel();
+
+  base::WeakPtr<DataUseTabModel> GetWeakPtr();
+
+  // Notifies the DataUseTabModel of navigation events. |tab_id| is the source
+  // tab of the generated event, |transition| indicates the type of the UI
+  // event/transition,  |url| is the URL in the source tab, |package| indicates
+  // the android package name of external application that initiated the event.
+  void OnNavigationEvent(int32_t tab_id,
+                         TransitionType transition,
+                         const GURL& url,
+                         const std::string& package);
+
+  // Notifies the DataUseTabModel that tab with |tab_id| is closed. Any active
+  // tracking sessions for the tab are terminated, and the tab is marked as
+  // closed.
+  void OnTabCloseEvent(int32_t tab_id);
+
+  // Gets the label for the |data_use| object. |output_label| must not be null.
+  // If a tab tracking session is found that was active at the time of request
+  // start of |data_use|, returns true and |output_label| is populated with its
+  // label. Otherwise returns false and |output_label| is set to empty string.
+  bool GetLabelForDataUse(const data_usage::DataUse& data_use,
+                          std::string* output_label) const;
+
+  // Adds or removes observers from the observer list. These functions are
+  // thread-safe and can be called from any thread.
+  void AddObserver(TabDataUseObserver* observer);
+  void RemoveObserver(TabDataUseObserver* observer);
+
+ private:
+  friend class DataUseTabModelTest;
+  friend class MockTabDataUseEntryTest;
+  FRIEND_TEST_ALL_PREFIXES(DataUseTabModelTest, SingleTabTracking);
+  FRIEND_TEST_ALL_PREFIXES(DataUseTabModelTest, MultipleTabTracking);
+  FRIEND_TEST_ALL_PREFIXES(DataUseTabModelTest, ObserverStartEndEvents);
+  FRIEND_TEST_ALL_PREFIXES(DataUseTabModelTest, ObserverNotNotifiedAfterRemove);
+  FRIEND_TEST_ALL_PREFIXES(DataUseTabModelTest,
+                           MultipleObserverMultipleStartEndEvents);
+  FRIEND_TEST_ALL_PREFIXES(DataUseTabModelTest, TabCloseEvent);
+  FRIEND_TEST_ALL_PREFIXES(DataUseTabModelTest, TabCloseEventEndsTracking);
+  FRIEND_TEST_ALL_PREFIXES(DataUseTabModelTest,
+                           CompactTabEntriesWithinMaxLimit);
+
+  typedef base::hash_map<int32_t, TabDataUseEntry> TabEntryMap;
+
+  // Returns the maximum number of tab entries to maintain session information
+  // about.
+  static size_t GetMaxTabEntriesForTests();
+
+  // Notifies the observers that a data usage tracking session started for
+  // |tab_id|.
+  void NotifyObserversOfTrackingStarting(int32_t tab_id);
+
+  // Notifies the observers that an active data usage tracking session ended for
+  // |tab_id|.
+  void NotifyObserversOfTrackingEnding(int32_t tab_id);
+
+  // Initiates a new tracking session with the |label| for tab with id |tab_id|.
+  void StartTrackingDataUse(int32_t tab_id, const std::string& label);
+
+  // Ends the current tracking session for tab with id |tab_id|.
+  void EndTrackingDataUse(int32_t tab_id);
+
+  // Compacts the tab entry map |active_tabs_| by removing expired tab entries.
+  // After removing expired tab entries, if the size of |active_tabs_| exceeds
+  // |kMaxTabEntries|, oldest unexpired tab entries will be removed until its
+  // size is |kMaxTabEntries|.
+  void CompactTabEntries();
+
+  // Contains the ExternalDataUseObserver. The caller must ensure that the
+  // |data_use_observer_| outlives this instance.
+  const ExternalDataUseObserver* data_use_observer_;
+
+  // List of observers waiting for tracking session start and end notifications.
+  const scoped_refptr<base::ObserverListThreadSafe<TabDataUseObserver>>
+      observer_list_;
+
+  // Maintains the tracking sessions of multiple tabs.
+  TabEntryMap active_tabs_;
+
+  base::ThreadChecker thread_checker_;
+
+  // |weak_factory_| is used for generating weak pointers to be passed to
+  // DataUseTabUIManager on the UI thread.
+  base::WeakPtrFactory<DataUseTabModel> weak_factory_;
+
+  DISALLOW_COPY_AND_ASSIGN(DataUseTabModel);
+};
+
+}  // namespace android
+
+}  // namespace chrome
+
+#endif  // CHROME_BROWSER_ANDROID_DATA_USAGE_DATA_USE_TAB_MODEL_H_
diff --git a/chrome/browser/android/data_usage/data_use_tab_model_unittest.cc b/chrome/browser/android/data_usage/data_use_tab_model_unittest.cc
new file mode 100644
index 0000000..f2bf800
--- /dev/null
+++ b/chrome/browser/android/data_usage/data_use_tab_model_unittest.cc
@@ -0,0 +1,340 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/android/data_usage/data_use_tab_model.h"
+
+#include <stdint.h>
+
+#include <string>
+
+#include "base/message_loop/message_loop.h"
+#include "base/strings/stringprintf.h"
+#include "base/time/time.h"
+#include "chrome/browser/android/data_usage/external_data_use_observer.h"
+#include "chrome/browser/android/data_usage/tab_data_use_entry.h"
+#include "net/base/network_change_notifier.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace {
+
+// Tracking labels for tests.
+const std::string kTestLabel1 = "label_1";
+const std::string kTestLabel2 = "label_2";
+const std::string kTestLabel3 = "label_3";
+
+const int kTabID1 = 1;
+const int kTabID2 = 2;
+const int kTabID3 = 3;
+
+enum TabEntrySize { ZERO = 0, ONE, TWO, THREE };
+
+const int kMaxMockObservers = 5;
+
+}  // namespace
+
+namespace base {
+class SingleThreadTaskRunner;
+}
+
+namespace chrome {
+
+namespace android {
+
+class DataUseTabModelTest : public testing::Test {
+ public:
+  DataUseTabModelTest() : data_use_tab_model_(nullptr, task_runner_.get()) {
+    // TODO(rajendrant): Create a mock class for ExternalDataUseObserver to
+    // spoof the Matches call and test the OnNavigationEvent.
+  }
+
+  void SetUp() override {}
+
+  base::SingleThreadTaskRunner* task_runner() { return task_runner_.get(); }
+
+  // Returns true if tab entry for |tab_id| exists in |active_tabs_|.
+  bool IsTabEntryExists(int32_t tab_id) const {
+    return data_use_tab_model_.active_tabs_.find(tab_id) !=
+           data_use_tab_model_.active_tabs_.end();
+  }
+
+  // Checks if there are |expected_size| tab entries being tracked in
+  // |active_tabs_|.
+  void ExpectTabEntrySize(uint32_t expected_size) const {
+    EXPECT_EQ(expected_size, data_use_tab_model_.active_tabs_.size());
+  }
+
+  // Returns true if the tracking session for tab with id |tab_id| is currently
+  // active.
+  bool IsTrackingDataUse(int32_t tab_id) const {
+    auto tab_entry_iterator = data_use_tab_model_.active_tabs_.find(tab_id);
+    if (tab_entry_iterator == data_use_tab_model_.active_tabs_.end())
+      return false;
+    return tab_entry_iterator->second.IsTrackingDataUse();
+  }
+
+  // Checks if the DataUse object for the given |tab_id| with request start time
+  // |at_time| is labeled as an empty string.
+  void ExpectEmptyDataUseLabelAtTime(int32_t tab_id,
+                                     const base::TimeTicks& at_time) const {
+    ExpectDataUseLabelAtTimeWithReturn(tab_id, at_time, false, std::string());
+  }
+
+  // Checks if the DataUse object for the given |tab_id| is labeled as an empty
+  // string.
+  void ExpectEmptyDataUseLabel(int32_t tab_id) const {
+    ExpectDataUseLabelAtTimeWithReturn(tab_id, base::TimeTicks::Now(), false,
+                                       std::string());
+  }
+
+  // Checks if the DataUse object for given |tab_id| is labeled as
+  // |expected_label|.
+  void ExpectDataUseLabel(int32_t tab_id,
+                          const std::string& expected_label) const {
+    ExpectDataUseLabelAtTimeWithReturn(tab_id, base::TimeTicks::Now(), true,
+                                       expected_label);
+  }
+
+  // Checks if GetLabelForDataUse labels the DataUse object for |tab_id| with
+  // request start time |at_time|, as |expected_label| and returns
+  // |expected_return|.
+  void ExpectDataUseLabelAtTimeWithReturn(
+      int32_t tab_id,
+      const base::TimeTicks& at_time,
+      bool expected_return,
+      const std::string& expected_label) const {
+    data_usage::DataUse data_use(GURL("http://foo.com"), at_time,
+                                 GURL("http://foobar.com"), tab_id,
+                                 net::NetworkChangeNotifier::CONNECTION_UNKNOWN,
+                                 std::string(), 1000, 1000);
+    std::string actual_label;
+    bool actual_return =
+        data_use_tab_model_.GetLabelForDataUse(data_use, &actual_label);
+    EXPECT_EQ(expected_return, actual_return);
+    EXPECT_EQ(expected_label, actual_label);
+  }
+
+  scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
+  DataUseTabModel data_use_tab_model_;
+  base::MessageLoop message_loop_;
+};
+
+// Mock observer to track the calls to start and end tracking events.
+class MockTabDataUseObserver : public DataUseTabModel::TabDataUseObserver {
+ public:
+  MOCK_METHOD1(NotifyTrackingStarting, void(int32_t tab_id));
+  MOCK_METHOD1(NotifyTrackingEnding, void(int32_t tab_id));
+};
+
+// Starts and ends tracking a single tab and checks if its label is returned
+// correctly for DataUse objects.
+TEST_F(DataUseTabModelTest, SingleTabTracking) {
+  ExpectTabEntrySize(TabEntrySize::ZERO);
+
+  // No label is applied initially.
+  ExpectEmptyDataUseLabel(kTabID1);
+  ExpectEmptyDataUseLabel(kTabID2);
+
+  data_use_tab_model_.StartTrackingDataUse(kTabID1, kTestLabel1);
+  ExpectTabEntrySize(TabEntrySize::ONE);
+
+  EXPECT_TRUE(IsTrackingDataUse(kTabID1));
+  ExpectDataUseLabel(kTabID1, kTestLabel1);
+  ExpectEmptyDataUseLabel(kTabID2);
+
+  data_use_tab_model_.EndTrackingDataUse(kTabID1);
+  ExpectTabEntrySize(TabEntrySize::ONE);
+  EXPECT_FALSE(IsTrackingDataUse(kTabID1));
+}
+
+// Starts and ends tracking multiple tabs and checks if labels are returned
+// correctly for DataUse objects corresponding to different tab ids.
+TEST_F(DataUseTabModelTest, MultipleTabTracking) {
+  ExpectTabEntrySize(TabEntrySize::ZERO);
+  ExpectEmptyDataUseLabel(kTabID1);
+  ExpectEmptyDataUseLabel(kTabID2);
+  ExpectEmptyDataUseLabel(kTabID3);
+
+  data_use_tab_model_.StartTrackingDataUse(kTabID1, kTestLabel1);
+  data_use_tab_model_.StartTrackingDataUse(kTabID2, kTestLabel2);
+  data_use_tab_model_.StartTrackingDataUse(kTabID3, kTestLabel3);
+  ExpectTabEntrySize(TabEntrySize::THREE);
+
+  EXPECT_TRUE(IsTrackingDataUse(kTabID1));
+  EXPECT_TRUE(IsTrackingDataUse(kTabID2));
+  EXPECT_TRUE(IsTrackingDataUse(kTabID3));
+  ExpectDataUseLabel(kTabID1, kTestLabel1);
+  ExpectDataUseLabel(kTabID2, kTestLabel2);
+  ExpectDataUseLabel(kTabID3, kTestLabel3);
+
+  data_use_tab_model_.EndTrackingDataUse(kTabID1);
+  data_use_tab_model_.EndTrackingDataUse(kTabID2);
+  data_use_tab_model_.EndTrackingDataUse(kTabID3);
+  ExpectTabEntrySize(TabEntrySize::THREE);
+  EXPECT_FALSE(IsTrackingDataUse(kTabID1));
+  EXPECT_FALSE(IsTrackingDataUse(kTabID2));
+  EXPECT_FALSE(IsTrackingDataUse(kTabID3));
+
+  // Future data use object should be labeled as an empty string.
+  base::TimeTicks future_time =
+      base::TimeTicks::Now() + base::TimeDelta::FromMilliseconds(20);
+  ExpectEmptyDataUseLabelAtTime(kTabID1, future_time);
+  ExpectEmptyDataUseLabelAtTime(kTabID2, future_time);
+  ExpectEmptyDataUseLabelAtTime(kTabID3, future_time);
+}
+
+// Checks that the mock observer receives start and end tracking events for a
+// single tab.
+TEST_F(DataUseTabModelTest, ObserverStartEndEvents) {
+  MockTabDataUseObserver mock_observer;
+
+  EXPECT_CALL(mock_observer, NotifyTrackingStarting(kTabID1)).Times(1);
+  EXPECT_CALL(mock_observer, NotifyTrackingEnding(kTabID1)).Times(1);
+
+  data_use_tab_model_.AddObserver(&mock_observer);
+  data_use_tab_model_.StartTrackingDataUse(kTabID1, kTestLabel1);
+  data_use_tab_model_.EndTrackingDataUse(kTabID1);
+
+  message_loop_.RunUntilIdle();
+}
+
+// Checks that multiple mock observers receive start and end tracking events for
+// multiple tabs.
+TEST_F(DataUseTabModelTest, MultipleObserverMultipleStartEndEvents) {
+  MockTabDataUseObserver mock_observers[kMaxMockObservers];
+
+  for (auto& mock_observer : mock_observers) {
+    // Add the observer.
+    data_use_tab_model_.AddObserver(&mock_observer);
+
+    // Expect start and end events for tab ids 1-3.
+    EXPECT_CALL(mock_observer, NotifyTrackingStarting(kTabID1)).Times(1);
+    EXPECT_CALL(mock_observer, NotifyTrackingEnding(kTabID1)).Times(1);
+    EXPECT_CALL(mock_observer, NotifyTrackingStarting(kTabID2)).Times(1);
+    EXPECT_CALL(mock_observer, NotifyTrackingEnding(kTabID2)).Times(1);
+    EXPECT_CALL(mock_observer, NotifyTrackingStarting(kTabID3)).Times(1);
+    EXPECT_CALL(mock_observer, NotifyTrackingEnding(kTabID3)).Times(1);
+  }
+
+  // Start and end tracking for tab ids 1-3.
+  data_use_tab_model_.StartTrackingDataUse(kTabID1, kTestLabel1);
+  data_use_tab_model_.StartTrackingDataUse(kTabID2, kTestLabel2);
+  data_use_tab_model_.StartTrackingDataUse(kTabID3, kTestLabel3);
+  data_use_tab_model_.EndTrackingDataUse(kTabID1);
+  data_use_tab_model_.EndTrackingDataUse(kTabID2);
+  data_use_tab_model_.EndTrackingDataUse(kTabID3);
+
+  message_loop_.RunUntilIdle();
+}
+
+// Checks that the observer is not notified of start and end events after
+// RemoveObserver.
+TEST_F(DataUseTabModelTest, ObserverNotNotifiedAfterRemove) {
+  MockTabDataUseObserver mock_observer;
+
+  // Observer notified of start and end events.
+  EXPECT_CALL(mock_observer, NotifyTrackingStarting(kTabID1)).Times(1);
+  EXPECT_CALL(mock_observer, NotifyTrackingEnding(kTabID1)).Times(1);
+
+  data_use_tab_model_.AddObserver(&mock_observer);
+  data_use_tab_model_.StartTrackingDataUse(kTabID1, kTestLabel1);
+  data_use_tab_model_.EndTrackingDataUse(kTabID1);
+
+  message_loop_.RunUntilIdle();
+  testing::Mock::VerifyAndClear(&mock_observer);
+
+  // Observer should not be notified after RemoveObserver.
+  EXPECT_CALL(mock_observer, NotifyTrackingStarting(kTabID1)).Times(0);
+  EXPECT_CALL(mock_observer, NotifyTrackingEnding(kTabID1)).Times(0);
+
+  data_use_tab_model_.RemoveObserver(&mock_observer);
+  data_use_tab_model_.StartTrackingDataUse(kTabID1, kTestLabel1);
+  data_use_tab_model_.EndTrackingDataUse(kTabID1);
+
+  message_loop_.RunUntilIdle();
+}
+
+// Checks that tab close event updates the close time of the tab entry.
+TEST_F(DataUseTabModelTest, TabCloseEvent) {
+  data_use_tab_model_.StartTrackingDataUse(kTabID1, kTestLabel1);
+  data_use_tab_model_.EndTrackingDataUse(kTabID1);
+
+  ExpectTabEntrySize(TabEntrySize::ONE);
+  EXPECT_TRUE(
+      data_use_tab_model_.active_tabs_[kTabID1].tab_close_time_.is_null());
+
+  data_use_tab_model_.OnTabCloseEvent(kTabID1);
+
+  ExpectTabEntrySize(TabEntrySize::ONE);
+  EXPECT_FALSE(
+      data_use_tab_model_.active_tabs_[kTabID1].tab_close_time_.is_null());
+}
+
+// Checks that tab close event ends the active tracking session for the tab.
+TEST_F(DataUseTabModelTest, TabCloseEventEndsTracking) {
+  data_use_tab_model_.StartTrackingDataUse(kTabID1, kTestLabel1);
+  EXPECT_TRUE(IsTrackingDataUse(kTabID1));
+
+  data_use_tab_model_.OnTabCloseEvent(kTabID1);
+  EXPECT_FALSE(IsTrackingDataUse(kTabID1));
+
+  // Future data use object should be labeled as an empty string.
+  ExpectEmptyDataUseLabelAtTime(
+      kTabID1, base::TimeTicks::Now() + base::TimeDelta::FromMilliseconds(20));
+}
+
+// Checks that |active_tabs_| does not grow beyond GetMaxTabEntriesForTests tab
+// entries.
+TEST_F(DataUseTabModelTest, CompactTabEntriesWithinMaxLimit) {
+  const size_t max_tab_entries = DataUseTabModel::GetMaxTabEntriesForTests();
+  uint32_t tab_id = 1;
+
+  ExpectTabEntrySize(TabEntrySize::ZERO);
+
+  while (tab_id <= max_tab_entries) {
+    std::string tab_label = base::StringPrintf("track_label_%d", tab_id);
+    data_use_tab_model_.StartTrackingDataUse(tab_id, tab_label);
+    data_use_tab_model_.EndTrackingDataUse(tab_id);
+
+    ExpectTabEntrySize(tab_id);
+    ++tab_id;
+  }
+
+  uint32_t oldest_tab_id = 1;  // oldest tab entry that will be removed first.
+
+  // Starting and ending more tracking tab entries does not increase the size of
+  // |active_tabs_|.
+  while (tab_id < max_tab_entries + 10) {
+    EXPECT_TRUE(IsTabEntryExists(oldest_tab_id));
+    std::string tab_label = base::StringPrintf("label_%d", tab_id);
+    data_use_tab_model_.StartTrackingDataUse(tab_id, tab_label);
+    data_use_tab_model_.EndTrackingDataUse(tab_id);
+
+    // Oldest entry got removed.
+    EXPECT_FALSE(IsTabEntryExists(oldest_tab_id));
+    ExpectTabEntrySize(max_tab_entries);
+
+    ++tab_id;
+    ++oldest_tab_id;  // next oldest tab entry.
+  }
+
+  // Starting and not ending more tracking tab entries does not increase the
+  // size of |active_tabs_|.
+  while (tab_id < max_tab_entries + 20) {
+    EXPECT_TRUE(IsTabEntryExists(oldest_tab_id));
+    std::string tab_label = base::StringPrintf("label_%d", tab_id);
+    data_use_tab_model_.StartTrackingDataUse(tab_id, tab_label);
+
+    // Oldest entry got removed.
+    EXPECT_FALSE(IsTabEntryExists(oldest_tab_id));
+    ExpectTabEntrySize(max_tab_entries);
+
+    ++tab_id;
+    ++oldest_tab_id;  // next oldest tab entry.
+  }
+}
+
+}  // namespace android
+
+}  // namespace chrome
diff --git a/chrome/browser/android/data_usage/external_data_use_observer.cc b/chrome/browser/android/data_usage/external_data_use_observer.cc
index a9fd19a..07fbe9d4 100644
--- a/chrome/browser/android/data_usage/external_data_use_observer.cc
+++ b/chrome/browser/android/data_usage/external_data_use_observer.cc
@@ -10,6 +10,7 @@
 #include "base/message_loop/message_loop.h"
 #include "base/metrics/field_trial.h"
 #include "base/strings/string_number_conversions.h"
+#include "chrome/browser/android/data_usage/data_use_tab_model.h"
 #include "components/data_usage/core/data_use.h"
 #include "components/variations/variations_associated_data.h"
 #include "content/public/browser/browser_thread.h"
@@ -101,6 +102,9 @@
       base::Bind(&ExternalDataUseObserver::FetchMatchingRulesOnUIThread,
                  GetUIWeakPtr()));
 
+  // |this| owns and must outlive the |data_use_tab_model_|.
+  data_use_tab_model_.reset(new DataUseTabModel(this, ui_task_runner_));
+
   matching_rules_fetch_pending_ = true;
   data_use_aggregator_->AddObserver(this);
   registered_as_observer_ = true;
diff --git a/chrome/browser/android/data_usage/external_data_use_observer.h b/chrome/browser/android/data_usage/external_data_use_observer.h
index 20cc178..d9897c9 100644
--- a/chrome/browser/android/data_usage/external_data_use_observer.h
+++ b/chrome/browser/android/data_usage/external_data_use_observer.h
@@ -17,6 +17,7 @@
 #include "base/gtest_prod_util.h"
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
+#include "base/memory/scoped_ptr.h"
 #include "base/memory/scoped_vector.h"
 #include "base/memory/weak_ptr.h"
 #include "base/single_thread_task_runner.h"
@@ -40,6 +41,8 @@
 
 namespace android {
 
+class DataUseTabModel;
+
 // This class allows platform APIs that are external to Chromium to observe how
 // much data is used by Chromium on the current Android device. It creates and
 // owns a Java listener object that is notified of the data usage observations
@@ -83,6 +86,11 @@
   // called on UI thread.
   void OnReportDataUseDone(JNIEnv* env, jobject obj, bool success);
 
+  // Returns true if the |gurl| matches the registered regular expressions.
+  // |label| must not be null. If a match is found, the |label| is set to the
+  // matching rule's label.
+  bool Matches(const GURL& gurl, std::string* label) const;
+
  private:
   FRIEND_TEST_ALL_PREFIXES(ExternalDataUseObserverTest, SingleRegex);
   FRIEND_TEST_ALL_PREFIXES(ExternalDataUseObserverTest, TwoRegex);
@@ -268,11 +276,6 @@
                           const std::vector<std::string>& domain_path_regex,
                           const std::vector<std::string>& label);
 
-  // Returns true if the |gurl| matches the registered regular expressions.
-  // |label| must not be null. If a match is found, the |label| is set to the
-  // matching rule's label.
-  bool Matches(const GURL& gurl, std::string* label) const;
-
   // Return the weak pointer to |this| to be used on IO and UI thread,
   // respectively.
   base::WeakPtr<ExternalDataUseObserver> GetIOWeakPtr();
@@ -286,6 +289,9 @@
   // notified to |j_external_data_use_observer_|.
   base::android::ScopedJavaGlobalRef<jobject> j_external_data_use_observer_;
 
+  // Maintains tab sessions.
+  scoped_ptr<DataUseTabModel> data_use_tab_model_;
+
   // True if callback from |FetchMatchingRulesCallback| is currently pending.
   bool matching_rules_fetch_pending_;
 
diff --git a/chrome/browser/android/data_usage/external_data_use_observer_unittest.cc b/chrome/browser/android/data_usage/external_data_use_observer_unittest.cc
index cc84caa..9153ad447 100644
--- a/chrome/browser/android/data_usage/external_data_use_observer_unittest.cc
+++ b/chrome/browser/android/data_usage/external_data_use_observer_unittest.cc
@@ -15,6 +15,7 @@
 #include "base/thread_task_runner_handle.h"
 #include "components/data_usage/core/data_use.h"
 #include "components/data_usage/core/data_use_aggregator.h"
+#include "components/data_usage/core/data_use_annotator.h"
 #include "components/variations/variations_associated_data.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/test/test_browser_thread_bundle.h"
@@ -35,7 +36,8 @@
         content::BrowserThread::IO);
     ui_task_runner_ = content::BrowserThread::GetMessageLoopProxyForThread(
         content::BrowserThread::UI);
-    data_use_aggregator_.reset(new data_usage::DataUseAggregator());
+    data_use_aggregator_.reset(new data_usage::DataUseAggregator(
+        scoped_ptr<data_usage::DataUseAnnotator>()));
     external_data_use_observer_.reset(new ExternalDataUseObserver(
         data_use_aggregator_.get(), io_task_runner_.get(),
         ui_task_runner_.get()));
diff --git a/chrome/browser/android/data_usage/tab_data_use_entry.cc b/chrome/browser/android/data_usage/tab_data_use_entry.cc
new file mode 100644
index 0000000..041fe4df
--- /dev/null
+++ b/chrome/browser/android/data_usage/tab_data_use_entry.cc
@@ -0,0 +1,156 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/android/data_usage/tab_data_use_entry.h"
+
+#include "base/gtest_prod_util.h"
+#include "base/macros.h"
+
+namespace {
+
+// Indicates the maximum number of tracking session history to maintain per tab.
+const size_t kMaxSessionsPerTab = 5;
+
+// Indicates the expiration duration in seconds for a closed tab entry, after
+// which it can be sweeped from history.
+const unsigned int kClosedTabExpirationDurationSeconds = 30;  // 30 seconds.
+
+// Indicates the expiration duration in seconds for an open tab entry, after
+// which it can be sweeped from history.
+const unsigned int kOpenTabExpirationDurationSeconds =
+    60 * 60 * 24 * 5;  // 5 days.
+
+}  // namespace
+
+namespace chrome {
+
+namespace android {
+
+size_t TabDataUseEntry::GetMaxSessionsPerTabForTests() {
+  return kMaxSessionsPerTab;
+}
+
+unsigned int TabDataUseEntry::GetClosedTabExpirationDurationSecondsForTests() {
+  return kClosedTabExpirationDurationSeconds;
+}
+
+unsigned int TabDataUseEntry::GetOpenTabExpirationDurationSecondsForTests() {
+  return kOpenTabExpirationDurationSeconds;
+}
+
+TabDataUseEntry::TabDataUseEntry() {}
+
+TabDataUseEntry::TabDataUseEntry(const TabDataUseEntry& other) = default;
+
+TabDataUseEntry::~TabDataUseEntry() {}
+
+base::TimeTicks TabDataUseEntry::Now() const {
+  return base::TimeTicks::Now();
+}
+
+bool TabDataUseEntry::StartTracking(const std::string& label) {
+  DCHECK(!label.empty());
+  DCHECK(tab_close_time_.is_null());
+
+  if (IsTrackingDataUse())
+    return false;  // Duplicate start events.
+
+  // TODO(rajendrant): Explore ability to handle changes in label for current
+  // session.
+
+  sessions_.push_back(TabDataUseTrackingSession(label, Now()));
+
+  CompactSessionHistory();
+  return true;
+}
+
+bool TabDataUseEntry::EndTracking() {
+  DCHECK(tab_close_time_.is_null());
+  if (!IsTrackingDataUse())
+    return false;  // Duplicate end events.
+
+  TabSessions::reverse_iterator back_iterator = sessions_.rbegin();
+  if (back_iterator == sessions_.rend())
+    return false;
+
+  back_iterator->end_time = Now();
+  return true;
+}
+
+void TabDataUseEntry::OnTabCloseEvent() {
+  DCHECK(!IsTrackingDataUse());
+  tab_close_time_ = Now();
+}
+
+bool TabDataUseEntry::IsExpired() const {
+  const base::TimeTicks now = Now();
+
+  if (!tab_close_time_.is_null()) {
+    // Closed tab entry.
+    return ((now - tab_close_time_) >
+            base::TimeDelta::FromSeconds(kClosedTabExpirationDurationSeconds));
+  }
+
+  const base::TimeTicks latest_session_time = GetLatestStartOrEndTime();
+  if (latest_session_time.is_null() ||
+      ((now - latest_session_time) >
+       base::TimeDelta::FromSeconds(kOpenTabExpirationDurationSeconds))) {
+    // TODO(rajendrant): Add UMA to track deletion of entries corresponding to
+    // existing tabs.
+    return true;
+  }
+  return false;
+}
+
+bool TabDataUseEntry::GetLabel(const base::TimeTicks& data_use_time,
+                               std::string* output_label) const {
+  *output_label = "";
+
+  // Find a tracking session in history that was active at |data_use_time|.
+  for (TabSessions::const_reverse_iterator session_iterator =
+           sessions_.rbegin();
+       session_iterator != sessions_.rend(); ++session_iterator) {
+    if (session_iterator->start_time <= data_use_time &&
+        (session_iterator->end_time.is_null() ||
+         session_iterator->end_time >= data_use_time)) {
+      *output_label = session_iterator->label;
+      return true;
+    }
+    if (!session_iterator->end_time.is_null() &&
+        session_iterator->end_time < data_use_time) {
+      // Older sessions in history will end before |data_use_time| and will not
+      // match.
+      break;
+    }
+  }
+  return false;
+}
+
+bool TabDataUseEntry::IsTrackingDataUse() const {
+  TabSessions::const_reverse_iterator back_iterator = sessions_.rbegin();
+  if (back_iterator == sessions_.rend())
+    return false;
+  return back_iterator->end_time.is_null();
+}
+
+const base::TimeTicks TabDataUseEntry::GetLatestStartOrEndTime() const {
+  TabSessions::const_reverse_iterator back_iterator = sessions_.rbegin();
+  if (back_iterator == sessions_.rend())
+    return base::TimeTicks();  // No tab session found.
+  if (!back_iterator->end_time.is_null())
+    return back_iterator->end_time;
+
+  DCHECK(!back_iterator->start_time.is_null());
+  return back_iterator->start_time;
+}
+
+void TabDataUseEntry::CompactSessionHistory() {
+  // TODO(rajendrant): Add UMA to track how often old sessions are lost.
+  while (sessions_.size() > kMaxSessionsPerTab)
+    sessions_.pop_front();
+}
+
+}  // namespace android
+
+}  // namespace chrome
diff --git a/chrome/browser/android/data_usage/tab_data_use_entry.h b/chrome/browser/android/data_usage/tab_data_use_entry.h
new file mode 100644
index 0000000..86dbf5a
--- /dev/null
+++ b/chrome/browser/android/data_usage/tab_data_use_entry.h
@@ -0,0 +1,120 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_ANDROID_DATA_USAGE_TAB_DATA_USE_ENTRY_H_
+#define CHROME_BROWSER_ANDROID_DATA_USAGE_TAB_DATA_USE_ENTRY_H_
+
+#include <deque>
+#include <string>
+
+#include "base/gtest_prod_util.h"
+#include "base/macros.h"
+#include "base/time/time.h"
+
+namespace chrome {
+
+namespace android {
+
+// TabDataUseTrackingSession maintains the information about a single tracking
+// session within a browser tab.
+struct TabDataUseTrackingSession {
+  TabDataUseTrackingSession(const std::string& label,
+                            const base::TimeTicks& start_time)
+      : label(label), start_time(start_time) {}
+
+  // Tracking label to be associated with the data usage of this session.
+  const std::string label;
+
+  // Time the data use tracking session started.
+  const base::TimeTicks start_time;
+
+  // Time the data use tracking session ended. |end_time| will be null if the
+  // tracking session is currently active.
+  base::TimeTicks end_time;
+};
+
+// TabDataUseEntry contains the history of the disjoint tracking sessions for a
+// single browser tab.
+class TabDataUseEntry {
+ public:
+  TabDataUseEntry();
+
+  TabDataUseEntry(const TabDataUseEntry& other);
+
+  virtual ~TabDataUseEntry();
+
+  TabDataUseEntry& operator=(const TabDataUseEntry& other) = default;
+
+  // Initiates a new tracking session with the given |label|. Returns false if a
+  // tracking session is already active, and true otherwise.
+  bool StartTracking(const std::string& label);
+
+  // Ends the active tracking session. Returns false if there is no active
+  // tracking session, and true otherwise.
+  bool EndTracking();
+
+  // Records that the tab has been closed, in preparation for deletion.
+  void OnTabCloseEvent();
+
+  // Gets the label of the session in history that was active at
+  // |data_use_time|. |output_label| must not be null. If a session is found,
+  // returns true and |output_label| is populated. Otherwise returns false and
+  // |output_label| is set to empty string.
+  bool GetLabel(const base::TimeTicks& data_use_time,
+                std::string* output_label) const;
+
+  // Returns true if the tracking session is currently active.
+  bool IsTrackingDataUse() const;
+
+  // Returns true if the tab has expired. A closed tab entry expires
+  // |kClosedTabExpirationDurationSeconds| seconds after it was closed. An open
+  // tab entry expires |kOpenTabExpirationDurationSeconds| seconds after the
+  // most recent tracking session start or end event.
+  bool IsExpired() const;
+
+  // Returns the latest time a tracking session was started or ended. Returned
+  // time will be null if no tracking session was ever started or ended.
+  const base::TimeTicks GetLatestStartOrEndTime() const;
+
+ private:
+  friend class TabDataUseEntryTest;
+  friend class MockTabDataUseEntryTest;
+  FRIEND_TEST_ALL_PREFIXES(TabDataUseEntryTest, SingleTabSessionCloseEvent);
+  FRIEND_TEST_ALL_PREFIXES(TabDataUseEntryTest, MultipleTabSessionCloseEvent);
+  FRIEND_TEST_ALL_PREFIXES(DataUseTabModelTest, TabCloseEvent);
+  FRIEND_TEST_ALL_PREFIXES(MockTabDataUseEntryTest, CompactTabSessionHistory);
+
+  typedef std::deque<TabDataUseTrackingSession> TabSessions;
+
+  // Returns the maximum number of tracking sessions to maintain per tab, for
+  // testing purposes.
+  static size_t GetMaxSessionsPerTabForTests();
+
+  // Returns the expiration duration in seconds for a closed tab entry and an
+  // open tab entry respectively, for testing purposes.
+  static unsigned int GetClosedTabExpirationDurationSecondsForTests();
+  static unsigned int GetOpenTabExpirationDurationSecondsForTests();
+
+  // Virtualized for unit test support.
+  virtual base::TimeTicks Now() const;
+
+  // Compacts the history of tracking sessions by removing oldest sessions to
+  // keep the size of |sessions_| within |kMaxSessionsPerTab| entries.
+  void CompactSessionHistory();
+
+  // Contains the history of sessions in chronological order. Oldest sessions
+  // will be at the front of the queue, and new sessions will get added to the
+  // end of the queue.
+  TabSessions sessions_;
+
+  // Indicates the time the tab was closed. |tab_close_time_| will be null if
+  // the tab is still open.
+  base::TimeTicks tab_close_time_;
+};
+
+}  // namespace android
+
+}  // namespace chrome
+
+#endif  // CHROME_BROWSER_ANDROID_DATA_USAGE_TAB_DATA_USE_ENTRY_H_
diff --git a/chrome/browser/android/data_usage/tab_data_use_entry_unittest.cc b/chrome/browser/android/data_usage/tab_data_use_entry_unittest.cc
new file mode 100644
index 0000000..cba4c83
--- /dev/null
+++ b/chrome/browser/android/data_usage/tab_data_use_entry_unittest.cc
@@ -0,0 +1,467 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/android/data_usage/tab_data_use_entry.h"
+
+#include <stdint.h>
+
+#include <string>
+
+#include "base/memory/scoped_ptr.h"
+#include "base/strings/stringprintf.h"
+#include "base/time/time.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace {
+
+// Tracking labels for tests.
+const std::string kTestLabel1 = "label_1";
+const std::string kTestLabel2 = "label_2";
+const std::string kTestLabel3 = "label_3";
+
+enum TabEntrySessionSize { ZERO = 0, ONE, TWO, THREE };
+
+}  // namespace
+
+namespace chrome {
+
+namespace android {
+
+class TabDataUseEntryTest : public testing::Test {
+ public:
+  TabDataUseEntryTest() { tab_entry_.reset(new TabDataUseEntry()); }
+
+  // Checks if there are |expected_size| tracking session entries in
+  // |sessions_|.
+  void ExpectTabEntrySessionsSize(uint32_t expected_size) const {
+    EXPECT_EQ(expected_size, tab_entry_->sessions_.size());
+  }
+
+  scoped_ptr<TabDataUseEntry> tab_entry_;
+};
+
+// Starts a single tracking session and checks if a new active session is added
+// to the deque. Ends the session and checks if it becomes inactive.
+TEST_F(TabDataUseEntryTest, SingleTabSessionStartEnd) {
+  ExpectTabEntrySessionsSize(TabEntrySessionSize::ZERO);
+  EXPECT_FALSE(tab_entry_->IsTrackingDataUse());
+
+  EXPECT_TRUE(tab_entry_->StartTracking(kTestLabel1));
+  ExpectTabEntrySessionsSize(TabEntrySessionSize::ONE);
+  EXPECT_TRUE(tab_entry_->IsTrackingDataUse());
+
+  EXPECT_TRUE(tab_entry_->EndTracking());
+  ExpectTabEntrySessionsSize(TabEntrySessionSize::ONE);
+  EXPECT_FALSE(tab_entry_->IsTrackingDataUse());
+}
+
+// Starts multiple tracking sessions and checks if new active sessions are added
+// to the deque for each. Ends the sessions and checks if they become inactive.
+TEST_F(TabDataUseEntryTest, MultipleTabSessionStartEnd) {
+  ExpectTabEntrySessionsSize(TabEntrySessionSize::ZERO);
+  EXPECT_FALSE(tab_entry_->IsTrackingDataUse());
+
+  EXPECT_TRUE(tab_entry_->StartTracking(kTestLabel1));
+  EXPECT_TRUE(tab_entry_->IsTrackingDataUse());
+  EXPECT_TRUE(tab_entry_->EndTracking());
+  EXPECT_FALSE(tab_entry_->IsTrackingDataUse());
+
+  EXPECT_TRUE(tab_entry_->StartTracking(kTestLabel2));
+  EXPECT_TRUE(tab_entry_->IsTrackingDataUse());
+  EXPECT_TRUE(tab_entry_->EndTracking());
+  EXPECT_FALSE(tab_entry_->IsTrackingDataUse());
+
+  EXPECT_TRUE(tab_entry_->StartTracking(kTestLabel3));
+  EXPECT_TRUE(tab_entry_->IsTrackingDataUse());
+  EXPECT_TRUE(tab_entry_->EndTracking());
+  EXPECT_FALSE(tab_entry_->IsTrackingDataUse());
+
+  ExpectTabEntrySessionsSize(TabEntrySessionSize::THREE);
+}
+
+// Checks that starting a session while a tracking session is already active and
+// ending a session while no tracking session is active return false.
+TEST_F(TabDataUseEntryTest, DuplicateTabSessionStartEnd) {
+  EXPECT_TRUE(tab_entry_->StartTracking(kTestLabel1));
+  EXPECT_TRUE(tab_entry_->IsTrackingDataUse());
+
+  // Duplicate start tracking returns false.
+  EXPECT_FALSE(tab_entry_->StartTracking(kTestLabel2));
+  ExpectTabEntrySessionsSize(TabEntrySessionSize::ONE);
+  EXPECT_TRUE(tab_entry_->IsTrackingDataUse());
+
+  EXPECT_TRUE(tab_entry_->EndTracking());
+  EXPECT_FALSE(tab_entry_->IsTrackingDataUse());
+
+  // Duplicate end tracking returns false.
+  EXPECT_FALSE(tab_entry_->EndTracking());
+  EXPECT_FALSE(tab_entry_->IsTrackingDataUse());
+  ExpectTabEntrySessionsSize(TabEntrySessionSize::ONE);
+}
+
+// Checks that tab close time is updated on a close event for a single tracking
+// session.
+TEST_F(TabDataUseEntryTest, SingleTabSessionCloseEvent) {
+  ExpectTabEntrySessionsSize(TabEntrySessionSize::ZERO);
+  EXPECT_TRUE(tab_entry_->tab_close_time_.is_null());
+
+  EXPECT_TRUE(tab_entry_->StartTracking(kTestLabel1));
+  EXPECT_TRUE(tab_entry_->tab_close_time_.is_null());
+
+  EXPECT_TRUE(tab_entry_->EndTracking());
+  EXPECT_TRUE(tab_entry_->tab_close_time_.is_null());
+
+  base::TimeTicks time_before_close = base::TimeTicks::Now();
+  tab_entry_->OnTabCloseEvent();
+  EXPECT_FALSE(tab_entry_->tab_close_time_.is_null());
+  EXPECT_GE(tab_entry_->tab_close_time_, time_before_close);
+  EXPECT_LE(tab_entry_->tab_close_time_, base::TimeTicks::Now());
+
+  EXPECT_FALSE(tab_entry_->IsTrackingDataUse());
+}
+
+// Checks that tab close time is updated on a close event after multiple
+// tracking sessions.
+TEST_F(TabDataUseEntryTest, MultipleTabSessionCloseEvent) {
+  ExpectTabEntrySessionsSize(TabEntrySessionSize::ZERO);
+  EXPECT_TRUE(tab_entry_->tab_close_time_.is_null());
+
+  EXPECT_TRUE(tab_entry_->StartTracking(kTestLabel1));
+  EXPECT_TRUE(tab_entry_->tab_close_time_.is_null());
+  EXPECT_TRUE(tab_entry_->EndTracking());
+  EXPECT_TRUE(tab_entry_->tab_close_time_.is_null());
+
+  EXPECT_TRUE(tab_entry_->StartTracking(kTestLabel2));
+  EXPECT_TRUE(tab_entry_->tab_close_time_.is_null());
+  EXPECT_TRUE(tab_entry_->EndTracking());
+  EXPECT_TRUE(tab_entry_->tab_close_time_.is_null());
+
+  base::TimeTicks time_before_close = base::TimeTicks::Now();
+  tab_entry_->OnTabCloseEvent();
+  EXPECT_FALSE(tab_entry_->tab_close_time_.is_null());
+  EXPECT_GE(tab_entry_->tab_close_time_, time_before_close);
+  EXPECT_LE(tab_entry_->tab_close_time_, base::TimeTicks::Now());
+
+  EXPECT_FALSE(tab_entry_->IsTrackingDataUse());
+}
+
+// Test version of |TabDataUseEntry|, which permits mocking of calls to Now.
+class MockTabDataUseEntry : public TabDataUseEntry {
+ public:
+  MockTabDataUseEntry() {}
+
+  ~MockTabDataUseEntry() override {}
+
+  // Returns the mocked Now time after adding |now_offset_seconds| seconds.
+  static base::TimeTicks GetNowWithOffset(uint32_t now_offset_seconds) {
+    return base::TimeTicks::UnixEpoch() +
+           base::TimeDelta::FromSeconds(now_offset_seconds);
+  }
+
+  // Sets the |now_offset_| delta to |now_offset_seconds| seconds.
+  void SetNowOffsetInSeconds(uint32_t now_offset_seconds) {
+    now_offset_ = base::TimeDelta::FromSeconds(now_offset_seconds);
+  }
+
+ private:
+  // Returns the mocked time as Now.
+  base::TimeTicks Now() const override {
+    return base::TimeTicks::UnixEpoch() + now_offset_;
+  }
+
+  // Represents the delta offset to be added to current time that is returned by
+  // Now.
+  base::TimeDelta now_offset_;
+};
+
+class MockTabDataUseEntryTest : public testing::Test {
+ public:
+  MockTabDataUseEntryTest() { tab_entry_.reset(new MockTabDataUseEntry()); }
+
+  static unsigned int GetClosedTabExpirationDurationSecondsForTests() {
+    return TabDataUseEntry::GetClosedTabExpirationDurationSecondsForTests();
+  }
+
+  static unsigned int GetOpenTabExpirationDurationSecondsForTests() {
+    return TabDataUseEntry::GetOpenTabExpirationDurationSecondsForTests();
+  }
+
+  // Checks if there are |expected_size| tracking session entries in
+  // |sessions_|.
+  void ExpectTabEntrySessionsSize(uint32_t expected_size) const {
+    EXPECT_EQ(expected_size, tab_entry_->sessions_.size());
+  }
+
+  // Checks if the tracking session at position |index| in the |sessions_| queue
+  // has the start and end times represented by offsets in seconds
+  // |start_time_offset| and |end_time_offset| respectively.
+  void ExpectStartEndTimeOffsets(uint32_t index,
+                                 int start_time_offset,
+                                 int end_time_offset) const {
+    EXPECT_LT(index, tab_entry_->sessions_.size());
+    const TabDataUseTrackingSession& session = tab_entry_->sessions_[index];
+    EXPECT_EQ(session.start_time,
+              MockTabDataUseEntry::GetNowWithOffset(start_time_offset));
+    EXPECT_EQ(session.end_time,
+              MockTabDataUseEntry::GetNowWithOffset(end_time_offset));
+  }
+
+  // Checks if the data use time at |offset_seconds| is labeled as
+  // |expected_label|.
+  void ExpectDataUseLabelAtOffsetTime(int offset_seconds,
+                                      const std::string& expected_label) const {
+    ExpectDataUseLabelAtOffsetTimeWithReturn(offset_seconds, expected_label,
+                                             true);
+  }
+
+  // Checks if the data use time at |offset_seconds| is labeled as an empty
+  // string.
+  void ExpectEmptyDataUseLabelAtOffsetTime(int offset_seconds) const {
+    ExpectDataUseLabelAtOffsetTimeWithReturn(offset_seconds, std::string(),
+                                             false);
+  }
+
+  // Checks if GetLabel labels the data use time at |offset_seconds| as
+  // |expected_label| and returns |expected_return|.
+  void ExpectDataUseLabelAtOffsetTimeWithReturn(
+      int offset_seconds,
+      const std::string& expected_label,
+      bool expected_return) const {
+    base::TimeTicks data_use_time =
+        MockTabDataUseEntry::GetNowWithOffset(offset_seconds);
+    std::string actual_label;
+    bool actual_return = tab_entry_->GetLabel(data_use_time, &actual_label);
+    EXPECT_EQ(expected_return, actual_return);
+    EXPECT_EQ(expected_label, actual_label);
+  }
+
+  // Returns true if a tracking session is found labeled with |label|.
+  bool IsTabEntrySessionExists(const std::string& label) const {
+    for (auto session : tab_entry_->sessions_) {
+      if (session.label == label)
+        return true;
+    }
+    return false;
+  }
+
+  scoped_ptr<MockTabDataUseEntry> tab_entry_;
+};
+
+// Checks that start and end times of tracking sessions are updated for multiple
+// tracking sessions.
+TEST_F(MockTabDataUseEntryTest, TabSessionStartEndTimes) {
+  // Start a tracking session at time=0.
+  tab_entry_->SetNowOffsetInSeconds(0);
+  EXPECT_TRUE(tab_entry_->StartTracking(kTestLabel1));
+
+  // End the tracking session at time=10.
+  tab_entry_->SetNowOffsetInSeconds(10);
+  EXPECT_TRUE(tab_entry_->EndTracking());
+
+  // Start a tracking session at time=20, and end it at time=30.
+  tab_entry_->SetNowOffsetInSeconds(20);
+  EXPECT_TRUE(tab_entry_->StartTracking(kTestLabel2));
+  tab_entry_->SetNowOffsetInSeconds(30);
+  EXPECT_TRUE(tab_entry_->EndTracking());
+
+  ExpectTabEntrySessionsSize(TabEntrySessionSize::TWO);
+  ExpectStartEndTimeOffsets(0, 0, 10);
+  ExpectStartEndTimeOffsets(1, 20, 30);
+}
+
+// Checks that correct labels are returned for various mock data use times in a
+// multiple tracking session scenario.
+TEST_F(MockTabDataUseEntryTest, TabSessionLabelDataUse) {
+  // No active session.
+  ExpectEmptyDataUseLabelAtOffsetTime(0);
+  ExpectEmptyDataUseLabelAtOffsetTime(40);
+
+  // Start a tracking session at time=10, and end it at time=20.
+  tab_entry_->SetNowOffsetInSeconds(10);
+  EXPECT_TRUE(tab_entry_->StartTracking(kTestLabel1));
+  tab_entry_->SetNowOffsetInSeconds(20);
+  EXPECT_TRUE(tab_entry_->EndTracking());
+
+  // No tracking session active during the time interval [0-10).
+  ExpectEmptyDataUseLabelAtOffsetTime(0);
+  ExpectEmptyDataUseLabelAtOffsetTime(9);
+
+  // Tracking session active during the time interval [10-20].
+  ExpectDataUseLabelAtOffsetTime(10, kTestLabel1);
+  ExpectDataUseLabelAtOffsetTime(15, kTestLabel1);
+  ExpectDataUseLabelAtOffsetTime(20, kTestLabel1);
+
+  // No tracking session active after time=20.
+  ExpectEmptyDataUseLabelAtOffsetTime(21);
+
+  // Start a tracking session at time=30, and end it at time=40.
+  tab_entry_->SetNowOffsetInSeconds(30);
+  EXPECT_TRUE(tab_entry_->StartTracking(kTestLabel2));
+  tab_entry_->SetNowOffsetInSeconds(40);
+  EXPECT_TRUE(tab_entry_->EndTracking());
+
+  // Tracking session active during the time interval [10-20] and [30-40].
+  ExpectEmptyDataUseLabelAtOffsetTime(0);
+  ExpectEmptyDataUseLabelAtOffsetTime(9);
+  ExpectDataUseLabelAtOffsetTime(10, kTestLabel1);
+  ExpectDataUseLabelAtOffsetTime(15, kTestLabel1);
+  ExpectDataUseLabelAtOffsetTime(20, kTestLabel1);
+  ExpectEmptyDataUseLabelAtOffsetTime(21);
+  ExpectEmptyDataUseLabelAtOffsetTime(29);
+  ExpectDataUseLabelAtOffsetTime(30, kTestLabel2);
+  ExpectDataUseLabelAtOffsetTime(35, kTestLabel2);
+  ExpectDataUseLabelAtOffsetTime(40, kTestLabel2);
+
+  // No tracking session active after time=40.
+  ExpectEmptyDataUseLabelAtOffsetTime(41);
+}
+
+// Checks that open tab entries expire after
+// GetOpenTabExpirationDurationSecondsForTests seconds from their latest
+// tracking session start time.
+TEST_F(MockTabDataUseEntryTest, OpenTabSessionExpiryFromLatestSessionStart) {
+  const unsigned int open_tab_expiration_seconds =
+      GetOpenTabExpirationDurationSecondsForTests();
+
+  // Initial tab entry with no sessions is considered expired.
+  EXPECT_TRUE(tab_entry_->IsExpired());
+
+  // Start a tracking session at time=10.
+  tab_entry_->SetNowOffsetInSeconds(10);
+  EXPECT_TRUE(tab_entry_->StartTracking(kTestLabel1));
+  EXPECT_FALSE(tab_entry_->IsExpired());
+
+  // Fast forward |open_tab_expiration_seconds| seconds from session start time.
+  // Tab entry is not expired.
+  tab_entry_->SetNowOffsetInSeconds(10 + open_tab_expiration_seconds);
+  EXPECT_FALSE(tab_entry_->IsExpired());
+
+  // Fast forward |open_tab_expiration_seconds+1| seconds from session start
+  // time. Tab entry is expired.
+  tab_entry_->SetNowOffsetInSeconds(10 + open_tab_expiration_seconds + 1);
+  EXPECT_TRUE(tab_entry_->IsExpired());
+}
+
+// Checks that open tab entries expire after
+// GetOpenTabExpirationDurationSecondsForTests seconds from their latest
+// tracking session end time.
+TEST_F(MockTabDataUseEntryTest, OpenTabSessionExpiryFromLatestSessionEnd) {
+  const unsigned int open_tab_expiration_seconds =
+      GetOpenTabExpirationDurationSecondsForTests();
+
+  // Initial tab entry with no sessions is considered expired.
+  EXPECT_TRUE(tab_entry_->IsExpired());
+
+  // Start a tracking session at time=10, and end it at time=20.
+  tab_entry_->SetNowOffsetInSeconds(10);
+  EXPECT_TRUE(tab_entry_->StartTracking(kTestLabel1));
+  tab_entry_->SetNowOffsetInSeconds(20);
+  EXPECT_TRUE(tab_entry_->EndTracking());
+  EXPECT_FALSE(tab_entry_->IsExpired());
+
+  // Fast forward |open_tab_expiration_seconds| seconds from session end
+  // time. Tab entry is not expired.
+  tab_entry_->SetNowOffsetInSeconds(20 + open_tab_expiration_seconds);
+  EXPECT_FALSE(tab_entry_->IsExpired());
+
+  // Fast forward |open_tab_expiration_seconds+1| seconds from session end
+  // time. Tab entry is expired.
+  tab_entry_->SetNowOffsetInSeconds(20 + open_tab_expiration_seconds + 1);
+  EXPECT_TRUE(tab_entry_->IsExpired());
+}
+
+// Checks that closed tab entries expire after
+// GetClosedTabExpirationDurationSecondsForTests seconds from their closing
+// time.
+TEST_F(MockTabDataUseEntryTest, ClosedTabSessionExpiry) {
+  const unsigned int closed_tab_expiration_seconds =
+      GetClosedTabExpirationDurationSecondsForTests();
+
+  // Initial tab entry with no sessions is considered expired.
+  EXPECT_TRUE(tab_entry_->IsExpired());
+
+  // Start a tracking session at time=10, and end it at time=20.
+  tab_entry_->SetNowOffsetInSeconds(10);
+  EXPECT_TRUE(tab_entry_->StartTracking(kTestLabel1));
+  tab_entry_->SetNowOffsetInSeconds(20);
+  EXPECT_TRUE(tab_entry_->EndTracking());
+  EXPECT_FALSE(tab_entry_->IsExpired());
+
+  // Close the tab entry at time=30.
+  tab_entry_->SetNowOffsetInSeconds(30);
+  tab_entry_->OnTabCloseEvent();
+
+  // Fast forward |closed_tab_expiration_seconds| seconds from tab close
+  // time. Tab entry is not expired.
+  tab_entry_->SetNowOffsetInSeconds(30 + closed_tab_expiration_seconds);
+  EXPECT_FALSE(tab_entry_->IsExpired());
+
+  // Fast forward |closed_tab_expiration_seconds+1| seconds from tab close
+  // time. Tab entry is expired.
+  tab_entry_->SetNowOffsetInSeconds(30 + closed_tab_expiration_seconds + 1);
+  EXPECT_TRUE(tab_entry_->IsExpired());
+}
+
+// Checks that tracking session history does not grow beyond
+// GetMaxSessionsPerTabForTests entries, and automatically compacts itself by
+// removing the oldest tracking sessions.
+TEST_F(MockTabDataUseEntryTest, CompactTabSessionHistory) {
+  const size_t max_sessions_per_tab =
+      TabDataUseEntry::GetMaxSessionsPerTabForTests();
+  const uint32_t per_session_duration = 10;
+  const uint32_t next_session_start_gap = 10;
+  uint32_t session_start_time = 10;
+  uint32_t num_sessions = 1;
+
+  ExpectTabEntrySessionsSize(TabEntrySessionSize::ZERO);
+
+  while (num_sessions <= max_sessions_per_tab) {
+    // Start tracking session at time=|session_start_time| and end after
+    // time=|per_session_duration|.
+    std::string session_label = base::StringPrintf("label_%d", num_sessions);
+    tab_entry_->SetNowOffsetInSeconds(session_start_time);
+    EXPECT_TRUE(tab_entry_->StartTracking(session_label));
+    tab_entry_->SetNowOffsetInSeconds(session_start_time +
+                                      per_session_duration);
+    EXPECT_TRUE(tab_entry_->EndTracking());
+
+    ExpectTabEntrySessionsSize(num_sessions);
+
+    // Update next session start time.
+    session_start_time += per_session_duration + next_session_start_gap;
+    ++num_sessions;
+  }
+
+  int oldest_session = 1;  // Oldest session ID that will be removed first.
+
+  // Check if session history size stays at |max_sessions_per_tab|, when more
+  // sessions are added.
+  while (num_sessions < max_sessions_per_tab + 10) {
+    std::string oldest_session_label =
+        base::StringPrintf("label_%d", oldest_session);
+    EXPECT_TRUE(IsTabEntrySessionExists(oldest_session_label));
+
+    // Start tracking session at time=|session_start_time| and end after
+    // time=|per_session_duration|.
+    std::string session_label = base::StringPrintf("label_%d", num_sessions);
+    tab_entry_->SetNowOffsetInSeconds(session_start_time);
+    EXPECT_TRUE(tab_entry_->StartTracking(session_label));
+    tab_entry_->SetNowOffsetInSeconds(session_start_time +
+                                      per_session_duration);
+    EXPECT_TRUE(tab_entry_->EndTracking());
+
+    // Oldest entry got removed.
+    EXPECT_FALSE(IsTabEntrySessionExists(oldest_session_label));
+    ExpectTabEntrySessionsSize(max_sessions_per_tab);
+
+    // Update next session start time.
+    session_start_time += per_session_duration + next_session_start_gap;
+    ++num_sessions;
+    ++oldest_session;
+  }
+}
+
+}  // namespace android
+
+}  // namespace chrome
diff --git a/chrome/browser/android/logo_bridge.cc b/chrome/browser/android/logo_bridge.cc
index 764f630..17d08fb 100644
--- a/chrome/browser/android/logo_bridge.cc
+++ b/chrome/browser/android/logo_bridge.cc
@@ -10,6 +10,7 @@
 #include "base/android/jni_array.h"
 #include "base/android/jni_string.h"
 #include "base/android/scoped_java_ref.h"
+#include "base/metrics/histogram_macros.h"
 #include "chrome/browser/android/logo_service.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/profiles/profile_android.h"
@@ -139,6 +140,7 @@
   fetcher_ = net::URLFetcher::Create(url, net::URLFetcher::GET, this);
   fetcher_->SetRequestContext(request_context_getter_.get());
   fetcher_->Start();
+  animated_logo_download_start_time_ = base::TimeTicks::Now();
 }
 
 void LogoBridge::OnURLFetchComplete(const net::URLFetcher* source) {
@@ -148,6 +150,10 @@
     return;
   }
 
+  UMA_HISTOGRAM_TIMES(
+      "NewTabPage.AnimatedLogoDownloadTime",
+      base::TimeTicks::Now() - animated_logo_download_start_time_);
+
   std::string response;
   source->GetResponseAsString(&response);
   JNIEnv* env = base::android::AttachCurrentThread();
diff --git a/chrome/browser/android/logo_bridge.h b/chrome/browser/android/logo_bridge.h
index be5b4aa0..9010b27 100644
--- a/chrome/browser/android/logo_bridge.h
+++ b/chrome/browser/android/logo_bridge.h
@@ -47,6 +47,9 @@
   // fetching.
   scoped_ptr<net::URLFetcher> fetcher_;
 
+  // The timestamp for the last time the animated logo started downloading.
+  base::TimeTicks animated_logo_download_start_time_;
+
   // The URLRequestContextGetter used to download the animated logo.
   scoped_refptr<net::URLRequestContextGetter> request_context_getter_;
 
diff --git a/chrome/browser/autocomplete/search_provider_unittest.cc b/chrome/browser/autocomplete/search_provider_unittest.cc
index f7259671..e1e82f8 100644
--- a/chrome/browser/autocomplete/search_provider_unittest.cc
+++ b/chrome/browser/autocomplete/search_provider_unittest.cc
@@ -2290,6 +2290,47 @@
   }
 }
 
+TEST_F(SearchProviderTest, DontCacheCalculatorSuggestions) {
+  // This test sends two separate queries and checks that at each stage of
+  // processing (receiving first asynchronous response, handling new keystroke
+  // synchronously) we have the expected matches.  The new keystroke should
+  // immediately invalidate old calculator suggestions.
+  struct {
+    const std::string json;
+    const ExpectedMatch async_matches[4];
+    const ExpectedMatch sync_matches[4];
+  } cases[] = {
+    { "[\"1+2\",[\"3\", \"1+2+3+4+5\"],[],[],"
+       "{\"google:verbatimrelevance\":1300,"
+        "\"google:suggesttype\":[\"CALCULATOR\", \"QUERY\"],"
+        "\"google:suggestrelevance\":[1200, 900]}]",
+      { { "1+2", true }, { "3", false }, { "1+2+3+4+5", false },
+        kEmptyExpectedMatch },
+      { { "1+23", true }, { "1+2+3+4+5", false }, kEmptyExpectedMatch,
+        kEmptyExpectedMatch } },
+  };
+
+  for (size_t i = 0; i < arraysize(cases); ++i) {
+    // First, send the query "1+2" and receive the JSON response |first_json|.
+    ClearAllResults();
+    QueryForInputAndWaitForFetcherResponses(
+        ASCIIToUTF16("1+2"), false, cases[i].json, std::string());
+
+    // Verify that the matches after the asynchronous results are as expected.
+    std::string description = "first asynchronous response for input with "
+        "json=" + cases[i].json;
+    CheckMatches(description, arraysize(cases[i].async_matches),
+                 cases[i].async_matches, provider_->matches());
+
+    // Then, send the query "1+23" and check the synchronous matches.
+    description = "synchronous response after the first keystroke after input "
+        "with json=" + cases[i].json;
+    QueryForInput(ASCIIToUTF16("1+23"), false, false);
+    CheckMatches(description, arraysize(cases[i].sync_matches),
+                 cases[i].sync_matches, provider_->matches());
+  }
+}
+
 TEST_F(SearchProviderTest, LocalAndRemoteRelevances) {
   // We hardcode the string "term1" below, so ensure that the search term that
   // got added to history already is that string.
diff --git a/chrome/browser/background/background_mode_manager.cc b/chrome/browser/background/background_mode_manager.cc
index 49069706..288eafd 100644
--- a/chrome/browser/background/background_mode_manager.cc
+++ b/chrome/browser/background/background_mode_manager.cc
@@ -963,11 +963,12 @@
       }
     }
     // We should only be displaying the status tray icon if there is at least
-    // one profile using background mode.
-    DCHECK_GT(profiles_using_background_mode, 0);
+    // one profile using background mode. If |keep_alive_for_test_| is set,
+    // there may not be any profiles and that is okay.
+    DCHECK(profiles_using_background_mode > 0 || keep_alive_for_test_);
   } else {
     // We should only have one profile in the cache if we are not
-    // using multi-profiles. If keep_alive_for_test_ is set, then we may not
+    // using multi-profiles. If |keep_alive_for_test_| is set, then we may not
     // have any profiles in the cache.
     DCHECK(profile_cache_->GetNumberOfProfiles() == size_t(1) ||
            keep_alive_for_test_);
diff --git a/chrome/browser/bitmap_fetcher/bitmap_fetcher_service.cc b/chrome/browser/bitmap_fetcher/bitmap_fetcher_service.cc
index 17d4f313..f51651b 100644
--- a/chrome/browser/bitmap_fetcher/bitmap_fetcher_service.cc
+++ b/chrome/browser/bitmap_fetcher/bitmap_fetcher_service.cc
@@ -118,8 +118,10 @@
     EnsureFetcherForUrl(url);
 }
 
-chrome::BitmapFetcher* BitmapFetcherService::CreateFetcher(const GURL& url) {
-  chrome::BitmapFetcher* new_fetcher = new chrome::BitmapFetcher(url, this);
+scoped_ptr<chrome::BitmapFetcher> BitmapFetcherService::CreateFetcher(
+    const GURL& url) {
+  scoped_ptr<chrome::BitmapFetcher> new_fetcher(
+      new chrome::BitmapFetcher(url, this));
 
   new_fetcher->Init(
       context_->GetRequestContext(),
@@ -136,32 +138,29 @@
   if (fetcher)
     return fetcher;
 
-  chrome::BitmapFetcher* new_fetcher = CreateFetcher(url);
-  active_fetchers_.push_back(new_fetcher);
-  return new_fetcher;
+  scoped_ptr<chrome::BitmapFetcher> new_fetcher = CreateFetcher(url);
+  active_fetchers_.push_back(new_fetcher.Pass());
+  return active_fetchers_.back().get();
 }
 
 const chrome::BitmapFetcher* BitmapFetcherService::FindFetcherForUrl(
     const GURL& url) {
-  for (BitmapFetchers::iterator iter = active_fetchers_.begin();
-       iter != active_fetchers_.end();
-       ++iter) {
-    if (url == (*iter)->url())
-      return *iter;
+  for (auto it = active_fetchers_.begin(); it != active_fetchers_.end(); ++it) {
+    if (url == (*it)->url())
+      return it->get();
   }
-  return NULL;
+  return nullptr;
 }
 
 void BitmapFetcherService::RemoveFetcher(const chrome::BitmapFetcher* fetcher) {
-  for (BitmapFetchers::iterator iter = active_fetchers_.begin();
-       iter != active_fetchers_.end();
-       ++iter) {
-    if (fetcher == (*iter)) {
-      active_fetchers_.erase(iter);
-      return;
-    }
+  auto it = active_fetchers_.begin();
+  for (; it != active_fetchers_.end(); ++it) {
+    if (it->get() == fetcher)
+      break;
   }
-  NOTREACHED();  // RemoveFetcher should always result in removal.
+  // RemoveFetcher should always result in removal.
+  DCHECK(it != active_fetchers_.end());
+  active_fetchers_.erase(it);
 }
 
 void BitmapFetcherService::OnFetchComplete(const GURL& url,
diff --git a/chrome/browser/bitmap_fetcher/bitmap_fetcher_service.h b/chrome/browser/bitmap_fetcher/bitmap_fetcher_service.h
index cc3ecba4..a6bf8ba 100644
--- a/chrome/browser/bitmap_fetcher/bitmap_fetcher_service.h
+++ b/chrome/browser/bitmap_fetcher/bitmap_fetcher_service.h
@@ -63,13 +63,11 @@
  protected:
   // Create a bitmap fetcher for the given |url| and start it. Virtual method
   // so tests can override this for different behavior.
-  virtual chrome::BitmapFetcher* CreateFetcher(const GURL& url);
+  virtual scoped_ptr<chrome::BitmapFetcher> CreateFetcher(const GURL& url);
 
  private:
   friend class BitmapFetcherServiceTest;
 
-  typedef ScopedVector<chrome::BitmapFetcher> BitmapFetchers;
-
   // Gets the existing fetcher for |url| or constructs a new one if it doesn't
   // exist.
   const chrome::BitmapFetcher* EnsureFetcherForUrl(const GURL& url);
@@ -85,7 +83,7 @@
   void OnFetchComplete(const GURL& url, const SkBitmap* bitmap) override;
 
   // Currently active image fetchers.
-  BitmapFetchers active_fetchers_;
+  std::vector<scoped_ptr<chrome::BitmapFetcher>> active_fetchers_;
 
   // Currently active requests.
   ScopedVector<BitmapFetcherRequest> requests_;
diff --git a/chrome/browser/bitmap_fetcher/bitmap_fetcher_service_unittest.cc b/chrome/browser/bitmap_fetcher/bitmap_fetcher_service_unittest.cc
index 4cbc4b0..f4f780ab 100644
--- a/chrome/browser/bitmap_fetcher/bitmap_fetcher_service_unittest.cc
+++ b/chrome/browser/bitmap_fetcher/bitmap_fetcher_service_unittest.cc
@@ -42,8 +42,8 @@
 
   // Create a fetcher, but don't start downloading. That allows side-stepping
   // the decode step, which requires a utility process.
-  chrome::BitmapFetcher* CreateFetcher(const GURL& url) override {
-    return new chrome::BitmapFetcher(url, this);
+  scoped_ptr<chrome::BitmapFetcher> CreateFetcher(const GURL& url) override {
+    return make_scoped_ptr(new chrome::BitmapFetcher(url, this));
   }
 };
 
@@ -66,7 +66,8 @@
   const ScopedVector<BitmapFetcherRequest>& requests() const {
     return service_->requests_;
   }
-  const ScopedVector<chrome::BitmapFetcher>& active_fetchers() const {
+  const std::vector<scoped_ptr<chrome::BitmapFetcher>>& active_fetchers()
+      const {
     return service_->active_fetchers_;
   }
   size_t cache_size() const { return service_->cache_.size(); }
diff --git a/chrome/browser/browser_resources.grd b/chrome/browser/browser_resources.grd
index d6097b42..7e6595ac 100644
--- a/chrome/browser/browser_resources.grd
+++ b/chrome/browser/browser_resources.grd
@@ -130,7 +130,7 @@
         <include name="IDR_MD_DOWNLOADS_CONSTANTS_JS" file="resources\md_downloads\constants.js" type="BINDATA" />
         <include name="IDR_MD_DOWNLOADS_CRISPER_JS" file="resources\md_downloads\crisper.js" flattenhtml="true" type="BINDATA" />
         <include name="IDR_MD_DOWNLOADS_DOWNLOADS_JS" file="resources\md_downloads\downloads.js" type="BINDATA" />
-        <include name="IDR_MD_DOWNLOADS_I18N_HTML" file="resources\md_downloads\i18n.html" type="BINDATA" />
+        <include name="IDR_MD_DOWNLOADS_I18N_SETUP_HTML" file="resources\md_downloads\i18n_setup.html" type="BINDATA" />
         <include name="IDR_MD_DOWNLOADS_ITEM_CSS" file="resources\md_downloads\item.css" type="BINDATA" flattenhtml="true" />
         <include name="IDR_MD_DOWNLOADS_ITEM_HTML" file="resources\md_downloads\item.html" type="BINDATA" />
         <include name="IDR_MD_DOWNLOADS_ITEM_JS" file="resources\md_downloads\item.js" type="BINDATA" />
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc
index f1ee07ecd..a1bf4a78 100644
--- a/chrome/browser/chrome_content_browser_client.cc
+++ b/chrome/browser/chrome_content_browser_client.cc
@@ -2558,9 +2558,8 @@
   return base::string16();
 }
 
-void ChromeContentBrowserClient::PreSpawnRenderer(
-    sandbox::TargetPolicy* policy,
-    bool* success) {
+bool ChromeContentBrowserClient::PreSpawnRenderer(
+    sandbox::TargetPolicy* policy) {
   // This code is duplicated in nacl_exe_win_64.cc.
   // Allow the server side of a pipe restricted to the "chrome.nacl."
   // namespace so that it cannot impersonate other system or other chrome
@@ -2569,20 +2568,15 @@
       sandbox::TargetPolicy::SUBSYS_NAMED_PIPES,
       sandbox::TargetPolicy::NAMEDPIPES_ALLOW_ANY,
       L"\\\\.\\pipe\\chrome.nacl.*");
-  if (result != sandbox::SBOX_ALL_OK) {
-    *success = false;
-    return;
-  }
+  if (result != sandbox::SBOX_ALL_OK)
+    return false;
 
   // Renderers need to send named pipe handles and shared memory
   // segment handles to NaCl loader processes.
   result = policy->AddRule(sandbox::TargetPolicy::SUBSYS_HANDLES,
                            sandbox::TargetPolicy::HANDLES_DUP_ANY,
                            L"File");
-  if (result != sandbox::SBOX_ALL_OK) {
-    *success = false;
-    return;
-  }
+  return result == sandbox::SBOX_ALL_OK;
 }
 #endif
 
diff --git a/chrome/browser/chrome_content_browser_client.h b/chrome/browser/chrome_content_browser_client.h
index ee2f766b..55381c1 100644
--- a/chrome/browser/chrome_content_browser_client.h
+++ b/chrome/browser/chrome_content_browser_client.h
@@ -272,7 +272,7 @@
 #endif  // defined(OS_ANDROID)
 #if defined(OS_WIN)
   const wchar_t* GetResourceDllName() override;
-  void PreSpawnRenderer(sandbox::TargetPolicy* policy, bool* success) override;
+  bool PreSpawnRenderer(sandbox::TargetPolicy* policy) override;
   base::string16 GetAppContainerSidForSandboxType(
       int sandbox_type) const override;
 #endif
diff --git a/chrome/browser/chromeos/login/lock/webui_screen_locker.cc b/chrome/browser/chromeos/login/lock/webui_screen_locker.cc
index d6d601d..318f36b 100644
--- a/chrome/browser/chromeos/login/lock/webui_screen_locker.cc
+++ b/chrome/browser/chromeos/login/lock/webui_screen_locker.cc
@@ -90,6 +90,7 @@
   lock_window_ = lock_window->GetWidget();
   lock_window_->AddObserver(this);
   WebUILoginView::Init();
+  content::WebContentsObserver::Observe(webui_login_->GetWebContents());
   lock_window_->SetContentsView(this);
   lock_window_->SetBounds(bounds);
   lock_window_->Show();
diff --git a/chrome/browser/chromeos/login/lock/webui_screen_locker.h b/chrome/browser/chromeos/login/lock/webui_screen_locker.h
index 9a3ce73..670aea2 100644
--- a/chrome/browser/chromeos/login/lock/webui_screen_locker.h
+++ b/chrome/browser/chromeos/login/lock/webui_screen_locker.h
@@ -20,6 +20,7 @@
 #include "chrome/browser/chromeos/login/ui/login_display.h"
 #include "chrome/browser/chromeos/login/ui/webui_login_view.h"
 #include "chromeos/dbus/power_manager_client.h"
+#include "content/public/browser/web_contents_observer.h"
 #include "ui/gfx/display_observer.h"
 #include "ui/keyboard/keyboard_controller_observer.h"
 #include "ui/views/widget/widget.h"
@@ -54,7 +55,8 @@
                           public PowerManagerClient::Observer,
                           public ash::VirtualKeyboardStateObserver,
                           public keyboard::KeyboardControllerObserver,
-                          public gfx::DisplayObserver {
+                          public gfx::DisplayObserver,
+                          public content::WebContentsObserver {
  public:
   explicit WebUIScreenLocker(ScreenLocker* screen_locker);
 
diff --git a/chrome/browser/chromeos/login/ui/webui_login_view.cc b/chrome/browser/chromeos/login/ui/webui_login_view.cc
index b53b856..38f0efc30 100644
--- a/chrome/browser/chromeos/login/ui/webui_login_view.cc
+++ b/chrome/browser/chromeos/login/ui/webui_login_view.cc
@@ -197,7 +197,6 @@
   web_contents->SetDelegate(this);
   extensions::ChromeExtensionWebContentsObserver::CreateForWebContents(
       web_contents);
-  WebContentsObserver::Observe(web_contents);
   content::RendererPreferences* prefs = web_contents->GetMutableRendererPrefs();
   renderer_preferences_util::UpdateFromSystemSettings(
       prefs, signin_profile, web_contents);
@@ -334,18 +333,6 @@
   tray->SetEnabled(enabled);
 }
 
-void WebUILoginView::AddFrameObserver(FrameObserver* frame_observer) {
-  DCHECK(frame_observer);
-  DCHECK(!frame_observer_list_.HasObserver(frame_observer));
-  frame_observer_list_.AddObserver(frame_observer);
-}
-
-void WebUILoginView::RemoveFrameObserver(FrameObserver* frame_observer) {
-  DCHECK(frame_observer);
-  DCHECK(frame_observer_list_.HasObserver(frame_observer));
-  frame_observer_list_.RemoveObserver(frame_observer);
-}
-
 // WebUILoginView protected: ---------------------------------------------------
 
 void WebUILoginView::Layout() {
@@ -466,23 +453,6 @@
       event.type == blink::WebGestureEvent::GesturePinchEnd;
 }
 
-void WebUILoginView::DidFailProvisionalLoad(
-    content::RenderFrameHost* render_frame_host,
-    const GURL& validated_url,
-    int error_code,
-    const base::string16& error_description,
-    bool was_ignored_by_handler) {
-  FOR_EACH_OBSERVER(FrameObserver,
-                    frame_observer_list_,
-                    OnFrameError(render_frame_host->GetFrameName()));
-  if (render_frame_host->GetFrameName() != "gaia-frame")
-    return;
-
-  GetWebUI()->CallJavascriptFunction("login.GaiaSigninScreen.onFrameError",
-                                     base::FundamentalValue(-error_code),
-                                     base::StringValue(validated_url.spec()));
-}
-
 void WebUILoginView::OnLoginPromptVisible() {
   // If we're hidden than will generate this signal once we're shown.
   if (is_hidden_ || webui_visible_) {
diff --git a/chrome/browser/chromeos/login/ui/webui_login_view.h b/chrome/browser/chromeos/login/ui/webui_login_view.h
index caa6ca5..37d7147 100644
--- a/chrome/browser/chromeos/login/ui/webui_login_view.h
+++ b/chrome/browser/chromeos/login/ui/webui_login_view.h
@@ -14,7 +14,6 @@
 #include "content/public/browser/notification_observer.h"
 #include "content/public/browser/notification_registrar.h"
 #include "content/public/browser/web_contents_delegate.h"
-#include "content/public/browser/web_contents_observer.h"
 #include "ui/views/controls/webview/unhandled_keyboard_event_handler.h"
 #include "ui/views/widget/widget.h"
 #include "ui/views/widget/widget_delegate.h"
@@ -37,17 +36,10 @@
 // WebUI based start up and lock screens. It contains a WebView.
 class WebUILoginView : public views::View,
                        public content::WebContentsDelegate,
-                       public content::WebContentsObserver,
                        public content::NotificationObserver,
                        public ChromeWebModalDialogManagerDelegate,
                        public web_modal::WebContentsModalDialogHost {
  public:
-  class FrameObserver {
-   public:
-    // Called when a frame failed to load.
-    virtual void OnFrameError(const std::string& frame_unique_name) = 0;
-  };
-
   // Internal class name.
   static const char kViewClassName[];
 
@@ -106,9 +98,6 @@
     should_emit_login_prompt_visible_ = emit;
   }
 
-  void AddFrameObserver(FrameObserver* frame_observer);
-  void RemoveFrameObserver(FrameObserver* frame_observer);
-
  protected:
   // Overridden from views::View:
   void Layout() override;
@@ -145,13 +134,6 @@
   bool PreHandleGestureEvent(content::WebContents* source,
                              const blink::WebGestureEvent& event) override;
 
-  // Overridden from content::WebContentsObserver.
-  void DidFailProvisionalLoad(content::RenderFrameHost* render_frame_host,
-                              const GURL& validated_url,
-                              int error_code,
-                              const base::string16& error_description,
-                              bool was_ignored_by_handler) override;
-
   // Performs series of actions when login prompt is considered
   // to be ready and visible.
   // 1. Emits LoginPromptVisible signal if needed
@@ -180,7 +162,6 @@
   bool forward_keyboard_event_;
 
   base::ObserverList<web_modal::ModalDialogHostObserver> observer_list_;
-  base::ObserverList<FrameObserver> frame_observer_list_;
 
   DISALLOW_COPY_AND_ASSIGN(WebUILoginView);
 };
diff --git a/chrome/browser/chromeos/login/users/fake_chrome_user_manager.cc b/chrome/browser/chromeos/login/users/fake_chrome_user_manager.cc
index 88fec2c9..9c4c2f3 100644
--- a/chrome/browser/chromeos/login/users/fake_chrome_user_manager.cc
+++ b/chrome/browser/chromeos/login/users/fake_chrome_user_manager.cc
@@ -6,6 +6,7 @@
 
 #include "chrome/browser/chromeos/login/users/chrome_user_manager.h"
 #include "chrome/browser/chromeos/login/users/fake_supervised_user_manager.h"
+#include "chrome/browser/chromeos/login/users/wallpaper/wallpaper_manager.h"
 #include "chrome/browser/chromeos/profiles/profile_helper.h"
 #include "chrome/browser/chromeos/settings/cros_settings.h"
 #include "chrome/grit/theme_resources.h"
@@ -142,6 +143,11 @@
     const AccountId& account_id,
     user_manager::RemoveUserDelegate* delegate) {}
 
+void FakeChromeUserManager::RemoveUserFromList(const AccountId& account_id) {
+  WallpaperManager::Get()->RemoveUserWallpaperInfo(account_id.GetUserEmail());
+  FakeUserManager::RemoveUserFromList(account_id);
+}
+
 user_manager::UserList
 FakeChromeUserManager::GetUsersAllowedForSupervisedUsersCreation() const {
   CrosSettings* cros_settings = CrosSettings::Get();
diff --git a/chrome/browser/chromeos/login/users/fake_chrome_user_manager.h b/chrome/browser/chromeos/login/users/fake_chrome_user_manager.h
index 6c4d975..608c1ff 100644
--- a/chrome/browser/chromeos/login/users/fake_chrome_user_manager.h
+++ b/chrome/browser/chromeos/login/users/fake_chrome_user_manager.h
@@ -61,6 +61,7 @@
   void SessionStarted() override;
   void RemoveUser(const AccountId& account_id,
                   user_manager::RemoveUserDelegate* delegate) override;
+  void RemoveUserFromList(const AccountId& account_id) override;
   bool FindKnownUserPrefs(const AccountId& account_id,
                           const base::DictionaryValue** out_value) override;
   void UpdateKnownUserPrefs(const AccountId& account_id,
diff --git a/chrome/browser/chromeos/login/users/wallpaper/wallpaper_manager.cc b/chrome/browser/chromeos/login/users/wallpaper/wallpaper_manager.cc
index 4b8f6c8..bf3610a 100644
--- a/chrome/browser/chromeos/login/users/wallpaper/wallpaper_manager.cc
+++ b/chrome/browser/chromeos/login/users/wallpaper/wallpaper_manager.cc
@@ -427,9 +427,15 @@
 }
 
 void WallpaperManager::RemoveUserWallpaperInfo(const std::string& user_id) {
+  if (wallpaper_cache_.find(user_id) != wallpaper_cache_.end())
+    wallpaper_cache_.erase(user_id);
+
+  PrefService* prefs = g_browser_process->local_state();
+  // PrefService could be NULL in tests.
+  if (!prefs)
+    return;
   WallpaperInfo info;
   GetUserWallpaperInfo(user_id, &info);
-  PrefService* prefs = g_browser_process->local_state();
   DictionaryPrefUpdate prefs_wallpapers_info_update(
       prefs, wallpaper::kUsersWallpaperInfo);
   prefs_wallpapers_info_update->RemoveWithoutPathExpansion(user_id, NULL);
@@ -618,7 +624,7 @@
 void WallpaperManager::ScheduleSetUserWallpaper(const std::string& user_id,
                                                 bool delayed) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  // Some unit tests come here without a UserManager or without a pref system.q
+  // Some unit tests come here without a UserManager or without a pref system.
   if (!user_manager::UserManager::IsInitialized() ||
       !g_browser_process->local_state()) {
     return;
@@ -637,6 +643,7 @@
            account_id) &&
        user->HasGaiaAccount()) ||
       user->GetType() == user_manager::USER_TYPE_GUEST) {
+    LOG(ERROR) << "User is ephemeral or guest! Fallback to default wallpaper.";
     InitInitialUserWallpaper(user_id, false);
     GetPendingWallpaper(user_id, delayed)->ResetSetDefaultWallpaper();
     return;
diff --git a/chrome/browser/chromeos/login/users/wallpaper/wallpaper_manager_unittest.cc b/chrome/browser/chromeos/login/users/wallpaper/wallpaper_manager_unittest.cc
index ac00c1d..ca42bde 100644
--- a/chrome/browser/chromeos/login/users/wallpaper/wallpaper_manager_unittest.cc
+++ b/chrome/browser/chromeos/login/users/wallpaper/wallpaper_manager_unittest.cc
@@ -127,4 +127,42 @@
       test_api->GetPathFromCache(test_account_id_3.GetUserEmail(), &path));
 }
 
+// Test that the user's wallpaper cache is cleared after the user is removed.
+TEST_F(WallpaperManagerCacheTest, CacheClearedOnUserRemoval) {
+  const AccountId test_account_id_1 =
+      AccountId::FromUserEmail("test1@example.com");
+  const AccountId test_account_id_2 =
+      AccountId::FromUserEmail("test2@example.com");
+  const base::FilePath path1("user1_custom_path");
+  const base::FilePath path2("user2_custom_path");
+  fake_user_manager()->AddUser(test_account_id_1);
+  fake_user_manager()->AddUser(test_account_id_2);
+
+  scoped_ptr<WallpaperManager::TestApi> test_api(
+      new WallpaperManager::TestApi(WallpaperManager::Get()));
+
+  const gfx::ImageSkia test_user_1_wallpaper = CreateTestImage(SK_ColorRED);
+  const gfx::ImageSkia test_user_2_wallpaper = CreateTestImage(SK_ColorGREEN);
+  test_api->SetWallpaperCache(test_account_id_1.GetUserEmail(), path1,
+                              test_user_1_wallpaper);
+  test_api->SetWallpaperCache(test_account_id_2.GetUserEmail(), path2,
+                              test_user_2_wallpaper);
+
+  gfx::ImageSkia cached_wallpaper;
+  // Test that both user1 and user2's wallpaper can be found in cache.
+  EXPECT_TRUE(test_api->GetWallpaperFromCache(test_account_id_1.GetUserEmail(),
+                                              &cached_wallpaper));
+  EXPECT_TRUE(test_api->GetWallpaperFromCache(test_account_id_2.GetUserEmail(),
+                                              &cached_wallpaper));
+
+  // Remove user2.
+  fake_user_manager()->RemoveUserFromList(test_account_id_2);
+
+  // Test that only user1's wallpaper can be found in cache.
+  EXPECT_TRUE(test_api->GetWallpaperFromCache(test_account_id_1.GetUserEmail(),
+                                              &cached_wallpaper));
+  EXPECT_FALSE(test_api->GetWallpaperFromCache(test_account_id_2.GetUserEmail(),
+                                               &cached_wallpaper));
+}
+
 }  // namespace chromeos
diff --git a/chrome/browser/chromeos/ownership/owner_settings_service_chromeos.cc b/chrome/browser/chromeos/ownership/owner_settings_service_chromeos.cc
index d489f11f..a6c5d91c7 100644
--- a/chrome/browser/chromeos/ownership/owner_settings_service_chromeos.cc
+++ b/chrome/browser/chromeos/ownership/owner_settings_service_chromeos.cc
@@ -466,8 +466,8 @@
   policy->set_timestamp(
       (base::Time::Now() - base::Time::UnixEpoch()).InMilliseconds());
   policy->set_username(user_id);
-  if (policy->management_mode() == em::PolicyData::LOCAL_OWNER ||
-      policy->management_mode() == em::PolicyData::CONSUMER_MANAGED) {
+  if (policy_data->management_mode() == em::PolicyData::LOCAL_OWNER ||
+      policy_data->management_mode() == em::PolicyData::CONSUMER_MANAGED) {
     FixupLocalOwnerPolicy(user_id, settings);
   }
   if (!settings->SerializeToString(policy->mutable_policy_value()))
@@ -755,20 +755,14 @@
   }
 
   em::ChromeDeviceSettingsProto settings;
-  DeviceSettingsService::Status status = device_settings_service_->status();
   if (tentative_settings_.get()) {
     settings.Swap(tentative_settings_.get());
     tentative_settings_.reset();
-  } else if (status == DeviceSettingsService::STORE_SUCCESS &&
+  } else if (device_settings_service_->status() ==
+                 DeviceSettingsService::STORE_SUCCESS &&
              device_settings_service_->device_settings()) {
     settings = *device_settings_service_->device_settings();
-  } else if (status == DeviceSettingsService::STORE_NO_POLICY ||
-             status == DeviceSettingsService::STORE_INVALID_POLICY ||
-             status == DeviceSettingsService::STORE_VALIDATION_ERROR) {
-    // If policy is missing or broken, attempt to clear it.
-    settings.Clear();
   } else {
-    LOG(ERROR) << "Bailing due to bad DeviceSettingsService status " << status;
     return;
   }
 
diff --git a/chrome/browser/chromeos/ownership/owner_settings_service_chromeos_unittest.cc b/chrome/browser/chromeos/ownership/owner_settings_service_chromeos_unittest.cc
index fc8679c..1a36696 100644
--- a/chrome/browser/chromeos/ownership/owner_settings_service_chromeos_unittest.cc
+++ b/chrome/browser/chromeos/ownership/owner_settings_service_chromeos_unittest.cc
@@ -352,20 +352,4 @@
                               provider_->Get(kAccountsPrefUsers)));
 }
 
-TEST_F(OwnerSettingsServiceChromeOSNoOwnerTest, RestoreOwnershipNoPolicy) {
-  device_settings_test_helper_.set_policy_blob(std::string());
-  ReloadDeviceSettings();
-  EXPECT_FALSE(device_settings_service_.policy_data());
-  EXPECT_EQ(DeviceSettingsService::STORE_NO_POLICY,
-            device_settings_service_.status());
-
-  owner_key_util_->SetPrivateKey(device_policy_.GetSigningKey());
-  InitOwner(AccountId::FromUserEmail(device_policy_.policy_data().username()),
-            true);
-  ReloadDeviceSettings();
-  EXPECT_TRUE(service_->IsOwner());
-  EXPECT_TRUE(FindInListValue(device_policy_.policy_data().username(),
-                              provider_->Get(kAccountsPrefUsers)));
-}
-
 }  // namespace chromeos
diff --git a/chrome/browser/data_usage/OWNERS b/chrome/browser/data_usage/OWNERS
new file mode 100644
index 0000000..2a0ba6bb
--- /dev/null
+++ b/chrome/browser/data_usage/OWNERS
@@ -0,0 +1,3 @@
+bengr@chromium.org
+sclittle@chromium.org
+tbansal@chromium.org
diff --git a/chrome/browser/data_usage/tab_id_annotator.cc b/chrome/browser/data_usage/tab_id_annotator.cc
new file mode 100644
index 0000000..4a2243f
--- /dev/null
+++ b/chrome/browser/data_usage/tab_id_annotator.cc
@@ -0,0 +1,94 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/data_usage/tab_id_annotator.h"
+
+#include <stdint.h>
+
+#include "base/bind.h"
+#include "base/callback.h"
+#include "base/location.h"
+#include "base/memory/ref_counted.h"
+#include "base/single_thread_task_runner.h"
+#include "chrome/browser/data_usage/tab_id_provider.h"
+#include "chrome/browser/sessions/session_tab_helper.h"
+#include "components/data_usage/core/data_use.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"
+
+using content::BrowserThread;
+using data_usage::DataUse;
+
+namespace chrome_browser_data_usage {
+
+namespace {
+
+// Attempts to get the associated tab ID for a given render frame. Returns -1 if
+// no associated tab was found.
+int32_t GetTabIdForRenderFrame(int render_process_id, int render_frame_id) {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  // TODO(sclittle): For prerendering tabs, investigate if it's possible to find
+  // the original tab that initiated the prerender.
+  return SessionTabHelper::IdForTab(content::WebContents::FromRenderFrameHost(
+      content::RenderFrameHost::FromID(render_process_id, render_frame_id)));
+}
+
+// Annotates |data_use| with the given |tab_id|, then passes it to |callback|.
+// This is done in a separate function instead of as a method on TabIdAnnotator
+// so that an in-progress annotation can complete even if the TabIdAnnotator is
+// destroyed. This doesn't make much of a difference for production code, but
+// makes it easier to test the TabIdAnnotator.
+void AnnotateDataUse(
+    scoped_ptr<DataUse> data_use,
+    const data_usage::DataUseAnnotator::DataUseConsumerCallback& callback,
+    int32_t tab_id) {
+  DCHECK(data_use);
+  data_use->tab_id = tab_id;
+  callback.Run(data_use.Pass());
+}
+
+}  // namespace
+
+TabIdAnnotator::TabIdAnnotator() {}
+TabIdAnnotator::~TabIdAnnotator() {}
+
+void TabIdAnnotator::Annotate(net::URLRequest* request,
+                              scoped_ptr<DataUse> data_use,
+                              const DataUseConsumerCallback& callback) {
+  DCHECK(thread_checker_.CalledOnValidThread());
+  DCHECK(data_use);
+
+  TabIdProvider* existing_tab_id_provider = reinterpret_cast<TabIdProvider*>(
+      request->GetUserData(TabIdProvider::kUserDataKey));
+  if (existing_tab_id_provider) {
+    existing_tab_id_provider->ProvideTabId(
+        base::Bind(&AnnotateDataUse, base::Passed(&data_use), callback));
+    return;
+  }
+
+  int render_process_id = -1, render_frame_id = -1;
+  if (!content::ResourceRequestInfo::GetRenderFrameForRequest(
+          request, &render_process_id, &render_frame_id)) {
+    // Run the callback immediately with a tab ID of -1 if the request has no
+    // render frame.
+    AnnotateDataUse(data_use.Pass(), callback, -1 /* tab_id */);
+    return;
+  }
+
+  scoped_refptr<base::SingleThreadTaskRunner> ui_thread_task_runner =
+      BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI);
+  scoped_ptr<TabIdProvider> tab_id_provider(new TabIdProvider(
+      ui_thread_task_runner.get(), FROM_HERE,
+      base::Bind(&GetTabIdForRenderFrame, render_process_id, render_frame_id)));
+  tab_id_provider->ProvideTabId(
+      base::Bind(&AnnotateDataUse, base::Passed(&data_use), callback));
+
+  // |request| takes ownership of |tab_id_provider|.
+  request->SetUserData(TabIdProvider::kUserDataKey, tab_id_provider.release());
+}
+
+}  // namespace chrome_browser_data_usage
diff --git a/chrome/browser/data_usage/tab_id_annotator.h b/chrome/browser/data_usage/tab_id_annotator.h
new file mode 100644
index 0000000..f4fcccf
--- /dev/null
+++ b/chrome/browser/data_usage/tab_id_annotator.h
@@ -0,0 +1,47 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_DATA_USAGE_TAB_ID_ANNOTATOR_H_
+#define CHROME_BROWSER_DATA_USAGE_TAB_ID_ANNOTATOR_H_
+
+#include "base/macros.h"
+#include "base/memory/scoped_ptr.h"
+#include "base/threading/thread_checker.h"
+#include "components/data_usage/core/data_use_annotator.h"
+
+namespace data_usage {
+struct DataUse;
+}
+
+namespace net {
+class URLRequest;
+}
+
+namespace chrome_browser_data_usage {
+
+// Class that annotates DataUse objects with their associated tab IDs.
+class TabIdAnnotator : public data_usage::DataUseAnnotator {
+ public:
+  TabIdAnnotator();
+  ~TabIdAnnotator() override;
+
+  // Determines the tab ID associated with |request| if there is one, setting
+  // the tab ID on |data_use| appropriately and passing it to |callback| once
+  // the tab ID is ready. A tab ID of -1 is used if no tab ID is found for
+  // |request|. This method will attach a new TabIdProvider to |request| as user
+  // data if there isn't one attached already and |request| has enough
+  // information to get a tab ID.
+  void Annotate(net::URLRequest* request,
+                scoped_ptr<data_usage::DataUse> data_use,
+                const DataUseConsumerCallback& callback) override;
+
+ private:
+  base::ThreadChecker thread_checker_;
+
+  DISALLOW_COPY_AND_ASSIGN(TabIdAnnotator);
+};
+
+}  // namespace chrome_browser_data_usage
+
+#endif  // CHROME_BROWSER_DATA_USAGE_TAB_ID_ANNOTATOR_H_
diff --git a/chrome/browser/data_usage/tab_id_annotator_unittest.cc b/chrome/browser/data_usage/tab_id_annotator_unittest.cc
new file mode 100644
index 0000000..299d400
--- /dev/null
+++ b/chrome/browser/data_usage/tab_id_annotator_unittest.cc
@@ -0,0 +1,171 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/data_usage/tab_id_annotator.h"
+
+#include <stdint.h>
+
+#include <string>
+
+#include "base/bind.h"
+#include "base/callback.h"
+#include "base/location.h"
+#include "base/macros.h"
+#include "base/memory/scoped_ptr.h"
+#include "base/run_loop.h"
+#include "base/time/time.h"
+#include "chrome/browser/sessions/session_tab_helper.h"
+#include "chrome/test/base/chrome_render_view_host_test_harness.h"
+#include "components/data_usage/core/data_use.h"
+#include "content/public/browser/browser_thread.h"
+#include "content/public/browser/render_frame_host.h"
+#include "content/public/browser/render_process_host.h"
+#include "content/public/browser/resource_request_info.h"
+#include "content/public/browser/web_contents.h"
+#include "net/base/network_change_notifier.h"
+#include "net/base/request_priority.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"
+
+using content::BrowserThread;
+using data_usage::DataUse;
+
+namespace chrome_browser_data_usage {
+
+namespace {
+
+class TabIdAnnotatorTest : public ChromeRenderViewHostTestHarness {
+ public:
+  TabIdAnnotatorTest() {
+    // Cannot use IO_MAIN_LOOP with RenderViewHostTestHarness.
+    SetThreadBundleOptions(content::TestBrowserThreadBundle::REAL_IO_THREAD);
+  }
+
+  ~TabIdAnnotatorTest() override {}
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(TabIdAnnotatorTest);
+};
+
+// Synthesizes a DataUse object with the given |tab_id|.
+scoped_ptr<DataUse> CreateDataUse(int32_t tab_id) {
+  return scoped_ptr<DataUse>(new DataUse(
+      GURL("http://foo.com"), base::TimeTicks(), GURL(), tab_id,
+      net::NetworkChangeNotifier::CONNECTION_UNKNOWN, std::string(), 100, 100));
+}
+
+// Expects that |expected| and |actual| are equal.
+void ExpectDataUse(scoped_ptr<DataUse> expected, scoped_ptr<DataUse> actual) {
+  // Single out the |tab_id| for better debug output in failure cases.
+  EXPECT_EQ(expected->tab_id, actual->tab_id);
+  EXPECT_EQ(*expected, *actual);
+}
+
+// Expects that |expected| and |actual| are equal, then quits |ui_run_loop| on
+// the UI thread.
+void ExpectDataUseAndQuit(base::RunLoop* ui_run_loop,
+                          scoped_ptr<DataUse> expected,
+                          scoped_ptr<DataUse> actual) {
+  DCHECK(ui_run_loop);
+  ExpectDataUse(expected.Pass(), actual.Pass());
+
+  // This can't use run_loop->QuitClosure here because that uses WeakPtrs, which
+  // aren't thread safe.
+  BrowserThread::PostTask(
+      BrowserThread::UI, FROM_HERE,
+      base::Bind(&base::RunLoop::Quit, base::Unretained(ui_run_loop)));
+}
+
+// Tests that for a sample URLRequest, associated with the given
+// |render_process_id| and |render_frame_id|, repeatedly annotating DataUse for
+// that URLRequest yields the |expected_tab_id|. |ui_run_loop| is the RunLoop on
+// the UI thread that should be quit after all the annotations are done.
+// Passing in -1 for either or both of |render_process_id| or |render_frame_id|
+// indicates that the URLRequest should have no associated ResourceRequestInfo.
+void TestAnnotateOnIOThread(base::RunLoop* ui_run_loop,
+                            int render_process_id,
+                            int render_frame_id,
+                            int32_t expected_tab_id) {
+  DCHECK_CURRENTLY_ON(BrowserThread::IO);
+  DCHECK(ui_run_loop);
+
+  TabIdAnnotator annotator;
+  net::TestURLRequestContext context;
+  net::TestDelegate test_delegate;
+  scoped_ptr<net::URLRequest> request =
+      context.CreateRequest(GURL("http://foo.com"), net::IDLE, &test_delegate);
+
+  if (render_process_id != -1 && render_frame_id != -1) {
+    // The only args that matter here for the ResourceRequestInfo are the
+    // |request|, the |render_process_id|, and the |render_frame_id|; arbitrary
+    // values are used for all the other args.
+    content::ResourceRequestInfo::AllocateForTesting(
+        request.get(), content::RESOURCE_TYPE_MAIN_FRAME, nullptr,
+        render_process_id, -1, render_frame_id, true, false, true, true, false);
+  }
+
+  // An invalid tab ID to check that the annotator always sets the tab ID. -2 is
+  // used because a tab ID of -1 is a valid value that means "no tab was found".
+  const int32_t kInvalidTabId = -2;
+
+  // Annotate two separate DataUse objects to ensure that repeated annotations
+  // for the same URLRequest work properly.
+  scoped_ptr<DataUse> first_expected_data_use = CreateDataUse(expected_tab_id);
+  annotator.Annotate(
+      request.get(), CreateDataUse(kInvalidTabId),
+      base::Bind(&ExpectDataUse, base::Passed(&first_expected_data_use)));
+
+  // Quit the |ui_run_loop| after the second annotation.
+  scoped_ptr<DataUse> second_expected_data_use = CreateDataUse(expected_tab_id);
+  annotator.Annotate(request.get(), CreateDataUse(kInvalidTabId),
+                     base::Bind(&ExpectDataUseAndQuit, ui_run_loop,
+                                base::Passed(&second_expected_data_use)));
+}
+
+TEST_F(TabIdAnnotatorTest, AnnotateWithNoRenderFrame) {
+  base::RunLoop ui_run_loop;
+  BrowserThread::PostTask(
+      BrowserThread::IO, FROM_HERE,
+      base::Bind(&TestAnnotateOnIOThread, &ui_run_loop,
+                 -1 /* render_process_id */, -1 /* render_frame_id */,
+                 -1 /* expected_tab_id */));
+  ui_run_loop.Run();
+}
+
+TEST_F(TabIdAnnotatorTest, AnnotateWithRenderFrameAndNoTab) {
+  base::RunLoop ui_run_loop;
+  // |web_contents()| isn't a tab, so it shouldn't have a tab ID.
+  EXPECT_EQ(-1, SessionTabHelper::IdForTab(web_contents()));
+
+  BrowserThread::PostTask(
+      BrowserThread::IO, FROM_HERE,
+      base::Bind(&TestAnnotateOnIOThread, &ui_run_loop,
+                 web_contents()->GetMainFrame()->GetProcess()->GetID(),
+                 web_contents()->GetMainFrame()->GetRoutingID(),
+                 -1 /* expected_tab_id */));
+  ui_run_loop.Run();
+}
+
+TEST_F(TabIdAnnotatorTest, AnnotateWithRenderFrameAndTab) {
+  base::RunLoop ui_run_loop;
+  // Make |web_contents()| into a tab.
+  SessionTabHelper::CreateForWebContents(web_contents());
+  int32_t expected_tab_id = SessionTabHelper::IdForTab(web_contents());
+  // |web_contents()| is a tab, so it should have a tab ID.
+  EXPECT_NE(-1, expected_tab_id);
+
+  BrowserThread::PostTask(
+      BrowserThread::IO, FROM_HERE,
+      base::Bind(&TestAnnotateOnIOThread, &ui_run_loop,
+                 web_contents()->GetMainFrame()->GetProcess()->GetID(),
+                 web_contents()->GetMainFrame()->GetRoutingID(),
+                 expected_tab_id));
+  ui_run_loop.Run();
+}
+
+}  // namespace
+
+}  // namespace chrome_browser_data_usage
diff --git a/chrome/browser/data_usage/tab_id_provider.cc b/chrome/browser/data_usage/tab_id_provider.cc
new file mode 100644
index 0000000..6a0b63a
--- /dev/null
+++ b/chrome/browser/data_usage/tab_id_provider.cc
@@ -0,0 +1,130 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/data_usage/tab_id_provider.h"
+
+#include <vector>
+
+#include "base/bind.h"
+#include "base/callback.h"
+#include "base/location.h"
+#include "base/memory/ref_counted.h"
+#include "base/memory/scoped_ptr.h"
+#include "base/single_thread_task_runner.h"
+#include "base/task_runner.h"
+#include "base/task_runner_util.h"
+
+namespace chrome_browser_data_usage {
+
+namespace {
+
+// Convenience typedefs for clarity.
+typedef base::Callback<int32_t(void)> TabIdGetter;
+typedef base::Callback<void(int32_t)> TabIdCallback;
+
+}  // namespace
+
+// Object that can run a list of callbacks that take tab IDs. New callbacks
+// can only be added before it starts running the callbacks. Callbacks added
+// will each be run exactly once.
+class TabIdProvider::CallbackRunner {
+ public:
+  CallbackRunner() : is_done_(false), weak_ptr_factory_(this) {}
+
+  ~CallbackRunner() {
+    // Ensure that no callbacks are abandoned without being run.
+    if (!is_done_)
+      RunAll(-1);
+  }
+
+  // Adds a new callback to be run later. New callbacks must not be added after
+  // RunAll has been called.
+  void AddCallback(const TabIdCallback& callback) {
+    DCHECK(thread_checker_.CalledOnValidThread());
+    DCHECK(!is_done_);
+    callbacks_.push_back(callback);
+  }
+
+  // Runs all the callbacks in the order that they were added. This method must
+  // not be called more than once.
+  void RunAll(int32_t tab_id) {
+    DCHECK(thread_checker_.CalledOnValidThread());
+    DCHECK(!is_done_);
+    is_done_ = true;
+    // It's safe to run the |callbacks_| while iterating through them because
+    // |callbacks_| can no longer be modified at this point, so it's impossible
+    // for one of the |callbacks_| to add more callbacks to this CallbackRunner.
+    for (const auto& callback : callbacks_)
+      callback.Run(tab_id);
+    callbacks_.clear();
+  }
+
+  base::WeakPtr<CallbackRunner> GetWeakPtr() {
+    DCHECK(thread_checker_.CalledOnValidThread());
+    return weak_ptr_factory_.GetWeakPtr();
+  }
+
+ private:
+  base::ThreadChecker thread_checker_;
+  bool is_done_;
+  std::vector<TabIdCallback> callbacks_;
+  base::WeakPtrFactory<CallbackRunner> weak_ptr_factory_;
+
+  DISALLOW_COPY_AND_ASSIGN(CallbackRunner);
+};
+
+TabIdProvider::TabIdProvider(base::TaskRunner* task_runner,
+                             const tracked_objects::Location& from_here,
+                             const TabIdGetter& tab_id_getter)
+    : is_tab_id_ready_(false), tab_id_(-1), weak_ptr_factory_(this) {
+  scoped_ptr<CallbackRunner> callback_runner(new CallbackRunner());
+  weak_callback_runner_ = callback_runner->GetWeakPtr();
+  callback_runner->AddCallback(
+      base::Bind(&TabIdProvider::OnTabIdReady, GetWeakPtr()));
+
+  // The posted task takes ownership of |callback_runner|. If the task fails to
+  // be posted, then the destructor of |callback_runner| will pass a tab ID of
+  // -1 to OnTabIdReady, so that case doesn't need to be explicitly handled
+  // here.
+  base::PostTaskAndReplyWithResult(
+      task_runner, from_here, tab_id_getter,
+      base::Bind(&CallbackRunner::RunAll,
+                 base::Owned(callback_runner.release())));
+}
+
+TabIdProvider::~TabIdProvider() {}
+
+void TabIdProvider::ProvideTabId(const TabIdCallback& callback) {
+  DCHECK(thread_checker_.CalledOnValidThread());
+  if (is_tab_id_ready_) {
+    callback.Run(tab_id_);
+    return;
+  }
+  if (weak_callback_runner_) {
+    weak_callback_runner_->AddCallback(callback);
+    return;
+  }
+  // If no cached tab ID is available and |weak_callback_runner_| has been
+  // destroyed, pass a tab ID of -1 to the callback indicating that no tab was
+  // found.
+  callback.Run(-1);
+}
+
+base::WeakPtr<TabIdProvider> TabIdProvider::GetWeakPtr() {
+  DCHECK(thread_checker_.CalledOnValidThread());
+  return weak_ptr_factory_.GetWeakPtr();
+}
+
+// static
+const void* TabIdProvider::kUserDataKey =
+    static_cast<void*>(&TabIdProvider::kUserDataKey);
+
+void TabIdProvider::OnTabIdReady(int32_t tab_id) {
+  DCHECK(thread_checker_.CalledOnValidThread());
+  DCHECK(!is_tab_id_ready_);
+  tab_id_ = tab_id;
+  is_tab_id_ready_ = true;
+}
+
+}  // namespace chrome_browser_data_usage
diff --git a/chrome/browser/data_usage/tab_id_provider.h b/chrome/browser/data_usage/tab_id_provider.h
new file mode 100644
index 0000000..ab888b63
--- /dev/null
+++ b/chrome/browser/data_usage/tab_id_provider.h
@@ -0,0 +1,65 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_DATA_USAGE_TAB_ID_PROVIDER_H_
+#define CHROME_BROWSER_DATA_USAGE_TAB_ID_PROVIDER_H_
+
+#include <stdint.h>
+
+#include "base/callback_forward.h"
+#include "base/macros.h"
+#include "base/memory/weak_ptr.h"
+#include "base/supports_user_data.h"
+#include "base/threading/thread_checker.h"
+
+namespace base {
+class TaskRunner;
+}
+
+namespace tracked_objects {
+class Location;
+}
+
+namespace chrome_browser_data_usage {
+
+// Object that can be attached to a URLRequest to provide the tab ID of that
+// URLRequest to callbacks that want them. Callbacks are either run immediately
+// if the tab ID is already available, or queued to be run later once the tab ID
+// becomes available.
+class TabIdProvider : public base::SupportsUserData::Data {
+ public:
+  // Constructs a tab ID provider, posting the |tab_id_getter| task onto
+  // |task_runner|.
+  TabIdProvider(base::TaskRunner* task_runner,
+                const tracked_objects::Location& from_here,
+                const base::Callback<int32_t(void)>& tab_id_getter);
+
+  ~TabIdProvider() override;
+
+  // Calls |callback| with the tab ID, either immediately if it's already
+  // available, or later once it becomes available.
+  void ProvideTabId(const base::Callback<void(int32_t)>& callback);
+
+  base::WeakPtr<TabIdProvider> GetWeakPtr();
+
+  static const void* kUserDataKey;
+
+ private:
+  class CallbackRunner;
+
+  // Called when the |tab_id| is ready.
+  void OnTabIdReady(int32_t tab_id);
+
+  base::ThreadChecker thread_checker_;
+  bool is_tab_id_ready_;
+  int32_t tab_id_;
+  base::WeakPtr<CallbackRunner> weak_callback_runner_;
+  base::WeakPtrFactory<TabIdProvider> weak_ptr_factory_;
+
+  DISALLOW_COPY_AND_ASSIGN(TabIdProvider);
+};
+
+}  // namespace chrome_browser_data_usage
+
+#endif  // CHROME_BROWSER_DATA_USAGE_TAB_ID_PROVIDER_H_
diff --git a/chrome/browser/data_usage/tab_id_provider_unittest.cc b/chrome/browser/data_usage/tab_id_provider_unittest.cc
new file mode 100644
index 0000000..057b544
--- /dev/null
+++ b/chrome/browser/data_usage/tab_id_provider_unittest.cc
@@ -0,0 +1,141 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/data_usage/tab_id_provider.h"
+
+#include <stdint.h>
+
+#include "base/bind.h"
+#include "base/callback.h"
+#include "base/location.h"
+#include "base/macros.h"
+#include "base/memory/ref_counted.h"
+#include "base/memory/scoped_ptr.h"
+#include "base/message_loop/message_loop.h"
+#include "base/run_loop.h"
+#include "base/single_thread_task_runner.h"
+#include "base/task_runner.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace chrome_browser_data_usage {
+
+namespace {
+
+const int32_t kTabId = 10;
+
+class TabIdProviderTest : public testing::Test {
+ public:
+  TabIdProviderTest()
+      : task_runner_(base::MessageLoop::current()->task_runner()),
+        tab_id_getter_call_count_(0) {}
+
+  ~TabIdProviderTest() override {}
+
+  base::Callback<int32_t(void)> TabIdGetterCallback() {
+    return base::Bind(&TabIdProviderTest::GetTabId, base::Unretained(this));
+  }
+
+  base::TaskRunner* task_runner() { return task_runner_.get(); }
+  base::RunLoop* run_loop() { return &run_loop_; }
+  int tab_id_getter_call_count() const { return tab_id_getter_call_count_; }
+
+ private:
+  int32_t GetTabId() {
+    ++tab_id_getter_call_count_;
+    return kTabId;
+  }
+
+  base::MessageLoop message_loop_;
+  scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
+  base::RunLoop run_loop_;
+  int tab_id_getter_call_count_;
+
+  DISALLOW_COPY_AND_ASSIGN(TabIdProviderTest);
+};
+
+// Copies |tab_id| into |capture|.
+void CaptureTabId(int32_t* capture, int32_t tab_id) {
+  *capture = tab_id;
+}
+
+TEST_F(TabIdProviderTest, ProvideTabId) {
+  TabIdProvider provider(task_runner(), FROM_HERE, TabIdGetterCallback());
+
+  int32_t tab_id = -1;
+  provider.ProvideTabId(base::Bind(&CaptureTabId, &tab_id));
+  run_loop()->RunUntilIdle();
+
+  EXPECT_EQ(1, tab_id_getter_call_count());
+  EXPECT_EQ(kTabId, tab_id);
+}
+
+TEST_F(TabIdProviderTest, ProvideTabIdPiggyback) {
+  TabIdProvider provider(task_runner(), FROM_HERE, TabIdGetterCallback());
+
+  // First, ask for the first tab ID to kick things off.
+  int32_t first_tab_id = -1;
+  provider.ProvideTabId(base::Bind(&CaptureTabId, &first_tab_id));
+
+  // The first tab ID callback should still be pending, with the tab ID not
+  // available yet, so this second callback should piggyback off of the first
+  // callback.
+  int32_t piggyback_tab_id = -1;
+  provider.ProvideTabId(base::Bind(&CaptureTabId, &piggyback_tab_id));
+
+  run_loop()->RunUntilIdle();
+
+  // The tab ID getter callback should only have been called once.
+  EXPECT_EQ(1, tab_id_getter_call_count());
+  EXPECT_EQ(kTabId, first_tab_id);
+  EXPECT_EQ(kTabId, piggyback_tab_id);
+}
+
+TEST_F(TabIdProviderTest, ProvideTabIdCacheHit) {
+  TabIdProvider provider(task_runner(), FROM_HERE, TabIdGetterCallback());
+
+  // First, ask for the first tab ID to kick things off.
+  int32_t first_tab_id = -1;
+  provider.ProvideTabId(base::Bind(&CaptureTabId, &first_tab_id));
+
+  // Wait for the first tab ID callback to finish.
+  run_loop()->RunUntilIdle();
+
+  EXPECT_EQ(1, tab_id_getter_call_count());
+  EXPECT_EQ(kTabId, first_tab_id);
+
+  // Ask for another tab ID, which should be satisfied by the cached tab ID from
+  // the first callback.
+  int32_t cache_hit_tab_id = -1;
+  provider.ProvideTabId(base::Bind(&CaptureTabId, &cache_hit_tab_id));
+
+  // This cache hit callback should run synchronously, without causing the tab
+  // ID getter callback to run again.
+  EXPECT_EQ(1, tab_id_getter_call_count());
+  EXPECT_EQ(kTabId, cache_hit_tab_id);
+}
+
+TEST_F(TabIdProviderTest, ProvideTabIdAfterProviderDestroyed) {
+  scoped_ptr<TabIdProvider> provider(
+      new TabIdProvider(task_runner(), FROM_HERE, TabIdGetterCallback()));
+
+  // Ask for two tab IDs.
+  int32_t first_tab_id = -1, second_tab_id = -1;
+  provider->ProvideTabId(base::Bind(&CaptureTabId, &first_tab_id));
+  provider->ProvideTabId(base::Bind(&CaptureTabId, &second_tab_id));
+
+  // Then, destroy the |provider| before the tab ID getter callback or any other
+  // callbacks are run.
+  provider.reset();
+
+  // The callbacks should still complete successfully later even though the
+  // |provider| no longer exists.
+  run_loop()->RunUntilIdle();
+  EXPECT_EQ(1, tab_id_getter_call_count());
+  EXPECT_EQ(kTabId, first_tab_id);
+  EXPECT_EQ(kTabId, second_tab_id);
+}
+
+}  // namespace
+
+}  // namespace chrome_browser_data_usage
diff --git a/chrome/browser/extensions/api/gcd_private/gcd_private_api.cc b/chrome/browser/extensions/api/gcd_private/gcd_private_api.cc
index 0d6a8508..b7306d0 100644
--- a/chrome/browser/extensions/api/gcd_private/gcd_private_api.cc
+++ b/chrome/browser/extensions/api/gcd_private/gcd_private_api.cc
@@ -8,9 +8,9 @@
 #include "base/lazy_instance.h"
 #include "base/memory/linked_ptr.h"
 #include "base/thread_task_runner_handle.h"
+#include "chrome/browser/extensions/api/gcd_private/privet_v3_session.h"
 #include "chrome/browser/local_discovery/privet_http.h"
 #include "chrome/browser/local_discovery/privet_http_asynchronous_factory.h"
-#include "chrome/browser/local_discovery/privetv3_session.h"
 #include "chrome/browser/local_discovery/service_discovery_shared_client.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/common/chrome_switches.h"
@@ -92,7 +92,7 @@
       service_discovery_client_;
 
   struct SessionInfo {
-    linked_ptr<local_discovery::PrivetV3Session> session;
+    linked_ptr<PrivetV3Session> session;
     linked_ptr<local_discovery::PrivetHTTPResolution> http_resolution;
   };
 
@@ -150,8 +150,7 @@
                         base::DictionaryValue());
   }
   auto& session_data = sessions_[session_id];
-  session_data.session.reset(
-      new local_discovery::PrivetV3Session(client.Pass()));
+  session_data.session.reset(new PrivetV3Session(client.Pass()));
   session_data.session->Init(base::Bind(callback, session_id));
 }
 
diff --git a/chrome/browser/local_discovery/privetv3_session.cc b/chrome/browser/extensions/api/gcd_private/privet_v3_session.cc
similarity index 96%
rename from chrome/browser/local_discovery/privetv3_session.cc
rename to chrome/browser/extensions/api/gcd_private/privet_v3_session.cc
index e0ddf40..0ee8bb189 100644
--- a/chrome/browser/local_discovery/privetv3_session.cc
+++ b/chrome/browser/extensions/api/gcd_private/privet_v3_session.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/local_discovery/privetv3_session.h"
+#include "chrome/browser/extensions/api/gcd_private/privet_v3_session.h"
 
 #include "base/base64.h"
 #include "base/json/json_writer.h"
@@ -18,7 +18,9 @@
 #include "crypto/p224_spake.h"
 #include "url/gurl.h"
 
-namespace local_discovery {
+using local_discovery::PrivetURLFetcher;
+
+namespace extensions {
 
 namespace {
 
@@ -130,11 +132,9 @@
     : session_(session),
       auth_token_(auth_token),
       callback_(callback),
-      weak_ptr_factory_(this) {
-}
+      weak_ptr_factory_(this) {}
 
-PrivetV3Session::FetcherDelegate::~FetcherDelegate() {
-}
+PrivetV3Session::FetcherDelegate::~FetcherDelegate() {}
 
 std::string PrivetV3Session::FetcherDelegate::GetAuthToken() {
   return auth_token_;
@@ -206,9 +206,9 @@
                         base::DictionaryValue());
 }
 
-PrivetV3Session::PrivetV3Session(scoped_ptr<PrivetHTTPClient> client)
-    : client_(client.Pass()), weak_ptr_factory_(this) {
-}
+PrivetV3Session::PrivetV3Session(
+    scoped_ptr<local_discovery::PrivetHTTPClient> client)
+    : client_(client.Pass()), weak_ptr_factory_(this) {}
 
 PrivetV3Session::~PrivetV3Session() {
   Cancel();
@@ -221,7 +221,7 @@
   DCHECK(privet_auth_token_.empty());
 
   privet_auth_token_ = kPrivetV3AuthAnonymous;
-  StartGetRequest(kPrivetInfoPath,
+  StartGetRequest(local_discovery::kPrivetInfoPath,
                   base::Bind(&PrivetV3Session::OnInfoDone,
                              weak_ptr_factory_.GetWeakPtr(), callback));
 }
@@ -462,4 +462,4 @@
   StartPostRequest(kPrivetV3PairingCancelPath, input, MessageCallback());
 }
 
-}  // namespace local_discovery
+}  // namespace extensions
diff --git a/chrome/browser/local_discovery/privetv3_session.h b/chrome/browser/extensions/api/gcd_private/privet_v3_session.h
similarity index 85%
rename from chrome/browser/local_discovery/privetv3_session.h
rename to chrome/browser/extensions/api/gcd_private/privet_v3_session.h
index 725965c..86745fa 100644
--- a/chrome/browser/local_discovery/privetv3_session.h
+++ b/chrome/browser/extensions/api/gcd_private/privet_v3_session.h
@@ -2,13 +2,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_LOCAL_DISCOVERY_PRIVETV3_SESSION_H_
-#define CHROME_BROWSER_LOCAL_DISCOVERY_PRIVETV3_SESSION_H_
+#ifndef CHROME_BROWSER_EXTENSIONS_API_GCD_PRIVATE_PRIVET_V3_SESSION_H_
+#define CHROME_BROWSER_EXTENSIONS_API_GCD_PRIVATE_PRIVET_V3_SESSION_H_
 
 #include <string>
 
 #include "base/callback.h"
 #include "base/gtest_prod_util.h"
+#include "base/macros.h"
 #include "base/memory/scoped_ptr.h"
 #include "base/memory/scoped_vector.h"
 #include "base/memory/weak_ptr.h"
@@ -24,10 +25,12 @@
 }
 
 namespace local_discovery {
-
 class PrivetHTTPClient;
 class PrivetJSONOperation;
 class PrivetURLFetcher;
+}
+
+namespace extensions {
 
 // Manages secure communication between browser and local Privet device.
 class PrivetV3Session {
@@ -46,7 +49,8 @@
                               const base::DictionaryValue& response)>
       MessageCallback;
 
-  explicit PrivetV3Session(scoped_ptr<PrivetHTTPClient> client);
+  explicit PrivetV3Session(
+      scoped_ptr<local_discovery::PrivetHTTPClient> client);
   ~PrivetV3Session();
 
   // Initializes session. Queries /privet/info and returns supported pairing
@@ -87,14 +91,15 @@
   void StartPostRequest(const std::string& api,
                         const base::DictionaryValue& input,
                         const MessageCallback& callback);
-  PrivetURLFetcher* CreateFetcher(const std::string& api,
-                                  net::URLFetcher::RequestType request_type,
-                                  const MessageCallback& callback);
+  local_discovery::PrivetURLFetcher* CreateFetcher(
+      const std::string& api,
+      net::URLFetcher::RequestType request_type,
+      const MessageCallback& callback);
   void DeleteFetcher(const FetcherDelegate* fetcher);
   void Cancel();
 
   // Creates instances of PrivetURLFetcher.
-  scoped_ptr<PrivetHTTPClient> client_;
+  scoped_ptr<local_discovery::PrivetHTTPClient> client_;
 
   // Current authentication token.
   std::string privet_auth_token_;
@@ -121,6 +126,6 @@
   DISALLOW_COPY_AND_ASSIGN(PrivetV3Session);
 };
 
-}  // namespace local_discovery
+}  // namespace extensions
 
-#endif  // CHROME_BROWSER_LOCAL_DISCOVERY_PRIVETV3_SESSION_H_
+#endif  // CHROME_BROWSER_EXTENSIONS_API_GCD_PRIVATE_PRIVET_V3_SESSION_H_
diff --git a/chrome/browser/local_discovery/privetv3_session_unittest.cc b/chrome/browser/extensions/api/gcd_private/privet_v3_session_unittest.cc
similarity index 85%
rename from chrome/browser/local_discovery/privetv3_session_unittest.cc
rename to chrome/browser/extensions/api/gcd_private/privet_v3_session_unittest.cc
index 4b9f30b..a6c9433 100644
--- a/chrome/browser/local_discovery/privetv3_session_unittest.cc
+++ b/chrome/browser/extensions/api/gcd_private/privet_v3_session_unittest.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/local_discovery/privetv3_session.h"
+#include "chrome/browser/extensions/api/gcd_private/privet_v3_session.h"
 
 #include "base/base64.h"
 #include "base/strings/stringprintf.h"
@@ -16,7 +16,11 @@
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-namespace local_discovery {
+using local_discovery::PrivetHTTPClient;
+using local_discovery::PrivetJSONOperation;
+using local_discovery::PrivetURLFetcher;
+
+namespace extensions {
 
 namespace {
 
@@ -169,8 +173,7 @@
 }
 
 TEST_F(PrivetV3SessionTest, Pairing) {
-  EXPECT_CALL(*this, OnInitializedMock(Result::STATUS_SUCCESS, _))
-      .Times(1);
+  EXPECT_CALL(*this, OnInitializedMock(Result::STATUS_SUCCESS, _)).Times(1);
   fetcher_factory_.SetFakeResponse(GURL("http://host/privet/info"),
                                    kInfoResponse, net::HTTP_OK,
                                    net::URLRequestStatus::SUCCESS);
@@ -194,25 +197,24 @@
 
   EXPECT_CALL(*this, OnPairingStarted(Result::STATUS_SUCCESS)).Times(1);
   EXPECT_CALL(*this, OnPostData(_))
-      .WillOnce(
-          Invoke([this, &spake](const base::DictionaryValue& data) {
-            std::string pairing_type;
-            EXPECT_TRUE(data.GetString("pairing", &pairing_type));
-            EXPECT_EQ("embeddedCode", pairing_type);
+      .WillOnce(Invoke([this, &spake](const base::DictionaryValue& data) {
+        std::string pairing_type;
+        EXPECT_TRUE(data.GetString("pairing", &pairing_type));
+        EXPECT_EQ("embeddedCode", pairing_type);
 
-            std::string crypto_type;
-            EXPECT_TRUE(data.GetString("crypto", &crypto_type));
-            EXPECT_EQ("p224_spake2", crypto_type);
+        std::string crypto_type;
+        EXPECT_TRUE(data.GetString("crypto", &crypto_type));
+        EXPECT_EQ("p224_spake2", crypto_type);
 
-            std::string device_commitment;
-            base::Base64Encode(spake.GetNextMessage(), &device_commitment);
-            fetcher_factory_.SetFakeResponse(
-                GURL("http://host/privet/v3/pairing/start"),
-                base::StringPrintf(
-                    "{\"deviceCommitment\":\"%s\",\"sessionId\":\"testId\"}",
-                    device_commitment.c_str()),
-                net::HTTP_OK, net::URLRequestStatus::SUCCESS);
-          }));
+        std::string device_commitment;
+        base::Base64Encode(spake.GetNextMessage(), &device_commitment);
+        fetcher_factory_.SetFakeResponse(
+            GURL("http://host/privet/v3/pairing/start"),
+            base::StringPrintf(
+                "{\"deviceCommitment\":\"%s\",\"sessionId\":\"testId\"}",
+                device_commitment.c_str()),
+            net::HTTP_OK, net::URLRequestStatus::SUCCESS);
+      }));
   session_.StartPairing(PairingType::PAIRING_TYPE_EMBEDDEDCODE,
                         base::Bind(&PrivetV3SessionTest::OnPairingStarted,
                                    base::Unretained(this)));
@@ -270,24 +272,23 @@
                     fingerprint_base64.c_str(), signature_base64.c_str()),
                 net::HTTP_OK, net::URLRequestStatus::SUCCESS);
           }))
-      .WillOnce(
-          Invoke([this, &spake](const base::DictionaryValue& data) {
-            std::string access_token_base64;
-            EXPECT_TRUE(data.GetString("authCode", &access_token_base64));
-            std::string access_token;
-            EXPECT_TRUE(base::Base64Decode(access_token_base64, &access_token));
+      .WillOnce(Invoke([this, &spake](const base::DictionaryValue& data) {
+        std::string access_token_base64;
+        EXPECT_TRUE(data.GetString("authCode", &access_token_base64));
+        std::string access_token;
+        EXPECT_TRUE(base::Base64Decode(access_token_base64, &access_token));
 
-            crypto::HMAC hmac(crypto::HMAC::SHA256);
-            const std::string& key = spake.GetUnverifiedKey();
-            EXPECT_TRUE(hmac.Init(key));
-            EXPECT_TRUE(hmac.Verify("testId", access_token));
+        crypto::HMAC hmac(crypto::HMAC::SHA256);
+        const std::string& key = spake.GetUnverifiedKey();
+        EXPECT_TRUE(hmac.Init(key));
+        EXPECT_TRUE(hmac.Verify("testId", access_token));
 
-            fetcher_factory_.SetFakeResponse(
-                GURL("http://host/privet/v3/auth"),
-                "{\"accessToken\":\"567\",\"tokenType\":\"testType\","
-                "\"scope\":\"owner\"}",
-                net::HTTP_OK, net::URLRequestStatus::SUCCESS);
-          }));
+        fetcher_factory_.SetFakeResponse(
+            GURL("http://host/privet/v3/auth"),
+            "{\"accessToken\":\"567\",\"tokenType\":\"testType\","
+            "\"scope\":\"owner\"}",
+            net::HTTP_OK, net::URLRequestStatus::SUCCESS);
+      }));
   session_.ConfirmCode("testPin",
                        base::Bind(&PrivetV3SessionTest::OnCodeConfirmed,
                                   base::Unretained(this)));
@@ -298,7 +299,7 @@
 }
 
 TEST_F(PrivetV3SessionTest, Cancel) {
-  EXPECT_CALL(*this, OnInitializedMock(Result::STATUS_SUCCESS, _)).Times(1);;
+  EXPECT_CALL(*this, OnInitializedMock(Result::STATUS_SUCCESS, _)).Times(1);
   fetcher_factory_.SetFakeResponse(GURL("http://host/privet/info"),
                                    kInfoResponse, net::HTTP_OK,
                                    net::URLRequestStatus::SUCCESS);
@@ -339,4 +340,4 @@
 // TODO(vitalybuka): replace PrivetHTTPClient with regular URL fetcher and
 // implement SendMessage test.
 
-}  // namespace local_discovery
+}  // namespace extensions
diff --git a/chrome/browser/extensions/service_worker_apitest.cc b/chrome/browser/extensions/service_worker_apitest.cc
index 29fad8fa..b1018d8c 100644
--- a/chrome/browser/extensions/service_worker_apitest.cc
+++ b/chrome/browser/extensions/service_worker_apitest.cc
@@ -337,4 +337,9 @@
   EXPECT_TRUE(RunExtensionSubtest("service_worker/no_background", "page.html"));
 }
 
+IN_PROC_BROWSER_TEST_F(ServiceWorkerTest, NotificationAPI) {
+  EXPECT_TRUE(RunExtensionSubtest("service_worker/notifications/has_permission",
+                                  "page.html"));
+}
+
 }  // namespace extensions
diff --git a/chrome/browser/io_thread.cc b/chrome/browser/io_thread.cc
index 2301ab5a..ec1f91ea 100644
--- a/chrome/browser/io_thread.cc
+++ b/chrome/browser/io_thread.cc
@@ -30,6 +30,7 @@
 #include "base/trace_event/trace_event.h"
 #include "build/build_config.h"
 #include "chrome/browser/browser_process.h"
+#include "chrome/browser/data_usage/tab_id_annotator.h"
 #include "chrome/browser/net/async_dns_field_trial.h"
 #include "chrome/browser/net/chrome_network_delegate.h"
 #include "chrome/browser/net/connect_interceptor.h"
@@ -605,7 +606,9 @@
       extension_event_router_forwarder_;
 #endif
 
-  data_use_aggregator_.reset(new data_usage::DataUseAggregator());
+  data_use_aggregator_.reset(new data_usage::DataUseAggregator(
+      scoped_ptr<data_usage::DataUseAnnotator>(
+          new chrome_browser_data_usage::TabIdAnnotator())));
 
   // TODO(erikchen): Remove ScopedTracker below once http://crbug.com/466432
   // is fixed.
diff --git a/chrome/browser/memory/tab_manager_web_contents_data.cc b/chrome/browser/memory/tab_manager_web_contents_data.cc
index eb51466f..df1e386e 100644
--- a/chrome/browser/memory/tab_manager_web_contents_data.cc
+++ b/chrome/browser/memory/tab_manager_web_contents_data.cc
@@ -5,6 +5,7 @@
 #include "chrome/browser/memory/tab_manager_web_contents_data.h"
 
 #include "base/metrics/histogram.h"
+#include "base/time/tick_clock.h"
 #include "chrome/browser/browser_process.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/web_contents.h"
@@ -17,7 +18,7 @@
 namespace memory {
 
 TabManager::WebContentsData::WebContentsData(content::WebContents* web_contents)
-    : WebContentsObserver(web_contents) {}
+    : WebContentsObserver(web_contents), test_tick_clock_(nullptr) {}
 
 TabManager::WebContentsData::~WebContentsData() {}
 
@@ -36,7 +37,7 @@
   // (ie. it has been reloaded), we want to record the time it took between the
   // reload event and the closing of the tab.
   if (tab_data_.discard_count_ > 0 && !tab_data_.is_discarded_) {
-    auto delta = base::TimeTicks::Now() - tab_data_.last_reload_time_;
+    auto delta = NowTicks() - tab_data_.last_reload_time_;
     // Capped to one day for now, will adjust if necessary.
     UMA_HISTOGRAM_CUSTOM_TIMES("TabManager.Discarding.ReloadToCloseTime", delta,
                                base::TimeDelta::FromSeconds(1),
@@ -53,17 +54,17 @@
     static int reload_count = 0;
     UMA_HISTOGRAM_CUSTOM_COUNTS("TabManager.Discarding.ReloadCount",
                                 ++reload_count, 1, 1000, 50);
-    auto delta = base::TimeTicks::Now() - tab_data_.last_discard_time_;
+    auto delta = NowTicks() - tab_data_.last_discard_time_;
     // Capped to one day for now, will adjust if necessary.
     UMA_HISTOGRAM_CUSTOM_TIMES("TabManager.Discarding.DiscardToReloadTime",
                                delta, base::TimeDelta::FromSeconds(1),
                                base::TimeDelta::FromDays(1), 100);
-    tab_data_.last_reload_time_ = base::TimeTicks::Now();
+    tab_data_.last_reload_time_ = NowTicks();
   } else if (!tab_data_.is_discarded_ && state) {
     static int discard_count = 0;
     UMA_HISTOGRAM_CUSTOM_COUNTS("TabManager.Discarding.DiscardCount",
                                 ++discard_count, 1, 1000, 50);
-    tab_data_.last_discard_time_ = base::TimeTicks::Now();
+    tab_data_.last_discard_time_ = NowTicks();
   }
 
   tab_data_.is_discarded_ = state;
@@ -102,9 +103,23 @@
     CreateForWebContents(new_contents);
     FromWebContents(new_contents)->tab_data_ =
         FromWebContents(old_contents)->tab_data_;
+    FromWebContents(new_contents)->test_tick_clock_ =
+        FromWebContents(old_contents)->test_tick_clock_;
   }
 }
 
+void TabManager::WebContentsData::set_test_tick_clock(
+    base::TickClock* test_tick_clock) {
+  test_tick_clock_ = test_tick_clock;
+}
+
+TimeTicks TabManager::WebContentsData::NowTicks() {
+  if (!test_tick_clock_)
+    return TimeTicks::Now();
+
+  return test_tick_clock_->NowTicks();
+}
+
 TabManager::WebContentsData::Data::Data()
     : is_discarded_(false),
       discard_count_(0),
@@ -113,4 +128,16 @@
       last_discard_time_(TimeTicks::UnixEpoch()),
       last_reload_time_(TimeTicks::UnixEpoch()) {}
 
+bool TabManager::WebContentsData::Data::operator==(const Data& right) const {
+  return is_discarded_ == right.is_discarded_ &&
+         is_recently_audible_ == right.is_recently_audible_ &&
+         last_audio_change_time_ == right.last_audio_change_time_ &&
+         last_discard_time_ == right.last_discard_time_ &&
+         last_reload_time_ == right.last_reload_time_;
+}
+
+bool TabManager::WebContentsData::Data::operator!=(const Data& right) const {
+  return !(*this == right);
+}
+
 }  // namespace memory
diff --git a/chrome/browser/memory/tab_manager_web_contents_data.h b/chrome/browser/memory/tab_manager_web_contents_data.h
index 0427d51..1d87d4d 100644
--- a/chrome/browser/memory/tab_manager_web_contents_data.h
+++ b/chrome/browser/memory/tab_manager_web_contents_data.h
@@ -11,6 +11,10 @@
 #include "content/public/browser/web_contents_observer.h"
 #include "content/public/browser/web_contents_user_data.h"
 
+namespace base {
+class TickClock;
+}
+
 namespace content {
 class WebContents;
 }
@@ -60,9 +64,19 @@
   static void CopyState(content::WebContents* old_contents,
                         content::WebContents* new_contents);
 
+  // Used to set the test TickClock, which then gets used by NowTicks(). See
+  // |test_tick_clock_| for more details.
+  void set_test_tick_clock(base::TickClock* test_tick_clock);
+
  private:
+  // Needed to access tab_data_.
+  FRIEND_TEST_ALL_PREFIXES(TabManagerWebContentsDataTest, CopyState);
+
   struct Data {
     Data();
+    bool operator==(const Data& right) const;
+    bool operator!=(const Data& right) const;
+
     // Is the tab currently discarded?
     bool is_discarded_;
     // Number of times the tab has been discarded.
@@ -78,8 +92,17 @@
     base::TimeTicks last_reload_time_;
   };
 
+  // Returns either the system's clock or the test clock. See |test_tick_clock_|
+  // for more details.
+  base::TimeTicks NowTicks();
+
+  // Contains all the needed data for the tab.
   Data tab_data_;
 
+  // Pointer to a test clock. If this is set, then NowTicks() returns the value
+  // of this test clock, otherwise it will return the system clock's value.
+  base::TickClock* test_tick_clock_;
+
   DISALLOW_COPY_AND_ASSIGN(WebContentsData);
 };
 
diff --git a/chrome/browser/memory/tab_manager_web_contents_data_unittest.cc b/chrome/browser/memory/tab_manager_web_contents_data_unittest.cc
new file mode 100644
index 0000000..d4ff632
--- /dev/null
+++ b/chrome/browser/memory/tab_manager_web_contents_data_unittest.cc
@@ -0,0 +1,180 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/memory/tab_manager_web_contents_data.h"
+
+#include "base/test/histogram_tester.h"
+#include "base/test/simple_test_tick_clock.h"
+#include "chrome/test/base/chrome_render_view_host_test_harness.h"
+#include "chrome/test/base/testing_profile.h"
+#include "content/public/browser/web_contents.h"
+#include "content/public/test/web_contents_tester.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+using content::WebContents;
+using content::WebContentsTester;
+
+namespace memory {
+namespace {
+
+class TabManagerWebContentsDataTest : public ChromeRenderViewHostTestHarness {
+ public:
+  TabManagerWebContentsDataTest() : ChromeRenderViewHostTestHarness() {}
+
+  void SetUp() override {
+    ChromeRenderViewHostTestHarness::SetUp();
+    tab_data_ = CreateWebContentsAndTabData(&web_contents_);
+    tab_data_->set_test_tick_clock(&test_clock_);
+  }
+
+  void TearDown() override {
+    tab_data_->set_test_tick_clock(nullptr);
+    web_contents_.reset();
+    ChromeRenderViewHostTestHarness::TearDown();
+  }
+
+  TabManager::WebContentsData* tab_data() { return tab_data_; }
+
+  base::SimpleTestTickClock& test_clock() { return test_clock_; }
+
+  TabManager::WebContentsData* CreateWebContentsAndTabData(
+      scoped_ptr<WebContents>* web_contents) {
+    web_contents->reset(
+        WebContents::Create(WebContents::CreateParams(profile())));
+    TabManager::WebContentsData::CreateForWebContents(web_contents->get());
+    return TabManager::WebContentsData::FromWebContents(web_contents->get());
+  }
+
+ private:
+  scoped_ptr<WebContents> web_contents_;
+  TabManager::WebContentsData* tab_data_;
+  base::SimpleTestTickClock test_clock_;
+};
+
+}  // namespace
+
+TEST_F(TabManagerWebContentsDataTest, DiscardState) {
+  EXPECT_FALSE(tab_data()->IsDiscarded());
+  tab_data()->SetDiscardState(true);
+  EXPECT_TRUE(tab_data()->IsDiscarded());
+  tab_data()->SetDiscardState(false);
+  EXPECT_FALSE(tab_data()->IsDiscarded());
+}
+
+TEST_F(TabManagerWebContentsDataTest, DiscardCount) {
+  EXPECT_EQ(0, tab_data()->DiscardCount());
+  tab_data()->IncrementDiscardCount();
+  EXPECT_EQ(1, tab_data()->DiscardCount());
+  tab_data()->IncrementDiscardCount();
+  EXPECT_EQ(2, tab_data()->DiscardCount());
+}
+
+TEST_F(TabManagerWebContentsDataTest, RecentlyAudible) {
+  EXPECT_FALSE(tab_data()->IsRecentlyAudible());
+  tab_data()->SetRecentlyAudible(true);
+  EXPECT_TRUE(tab_data()->IsRecentlyAudible());
+  tab_data()->SetRecentlyAudible(false);
+  EXPECT_FALSE(tab_data()->IsRecentlyAudible());
+}
+
+TEST_F(TabManagerWebContentsDataTest, LastAudioChangeTime) {
+  EXPECT_EQ(base::TimeTicks::UnixEpoch(), tab_data()->LastAudioChangeTime());
+  auto now = base::TimeTicks::Now();
+  tab_data()->SetLastAudioChangeTime(now);
+  EXPECT_EQ(now, tab_data()->LastAudioChangeTime());
+}
+
+TEST_F(TabManagerWebContentsDataTest, CopyState) {
+  scoped_ptr<WebContents> web_contents2;
+  auto tab_data2 = CreateWebContentsAndTabData(&web_contents2);
+
+  EXPECT_EQ(tab_data()->tab_data_, tab_data2->tab_data_);
+  tab_data()->IncrementDiscardCount();
+  tab_data()->SetDiscardState(true);
+  EXPECT_NE(tab_data()->tab_data_, tab_data2->tab_data_);
+
+  TabManager::WebContentsData::CopyState(tab_data()->web_contents(),
+                                         tab_data2->web_contents());
+  EXPECT_EQ(tab_data()->tab_data_, tab_data2->tab_data_);
+  EXPECT_EQ(tab_data()->test_tick_clock_, tab_data2->test_tick_clock_);
+}
+
+TEST_F(TabManagerWebContentsDataTest, HistogramDiscardCount) {
+  const char kHistogramName[] = "TabManager.Discarding.DiscardCount";
+
+  base::HistogramTester histograms;
+
+  EXPECT_TRUE(histograms.GetTotalCountsForPrefix(kHistogramName).empty());
+  tab_data()->SetDiscardState(true);
+  EXPECT_EQ(1,
+            histograms.GetTotalCountsForPrefix(kHistogramName).begin()->second);
+  tab_data()->SetDiscardState(false);
+  EXPECT_EQ(1,
+            histograms.GetTotalCountsForPrefix(kHistogramName).begin()->second);
+  tab_data()->SetDiscardState(true);
+  EXPECT_EQ(2,
+            histograms.GetTotalCountsForPrefix(kHistogramName).begin()->second);
+  tab_data()->SetDiscardState(false);
+  EXPECT_EQ(2,
+            histograms.GetTotalCountsForPrefix(kHistogramName).begin()->second);
+}
+
+TEST_F(TabManagerWebContentsDataTest, HistogramReloadCount) {
+  const char kHistogramName[] = "TabManager.Discarding.ReloadCount";
+
+  base::HistogramTester histograms;
+
+  EXPECT_TRUE(histograms.GetTotalCountsForPrefix(kHistogramName).empty());
+  tab_data()->SetDiscardState(true);
+  EXPECT_TRUE(histograms.GetTotalCountsForPrefix(kHistogramName).empty());
+  tab_data()->SetDiscardState(false);
+  EXPECT_EQ(1,
+            histograms.GetTotalCountsForPrefix(kHistogramName).begin()->second);
+  tab_data()->SetDiscardState(true);
+  EXPECT_EQ(1,
+            histograms.GetTotalCountsForPrefix(kHistogramName).begin()->second);
+  tab_data()->SetDiscardState(false);
+  EXPECT_EQ(2,
+            histograms.GetTotalCountsForPrefix(kHistogramName).begin()->second);
+}
+
+TEST_F(TabManagerWebContentsDataTest, HistogramsDiscardToReloadTime) {
+  const char kHistogramName[] = "TabManager.Discarding.DiscardToReloadTime";
+
+  base::HistogramTester histograms;
+
+  EXPECT_TRUE(histograms.GetTotalCountsForPrefix(kHistogramName).empty());
+
+  tab_data()->SetDiscardState(true);
+  test_clock().Advance(base::TimeDelta::FromSeconds(24));
+  tab_data()->SetDiscardState(false);
+
+  EXPECT_EQ(1,
+            histograms.GetTotalCountsForPrefix(kHistogramName).begin()->second);
+
+  histograms.ExpectBucketCount(kHistogramName, 24000, 1);
+}
+
+TEST_F(TabManagerWebContentsDataTest, HistogramsReloadToCloseTime) {
+  const char kHistogramName[] = "TabManager.Discarding.ReloadToCloseTime";
+
+  base::HistogramTester histograms;
+
+  EXPECT_TRUE(histograms.GetTotalCountsForPrefix(kHistogramName).empty());
+
+  tab_data()->SetDiscardState(true);
+  tab_data()->IncrementDiscardCount();
+  test_clock().Advance(base::TimeDelta::FromSeconds(5));
+  tab_data()->SetDiscardState(false);
+  test_clock().Advance(base::TimeDelta::FromSeconds(13));
+
+  tab_data()->WebContentsDestroyed();
+
+  EXPECT_EQ(1,
+            histograms.GetTotalCountsForPrefix(kHistogramName).begin()->second);
+
+  histograms.ExpectBucketCount(kHistogramName, 13000, 1);
+}
+
+}  // namespace memory
diff --git a/chrome/browser/net/chrome_network_delegate.cc b/chrome/browser/net/chrome_network_delegate.cc
index 0f1971f0..852c7552 100644
--- a/chrome/browser/net/chrome_network_delegate.cc
+++ b/chrome/browser/net/chrome_network_delegate.cc
@@ -492,38 +492,21 @@
   extensions_delegate_->OnResponseStarted(request);
 }
 
-void ChromeNetworkDelegate::OnNetworkBytesReceived(
-    const net::URLRequest& request,
-    int64_t bytes_received) {
+void ChromeNetworkDelegate::OnNetworkBytesReceived(net::URLRequest* request,
+                                                   int64_t bytes_received) {
 #if defined(ENABLE_TASK_MANAGER)
   // Note: Currently, OnNetworkBytesReceived is only implemented for HTTP jobs,
   // not FTP or other types, so those kinds of bytes will not be reported here.
-  task_management::TaskManagerInterface::OnRawBytesRead(request,
+  task_management::TaskManagerInterface::OnRawBytesRead(*request,
                                                         bytes_received);
 #endif  // defined(ENABLE_TASK_MANAGER)
 
-  if (data_use_aggregator_) {
-    if (is_data_usage_off_the_record_) {
-      data_use_aggregator_->ReportOffTheRecordDataUse(0 /* tx_bytes */,
-                                                      bytes_received);
-    } else {
-      data_use_aggregator_->ReportDataUse(request, -1 /* tab_id */,
-                                          0 /* tx_bytes */, bytes_received);
-    }
-  }
+  ReportDataUsageStats(request, 0 /* tx_bytes */, bytes_received);
 }
 
-void ChromeNetworkDelegate::OnNetworkBytesSent(const net::URLRequest& request,
+void ChromeNetworkDelegate::OnNetworkBytesSent(net::URLRequest* request,
                                                int64_t bytes_sent) {
-  if (data_use_aggregator_) {
-    if (is_data_usage_off_the_record_) {
-      data_use_aggregator_->ReportOffTheRecordDataUse(bytes_sent,
-                                                      0 /* rx_bytes */);
-    } else {
-      data_use_aggregator_->ReportDataUse(request, -1 /* tab_id */, bytes_sent,
-                                          0 /* rx_bytes */);
-    }
-  }
+  ReportDataUsageStats(request, bytes_sent, 0 /* rx_bytes */);
 }
 
 void ChromeNetworkDelegate::OnCompleted(net::URLRequest* request,
@@ -742,3 +725,17 @@
   ReportInvalidReferrerSend(target_url, referrer_url);
   return true;
 }
+
+void ChromeNetworkDelegate::ReportDataUsageStats(net::URLRequest* request,
+                                                 int64_t tx_bytes,
+                                                 int64_t rx_bytes) {
+  if (!data_use_aggregator_)
+    return;
+
+  if (is_data_usage_off_the_record_) {
+    data_use_aggregator_->ReportOffTheRecordDataUse(tx_bytes, rx_bytes);
+    return;
+  }
+
+  data_use_aggregator_->ReportDataUse(request, tx_bytes, rx_bytes);
+}
diff --git a/chrome/browser/net/chrome_network_delegate.h b/chrome/browser/net/chrome_network_delegate.h
index 2d86467..a39ba5f 100644
--- a/chrome/browser/net/chrome_network_delegate.h
+++ b/chrome/browser/net/chrome_network_delegate.h
@@ -160,9 +160,9 @@
   void OnBeforeRedirect(net::URLRequest* request,
                         const GURL& new_location) override;
   void OnResponseStarted(net::URLRequest* request) override;
-  void OnNetworkBytesReceived(const net::URLRequest& request,
+  void OnNetworkBytesReceived(net::URLRequest* request,
                               int64_t bytes_received) override;
-  void OnNetworkBytesSent(const net::URLRequest& request,
+  void OnNetworkBytesSent(net::URLRequest* request,
                           int64_t bytes_sent) override;
   void OnCompleted(net::URLRequest* request, bool started) override;
   void OnURLRequestDestroyed(net::URLRequest* request) override;
@@ -189,6 +189,12 @@
       const GURL& target_url,
       const GURL& referrer_url) const override;
 
+  // Convenience function for reporting network usage to the
+  // |data_use_aggregator_|.
+  void ReportDataUsageStats(net::URLRequest* request,
+                            int64_t tx_bytes,
+                            int64_t rx_bytes);
+
   scoped_ptr<ChromeExtensionsNetworkDelegate> extensions_delegate_;
 
   void* profile_;
diff --git a/chrome/browser/net/chrome_network_delegate_unittest.cc b/chrome/browser/net/chrome_network_delegate_unittest.cc
index c29e462b..39f29d05 100644
--- a/chrome/browser/net/chrome_network_delegate_unittest.cc
+++ b/chrome/browser/net/chrome_network_delegate_unittest.cc
@@ -23,6 +23,7 @@
 #include "components/content_settings/core/browser/cookie_settings.h"
 #include "components/content_settings/core/common/pref_names.h"
 #include "components/data_usage/core/data_use_aggregator.h"
+#include "components/data_usage/core/data_use_annotator.h"
 #include "components/syncable_prefs/testing_pref_service_syncable.h"
 #include "content/public/browser/resource_request_info.h"
 #include "content/public/common/content_switches.h"
@@ -99,14 +100,15 @@
 class FakeDataUseAggregator : public data_usage::DataUseAggregator {
  public:
   FakeDataUseAggregator()
-      : on_the_record_tx_bytes_(0),
+      : data_usage::DataUseAggregator(
+            scoped_ptr<data_usage::DataUseAnnotator>()),
+        on_the_record_tx_bytes_(0),
         on_the_record_rx_bytes_(0),
         off_the_record_tx_bytes_(0),
         off_the_record_rx_bytes_(0) {}
   ~FakeDataUseAggregator() override {}
 
-  void ReportDataUse(const net::URLRequest& request,
-                     int32_t tab_id,
+  void ReportDataUse(net::URLRequest* request,
                      int64_t tx_bytes,
                      int64_t rx_bytes) override {
     on_the_record_tx_bytes_ += tx_bytes;
diff --git a/chrome/browser/notifications/platform_notification_service_impl.cc b/chrome/browser/notifications/platform_notification_service_impl.cc
index 04734d10..6a5db5e1 100644
--- a/chrome/browser/notifications/platform_notification_service_impl.cc
+++ b/chrome/browser/notifications/platform_notification_service_impl.cc
@@ -20,6 +20,7 @@
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/chrome_pages.h"
 #include "chrome/browser/ui/scoped_tabbed_browser_displayer.h"
+#include "chrome/common/chrome_switches.h"
 #include "chrome/common/pref_names.h"
 #include "chrome/grit/generated_resources.h"
 #include "components/content_settings/core/browser/host_content_settings_map.h"
@@ -412,10 +413,17 @@
 
   Profile* profile = Profile::FromBrowserContext(browser_context);
   DCHECK(profile);
-  chrome::ScopedTabbedBrowserDisplayer browser_displayer(
-      profile, chrome::GetActiveDesktop());
-  chrome::ShowContentSettingsExceptions(browser_displayer.browser(),
-                                        CONTENT_SETTINGS_TYPE_NOTIFICATIONS);
+
+  if (switches::SettingsWindowEnabled()) {
+    chrome::ShowContentSettingsExceptionsInWindow(
+        profile, CONTENT_SETTINGS_TYPE_NOTIFICATIONS);
+  } else {
+    chrome::ScopedTabbedBrowserDisplayer browser_displayer(
+        profile, chrome::GetActiveDesktop());
+    chrome::ShowContentSettingsExceptions(browser_displayer.browser(),
+                                          CONTENT_SETTINGS_TYPE_NOTIFICATIONS);
+  }
+
 #endif  // defined(OS_ANDROID)
 }
 
diff --git a/chrome/browser/permissions/chooser_context_base.cc b/chrome/browser/permissions/chooser_context_base.cc
new file mode 100644
index 0000000..22f043e
--- /dev/null
+++ b/chrome/browser/permissions/chooser_context_base.cc
@@ -0,0 +1,112 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/permissions/chooser_context_base.h"
+
+#include <string>
+
+#include "base/values.h"
+#include "chrome/browser/content_settings/host_content_settings_map_factory.h"
+#include "components/content_settings/core/browser/host_content_settings_map.h"
+
+using ObjectList = ScopedVector<base::DictionaryValue>;
+
+const char kObjectListKey[] = "chosen-objects";
+
+ChooserContextBase::ChooserContextBase(
+    Profile* profile,
+    const ContentSettingsType data_content_settings_type)
+    : host_content_settings_map_(
+          HostContentSettingsMapFactory::GetForProfile(profile)),
+      data_content_settings_type_(data_content_settings_type) {
+  DCHECK(host_content_settings_map_);
+}
+
+ChooserContextBase::~ChooserContextBase() {}
+
+ObjectList ChooserContextBase::GetGrantedObjects(const GURL& requesting_origin,
+                                                 const GURL& embedding_origin) {
+  scoped_ptr<base::DictionaryValue> setting =
+      GetWebsiteSetting(requesting_origin, embedding_origin);
+  scoped_ptr<base::Value> objects;
+  if (!setting->Remove(kObjectListKey, &objects))
+    return ObjectList();
+
+  scoped_ptr<base::ListValue> object_list =
+      base::ListValue::From(objects.Pass());
+  if (!object_list)
+    return ObjectList();
+
+  ObjectList results;
+  for (base::ListValue::iterator it = object_list->begin();
+       it != object_list->end(); ++it) {
+    // Steal ownership of |object| from |object_list|.
+    scoped_ptr<base::Value> object(*it);
+    *it = nullptr;
+
+    scoped_ptr<base::DictionaryValue> object_dict =
+        base::DictionaryValue::From(object.Pass());
+    if (object_dict && IsValidObject(*object_dict))
+      results.push_back(object_dict.Pass());
+  }
+  return results.Pass();
+}
+
+void ChooserContextBase::GrantObjectPermission(
+    const GURL& requesting_origin,
+    const GURL& embedding_origin,
+    scoped_ptr<base::DictionaryValue> object) {
+  DCHECK(object && IsValidObject(*object));
+  scoped_ptr<base::DictionaryValue> setting =
+      GetWebsiteSetting(requesting_origin, embedding_origin);
+  base::ListValue* object_list;
+  if (!setting->GetList(kObjectListKey, &object_list)) {
+    object_list = new base::ListValue();
+    setting->Set(kObjectListKey, object_list);
+  }
+  object_list->AppendIfNotPresent(object.release());
+  SetWebsiteSetting(requesting_origin, embedding_origin, setting.Pass());
+}
+
+void ChooserContextBase::RevokeObjectPermission(
+    const GURL& requesting_origin,
+    const GURL& embedding_origin,
+    const base::DictionaryValue& object) {
+  DCHECK(IsValidObject(object));
+  scoped_ptr<base::DictionaryValue> setting =
+      GetWebsiteSetting(requesting_origin, embedding_origin);
+  base::ListValue* object_list;
+  if (!setting->GetList(kObjectListKey, &object_list))
+    return;
+  object_list->Remove(object, nullptr);
+  SetWebsiteSetting(requesting_origin, embedding_origin, setting.Pass());
+}
+
+scoped_ptr<base::DictionaryValue> ChooserContextBase::GetWebsiteSetting(
+    const GURL& requesting_origin,
+    const GURL& embedding_origin) {
+  scoped_ptr<base::DictionaryValue> value =
+      base::DictionaryValue::From(host_content_settings_map_->GetWebsiteSetting(
+          requesting_origin, embedding_origin, data_content_settings_type_,
+          std::string(), nullptr));
+  if (!value)
+    value.reset(new base::DictionaryValue());
+
+  return value.Pass();
+}
+
+void ChooserContextBase::SetWebsiteSetting(const GURL& requesting_origin,
+                                           const GURL& embedding_origin,
+                                           scoped_ptr<base::Value> value) {
+  ContentSettingsPattern primary_pattern(
+      ContentSettingsPattern::FromURLNoWildcard(requesting_origin));
+  ContentSettingsPattern secondary_pattern(
+      ContentSettingsPattern::FromURLNoWildcard(embedding_origin));
+  if (!primary_pattern.IsValid() || !secondary_pattern.IsValid())
+    return;
+
+  host_content_settings_map_->SetWebsiteSetting(
+      primary_pattern, secondary_pattern, data_content_settings_type_,
+      std::string(), value.release());
+}
diff --git a/chrome/browser/permissions/chooser_context_base.h b/chrome/browser/permissions/chooser_context_base.h
new file mode 100644
index 0000000..8cf1e614
--- /dev/null
+++ b/chrome/browser/permissions/chooser_context_base.h
@@ -0,0 +1,67 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_PERMISSIONS_CHOOSER_CONTEXT_BASE_H_
+#define CHROME_BROWSER_PERMISSIONS_CHOOSER_CONTEXT_BASE_H_
+
+#include <string>
+
+#include "base/memory/scoped_ptr.h"
+#include "base/memory/scoped_vector.h"
+#include "components/content_settings/core/common/content_settings_types.h"
+#include "components/keyed_service/core/keyed_service.h"
+
+namespace base {
+class DictionaryValue;
+class Value;
+}
+
+class GURL;
+class HostContentSettingsMap;
+class Profile;
+
+// This is the base class for services that manage any type of permission that
+// is granted through a chooser-style UI instead of a simple allow/deny prompt.
+// Subclasses must define the structure of the objects that are stored.
+class ChooserContextBase : public KeyedService {
+ public:
+  ChooserContextBase(Profile* profile,
+                     ContentSettingsType data_content_settings_type);
+  ~ChooserContextBase() override;
+
+  // Returns the list of objects that |requesting_origin| has been granted
+  // permission to access when embedded within |embedding_origin|.
+  ScopedVector<base::DictionaryValue> GetGrantedObjects(
+      const GURL& requesting_origin,
+      const GURL& embedding_origin);
+
+  // Grants |requesting_origin| access to |object| when embedded within
+  // |embedding_origin| by writing it into |host_content_settings_map_|.
+  void GrantObjectPermission(const GURL& requesting_origin,
+                             const GURL& embedding_origin,
+                             scoped_ptr<base::DictionaryValue> object);
+
+  // Revokes |requesting_origin|'s permission to access |object| when embedded
+  // within |embedding_origin|.
+  void RevokeObjectPermission(const GURL& requesting_origin,
+                              const GURL& embedding_origin,
+                              const base::DictionaryValue& object);
+
+  // Validates the structure of an object read from
+  // |host_content_settings_map_|.
+  virtual bool IsValidObject(const base::DictionaryValue& object) = 0;
+
+ private:
+  scoped_ptr<base::DictionaryValue> GetWebsiteSetting(
+      const GURL& requesting_origin,
+      const GURL& embedding_origin);
+  void SetWebsiteSetting(const GURL& requesting_origin,
+                         const GURL& embedding_origin,
+                         scoped_ptr<base::Value> value);
+
+  HostContentSettingsMap* const host_content_settings_map_;
+  const ContentSettingsType data_content_settings_type_;
+};
+
+#endif  // CHROME_BROWSER_PERMISSIONS_CHOOSER_CONTEXT_BASE_H_
diff --git a/chrome/browser/plugins/plugin_power_saver_browsertest.cc b/chrome/browser/plugins/plugin_power_saver_browsertest.cc
index 55ec053..362fea5d 100644
--- a/chrome/browser/plugins/plugin_power_saver_browsertest.cc
+++ b/chrome/browser/plugins/plugin_power_saver_browsertest.cc
@@ -266,7 +266,6 @@
   }
 
   void SetUpCommandLine(base::CommandLine* command_line) override {
-    command_line->AppendSwitch(switches::kEnablePluginPowerSaver);
     command_line->AppendSwitch(switches::kEnablePepperTesting);
     command_line->AppendSwitch(switches::kEnablePluginPlaceholderTesting);
     command_line->AppendSwitchASCII(
diff --git a/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc b/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc
index 0aecb24f..d5f51d649 100644
--- a/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc
+++ b/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc
@@ -125,6 +125,7 @@
 #if !defined(OS_ANDROID)
 #include "chrome/browser/profile_resetter/automatic_profile_resetter_factory.h"
 #include "chrome/browser/ui/global_error/global_error_service_factory.h"
+#include "chrome/browser/usb/usb_chooser_context_factory.h"
 #endif
 
 #if defined(OS_WIN)
@@ -332,6 +333,9 @@
 #if defined(OS_WIN)
   TriggeredProfileResetterFactory::GetInstance();
 #endif
+#if !defined(OS_ANDROID)
+  UsbChooserContextFactory::GetInstance();
+#endif
   WebDataServiceFactory::GetInstance();
 }
 
diff --git a/chrome/browser/profiles/file_path_verifier_win.cc b/chrome/browser/profiles/file_path_verifier_win.cc
index 8a1f427..4cda6b29 100644
--- a/chrome/browser/profiles/file_path_verifier_win.cc
+++ b/chrome/browser/profiles/file_path_verifier_win.cc
@@ -9,7 +9,6 @@
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
 #include "base/metrics/histogram.h"
-#include "chrome_elf/create_file/chrome_create_file.h"
 
 namespace {
 
@@ -32,7 +31,6 @@
   FileVerificationResult file_verification_result =
       FILE_VERIFICATION_FAILED_UNKNOWN;
   base::FilePath normalized_path;
-  int redirect_count_before = ::GetRedirectCount();
   if (!base::NormalizeFilePath(file, &normalized_path)) {
     if (::GetLastError() == ERROR_FILE_NOT_FOUND)
       file_verification_result = FILE_VERIFICATION_FILE_NOT_FOUND;
@@ -41,24 +39,15 @@
   } else {
     internal::PathComparisonReason path_comparison_reason =
         internal::ComparePathsIgnoreCase(file, normalized_path);
-    // GetRedirectCount() tracks the number of CreateFile() calls that were
-    // redirected. If it has increased then the CreateFile() call made by
-    // base::NormalizeFilePath() was redirected.
-    bool was_redirected = ::GetRedirectCount() > redirect_count_before;
     switch (path_comparison_reason) {
       case internal::PATH_COMPARISON_EQUAL:
-        file_verification_result = was_redirected ?
-            FILE_VERIFICATION_SUCCESS_REDIRECT : FILE_VERIFICATION_SUCCESS;
+        file_verification_result = FILE_VERIFICATION_SUCCESS;
         break;
       case internal::PATH_COMPARISON_FAILED_SAMEBASE:
-        file_verification_result = was_redirected ?
-            FILE_VERIFICATION_FAILED_SAMEBASE_REDIRECT :
-            FILE_VERIFICATION_FAILED_SAMEBASE;
+        file_verification_result = FILE_VERIFICATION_FAILED_SAMEBASE;
         break;
       case internal::PATH_COMPARISON_FAILED_SAMEDIR:
-        file_verification_result = was_redirected ?
-            FILE_VERIFICATION_FAILED_SAMEDIR_REDIRECT :
-            FILE_VERIFICATION_FAILED_SAMEDIR;
+        file_verification_result = FILE_VERIFICATION_FAILED_SAMEDIR;
         break;
       case internal::PATH_COMPARISON_FAILED_UNKNOWN:
         // file_verification_result was initialized to the right value above.
diff --git a/chrome/browser/renderer_context_menu/render_view_context_menu.cc b/chrome/browser/renderer_context_menu/render_view_context_menu.cc
index b5a5755..959b8b78 100644
--- a/chrome/browser/renderer_context_menu/render_view_context_menu.cc
+++ b/chrome/browser/renderer_context_menu/render_view_context_menu.cc
@@ -167,6 +167,12 @@
   OPEN_LINK_AS_USER_LAST_ENUM_ID,
 };
 
+#if !defined(OS_CHROMEOS)
+// We report the number of "Open Link as User" entries shown in the context
+// menu via UMA, differentiating between at most that many profiles.
+const int kOpenLinkAsUserMaxProfilesReported = 10;
+#endif  // !defined(OS_CHROMEOS)
+
 // Whether to return the general enum_id or context_specific_enum_id
 // in the FindUMAEnumValueForCommand lookup function.
 enum UmaEnumIdLookupType {
@@ -910,6 +916,12 @@
         }
       }
 
+      if (!target_profiles.empty()) {
+        UMA_HISTOGRAM_ENUMERATION("RenderViewContextMenu.OpenLinkAsUserShown",
+                                  target_profiles.size(),
+                                  kOpenLinkAsUserMaxProfilesReported);
+      }
+
       if (target_profiles.size() == 1) {
         size_t profile_index = target_profiles[0];
         menu_model_.AddItem(
diff --git a/chrome/browser/resources/bookmark_manager/css/bmm.css b/chrome/browser/resources/bookmark_manager/css/bmm.css
index 78eb5cf..be6e5ed 100644
--- a/chrome/browser/resources/bookmark_manager/css/bmm.css
+++ b/chrome/browser/resources/bookmark_manager/css/bmm.css
@@ -243,6 +243,7 @@
 
 #list-pane {
   flex: 1;
+  min-width: 0;
 }
 
 #list-pane > :first-child {
diff --git a/chrome/browser/resources/chromeos/chromevox/chromevox/background/keymaps/next_keymap.json b/chrome/browser/resources/chromeos/chromevox/chromevox/background/keymaps/next_keymap.json
index 0164642..34dab08 100644
--- a/chrome/browser/resources/chromeos/chromevox/chromevox/background/keymaps/next_keymap.json
+++ b/chrome/browser/resources/chromeos/chromevox/chromevox/background/keymaps/next_keymap.json
@@ -306,6 +306,15 @@
           "shitKey": [true]
         }
       }
+    },
+    {
+      "command": "toggleChromeVox",
+      "sequence": {
+        "cvoxModifier": true,
+        "keys": {
+          "keyCode": [65, 65]
+        }
+      }
     }
   ]
 }
diff --git a/chrome/browser/resources/chromeos/chromevox/cvox2/background/background.js b/chrome/browser/resources/chromeos/chromevox/cvox2/background/background.js
index f09e724..05b2009 100644
--- a/chrome/browser/resources/chromeos/chromevox/cvox2/background/background.js
+++ b/chrome/browser/resources/chromeos/chromevox/cvox2/background/background.js
@@ -81,27 +81,6 @@
       this[func] = this[func].bind(this);
   }
 
-  chrome.automation.getDesktop(this.onGotDesktop);
-
-  // Handle messages directed to the Next background page.
-  cvox.ExtensionBridge.addMessageListener(function(msg, port) {
-    var target = msg['target'];
-    var action = msg['action'];
-
-    switch (target) {
-      case 'next':
-        if (action == 'getIsClassicEnabled') {
-          var url = msg['url'];
-          var isClassicEnabled = this.shouldEnableClassicForUrl_(url);
-          port.postMessage({
-            target: 'next',
-            isClassicEnabled: isClassicEnabled
-          });
-        }
-        break;
-    }
-  }.bind(this));
-
   /** @type {!cvox.AbstractEarcons} @private */
   this.classicEarcons_ = cvox.ChromeVox.earcons || new cvox.ClassicEarcons();
 
@@ -129,12 +108,25 @@
     }.bind(this)
   });
 
+  Object.defineProperty(cvox.ChromeVox, 'isActive', {
+    get: function() {
+      return localStorage['active'] !== 'false';
+    },
+    set: function(value) {
+      localStorage['active'] = value;
+    }
+  });
+
+  cvox.ExtensionBridge.addMessageListener(this.onMessage_);
+
   document.addEventListener(
       'keydown', cvox.ChromeVoxKbHandler.basicKeyDownActionsListener, true);
   cvox.ChromeVoxKbHandler.commandHandler = this.onGotCommand.bind(this);
 
   // Classic keymap.
   cvox.ChromeVoxKbHandler.handlerKeyMap = cvox.KeyMap.fromDefaults();
+
+  chrome.automation.addTreeChangeObserver(this.onTreeChange);
 };
 
 Background.prototype = {
@@ -159,15 +151,6 @@
   },
 
   /**
-   * Handles all setup once a new automation tree appears.
-   * @param {chrome.automation.AutomationNode} desktop
-   */
-  onGotDesktop: function(desktop) {
-    // Register a tree change observer.
-    chrome.automation.addTreeChangeObserver(this.onTreeChange);
-  },
-
-  /**
    * Handles ChromeVox Next commands.
    * @param {string} command
    * @param {boolean=} opt_bypassModeCheck Always tries to execute the command
@@ -363,6 +346,17 @@
       case 'showOptionsPage':
         chrome.runtime.openOptionsPage();
         break;
+      case 'toggleChromeVox':
+        if (cvox.ChromeVox.isChromeOS)
+          return false;
+
+        cvox.ChromeVox.isActive = !cvox.ChromeVox.isActive;
+        if (!cvox.ChromeVox.isActive) {
+          var msg = Msgs.getMsg('chromevox_inactive');
+          cvox.ChromeVox.tts.speak(msg, cvox.QueueMode.FLUSH);
+          return false;
+        }
+        break;
       case 'toggleChromeVoxVersion':
         var newMode;
         if (this.mode_ == ChromeVoxMode.FORCE_NEXT) {
@@ -490,7 +484,7 @@
    * @param {chrome.automation.TreeChange} treeChange
    */
   onTreeChange: function(treeChange) {
-    if (this.mode_ === ChromeVoxMode.CLASSIC)
+    if (this.mode_ === ChromeVoxMode.CLASSIC || !cvox.ChromeVox.isActive)
       return;
 
     var node = treeChange.target;
@@ -639,6 +633,29 @@
       var start = text.getSpanStart(selectionSpan);
       actionNode.setSelection(position - start, position - start);
     }
+  },
+
+  /**
+   * @param {Object} msg A message sent from a content script.
+   * @param {Port} port
+   * @private
+   */
+  onMessage_: function(msg, port) {
+    var target = msg['target'];
+    var action = msg['action'];
+
+    switch (target) {
+      case 'next':
+        if (action == 'getIsClassicEnabled') {
+          var url = msg['url'];
+          var isClassicEnabled = this.shouldEnableClassicForUrl_(url);
+          port.postMessage({
+            target: 'next',
+            isClassicEnabled: isClassicEnabled
+          });
+        }
+        break;
+    }
   }
 };
 
diff --git a/chrome/browser/resources/chromeos/chromevox/cvox2/background/background_test.extjs b/chrome/browser/resources/chromeos/chromevox/cvox2/background/background_test.extjs
index 27bb3af..fbeb836 100644
--- a/chrome/browser/resources/chromeos/chromevox/cvox2/background/background_test.extjs
+++ b/chrome/browser/resources/chromeos/chromevox/cvox2/background/background_test.extjs
@@ -475,3 +475,38 @@
       '/^(url1.*|u.l2|.*url3)$/',
       Background.globsToRegExp_(['url1*', 'u?l2', '*url3']).toString());
 });
+
+TEST_F('BackgroundTest', 'ActiveOrInactive', function() {
+  var mockFeedback = this.createMockFeedback();
+  this.runWithLoadedTree(function() {/*!
+      <a href="a">a</a>
+      <button>b</button>
+      <input type="text"></input>
+    */},
+    function(rootNode) {
+      var focusButton = function() { rootNode.find({role: 'button'}).focus(); };
+      var on = function() { cvox.ChromeVox.isActive = true; };
+      var off = function() { cvox.ChromeVox.isActive = false; };
+
+      function focusThen(toFocus, then) {
+        toFocus.addEventListener('focus', function innerFocus(e) {
+          if (e.target != toFocus)
+            return;
+          rootNode.removeEventListener('focus', innerFocus, true);
+          then && then();
+        }, true);
+        toFocus.focus();
+      }
+
+      mockFeedback.call(focusButton)
+          .expectSpeech('b').expectSpeech('Button')
+          .call(off)
+          .call(focusThen.bind(this, rootNode.find({ role: 'link' }), on))
+          .call(focusThen.bind(this, rootNode.find({ role: 'textField' })))
+          .expectNextSpeechUtteranceIsNot('a')
+          .expectSpeech('Edit text');
+
+      mockFeedback.replay();
+    }
+  );
+});
diff --git a/chrome/browser/resources/chromeos/chromevox/cvox2/background/desktop_automation_handler.js b/chrome/browser/resources/chromeos/chromevox/cvox2/background/desktop_automation_handler.js
index 0cb5812..49c4416d 100644
--- a/chrome/browser/resources/chromeos/chromevox/cvox2/background/desktop_automation_handler.js
+++ b/chrome/browser/resources/chromeos/chromevox/cvox2/background/desktop_automation_handler.js
@@ -46,6 +46,11 @@
 DesktopAutomationHandler.prototype = {
   __proto__: BaseAutomationHandler.prototype,
 
+  /** @override */
+  willHandleEvent_: function(evt) {
+    return !cvox.ChromeVox.isActive;
+  },
+
   /**
    * Provides all feedback once ChromeVox's focus changes.
    * @param {Object} evt
diff --git a/chrome/browser/resources/chromeos/login/oobe_screen_oauth_enrollment.js b/chrome/browser/resources/chromeos/login/oobe_screen_oauth_enrollment.js
index 90b59899..a8f4e2e7 100644
--- a/chrome/browser/resources/chromeos/login/oobe_screen_oauth_enrollment.js
+++ b/chrome/browser/resources/chromeos/login/oobe_screen_oauth_enrollment.js
@@ -69,7 +69,7 @@
             if (this.currentStep_ != STEP_SIGNIN)
               return;
             this.isCancelDisabled = false;
-            chrome.send('frameLoadingCompleted', [0]);
+            chrome.send('frameLoadingCompleted');
           }).bind(this));
 
       this.authenticator_.addEventListener('authCompleted',
diff --git a/chrome/browser/resources/chromeos/login/screen_gaia_signin.js b/chrome/browser/resources/chromeos/login/screen_gaia_signin.js
index 4cc87f2..8d4c4ca5 100644
--- a/chrome/browser/resources/chromeos/login/screen_gaia_signin.js
+++ b/chrome/browser/resources/chromeos/login/screen_gaia_signin.js
@@ -32,20 +32,11 @@
       'loadAuthExtension',
       'doReload',
       'monitorOfflineIdle',
-      'onWebviewError',
-      'onFrameError',
       'updateCancelButtonState',
       'showWhitelistCheckFailedError',
     ],
 
     /**
-     * Frame loading error code (0 - no error).
-     * @type {number}
-     * @private
-     */
-    error_: 0,
-
-    /**
      * Saved gaia auth host load params.
      * @type {?string}
      * @private
@@ -481,8 +472,6 @@
 
       if (data.forceReload ||
           JSON.stringify(this.gaiaAuthParams_) != JSON.stringify(params)) {
-        this.error_ = 0;
-
         var authMode = cr.login.GaiaAuthHost.AuthMode.DEFAULT;
         if (data.useOffline)
           authMode = cr.login.GaiaAuthHost.AuthMode.OFFLINE;
@@ -499,9 +488,6 @@
                                   params,
                                   this.onAuthCompleted_.bind(this));
         }
-      } else if (this.loading && this.error_) {
-        // An error has occurred, so trying to reload.
-        this.doReload();
       }
     },
 
@@ -830,7 +816,6 @@
     doReload: function() {
       if (this.isLocal)
         return;
-      this.error_ = 0;
       this.gaiaAuthHost_.reload();
       this.loading = true;
       this.startLoadingTimer_();
@@ -879,17 +864,6 @@
     },
 
     /**
-     * Handler for iframe's error notification coming from the outside.
-     * For more info see C++ class 'WebUILoginView' which calls this method.
-     * @param {number} error Error code.
-     * @param {string} url The URL that failed to load.
-     */
-    onFrameError: function(error, url) {
-      this.error_ = error;
-      chrome.send('frameLoadingCompleted', [this.error_]);
-    },
-
-    /**
      * Handler for webview error handling.
      * @param {!Object} data Additional information about error event like:
      * {string} error Error code such as "ERR_INTERNET_DISCONNECTED".
diff --git a/chrome/browser/resources/md_downloads/action_service.html b/chrome/browser/resources/md_downloads/action_service.html
index 4fe25fe3..0dce3440 100644
--- a/chrome/browser/resources/md_downloads/action_service.html
+++ b/chrome/browser/resources/md_downloads/action_service.html
@@ -1,4 +1,4 @@
 <link rel="import" href="chrome://resources/html/assert.html">
 <link rel="import" href="chrome://resources/html/cr.html">
-<link rel="import" href="chrome://downloads/i18n.html">
+<link rel="import" href="chrome://downloads/i18n_setup.html">
 <script src="chrome://downloads/action_service.js"></script>
diff --git a/chrome/browser/resources/md_downloads/crisper.js b/chrome/browser/resources/md_downloads/crisper.js
index 770c9fe..49ea6974 100644
--- a/chrome/browser/resources/md_downloads/crisper.js
+++ b/chrome/browser/resources/md_downloads/crisper.js
@@ -10,13 +10,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-// <include src="../../../../ui/webui/resources/js/i18n_template_no_process.js">
-
-i18nTemplate.process(document, loadTimeData);
-// 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.
-
 /**
  * The global object.
  * @type {!Object}
@@ -1787,6 +1780,13 @@
 
 !function(a,b){b["true"]=a;var c={},d={},e={},f=null;!function(a){function b(a){if("number"==typeof a)return a;var b={};for(var c in a)b[c]=a[c];return b}function c(){this._delay=0,this._endDelay=0,this._fill="none",this._iterationStart=0,this._iterations=1,this._duration=0,this._playbackRate=1,this._direction="normal",this._easing="linear"}function d(b,d){var e=new c;return d&&(e.fill="both",e.duration="auto"),"number"!=typeof b||isNaN(b)?void 0!==b&&Object.getOwnPropertyNames(b).forEach(function(c){if("auto"!=b[c]){if(("number"==typeof e[c]||"duration"==c)&&("number"!=typeof b[c]||isNaN(b[c])))return;if("fill"==c&&-1==s.indexOf(b[c]))return;if("direction"==c&&-1==t.indexOf(b[c]))return;if("playbackRate"==c&&1!==b[c]&&a.isDeprecated("AnimationEffectTiming.playbackRate","2014-11-28","Use Animation.playbackRate instead."))return;e[c]=b[c]}}):e.duration=b,e}function e(a){return"number"==typeof a&&(a=isNaN(a)?{duration:0}:{duration:a}),a}function f(b,c){b=a.numericTimingToObject(b);var e=d(b,c);return e._easing=i(e.easing),e}function g(a,b,c,d){return 0>a||a>1||0>c||c>1?B:function(e){function f(a,b,c){return 3*a*(1-c)*(1-c)*c+3*b*(1-c)*c*c+c*c*c}if(0==e||1==e)return e;for(var g=0,h=1;;){var i=(g+h)/2,j=f(a,c,i);if(Math.abs(e-j)<.001)return f(b,d,i);e>j?g=i:h=i}}}function h(a,b){return function(c){if(c>=1)return 1;var d=1/a;return c+=b*d,c-c%d}}function i(a){var b=z.exec(a);if(b)return g.apply(this,b.slice(1).map(Number));var c=A.exec(a);if(c)return h(Number(c[1]),{start:u,middle:v,end:w}[c[2]]);var d=x[a];return d?d:B}function j(a){return Math.abs(k(a)/a.playbackRate)}function k(a){return a.duration*a.iterations}function l(a,b,c){return null==b?C:b<c.delay?D:b>=c.delay+a?E:F}function m(a,b,c,d,e){switch(d){case D:return"backwards"==b||"both"==b?0:null;case F:return c-e;case E:return"forwards"==b||"both"==b?a:null;case C:return null}}function n(a,b,c,d){return(d.playbackRate<0?b-a:b)*d.playbackRate+c}function o(a,b,c,d,e){return 1/0===c||c===-1/0||c-d==b&&e.iterations&&(e.iterations+e.iterationStart)%1==0?a:c%a}function p(a,b,c,d){return 0===c?0:b==a?d.iterationStart+d.iterations-1:Math.floor(c/a)}function q(a,b,c,d){var e=a%2>=1,f="normal"==d.direction||d.direction==(e?"alternate-reverse":"alternate"),g=f?c:b-c,h=g/b;return b*d.easing(h)}function r(a,b,c){var d=l(a,b,c),e=m(a,c.fill,b,d,c.delay);if(null===e)return null;if(0===a)return d===D?0:1;var f=c.iterationStart*c.duration,g=n(a,e,f,c),h=o(c.duration,k(c),g,f,c),i=p(c.duration,h,g,c);return q(i,c.duration,h,c)/c.duration}var s="backwards|forwards|both|none".split("|"),t="reverse|alternate|alternate-reverse".split("|");c.prototype={_setMember:function(b,c){this["_"+b]=c,this._effect&&(this._effect._timingInput[b]=c,this._effect._timing=a.normalizeTimingInput(a.normalizeTimingInput(this._effect._timingInput)),this._effect.activeDuration=a.calculateActiveDuration(this._effect._timing),this._effect._animation&&this._effect._animation._rebuildUnderlyingAnimation())},get playbackRate(){return this._playbackRate},set delay(a){this._setMember("delay",a)},get delay(){return this._delay},set endDelay(a){this._setMember("endDelay",a)},get endDelay(){return this._endDelay},set fill(a){this._setMember("fill",a)},get fill(){return this._fill},set iterationStart(a){this._setMember("iterationStart",a)},get iterationStart(){return this._iterationStart},set duration(a){this._setMember("duration",a)},get duration(){return this._duration},set direction(a){this._setMember("direction",a)},get direction(){return this._direction},set easing(a){this._setMember("easing",a)},get easing(){return this._easing},set iterations(a){this._setMember("iterations",a)},get iterations(){return this._iterations}};var u=1,v=.5,w=0,x={ease:g(.25,.1,.25,1),"ease-in":g(.42,0,1,1),"ease-out":g(0,0,.58,1),"ease-in-out":g(.42,0,.58,1),"step-start":h(1,u),"step-middle":h(1,v),"step-end":h(1,w)},y="\\s*(-?\\d+\\.?\\d*|-?\\.\\d+)\\s*",z=new RegExp("cubic-bezier\\("+y+","+y+","+y+","+y+"\\)"),A=/steps\(\s*(\d+)\s*,\s*(start|middle|end)\s*\)/,B=function(a){return a},C=0,D=1,E=2,F=3;a.cloneTimingInput=b,a.makeTiming=d,a.numericTimingToObject=e,a.normalizeTimingInput=f,a.calculateActiveDuration=j,a.calculateTimeFraction=r,a.calculatePhase=l,a.toTimingFunction=i}(c,f),function(a){function b(a,b){return a in h?h[a][b]||b:b}function c(a,c,d){var g=e[a];if(g){f.style[a]=c;for(var h in g){var i=g[h],j=f.style[i];d[i]=b(i,j)}}else d[a]=b(a,c)}function d(b){function d(){var a=e.length;null==e[a-1].offset&&(e[a-1].offset=1),a>1&&null==e[0].offset&&(e[0].offset=0);for(var b=0,c=e[0].offset,d=1;a>d;d++){var f=e[d].offset;if(null!=f){for(var g=1;d-b>g;g++)e[b+g].offset=c+(f-c)*g/(d-b);b=d,c=f}}}if(!Array.isArray(b)&&null!==b)throw new TypeError("Keyframes must be null or an array of keyframes");if(null==b)return[];for(var e=b.map(function(b){var d={};for(var e in b){var f=b[e];if("offset"==e){if(null!=f&&(f=Number(f),!isFinite(f)))throw new TypeError("keyframe offsets must be numbers.")}else{if("composite"==e)throw{type:DOMException.NOT_SUPPORTED_ERR,name:"NotSupportedError",message:"add compositing is not supported"};f="easing"==e?a.toTimingFunction(f):""+f}c(e,f,d)}return void 0==d.offset&&(d.offset=null),void 0==d.easing&&(d.easing=a.toTimingFunction("linear")),d}),f=!0,g=-1/0,h=0;h<e.length;h++){var i=e[h].offset;if(null!=i){if(g>i)throw{code:DOMException.INVALID_MODIFICATION_ERR,name:"InvalidModificationError",message:"Keyframes are not loosely sorted by offset. Sort or specify offsets."};g=i}else f=!1}return e=e.filter(function(a){return a.offset>=0&&a.offset<=1}),f||d(),e}var e={background:["backgroundImage","backgroundPosition","backgroundSize","backgroundRepeat","backgroundAttachment","backgroundOrigin","backgroundClip","backgroundColor"],border:["borderTopColor","borderTopStyle","borderTopWidth","borderRightColor","borderRightStyle","borderRightWidth","borderBottomColor","borderBottomStyle","borderBottomWidth","borderLeftColor","borderLeftStyle","borderLeftWidth"],borderBottom:["borderBottomWidth","borderBottomStyle","borderBottomColor"],borderColor:["borderTopColor","borderRightColor","borderBottomColor","borderLeftColor"],borderLeft:["borderLeftWidth","borderLeftStyle","borderLeftColor"],borderRadius:["borderTopLeftRadius","borderTopRightRadius","borderBottomRightRadius","borderBottomLeftRadius"],borderRight:["borderRightWidth","borderRightStyle","borderRightColor"],borderTop:["borderTopWidth","borderTopStyle","borderTopColor"],borderWidth:["borderTopWidth","borderRightWidth","borderBottomWidth","borderLeftWidth"],flex:["flexGrow","flexShrink","flexBasis"],font:["fontFamily","fontSize","fontStyle","fontVariant","fontWeight","lineHeight"],margin:["marginTop","marginRight","marginBottom","marginLeft"],outline:["outlineColor","outlineStyle","outlineWidth"],padding:["paddingTop","paddingRight","paddingBottom","paddingLeft"]},f=document.createElementNS("http://www.w3.org/1999/xhtml","div"),g={thin:"1px",medium:"3px",thick:"5px"},h={borderBottomWidth:g,borderLeftWidth:g,borderRightWidth:g,borderTopWidth:g,fontSize:{"xx-small":"60%","x-small":"75%",small:"89%",medium:"100%",large:"120%","x-large":"150%","xx-large":"200%"},fontWeight:{normal:"400",bold:"700"},outlineWidth:g,textShadow:{none:"0px 0px 0px transparent"},boxShadow:{none:"0px 0px 0px 0px transparent"}};a.normalizeKeyframes=d}(c,f),function(a){var b={};a.isDeprecated=function(a,c,d,e){var f=e?"are":"is",g=new Date,h=new Date(c);return h.setMonth(h.getMonth()+3),h>g?(a in b||console.warn("Web Animations: "+a+" "+f+" deprecated and will stop working on "+h.toDateString()+". "+d),b[a]=!0,!1):!0},a.deprecated=function(b,c,d,e){var f=e?"are":"is";if(a.isDeprecated(b,c,d,e))throw new Error(b+" "+f+" no longer supported. "+d)}}(c),function(){if(document.documentElement.animate){var a=document.documentElement.animate([],0),b=!0;if(a&&(b=!1,"play|currentTime|pause|reverse|playbackRate|cancel|finish|startTime|playState".split("|").forEach(function(c){void 0===a[c]&&(b=!0)})),!b)return}!function(a,b){function c(a){for(var b={},c=0;c<a.length;c++)for(var d in a[c])if("offset"!=d&&"easing"!=d&&"composite"!=d){var e={offset:a[c].offset,easing:a[c].easing,value:a[c][d]};b[d]=b[d]||[],b[d].push(e)}for(var f in b){var g=b[f];if(0!=g[0].offset||1!=g[g.length-1].offset)throw{type:DOMException.NOT_SUPPORTED_ERR,name:"NotSupportedError",message:"Partial keyframes are not supported"}}return b}function d(a){var c=[];for(var d in a)for(var e=a[d],f=0;f<e.length-1;f++){var g=e[f].offset,h=e[f+1].offset,i=e[f].value,j=e[f+1].value;g==h&&(1==h?i=j:j=i),c.push({startTime:g,endTime:h,easing:e[f].easing,property:d,interpolation:b.propertyInterpolation(d,i,j)})}return c.sort(function(a,b){return a.startTime-b.startTime}),c}b.convertEffectInput=function(e){var f=a.normalizeKeyframes(e),g=c(f),h=d(g);return function(a,c){if(null!=c)h.filter(function(a){return 0>=c&&0==a.startTime||c>=1&&1==a.endTime||c>=a.startTime&&c<=a.endTime}).forEach(function(d){var e=c-d.startTime,f=d.endTime-d.startTime,g=0==f?0:d.easing(e/f);b.apply(a,d.property,d.interpolation(g))});else for(var d in g)"offset"!=d&&"easing"!=d&&"composite"!=d&&b.clear(a,d)}}}(c,d,f),function(a){function b(a,b,c){e[c]=e[c]||[],e[c].push([a,b])}function c(a,c,d){for(var e=0;e<d.length;e++){var f=d[e];b(a,c,f),/-/.test(f)&&b(a,c,f.replace(/-(.)/g,function(a,b){return b.toUpperCase()}))}}function d(b,c,d){if("initial"==c||"initial"==d){var g=b.replace(/-(.)/g,function(a,b){return b.toUpperCase()});"initial"==c&&(c=f[g]),"initial"==d&&(d=f[g])}for(var h=c==d?[]:e[b],i=0;h&&i<h.length;i++){var j=h[i][0](c),k=h[i][0](d);if(void 0!==j&&void 0!==k){var l=h[i][1](j,k);if(l){var m=a.Interpolation.apply(null,l);return function(a){return 0==a?c:1==a?d:m(a)}}}}return a.Interpolation(!1,!0,function(a){return a?d:c})}var e={};a.addPropertiesHandler=c;var f={backgroundColor:"transparent",backgroundPosition:"0% 0%",borderBottomColor:"currentColor",borderBottomLeftRadius:"0px",borderBottomRightRadius:"0px",borderBottomWidth:"3px",borderLeftColor:"currentColor",borderLeftWidth:"3px",borderRightColor:"currentColor",borderRightWidth:"3px",borderSpacing:"2px",borderTopColor:"currentColor",borderTopLeftRadius:"0px",borderTopRightRadius:"0px",borderTopWidth:"3px",bottom:"auto",clip:"rect(0px, 0px, 0px, 0px)",color:"black",fontSize:"100%",fontWeight:"400",height:"auto",left:"auto",letterSpacing:"normal",lineHeight:"120%",marginBottom:"0px",marginLeft:"0px",marginRight:"0px",marginTop:"0px",maxHeight:"none",maxWidth:"none",minHeight:"0px",minWidth:"0px",opacity:"1.0",outlineColor:"invert",outlineOffset:"0px",outlineWidth:"3px",paddingBottom:"0px",paddingLeft:"0px",paddingRight:"0px",paddingTop:"0px",right:"auto",textIndent:"0px",textShadow:"0px 0px 0px transparent",top:"auto",transform:"",verticalAlign:"0px",visibility:"visible",width:"auto",wordSpacing:"normal",zIndex:"auto"};a.propertyInterpolation=d}(d,f),function(a,b){function c(b){var c=a.calculateActiveDuration(b),d=function(d){return a.calculateTimeFraction(c,d,b)};return d._totalDuration=b.delay+c+b.endDelay,d._isCurrent=function(d){var e=a.calculatePhase(c,d,b);return e===PhaseActive||e===PhaseBefore},d}b.KeyframeEffect=function(d,e,f){var g,h=c(a.normalizeTimingInput(f)),i=b.convertEffectInput(e),j=function(){i(d,g)};return j._update=function(a){return g=h(a),null!==g},j._clear=function(){i(d,null)},j._hasSameTarget=function(a){return d===a},j._isCurrent=h._isCurrent,j._totalDuration=h._totalDuration,j},b.NullEffect=function(a){var b=function(){a&&(a(),a=null)};return b._update=function(){return null},b._totalDuration=0,b._isCurrent=function(){return!1},b._hasSameTarget=function(){return!1},b}}(c,d,f),function(a){a.apply=function(b,c,d){b.style[a.propertyName(c)]=d},a.clear=function(b,c){b.style[a.propertyName(c)]=""}}(d,f),function(a){window.Element.prototype.animate=function(b,c){return a.timeline._play(a.KeyframeEffect(this,b,c))}}(d),function(a){function b(a,c,d){if("number"==typeof a&&"number"==typeof c)return a*(1-d)+c*d;if("boolean"==typeof a&&"boolean"==typeof c)return.5>d?a:c;if(a.length==c.length){for(var e=[],f=0;f<a.length;f++)e.push(b(a[f],c[f],d));return e}throw"Mismatched interpolation arguments "+a+":"+c}a.Interpolation=function(a,c,d){return function(e){return d(b(a,c,e))}}}(d,f),function(a,b){a.sequenceNumber=0;var c=function(a,b,c){this.target=a,this.currentTime=b,this.timelineTime=c,this.type="finish",this.bubbles=!1,this.cancelable=!1,this.currentTarget=a,this.defaultPrevented=!1,this.eventPhase=Event.AT_TARGET,this.timeStamp=Date.now()};b.Animation=function(b){this._sequenceNumber=a.sequenceNumber++,this._currentTime=0,this._startTime=null,this._paused=!1,this._playbackRate=1,this._inTimeline=!0,this._finishedFlag=!1,this.onfinish=null,this._finishHandlers=[],this._effect=b,this._inEffect=this._effect._update(0),this._idle=!0,this._currentTimePending=!1},b.Animation.prototype={_ensureAlive:function(){this._inEffect=this._effect._update(this.playbackRate<0&&0===this.currentTime?-1:this.currentTime),this._inTimeline||!this._inEffect&&this._finishedFlag||(this._inTimeline=!0,b.timeline._animations.push(this))},_tickCurrentTime:function(a,b){a!=this._currentTime&&(this._currentTime=a,this._isFinished&&!b&&(this._currentTime=this._playbackRate>0?this._totalDuration:0),this._ensureAlive())},get currentTime(){return this._idle||this._currentTimePending?null:this._currentTime},set currentTime(a){a=+a,isNaN(a)||(b.restart(),this._paused||null==this._startTime||(this._startTime=this._timeline.currentTime-a/this._playbackRate),this._currentTimePending=!1,this._currentTime!=a&&(this._tickCurrentTime(a,!0),b.invalidateEffects()))},get startTime(){return this._startTime},set startTime(a){a=+a,isNaN(a)||this._paused||this._idle||(this._startTime=a,this._tickCurrentTime((this._timeline.currentTime-this._startTime)*this.playbackRate),b.invalidateEffects())},get playbackRate(){return this._playbackRate},set playbackRate(a){if(a!=this._playbackRate){var b=this.currentTime;this._playbackRate=a,this._startTime=null,"paused"!=this.playState&&"idle"!=this.playState&&this.play(),null!=b&&(this.currentTime=b)}},get _isFinished(){return!this._idle&&(this._playbackRate>0&&this._currentTime>=this._totalDuration||this._playbackRate<0&&this._currentTime<=0)},get _totalDuration(){return this._effect._totalDuration},get playState(){return this._idle?"idle":null==this._startTime&&!this._paused&&0!=this.playbackRate||this._currentTimePending?"pending":this._paused?"paused":this._isFinished?"finished":"running"},play:function(){this._paused=!1,(this._isFinished||this._idle)&&(this._currentTime=this._playbackRate>0?0:this._totalDuration,this._startTime=null,b.invalidateEffects()),this._finishedFlag=!1,b.restart(),this._idle=!1,this._ensureAlive()},pause:function(){this._isFinished||this._paused||this._idle||(this._currentTimePending=!0),this._startTime=null,this._paused=!0},finish:function(){this._idle||(this.currentTime=this._playbackRate>0?this._totalDuration:0,this._startTime=this._totalDuration-this.currentTime,this._currentTimePending=!1)},cancel:function(){this._inEffect&&(this._inEffect=!1,this._idle=!0,this.currentTime=0,this._startTime=null,this._effect._update(null),b.invalidateEffects(),b.restart())},reverse:function(){this.playbackRate*=-1,this.play()},addEventListener:function(a,b){"function"==typeof b&&"finish"==a&&this._finishHandlers.push(b)},removeEventListener:function(a,b){if("finish"==a){var c=this._finishHandlers.indexOf(b);c>=0&&this._finishHandlers.splice(c,1)}},_fireEvents:function(a){var b=this._isFinished;if((b||this._idle)&&!this._finishedFlag){var d=new c(this,this._currentTime,a),e=this._finishHandlers.concat(this.onfinish?[this.onfinish]:[]);setTimeout(function(){e.forEach(function(a){a.call(d.target,d)})},0)}this._finishedFlag=b},_tick:function(a){return this._idle||this._paused||(null==this._startTime?this.startTime=a-this._currentTime/this.playbackRate:this._isFinished||this._tickCurrentTime((a-this._startTime)*this.playbackRate)),this._currentTimePending=!1,this._fireEvents(a),!this._idle&&(this._inEffect||!this._finishedFlag)}}}(c,d,f),function(a,b){function c(a){var b=i;i=[],a<s.currentTime&&(a=s.currentTime),g(a),b.forEach(function(b){b[1](a)}),o&&g(a),f(),l=void 0}function d(a,b){return a._sequenceNumber-b._sequenceNumber}function e(){this._animations=[],this.currentTime=window.performance&&performance.now?performance.now():0}function f(){p.forEach(function(a){a()}),p.length=0}function g(a){n=!1;var c=b.timeline;c.currentTime=a,c._animations.sort(d),m=!1;var e=c._animations;c._animations=[];var f=[],g=[];e=e.filter(function(b){return b._inTimeline=b._tick(a),b._inEffect?g.push(b._effect):f.push(b._effect),b._isFinished||b._paused||b._idle||(m=!0),b._inTimeline}),p.push.apply(p,f),p.push.apply(p,g),c._animations.push.apply(c._animations,e),o=!1,m&&requestAnimationFrame(function(){})}var h=window.requestAnimationFrame,i=[],j=0;window.requestAnimationFrame=function(a){var b=j++;return 0==i.length&&h(c),i.push([b,a]),b},window.cancelAnimationFrame=function(a){i.forEach(function(b){b[0]==a&&(b[1]=function(){})})},e.prototype={_play:function(c){c._timing=a.normalizeTimingInput(c.timing);var d=new b.Animation(c);return d._idle=!1,d._timeline=this,this._animations.push(d),b.restart(),b.invalidateEffects(),d}};var k,l=void 0,k=function(){return void 0==l&&(l=performance.now()),l},m=!1,n=!1;b.restart=function(){return m||(m=!0,requestAnimationFrame(function(){}),n=!0),n};var o=!1;b.invalidateEffects=function(){o=!0};var p=[],q=1e3/60,r=window.getComputedStyle;Object.defineProperty(window,"getComputedStyle",{configurable:!0,enumerable:!0,value:function(){if(o){var a=k();a-s.currentTime>0&&(s.currentTime+=q*(Math.floor((a-s.currentTime)/q)+1)),g(s.currentTime)}return f(),r.apply(this,arguments)}});var s=new e;b.timeline=s}(c,d,f),function(a){function b(a,b){var c=a.exec(b);return c?(c=a.ignoreCase?c[0].toLowerCase():c[0],[c,b.substr(c.length)]):void 0}function c(a,b){b=b.replace(/^\s*/,"");var c=a(b);return c?[c[0],c[1].replace(/^\s*/,"")]:void 0}function d(a,d,e){a=c.bind(null,a);for(var f=[];;){var g=a(e);if(!g)return[f,e];if(f.push(g[0]),e=g[1],g=b(d,e),!g||""==g[1])return[f,e];e=g[1]}}function e(a,b){for(var c=0,d=0;d<b.length&&(!/\s|,/.test(b[d])||0!=c);d++)if("("==b[d])c++;else if(")"==b[d]&&(c--,0==c&&d++,0>=c))break;var e=a(b.substr(0,d));return void 0==e?void 0:[e,b.substr(d)]}function f(a,b){for(var c=a,d=b;c&&d;)c>d?c%=d:d%=c;return c=a*b/(c+d)}function g(a){return function(b){var c=a(b);return c&&(c[0]=void 0),c}}function h(a,b){return function(c){var d=a(c);return d?d:[b,c]}}function i(b,c){for(var d=[],e=0;e<b.length;e++){var f=a.consumeTrimmed(b[e],c);if(!f||""==f[0])return;void 0!==f[0]&&d.push(f[0]),c=f[1]}return""==c?d:void 0}function j(a,b,c,d,e){for(var g=[],h=[],i=[],j=f(d.length,e.length),k=0;j>k;k++){var l=b(d[k%d.length],e[k%e.length]);if(!l)return;g.push(l[0]),h.push(l[1]),i.push(l[2])}return[g,h,function(b){var d=b.map(function(a,b){return i[b](a)}).join(c);return a?a(d):d}]}function k(a,b,c){for(var d=[],e=[],f=[],g=0,h=0;h<c.length;h++)if("function"==typeof c[h]){var i=c[h](a[g],b[g++]);d.push(i[0]),e.push(i[1]),f.push(i[2])}else!function(a){d.push(!1),e.push(!1),f.push(function(){return c[a]})}(h);return[d,e,function(a){for(var b="",c=0;c<a.length;c++)b+=f[c](a[c]);return b}]}a.consumeToken=b,a.consumeTrimmed=c,a.consumeRepeated=d,a.consumeParenthesised=e,a.ignore=g,a.optional=h,a.consumeList=i,a.mergeNestedRepeated=j.bind(null,null),a.mergeWrappedNestedRepeated=j,a.mergeList=k}(d),function(a){function b(b){function c(b){var c=a.consumeToken(/^inset/i,b);if(c)return d.inset=!0,c;var c=a.consumeLengthOrPercent(b);if(c)return d.lengths.push(c[0]),c;var c=a.consumeColor(b);return c?(d.color=c[0],c):void 0}var d={inset:!1,lengths:[],color:null},e=a.consumeRepeated(c,/^/,b);return e&&e[0].length?[d,e[1]]:void 0}function c(c){var d=a.consumeRepeated(b,/^,/,c);return d&&""==d[1]?d[0]:void 0}function d(b,c){for(;b.lengths.length<Math.max(b.lengths.length,c.lengths.length);)b.lengths.push({px:0});for(;c.lengths.length<Math.max(b.lengths.length,c.lengths.length);)c.lengths.push({px:0});if(b.inset==c.inset&&!!b.color==!!c.color){for(var d,e=[],f=[[],0],g=[[],0],h=0;h<b.lengths.length;h++){var i=a.mergeDimensions(b.lengths[h],c.lengths[h],2==h);f[0].push(i[0]),g[0].push(i[1]),e.push(i[2])}if(b.color&&c.color){var j=a.mergeColors(b.color,c.color);f[1]=j[0],g[1]=j[1],d=j[2]}return[f,g,function(a){for(var c=b.inset?"inset ":" ",f=0;f<e.length;f++)c+=e[f](a[0][f])+" ";return d&&(c+=d(a[1])),c}]}}function e(b,c,d,e){function f(a){return{inset:a,color:[0,0,0,0],lengths:[{px:0},{px:0},{px:0},{px:0}]}}for(var g=[],h=[],i=0;i<d.length||i<e.length;i++){var j=d[i]||f(e[i].inset),k=e[i]||f(d[i].inset);g.push(j),h.push(k)}return a.mergeNestedRepeated(b,c,g,h)}var f=e.bind(null,d,", ");a.addPropertiesHandler(c,f,["box-shadow","text-shadow"])}(d),function(a){function b(a){return a.toFixed(3).replace(".000","")}function c(a,b,c){return Math.min(b,Math.max(a,c))}function d(a){return/^\s*[-+]?(\d*\.)?\d+\s*$/.test(a)?Number(a):void 0}function e(a,c){return[a,c,b]}function f(a,b){return 0!=a?h(0,1/0)(a,b):void 0}function g(a,b){return[a,b,function(a){return Math.round(c(1,1/0,a))}]}function h(a,d){return function(e,f){return[e,f,function(e){return b(c(a,d,e))}]}}function i(a,b){return[a,b,Math.round]}a.clamp=c,a.addPropertiesHandler(d,h(0,1/0),["border-image-width","line-height"]),a.addPropertiesHandler(d,h(0,1),["opacity","shape-image-threshold"]),a.addPropertiesHandler(d,f,["flex-grow","flex-shrink"]),a.addPropertiesHandler(d,g,["orphans","widows"]),a.addPropertiesHandler(d,i,["z-index"]),a.parseNumber=d,a.mergeNumbers=e,a.numberToString=b}(d,f),function(a){function b(a,b){return"visible"==a||"visible"==b?[0,1,function(c){return 0>=c?a:c>=1?b:"visible"}]:void 0}a.addPropertiesHandler(String,b,["visibility"])}(d),function(a){function b(a){a=a.trim(),e.fillStyle="#000",e.fillStyle=a;var b=e.fillStyle;if(e.fillStyle="#fff",e.fillStyle=a,b==e.fillStyle){e.fillRect(0,0,1,1);var c=e.getImageData(0,0,1,1).data;e.clearRect(0,0,1,1);var d=c[3]/255;return[c[0]*d,c[1]*d,c[2]*d,d]}}function c(b,c){return[b,c,function(b){function c(a){return Math.max(0,Math.min(255,a))}if(b[3])for(var d=0;3>d;d++)b[d]=Math.round(c(b[d]/b[3]));return b[3]=a.numberToString(a.clamp(0,1,b[3])),"rgba("+b.join(",")+")"}]}var d=document.createElementNS("http://www.w3.org/1999/xhtml","canvas");d.width=d.height=1;var e=d.getContext("2d");a.addPropertiesHandler(b,c,["background-color","border-bottom-color","border-left-color","border-right-color","border-top-color","color","outline-color","text-decoration-color"]),a.consumeColor=a.consumeParenthesised.bind(null,b),a.mergeColors=c}(d,f),function(a,b){function c(a,b){if(b=b.trim().toLowerCase(),"0"==b&&"px".search(a)>=0)return{px:0};if(/^[^(]*$|^calc/.test(b)){b=b.replace(/calc\(/g,"(");var c={};b=b.replace(a,function(a){return c[a]=null,"U"+a});for(var d="U("+a.source+")",e=b.replace(/[-+]?(\d*\.)?\d+/g,"N").replace(new RegExp("N"+d,"g"),"D").replace(/\s[+-]\s/g,"O").replace(/\s/g,""),f=[/N\*(D)/g,/(N|D)[*/]N/g,/(N|D)O\1/g,/\((N|D)\)/g],g=0;g<f.length;)f[g].test(e)?(e=e.replace(f[g],"$1"),g=0):g++;if("D"==e){for(var h in c){var i=eval(b.replace(new RegExp("U"+h,"g"),"").replace(new RegExp(d,"g"),"*0"));if(!isFinite(i))return;c[h]=i}return c}}}function d(a,b){return e(a,b,!0)}function e(b,c,d){var e,f=[];for(e in b)f.push(e);for(e in c)f.indexOf(e)<0&&f.push(e);return b=f.map(function(a){return b[a]||0}),c=f.map(function(a){return c[a]||0}),[b,c,function(b){var c=b.map(function(c,e){return 1==b.length&&d&&(c=Math.max(c,0)),a.numberToString(c)+f[e]}).join(" + ");return b.length>1?"calc("+c+")":c}]}var f="px|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc",g=c.bind(null,new RegExp(f,"g")),h=c.bind(null,new RegExp(f+"|%","g")),i=c.bind(null,/deg|rad|grad|turn/g);a.parseLength=g,a.parseLengthOrPercent=h,a.consumeLengthOrPercent=a.consumeParenthesised.bind(null,h),a.parseAngle=i,a.mergeDimensions=e;var j=a.consumeParenthesised.bind(null,g),k=a.consumeRepeated.bind(void 0,j,/^/),l=a.consumeRepeated.bind(void 0,k,/^,/);a.consumeSizePairList=l;var m=function(a){var b=l(a);return b&&""==b[1]?b[0]:void 0},n=a.mergeNestedRepeated.bind(void 0,d," "),o=a.mergeNestedRepeated.bind(void 0,n,",");a.mergeNonNegativeSizePair=n,a.addPropertiesHandler(m,o,["background-size"]),a.addPropertiesHandler(h,d,["border-bottom-width","border-image-width","border-left-width","border-right-width","border-top-width","flex-basis","font-size","height","line-height","max-height","max-width","outline-width","width"]),a.addPropertiesHandler(h,e,["border-bottom-left-radius","border-bottom-right-radius","border-top-left-radius","border-top-right-radius","bottom","left","letter-spacing","margin-bottom","margin-left","margin-right","margin-top","min-height","min-width","outline-offset","padding-bottom","padding-left","padding-right","padding-top","perspective","right","shape-margin","text-indent","top","vertical-align","word-spacing"])}(d,f),function(a){function b(b){return a.consumeLengthOrPercent(b)||a.consumeToken(/^auto/,b)}function c(c){var d=a.consumeList([a.ignore(a.consumeToken.bind(null,/^rect/)),a.ignore(a.consumeToken.bind(null,/^\(/)),a.consumeRepeated.bind(null,b,/^,/),a.ignore(a.consumeToken.bind(null,/^\)/))],c);return d&&4==d[0].length?d[0]:void 0}function d(b,c){return"auto"==b||"auto"==c?[!0,!1,function(d){var e=d?b:c;if("auto"==e)return"auto";var f=a.mergeDimensions(e,e);return f[2](f[0])}]:a.mergeDimensions(b,c)}function e(a){return"rect("+a+")"}var f=a.mergeWrappedNestedRepeated.bind(null,e,d,", ");a.parseBox=c,a.mergeBoxes=f,a.addPropertiesHandler(c,f,["clip"])}(d,f),function(a){function b(a){return function(b){var c=0;return a.map(function(a){return a===j?b[c++]:a})}}function c(a){return a}function d(b){if(b=b.toLowerCase().trim(),"none"==b)return[];for(var c,d=/\s*(\w+)\(([^)]*)\)/g,e=[],f=0;c=d.exec(b);){if(c.index!=f)return;f=c.index+c[0].length;var g=c[1],h=m[g];if(!h)return;var i=c[2].split(","),j=h[0];if(j.length<i.length)return;for(var n=[],o=0;o<j.length;o++){var p,q=i[o],r=j[o];if(p=q?{A:function(b){return"0"==b.trim()?l:a.parseAngle(b)},N:a.parseNumber,T:a.parseLengthOrPercent,L:a.parseLength}[r.toUpperCase()](q):{a:l,n:n[0],t:k}[r],void 0===p)return;n.push(p)}if(e.push({t:g,d:n}),d.lastIndex==b.length)return e}}function e(a){return a.toFixed(6).replace(".000000","")}function f(b,c){if(b.decompositionPair!==c){b.decompositionPair=c;var d=a.makeMatrixDecomposition(b)}if(c.decompositionPair!==b){c.decompositionPair=b;var f=a.makeMatrixDecomposition(c)}return null==d[0]||null==f[0]?[[!1],[!0],function(a){return a?c[0].d:b[0].d}]:(d[0].push(0),f[0].push(1),[d,f,function(b){var c=a.quat(d[0][3],f[0][3],b[5]),g=a.composeMatrix(b[0],b[1],b[2],c,b[4]),h=g.map(e).join(",");return h}])}function g(a){return a.replace(/[xy]/,"")}function h(a){return a.replace(/(x|y|z|3d)?$/,"3d")}function i(b,c){var d=a.makeMatrixDecomposition&&!0,e=!1;if(!b.length||!c.length){b.length||(e=!0,b=c,c=[]);for(var i=0;i<b.length;i++){var j=b[i].t,k=b[i].d,l="scale"==j.substr(0,5)?1:0;c.push({t:j,d:k.map(function(a){if("number"==typeof a)return l;var b={};for(var c in a)b[c]=l;return b})})}}var n=function(a,b){return"perspective"==a&&"perspective"==b||("matrix"==a||"matrix3d"==a)&&("matrix"==b||"matrix3d"==b)},o=[],p=[],q=[];if(b.length!=c.length){if(!d)return;var r=f(b,c);o=[r[0]],p=[r[1]],q=[["matrix",[r[2]]]]}else for(var i=0;i<b.length;i++){var j,s=b[i].t,t=c[i].t,u=b[i].d,v=c[i].d,w=m[s],x=m[t];if(n(s,t)){if(!d)return;var r=f([b[i]],[c[i]]);o.push(r[0]),p.push(r[1]),q.push(["matrix",[r[2]]])}else{if(s==t)j=s;else if(w[2]&&x[2]&&g(s)==g(t))j=g(s),u=w[2](u),v=x[2](v);else{if(!w[1]||!x[1]||h(s)!=h(t)){if(!d)return;var r=f(b,c);o=[r[0]],p=[r[1]],q=[["matrix",[r[2]]]];break}j=h(s),u=w[1](u),v=x[1](v)}for(var y=[],z=[],A=[],B=0;B<u.length;B++){var C="number"==typeof u[B]?a.mergeNumbers:a.mergeDimensions,r=C(u[B],v[B]);y[B]=r[0],z[B]=r[1],A.push(r[2])}o.push(y),p.push(z),q.push([j,A])}}if(e){var D=o;o=p,p=D}return[o,p,function(a){return a.map(function(a,b){var c=a.map(function(a,c){return q[b][1][c](a)}).join(",");return"matrix"==q[b][0]&&16==c.split(",").length&&(q[b][0]="matrix3d"),q[b][0]+"("+c+")"}).join(" ")}]}var j=null,k={px:0},l={deg:0},m={matrix:["NNNNNN",[j,j,0,0,j,j,0,0,0,0,1,0,j,j,0,1],c],matrix3d:["NNNNNNNNNNNNNNNN",c],rotate:["A"],rotatex:["A"],rotatey:["A"],rotatez:["A"],rotate3d:["NNNA"],perspective:["L"],scale:["Nn",b([j,j,1]),c],scalex:["N",b([j,1,1]),b([j,1])],scaley:["N",b([1,j,1]),b([1,j])],scalez:["N",b([1,1,j])],scale3d:["NNN",c],skew:["Aa",null,c],skewx:["A",null,b([j,l])],skewy:["A",null,b([l,j])],translate:["Tt",b([j,j,k]),c],translatex:["T",b([j,k,k]),b([j,k])],translatey:["T",b([k,j,k]),b([k,j])],translatez:["L",b([k,k,j])],translate3d:["TTL",c]};a.addPropertiesHandler(d,i,["transform"])}(d,f),function(a){function b(a,b){b.concat([a]).forEach(function(b){b in document.documentElement.style&&(c[a]=b)})}var c={};b("transform",["webkitTransform","msTransform"]),b("transformOrigin",["webkitTransformOrigin"]),b("perspective",["webkitPerspective"]),b("perspectiveOrigin",["webkitPerspectiveOrigin"]),a.propertyName=function(a){return c[a]||a}}(d,f)}(),!function(a,b){function c(a){var b=window.document.timeline;b.currentTime=a,b._discardAnimations(),0==b._animations.length?e=!1:requestAnimationFrame(c)}var d=window.requestAnimationFrame;window.requestAnimationFrame=function(a){return d(function(b){window.document.timeline._updateAnimationsPromises(),a(b),window.document.timeline._updateAnimationsPromises()})},b.AnimationTimeline=function(){this._animations=[],this.currentTime=void 0},b.AnimationTimeline.prototype={getAnimations:function(){return this._discardAnimations(),this._animations.slice()},_updateAnimationsPromises:function(){b.animationsWithPromises=b.animationsWithPromises.filter(function(a){return a._updatePromises()})},_discardAnimations:function(){this._updateAnimationsPromises(),this._animations=this._animations.filter(function(a){return"finished"!=a.playState&&"idle"!=a.playState})},_play:function(a){var c=new b.Animation(a,this);return this._animations.push(c),b.restartWebAnimationsNextTick(),c._updatePromises(),c._animation.play(),c._updatePromises(),c},play:function(a){return a&&a.remove(),this._play(a)}};var e=!1;b.restartWebAnimationsNextTick=function(){e||(e=!0,requestAnimationFrame(c))};var f=new b.AnimationTimeline;b.timeline=f;try{Object.defineProperty(window.document,"timeline",{configurable:!0,get:function(){return f}})}catch(g){}try{window.document.timeline=f}catch(g){}}(c,e,f),function(a,b){b.animationsWithPromises=[],b.Animation=function(b,c){if(this.effect=b,b&&(b._animation=this),!c)throw new Error("Animation with null timeline is not supported");this._timeline=c,this._sequenceNumber=a.sequenceNumber++,this._holdTime=0,this._paused=!1,this._isGroup=!1,this._animation=null,this._childAnimations=[],this._callback=null,this._oldPlayState="idle",this._rebuildUnderlyingAnimation(),this._animation.cancel(),this._updatePromises()},b.Animation.prototype={_updatePromises:function(){var a=this._oldPlayState,b=this.playState;return this._readyPromise&&b!==a&&("idle"==b?(this._rejectReadyPromise(),this._readyPromise=void 0):"pending"==a?this._resolveReadyPromise():"pending"==b&&(this._readyPromise=void 0)),this._finishedPromise&&b!==a&&("idle"==b?(this._rejectFinishedPromise(),this._finishedPromise=void 0):"finished"==b?this._resolveFinishedPromise():"finished"==a&&(this._finishedPromise=void 0)),this._oldPlayState=this.playState,this._readyPromise||this._finishedPromise},_rebuildUnderlyingAnimation:function(){this._updatePromises();var a,c,d,e,f=this._animation?!0:!1;f&&(a=this.playbackRate,c=this._paused,d=this.startTime,e=this.currentTime,this._animation.cancel(),this._animation._wrapper=null,this._animation=null),(!this.effect||this.effect instanceof window.KeyframeEffect)&&(this._animation=b.newUnderlyingAnimationForKeyframeEffect(this.effect),b.bindAnimationForKeyframeEffect(this)),(this.effect instanceof window.SequenceEffect||this.effect instanceof window.GroupEffect)&&(this._animation=b.newUnderlyingAnimationForGroup(this.effect),b.bindAnimationForGroup(this)),this.effect&&this.effect._onsample&&b.bindAnimationForCustomEffect(this),f&&(1!=a&&(this.playbackRate=a),null!==d?this.startTime=d:null!==e?this.currentTime=e:null!==this._holdTime&&(this.currentTime=this._holdTime),c&&this.pause()),this._updatePromises()
 },_updateChildren:function(){if(this.effect&&"idle"!=this.playState){var a=this.effect._timing.delay;this._childAnimations.forEach(function(c){this._arrangeChildren(c,a),this.effect instanceof window.SequenceEffect&&(a+=b.groupChildDuration(c.effect))}.bind(this))}},_setExternalAnimation:function(a){if(this.effect&&this._isGroup)for(var b=0;b<this.effect.children.length;b++)this.effect.children[b]._animation=a,this._childAnimations[b]._setExternalAnimation(a)},_constructChildAnimations:function(){if(this.effect&&this._isGroup){var a=this.effect._timing.delay;this._removeChildAnimations(),this.effect.children.forEach(function(c){var d=window.document.timeline._play(c);this._childAnimations.push(d),d.playbackRate=this.playbackRate,this._paused&&d.pause(),c._animation=this.effect._animation,this._arrangeChildren(d,a),this.effect instanceof window.SequenceEffect&&(a+=b.groupChildDuration(c))}.bind(this))}},_arrangeChildren:function(a,b){null===this.startTime?a.currentTime=this.currentTime-b/this.playbackRate:a.startTime!==this.startTime+b/this.playbackRate&&(a.startTime=this.startTime+b/this.playbackRate)},get timeline(){return this._timeline},get playState(){return this._animation?this._animation.playState:"idle"},get finished(){return window.Promise?(this._finishedPromise||(-1==b.animationsWithPromises.indexOf(this)&&b.animationsWithPromises.push(this),this._finishedPromise=new Promise(function(a,b){this._resolveFinishedPromise=function(){a(this)},this._rejectFinishedPromise=function(){b({type:DOMException.ABORT_ERR,name:"AbortError"})}}.bind(this)),"finished"==this.playState&&this._resolveFinishedPromise()),this._finishedPromise):(console.warn("Animation Promises require JavaScript Promise constructor"),null)},get ready(){return window.Promise?(this._readyPromise||(-1==b.animationsWithPromises.indexOf(this)&&b.animationsWithPromises.push(this),this._readyPromise=new Promise(function(a,b){this._resolveReadyPromise=function(){a(this)},this._rejectReadyPromise=function(){b({type:DOMException.ABORT_ERR,name:"AbortError"})}}.bind(this)),"pending"!==this.playState&&this._resolveReadyPromise()),this._readyPromise):(console.warn("Animation Promises require JavaScript Promise constructor"),null)},get onfinish(){return this._onfinish},set onfinish(a){"function"==typeof a?(this._onfinish=a,this._animation.onfinish=function(b){b.target=this,a.call(this,b)}.bind(this)):(this._animation.onfinish=a,this.onfinish=this._animation.onfinish)},get currentTime(){this._updatePromises();var a=this._animation.currentTime;return this._updatePromises(),a},set currentTime(a){this._updatePromises(),this._animation.currentTime=isFinite(a)?a:Math.sign(a)*Number.MAX_VALUE,this._register(),this._forEachChild(function(b,c){b.currentTime=a-c}),this._updatePromises()},get startTime(){return this._animation.startTime},set startTime(a){this._updatePromises(),this._animation.startTime=isFinite(a)?a:Math.sign(a)*Number.MAX_VALUE,this._register(),this._forEachChild(function(b,c){b.startTime=a+c}),this._updatePromises()},get playbackRate(){return this._animation.playbackRate},set playbackRate(a){this._updatePromises();var b=this.currentTime;this._animation.playbackRate=a,this._forEachChild(function(b){b.playbackRate=a}),"paused"!=this.playState&&"idle"!=this.playState&&this.play(),null!==b&&(this.currentTime=b),this._updatePromises()},play:function(){this._updatePromises(),this._paused=!1,this._animation.play(),-1==this._timeline._animations.indexOf(this)&&this._timeline._animations.push(this),this._register(),b.awaitStartTime(this),this._forEachChild(function(a){var b=a.currentTime;a.play(),a.currentTime=b}),this._updatePromises()},pause:function(){this._updatePromises(),this.currentTime&&(this._holdTime=this.currentTime),this._animation.pause(),this._register(),this._forEachChild(function(a){a.pause()}),this._paused=!0,this._updatePromises()},finish:function(){this._updatePromises(),this._animation.finish(),this._register(),this._updatePromises()},cancel:function(){this._updatePromises(),this._animation.cancel(),this._register(),this._removeChildAnimations(),this._updatePromises()},reverse:function(){this._updatePromises();var a=this.currentTime;this._animation.reverse(),this._forEachChild(function(a){a.reverse()}),null!==a&&(this.currentTime=a),this._updatePromises()},addEventListener:function(a,b){var c=b;"function"==typeof b&&(c=function(a){a.target=this,b.call(this,a)}.bind(this),b._wrapper=c),this._animation.addEventListener(a,c)},removeEventListener:function(a,b){this._animation.removeEventListener(a,b&&b._wrapper||b)},_removeChildAnimations:function(){for(;this._childAnimations.length;)this._childAnimations.pop().cancel()},_forEachChild:function(b){var c=0;if(this.effect.children&&this._childAnimations.length<this.effect.children.length&&this._constructChildAnimations(),this._childAnimations.forEach(function(a){b.call(this,a,c),this.effect instanceof window.SequenceEffect&&(c+=a.effect.activeDuration)}.bind(this)),"pending"!=this.playState){var d=this.effect._timing,e=this.currentTime;null!==e&&(e=a.calculateTimeFraction(a.calculateActiveDuration(d),e,d)),(null==e||isNaN(e))&&this._removeChildAnimations()}}},window.Animation=b.Animation}(c,e,f),function(a,b){function c(b){this._frames=a.normalizeKeyframes(b)}function d(){for(var a=!1;h.length;){var b=h.shift();b._updateChildren(),a=!0}return a}var e=function(a){if(a._animation=void 0,a instanceof window.SequenceEffect||a instanceof window.GroupEffect)for(var b=0;b<a.children.length;b++)e(a.children[b])};b.removeMulti=function(a){for(var b=[],c=0;c<a.length;c++){var d=a[c];d._parent?(-1==b.indexOf(d._parent)&&b.push(d._parent),d._parent.children.splice(d._parent.children.indexOf(d),1),d._parent=null,e(d)):d._animation&&d._animation.effect==d&&(d._animation.cancel(),d._animation.effect=new KeyframeEffect(null,[]),d._animation._callback&&(d._animation._callback._animation=null),d._animation._rebuildUnderlyingAnimation(),e(d))}for(c=0;c<b.length;c++)b[c]._rebuild()},b.KeyframeEffect=function(b,d,e){return this.target=b,this._parent=null,e=a.numericTimingToObject(e),this._timingInput=a.cloneTimingInput(e),this._timing=a.normalizeTimingInput(e),this.timing=a.makeTiming(e,!1,this),this.timing._effect=this,"function"==typeof d?(a.deprecated("Custom KeyframeEffect","2015-06-22","Use KeyframeEffect.onsample instead."),this._normalizedKeyframes=d):this._normalizedKeyframes=new c(d),this._keyframes=d,this.activeDuration=a.calculateActiveDuration(this._timing),this},b.KeyframeEffect.prototype={getFrames:function(){return"function"==typeof this._normalizedKeyframes?this._normalizedKeyframes:this._normalizedKeyframes._frames},set onsample(a){if("function"==typeof this.getFrames())throw new Error("Setting onsample on custom effect KeyframeEffect is not supported.");this._onsample=a,this._animation&&this._animation._rebuildUnderlyingAnimation()},get parent(){return this._parent},clone:function(){if("function"==typeof this.getFrames())throw new Error("Cloning custom effects is not supported.");var b=new KeyframeEffect(this.target,[],a.cloneTimingInput(this._timingInput));return b._normalizedKeyframes=this._normalizedKeyframes,b._keyframes=this._keyframes,b},remove:function(){b.removeMulti([this])}};var f=Element.prototype.animate;Element.prototype.animate=function(a,c){return b.timeline._play(new b.KeyframeEffect(this,a,c))};var g=document.createElementNS("http://www.w3.org/1999/xhtml","div");b.newUnderlyingAnimationForKeyframeEffect=function(a){if(a){var b=a.target||g,c=a._keyframes;"function"==typeof c&&(c=[]);var d=a._timingInput}else var b=g,c=[],d=0;return f.apply(b,[c,d])},b.bindAnimationForKeyframeEffect=function(a){a.effect&&"function"==typeof a.effect._normalizedKeyframes&&b.bindAnimationForCustomEffect(a)};var h=[];b.awaitStartTime=function(a){null===a.startTime&&a._isGroup&&(0==h.length&&requestAnimationFrame(d),h.push(a))};var i=window.getComputedStyle;Object.defineProperty(window,"getComputedStyle",{configurable:!0,enumerable:!0,value:function(){window.document.timeline._updateAnimationsPromises();var a=i.apply(this,arguments);return d()&&(a=i.apply(this,arguments)),window.document.timeline._updateAnimationsPromises(),a}}),window.KeyframeEffect=b.KeyframeEffect,window.Element.prototype.getAnimations=function(){return document.timeline.getAnimations().filter(function(a){return null!==a.effect&&a.effect.target==this}.bind(this))}}(c,e,f),function(a,b){function c(a){a._registered||(a._registered=!0,f.push(a),g||(g=!0,requestAnimationFrame(d)))}function d(){var a=f;f=[],a.sort(function(a,b){return a._sequenceNumber-b._sequenceNumber}),a=a.filter(function(a){a();var b=a._animation?a._animation.playState:"idle";return"running"!=b&&"pending"!=b&&(a._registered=!1),a._registered}),f.push.apply(f,a),f.length?(g=!0,requestAnimationFrame(d)):g=!1}var e=(document.createElementNS("http://www.w3.org/1999/xhtml","div"),0);b.bindAnimationForCustomEffect=function(b){var d,f=b.effect.target,g="function"==typeof b.effect.getFrames();d=g?b.effect.getFrames():b.effect._onsample;var h=b.effect.timing,i=null;h=a.normalizeTimingInput(h);var j=function(){var c=j._animation?j._animation.currentTime:null;null!==c&&(c=a.calculateTimeFraction(a.calculateActiveDuration(h),c,h),isNaN(c)&&(c=null)),c!==i&&(g?d(c,f,b.effect):d(c,b.effect,b.effect._animation)),i=c};j._animation=b,j._registered=!1,j._sequenceNumber=e++,b._callback=j,c(j)};var f=[],g=!1;b.Animation.prototype._register=function(){this._callback&&c(this._callback)}}(c,e,f),function(a,b){function c(a){return a._timing.delay+a.activeDuration+a._timing.endDelay}function d(b,c){this._parent=null,this.children=b||[],this._reparent(this.children),c=a.numericTimingToObject(c),this._timingInput=a.cloneTimingInput(c),this._timing=a.normalizeTimingInput(c,!0),this.timing=a.makeTiming(c,!0,this),this.timing._effect=this,"auto"===this._timing.duration&&(this._timing.duration=this.activeDuration)}window.SequenceEffect=function(){d.apply(this,arguments)},window.GroupEffect=function(){d.apply(this,arguments)},d.prototype={_isAncestor:function(a){for(var b=this;null!==b;){if(b==a)return!0;b=b._parent}return!1},_rebuild:function(){for(var a=this;a;)"auto"===a.timing.duration&&(a._timing.duration=a.activeDuration),a=a._parent;this._animation&&this._animation._rebuildUnderlyingAnimation()},_reparent:function(a){b.removeMulti(a);for(var c=0;c<a.length;c++)a[c]._parent=this},_putChild:function(a,b){for(var c=b?"Cannot append an ancestor or self":"Cannot prepend an ancestor or self",d=0;d<a.length;d++)if(this._isAncestor(a[d]))throw{type:DOMException.HIERARCHY_REQUEST_ERR,name:"HierarchyRequestError",message:c};for(var d=0;d<a.length;d++)b?this.children.push(a[d]):this.children.unshift(a[d]);this._reparent(a),this._rebuild()},append:function(){this._putChild(arguments,!0)},prepend:function(){this._putChild(arguments,!1)},get parent(){return this._parent},get firstChild(){return this.children.length?this.children[0]:null},get lastChild(){return this.children.length?this.children[this.children.length-1]:null},clone:function(){for(var b=a.cloneTimingInput(this._timingInput),c=[],d=0;d<this.children.length;d++)c.push(this.children[d].clone());return this instanceof GroupEffect?new GroupEffect(c,b):new SequenceEffect(c,b)},remove:function(){b.removeMulti([this])}},window.SequenceEffect.prototype=Object.create(d.prototype),Object.defineProperty(window.SequenceEffect.prototype,"activeDuration",{get:function(){var a=0;return this.children.forEach(function(b){a+=c(b)}),Math.max(a,0)}}),window.GroupEffect.prototype=Object.create(d.prototype),Object.defineProperty(window.GroupEffect.prototype,"activeDuration",{get:function(){var a=0;return this.children.forEach(function(b){a=Math.max(a,c(b))}),a}}),b.newUnderlyingAnimationForGroup=function(c){var d,e=null,f=function(b){var c=d._wrapper;return c&&"pending"!=c.playState&&c.effect?null==b?void c._removeChildAnimations():0==b&&c.playbackRate<0&&(e||(e=a.normalizeTimingInput(c.effect.timing)),b=a.calculateTimeFraction(a.calculateActiveDuration(e),-1,e),isNaN(b)||null==b)?(c._forEachChild(function(a){a.currentTime=-1}),void c._removeChildAnimations()):void 0:void 0},g=new KeyframeEffect(null,[],c._timing);return g.onsample=f,d=b.timeline._play(g)},b.bindAnimationForGroup=function(a){a._animation._wrapper=a,a._isGroup=!0,b.awaitStartTime(a),a._constructChildAnimations(),a._setExternalAnimation(a)},b.groupChildDuration=c}(c,e,f)}({},function(){return this}());
+// 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 src="../../../../ui/webui/resources/js/i18n_template_no_process.js">
+
+i18nTemplate.process(document, loadTimeData);
 (function () {
 function resolve() {
 document.body.removeAttribute('unresolved');
diff --git a/chrome/browser/resources/md_downloads/downloads.html b/chrome/browser/resources/md_downloads/downloads.html
index 36d6480..59ebdc0 100644
--- a/chrome/browser/resources/md_downloads/downloads.html
+++ b/chrome/browser/resources/md_downloads/downloads.html
@@ -33,8 +33,12 @@
   <command id="undo-command" shortcut="Ctrl-U+005A"><!-- Ctrl+Z -->
 </if>
   <link rel="import" href="chrome://resources/html/polymer_config.html">
-  <link rel="import" href="chrome://downloads/i18n.html">
+  <link rel="import" href="chrome://downloads/i18n_setup.html">
   <link rel="import" href="chrome://downloads/manager.html">
+  <!-- i18n_template.html actually does i18n-* attribute substitutions.
+       It should be imported last and only once. TODO(dbeam): figure out a good
+       solution for each individual element to do this as well. -->
+  <link rel="import" href="chrome://resources/html/i18n_template.html">
   <script src="chrome://downloads/downloads.js"></script>
 </body>
 </html>
diff --git a/chrome/browser/resources/md_downloads/i18n.html b/chrome/browser/resources/md_downloads/i18n_setup.html
similarity index 65%
rename from chrome/browser/resources/md_downloads/i18n.html
rename to chrome/browser/resources/md_downloads/i18n_setup.html
index 9d4bf792..1db516c 100644
--- a/chrome/browser/resources/md_downloads/i18n.html
+++ b/chrome/browser/resources/md_downloads/i18n_setup.html
@@ -1,3 +1,2 @@
 <script src="chrome://resources/js/load_time_data.js"></script>
 <script src="chrome://downloads/strings.js"></script>
-<script src="chrome://resources/js/i18n_template.js"></script>
diff --git a/chrome/browser/resources/md_downloads/item.html b/chrome/browser/resources/md_downloads/item.html
index 84b2b2c..0d7576c 100644
--- a/chrome/browser/resources/md_downloads/item.html
+++ b/chrome/browser/resources/md_downloads/item.html
@@ -8,7 +8,7 @@
 <link rel="import" href="chrome://resources/polymer/v1_0/paper-progress/paper-progress.html">
 <link rel="import" href="chrome://downloads/action_service.html">
 <link rel="import" href="chrome://downloads/constants.html">
-<link rel="import" href="chrome://downloads/i18n.html">
+<link rel="import" href="chrome://downloads/i18n_setup.html">
 
 <dom-module id="inky-text-button">
   <template><content></content></template>
diff --git a/chrome/browser/resources/md_downloads/manager.html b/chrome/browser/resources/md_downloads/manager.html
index 3f1e233..3f2c7e82 100644
--- a/chrome/browser/resources/md_downloads/manager.html
+++ b/chrome/browser/resources/md_downloads/manager.html
@@ -7,7 +7,7 @@
 <link rel="import" href="chrome://resources/polymer/v1_0/paper-header-panel/paper-header-panel.html">
 <link rel="import" href="chrome://downloads/action_service.html">
 <link rel="import" href="chrome://downloads/constants.html">
-<link rel="import" href="chrome://downloads/i18n.html">
+<link rel="import" href="chrome://downloads/i18n_setup.html">
 <link rel="import" href="chrome://downloads/item.html">
 <link rel="import" href="chrome://downloads/toolbar.html">
 
diff --git a/chrome/browser/resources/md_downloads/toolbar.html b/chrome/browser/resources/md_downloads/toolbar.html
index abfd12e..72fe2935 100644
--- a/chrome/browser/resources/md_downloads/toolbar.html
+++ b/chrome/browser/resources/md_downloads/toolbar.html
@@ -9,7 +9,7 @@
 <link rel="import" href="chrome://resources/html/assert.html">
 <link rel="import" href="chrome://resources/html/cr.html">
 <link rel="import" href="chrome://resources/html/util.html">
-<link rel="import" href="chrome://downloads/i18n.html">
+<link rel="import" href="chrome://downloads/i18n_setup.html">
 
 <dom-module id="downloads-toolbar">
   <template>
diff --git a/chrome/browser/resources/md_downloads/vulcanized.html b/chrome/browser/resources/md_downloads/vulcanized.html
index 7ca8903..637dc280a 100644
--- a/chrome/browser/resources/md_downloads/vulcanized.html
+++ b/chrome/browser/resources/md_downloads/vulcanized.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html i18n-values="dir:textdirection;lang:language"><head><!--
+<!DOCTYPE html><html i18n-values="dir:textdirection;lang:language"><head><script src="crisper.js" defer=""></script><!--
 @license
 Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
 This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
@@ -3567,4 +3567,5 @@
 <if expr="not is_macosx">
   <command id="undo-command" shortcut="Ctrl-U+005A"></command>
 </if>
-  <script src="crisper.js"></script></body></html>
\ No newline at end of file
+  
+  </body></html>
\ No newline at end of file
diff --git a/chrome/browser/resources/md_extensions/item.css b/chrome/browser/resources/md_extensions/item.css
index 2159e2d..21a9f8c5 100644
--- a/chrome/browser/resources/md_extensions/item.css
+++ b/chrome/browser/resources/md_extensions/item.css
@@ -76,3 +76,8 @@
 #inspect-views paper-button {
   color: rgb(51, 103, 214);
 }
+
+paper-button {
+  /* TODO(devlin): Decide whether all webui should do this. */
+  cursor: pointer;
+}
diff --git a/chrome/browser/resources/md_extensions/item.html b/chrome/browser/resources/md_extensions/item.html
index 4f3ca502..7d52194 100644
--- a/chrome/browser/resources/md_extensions/item.html
+++ b/chrome/browser/resources/md_extensions/item.html
@@ -39,7 +39,7 @@
               <div id="inspect-views">
                 <span>[[i18n('itemInspectViews')]]</span>
                 <template is="dom-repeat" items="[[data.views]]">
-                  <paper-button>[[item.url]]</paper-button>
+                  <paper-button on-tap="onInspectTap_">[[computeInspectLabel_(item)]]</paper-button>
                 </template>
               </div>
             </template>
diff --git a/chrome/browser/resources/md_extensions/item.js b/chrome/browser/resources/md_extensions/item.js
index df6e718..547b074 100644
--- a/chrome/browser/resources/md_extensions/item.js
+++ b/chrome/browser/resources/md_extensions/item.js
@@ -27,6 +27,12 @@
 
     /** @return {boolean} */
     isInDevMode: assertNotReached,
+
+    /**
+     * @param {string} id,
+     * @param {chrome.developerPrivate.ExtensionView} view
+     */
+    inspectItemView: assertNotReached,
   };
 
   var Item = Polymer({
@@ -114,6 +120,14 @@
     },
 
     /**
+     * @param {!{model: !{item: !chrome.developerPrivate.ExtensionView}}} e
+     * @private
+     */
+    onInspectTap_: function(e) {
+      this.delegate_.inspectItemView(this.data.id, e.model.item);
+    },
+
+    /**
      * Returns true if the extension is enabled, including terminated
      * extensions.
      * @return {boolean}
@@ -144,6 +158,27 @@
     computeEnableCheckboxLabel_: function() {
       return this.i18n(this.isEnabled_() ? 'itemEnabled' : 'itemDisabled');
     },
+
+    /**
+     * @param {chrome.developerPrivate.ExtensionView} view
+     * @suppress {checkTypes} Needed for URL externs. :(
+     * @private
+     */
+    computeInspectLabel_: function(view) {
+      // Trim the "chrome-extension://<id>/".
+      var url = new URL(view.url);
+      var label = view.url;
+      if (url.protocol == 'chrome-extension:')
+        label = url.pathname.substring(1);
+      if (label == '_generated_background_page.html')
+        label = this.i18n('viewBackgroundPage');
+      // Add any qualifiers.
+      label += (view.incognito ? ' ' + this.i18n('viewIncognito') : '') +
+               (view.renderProcessId == -1 ?
+                    ' ' + this.i18n('viewInactive') : '') +
+               (view.isIframe ? ' ' + this.i18n('viewIframe') : '');
+      return label;
+    }
   });
 
   return {
diff --git a/chrome/browser/resources/md_extensions/service.js b/chrome/browser/resources/md_extensions/service.js
index c3a61ae..5f58f31 100644
--- a/chrome/browser/resources/md_extensions/service.js
+++ b/chrome/browser/resources/md_extensions/service.js
@@ -163,6 +163,16 @@
     },
 
     /** @override */
+    inspectItemView: function(id, view) {
+      chrome.developerPrivate.openDevTools({
+        extensionId: id,
+        renderProcessId: view.renderProcessId,
+        renderViewId: view.renderViewId,
+        incognito: view.incognito,
+      });
+    },
+
+    /** @override */
     setProfileInDevMode: function(inDevMode) {
       chrome.developerPrivate.updateProfileConfiguration(
           {inDeveloperMode: inDevMode});
diff --git a/chrome/browser/resources/media_router/elements/issue_banner/issue_banner.js b/chrome/browser/resources/media_router/elements/issue_banner/issue_banner.js
index a9cbff4..7d5c710 100644
--- a/chrome/browser/resources/media_router/elements/issue_banner/issue_banner.js
+++ b/chrome/browser/resources/media_router/elements/issue_banner/issue_banner.js
@@ -9,6 +9,21 @@
 
   properties: {
     /**
+     * Maps an issue action type to the resource identifier of the text shown
+     * in the action button.
+     * This is a property of issue-banner because it is used in tests. This
+     * property should always be set before |issue| is set or updated.
+     * @private {!Array<string>}
+     */
+    actionTypeToButtonTextResource_: {
+      type: Array,
+      readOnly: true,
+      value: function() {
+        return ['dismissButton', 'learnMoreButton'];
+      },
+    },
+
+    /**
      * The text shown in the default action button.
      * @private {string}
      */
@@ -28,20 +43,6 @@
     },
 
     /**
-     * Maps an issue action type to the resource identifier of the text shown
-     * in the action button.
-     * This is a property of issue-banner because it is used in tests.
-     * @private {!Array<string>}
-     */
-    issueActionTypeToButtonTextResource_: {
-      type: Array,
-      readOnly: true,
-      value: function() {
-        return ['dismissButton', 'learnMoreButton'];
-      },
-    },
-
-    /**
      * The text shown in the secondary action button.
      * @private {string}
      */
@@ -122,19 +123,16 @@
    * @private
    */
   updateActionButtonText_: function() {
-    if (!this.issueActionTypeToButtonTextResource_)
-      return;
-
     var defaultText = '';
     var secondaryText = '';
     if (this.issue) {
       defaultText = loadTimeData.getString(
-          this.issueActionTypeToButtonTextResource_[
+          this.actionTypeToButtonTextResource_[
           this.issue.defaultActionType]);
 
       if (this.issue.secondaryActionType) {
         secondaryText = loadTimeData.getString(
-            this.issueActionTypeToButtonTextResource_[
+            this.actionTypeToButtonTextResource_[
             this.issue.secondaryActionType]);
       }
     }
diff --git a/chrome/browser/resources/settings/advanced_page/advanced_page.html b/chrome/browser/resources/settings/advanced_page/advanced_page.html
index dffffdb..138fdda 100644
--- a/chrome/browser/resources/settings/advanced_page/advanced_page.html
+++ b/chrome/browser/resources/settings/advanced_page/advanced_page.html
@@ -1,6 +1,7 @@
 <link rel="import" href="chrome://resources/polymer/v1_0/polymer/polymer.html">
 <link rel="import" href="chrome://md-settings/downloads_page/downloads_page.html">
 <link rel="import" href="chrome://md-settings/languages_page/languages_page.html">
+<link rel="import" href="chrome://md-settings/passwords_and_forms_page/passwords_and_forms_page.html">
 <link rel="import" href="chrome://md-settings/privacy_page/privacy_page.html">
 <link rel="import" href="chrome://md-settings/reset_page/reset_page.html">
 <link rel="import" href="chrome://md-settings/settings_page/settings_section.html">
@@ -36,6 +37,14 @@
       </settings-privacy-page>
     </settings-section>
 
+    <settings-section
+        i18n-values="page-title:passwordsAndAutofillPageTitle"
+        current-route="[[currentRoute]]" section="passwordsAndForms">
+      <settings-passwords-and-forms-page prefs="{{prefs}}"
+          current-route="{{currentRoute}}">
+      </settings-passwords-and-forms-page>
+    </settings-section>
+
     <settings-section i18n-values="page-title:languagesPageTitle"
         current-route="[[currentRoute]]" section="languages">
       <settings-languages-page prefs="{{prefs}}"
diff --git a/chrome/browser/resources/settings/passwords_and_forms_page/passwords_and_forms_page.css b/chrome/browser/resources/settings/passwords_and_forms_page/passwords_and_forms_page.css
new file mode 100644
index 0000000..8fcdf8f
--- /dev/null
+++ b/chrome/browser/resources/settings/passwords_and_forms_page/passwords_and_forms_page.css
@@ -0,0 +1,8 @@
+/* Copyright 2015 The Chromium Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file. */
+
+.option-value {
+  color: gray;
+  font-size: 80%;
+}
diff --git a/chrome/browser/resources/settings/passwords_and_forms_page/passwords_and_forms_page.html b/chrome/browser/resources/settings/passwords_and_forms_page/passwords_and_forms_page.html
new file mode 100644
index 0000000..47c54a4
--- /dev/null
+++ b/chrome/browser/resources/settings/passwords_and_forms_page/passwords_and_forms_page.html
@@ -0,0 +1,20 @@
+<link rel="import" href="chrome://resources/polymer/v1_0/polymer/polymer.html">
+<link rel="import" href="chrome://resources/polymer/v1_0/paper-item/paper-item.html">
+
+<dom-module id="settings-passwords-and-forms-page">
+  <link rel="import" type="css"
+      href="chrome://md-settings/settings_page/settings_page.css">
+  <link rel="import" type="css"
+      href="chrome://md-settings/passwords_and_forms_page/passwords_and_forms_page.css">
+  <template>
+    <paper-item-body two-line class="flex">
+      <div i18n-content="autofill"></div>
+      <div class="option-value" i18n-content="autofillDetail"></div>
+    </paper-item>
+    <paper-item-body two-line class="flex">
+      <div i18n-content="passwords"></div>
+      <div class="option-value" i18n-content="passwordsDetail"></div>
+    </paper-item>
+  </template>
+  <script src="passwords_and_forms_page.js"></script>
+</dom-module>
diff --git a/chrome/browser/resources/settings/passwords_and_forms_page/passwords_and_forms_page.js b/chrome/browser/resources/settings/passwords_and_forms_page/passwords_and_forms_page.js
new file mode 100644
index 0000000..7dcb050
--- /dev/null
+++ b/chrome/browser/resources/settings/passwords_and_forms_page/passwords_and_forms_page.js
@@ -0,0 +1,18 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/**
+ * @fileoverview 'settings-passwords-and-forms-page' is the settings page
+ * for passwords and auto fill.
+ *
+ * @group Chrome Settings Elements
+ * @element settings-passwords-and-forms-page
+ */
+(function() {
+'use strict';
+
+Polymer({
+  is: 'settings-passwords-and-forms-page',
+});
+})();
diff --git a/chrome/browser/resources/settings/reset_page/reset_page.html b/chrome/browser/resources/settings/reset_page/reset_page.html
index 211a0b8..ac983c1 100644
--- a/chrome/browser/resources/settings/reset_page/reset_page.html
+++ b/chrome/browser/resources/settings/reset_page/reset_page.html
@@ -1,38 +1,14 @@
 <link rel="import" href="chrome://resources/polymer/v1_0/polymer/polymer.html">
-<link rel="import" href="chrome://resources/polymer/v1_0/iron-flex-layout/classes/iron-flex-layout.html">
-<link rel="import" href="chrome://resources/polymer/v1_0/paper-button/paper-button.html">
-<link rel="import" href="chrome://resources/polymer/v1_0/paper-checkbox/paper-checkbox.html">
-<link rel="import" href="chrome://resources/polymer/v1_0/paper-dialog/paper-dialog.html">
+<link rel="import" href="chrome://md-settings/reset_page/reset_profile_dialog.html">
 
 <dom-module id="settings-reset-page">
   <link rel="import" type="css"
       href="chrome://md-settings/settings_page/settings_page.css">
-  <link rel="import" type="css" href="reset_page.css">
   <template>
     <div on-tap="onShowDialog_">
       <div i18n-content="resetPageTitle"></div>
       <div i18n-content="resetPageDescription"></div>
     </div>
-
-    <paper-dialog modal id="resetDialog" class="layout vertical">
-      <div id="top" class="layout vertical">
-        <h2 i18n-content="resetPageTitle"></h2>
-        <div i18n-content="resetPageExplanation" id="explanation"></div>
-        <div class="layout center horizontal" id="buttonContainer">
-          <paper-button on-tap="onLearnMoreTap_" id="learnMore"
-              i18n-content="learnMore"></paper-button>
-          <div class="buttons flex-1">
-            <paper-button on-tap="onCancelTap_" id="cancel"
-                i18n-content="cancel"></paper-button>
-            <paper-button i18n-content="resetPageCommit" on-tap="onResetTap_"
-                id="reset"></paper-button>
-          </div>
-        </div>
-      </div>
-      <paper-checkbox id="sendSettings" i18n-content="resetPageFeedback"
-          checked></paper-checkbox>
-    </paper-dialog>
-
   </template>
   <script src="reset_page.js"></script>
 </dom-module>
diff --git a/chrome/browser/resources/settings/reset_page/reset_page.js b/chrome/browser/resources/settings/reset_page/reset_page.js
index f27b892..c0a5777 100644
--- a/chrome/browser/resources/settings/reset_page/reset_page.js
+++ b/chrome/browser/resources/settings/reset_page/reset_page.js
@@ -21,25 +21,15 @@
 Polymer({
   is: 'settings-reset-page',
 
+
   /** @private */
   onShowDialog_: function() {
-    this.$.resetDialog.open();
-  },
+     var dialog = document.createElement('settings-reset-profile-dialog');
+     this.shadowRoot.appendChild(dialog);
+     dialog.open();
 
-  /** @private */
-  onCancelTap_: function() {
-    this.$.resetDialog.close();
+     dialog.addEventListener('iron-overlay-closed', function(event) {
+       dialog.remove();
+     });
   },
-
-  /** @private */
-  onResetTap_: function() {
-    // TODO(dpapad): Set up C++ handlers and figure out when it is OK to close
-    // the dialog.
-    this.$.resetDialog.close();
-  },
-
-  /** @private */
-  onLearnMoreTap_: function() {
-    window.open(loadTimeData.getString('resetPageLearnMoreUrl'));
-  }
 });
diff --git a/chrome/browser/resources/settings/reset_page/reset_page.css b/chrome/browser/resources/settings/reset_page/reset_profile_dialog.css
similarity index 87%
rename from chrome/browser/resources/settings/reset_page/reset_page.css
rename to chrome/browser/resources/settings/reset_page/reset_profile_dialog.css
index 4db82b8..665657934 100644
--- a/chrome/browser/resources/settings/reset_page/reset_page.css
+++ b/chrome/browser/resources/settings/reset_page/reset_profile_dialog.css
@@ -2,9 +2,9 @@
  * Use of this source code is governed by a BSD-style license that can be
  * found in the LICENSE file. */
 
-#resetDialog {
-  max-width: 500px;
-  min-width: 300px;
+#dialog {
+  min-width; 300px;
+  width: 500px;
 }
 
 #reset {
@@ -28,7 +28,7 @@
   margin: 15px 0;
 }
 
-#sendSettings {
+#feedbackBar {
   background-color: rgb(236, 236, 236);
   margin: 0;
   padding: 20px;
diff --git a/chrome/browser/resources/settings/reset_page/reset_profile_dialog.html b/chrome/browser/resources/settings/reset_page/reset_profile_dialog.html
new file mode 100644
index 0000000..2a1a57a
--- /dev/null
+++ b/chrome/browser/resources/settings/reset_page/reset_profile_dialog.html
@@ -0,0 +1,39 @@
+<link rel="import" href="chrome://resources/polymer/v1_0/polymer/polymer.html">
+<link rel="import" href="chrome://resources/polymer/v1_0/iron-flex-layout/classes/iron-flex-layout.html">
+<link rel="import" href="chrome://resources/polymer/v1_0/paper-button/paper-button.html">
+<link rel="import" href="chrome://resources/polymer/v1_0/paper-checkbox/paper-checkbox.html">
+<link rel="import" href="chrome://resources/polymer/v1_0/paper-dialog/paper-dialog.html">
+<link rel="import" href="chrome://resources/polymer/v1_0/paper-spinner/paper-spinner.html">
+
+<dom-module id="settings-reset-profile-dialog">
+  <link rel="import" type="css" href="reset_profile_dialog.css">
+  <template>
+    <paper-dialog modal id="dialog">
+      <div>
+        <h2 i18n-content="resetPageTitle"></h2>
+        <div i18n-content="resetPageExplanation" id="explanation"></div>
+        <div class="layout center horizontal" id="buttonContainer">
+          <paper-button on-tap="onLearnMoreTap_" id="learnMore"
+              i18n-content="learnMore"></paper-button>
+          <div class="layout center buttons flex-1">
+            <paper-spinner id="resetSpinner"></paper-spinner>
+            <paper-button on-tap="onCancelTap_" id="cancel"
+                i18n-content="cancel"></paper-button>
+            <paper-button i18n-content="resetPageCommit" on-tap="onResetTap_"
+                id="reset"></paper-button>
+          </div>
+        </div>
+      </div>
+      <div id="feedbackBar">
+        <paper-checkbox id="sendSettings" i18n-content="resetPageFeedback"
+            checked on-change="onSendSettingsChange_"></paper-checkbox>
+        <div id="settings">
+          <template is="dom-repeat" items="[[feedbackInfo_]]">
+            <div><span>[[item.key]]</span>: <span>[[item.value]]</span></div>
+          </template>
+        </div>
+      </div>
+    </paper-dialog>
+  </template>
+  <script src="reset_profile_dialog.js"></script>
+</dom-module>
diff --git a/chrome/browser/resources/settings/reset_page/reset_profile_dialog.js b/chrome/browser/resources/settings/reset_page/reset_profile_dialog.js
new file mode 100644
index 0000000..3fe767d
--- /dev/null
+++ b/chrome/browser/resources/settings/reset_page/reset_profile_dialog.js
@@ -0,0 +1,67 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/**
+ * @fileoverview
+ * 'settings-reset-profile-dialog' is the dialog shown for clearing profile
+ * settings.
+ *
+ * @group Chrome Settings Elements
+ * @element settings-reset-profile-dialog
+ */
+Polymer({
+  is: 'settings-reset-profile-dialog',
+
+  properties: {
+    feedbackInfo_: String,
+  },
+
+  attached: function() {
+    cr.define('SettingsResetPage', function() {
+      return {
+        doneResetting: function() {
+          this.$.resetSpinner.active = false;
+          this.$.dialog.close();
+        }.bind(this),
+
+        setFeedbackInfo: function(data) {
+          this.set('feedbackInfo_', data.feedbackInfo);
+          this.async(function() {
+            this.$.dialog.center();
+          });
+        }.bind(this),
+      };
+    }.bind(this));
+  },
+
+  open: function() {
+    this.$.dialog.open();
+    chrome.send('onShowResetProfileDialog');
+  },
+
+  /** @private */
+  onCancelTap_: function() {
+    this.$.dialog.close();
+    chrome.send('onHideResetProfileDialog');
+  },
+
+  /** @private */
+  onResetTap_: function() {
+    this.$.resetSpinner.active = true;
+    chrome.send('performResetProfileSettings', [this.$.sendSettings.checked]);
+  },
+
+  /** @private */
+  onLearnMoreTap_: function() {
+    window.open(loadTimeData.getString('resetPageLearnMoreUrl'));
+  },
+
+  /** @private */
+  onSendSettingsChange_: function() {
+    // TODO(dpapad): Update how settings info is surfaced when final mocks
+    // exist.
+    this.$.settings.hidden = !this.$.sendSettings.checked;
+    this.$.dialog.center();
+  },
+});
diff --git a/chrome/browser/resources/settings/settings_resources.grd b/chrome/browser/resources/settings/settings_resources.grd
index 5096068..ee28081 100644
--- a/chrome/browser/resources/settings/settings_resources.grd
+++ b/chrome/browser/resources/settings/settings_resources.grd
@@ -223,15 +223,21 @@
       <structure name="IDR_SETTINGS_DOWNLOADS_PAGE_JS"
                  file="downloads_page/downloads_page.js"
                  type="chrome_html" />
-      <structure name="IDR_SETTINGS_RESET_PAGE_CSS"
-                 file="reset_page/reset_page.css"
-                 type="chrome_html" />
       <structure name="IDR_SETTINGS_RESET_PAGE_HTML"
                  file="reset_page/reset_page.html"
                  type="chrome_html" />
       <structure name="IDR_SETTINGS_RESET_PAGE_JS"
                  file="reset_page/reset_page.js"
                  type="chrome_html" />
+      <structure name="IDR_SETTINGS_RESET_PROFILE_DIALOG_CSS"
+                 file="reset_page/reset_profile_dialog.css"
+                 type="chrome_html" />
+      <structure name="IDR_SETTINGS_RESET_PROFILE_DIALOG_HTML"
+                 file="reset_page/reset_profile_dialog.html"
+                 type="chrome_html" />
+      <structure name="IDR_SETTINGS_RESET_PROFILE_DIALOG_JS"
+                 file="reset_page/reset_profile_dialog.js"
+                 type="chrome_html" />
       <structure name="IDR_SETTINGS_LANGUAGES_HTML"
                  file="languages_page/languages.html"
                  type="chrome_html" />
@@ -282,6 +288,15 @@
                    file="languages_page/edit_dictionary_page.js"
                    type="chrome_html" />
       </if>
+      <structure name="IDR_SETTINGS_PASSWORDS_AND_FORMS_PAGE_CSS"
+                 file="passwords_and_forms_page/passwords_and_forms_page.css"
+                 type="chrome_html" />
+      <structure name="IDR_SETTINGS_PASSWORDS_AND_FORMS_PAGE_HTML"
+                 file="passwords_and_forms_page/passwords_and_forms_page.html"
+                 type="chrome_html" />
+      <structure name="IDR_SETTINGS_PASSWORDS_AND_FORMS_PAGE_JS"
+                 file="passwords_and_forms_page/passwords_and_forms_page.js"
+                 type="chrome_html" />
       <structure name="IDR_SETTINGS_PREFS_HTML"
                  file="prefs/prefs.html"
                  type="chrome_html" />
diff --git a/chrome/browser/ssl/bad_clock_blocking_page.cc b/chrome/browser/ssl/bad_clock_blocking_page.cc
index 0fb1363..6ad49b92 100644
--- a/chrome/browser/ssl/bad_clock_blocking_page.cc
+++ b/chrome/browser/ssl/bad_clock_blocking_page.cc
@@ -26,10 +26,10 @@
 #include "chrome/browser/renderer_preferences_util.h"
 #include "chrome/browser/ssl/cert_report_helper.h"
 #include "chrome/browser/ssl/ssl_cert_reporter.h"
-#include "chrome/browser/ssl/ssl_error_classification.h"
 #include "chrome/common/pref_names.h"
 #include "chrome/grit/generated_resources.h"
 #include "components/google/core/browser/google_util.h"
+#include "components/ssl_errors/error_classification.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/cert_store.h"
 #include "content/public/browser/interstitial_page.h"
@@ -46,6 +46,7 @@
 #include "grit/components_strings.h"
 #include "net/base/net_errors.h"
 #include "net/base/net_util.h"
+#include "net/cert/x509_certificate.h"
 #include "ui/base/l10n/l10n_util.h"
 
 #if defined(OS_ANDROID)
@@ -200,9 +201,8 @@
       false /* overridable */, metrics_helper()));
 
   // TODO(felt): Separate the clock statistics from the main ssl statistics.
-  SSLErrorClassification classifier(time_triggered_, request_url, cert_error_,
-                                    *ssl_info_.cert.get());
-  classifier.RecordUMAStatistics(false);
+  ssl_errors::RecordUMAStatistics(false, time_triggered_, request_url,
+                                  cert_error_, *ssl_info_.cert.get());
 }
 
 bool BadClockBlockingPage::ShouldCreateNewNavigation() const {
@@ -245,10 +245,9 @@
   load_time_data->SetBoolean("hide_primary_button", false);
 #endif
 
-  int heading_string =
-      SSLErrorClassification::IsUserClockInTheFuture(time_triggered_)
-          ? IDS_CLOCK_ERROR_AHEAD_HEADING
-          : IDS_CLOCK_ERROR_BEHIND_HEADING;
+  int heading_string = ssl_errors::IsUserClockInTheFuture(time_triggered_)
+                           ? IDS_CLOCK_ERROR_AHEAD_HEADING
+                           : IDS_CLOCK_ERROR_BEHIND_HEADING;
 
   load_time_data->SetString("tabTitle",
                             l10n_util::GetStringUTF16(IDS_CLOCK_ERROR_TITLE));
diff --git a/chrome/browser/ssl/common_name_mismatch_handler.cc b/chrome/browser/ssl/common_name_mismatch_handler.cc
index 941127b7..691bb0e 100644
--- a/chrome/browser/ssl/common_name_mismatch_handler.cc
+++ b/chrome/browser/ssl/common_name_mismatch_handler.cc
@@ -7,7 +7,7 @@
 #include "base/callback_helpers.h"
 #include "base/logging.h"
 #include "base/strings/string_number_conversions.h"
-#include "chrome/browser/ssl/ssl_error_classification.h"
+#include "components/ssl_errors/error_classification.h"
 #include "net/base/load_flags.h"
 #include "net/http/http_response_headers.h"
 #include "net/http/http_util.h"
@@ -54,10 +54,9 @@
     const GURL& request_url,
     const std::vector<std::string>& dns_names,
     GURL* suggested_url) {
-  std::string host_name = request_url.host();
   std::string www_mismatch_hostname;
-  if (!SSLErrorClassification::GetWWWSubDomainMatch(host_name, dns_names,
-                                                    &www_mismatch_hostname)) {
+  if (!ssl_errors::GetWWWSubDomainMatch(request_url, dns_names,
+                                        &www_mismatch_hostname)) {
     return false;
   }
   // The full URL should be pinged, not just the new hostname. So, get the
diff --git a/chrome/browser/ssl/ssl_blocking_page.cc b/chrome/browser/ssl/ssl_blocking_page.cc
index 721df33..d26a975 100644
--- a/chrome/browser/ssl/ssl_blocking_page.cc
+++ b/chrome/browser/ssl/ssl_blocking_page.cc
@@ -26,12 +26,12 @@
 #include "chrome/browser/renderer_preferences_util.h"
 #include "chrome/browser/ssl/cert_report_helper.h"
 #include "chrome/browser/ssl/ssl_cert_reporter.h"
-#include "chrome/browser/ssl/ssl_error_classification.h"
 #include "chrome/common/chrome_switches.h"
 #include "chrome/common/pref_names.h"
 #include "chrome/grit/chromium_strings.h"
 #include "chrome/grit/generated_resources.h"
 #include "components/google/core/browser/google_util.h"
+#include "components/ssl_errors/error_classification.h"
 #include "components/ssl_errors/error_info.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/cert_store.h"
@@ -157,9 +157,8 @@
       certificate_reporting::ErrorReport::INTERSTITIAL_SSL, overridable_,
       metrics_helper()));
 
-  SSLErrorClassification error_classification(
-      time_triggered_, request_url, cert_error_, *ssl_info_.cert.get());
-  error_classification.RecordUMAStatistics(overridable_);
+  ssl_errors::RecordUMAStatistics(overridable_, time_triggered_, request_url,
+                                  cert_error_, *ssl_info_.cert.get());
 
   // Creating an interstitial without showing (e.g. from chrome://interstitials)
   // it leaks memory, so don't create it here.
@@ -229,17 +228,9 @@
 
     ssl_errors::ErrorInfo::ErrorType type =
         ssl_errors::ErrorInfo::NetErrorToErrorType(cert_error_);
-    if (type == ssl_errors::ErrorInfo::CERT_INVALID &&
-        SSLErrorClassification::MaybeWindowsLacksSHA256Support()) {
-      load_time_data->SetString(
-          "explanationParagraph",
-          l10n_util::GetStringFUTF16(IDS_SSL_NONOVERRIDABLE_MORE_INVALID_SP3,
-                                     url));
-    } else {
-      load_time_data->SetString(
-          "explanationParagraph",
-          l10n_util::GetStringFUTF16(IDS_SSL_NONOVERRIDABLE_MORE, url));
-    }
+    load_time_data->SetString(
+        "explanationParagraph",
+        l10n_util::GetStringFUTF16(IDS_SSL_NONOVERRIDABLE_MORE, url));
     load_time_data->SetString("primaryButtonText",
                               l10n_util::GetStringUTF16(IDS_SSL_RELOAD));
     // Customize the help link depending on the specific error type.
diff --git a/chrome/browser/ssl/ssl_browser_tests.cc b/chrome/browser/ssl/ssl_browser_tests.cc
index a5541045..99999bf 100644
--- a/chrome/browser/ssl/ssl_browser_tests.cc
+++ b/chrome/browser/ssl/ssl_browser_tests.cc
@@ -33,7 +33,6 @@
 #include "chrome/browser/ssl/common_name_mismatch_handler.h"
 #include "chrome/browser/ssl/security_state_model.h"
 #include "chrome/browser/ssl/ssl_blocking_page.h"
-#include "chrome/browser/ssl/ssl_error_classification.h"
 #include "chrome/browser/ssl/ssl_error_handler.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_commands.h"
@@ -48,6 +47,7 @@
 #include "chrome/test/base/ui_test_utils.h"
 #include "components/content_settings/core/browser/host_content_settings_map.h"
 #include "components/security_interstitials/core/metrics_helper.h"
+#include "components/ssl_errors/error_classification.h"
 #include "components/variations/variations_associated_data.h"
 #include "components/web_modal/web_contents_modal_dialog_manager.h"
 #include "content/public/browser/browser_context.h"
@@ -507,8 +507,7 @@
     mock_clock->SetNow(base::Time::NowFromSystemTime());
     mock_clock->Advance(base::TimeDelta::FromDays(367));
     SSLErrorHandler::SetClockForTest(mock_clock.get());
-    SSLErrorClassification::SetBuildTimeForTesting(
-        base::Time::NowFromSystemTime());
+    ssl_errors::SetBuildTimeForTesting(base::Time::NowFromSystemTime());
 
     // Opt in to sending reports for invalid certificate chains.
     certificate_reporting_test_utils::SetCertReportingOptIn(browser, opt_in);
@@ -859,8 +858,7 @@
   mock_clock->SetNow(base::Time::NowFromSystemTime());
   mock_clock->Advance(base::TimeDelta::FromDays(367));
   SSLErrorHandler::SetClockForTest(mock_clock.get());
-  SSLErrorClassification::SetBuildTimeForTesting(
-      base::Time::NowFromSystemTime());
+  ssl_errors::SetBuildTimeForTesting(base::Time::NowFromSystemTime());
 
   ui_test_utils::NavigateToURL(browser(), https_server_expired_.GetURL("/"));
   WebContents* clock_tab = browser()->tab_strip_model()->GetActiveWebContents();
@@ -2471,8 +2469,7 @@
   mock_clock.SetNow(base::Time::NowFromSystemTime());
   mock_clock.Advance(base::TimeDelta::FromDays(367));
   SSLErrorHandler::SetClockForTest(&mock_clock);
-  SSLErrorClassification::SetBuildTimeForTesting(
-      base::Time::NowFromSystemTime());
+  ssl_errors::SetBuildTimeForTesting(base::Time::NowFromSystemTime());
 
   ui_test_utils::NavigateToURL(browser(), https_server_expired_.GetURL("/"));
   content::WaitForInterstitialAttach(tab);
diff --git a/chrome/browser/ssl/ssl_error_classification.h b/chrome/browser/ssl/ssl_error_classification.h
deleted file mode 100644
index e273365..0000000
--- a/chrome/browser/ssl/ssl_error_classification.h
+++ /dev/null
@@ -1,127 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_SSL_SSL_ERROR_CLASSIFICATION_H_
-#define CHROME_BROWSER_SSL_SSL_ERROR_CLASSIFICATION_H_
-
-#include <string>
-#include <vector>
-
-#include "base/gtest_prod_util.h"
-#include "base/time/time.h"
-#include "net/cert/x509_certificate.h"
-#include "url/gurl.h"
-
-class SSLErrorClassification {
- public:
-  SSLErrorClassification(const base::Time& current_time,
-                         const GURL& url,
-                         int cert_error,
-                         const net::X509Certificate& cert);
-  ~SSLErrorClassification();
-
-  // Returns true if the system time is in the past.
-  static bool IsUserClockInThePast(const base::Time& time_now);
-
-  // Returns true if the system time is too far in the future or the user is
-  // using a version of Chrome which is more than 1 year old.
-  static bool IsUserClockInTheFuture(const base::Time& time_now);
-
-  // Sets a clock for browser tests that check the build time. Used by
-  // IsUserClockInThePast and IsUserClockInTheFuture.
-  static void SetBuildTimeForTesting(const base::Time& testing_time);
-
-  // Returns true if the Windows platform is likely to not have SHA-256 support.
-  // On other platforms, returns false always.
-  static bool MaybeWindowsLacksSHA256Support();
-
-  // Returns true if the site's hostname differs from one of the DNS
-  // names in the certificate (CN or SANs) only by the presence or
-  // absence of the single-label prefix "www". E.g.: (The first domain
-  // is hostname and the second domain is a DNS name in the certificate)
-  //
-  //     www.example.com ~ example.com -> true
-  //     example.com ~ www.example.com -> true
-  //     www.food.example.com ~ example.com -> false
-  //     mail.example.com ~ example.com -> false
-  static bool GetWWWSubDomainMatch(const std::string& host_name,
-                                   const std::vector<std::string>& dns_names,
-                                   std::string* www_match_host_name);
-
-  void RecordUMAStatistics(bool overridable) const;
-
- private:
-  FRIEND_TEST_ALL_PREFIXES(SSLErrorClassificationTest, TestDateInvalidScore);
-  FRIEND_TEST_ALL_PREFIXES(SSLErrorClassificationTest, TestNameMismatch);
-  FRIEND_TEST_ALL_PREFIXES(SSLErrorClassificationTest,
-                           TestHostNameHasKnownTLD);
-  FRIEND_TEST_ALL_PREFIXES(SSLErrorClassificationTest, TestPrivateURL);
-
-  typedef std::vector<std::string> Tokens;
-
-  // Returns true if the hostname has a known Top Level Domain.
-  static bool IsHostNameKnownTLD(const std::string& host_name);
-
-  // Returns true if any one of the following conditions hold:
-  // 1.|hostname| is an IP Address in an IANA-reserved range.
-  // 2.|hostname| is a not-yet-assigned by ICANN gTLD.
-  // 3.|hostname| is a dotless domain.
-  static bool IsHostnameNonUniqueOrDotless(const std::string& hostname);
-
-  // Returns true if GetWWWSubDomainMatch finds a www mismatch.
-  bool IsWWWSubDomainMatch() const;
-
-  // Returns true if |child| is a subdomain of any of the |potential_parents|.
-  bool NameUnderAnyNames(const Tokens& child,
-                        const std::vector<Tokens>& potential_parents) const;
-
-  // Returns true if any of the |potential_children| is a subdomain of the
-  // |parent|. The inverse case should be treated carefully as this is most
-  // likely a MITM attack. We don't want foo.appspot.com to be able to MITM for
-  // appspot.com.
-  bool AnyNamesUnderName(const std::vector<Tokens>& potential_children,
-                        const Tokens& parent) const;
-
-  // Returns true if |hostname| is too broad for the scope of a wildcard
-  // certificate. E.g.:
-  //
-  //     a.b.example.com ~ *.example.com --> true
-  //     b.example.com ~ *.example.com --> false
-  bool IsSubDomainOutsideWildcard(const Tokens& hostname) const;
-
-  // Returns true if the certificate is a shared certificate. Note - This
-  // function should be used with caution (only for UMA histogram) as an
-  // attacker could easily get a certificate with more than 5 names in the SAN
-  // fields.
-  bool IsCertLikelyFromMultiTenantHosting() const;
-
-  // Returns true if the hostname in |request_url_| has the same domain
-  // (effective TLD + 1 label) as at least one of the subject
-  // alternative names in |cert_|.
-  bool IsCertLikelyFromSameDomain() const;
-
-  static std::vector<Tokens> GetTokenizedDNSNames(
-      const std::vector<std::string>& dns_names);
-
-  // If |potential_subdomain| is a subdomain of |parent|, returns the
-  // number of DNS labels by which |potential_subdomain| is under
-  // |parent|. Otherwise, returns 0.
-  //
-  // For example,
-  //
-  //   FindSubDomainDifference(Tokenize("a.b.example.com"),
-  //                           Tokenize("example.com"))
-  // --> 2.
-  size_t FindSubDomainDifference(const Tokens& potential_subdomain,
-                                 const Tokens& parent) const;
-
-  static Tokens Tokenize(const std::string& name);
-
-  base::Time current_time_;
-  const GURL request_url_;
-  int cert_error_;
-  const net::X509Certificate& cert_;
-};
-
-#endif  // CHROME_BROWSER_SSL_SSL_ERROR_CLASSIFICATION_H_
diff --git a/chrome/browser/ssl/ssl_error_classification_unittest.cc b/chrome/browser/ssl/ssl_error_classification_unittest.cc
deleted file mode 100644
index b84676e..0000000
--- a/chrome/browser/ssl/ssl_error_classification_unittest.cc
+++ /dev/null
@@ -1,141 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/ssl/ssl_error_classification.h"
-
-#include "base/files/file_path.h"
-#include "base/strings/string_split.h"
-#include "base/time/time.h"
-#include "net/base/net_errors.h"
-#include "net/base/test_data_directory.h"
-#include "net/cert/x509_cert_types.h"
-#include "net/cert/x509_certificate.h"
-#include "net/test/cert_test_util.h"
-#include "net/test/test_certificate_data.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "url/gurl.h"
-
-using base::Time;
-
-class SSLErrorClassificationTest : public testing::Test {};
-
-TEST_F(SSLErrorClassificationTest, TestNameMismatch) {
-  scoped_refptr<net::X509Certificate> google_cert(
-      net::X509Certificate::CreateFromBytes(
-          reinterpret_cast<const char*>(google_der), sizeof(google_der)));
-  ASSERT_NE(static_cast<net::X509Certificate*>(NULL), google_cert.get());
-  base::Time time = base::Time::NowFromSystemTime();
-  std::vector<std::string> dns_names_google;
-  dns_names_google.push_back("www");
-  dns_names_google.push_back("google");
-  dns_names_google.push_back("com");
-  std::vector<std::vector<std::string>> dns_name_tokens_google;
-  dns_name_tokens_google.push_back(dns_names_google);
-  int cert_error = net::ERR_CERT_COMMON_NAME_INVALID;
-  {
-    GURL origin("https://google.com");
-    std::vector<std::string> host_name_tokens = base::SplitString(
-        origin.host(), ".", base::KEEP_WHITESPACE, base::SPLIT_WANT_ALL);
-    SSLErrorClassification ssl_error(time, origin, cert_error, *google_cert);
-    EXPECT_TRUE(ssl_error.IsWWWSubDomainMatch());
-    EXPECT_FALSE(ssl_error.NameUnderAnyNames(host_name_tokens,
-                                             dns_name_tokens_google));
-    EXPECT_FALSE(ssl_error.AnyNamesUnderName(dns_name_tokens_google,
-                                             host_name_tokens));
-    EXPECT_FALSE(ssl_error.IsSubDomainOutsideWildcard(host_name_tokens));
-    EXPECT_FALSE(ssl_error.IsCertLikelyFromMultiTenantHosting());
-    EXPECT_TRUE(ssl_error.IsCertLikelyFromSameDomain());
-  }
-
-  {
-    GURL origin("https://foo.blah.google.com");
-    std::vector<std::string> host_name_tokens = base::SplitString(
-        origin.host(), ".", base::KEEP_WHITESPACE, base::SPLIT_WANT_ALL);
-    SSLErrorClassification ssl_error(time, origin, cert_error, *google_cert);
-    EXPECT_FALSE(ssl_error.IsWWWSubDomainMatch());
-    EXPECT_FALSE(ssl_error.NameUnderAnyNames(host_name_tokens,
-                                             dns_name_tokens_google));
-    EXPECT_FALSE(ssl_error.AnyNamesUnderName(dns_name_tokens_google,
-                                             host_name_tokens));
-    EXPECT_TRUE(ssl_error.IsCertLikelyFromSameDomain());
-  }
-
-  {
-    GURL origin("https://foo.www.google.com");
-    std::vector<std::string> host_name_tokens = base::SplitString(
-        origin.host(), ".", base::KEEP_WHITESPACE, base::SPLIT_WANT_ALL);
-    SSLErrorClassification ssl_error(time, origin, cert_error, *google_cert);
-    EXPECT_FALSE(ssl_error.IsWWWSubDomainMatch());
-    EXPECT_TRUE(ssl_error.NameUnderAnyNames(host_name_tokens,
-                                            dns_name_tokens_google));
-    EXPECT_FALSE(ssl_error.AnyNamesUnderName(dns_name_tokens_google,
-                                             host_name_tokens));
-    EXPECT_TRUE(ssl_error.IsCertLikelyFromSameDomain());
-  }
-
-  {
-     GURL origin("https://www.google.com.foo");
-     std::vector<std::string> host_name_tokens = base::SplitString(
-         origin.host(), ".", base::KEEP_WHITESPACE, base::SPLIT_WANT_ALL);
-     SSLErrorClassification ssl_error(time, origin, cert_error, *google_cert);
-     EXPECT_FALSE(ssl_error.IsWWWSubDomainMatch());
-     EXPECT_FALSE(ssl_error.NameUnderAnyNames(host_name_tokens,
-                                              dns_name_tokens_google));
-     EXPECT_FALSE(ssl_error.AnyNamesUnderName(dns_name_tokens_google,
-                                              host_name_tokens));
-     EXPECT_FALSE(ssl_error.IsCertLikelyFromSameDomain());
-  }
-
-  {
-    GURL origin("https://www.foogoogle.com.");
-    std::vector<std::string> host_name_tokens = base::SplitString(
-        origin.host(), ".", base::KEEP_WHITESPACE, base::SPLIT_WANT_ALL);
-    SSLErrorClassification ssl_error(time, origin, cert_error, *google_cert);
-    EXPECT_FALSE(ssl_error.IsWWWSubDomainMatch());
-    EXPECT_FALSE(ssl_error.NameUnderAnyNames(host_name_tokens,
-                                             dns_name_tokens_google));
-    EXPECT_FALSE(ssl_error.AnyNamesUnderName(dns_name_tokens_google,
-                                             host_name_tokens));
-    EXPECT_FALSE(ssl_error.IsCertLikelyFromSameDomain());
-  }
-
-  scoped_refptr<net::X509Certificate> webkit_cert(
-      net::X509Certificate::CreateFromBytes(
-          reinterpret_cast<const char*>(webkit_der), sizeof(webkit_der)));
-  ASSERT_NE(static_cast<net::X509Certificate*>(NULL), webkit_cert.get());
-  std::vector<std::string> dns_names_webkit;
-  dns_names_webkit.push_back("webkit");
-  dns_names_webkit.push_back("org");
-  std::vector<std::vector<std::string>> dns_name_tokens_webkit;
-  dns_name_tokens_webkit.push_back(dns_names_webkit);
-  {
-    GURL origin("https://a.b.webkit.org");
-    std::vector<std::string> host_name_tokens = base::SplitString(
-        origin.host(), ".", base::KEEP_WHITESPACE, base::SPLIT_WANT_ALL);
-    SSLErrorClassification ssl_error(time, origin, cert_error, *webkit_cert);
-    EXPECT_FALSE(ssl_error.IsWWWSubDomainMatch());
-    EXPECT_FALSE(ssl_error.NameUnderAnyNames(host_name_tokens,
-                                             dns_name_tokens_webkit));
-    EXPECT_FALSE(ssl_error.AnyNamesUnderName(dns_name_tokens_webkit,
-                                             host_name_tokens));
-    EXPECT_TRUE(ssl_error.IsSubDomainOutsideWildcard(host_name_tokens));
-    EXPECT_FALSE(ssl_error.IsCertLikelyFromMultiTenantHosting());
-    EXPECT_TRUE(ssl_error.IsCertLikelyFromSameDomain());
-  }
-}
-
-TEST_F(SSLErrorClassificationTest, TestHostNameHasKnownTLD) {
-  EXPECT_TRUE(SSLErrorClassification::IsHostNameKnownTLD("www.google.com"));
-  EXPECT_TRUE(SSLErrorClassification::IsHostNameKnownTLD("b.appspot.com"));
-  EXPECT_FALSE(SSLErrorClassification::IsHostNameKnownTLD("a.private"));
-}
-
-TEST_F(SSLErrorClassificationTest, TestPrivateURL) {
-  EXPECT_FALSE(SSLErrorClassification::IsHostnameNonUniqueOrDotless(
-      "www.foogoogle.com."));
-  EXPECT_TRUE(SSLErrorClassification::IsHostnameNonUniqueOrDotless("go"));
-  EXPECT_TRUE(
-      SSLErrorClassification::IsHostnameNonUniqueOrDotless("172.17.108.108"));
-  EXPECT_TRUE(SSLErrorClassification::IsHostnameNonUniqueOrDotless("foo.blah"));
-}
diff --git a/chrome/browser/ssl/ssl_error_handler.cc b/chrome/browser/ssl/ssl_error_handler.cc
index 67385ea4..529e97c 100644
--- a/chrome/browser/ssl/ssl_error_handler.cc
+++ b/chrome/browser/ssl/ssl_error_handler.cc
@@ -14,7 +14,7 @@
 #include "chrome/browser/ssl/bad_clock_blocking_page.h"
 #include "chrome/browser/ssl/ssl_blocking_page.h"
 #include "chrome/browser/ssl/ssl_cert_reporter.h"
-#include "chrome/browser/ssl/ssl_error_classification.h"
+#include "components/ssl_errors/error_classification.h"
 #include "components/ssl_errors/error_info.h"
 #include "content/public/browser/notification_service.h"
 #include "content/public/browser/notification_source.h"
@@ -137,8 +137,8 @@
       ssl_errors::ErrorInfo::CERT_DATE_INVALID) {
     return false;
   }
-  return SSLErrorClassification::IsUserClockInThePast(now) ||
-         SSLErrorClassification::IsUserClockInTheFuture(now);
+  return ssl_errors::IsUserClockInThePast(now) ||
+         ssl_errors::IsUserClockInTheFuture(now);
 }
 
 }  // namespace
diff --git a/chrome/browser/sync/profile_sync_components_factory_impl.cc b/chrome/browser/sync/profile_sync_components_factory_impl.cc
index 16f72143..5a3d501 100644
--- a/chrome/browser/sync/profile_sync_components_factory_impl.cc
+++ b/chrome/browser/sync/profile_sync_components_factory_impl.cc
@@ -42,7 +42,6 @@
 #include "components/sync_driver/sync_client.h"
 #include "components/sync_driver/ui_data_type_controller.h"
 #include "components/sync_sessions/session_data_type_controller.h"
-#include "components/variations/variations_associated_data.h"
 #include "content/public/browser/browser_thread.h"
 #include "google_apis/gaia/oauth2_token_service.h"
 #include "google_apis/gaia/oauth2_token_service_request.h"
@@ -104,17 +103,6 @@
   std::string disabled_types_str =
       command_line.GetSwitchValueASCII(switches::kDisableSyncTypes);
 
-  // Disable sync types experimentally to measure impact on startup time.
-  // TODO(mlerman): Remove this after the experiment. crbug.com/454788
-  std::string disable_types_finch =
-      variations::GetVariationParamValue("LightSpeed", "DisableSyncPart");
-  if (!disable_types_finch.empty()) {
-    if (disabled_types_str.empty())
-      disabled_types_str = disable_types_finch;
-    else
-      disabled_types_str += ", " + disable_types_finch;
-  }
-
   disabled_types = syncer::ModelTypeSetFromString(disabled_types_str);
   return disabled_types;
 }
diff --git a/chrome/browser/sync/profile_sync_service_factory.cc b/chrome/browser/sync/profile_sync_service_factory.cc
index 1478dc3..f4d7f4fd 100644
--- a/chrome/browser/sync/profile_sync_service_factory.cc
+++ b/chrome/browser/sync/profile_sync_service_factory.cc
@@ -38,7 +38,6 @@
 #include "components/sync_driver/signin_manager_wrapper.h"
 #include "components/sync_driver/startup_controller.h"
 #include "components/sync_driver/sync_util.h"
-#include "components/variations/variations_associated_data.h"
 #include "content/public/browser/browser_thread.h"
 #include "url/gurl.h"
 
@@ -83,15 +82,6 @@
   if (!ProfileSyncService::IsSyncAllowedByFlag())
     return NULL;
 
-  // Disable sync experimentally to measure impact on startup time. Supervised
-  // users are unaffected, since supervised users rely completely on sync.
-  // TODO(mlerman): Remove this after the experiment. crbug.com/454788
-  if (!profile->IsSupervised() &&
-      !variations::GetVariationParamValue("LightSpeed", "DisableSync")
-           .empty()) {
-    return NULL;
-  }
-
   return static_cast<ProfileSyncService*>(
       GetInstance()->GetServiceForBrowserContext(profile, true));
 }
diff --git a/chrome/browser/sync/test/integration/sync_test.cc b/chrome/browser/sync/test/integration/sync_test.cc
index 88d6f5c9..e673d39 100644
--- a/chrome/browser/sync/test/integration/sync_test.cc
+++ b/chrome/browser/sync/test/integration/sync_test.cc
@@ -638,16 +638,15 @@
     clients_[i]->service()->RequestStop(ProfileSyncService::CLEAR_DATA);
   }
 
-  content::WindowedNotificationObserver observer(
-      chrome::NOTIFICATION_BROWSER_CLOSED,
-      content::NotificationService::AllSources());
-  chrome::CloseAllBrowsers();
-
-  // Waiting for a single notification mitigates flakiness (related to not all
-  // browsers being closed). If further flakiness is seen
-  // (GetTotalBrowserCount() > 0 after this call), GetTotalBrowserCount()
-  // notifications should be waited on.
-  observer.Wait();
+  // Closing all browsers created by this test. The calls here block until
+  // they are closed. Other browsers created outside SyncTest setup should be
+  // closed by the creator of that browser.
+  size_t init_browser_count = chrome::GetTotalBrowserCount();
+  for (size_t i = 0; i < browsers_.size(); ++i) {
+    CloseBrowserSynchronously(browsers_[i]);
+  }
+  CHECK_EQ(chrome::GetTotalBrowserCount(),
+           init_browser_count - browsers_.size());
 
   if (fake_server_.get()) {
     std::vector<fake_server::FakeServerInvalidationService*>::const_iterator it;
@@ -657,9 +656,6 @@
     }
   }
 
-  // All browsers should be closed at this point, or else we could see memory
-  // corruption in QuitBrowser().
-  CHECK_EQ(0U, chrome::GetTotalBrowserCount());
   invalidation_forwarders_.clear();
   sync_refreshers_.clear();
   fake_server_invalidation_services_.clear();
diff --git a/chrome/browser/ui/app_list/app_list_service_impl.cc b/chrome/browser/ui/app_list/app_list_service_impl.cc
index 427032e..5ee1dee0 100644
--- a/chrome/browser/ui/app_list/app_list_service_impl.cc
+++ b/chrome/browser/ui/app_list/app_list_service_impl.cc
@@ -372,7 +372,7 @@
     Profile* profile,
     const scoped_refptr<content::SpeechRecognitionSessionPreamble>& preamble) {
   ShowForProfile(profile);
-  view_delegate_->ToggleSpeechRecognitionForHotword(preamble);
+  view_delegate_->StartSpeechRecognitionForHotword(preamble);
 }
 
 void AppListServiceImpl::ShowForAppInstall(Profile* profile,
diff --git a/chrome/browser/ui/app_list/app_list_view_delegate.cc b/chrome/browser/ui/app_list/app_list_view_delegate.cc
index b332b52a..73c4982 100644
--- a/chrome/browser/ui/app_list/app_list_view_delegate.cc
+++ b/chrome/browser/ui/app_list/app_list_view_delegate.cc
@@ -382,7 +382,7 @@
     const scoped_refptr<content::SpeechRecognitionSessionPreamble>& preamble) {
   DCHECK_EQ(app_list::SPEECH_RECOGNITION_HOTWORD_LISTENING,
             speech_ui_->state());
-  ToggleSpeechRecognitionForHotword(preamble);
+  StartSpeechRecognitionForHotword(preamble);
 }
 
 void AppListViewDelegate::SigninManagerCreated(SigninManagerBase* manager) {
@@ -601,11 +601,18 @@
                            chrome::kAppLauncherCategoryTag);
 }
 
-void AppListViewDelegate::ToggleSpeechRecognition() {
-  ToggleSpeechRecognitionForHotword(nullptr);
+void AppListViewDelegate::StartSpeechRecognition() {
+  StartSpeechRecognitionForHotword(nullptr);
 }
 
-void AppListViewDelegate::ToggleSpeechRecognitionForHotword(
+void AppListViewDelegate::StopSpeechRecognition() {
+  app_list::StartPageService* service =
+      app_list::StartPageService::Get(profile_);
+  if (service)
+    service->StopSpeechRecognition();
+}
+
+void AppListViewDelegate::StartSpeechRecognitionForHotword(
     const scoped_refptr<content::SpeechRecognitionSessionPreamble>& preamble) {
   app_list::StartPageService* service =
       app_list::StartPageService::Get(profile_);
@@ -618,7 +625,7 @@
           app_list::SPEECH_RECOGNITION_NETWORK_ERROR, true);
       return;
     }
-    service->ToggleSpeechRecognition(preamble);
+    service->StartSpeechRecognition(preamble);
   }
 
   // With the new hotword extension, stop the hotword session. With the launcher
diff --git a/chrome/browser/ui/app_list/app_list_view_delegate.h b/chrome/browser/ui/app_list/app_list_view_delegate.h
index ff51b40..d9a7dc1a 100644
--- a/chrome/browser/ui/app_list/app_list_view_delegate.h
+++ b/chrome/browser/ui/app_list/app_list_view_delegate.h
@@ -74,9 +74,8 @@
   void SetProfile(Profile* profile);
   Profile* profile() { return profile_; }
 
-  // Invoked to toggle the status of speech recognition based on a hotword
-  // trigger.
-  void ToggleSpeechRecognitionForHotword(
+  // Invoked to start speech recognition based on a hotword trigger.
+  void StartSpeechRecognitionForHotword(
       const scoped_refptr<content::SpeechRecognitionSessionPreamble>& preamble);
 
   // Overridden from app_list::AppListViewDelegate:
@@ -104,7 +103,8 @@
   void OpenSettings() override;
   void OpenHelp() override;
   void OpenFeedback() override;
-  void ToggleSpeechRecognition() override;
+  void StartSpeechRecognition() override;
+  void StopSpeechRecognition() override;
   void ShowForProfileByPath(const base::FilePath& profile_path) override;
 #if defined(TOOLKIT_VIEWS)
   views::View* CreateStartPageWebView(const gfx::Size& size) override;
diff --git a/chrome/browser/ui/app_list/start_page_service.cc b/chrome/browser/ui/app_list/start_page_service.cc
index c078e731..ac805cb 100644
--- a/chrome/browser/ui/app_list/start_page_service.cc
+++ b/chrome/browser/ui/app_list/start_page_service.cc
@@ -419,14 +419,7 @@
     UnloadContents();
 
   if (speech_recognizer_) {
-    speech_recognizer_->Stop();
-    speech_recognizer_.reset();
-
-    // When the SpeechRecognizer is destroyed above, we get stuck in the current
-    // speech state instead of being reset into the READY state. Reset the
-    // speech state explicitly so that speech works when the launcher is opened
-    // again.
-    OnSpeechRecognitionStateChanged(SPEECH_RECOGNITION_READY);
+    StopSpeechRecognition();
   }
 
 #if defined(OS_CHROMEOS)
@@ -434,7 +427,7 @@
 #endif
 }
 
-void StartPageService::ToggleSpeechRecognition(
+void StartPageService::StartSpeechRecognition(
     const scoped_refptr<content::SpeechRecognitionSessionPreamble>& preamble) {
   DCHECK(contents_);
   speech_button_toggled_manually_ = true;
@@ -457,6 +450,17 @@
   speech_recognizer_->Start(preamble);
 }
 
+void StartPageService::StopSpeechRecognition() {
+  // A call to Stop() isn't needed since deleting the recognizer implicitly
+  // stops.
+  speech_recognizer_.reset();
+
+  // When the SpeechRecognizer is destroyed above, we get stuck in the current
+  // speech state instead of being reset into the READY state. Reset the speech
+  // state explicitly so that speech works when the launcher is opened again.
+  OnSpeechRecognitionStateChanged(SPEECH_RECOGNITION_READY);
+}
+
 bool StartPageService::HotwordEnabled() {
 // Voice input for the launcher is unsupported on non-ChromeOS platforms.
 // TODO(amistry): Make speech input, and hotwording, work on non-ChromeOS.
diff --git a/chrome/browser/ui/app_list/start_page_service.h b/chrome/browser/ui/app_list/start_page_service.h
index 2f54e0ef..2f506fa9 100644
--- a/chrome/browser/ui/app_list/start_page_service.h
+++ b/chrome/browser/ui/app_list/start_page_service.h
@@ -69,8 +69,10 @@
 
   void AppListShown();
   void AppListHidden();
-  void ToggleSpeechRecognition(
+
+  void StartSpeechRecognition(
       const scoped_refptr<content::SpeechRecognitionSessionPreamble>& preamble);
+  void StopSpeechRecognition();
 
   // Called when the WebUI has finished loading.
   void WebUILoaded();
diff --git a/chrome/browser/ui/autofill/card_unmask_prompt_view_browsertest.cc b/chrome/browser/ui/autofill/card_unmask_prompt_view_browsertest.cc
index e9e4ce2..cd4c2943 100644
--- a/chrome/browser/ui/autofill/card_unmask_prompt_view_browsertest.cc
+++ b/chrome/browser/ui/autofill/card_unmask_prompt_view_browsertest.cc
@@ -6,7 +6,6 @@
 #include "base/guid.h"
 #include "base/message_loop/message_loop.h"
 #include "base/strings/utf_string_conversions.h"
-#include "chrome/browser/autofill/risk_util.h"
 #include "chrome/browser/ui/autofill/card_unmask_prompt_view_tester.h"
 #include "chrome/browser/ui/autofill/create_card_unmask_prompt_view.h"
 #include "chrome/browser/ui/browser.h"
@@ -55,8 +54,9 @@
   TestCardUnmaskPromptController(
       content::WebContents* contents,
       scoped_refptr<content::MessageLoopRunner> runner)
-      : CardUnmaskPromptControllerImpl(base::Bind(&LoadRiskData, 0, contents),
-            user_prefs::UserPrefs::Get(contents->GetBrowserContext()), false),
+      : CardUnmaskPromptControllerImpl(
+            user_prefs::UserPrefs::Get(contents->GetBrowserContext()),
+            false),
         runner_(runner),
         weak_factory_(this) {}
 
@@ -65,10 +65,6 @@
     return base::TimeDelta::FromMilliseconds(10);
   }
 
-  void LoadRiskFingerprint() override {
-    OnDidLoadRiskFingerprint("risk_data");
-  }
-
   base::WeakPtr<TestCardUnmaskPromptController> GetWeakPtr() {
     return weak_factory_.GetWeakPtr();
   }
diff --git a/chrome/browser/ui/autofill/chrome_autofill_client.cc b/chrome/browser/ui/autofill/chrome_autofill_client.cc
index 3288d5a..26a8c50d 100644
--- a/chrome/browser/ui/autofill/chrome_autofill_client.cc
+++ b/chrome/browser/ui/autofill/chrome_autofill_client.cc
@@ -54,7 +54,6 @@
 ChromeAutofillClient::ChromeAutofillClient(content::WebContents* web_contents)
     : content::WebContentsObserver(web_contents),
       unmask_controller_(
-          base::Bind(&LoadRiskData, 0, web_contents),
           user_prefs::UserPrefs::Get(web_contents->GetBrowserContext()),
           Profile::FromBrowserContext(web_contents->GetBrowserContext())
               ->IsOffTheRecord()),
@@ -148,27 +147,39 @@
       card, delegate);
 }
 
-void ChromeAutofillClient::OnUnmaskVerificationResult(GetRealPanResult result) {
+void ChromeAutofillClient::OnUnmaskVerificationResult(
+    PaymentsRpcResult result) {
   unmask_controller_.OnVerificationResult(result);
 }
 
-void ChromeAutofillClient::ConfirmSaveCreditCard(
-    const base::Closure& save_card_callback) {
+void ChromeAutofillClient::ConfirmSaveCreditCardLocally(
+    const base::Closure& callback) {
 // TODO(bondd): Implement save card bubble for OS_MACOSX.
 #if defined(TOOLKIT_VIEWS) && !defined(OS_MACOSX)
   // Do lazy initialization of SaveCardBubbleControllerImpl.
   autofill::SaveCardBubbleControllerImpl::CreateForWebContents(web_contents());
   autofill::SaveCardBubbleControllerImpl* controller =
       autofill::SaveCardBubbleControllerImpl::FromWebContents(web_contents());
-  controller->SetCallback(save_card_callback);
+  controller->SetCallback(callback);
   controller->ShowBubble();
 #else
   AutofillCCInfoBarDelegate::Create(
-      InfoBarService::FromWebContents(web_contents()), this,
-      save_card_callback);
+      InfoBarService::FromWebContents(web_contents()), this, callback);
 #endif
 }
 
+void ChromeAutofillClient::ConfirmSaveCreditCardToCloud(
+    const base::Closure& callback,
+    scoped_ptr<base::DictionaryValue> legal_message) {
+  // TODO(bondd): Implement upload UI.
+  ConfirmSaveCreditCardLocally(callback);
+}
+
+void ChromeAutofillClient::LoadRiskData(
+    const base::Callback<void(const std::string&)>& callback) {
+  ::autofill::LoadRiskData(0, web_contents(), callback);
+}
+
 bool ChromeAutofillClient::HasCreditCardScanFeature() {
   return CreditCardScannerController::HasCreditCardScanFeature();
 }
diff --git a/chrome/browser/ui/autofill/chrome_autofill_client.h b/chrome/browser/ui/autofill/chrome_autofill_client.h
index 306259a..271678e 100644
--- a/chrome/browser/ui/autofill/chrome_autofill_client.h
+++ b/chrome/browser/ui/autofill/chrome_autofill_client.h
@@ -53,8 +53,13 @@
   void ShowAutofillSettings() override;
   void ShowUnmaskPrompt(const CreditCard& card,
                         base::WeakPtr<CardUnmaskDelegate> delegate) override;
-  void OnUnmaskVerificationResult(GetRealPanResult result) override;
-  void ConfirmSaveCreditCard(const base::Closure& save_card_callback) override;
+  void OnUnmaskVerificationResult(PaymentsRpcResult result) override;
+  void ConfirmSaveCreditCardLocally(const base::Closure& callback) override;
+  void ConfirmSaveCreditCardToCloud(
+      const base::Closure& callback,
+      scoped_ptr<base::DictionaryValue> legal_message) override;
+  void LoadRiskData(
+      const base::Callback<void(const std::string&)>& callback) override;
   bool HasCreditCardScanFeature() override;
   void ScanCreditCard(const CreditCardScanCallback& callback) override;
   void ShowRequestAutocompleteDialog(
@@ -112,7 +117,7 @@
   // The last render frame that called requestAutocomplete.
   content::RenderFrameHost* last_rfh_to_rac_;
 
-  // The identity provider, used for Wallet integration.
+  // The identity provider, used for Payments integration.
   scoped_ptr<IdentityProvider> identity_provider_;
 
   DISALLOW_COPY_AND_ASSIGN(ChromeAutofillClient);
diff --git a/chrome/browser/ui/chrome_bubble_manager.cc b/chrome/browser/ui/chrome_bubble_manager.cc
index 368aff1..0c346dd 100644
--- a/chrome/browser/ui/chrome_bubble_manager.cc
+++ b/chrome/browser/ui/chrome_bubble_manager.cc
@@ -26,6 +26,9 @@
   // Extension-related bubbles:
   BUBBLE_TYPE_EXTENSION_INSTALLED = 10,  // Displayed after installing.
 
+  // Translation-related bubbles:
+  BUBBLE_TYPE_TRANSLATE = 20,  // Displays a request to translate a page.
+
   // Upper boundary for metrics.
   BUBBLE_TYPE_MAX,
 };
@@ -40,6 +43,8 @@
     bubble_type = BUBBLE_TYPE_MOCK;
   else if (bubble->GetName().compare("ExtensionInstalled") == 0)
     bubble_type = BUBBLE_TYPE_EXTENSION_INSTALLED;
+  else if (bubble->GetName().compare("TranslateBubble") == 0)
+    bubble_type = BUBBLE_TYPE_TRANSLATE;
 
   DCHECK_NE(bubble_type, BUBBLE_TYPE_UNKNOWN);
   DCHECK_NE(bubble_type, BUBBLE_TYPE_MAX);
diff --git a/chrome/browser/ui/chrome_pages.cc b/chrome/browser/ui/chrome_pages.cc
index 448d16f5..35609ea 100644
--- a/chrome/browser/ui/chrome_pages.cc
+++ b/chrome/browser/ui/chrome_pages.cc
@@ -129,6 +129,11 @@
 #endif
 }
 
+std::string GenerateContentSettingsExceptionsSubPage(ContentSettingsType type) {
+  return kContentSettingsExceptionsSubPage + std::string(kHashMark) +
+         options::ContentSettingsHandler::ContentSettingsTypeToGroupName(type);
+}
+
 }  // namespace
 
 void ShowBookmarkManager(Browser* browser) {
@@ -298,10 +303,15 @@
 void ShowContentSettingsExceptions(Browser* browser,
                                    ContentSettingsType content_settings_type) {
   ShowSettingsSubPage(
-      browser,
-      kContentSettingsExceptionsSubPage + std::string(kHashMark) +
-          options::ContentSettingsHandler::ContentSettingsTypeToGroupName(
-              content_settings_type));
+      browser, GenerateContentSettingsExceptionsSubPage(content_settings_type));
+}
+
+void ShowContentSettingsExceptionsInWindow(
+    Profile* profile,
+    ContentSettingsType content_settings_type) {
+  DCHECK(switches::SettingsWindowEnabled());
+  ShowSettingsSubPageForProfile(
+      profile, GenerateContentSettingsExceptionsSubPage(content_settings_type));
 }
 
 void ShowContentSettings(Browser* browser,
diff --git a/chrome/browser/ui/chrome_pages.h b/chrome/browser/ui/chrome_pages.h
index 070f1ab6..72f4e030 100644
--- a/chrome/browser/ui/chrome_pages.h
+++ b/chrome/browser/ui/chrome_pages.h
@@ -77,6 +77,9 @@
                                    const std::string& sub_page);
 void ShowContentSettingsExceptions(Browser* browser,
                                    ContentSettingsType content_settings_type);
+void ShowContentSettingsExceptionsInWindow(
+    Profile* profile,
+    ContentSettingsType content_settings_type);
 void ShowContentSettings(Browser* browser,
                          ContentSettingsType content_settings_type);
 void ShowSettingsSubPageInTabbedBrowser(Browser* browser,
diff --git a/chrome/browser/ui/cocoa/wrench_menu/wrench_menu_controller.h b/chrome/browser/ui/cocoa/app_menu/app_menu_controller.h
similarity index 76%
rename from chrome/browser/ui/cocoa/wrench_menu/wrench_menu_controller.h
rename to chrome/browser/ui/cocoa/app_menu/app_menu_controller.h
index ce6138d9..be0d315 100644
--- a/chrome/browser/ui/cocoa/wrench_menu/wrench_menu_controller.h
+++ b/chrome/browser/ui/cocoa/app_menu/app_menu_controller.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_UI_COCOA_WRENCH_MENU_WRENCH_MENU_CONTROLLER_H_
-#define CHROME_BROWSER_UI_COCOA_WRENCH_MENU_WRENCH_MENU_CONTROLLER_H_
+#ifndef CHROME_BROWSER_UI_COCOA_APP_MENU_APP_MENU_CONTROLLER_H_
+#define CHROME_BROWSER_UI_COCOA_APP_MENU_APP_MENU_CONTROLLER_H_
 
 #import <Cocoa/Cocoa.h>
 
@@ -20,33 +20,33 @@
 @class MenuTrackedRootView;
 class RecentTabsMenuModelDelegate;
 @class ToolbarController;
-@class WrenchMenuButtonViewController;
+@class AppMenuButtonViewController;
 class AppMenuModel;
 
-namespace wrench_menu_controller {
-// The vertical offset of the wrench bubbles from the wrench menu button.
-extern const CGFloat kWrenchBubblePointOffsetY;
+namespace app_menu_controller {
+// The vertical offset of the app menu bubbles from the app menu button.
+extern const CGFloat kAppMenuBubblePointOffsetY;
 }
 
-namespace WrenchMenuControllerInternal {
+namespace AppMenuControllerInternal {
 class AcceleratorDelegate;
 class ToolbarActionsBarObserverHelper;
 class ZoomLevelObserver;
-}  // namespace WrenchMenuControllerInternal
+}  // namespace AppMenuControllerInternal
 
-// The Wrench menu has a creative layout, with buttons in menu items. There is
-// a cross-platform model for this special menu, but on the Mac it's easier to
+// The App menu has a creative layout, with buttons in menu items. There is a
+// cross-platform model for this special menu, but on the Mac it's easier to
 // get spacing and alignment precisely right using a NIB. To do that, we
 // subclass the generic MenuController implementation and special-case the two
 // items that require specific layout and load them from the NIB.
 //
 // This object is owned by the ToolbarController and receives its NIB-based
 // views using the shim view controller below.
-@interface WrenchMenuController
+@interface AppMenuController
     : MenuController<NSMenuDelegate, HasWeakBrowserPointer> {
  @private
   // Used to provide accelerators for the menu.
-  scoped_ptr<WrenchMenuControllerInternal::AcceleratorDelegate>
+  scoped_ptr<AppMenuControllerInternal::AcceleratorDelegate>
       acceleratorDelegate_;
 
   // The model, rebuilt each time the |-menuNeedsUpdate:|.
@@ -58,7 +58,7 @@
 
   // A shim NSViewController that loads the buttons from the NIB because ObjC
   // doesn't have multiple inheritance as this class is a MenuController.
-  base::scoped_nsobject<WrenchMenuButtonViewController> buttonViewController_;
+  base::scoped_nsobject<AppMenuButtonViewController> buttonViewController_;
 
   // The browser for which this controller exists.
   Browser* browser_;  // weak
@@ -67,15 +67,15 @@
   scoped_ptr<BookmarkMenuBridge> bookmarkMenuBridge_;
 
   // Observer for page zoom level change notifications.
-  scoped_ptr<WrenchMenuControllerInternal::ZoomLevelObserver>
+  scoped_ptr<AppMenuControllerInternal::ZoomLevelObserver>
       zoom_level_observer_;
 
   // Observer for the main window's ToolbarActionsBar changing size.
-  scoped_ptr<WrenchMenuControllerInternal::ToolbarActionsBarObserverHelper>
+  scoped_ptr<AppMenuControllerInternal::ToolbarActionsBarObserverHelper>
       toolbar_actions_bar_observer_;
 
   // The controller for the toolbar actions overflow that is stored in the
-  // wrench menu.
+  // app menu.
   // This will only be present if the extension action redesign switch is on.
   base::scoped_nsobject<BrowserActionsController> browserActionsController_;
 
@@ -86,11 +86,11 @@
 // Designated initializer.
 - (id)initWithBrowser:(Browser*)browser;
 
-// Used to dispatch commands from the Wrench menu. The custom items within the
+// Used to dispatch commands from the App menu. The custom items within the
 // menu cannot be hooked up directly to First Responder because the window in
 // which the controls reside is not the BrowserWindowController, but a
 // NSCarbonMenuWindow; this screws up the typical |-commandDispatch:| system.
-- (IBAction)dispatchWrenchMenuCommand:(id)sender;
+- (IBAction)dispatchAppMenuCommand:(id)sender;
 
 // Returns the weak reference to the AppMenuModel.
 - (AppMenuModel*)appMenuModel;
@@ -110,9 +110,9 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 // Shim view controller that merely unpacks objects from a NIB.
-@interface WrenchMenuButtonViewController : NSViewController {
+@interface AppMenuButtonViewController : NSViewController {
  @private
-  WrenchMenuController* controller_;
+  AppMenuController* controller_;
 
   MenuTrackedRootView* editItem_;
   NSButton* editCut_;
@@ -145,9 +145,9 @@
 @property(retain, nonatomic)
     IBOutlet BrowserActionsContainerView* overflowActionsContainerView;
 
-- (id)initWithController:(WrenchMenuController*)controller;
-- (IBAction)dispatchWrenchMenuCommand:(id)sender;
+- (id)initWithController:(AppMenuController*)controller;
+- (IBAction)dispatchAppMenuCommand:(id)sender;
 
 @end
 
-#endif  // CHROME_BROWSER_UI_COCOA_WRENCH_MENU_WRENCH_MENU_CONTROLLER_H_
+#endif  // CHROME_BROWSER_UI_COCOA_APP_MENU_APP_MENU_CONTROLLER_H_
diff --git a/chrome/browser/ui/cocoa/wrench_menu/wrench_menu_controller.mm b/chrome/browser/ui/cocoa/app_menu/app_menu_controller.mm
similarity index 91%
rename from chrome/browser/ui/cocoa/wrench_menu/wrench_menu_controller.mm
rename to chrome/browser/ui/cocoa/app_menu/app_menu_controller.mm
index d3ca091..7119c25 100644
--- a/chrome/browser/ui/cocoa/wrench_menu/wrench_menu_controller.mm
+++ b/chrome/browser/ui/cocoa/app_menu/app_menu_controller.mm
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#import "chrome/browser/ui/cocoa/wrench_menu/wrench_menu_controller.h"
+#import "chrome/browser/ui/cocoa/app_menu/app_menu_controller.h"
 
 #include "base/basictypes.h"
 #include "base/mac/bundle_locations.h"
@@ -50,13 +50,13 @@
 const int kMaxOverflowContainerHeight = 416;
 }
 
-namespace wrench_menu_controller {
-const CGFloat kWrenchBubblePointOffsetY = 6;
+namespace app_menu_controller {
+const CGFloat kAppMenuBubblePointOffsetY = 6;
 }
 
 using base::UserMetricsAction;
 
-@interface WrenchMenuController (Private)
+@interface AppMenuController (Private)
 - (void)createModel;
 - (void)adjustPositioning;
 - (void)performCommandDispatch:(NSNumber*)tag;
@@ -69,9 +69,9 @@
                  modelIndex:(int)modelIndex;
 @end
 
-namespace WrenchMenuControllerInternal {
+namespace AppMenuControllerInternal {
 
-// A C++ delegate that handles the accelerators in the wrench menu.
+// A C++ delegate that handles the accelerators in the app menu.
 class AcceleratorDelegate : public ui::AcceleratorProvider {
  public:
   bool GetAcceleratorForCommandId(int command_id,
@@ -88,7 +88,7 @@
 
 class ZoomLevelObserver {
  public:
-  ZoomLevelObserver(WrenchMenuController* controller,
+  ZoomLevelObserver(AppMenuController* controller,
                     ui_zoom::ZoomEventManager* manager)
       : controller_(controller) {
     subscription_ = manager->AddZoomLevelChangedCallback(
@@ -109,14 +109,14 @@
 
   scoped_ptr<content::HostZoomMap::Subscription> subscription_;
 
-  WrenchMenuController* controller_;  // Weak; owns this.
+  AppMenuController* controller_;  // Weak; owns this.
 
   DISALLOW_COPY_AND_ASSIGN(ZoomLevelObserver);
 };
 
 class ToolbarActionsBarObserverHelper : public ToolbarActionsBarObserver {
  public:
-  ToolbarActionsBarObserverHelper(WrenchMenuController* controller,
+  ToolbarActionsBarObserverHelper(AppMenuController* controller,
                                   ToolbarActionsBar* toolbar_actions_bar)
       : controller_(controller),
         scoped_observer_(this) {
@@ -133,21 +133,21 @@
     [controller_ updateBrowserActionsSubmenu];
   }
 
-  WrenchMenuController* controller_;
+  AppMenuController* controller_;
   ScopedObserver<ToolbarActionsBar, ToolbarActionsBarObserver> scoped_observer_;
 
   DISALLOW_COPY_AND_ASSIGN(ToolbarActionsBarObserverHelper);
 };
 
-}  // namespace WrenchMenuControllerInternal
+}  // namespace AppMenuControllerInternal
 
-@implementation WrenchMenuController
+@implementation AppMenuController
 
 - (id)initWithBrowser:(Browser*)browser {
   if ((self = [super init])) {
     browser_ = browser;
     acceleratorDelegate_.reset(
-        new WrenchMenuControllerInternal::AcceleratorDelegate());
+        new AppMenuControllerInternal::AcceleratorDelegate());
     [self createModel];
   }
   return self;
@@ -204,8 +204,8 @@
 
       // The overflow browser actions container can't function properly without
       // a main counterpart, so if the browser window hasn't initialized, abort.
-      // (This is fine because we re-populate the wrench menu each time before
-      // we show it.)
+      // (This is fine because we re-populate the app menu each time before we
+      // show it.)
       if (!browser_->window())
         break;
 
@@ -214,7 +214,7 @@
               window()->GetNativeWindow()] toolbarController]
                   browserActionsController];
       toolbar_actions_bar_observer_.reset(
-          new WrenchMenuControllerInternal::ToolbarActionsBarObserverHelper(
+          new AppMenuControllerInternal::ToolbarActionsBarObserverHelper(
               self, [mainController toolbarActionsBar]));
       browserActionsController_.reset(
           [[BrowserActionsController alloc]
@@ -333,7 +333,7 @@
   [super menuWillOpen:menu];
 
   zoom_level_observer_.reset(
-      new WrenchMenuControllerInternal::ZoomLevelObserver(
+      new AppMenuControllerInternal::ZoomLevelObserver(
           self,
           ui_zoom::ZoomEventManager::GetForBrowserContext(
               browser_->profile())));
@@ -379,11 +379,11 @@
   [self updateBrowserActionsSubmenu];
 }
 
-// Used to dispatch commands from the Wrench menu. The custom items within the
+// Used to dispatch commands from the App menu. The custom items within the
 // menu cannot be hooked up directly to First Responder because the window in
 // which the controls reside is not the BrowserWindowController, but a
 // NSCarbonMenuWindow; this screws up the typical |-commandDispatch:| system.
-- (IBAction)dispatchWrenchMenuCommand:(id)sender {
+- (IBAction)dispatchAppMenuCommand:(id)sender {
   NSInteger tag = [sender tag];
   if (sender == [buttonViewController_ zoomPlus] ||
       sender == [buttonViewController_ zoomMinus]) {
@@ -397,8 +397,8 @@
       [menu_ cancelTracking];
     }
   } else {
-    // The custom views within the Wrench menu are abnormal and keep the menu
-    // open after a target-action.  Close the menu manually.
+    // The custom views within the App menu are abnormal and keep the menu open
+    // after a target-action.  Close the menu manually.
     [menu_ cancelTracking];
 
     // Executing certain commands from the nested run loop of the menu can lead
@@ -439,7 +439,7 @@
   [self setModel:appMenuModel_.get()];
 
   buttonViewController_.reset(
-      [[WrenchMenuButtonViewController alloc] initWithController:self]);
+      [[AppMenuButtonViewController alloc] initWithController:self]);
   [buttonViewController_ view];
 
   // See comment in containerSuperviewFrameChanged:.
@@ -521,8 +521,8 @@
 // kRecentlyClosedHeaderCommandId or the kDisabledRecentlyClosedHeaderCommandId.
 - (RecentTabsSubMenuModel*)recentTabsMenuModel {
   int index = 0;
-  // Start searching at the wrench menu model level, |model| will be updated
-  // only if the command we're looking for is found in one of the [sub]menus.
+  // Start searching at the app menu model level, |model| will be updated only
+  // if the command we're looking for is found in one of the [sub]menus.
   ui::MenuModel* model = [self appMenuModel];
   if (ui::MenuModel::GetModelAndIndexForCommandId(
           RecentTabsSubMenuModel::kRecentlyClosedHeaderCommandId, &model,
@@ -548,15 +548,15 @@
   return -1;
 }
 
-@end  // @implementation WrenchMenuController
+@end  // @implementation AppMenuController
 
 ////////////////////////////////////////////////////////////////////////////////
 
-@interface WrenchMenuButtonViewController ()
+@interface AppMenuButtonViewController ()
 - (void)containerSuperviewFrameChanged:(NSNotification*)notification;
 @end
 
-@implementation WrenchMenuButtonViewController
+@implementation AppMenuButtonViewController
 
 @synthesize editItem = editItem_;
 @synthesize editCut = editCut_;
@@ -570,10 +570,10 @@
 @synthesize toolbarActionsOverflowItem = toolbarActionsOverflowItem_;
 @synthesize overflowActionsContainerView = overflowActionsContainerView_;
 
-- (id)initWithController:(WrenchMenuController*)controller {
+- (id)initWithController:(AppMenuController*)controller {
   if ((self = [super initWithNibName:@"WrenchMenu"
                               bundle:base::mac::FrameworkBundle()])) {
-    propertyReleaser_.Init(self, [WrenchMenuButtonViewController class]);
+    propertyReleaser_.Init(self, [AppMenuButtonViewController class]);
     controller_ = controller;
     [[NSNotificationCenter defaultCenter]
         addObserver:self
@@ -589,8 +589,8 @@
   [super dealloc];
 }
 
-- (IBAction)dispatchWrenchMenuCommand:(id)sender {
-  [controller_ dispatchWrenchMenuCommand:sender];
+- (IBAction)dispatchAppMenuCommand:(id)sender {
+  [controller_ dispatchAppMenuCommand:sender];
 }
 
 - (void)containerSuperviewFrameChanged:(NSNotification*)notification {
@@ -607,4 +607,4 @@
     [containerSuperview setFrameOrigin:NSZeroPoint];
 }
 
-@end  // @implementation WrenchMenuButtonViewController
+@end  // @implementation AppMenuButtonViewController
diff --git a/chrome/browser/ui/cocoa/wrench_menu/wrench_menu_controller_unittest.mm b/chrome/browser/ui/cocoa/app_menu/app_menu_controller_unittest.mm
similarity index 90%
rename from chrome/browser/ui/cocoa/wrench_menu/wrench_menu_controller_unittest.mm
rename to chrome/browser/ui/cocoa/app_menu/app_menu_controller_unittest.mm
index 3e00ef63..d7120e8 100644
--- a/chrome/browser/ui/cocoa/wrench_menu/wrench_menu_controller_unittest.mm
+++ b/chrome/browser/ui/cocoa/app_menu/app_menu_controller_unittest.mm
@@ -11,11 +11,11 @@
 #include "chrome/browser/sync/profile_sync_service_factory.h"
 #include "chrome/browser/ui/browser_list.h"
 #include "chrome/browser/ui/browser_list_observer.h"
+#import "chrome/browser/ui/cocoa/app_menu/app_menu_controller.h"
 #include "chrome/browser/ui/cocoa/cocoa_profile_test.h"
 #include "chrome/browser/ui/cocoa/run_loop_testing.h"
 #import "chrome/browser/ui/cocoa/toolbar/toolbar_controller.h"
 #import "chrome/browser/ui/cocoa/view_resizer_pong.h"
-#import "chrome/browser/ui/cocoa/wrench_menu/wrench_menu_controller.h"
 #include "chrome/browser/ui/sync/browser_synced_window_delegates_getter.h"
 #include "chrome/browser/ui/toolbar/app_menu_model.h"
 #include "chrome/browser/ui/toolbar/recent_tabs_builder_test_helper.h"
@@ -56,12 +56,11 @@
   void Stop() override {}
 };
 
-class WrenchMenuControllerTest
-    : public CocoaProfileTest {
+class AppMenuControllerTest : public CocoaProfileTest {
  public:
-  WrenchMenuControllerTest()
+  AppMenuControllerTest()
       : local_device_(new sync_driver::LocalDeviceInfoProviderMock(
-            "WrenchMenuControllerTest",
+            "AppMenuControllerTest",
             "Test Machine",
             "Chromium 10k",
             "Chrome 10k",
@@ -73,7 +72,7 @@
     CocoaProfileTest::SetUp();
     ASSERT_TRUE(browser());
 
-    controller_.reset([[WrenchMenuController alloc] initWithBrowser:browser()]);
+    controller_.reset([[AppMenuController alloc] initWithBrowser:browser()]);
     fake_model_.reset(new MockAppMenuModel);
 
     sync_prefs_.reset(new sync_driver::SyncPrefs(profile()->GetPrefs()));
@@ -108,11 +107,11 @@
     CocoaProfileTest::TearDown();
   }
 
-  WrenchMenuController* controller() {
+  AppMenuController* controller() {
     return controller_.get();
   }
 
-  base::scoped_nsobject<WrenchMenuController> controller_;
+  base::scoped_nsobject<AppMenuController> controller_;
 
   scoped_ptr<MockAppMenuModel> fake_model_;
 
@@ -122,12 +121,12 @@
   scoped_ptr<sync_driver::LocalDeviceInfoProviderMock> local_device_;
 };
 
-TEST_F(WrenchMenuControllerTest, Initialized) {
+TEST_F(AppMenuControllerTest, Initialized) {
   EXPECT_TRUE([controller() menu]);
   EXPECT_GE([[controller() menu] numberOfItems], 5);
 }
 
-TEST_F(WrenchMenuControllerTest, DispatchSimple) {
+TEST_F(AppMenuControllerTest, DispatchSimple) {
   base::scoped_nsobject<NSButton> button([[NSButton alloc] init]);
   [button setTag:IDC_ZOOM_PLUS];
 
@@ -135,11 +134,11 @@
   EXPECT_CALL(*fake_model_, ExecuteCommand(IDC_ZOOM_PLUS, 0));
   [controller() setModel:fake_model_.get()];
 
-  [controller() dispatchWrenchMenuCommand:button.get()];
+  [controller() dispatchAppMenuCommand:button.get()];
   chrome::testing::NSRunLoopRunAllPending();
 }
 
-TEST_F(WrenchMenuControllerTest, RecentTabsFavIcon) {
+TEST_F(AppMenuControllerTest, RecentTabsFavIcon) {
   RecentTabsBuilderTestHelper recent_tabs_builder;
   recent_tabs_builder.AddSession();
   recent_tabs_builder.AddWindow(0);
@@ -174,7 +173,7 @@
   fake_model_.reset();
 }
 
-TEST_F(WrenchMenuControllerTest, RecentTabsElideTitle) {
+TEST_F(AppMenuControllerTest, RecentTabsElideTitle) {
   // Add 1 session with 1 window and 2 tabs.
   RecentTabsBuilderTestHelper recent_tabs_builder;
   recent_tabs_builder.AddSession();
@@ -238,7 +237,7 @@
 
 // Verify that |RecentTabsMenuModelDelegate| is deleted before the model
 // it's observing.
-TEST_F(WrenchMenuControllerTest, RecentTabDeleteOrder) {
+TEST_F(AppMenuControllerTest, RecentTabDeleteOrder) {
   [controller_ menuNeedsUpdate:[controller_ menu]];
   // If the delete order is wrong then the test will crash on exit.
 }
@@ -256,10 +255,10 @@
   DISALLOW_COPY_AND_ASSIGN(BrowserRemovedObserver);
 };
 
-// Test that WrenchMenuController can be destroyed after the Browser.
-// This can happen because the WrenchMenuController's owner (ToolbarController)
+// Test that AppMenuController can be destroyed after the Browser.
+// This can happen because the AppMenuController's owner (ToolbarController)
 // can outlive the Browser.
-TEST_F(WrenchMenuControllerTest, DestroyedAfterBrowser) {
+TEST_F(AppMenuControllerTest, DestroyedAfterBrowser) {
   BrowserRemovedObserver observer;
   // This is normally called by ToolbarController, but since |controller_| is
   // not owned by one, call it here.
diff --git a/chrome/browser/ui/cocoa/browser_window_controller_private.mm b/chrome/browser/ui/cocoa/browser_window_controller_private.mm
index 45181c7..7d04649 100644
--- a/chrome/browser/ui/cocoa/browser_window_controller_private.mm
+++ b/chrome/browser/ui/cocoa/browser_window_controller_private.mm
@@ -100,6 +100,14 @@
 
 }  // namespace
 
+@interface NSWindow (NSPrivateApis)
+// Note: These functions are private, use -[NSObject respondsToSelector:]
+// before calling them.
+
+- (NSWindow*)_windowForToolbar;
+
+@end
+
 @implementation BrowserWindowController(Private)
 
 // Create the tab strip controller.
@@ -712,7 +720,12 @@
     for (NSWindow* window in [[NSApplication sharedApplication] windows]) {
       if ([window
               isKindOfClass:NSClassFromString(@"NSToolbarFullScreenWindow")]) {
-        [[window contentView] setHidden:YES];
+        // Hide the toolbar if it is for a FramedBrowserWindow.
+        if ([window respondsToSelector:@selector(_windowForToolbar)]) {
+          if ([[window _windowForToolbar]
+                  isKindOfClass:[FramedBrowserWindow class]])
+            [[window contentView] setHidden:YES];
+        }
       }
     }
   }
@@ -1112,14 +1125,13 @@
 }
 
 - (BOOL)shouldUseCustomAppKitFullscreenTransition:(BOOL)enterFullScreen {
-  // We are temporary disabling exit fullscreen animation because it only
-  // works on OSX 10.10.
-  // TODO(spqchan): Fix exit fullscreen animation so that it works on all
-  // OSX versions.
-  if (!enterFullScreen)
+  // Custom fullscreen transitions should only be available in OSX 10.10+.
+  if (base::mac::IsOSMountainLionOrEarlier())
     return NO;
 
-  if (base::mac::IsOSMountainLionOrEarlier())
+  // Disable the custom exit animation in OSX 10.9:
+  // https://code.google.com/p/chromium/issues/detail?id=526327#c3.
+  if (base::mac::IsOSMavericks() && !enterFullScreen)
     return NO;
 
   NSView* root = [[self.window contentView] superview];
@@ -1164,8 +1176,9 @@
   FramedBrowserWindow* framedBrowserWindow =
       base::mac::ObjCCast<FramedBrowserWindow>([self window]);
   fullscreenTransition_.reset([[BrowserWindowFullscreenTransition alloc]
-      initExitWithWindow:framedBrowserWindow
-                   frame:savedRegularWindowFrame_]);
+          initExitWithWindow:framedBrowserWindow
+                       frame:savedRegularWindowFrame_
+      tabStripBackgroundView:[self tabStripBackgroundView]]);
 
   NSArray* customWindows =
       [fullscreenTransition_ customWindowsForFullScreenTransition];
diff --git a/chrome/browser/ui/cocoa/browser_window_fullscreen_transition.h b/chrome/browser/ui/cocoa/browser_window_fullscreen_transition.h
index 509671e..332bd94 100644
--- a/chrome/browser/ui/cocoa/browser_window_fullscreen_transition.h
+++ b/chrome/browser/ui/cocoa/browser_window_fullscreen_transition.h
@@ -102,7 +102,8 @@
 // using |frame| as the frame that |window| is going to transition into.
 - (instancetype)initEnterWithWindow:(FramedBrowserWindow*)window;
 - (instancetype)initExitWithWindow:(FramedBrowserWindow*)window
-                             frame:(NSRect)frame;
+                             frame:(NSRect)frame
+            tabStripBackgroundView:(NSView*)view;
 
 // Returns the windows to be used in the custom fullscreen transition.
 - (NSArray*)customWindowsForFullScreenTransition;
diff --git a/chrome/browser/ui/cocoa/browser_window_fullscreen_transition.mm b/chrome/browser/ui/cocoa/browser_window_fullscreen_transition.mm
index e0ac0bc..e3f0291a 100644
--- a/chrome/browser/ui/cocoa/browser_window_fullscreen_transition.mm
+++ b/chrome/browser/ui/cocoa/browser_window_fullscreen_transition.mm
@@ -12,6 +12,7 @@
 #import "base/mac/sdk_forward_declarations.h"
 #include "base/memory/scoped_ptr.h"
 #import "chrome/browser/ui/cocoa/framed_browser_window.h"
+#import "chrome/browser/ui/cocoa/tabs/tab_strip_background_view.h"
 
 namespace {
 
@@ -19,6 +20,10 @@
 NSString* const kSnapshotWindowAnimationID = @"SnapshotWindowAnimationID";
 NSString* const kAnimationIDKey = @"AnimationIDKey";
 
+// The fraction of the duration from AppKit's startCustomAnimation methods
+// that we want our animation to run in.
+CGFloat const kAnimationDurationFraction = 0.5;
+
 // This class has two simultaneous animations to resize and reposition layers.
 // These animations must use the same timing function, otherwise there will be
 // visual discordance.
@@ -34,7 +39,7 @@
 
   ~FrameAndStyleLock() { set_lock(NO); }
 
-  void set_lock(bool lock) { [window_ setFrameAndStyleMaskLock:lock]; }
+  void set_lock(bool lock) { [window_ setStyleMaskLock:lock]; }
 
  private:
   FramedBrowserWindow* window_;  // weak
@@ -44,6 +49,40 @@
 
 }  // namespace
 
+// This view draws a dummy toolbar over the resized content view during
+// the exit fullscreen animation. It is removed at the end of the animation.
+@interface FullscreenTabStripBackgroundView : NSView {
+  base::scoped_nsobject<NSColor> windowBackgroundColor_;
+}
+
+- (instancetype)initWithFrame:(NSRect)frame background:(NSColor*)color;
+
+@end
+
+@implementation FullscreenTabStripBackgroundView
+
+- (instancetype)initWithFrame:(NSRect)frame background:(NSColor*)color {
+  if ((self = [super initWithFrame:frame])) {
+    windowBackgroundColor_.reset([color copy]);
+  }
+  return self;
+}
+
+// Override this method so that we can paint the toolbar in this view.
+// This method first fill itself with the toolbar's background. After that,
+// it will paint the window's theme if applicable.
+- (void)drawRect:(NSRect)frame {
+  [windowBackgroundColor_ set];
+  NSRectFillUsingOperation(frame, NSCompositeDestinationOver);
+
+  [FramedBrowserWindow drawWindowThemeInDirtyRect:frame
+                                          forView:self
+                                           bounds:[self bounds]
+                             forceBlackBackground:NO];
+}
+
+@end
+
 @interface BrowserWindowFullscreenTransition () {
   // Flag to keep track of whether we are entering or exiting fullscreen.
   BOOL isEnteringFullscreen_;
@@ -57,12 +96,26 @@
   // A temporary window that holds |snapshotLayer_|.
   base::scoped_nsobject<NSWindow> snapshotWindow_;
 
+  // The tabstrip background view in the window. During the exit fullscreen
+  // animation, this view be hidden while a dummy tabstrip background will be
+  // drawn over the content view.
+  base::scoped_nsobject<NSView> tabStripBackgroundView_;
+
   // The background color of |primaryWindow_| before the transition began.
   base::scoped_nsobject<NSColor> primaryWindowInitialBackgroundColor_;
 
   // Whether |primaryWindow_| was opaque before the transition began.
   BOOL primaryWindowInitialOpaque_;
 
+  // The initial anchor point of the root layer.
+  CGPoint initialRootAnchorPoint_;
+
+  // The initial origin of the content view.
+  NSPoint initialContentViewOrigin_;
+
+  // The initial value of the content view's autoresizeSubviews property.
+  BOOL initialContentViewAutoresizesSubviews_;
+
   // Whether the instance is in the process of changing the size of
   // |primaryWindow_|.
   BOOL changingPrimaryWindowSize_;
@@ -74,6 +127,10 @@
   // is finished.
   NSRect finalFrame_;
 
+  // This view draws the tabstrip background during the exit animation.
+  base::scoped_nsobject<FullscreenTabStripBackgroundView>
+      fullscreenTabStripBackgroundView_;
+
   // Locks and unlocks the FullSizeContentWindow.
   scoped_ptr<FrameAndStyleLock> lock_;
 }
@@ -139,12 +196,13 @@
 }
 
 - (instancetype)initExitWithWindow:(FramedBrowserWindow*)window
-                             frame:(NSRect)frame {
+                             frame:(NSRect)frame
+            tabStripBackgroundView:(NSView*)view {
   DCHECK(window);
   DCHECK([self rootLayerOfWindow:window]);
   if ((self = [super init])) {
     primaryWindow_.reset([window retain]);
-
+    tabStripBackgroundView_.reset([view retain]);
     isEnteringFullscreen_ = NO;
     finalFrame_ = frame;
     initialFrame_ = [[primaryWindow_ screen] frame];
@@ -161,9 +219,10 @@
 }
 
 - (void)startCustomFullScreenAnimationWithDuration:(NSTimeInterval)duration {
+  CGFloat animationDuration = duration * kAnimationDurationFraction;
   [self preparePrimaryWindowForAnimation];
-  [self animatePrimaryWindowWithDuration:duration];
-  [self animateSnapshotWindowWithDuration:duration];
+  [self animatePrimaryWindowWithDuration:animationDuration];
+  [self animateSnapshotWindowWithDuration:animationDuration];
 }
 
 - (BOOL)shouldWindowBeUnconstrained {
@@ -210,6 +269,12 @@
   NSRect snapshotLayerFrame =
       [snapshotWindow_ convertRectFromScreen:[primaryWindow_ frame]];
   [snapshotLayer_ setFrame:snapshotLayerFrame];
+
+  // If the primary window is in fullscreen mode, we can't move the snapshot
+  // window in front of it. As a result, at the beginning of the transition to
+  // exit fullscreen, we should order the snapshot window to the front ASAP.
+  if (isEnteringFullscreen_)
+    [snapshotWindow_ orderFront:nil];
 }
 
 - (void)preparePrimaryWindowForAnimation {
@@ -222,35 +287,81 @@
   // resized, since resizing the window will call drawRect: and cause content
   // to flash over the entire screen.
   [primaryWindow_ setOpaque:NO];
-  CALayer* root = [self rootLayerOfWindow:primaryWindow_];
-  root.opacity = 0;
 
   if (isEnteringFullscreen_) {
     // As soon as the style mask includes the flag NSFullScreenWindowMask, the
     // window is expected to receive fullscreen layout. This must be set before
     // the window is resized, as that causes a relayout.
+
+    CALayer* root = [self rootLayerOfWindow:primaryWindow_];
+    root.opacity = 0;
+
     [primaryWindow_
         setStyleMask:[primaryWindow_ styleMask] | NSFullScreenWindowMask];
     [self changePrimaryWindowToFinalFrame];
   } else {
-    // Set the size of the root layer to the size of the final frame. The root
-    // layer is placed at position (0, 0) because the animation will take care
-    // of the layer's start and end position.
-    root.frame =
-        NSMakeRect(0, 0, finalFrame_.size.width, finalFrame_.size.height);
+    [snapshotWindow_ orderFront:nil];
+
+    NSView* contentView = [primaryWindow_ contentView];
+    NSView* rootView = [contentView superview];
+
+    // Since only the content view is resized, the window's background
+    // must be transparent. This is a hack that forces the layer to remove
+    // the textured background and replace it with clearColor.
+    [rootView setWantsLayer:NO];
+    [primaryWindow_ setBackgroundColor:[NSColor clearColor]];
+    [primaryWindow_ setStyleMask:[primaryWindow_ styleMask] &
+                                 ~NSTexturedBackgroundWindowMask];
+    [rootView setWantsLayer:YES];
+
+    CALayer* root = [self rootLayerOfWindow:primaryWindow_];
+    root.opacity = 0;
 
     // Right before the animation begins, change the contentView size to the
     // expected size at the end of the animation. Afterwards, lock the
     // |primaryWindow_| so that AppKit will not be able to make unwanted
     // changes to it during the animation.
-    [primaryWindow_ forceContentViewSize:finalFrame_.size];
+    initialContentViewOrigin_ = [[primaryWindow_ contentView] frame].origin;
+    initialRootAnchorPoint_ = root.anchorPoint;
+
+    NSPoint contentViewOrigin =
+        [self pointRelativeToCurrentScreen:finalFrame_.origin];
+    NSRect relativeContentFinalFrame =
+        NSMakeRect(contentViewOrigin.x, contentViewOrigin.y,
+                   finalFrame_.size.width, finalFrame_.size.height);
+    [primaryWindow_ forceContentViewFrame:relativeContentFinalFrame];
+
+    // In OSX 10.11, when the NSFullScreenWindowMask is added or removed,
+    // the window's frame and layer changes slightly which causes a janky
+    // movement. As a result, we should disable the content view's autoresize
+    // at the beginning of the animation and set it back to its original value
+    // at the end of the animation.
+    initialContentViewAutoresizesSubviews_ = [contentView autoresizesSubviews];
+    [contentView setAutoresizesSubviews:NO];
+
+    fullscreenTabStripBackgroundView_.reset(
+        [[FullscreenTabStripBackgroundView alloc]
+            initWithFrame:finalFrame_
+               background:primaryWindowInitialBackgroundColor_]);
+    [fullscreenTabStripBackgroundView_ setFrameOrigin:NSZeroPoint];
+    [contentView addSubview:fullscreenTabStripBackgroundView_.get()
+                 positioned:NSWindowBelow
+                 relativeTo:nil];
+
+    [tabStripBackgroundView_ setHidden:YES];
+
+    // Set anchor point to be the center of the content view
+    CGFloat anchorPointX =
+        NSMidX(relativeContentFinalFrame) / NSWidth(initialFrame_);
+    CGFloat anchorPointY =
+        NSMidY(relativeContentFinalFrame) / NSHeight(initialFrame_);
+    root.anchorPoint = CGPointMake(anchorPointX, anchorPointY);
+
     lock_->set_lock(YES);
   }
 }
 
 - (void)animateSnapshotWindowWithDuration:(CGFloat)duration {
-  [snapshotWindow_ orderFront:nil];
-
   // Calculate the frame so that it's relative to the screen.
   NSRect finalFrameRelativeToScreen =
       [snapshotWindow_ convertRectFromScreen:finalFrame_];
@@ -325,15 +436,10 @@
       [self pointRelativeToCurrentScreen:centerOfInitialFrame];
   positionAnimation.fromValue = [NSValue valueWithPoint:startingLayerPoint];
 
-  // Since the root layer's frame is different from the window, AppKit might
-  // animate it to a different position if we have multiple windows in
-  // fullscreen. This ensures that the animation moves to the correct position.
-  CGFloat anchorPointX = NSWidth(endFrame) / 2;
-  CGFloat anchorPointY = NSHeight(endFrame) / 2;
-  NSPoint endLayerPoint = [self pointRelativeToCurrentScreen:endFrame.origin];
-  positionAnimation.toValue =
-      [NSValue valueWithPoint:NSMakePoint(endLayerPoint.x + anchorPointX,
-                                          endLayerPoint.y + anchorPointY)];
+  NSPoint endingLayerPoint =
+      [self pointRelativeToCurrentScreen:NSMakePoint(NSMidX(endFrame),
+                                                     NSMidY(endFrame))];
+  positionAnimation.toValue = [NSValue valueWithPoint:endingLayerPoint];
 
   CAAnimationGroup* group = [CAAnimationGroup animation];
   group.removedOnCompletion = NO;
@@ -373,9 +479,22 @@
     // lock must also be released.
     if (!isEnteringFullscreen_) {
       lock_->set_lock(NO);
-      [primaryWindow_
-          setStyleMask:[primaryWindow_ styleMask] & ~NSFullScreenWindowMask];
+
+      CALayer* root = [self rootLayerOfWindow:primaryWindow_];
+      root.anchorPoint = initialRootAnchorPoint_;
+
+      NSUInteger styleMask =
+          ([primaryWindow_ styleMask] & ~NSFullScreenWindowMask) |
+          NSTexturedBackgroundWindowMask;
+      [primaryWindow_ setStyleMask:styleMask];
+
+      NSView* content = [primaryWindow_ contentView];
+      [content setFrameOrigin:initialContentViewOrigin_];
       [self changePrimaryWindowToFinalFrame];
+      [content setAutoresizesSubviews:initialContentViewAutoresizesSubviews_];
+
+      [tabStripBackgroundView_ setHidden:NO];
+      [fullscreenTabStripBackgroundView_ removeFromSuperview];
     }
 
     // Checks if the contentView size is correct.
diff --git a/chrome/browser/ui/cocoa/extensions/browser_action_button.mm b/chrome/browser/ui/cocoa/extensions/browser_action_button.mm
index b6b9d12..92d37f29 100644
--- a/chrome/browser/ui/cocoa/extensions/browser_action_button.mm
+++ b/chrome/browser/ui/cocoa/extensions/browser_action_button.mm
@@ -13,11 +13,11 @@
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_window.h"
+#import "chrome/browser/ui/cocoa/app_menu/app_menu_controller.h"
 #import "chrome/browser/ui/cocoa/browser_window_controller.h"
 #import "chrome/browser/ui/cocoa/extensions/browser_actions_controller.h"
 #import "chrome/browser/ui/cocoa/themed_window.h"
 #import "chrome/browser/ui/cocoa/toolbar/toolbar_controller.h"
-#import "chrome/browser/ui/cocoa/wrench_menu/wrench_menu_controller.h"
 #include "chrome/browser/ui/toolbar/toolbar_action_view_controller.h"
 #include "chrome/browser/ui/toolbar/toolbar_action_view_delegate.h"
 #include "chrome/browser/ui/toolbar/toolbar_actions_bar.h"
@@ -113,14 +113,14 @@
   DCHECK(![owner_ superview]);
 
   contextMenuRunning_ = true;
-  WrenchMenuController* wrenchMenuController =
+  AppMenuController* appMenuController =
       [[[BrowserWindowController browserWindowControllerForWindow:
           [controller_ browser]->window()->GetNativeWindow()]
-              toolbarController] wrenchMenuController];
-  // If the wrench menu is open, we have to first close it. Part of this happens
+              toolbarController] appMenuController];
+  // If the app menu is open, we have to first close it. Part of this happens
   // asynchronously, so we have to use a posted task to open the next menu.
-  if ([wrenchMenuController isMenuOpen])
-    [wrenchMenuController cancel];
+  if ([appMenuController isMenuOpen])
+    [appMenuController cancel];
 
   [controller_ toolbarActionsBar]->PopOutAction(
       viewController_,
@@ -154,11 +154,11 @@
 }
 
 void ToolbarActionViewDelegateBridge::DoShowContextMenu() {
-  // The point the menu shows matches that of the normal wrench menu - that is,
-  // the right-left most corner of the menu is left-aligned with the wrench
-  // button, and the menu is displayed "a little bit" lower. It would be nice to
-  // be able to avoid the magic '5' here, but since it's built into Cocoa, it's
-  // not too hopeful.
+  // The point the menu shows matches that of the normal app menu - that is, the
+  // right-left most corner of the menu is left-aligned with the app button,
+  // and the menu is displayed "a little bit" lower. It would be nice to be able
+  // to avoid the magic '5' here, but since it's built into Cocoa, it's not too
+  // hopeful.
   NSPoint menuPoint = NSMakePoint(0, NSHeight([owner_ bounds]) + 5);
   [[owner_ cell] setHighlighted:YES];
   [[owner_ menu] popUpMenuPositioningItem:nil
@@ -230,9 +230,9 @@
 
 - (void)rightMouseDown:(NSEvent*)theEvent {
   // Cocoa doesn't allow menus-running-in-menus, so in order to show the
-  // context menu for an overflowed action, we close the wrench menu and show
-  // the context menu over the wrench (similar to what we do for popups).
-  // Let the main bar's button handle showing the context menu, since the wrench
+  // context menu for an overflowed action, we close the app menu and show the
+  // context menu over the app menu (similar to what we do for popups).
+  // Let the main bar's button handle showing the context menu, since the app
   // menu will close..
   if ([browserActionsController_ isOverflow]) {
     [browserActionsController_ mainButtonForId:viewController_->GetId()]->
diff --git a/chrome/browser/ui/cocoa/extensions/browser_action_button_interactive_uitest.mm b/chrome/browser/ui/cocoa/extensions/browser_action_button_interactive_uitest.mm
index c50a6a3..e6c5c66e 100644
--- a/chrome/browser/ui/cocoa/extensions/browser_action_button_interactive_uitest.mm
+++ b/chrome/browser/ui/cocoa/extensions/browser_action_button_interactive_uitest.mm
@@ -11,12 +11,12 @@
 #include "chrome/browser/extensions/extension_browsertest.h"
 #include "chrome/browser/extensions/extension_service.h"
 #include "chrome/browser/ui/browser_window.h"
+#import "chrome/browser/ui/cocoa/app_menu/app_menu_controller.h"
 #import "chrome/browser/ui/cocoa/browser_window_controller.h"
 #import "chrome/browser/ui/cocoa/extensions/browser_action_button.h"
 #import "chrome/browser/ui/cocoa/extensions/browser_actions_container_view.h"
 #import "chrome/browser/ui/cocoa/extensions/browser_actions_controller.h"
 #import "chrome/browser/ui/cocoa/toolbar/toolbar_controller.h"
-#import "chrome/browser/ui/cocoa/wrench_menu/wrench_menu_controller.h"
 #include "chrome/browser/ui/global_error/global_error.h"
 #include "chrome/browser/ui/global_error/global_error_service.h"
 #include "chrome/browser/ui/global_error/global_error_service_factory.h"
@@ -43,7 +43,7 @@
   }
   base::string16 MenuItemLabel() override {
     const char kErrorMessage[] =
-        "This is a really long error message that will cause the wrench menu "
+        "This is a really long error message that will cause the app menu "
         "to have increased width";
     return base::ASCIIToUTF16(kErrorMessage);
   }
@@ -136,7 +136,7 @@
                 window()->GetNativeWindow()]
             toolbarController];
     ASSERT_TRUE(toolbarController_);
-    wrenchMenuController_ = [toolbarController_ wrenchMenuController];
+    appMenuController_ = [toolbarController_ appMenuController];
     model_ = ToolbarActionsModel::Get(profile());
   }
 
@@ -154,7 +154,7 @@
   }
 
   ToolbarController* toolbarController() { return toolbarController_; }
-  WrenchMenuController* wrenchMenuController() { return wrenchMenuController_; }
+  AppMenuController* appMenuController() { return appMenuController_; }
   ToolbarActionsModel* model() { return model_; }
   NSView* wrenchButton() { return [toolbarController_ wrenchButton]; }
 
@@ -162,7 +162,7 @@
   scoped_ptr<extensions::FeatureSwitch::ScopedOverride> enable_redesign_;
 
   ToolbarController* toolbarController_ = nil;
-  WrenchMenuController* wrenchMenuController_ = nil;
+  AppMenuController* appMenuController_ = nil;
   ToolbarActionsModel* model_ = nullptr;
 
   DISALLOW_COPY_AND_ASSIGN(BrowserActionButtonUiTest);
@@ -172,13 +172,13 @@
 // |closure| upon completion.
 void ClickOnOverflowedAction(ToolbarController* toolbarController,
                              const base::Closure& closure) {
-  WrenchMenuController* wrenchMenuController =
-      [toolbarController wrenchMenuController];
-  // The wrench menu should start as open (since that's where the overflowed
+  AppMenuController* appMenuController =
+      [toolbarController appMenuController];
+  // The app menu should start as open (since that's where the overflowed
   // actions are).
-  EXPECT_TRUE([wrenchMenuController isMenuOpen]);
+  EXPECT_TRUE([appMenuController isMenuOpen]);
   BrowserActionsController* overflowController =
-      [wrenchMenuController browserActionsController];
+      [appMenuController browserActionsController];
 
   ASSERT_TRUE(overflowController);
   BrowserActionButton* actionButton =
@@ -187,15 +187,15 @@
   EXPECT_TRUE([actionButton superview]);
 
   // ui_controls:: methods don't play nice when there is an open menu (like the
-  // wrench menu). Instead, simulate a right click by feeding the event directly
-  // to the button.
+  // app menu). Instead, simulate a right click by feeding the event directly to
+  // the button.
   NSPoint centerPoint = GetCenterPoint(actionButton);
   NSEvent* mouseEvent = cocoa_test_event_utils::RightMouseDownAtPointInWindow(
       centerPoint, [actionButton window]);
   [actionButton rightMouseDown:mouseEvent];
 
-  // This should close the wrench menu.
-  EXPECT_FALSE([wrenchMenuController isMenuOpen]);
+  // This should close the app menu.
+  EXPECT_FALSE([appMenuController isMenuOpen]);
   base::MessageLoop::current()->PostTask(FROM_HERE, closure);
 }
 
@@ -262,15 +262,15 @@
   model()->SetVisibleIconCount(0);
   EXPECT_EQ(nil, [actionButton superview]);
 
-  // Move the mouse over the wrench button.
+  // Move the mouse over the app button.
   MoveMouseToCenter(wrenchButton());
 
   {
     // No menu yet (on the browser action).
     EXPECT_FALSE([menuHelper menuOpened]);
     base::RunLoop runLoop;
-    // Click on the wrench menu, and pass in a callback to continue the test
-    // in ClickOnOverflowedAction (Due to the blocking nature of Cocoa menus,
+    // Click on the app menu, and pass in a callback to continue the test in
+    // ClickOnOverflowedAction (Due to the blocking nature of Cocoa menus,
     // passing in runLoop.QuitClosure() is not sufficient here.)
     ui_controls::SendMouseEventsNotifyWhenDone(
         ui_controls::LEFT, ui_controls::DOWN | ui_controls::UP,
@@ -285,37 +285,37 @@
   }
 }
 
-// Checks the layout of the overflow bar in the wrench menu.
+// Checks the layout of the overflow bar in the app menu.
 void CheckWrenchMenuLayout(ToolbarController* toolbarController,
                            int overflowStartIndex,
                            const std::string& error_message,
                            const base::Closure& closure) {
-  WrenchMenuController* wrenchMenuController =
-      [toolbarController wrenchMenuController];
-  // The wrench menu should start as open (since that's where the overflowed
+  AppMenuController* appMenuController =
+      [toolbarController appMenuController];
+  // The app menu should start as open (since that's where the overflowed
   // actions are).
-  EXPECT_TRUE([wrenchMenuController isMenuOpen]) << error_message;
+  EXPECT_TRUE([appMenuController isMenuOpen]) << error_message;
   BrowserActionsController* overflowController =
-      [wrenchMenuController browserActionsController];
+      [appMenuController browserActionsController];
   ASSERT_TRUE(overflowController) << error_message;
 
   ToolbarActionsBar* overflowBar = [overflowController toolbarActionsBar];
   BrowserActionsContainerView* overflowContainer =
       [overflowController containerView];
-  NSMenu* menu = [wrenchMenuController menu];
+  NSMenu* menu = [appMenuController menu];
 
-  // The overflow container should be within the bounds of the wrench menu, as
+  // The overflow container should be within the bounds of the app menu, as
   // should its parents.
   int menu_width = [menu size].width;
   NSRect frame = [overflowContainer frame];
   // The container itself should be indented in the menu.
   EXPECT_GT(NSMinX(frame), 0) << error_message;
   // Hierarchy: The overflow container is owned by two different views in the
-  // wrench menu. Each superview should start at 0 in the x-axis..
+  // app menu. Each superview should start at 0 in the x-axis.
   EXPECT_EQ(0, NSMinX([[overflowContainer superview] frame])) << error_message;
   EXPECT_EQ(0, NSMinX([[[overflowContainer superview] superview] frame])) <<
       error_message;
-  // The overflow container should fully fit in the wrench menu, including the
+  // The overflow container should fully fit in the app menu, including the
   // space taken away for padding, and should have its desired size.
   EXPECT_LE(NSWidth(frame), menu_width - kMenuPadding) << error_message;
   EXPECT_EQ(NSWidth(frame), overflowBar->GetPreferredSize().width()) <<
@@ -348,13 +348,13 @@
     }
   }
 
-  // Close the wrench menu.
-  [wrenchMenuController cancel];
-  EXPECT_FALSE([wrenchMenuController isMenuOpen]) << error_message;
+  // Close the app menu.
+  [appMenuController cancel];
+  EXPECT_FALSE([appMenuController isMenuOpen]) << error_message;
   base::MessageLoop::current()->PostTask(FROM_HERE, closure);
 }
 
-// Tests the layout of the overflow container in the wrench menu.
+// Tests the layout of the overflow container in the app menu.
 IN_PROC_BROWSER_TEST_F(BrowserActionButtonUiTest, TestOverflowContainerLayout) {
   // Add a bunch of extensions - enough to trigger multiple rows in the overflow
   // menu.
@@ -368,7 +368,7 @@
   }
   ASSERT_EQ(kNumExtensions, static_cast<int>(model()->toolbar_items().size()));
 
-  // A helper function to open the wrench menu and call the check function.
+  // A helper function to open the app menu and call the check function.
   auto resizeAndActivateWrench = [this](int visible_count,
                                         const std::string& error_message) {
     model()->SetVisibleIconCount(kNumExtensions - visible_count);
@@ -376,8 +376,8 @@
 
     {
       base::RunLoop runLoop;
-      // Click on the wrench menu, and pass in a callback to continue the test
-      // in CheckWrenchMenuLayout (due to the blocking nature of Cocoa menus,
+      // Click on the app menu, and pass in a callback to continue the test in
+      // CheckWrenchMenuLayout (due to the blocking nature of Cocoa menus,
       // passing in runLoop.QuitClosure() is not sufficient here.)
       ui_controls::SendMouseEventsNotifyWhenDone(
           ui_controls::LEFT, ui_controls::DOWN | ui_controls::UP,
@@ -394,8 +394,8 @@
   for (int i = 1; i <= kNumExtensions; ++i)
     resizeAndActivateWrench(i, base::StringPrintf("Normal: %d", i));
 
-  // Adding a global error adjusts the wrench menu size, and has been known
-  // to mess up the overflow container's bounds (crbug.com/511326).
+  // Adding a global error adjusts the app menu size, and has been known to mess
+  // up the overflow container's bounds (crbug.com/511326).
   GlobalErrorService* error_service =
       GlobalErrorServiceFactory::GetForProfile(profile());
   error_service->AddGlobalError(new MenuError());
diff --git a/chrome/browser/ui/cocoa/extensions/extension_action_platform_delegate_cocoa.mm b/chrome/browser/ui/cocoa/extensions/extension_action_platform_delegate_cocoa.mm
index 1de9d70c..8da3f175 100644
--- a/chrome/browser/ui/cocoa/extensions/extension_action_platform_delegate_cocoa.mm
+++ b/chrome/browser/ui/cocoa/extensions/extension_action_platform_delegate_cocoa.mm
@@ -12,12 +12,12 @@
 #include "chrome/browser/extensions/extension_view_host.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_window.h"
+#import "chrome/browser/ui/cocoa/app_menu/app_menu_controller.h"
 #import "chrome/browser/ui/cocoa/browser_window_controller.h"
 #import "chrome/browser/ui/cocoa/extensions/browser_actions_controller.h"
 #import "chrome/browser/ui/cocoa/extensions/extension_popup_controller.h"
 #import "chrome/browser/ui/cocoa/location_bar/location_bar_view_mac.h"
 #import "chrome/browser/ui/cocoa/toolbar/toolbar_controller.h"
-#import "chrome/browser/ui/cocoa/wrench_menu/wrench_menu_controller.h"
 #include "chrome/browser/ui/toolbar/toolbar_action_view_delegate.h"
 #include "chrome/common/extensions/api/extension_action/action_info.h"
 #include "content/public/browser/notification_details.h"
@@ -81,15 +81,15 @@
 }
 
 void ExtensionActionPlatformDelegateCocoa::CloseOverflowMenu() {
-  // If this was triggered by an action overflowed to the wrench menu, then
-  // the wrench menu will be open. Close it before opening the popup.
-  WrenchMenuController* wrenchMenuController =
+  // If this was triggered by an action overflowed to the app menu, then the app
+  // menu will be open. Close it before opening the popup.
+  AppMenuController* appMenuController =
       [[[BrowserWindowController
           browserWindowControllerForWindow:
               controller_->browser()->window()->GetNativeWindow()]
-          toolbarController] wrenchMenuController];
-  if ([wrenchMenuController isMenuOpen])
-    [wrenchMenuController cancel];
+          toolbarController] appMenuController];
+  if ([appMenuController isMenuOpen])
+    [appMenuController cancel];
 }
 
 NSPoint ExtensionActionPlatformDelegateCocoa::GetPopupPoint() const {
diff --git a/chrome/browser/ui/cocoa/framed_browser_window.h b/chrome/browser/ui/cocoa/framed_browser_window.h
index 8c31ba8..43fcac3 100644
--- a/chrome/browser/ui/cocoa/framed_browser_window.h
+++ b/chrome/browser/ui/cocoa/framed_browser_window.h
@@ -37,7 +37,7 @@
 
   // Locks the window's frame and style mask. If it's set to YES, then the
   // frame and the style mask cannot be changed.
-  BOOL frameAndStyleMaskLock_;
+  BOOL styleMaskLock_;
 
   CGFloat windowButtonsInterButtonSpacing_;
 }
@@ -53,18 +53,12 @@
 // changed. This is used to prevent AppKit from making these unwanted changes
 // to the window during exit fullscreen transition. It is very important to
 // release this lock after the transition is completed.
-- (void)setFrameAndStyleMaskLock:(BOOL)lock;
+- (void)setStyleMaskLock:(BOOL)lock;
 
 // This method is overridden to prevent AppKit from  setting the style mask
 // when frameAndStyleMaskLock_ is set to true.
 - (void)setStyleMask:(NSUInteger)styleMask;
 
-// This method is overridden to prevent the AppKit from setting the frame when
-// frameAndStyleMaskLock_ is set to true.
-- (void)setFrame:(NSRect)windowFrame
-         display:(BOOL)displayViews
-         animate:(BOOL)performAnimation;
-
 // Returns the desired spacing between window control views.
 - (CGFloat)windowButtonsInterButtonSpacing;
 
diff --git a/chrome/browser/ui/cocoa/framed_browser_window.mm b/chrome/browser/ui/cocoa/framed_browser_window.mm
index a83bc14..0c0b486 100644
--- a/chrome/browser/ui/cocoa/framed_browser_window.mm
+++ b/chrome/browser/ui/cocoa/framed_browser_window.mm
@@ -46,19 +46,11 @@
 @implementation FramedBrowserWindow
 
 - (void)setStyleMask:(NSUInteger)styleMask {
-  if (frameAndStyleMaskLock_)
+  if (styleMaskLock_)
     return;
   [super setStyleMask:styleMask];
 }
 
-- (void)setFrame:(NSRect)windowFrame
-         display:(BOOL)displayViews
-         animate:(BOOL)performAnimation {
-  if (frameAndStyleMaskLock_)
-    return;
-  [super setFrame:windowFrame display:displayViews animate:performAnimation];
-}
-
 - (id)initWithContentRect:(NSRect)contentRect
               hasTabStrip:(BOOL)hasTabStrip{
   NSUInteger styleMask = NSTitledWindowMask |
@@ -111,8 +103,6 @@
                selector:@selector(adjustZoomButton:)
                    name:NSViewFrameDidChangeNotification
                  object:zoomButton_];
-
-    frameAndStyleMaskLock_ = NO;
   }
 
   return self;
@@ -193,8 +183,8 @@
   shouldHideTitle_ = flag;
 }
 
-- (void)setFrameAndStyleMaskLock:(BOOL)lock {
-  frameAndStyleMaskLock_ = lock;
+- (void)setStyleMaskLock:(BOOL)lock {
+  styleMaskLock_ = lock;
 }
 
 - (BOOL)_isTitleHidden {
diff --git a/chrome/browser/ui/cocoa/full_size_content_window.h b/chrome/browser/ui/cocoa/full_size_content_window.h
index 25bb91d..4808e81b 100644
--- a/chrome/browser/ui/cocoa/full_size_content_window.h
+++ b/chrome/browser/ui/cocoa/full_size_content_window.h
@@ -38,7 +38,7 @@
 // Forces the contentView to resize to the given size. This need to be forced
 // because by default, the contentView will always have the same size as the
 // window.
-- (void)forceContentViewSize:(NSSize)size;
+- (void)forceContentViewFrame:(NSRect)frame;
 
 @end
 
diff --git a/chrome/browser/ui/cocoa/full_size_content_window.mm b/chrome/browser/ui/cocoa/full_size_content_window.mm
index 04c7698..555c523 100644
--- a/chrome/browser/ui/cocoa/full_size_content_window.mm
+++ b/chrome/browser/ui/cocoa/full_size_content_window.mm
@@ -16,11 +16,13 @@
 // This view always takes the size of its superview. It is intended to be used
 // as a NSWindow's contentView.  It is needed because NSWindow's implementation
 // explicitly resizes the contentView at inopportune times.
-@interface FullSizeContentView : NSView
+@interface FullSizeContentView : NSView {
+  BOOL forceFrameFlag_;
+}
 
 // This method allows us to set the content view size since setFrameSize is
 // overridden to prevent the view from shrinking.
-- (void)forceFrameSize:(NSSize)size;
+- (void)forceFrame:(NSRect)frame;
 
 @end
 
@@ -29,13 +31,15 @@
 // This method is directly called by AppKit during a live window resize.
 // Override it to prevent the content view from shrinking.
 - (void)setFrameSize:(NSSize)size {
-  if ([self superview])
+  if ([self superview] && !forceFrameFlag_)
     size = [[self superview] bounds].size;
   [super setFrameSize:size];
 }
 
-- (void)forceFrameSize:(NSSize)size {
-  [super setFrameSize:size];
+- (void)forceFrame:(NSRect)frame {
+  forceFrameFlag_ = YES;
+  [super setFrame:frame];
+  forceFrameFlag_ = NO;
 }
 
 @end
@@ -91,10 +95,10 @@
   return self;
 }
 
-- (void)forceContentViewSize:(NSSize)size {
+- (void)forceContentViewFrame:(NSRect)frame {
   FullSizeContentView* contentView =
       base::mac::ObjCCast<FullSizeContentView>(chromeWindowView_);
-  [contentView forceFrameSize:size];
+  [contentView forceFrame:frame];
 }
 
 #pragma mark - Private Methods
diff --git a/chrome/browser/ui/cocoa/global_error_bubble_controller.mm b/chrome/browser/ui/cocoa/global_error_bubble_controller.mm
index d62343f..951c643 100644
--- a/chrome/browser/ui/cocoa/global_error_bubble_controller.mm
+++ b/chrome/browser/ui/cocoa/global_error_bubble_controller.mm
@@ -11,11 +11,11 @@
 #include "base/strings/utf_string_conversions.h"
 #import "chrome/browser/ui/browser.h"
 #import "chrome/browser/ui/browser_window.h"
+#import "chrome/browser/ui/cocoa/app_menu/app_menu_controller.h"
 #import "chrome/browser/ui/cocoa/browser_window_controller.h"
 #import "chrome/browser/ui/cocoa/info_bubble_view.h"
 #import "chrome/browser/ui/cocoa/l10n_util.h"
 #import "chrome/browser/ui/cocoa/toolbar/toolbar_controller.h"
-#import "chrome/browser/ui/cocoa/wrench_menu/wrench_menu_controller.h"
 #include "chrome/browser/ui/global_error/global_error.h"
 #include "chrome/browser/ui/global_error/global_error_bubble_view_base.h"
 #include "chrome/browser/ui/global_error/global_error_service.h"
@@ -55,7 +55,7 @@
   NSView* wrenchButton = [[bwc toolbarController] wrenchButton];
   NSPoint offset = NSMakePoint(
       NSMidX([wrenchButton bounds]),
-      wrench_menu_controller::kWrenchBubblePointOffsetY);
+      app_menu_controller::kAppMenuBubblePointOffsetY);
 
   // The bubble will be automatically deleted when the window is closed.
   GlobalErrorBubbleController* bubble = [[GlobalErrorBubbleController alloc]
diff --git a/chrome/browser/ui/cocoa/toolbar/media_router_action_platform_delegate_cocoa.mm b/chrome/browser/ui/cocoa/toolbar/media_router_action_platform_delegate_cocoa.mm
index 8192727..128a461 100644
--- a/chrome/browser/ui/cocoa/toolbar/media_router_action_platform_delegate_cocoa.mm
+++ b/chrome/browser/ui/cocoa/toolbar/media_router_action_platform_delegate_cocoa.mm
@@ -7,9 +7,9 @@
 #include "base/logging.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_window.h"
+#import "chrome/browser/ui/cocoa/app_menu/app_menu_controller.h"
 #import "chrome/browser/ui/cocoa/browser_window_controller.h"
 #import "chrome/browser/ui/cocoa/toolbar/toolbar_controller.h"
-#import "chrome/browser/ui/cocoa/wrench_menu/wrench_menu_controller.h"
 
 // static
 scoped_ptr<MediaRouterActionPlatformDelegate>
@@ -31,14 +31,14 @@
 bool MediaRouterActionPlatformDelegateCocoa::CloseOverflowMenuIfOpen() {
   // TODO(apacible): This should be factored to share code with extension
   // actions.
-  WrenchMenuController* wrenchMenuController =
+  AppMenuController* appMenuController =
       [[[BrowserWindowController
           browserWindowControllerForWindow:
               browser_->window()->GetNativeWindow()]
-          toolbarController] wrenchMenuController];
-  if (![wrenchMenuController isMenuOpen])
+          toolbarController] appMenuController];
+  if (![appMenuController isMenuOpen])
     return false;
 
-  [wrenchMenuController cancel];
+  [appMenuController cancel];
   return true;
 }
diff --git a/chrome/browser/ui/cocoa/toolbar/toolbar_controller.h b/chrome/browser/ui/cocoa/toolbar/toolbar_controller.h
index ca51e476..bd4031a 100644
--- a/chrome/browser/ui/cocoa/toolbar/toolbar_controller.h
+++ b/chrome/browser/ui/cocoa/toolbar/toolbar_controller.h
@@ -28,7 +28,7 @@
 class Profile;
 @class ReloadButton;
 @class ToolbarButton;
-@class WrenchMenuController;
+@class AppMenuController;
 
 namespace content {
 class WebContents;
@@ -73,7 +73,7 @@
       browserActionsContainerDelegate_;
 
   // Lazily-instantiated menu controller.
-  base::scoped_nsobject<WrenchMenuController> wrenchMenuController_;
+  base::scoped_nsobject<AppMenuController> appMenuController_;
 
   // Used for monitoring the optional toolbar button prefs.
   scoped_ptr<ToolbarControllerInternal::NotificationBridge> notificationBridge_;
@@ -174,8 +174,8 @@
 // Returns the wrench button.
 - (NSButton*)wrenchButton;
 
-// Returns the wrench menu controller.
-- (WrenchMenuController*)wrenchMenuController;
+// Returns the app menu controller.
+- (AppMenuController*)appMenuController;
 
 @end
 
diff --git a/chrome/browser/ui/cocoa/toolbar/toolbar_controller.mm b/chrome/browser/ui/cocoa/toolbar/toolbar_controller.mm
index fff83ec..21881cb9 100644
--- a/chrome/browser/ui/cocoa/toolbar/toolbar_controller.mm
+++ b/chrome/browser/ui/cocoa/toolbar/toolbar_controller.mm
@@ -27,6 +27,7 @@
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_commands.h"
 #include "chrome/browser/ui/browser_window.h"
+#import "chrome/browser/ui/cocoa/app_menu/app_menu_controller.h"
 #import "chrome/browser/ui/cocoa/background_gradient_view.h"
 #include "chrome/browser/ui/cocoa/drag_util.h"
 #import "chrome/browser/ui/cocoa/extensions/browser_action_button.h"
@@ -43,7 +44,6 @@
 #import "chrome/browser/ui/cocoa/toolbar/toolbar_view_cocoa.h"
 #import "chrome/browser/ui/cocoa/toolbar/wrench_toolbar_button_cell.h"
 #import "chrome/browser/ui/cocoa/view_id_util.h"
-#import "chrome/browser/ui/cocoa/wrench_menu/wrench_menu_controller.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
 #include "chrome/browser/ui/toolbar/app_menu_badge_controller.h"
 #include "chrome/browser/ui/toolbar/app_menu_model.h"
@@ -395,7 +395,7 @@
   [backMenuController_ browserWillBeDestroyed];
   [forwardMenuController_ browserWillBeDestroyed];
   [browserActionsController_ browserWillBeDestroyed];
-  [wrenchMenuController_ browserWillBeDestroyed];
+  [appMenuController_ browserWillBeDestroyed];
 
   [self cleanUp];
 }
@@ -564,7 +564,7 @@
 
 - (void)zoomChangedForActiveTab:(BOOL)canShowBubble {
   locationBarView_->ZoomChangedForActiveTab(
-      canShowBubble && ![wrenchMenuController_ isMenuOpen]);
+      canShowBubble && ![appMenuController_ isMenuOpen]);
 }
 
 - (void)setIsLoading:(BOOL)isLoading force:(BOOL)force {
@@ -663,13 +663,13 @@
 // Install the menu wrench buttons. Calling this repeatedly is inexpensive so it
 // can be done every time the buttons are shown.
 - (void)installWrenchMenu {
-  if (wrenchMenuController_.get())
+  if (appMenuController_.get())
     return;
 
-  wrenchMenuController_.reset(
-      [[WrenchMenuController alloc] initWithBrowser:browser_]);
-  [wrenchMenuController_ setUseWithPopUpButtonCell:YES];
-  [wrenchButton_ setAttachedMenu:[wrenchMenuController_ menu]];
+  appMenuController_.reset(
+      [[AppMenuController alloc] initWithBrowser:browser_]);
+  [appMenuController_ setUseWithPopUpButtonCell:YES];
+  [wrenchButton_ setAttachedMenu:[appMenuController_ menu]];
 }
 
 - (void)updateWrenchButtonSeverity:(AppMenuIconPainter::Severity)severity
@@ -882,7 +882,7 @@
   NSRect frame = wrenchButton_.frame;
   NSPoint point = NSMakePoint(NSMidX(frame), NSMinY(frame));
   // Inset to account for the whitespace around the hotdogs.
-  point.y += wrench_menu_controller::kWrenchBubblePointOffsetY;
+  point.y += app_menu_controller::kAppMenuBubblePointOffsetY;
   return [self.view convertPoint:point toView:nil];
 }
 
@@ -917,8 +917,8 @@
   return wrenchButton_;
 }
 
-- (WrenchMenuController*)wrenchMenuController {
-  return wrenchMenuController_.get();
+- (AppMenuController*)appMenuController {
+  return appMenuController_.get();
 }
 
 // (URLDropTargetController protocol)
diff --git a/chrome/browser/ui/libgtk2ui/native_theme_gtk2.cc b/chrome/browser/ui/libgtk2ui/native_theme_gtk2.cc
index 8b7d728..109930bb 100644
--- a/chrome/browser/ui/libgtk2ui/native_theme_gtk2.cc
+++ b/chrome/browser/ui/libgtk2ui/native_theme_gtk2.cc
@@ -87,12 +87,6 @@
 };
 
 #if GTK_MAJOR_VERSION == 2
-const WidgetState kTextboxInactiveState = ACTIVE;
-#else
-const WidgetState kTextboxInactiveState = SELECTED;
-#endif
-
-#if GTK_MAJOR_VERSION == 2
 // Same order as enum WidgetState above
 const GtkStateType stateMap[] = {
   GTK_STATE_NORMAL,
@@ -246,15 +240,23 @@
       return GetTextAAColor(GetEntry(), NORMAL);
 
     // MenuItem
+#if GTK_MAJOR_VERSION == 2
+    case kColorId_SelectedMenuItemForegroundColor:
+      return GetTextColor(GetMenuItem(), SELECTED);
+    case kColorId_FocusedMenuItemBackgroundColor:
+      return GetBGColor(GetMenuItem(), SELECTED);
+#else
+    case kColorId_SelectedMenuItemForegroundColor:
+      return GetTextColor(GetMenuItem(), PRELIGHT);
+    case kColorId_FocusedMenuItemBackgroundColor:
+      return GetBGColor(GetMenuItem(), PRELIGHT);
+#endif
+
     case kColorId_EnabledMenuItemForegroundColor:
     case kColorId_DisabledEmphasizedMenuItemForegroundColor:
       return GetTextColor(GetMenuItem(), NORMAL);
     case kColorId_DisabledMenuItemForegroundColor:
       return GetTextColor(GetMenuItem(), INSENSITIVE);
-    case kColorId_SelectedMenuItemForegroundColor:
-      return GetTextColor(GetMenuItem(), SELECTED);
-    case kColorId_FocusedMenuItemBackgroundColor:
-      return GetBGColor(GetMenuItem(), SELECTED);
     case kColorId_HoverMenuItemBackgroundColor:
       return GetBGColor(GetMenuItem(), PRELIGHT);
     case kColorId_FocusedMenuButtonBorderColor:
@@ -323,14 +325,27 @@
       return GetTextColor(GetEntry(), NORMAL);
     case kColorId_TextfieldDefaultBackground:
       return GetBaseColor(GetEntry(), NORMAL);
+
+#if GTK_MAJOR_VERSION == 2
     case kColorId_TextfieldReadOnlyColor:
-      return GetTextColor(GetEntry(), kTextboxInactiveState);
+      return GetTextColor(GetEntry(), ACTIVE);
     case kColorId_TextfieldReadOnlyBackground:
-      return GetBaseColor(GetEntry(), kTextboxInactiveState);
+      return GetBaseColor(GetEntry(), ACTIVE);
     case kColorId_TextfieldSelectionColor:
       return GetTextColor(GetEntry(), SELECTED);
     case kColorId_TextfieldSelectionBackgroundFocused:
       return GetBaseColor(GetEntry(), SELECTED);
+#else
+    case kColorId_TextfieldReadOnlyColor:
+      return GetTextColor(GetEntry(), SELECTED);
+    case kColorId_TextfieldReadOnlyBackground:
+      return GetBaseColor(GetEntry(), SELECTED);
+    case kColorId_TextfieldSelectionColor:
+      return GetTextColor(GetLabel(), SELECTED);
+    case kColorId_TextfieldSelectionBackgroundFocused:
+      return GetBaseColor(GetLabel(), SELECTED);
+#endif
+
 
     // Tooltips
     case kColorId_TooltipBackground:
@@ -362,37 +377,41 @@
 
       // Results Table
     case kColorId_ResultsTableNormalBackground:
-      return GetBaseColor(GetEntry(), NORMAL);
+      return GetSystemColor(kColorId_TextfieldDefaultBackground);
     case kColorId_ResultsTableHoveredBackground:
-      return color_utils::AlphaBlend(GetBaseColor(GetEntry(), NORMAL),
-                                     GetBaseColor(GetEntry(), SELECTED),
-                                     0x80);
+      return color_utils::AlphaBlend(
+          GetSystemColor(kColorId_TextfieldDefaultBackground),
+          GetSystemColor(kColorId_TextfieldSelectionBackgroundFocused),
+          0x80);
     case kColorId_ResultsTableSelectedBackground:
-      return GetBaseColor(GetEntry(), SELECTED);
+      return GetSystemColor(kColorId_TextfieldSelectionBackgroundFocused);
     case kColorId_ResultsTableNormalText:
     case kColorId_ResultsTableHoveredText:
-      return GetTextColor(GetEntry(), NORMAL);
+      return GetSystemColor(kColorId_TextfieldDefaultColor);
     case kColorId_ResultsTableSelectedText:
-      return GetTextColor(GetEntry(), SELECTED);
+      return GetSystemColor(kColorId_TextfieldSelectionColor);
     case kColorId_ResultsTableNormalDimmedText:
     case kColorId_ResultsTableHoveredDimmedText:
     case kColorId_ResultsTableNormalHeadline:
     case kColorId_ResultsTableHoveredHeadline:
-      return color_utils::AlphaBlend(GetTextColor(GetEntry(), NORMAL),
-                                     GetBaseColor(GetEntry(), NORMAL),
-                                     0x80);
+      return color_utils::AlphaBlend(
+          GetSystemColor(kColorId_TextfieldDefaultColor),
+          GetSystemColor(kColorId_TextfieldDefaultBackground),
+          0x80);
     case kColorId_ResultsTableSelectedDimmedText:
     case kColorId_ResultsTableSelectedHeadline:
-      return color_utils::AlphaBlend(GetTextColor(GetEntry(), SELECTED),
-                                     GetBaseColor(GetEntry(), NORMAL),
-                                     0x80);
+      return color_utils::AlphaBlend(
+          GetSystemColor(kColorId_TextfieldSelectionColor),
+          GetSystemColor(kColorId_TextfieldDefaultBackground),
+          0x80);
     case kColorId_ResultsTableNormalUrl:
     case kColorId_ResultsTableHoveredUrl:
-      return NormalURLColor(GetTextColor(GetEntry(), NORMAL));
+      return NormalURLColor(GetSystemColor(kColorId_TextfieldDefaultColor));
 
     case kColorId_ResultsTableSelectedUrl:
-      return SelectedURLColor(GetTextColor(GetEntry(), SELECTED),
-                              GetBaseColor(GetEntry(), SELECTED));
+      return SelectedURLColor(
+          GetSystemColor(kColorId_TextfieldSelectionColor),
+          GetSystemColor(kColorId_TextfieldSelectionBackgroundFocused));
     case kColorId_ResultsTableNormalDivider:
       return color_utils::AlphaBlend(GetTextColor(GetWindow(), NORMAL),
                                      GetBGColor(GetWindow(), NORMAL),
@@ -433,15 +452,14 @@
 
     // Throbber
     case kColorId_ThrobberSpinningColor:
-    case kColorId_ThrobberLightColor: {
-      return GetBGColor(GetEntry(), SELECTED);
-    }
+    case kColorId_ThrobberLightColor:
+      return GetSystemColor(kColorId_TextfieldSelectionBackgroundFocused);
 
-    case kColorId_ThrobberWaitingColor: {
-      return color_utils::AlphaBlend(GetBGColor(GetEntry(), SELECTED),
-                                     GetBGColor(GetWindow(), NORMAL),
-                                     0x80);
-    }
+    case kColorId_ThrobberWaitingColor:
+      return color_utils::AlphaBlend(
+          GetSystemColor(kColorId_TextfieldSelectionBackgroundFocused),
+          GetBGColor(GetWindow(), NORMAL),
+          0x80);
 
     case kColorId_NumColors:
       NOTREACHED();
diff --git a/chrome/browser/ui/webui/chromeos/login/enrollment_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/enrollment_screen_handler.cc
index 7cdddd1..2b38bda 100644
--- a/chrome/browser/ui/webui/chromeos/login/enrollment_screen_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/enrollment_screen_handler.cc
@@ -16,7 +16,6 @@
 #include "chrome/browser/browser_process_platform_part.h"
 #include "chrome/browser/chromeos/login/error_screens_histogram_helper.h"
 #include "chrome/browser/chromeos/login/screens/network_error.h"
-#include "chrome/browser/chromeos/login/ui/login_display_host_impl.h"
 #include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
 #include "chrome/browser/chromeos/policy/enrollment_status_chromeos.h"
 #include "chrome/browser/ui/webui/chromeos/login/oobe_ui.h"
@@ -28,7 +27,6 @@
 #include "google_apis/gaia/gaia_auth_util.h"
 #include "google_apis/gaia/gaia_urls.h"
 #include "google_apis/gaia/google_service_auth_error.h"
-#include "net/url_request/url_request_context_getter.h"
 #include "ui/base/l10n/l10n_util.h"
 
 namespace chromeos {
@@ -101,7 +99,6 @@
     : BaseScreenHandler(kJsScreenPath),
       controller_(NULL),
       show_on_init_(false),
-      frame_error_(net::OK),
       first_show_(true),
       observe_network_failure_(false),
       network_state_informer_(network_state_informer),
@@ -112,24 +109,10 @@
   DCHECK(network_state_informer_.get());
   DCHECK(network_error_model_);
   network_state_informer_->AddObserver(this);
-
-  if (chromeos::LoginDisplayHostImpl::default_host()) {
-    chromeos::WebUILoginView* login_view =
-        chromeos::LoginDisplayHostImpl::default_host()->GetWebUILoginView();
-    if (login_view)
-      login_view->AddFrameObserver(this);
-  }
 }
 
 EnrollmentScreenHandler::~EnrollmentScreenHandler() {
   network_state_informer_->RemoveObserver(this);
-
-  if (chromeos::LoginDisplayHostImpl::default_host()) {
-    chromeos::WebUILoginView* login_view =
-        chromeos::LoginDisplayHostImpl::default_host()->GetWebUILoginView();
-    if (login_view)
-      login_view->RemoveFrameObserver(this);
-  }
 }
 
 // EnrollmentScreenHandler, WebUIMessageHandler implementation --
@@ -407,9 +390,7 @@
   const bool is_online = (state == NetworkStateInformer::ONLINE);
   const bool is_behind_captive_portal =
       (state == NetworkStateInformer::CAPTIVE_PORTAL);
-  const bool is_frame_error =
-      (frame_error() != net::OK) ||
-      (reason == NetworkError::ERROR_REASON_FRAME_ERROR);
+  const bool is_frame_error = reason == NetworkError::ERROR_REASON_FRAME_ERROR;
 
   LOG(WARNING) << "EnrollmentScreenHandler::UpdateState(): "
                << "state=" << NetworkStateInformer::StatusString(state) << ", "
@@ -436,9 +417,7 @@
   const std::string network_path = network_state_informer_->network_path();
   const bool is_behind_captive_portal = IsBehindCaptivePortal(state, reason);
   const bool is_proxy_error = IsProxyError(state, reason);
-  const bool is_frame_error =
-      (frame_error() != net::OK) ||
-      (reason == NetworkError::ERROR_REASON_FRAME_ERROR);
+  const bool is_frame_error = reason == NetworkError::ERROR_REASON_FRAME_ERROR;
 
   if (is_proxy_error) {
     network_error_model_->SetErrorState(NetworkError::ERROR_STATE_PROXY,
@@ -482,12 +461,6 @@
   histogram_helper_->OnErrorHide();
 }
 
-void EnrollmentScreenHandler::OnFrameError(
-    const std::string& frame_unique_name) {
-  if (frame_unique_name == "oauth-enroll-signin-frame") {
-    HandleFrameLoadingCompleted(net::ERR_FAILED);
-  }
-}
 // EnrollmentScreenHandler, private -----------------------------
 
 void EnrollmentScreenHandler::HandleClose(const std::string& reason) {
@@ -514,16 +487,11 @@
   controller_->OnRetry();
 }
 
-void EnrollmentScreenHandler::HandleFrameLoadingCompleted(int status) {
-  const net::Error frame_error = static_cast<net::Error>(status);
-  frame_error_ = frame_error;
-
+void EnrollmentScreenHandler::HandleFrameLoadingCompleted() {
   if (network_state_informer_->state() != NetworkStateInformer::ONLINE)
     return;
-  if (frame_error_)
-    UpdateState(NetworkError::ERROR_REASON_FRAME_ERROR);
-  else
-    UpdateState(NetworkError::ERROR_REASON_UPDATE);
+
+  UpdateState(NetworkError::ERROR_REASON_UPDATE);
 }
 
 void EnrollmentScreenHandler::HandleDeviceAttributesProvided(
diff --git a/chrome/browser/ui/webui/chromeos/login/enrollment_screen_handler.h b/chrome/browser/ui/webui/chromeos/login/enrollment_screen_handler.h
index f72b331..e63c850 100644
--- a/chrome/browser/ui/webui/chromeos/login/enrollment_screen_handler.h
+++ b/chrome/browser/ui/webui/chromeos/login/enrollment_screen_handler.h
@@ -12,7 +12,6 @@
 #include "chrome/browser/chromeos/login/enrollment/enrollment_screen_actor.h"
 #include "chrome/browser/chromeos/login/enrollment/enterprise_enrollment_helper.h"
 #include "chrome/browser/chromeos/login/screens/network_error_model.h"
-#include "chrome/browser/chromeos/login/ui/webui_login_view.h"
 #include "chrome/browser/chromeos/policy/enrollment_config.h"
 #include "chrome/browser/ui/webui/chromeos/login/base_screen_handler.h"
 #include "chrome/browser/ui/webui/chromeos/login/network_state_informer.h"
@@ -27,8 +26,7 @@
 class EnrollmentScreenHandler
     : public BaseScreenHandler,
       public EnrollmentScreenActor,
-      public NetworkStateInformer::NetworkStateInformerObserver,
-      public WebUILoginView::FrameObserver {
+      public NetworkStateInformer::NetworkStateInformerObserver {
  public:
   EnrollmentScreenHandler(
       const scoped_refptr<NetworkStateInformer>& network_state_informer,
@@ -61,18 +59,15 @@
   // Implements NetworkStateInformer::NetworkStateInformerObserver
   void UpdateState(NetworkError::ErrorReason reason) override;
 
-  // Implements WebUILoginView::FrameObserver
-  void OnFrameError(const std::string& frame_unique_name) override;
-
  private:
   // Handlers for WebUI messages.
   void HandleClose(const std::string& reason);
   void HandleCompleteLogin(const std::string& user,
                            const std::string& auth_code);
   void HandleRetry();
-  void HandleFrameLoadingCompleted(int status);
+  void HandleFrameLoadingCompleted();
   void HandleDeviceAttributesProvided(const std::string& asset_id,
-                          const std::string& location);
+                                      const std::string& location);
   void HandleOnLearnMore();
 
   void UpdateStateInternal(NetworkError::ErrorReason reason, bool force_update);
@@ -81,7 +76,6 @@
   void HideOfflineMessage(NetworkStateInformer::State state,
                           NetworkError::ErrorReason reason);
 
-  net::Error frame_error() const { return frame_error_; }
   // Shows a given enrollment step.
   void ShowStep(const char* step);
 
@@ -115,9 +109,6 @@
   // The enrollment configuration.
   policy::EnrollmentConfig config_;
 
-  // Latest enrollment frame error.
-  net::Error frame_error_;
-
   // True if screen was not shown yet.
   bool first_show_;
 
diff --git a/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc
index ea7011d..e0523da 100644
--- a/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc
@@ -333,8 +333,6 @@
 }
 
 void GaiaScreenHandler::RegisterMessages() {
-  AddCallback("frameLoadingCompleted",
-              &GaiaScreenHandler::HandleFrameLoadingCompleted);
   AddCallback("webviewLoadAborted",
               &GaiaScreenHandler::HandleWebviewLoadAborted);
   AddCallback("completeLogin", &GaiaScreenHandler::HandleCompleteLogin);
@@ -387,29 +385,6 @@
     ShowWhitelistCheckFailedError();
 }
 
-void GaiaScreenHandler::HandleFrameLoadingCompleted(int status) {
-  const net::Error frame_error = static_cast<net::Error>(-status);
-  if (frame_error == net::ERR_ABORTED) {
-    LOG(WARNING) << "Ignoring Gaia frame error: " << frame_error;
-    return;
-  }
-  frame_error_ = frame_error;
-  if (frame_error == net::OK) {
-    VLOG(1) << "Gaia is loaded";
-    frame_state_ = FRAME_STATE_LOADED;
-  } else {
-    LOG(WARNING) << "Gaia frame error: " << frame_error_;
-    frame_state_ = FRAME_STATE_ERROR;
-  }
-
-  if (network_state_informer_->state() != NetworkStateInformer::ONLINE)
-    return;
-  if (frame_state_ == FRAME_STATE_LOADED)
-    UpdateState(NetworkError::ERROR_REASON_UPDATE);
-  else if (frame_state_ == FRAME_STATE_ERROR)
-    UpdateState(NetworkError::ERROR_REASON_FRAME_ERROR);
-}
-
 void GaiaScreenHandler::HandleWebviewLoadAborted(
     const std::string& error_reason_str) {
   // TODO(nkostylev): Switch to int code once webview supports that.
@@ -566,12 +541,18 @@
 }
 
 void GaiaScreenHandler::HandleGaiaUIReady() {
+  VLOG(1) << "Gaia is loaded";
+
   // As we could miss and window.onload could already be called, restore
   // focus to current pod (see crbug/175243).
   if (gaia_silent_load_)
     signin_screen_handler_->RefocusCurrentPod();
 
-  HandleFrameLoadingCompleted(0);
+  frame_error_ = net::OK;
+  frame_state_ = FRAME_STATE_LOADED;
+
+  if (network_state_informer_->state() == NetworkStateInformer::ONLINE)
+    UpdateState(NetworkError::ERROR_REASON_UPDATE);
 
   if (test_expects_complete_login_)
     SubmitLoginFormForTest();
diff --git a/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.h b/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.h
index 2fcad06..23e0495 100644
--- a/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.h
+++ b/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.h
@@ -116,7 +116,6 @@
       const NetworkPortalDetector::CaptivePortalState& state) override;
 
   // WebUI message handlers.
-  void HandleFrameLoadingCompleted(int status);
   void HandleWebviewLoadAborted(const std::string& error_reason_str);
   void HandleCompleteAuthentication(const std::string& gaia_id,
                                     const std::string& email,
diff --git a/chrome/browser/ui/webui/chromeos/login/signin_userlist_unittest.cc b/chrome/browser/ui/webui/chromeos/login/signin_userlist_unittest.cc
index 952afcd..0a69c1f 100644
--- a/chrome/browser/ui/webui/chromeos/login/signin_userlist_unittest.cc
+++ b/chrome/browser/ui/webui/chromeos/login/signin_userlist_unittest.cc
@@ -2,12 +2,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include "ash/test/ash_test_base.h"
 #include "base/compiler_specific.h"
 #include "chrome/browser/chromeos/login/screens/user_selection_screen.h"
 #include "chrome/browser/chromeos/login/users/fake_chrome_user_manager.h"
 #include "chrome/browser/chromeos/login/users/multi_profile_user_controller.h"
 #include "chrome/browser/chromeos/login/users/multi_profile_user_controller_delegate.h"
 #include "chrome/browser/chromeos/login/users/scoped_user_manager_enabler.h"
+#include "chrome/browser/chromeos/login/users/wallpaper/wallpaper_manager.h"
 #include "chrome/test/base/testing_browser_process.h"
 #include "chrome/test/base/testing_profile_manager.h"
 #include "components/proximity_auth/screenlock_bridge.h"
@@ -30,9 +32,8 @@
 
 namespace chromeos {
 
-class SigninPrepareUserListTest
-    : public testing::Test,
-      public MultiProfileUserControllerDelegate {
+class SigninPrepareUserListTest : public ash::test::AshTestBase,
+                                  public MultiProfileUserControllerDelegate {
  public:
   SigninPrepareUserListTest()
       : fake_user_manager_(new FakeChromeUserManager()),
@@ -41,6 +42,7 @@
   ~SigninPrepareUserListTest() override {}
 
   void SetUp() override {
+    ash::test::AshTestBase::SetUp();
     profile_manager_.reset(
         new TestingProfileManager(TestingBrowserProcess::GetGlobal()));
     ASSERT_TRUE(profile_manager_->SetUp());
@@ -56,11 +58,15 @@
       fake_user_manager_->AddUser(AccountId::FromUserEmail(kUsers[i]));
 
     fake_user_manager_->set_owner_id(AccountId::FromUserEmail(kOwner));
+
+    chromeos::WallpaperManager::Initialize();
   }
 
   void TearDown() override {
+    chromeos::WallpaperManager::Shutdown();
     controller_.reset();
     profile_manager_.reset();
+    ash::test::AshTestBase::TearDown();
   }
 
   // MultiProfileUserControllerDelegate overrides:
diff --git a/chrome/browser/ui/webui/extensions/extensions_ui.cc b/chrome/browser/ui/webui/extensions/extensions_ui.cc
index 0a4e895..2ea97b1 100644
--- a/chrome/browser/ui/webui/extensions/extensions_ui.cc
+++ b/chrome/browser/ui/webui/extensions/extensions_ui.cc
@@ -61,6 +61,14 @@
   source->AddLocalizedString("itemDetails", IDS_MD_EXTENSIONS_ITEM_DETAILS);
   source->AddLocalizedString("itemEnabled", IDS_MD_EXTENSIONS_ITEM_ENABLED);
   source->AddLocalizedString("itemDisabled", IDS_MD_EXTENSIONS_ITEM_DISABLED);
+  source->AddLocalizedString("viewBackgroundPage",
+                             IDS_EXTENSIONS_BACKGROUND_PAGE);
+  source->AddLocalizedString("viewIncognito",
+                             IDS_EXTENSIONS_VIEW_INCOGNITO);
+  source->AddLocalizedString("viewInactive",
+                             IDS_EXTENSIONS_VIEW_INACTIVE);
+  source->AddLocalizedString("viewIframe",
+                             IDS_EXTENSIONS_VIEW_IFRAME);
 
   source->AddResourcePath("manager.css", IDR_MD_EXTENSIONS_MANAGER_CSS);
   source->AddResourcePath("manager.html", IDR_MD_EXTENSIONS_MANAGER_HTML);
diff --git a/chrome/browser/ui/webui/md_downloads/md_downloads_ui.cc b/chrome/browser/ui/webui/md_downloads/md_downloads_ui.cc
index ecda4cc..3e8ec98e2 100644
--- a/chrome/browser/ui/webui/md_downloads/md_downloads_ui.cc
+++ b/chrome/browser/ui/webui/md_downloads/md_downloads_ui.cc
@@ -111,7 +111,7 @@
   source->AddResourcePath("crisper.js", IDR_MD_DOWNLOADS_CRISPER_JS);
   source->AddResourcePath("dev.html", IDR_MD_DOWNLOADS_DOWNLOADS_HTML);
   source->AddResourcePath("downloads.js", IDR_MD_DOWNLOADS_DOWNLOADS_JS);
-  source->AddResourcePath("i18n.html", IDR_MD_DOWNLOADS_I18N_HTML);
+  source->AddResourcePath("i18n_setup.html", IDR_MD_DOWNLOADS_I18N_SETUP_HTML);
   source->AddResourcePath("item.css", IDR_MD_DOWNLOADS_ITEM_CSS);
   source->AddResourcePath("item.html", IDR_MD_DOWNLOADS_ITEM_HTML);
   source->AddResourcePath("item.js", IDR_MD_DOWNLOADS_ITEM_JS);
diff --git a/chrome/browser/ui/webui/options/clear_browser_data_handler.cc b/chrome/browser/ui/webui/options/clear_browser_data_handler.cc
index 444004d..bcd8569 100644
--- a/chrome/browser/ui/webui/options/clear_browser_data_handler.cc
+++ b/chrome/browser/ui/webui/options/clear_browser_data_handler.cc
@@ -45,8 +45,18 @@
     "https://support.google.com/chrome/?p=settings_clear_browsing_data";
 
 bool AreCountersEnabled() {
-  return base::CommandLine::ForCurrentProcess()->HasSwitch(
-      switches::kEnableClearBrowsingDataCounters);
+  if (base::CommandLine::ForCurrentProcess()->HasSwitch(
+          switches::kEnableClearBrowsingDataCounters)) {
+    return true;
+  }
+
+  if (base::CommandLine::ForCurrentProcess()->HasSwitch(
+          switches::kDisableClearBrowsingDataCounters)) {
+    return false;
+  }
+
+  // Enabled by default.
+  return true;
 }
 
 }  // namespace
diff --git a/chrome/browser/ui/webui/options/reset_profile_settings_handler.cc b/chrome/browser/ui/webui/options/reset_profile_settings_handler.cc
index f850302..1d69d5f 100644
--- a/chrome/browser/ui/webui/options/reset_profile_settings_handler.cc
+++ b/chrome/browser/ui/webui/options/reset_profile_settings_handler.cc
@@ -140,8 +140,8 @@
 void ResetProfileSettingsHandler::HandleResetProfileSettings(
     const base::ListValue* value) {
   bool send_settings = false;
-  if (!value->GetBoolean(0, &send_settings))
-    NOTREACHED();
+  bool success = value->GetBoolean(0, &send_settings);
+  DCHECK(success);
 
   DCHECK(brandcode_.empty() || config_fetcher_);
   if (config_fetcher_ && config_fetcher_->IsActive()) {
diff --git a/chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.cc b/chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.cc
index 768313c..4c7281f 100644
--- a/chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.cc
+++ b/chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.cc
@@ -379,6 +379,18 @@
       IDS_SETTINGS_ON_STARTUP_ENTER_URL);
 }
 
+void AddPasswordsAndFormsStrings(content::WebUIDataSource* html_source) {
+  html_source->AddLocalizedString(
+      "passwordsAndAutofillPageTitle",
+      IDS_SETTINGS_PASSWORDS_AND_AUTOFILL_PAGE_TITLE);
+  html_source->AddLocalizedString("autofill", IDS_SETTINGS_AUTOFILL);
+  html_source->AddLocalizedString("autofillDetail",
+                                  IDS_SETTINGS_AUTOFILL_DETAIL);
+  html_source->AddLocalizedString("passwords", IDS_SETTINGS_PASSWORDS);
+  html_source->AddLocalizedString("passwordsDetail",
+                                  IDS_SETTINGS_PASSWORDS_DETAIL);
+}
+
 void AddPrivacyStrings(content::WebUIDataSource* html_source) {
   html_source->AddLocalizedString("privacyPageTitle",
                                   IDS_SETTINGS_PRIVACY);
@@ -691,6 +703,7 @@
   AddMultiProfilesStrings(html_source, profile);
 #endif
   AddOnStartupStrings(html_source);
+  AddPasswordsAndFormsStrings(html_source);
   AddPrivacyStrings(html_source);
   AddResetStrings(html_source);
   AddSearchEnginesStrings(html_source);
diff --git a/chrome/browser/ui/webui/settings/md_settings_ui.cc b/chrome/browser/ui/webui/settings/md_settings_ui.cc
index 235a1021..a6af0b5a 100644
--- a/chrome/browser/ui/webui/settings/md_settings_ui.cc
+++ b/chrome/browser/ui/webui/settings/md_settings_ui.cc
@@ -12,6 +12,7 @@
 #include "chrome/browser/ui/webui/settings/font_handler.h"
 #include "chrome/browser/ui/webui/settings/languages_handler.h"
 #include "chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.h"
+#include "chrome/browser/ui/webui/settings/reset_settings_handler.h"
 #include "chrome/browser/ui/webui/settings/settings_clear_browsing_data_handler.h"
 #include "chrome/browser/ui/webui/settings/settings_default_browser_handler.h"
 #include "chrome/browser/ui/webui/settings/settings_startup_pages_handler.h"
@@ -39,6 +40,7 @@
   AddSettingsPageUIHandler(new DownloadsHandler());
   AddSettingsPageUIHandler(new FontHandler(web_ui));
   AddSettingsPageUIHandler(new LanguagesHandler(web_ui));
+  AddSettingsPageUIHandler(new ResetSettingsHandler(web_ui));
   AddSettingsPageUIHandler(new StartupPagesHandler(web_ui));
   AddSettingsPageUIHandler(new SyncHandler(Profile::FromWebUI(web_ui)));
 
diff --git a/chrome/browser/ui/webui/settings/reset_settings_handler.cc b/chrome/browser/ui/webui/settings/reset_settings_handler.cc
new file mode 100644
index 0000000..11770cfc
--- /dev/null
+++ b/chrome/browser/ui/webui/settings/reset_settings_handler.cc
@@ -0,0 +1,180 @@
+// Copyright 2013 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/ui/webui/settings/reset_settings_handler.h"
+
+#include "base/bind.h"
+#include "base/bind_helpers.h"
+#include "base/metrics/histogram.h"
+#include "base/prefs/pref_service.h"
+#include "base/strings/string16.h"
+#include "base/values.h"
+#include "chrome/browser/google/google_brand.h"
+#include "chrome/browser/profile_resetter/automatic_profile_resetter.h"
+#include "chrome/browser/profile_resetter/automatic_profile_resetter_factory.h"
+#include "chrome/browser/profile_resetter/brandcode_config_fetcher.h"
+#include "chrome/browser/profile_resetter/brandcoded_default_settings.h"
+#include "chrome/browser/profile_resetter/profile_resetter.h"
+#include "chrome/browser/profile_resetter/resettable_settings_snapshot.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/common/url_constants.h"
+#include "chrome/grit/chromium_strings.h"
+#include "chrome/grit/generated_resources.h"
+#include "content/public/browser/user_metrics.h"
+#include "content/public/browser/web_ui.h"
+
+#if defined(OS_WIN)
+#include "chrome/browser/profile_resetter/triggered_profile_resetter.h"
+#include "chrome/browser/profile_resetter/triggered_profile_resetter_factory.h"
+#endif  // defined(OS_WIN)
+
+namespace settings {
+
+ResetSettingsHandler::ResetSettingsHandler(content::WebUI* web_ui)
+    : automatic_profile_resetter_(NULL),
+      has_shown_confirmation_dialog_(false) {
+  google_brand::GetBrand(&brandcode_);
+  Profile* profile = Profile::FromWebUI(web_ui);
+  resetter_.reset(new ProfileResetter(profile));
+  automatic_profile_resetter_ =
+      AutomaticProfileResetterFactory::GetForBrowserContext(profile);
+}
+
+ResetSettingsHandler::~ResetSettingsHandler() {
+  if (has_shown_confirmation_dialog_ && automatic_profile_resetter_) {
+    automatic_profile_resetter_->NotifyDidCloseWebUIResetDialog(
+        false /*performed_reset*/);
+  }
+}
+
+void ResetSettingsHandler::RegisterMessages() {
+  web_ui()->RegisterMessageCallback("performResetProfileSettings",
+      base::Bind(&ResetSettingsHandler::HandleResetProfileSettings,
+                 base::Unretained(this)));
+  web_ui()->RegisterMessageCallback("onShowResetProfileDialog",
+      base::Bind(&ResetSettingsHandler::OnShowResetProfileDialog,
+                 base::Unretained(this)));
+  web_ui()->RegisterMessageCallback("onHideResetProfileDialog",
+      base::Bind(&ResetSettingsHandler::OnHideResetProfileDialog,
+                 base::Unretained(this)));
+}
+
+void ResetSettingsHandler::HandleResetProfileSettings(
+    const base::ListValue* value) {
+  bool send_settings = false;
+  bool success = value->GetBoolean(0, &send_settings);
+  DCHECK(success);
+
+  DCHECK(brandcode_.empty() || config_fetcher_);
+  if (config_fetcher_ && config_fetcher_->IsActive()) {
+    // Reset once the prefs are fetched.
+    config_fetcher_->SetCallback(
+        base::Bind(&ResetSettingsHandler::ResetProfile,
+                   Unretained(this),
+                   send_settings));
+  } else {
+    ResetProfile(send_settings);
+  }
+}
+
+void ResetSettingsHandler::OnResetProfileSettingsDone(
+    bool send_feedback) {
+  web_ui()->CallJavascriptFunction("SettingsResetPage.doneResetting");
+  if (send_feedback && setting_snapshot_) {
+    Profile* profile = Profile::FromWebUI(web_ui());
+    ResettableSettingsSnapshot current_snapshot(profile);
+    int difference = setting_snapshot_->FindDifferentFields(current_snapshot);
+    if (difference) {
+      setting_snapshot_->Subtract(current_snapshot);
+      std::string report = SerializeSettingsReport(*setting_snapshot_,
+                                                   difference);
+      bool is_reset_prompt_active = automatic_profile_resetter_ &&
+          automatic_profile_resetter_->IsResetPromptFlowActive();
+      SendSettingsFeedback(report, profile, is_reset_prompt_active ?
+          PROFILE_RESET_PROMPT : PROFILE_RESET_WEBUI);
+    }
+  }
+  setting_snapshot_.reset();
+  if (automatic_profile_resetter_) {
+    automatic_profile_resetter_->NotifyDidCloseWebUIResetDialog(
+        true /*performed_reset*/);
+  }
+}
+
+void ResetSettingsHandler::OnShowResetProfileDialog(
+    const base::ListValue* value) {
+  if (!resetter_->IsActive()) {
+    setting_snapshot_.reset(
+        new ResettableSettingsSnapshot(Profile::FromWebUI(web_ui())));
+    setting_snapshot_->RequestShortcuts(base::Bind(
+        &ResetSettingsHandler::UpdateFeedbackUI, AsWeakPtr()));
+    UpdateFeedbackUI();
+  }
+
+  if (automatic_profile_resetter_)
+    automatic_profile_resetter_->NotifyDidOpenWebUIResetDialog();
+  has_shown_confirmation_dialog_ = true;
+
+  if (brandcode_.empty())
+    return;
+  config_fetcher_.reset(new BrandcodeConfigFetcher(
+      base::Bind(&ResetSettingsHandler::OnSettingsFetched,
+                 Unretained(this)),
+      GURL("https://tools.google.com/service/update2"),
+      brandcode_));
+}
+
+void ResetSettingsHandler::OnHideResetProfileDialog(
+    const base::ListValue* value) {
+  if (!resetter_->IsActive())
+    setting_snapshot_.reset();
+}
+
+void ResetSettingsHandler::OnSettingsFetched() {
+  DCHECK(config_fetcher_);
+  DCHECK(!config_fetcher_->IsActive());
+  // The master prefs is fetched. We are waiting for user pressing 'Reset'.
+}
+
+void ResetSettingsHandler::ResetProfile(bool send_settings) {
+  DCHECK(resetter_);
+  DCHECK(!resetter_->IsActive());
+
+  scoped_ptr<BrandcodedDefaultSettings> default_settings;
+  if (config_fetcher_) {
+    DCHECK(!config_fetcher_->IsActive());
+    default_settings = config_fetcher_->GetSettings();
+    config_fetcher_.reset();
+  } else {
+    DCHECK(brandcode_.empty());
+  }
+
+  // If failed to fetch BrandcodedDefaultSettings or this is an organic
+  // installation, use default settings.
+  if (!default_settings)
+    default_settings.reset(new BrandcodedDefaultSettings);
+  resetter_->Reset(
+      ProfileResetter::ALL,
+      default_settings.Pass(),
+      send_settings,
+      base::Bind(&ResetSettingsHandler::OnResetProfileSettingsDone,
+                 AsWeakPtr(),
+                 send_settings));
+  content::RecordAction(base::UserMetricsAction("ResetProfile"));
+  UMA_HISTOGRAM_BOOLEAN("ProfileReset.SendFeedback", send_settings);
+}
+
+void ResetSettingsHandler::UpdateFeedbackUI() {
+  if (!setting_snapshot_)
+    return;
+  scoped_ptr<base::ListValue> list = GetReadableFeedbackForSnapshot(
+      Profile::FromWebUI(web_ui()),
+      *setting_snapshot_);
+  base::DictionaryValue feedback_info;
+  feedback_info.Set("feedbackInfo", list.release());
+  web_ui()->CallJavascriptFunction(
+      "SettingsResetPage.setFeedbackInfo", feedback_info);
+}
+
+}  // namespace settings
diff --git a/chrome/browser/ui/webui/settings/reset_settings_handler.h b/chrome/browser/ui/webui/settings/reset_settings_handler.h
new file mode 100644
index 0000000..5f67d599
--- /dev/null
+++ b/chrome/browser/ui/webui/settings/reset_settings_handler.h
@@ -0,0 +1,86 @@
+// Copyright 2013 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_UI_WEBUI_SETTINGS_RESET_SETTINGS_HANDLER_H_
+#define CHROME_BROWSER_UI_WEBUI_SETTINGS_RESET_SETTINGS_HANDLER_H_
+
+#include <string>
+
+#include "base/compiler_specific.h"
+#include "base/macros.h"
+#include "base/memory/scoped_ptr.h"
+#include "base/memory/weak_ptr.h"
+#include "chrome/browser/ui/webui/settings/md_settings_ui.h"
+
+namespace base {
+class DictionaryValue;
+class ListValue;
+}  // namespace base
+
+class AutomaticProfileResetter;
+class BrandcodeConfigFetcher;
+class ProfileResetter;
+class ResettableSettingsSnapshot;
+
+namespace settings {
+
+// Handler for both the 'Reset Profile Settings' overlay page and also the
+// corresponding banner that is shown at the top of the options page.
+class ResetSettingsHandler
+    : public SettingsPageUIHandler,
+      public base::SupportsWeakPtr<ResetSettingsHandler> {
+ public:
+  explicit ResetSettingsHandler(content::WebUI* web_ui);
+  ~ResetSettingsHandler() override;
+
+  // WebUIMessageHandler implementation.
+  void RegisterMessages() override;
+
+ private:
+  // Javascript callback to start clearing data.
+  void HandleResetProfileSettings(const base::ListValue* value);
+
+  // Closes the dialog once all requested settings has been reset.
+  void OnResetProfileSettingsDone(bool send_feedback);
+
+  // Called when the confirmation box appears.
+  void OnShowResetProfileDialog(const base::ListValue* value);
+
+  // Called when the confirmation box disappears.
+  void OnHideResetProfileDialog(const base::ListValue* value);
+
+  // Called when BrandcodeConfigFetcher completed fetching settings.
+  void OnSettingsFetched();
+
+  // Resets profile settings to default values. |send_settings| is true if user
+  // gave his consent to upload broken settings to Google for analysis.
+  void ResetProfile(bool send_settings);
+
+  // Sets new values for the feedback area.
+  void UpdateFeedbackUI();
+
+  // Destroyed with the Profile, thus it should outlive us. This will be NULL if
+  // the underlying profile is off-the-record (e.g. in Guest mode on Chrome OS).
+  AutomaticProfileResetter* automatic_profile_resetter_;
+
+  // Records whether or not the Profile Reset confirmation dialog was opened at
+  // least once during the lifetime of the settings page.
+  bool has_shown_confirmation_dialog_;
+
+  scoped_ptr<ProfileResetter> resetter_;
+
+  scoped_ptr<BrandcodeConfigFetcher> config_fetcher_;
+
+  // Snapshot of settings before profile was reseted.
+  scoped_ptr<ResettableSettingsSnapshot> setting_snapshot_;
+
+  // Contains Chrome brand code; empty for organic Chrome.
+  std::string brandcode_;
+
+  DISALLOW_COPY_AND_ASSIGN(ResetSettingsHandler);
+};
+
+}  // namespace settings
+
+#endif  // CHROME_BROWSER_UI_WEBUI_SETTINGS_RESET_SETTINGS_HANDLER_H_
diff --git a/chrome/browser/usb/usb_chooser_context.cc b/chrome/browser/usb/usb_chooser_context.cc
new file mode 100644
index 0000000..00db0a4a
--- /dev/null
+++ b/chrome/browser/usb/usb_chooser_context.cc
@@ -0,0 +1,127 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/usb/usb_chooser_context.h"
+
+#include "base/stl_util.h"
+#include "base/strings/utf_string_conversions.h"
+#include "base/values.h"
+#include "device/core/device_client.h"
+#include "device/usb/usb_device.h"
+
+using device::UsbDevice;
+
+namespace {
+
+const char kDeviceNameKey[] = "name";
+const char kProductIdKey[] = "product-id";
+const char kSerialNumberKey[] = "serial-number";
+const char kVendorIdKey[] = "vendor-id";
+
+bool CanStorePersistentEntry(const scoped_refptr<const UsbDevice>& device) {
+  return !device->serial_number().empty();
+}
+
+const base::DictionaryValue* FindForDevice(
+    const ScopedVector<base::DictionaryValue>& device_list,
+    const scoped_refptr<const UsbDevice>& device) {
+  const std::string utf8_serial_number =
+      base::UTF16ToUTF8(device->serial_number());
+
+  for (const base::DictionaryValue* device_dict : device_list) {
+    int vendor_id;
+    int product_id;
+    std::string serial_number;
+    if (device_dict->GetInteger(kVendorIdKey, &vendor_id) &&
+        device->vendor_id() == vendor_id &&
+        device_dict->GetInteger(kProductIdKey, &product_id) &&
+        device->product_id() == product_id &&
+        device_dict->GetString(kSerialNumberKey, &serial_number) &&
+        utf8_serial_number == serial_number) {
+      return device_dict;
+    }
+  }
+  return nullptr;
+}
+
+}  // namespace
+
+UsbChooserContext::UsbChooserContext(Profile* profile)
+    : ChooserContextBase(profile,
+                         CONTENT_SETTINGS_TYPE_USB_CHOOSER_DATA),
+      observer_(this) {
+  usb_service_ = device::DeviceClient::Get()->GetUsbService();
+  if (usb_service_)
+    observer_.Add(usb_service_);
+}
+
+UsbChooserContext::~UsbChooserContext() {}
+
+void UsbChooserContext::GrantDevicePermission(const GURL& requesting_origin,
+                                              const GURL& embedding_origin,
+                                              const std::string& guid) {
+  scoped_refptr<UsbDevice> device = usb_service_->GetDevice(guid);
+  if (!device)
+    return;
+
+  if (CanStorePersistentEntry(device)) {
+    scoped_ptr<base::DictionaryValue> device_dict(new base::DictionaryValue());
+    device_dict->SetString(kDeviceNameKey, device->product_string());
+    device_dict->SetInteger(kVendorIdKey, device->vendor_id());
+    device_dict->SetInteger(kProductIdKey, device->product_id());
+    device_dict->SetString(kSerialNumberKey, device->serial_number());
+    GrantObjectPermission(requesting_origin, embedding_origin,
+                          device_dict.Pass());
+  } else {
+    ephemeral_devices_[requesting_origin.GetOrigin()].insert(guid);
+  }
+}
+
+void UsbChooserContext::RevokeDevicePermission(const GURL& requesting_origin,
+                                               const GURL& embedding_origin,
+                                               const std::string& guid) {
+  auto it = ephemeral_devices_.find(requesting_origin.GetOrigin());
+  if (it != ephemeral_devices_.end()) {
+    it->second.erase(guid);
+    if (it->second.empty())
+      ephemeral_devices_.erase(it);
+  }
+
+  scoped_refptr<UsbDevice> device = usb_service_->GetDevice(guid);
+  if (!device)
+    return;
+
+  ScopedVector<base::DictionaryValue> device_list =
+      GetGrantedObjects(requesting_origin, embedding_origin);
+  const base::DictionaryValue* entry = FindForDevice(device_list, device);
+  if (entry)
+    RevokeObjectPermission(requesting_origin, embedding_origin, *entry);
+}
+
+bool UsbChooserContext::HasDevicePermission(const GURL& requesting_origin,
+                                            const GURL& embedding_origin,
+                                            const std::string& guid) {
+  auto it = ephemeral_devices_.find(requesting_origin.GetOrigin());
+  if (it != ephemeral_devices_.end())
+    return ContainsValue(it->second, guid);
+
+  scoped_refptr<UsbDevice> device = usb_service_->GetDevice(guid);
+  if (!device)
+    return false;
+
+  ScopedVector<base::DictionaryValue> device_list =
+      GetGrantedObjects(requesting_origin, embedding_origin);
+  return FindForDevice(device_list, device) != nullptr;
+}
+
+bool UsbChooserContext::IsValidObject(const base::DictionaryValue& object) {
+  return object.size() == 4 && object.HasKey(kDeviceNameKey) &&
+         object.HasKey(kVendorIdKey) && object.HasKey(kProductIdKey) &&
+         object.HasKey(kSerialNumberKey);
+}
+
+void UsbChooserContext::OnDeviceRemoved(scoped_refptr<UsbDevice> device) {
+  for (auto& map_entry : ephemeral_devices_)
+    map_entry.second.erase(device->guid());
+}
diff --git a/chrome/browser/usb/usb_chooser_context.h b/chrome/browser/usb/usb_chooser_context.h
new file mode 100644
index 0000000..ceabab1
--- /dev/null
+++ b/chrome/browser/usb/usb_chooser_context.h
@@ -0,0 +1,55 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_USB_USB_CHOOSER_CONTEXT_H_
+#define CHROME_BROWSER_USB_USB_CHOOSER_CONTEXT_H_
+
+#include <map>
+#include <set>
+#include <string>
+
+#include "base/macros.h"
+#include "base/scoped_observer.h"
+#include "chrome/browser/permissions/chooser_context_base.h"
+#include "device/usb/usb_service.h"
+
+class UsbChooserContext : public ChooserContextBase,
+                          public device::UsbService::Observer {
+ public:
+  explicit UsbChooserContext(Profile* profile);
+  ~UsbChooserContext() override;
+
+  // Grants |requesting_origin| access to the USB device known to
+  // device::UsbService as |guid|.
+  void GrantDevicePermission(const GURL& requesting_origin,
+                             const GURL& embedding_origin,
+                             const std::string& guid);
+
+  // Revokes |requesting_origin|'s access to the USB device known to
+  // device::UsbService as |guid|.
+  void RevokeDevicePermission(const GURL& requesting_origin,
+                              const GURL& embedding_origin,
+                              const std::string& guid);
+
+  // Checks if |requesting_origin| (when embedded within |embedding_origin| has
+  // access to the USB device known to device::UsbService as |guid|.
+  bool HasDevicePermission(const GURL& requesting_origin,
+                           const GURL& embedding_origin,
+                           const std::string& guid);
+
+ private:
+  // ChooserContextBase implementation.
+  bool IsValidObject(const base::DictionaryValue& object) override;
+
+  // device::UsbService::Observer implementation.
+  void OnDeviceRemoved(scoped_refptr<device::UsbDevice> device) override;
+
+  std::map<GURL, std::set<std::string>> ephemeral_devices_;
+  device::UsbService* usb_service_;
+  ScopedObserver<device::UsbService, device::UsbService::Observer> observer_;
+
+  DISALLOW_COPY_AND_ASSIGN(UsbChooserContext);
+};
+
+#endif  // CHROME_BROWSER_USB_USB_CHOOSER_CONTEXT_H_
diff --git a/chrome/browser/usb/usb_chooser_context_factory.cc b/chrome/browser/usb/usb_chooser_context_factory.cc
new file mode 100644
index 0000000..7a26f0f
--- /dev/null
+++ b/chrome/browser/usb/usb_chooser_context_factory.cc
@@ -0,0 +1,41 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/usb/usb_chooser_context_factory.h"
+
+#include "chrome/browser/content_settings/host_content_settings_map_factory.h"
+#include "chrome/browser/profiles/incognito_helpers.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/usb/usb_chooser_context.h"
+#include "components/keyed_service/content/browser_context_dependency_manager.h"
+
+UsbChooserContextFactory::UsbChooserContextFactory()
+    : BrowserContextKeyedServiceFactory(
+          "UsbChooserContext",
+          BrowserContextDependencyManager::GetInstance()) {
+  DependsOn(HostContentSettingsMapFactory::GetInstance());
+}
+
+UsbChooserContextFactory::~UsbChooserContextFactory() {}
+
+KeyedService* UsbChooserContextFactory::BuildServiceInstanceFor(
+    content::BrowserContext* context) const {
+  return new UsbChooserContext(Profile::FromBrowserContext(context));
+}
+
+// static
+UsbChooserContextFactory* UsbChooserContextFactory::GetInstance() {
+  return base::Singleton<UsbChooserContextFactory>::get();
+}
+
+// static
+UsbChooserContext* UsbChooserContextFactory::GetForProfile(Profile* profile) {
+  return static_cast<UsbChooserContext*>(
+      GetInstance()->GetServiceForBrowserContext(profile, true));
+}
+
+content::BrowserContext* UsbChooserContextFactory::GetBrowserContextToUse(
+    content::BrowserContext* context) const {
+  return chrome::GetBrowserContextOwnInstanceInIncognito(context);
+}
diff --git a/chrome/browser/usb/usb_chooser_context_factory.h b/chrome/browser/usb/usb_chooser_context_factory.h
new file mode 100644
index 0000000..d25940b4
--- /dev/null
+++ b/chrome/browser/usb/usb_chooser_context_factory.h
@@ -0,0 +1,35 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_USB_USB_CHOOSER_CONTEXT_FACTORY_H_
+#define CHROME_BROWSER_USB_USB_CHOOSER_CONTEXT_FACTORY_H_
+
+#include "base/macros.h"
+#include "base/memory/singleton.h"
+#include "components/keyed_service/content/browser_context_keyed_service_factory.h"
+
+class UsbChooserContext;
+class Profile;
+
+class UsbChooserContextFactory : public BrowserContextKeyedServiceFactory {
+ public:
+  static UsbChooserContext* GetForProfile(Profile* profile);
+  static UsbChooserContextFactory* GetInstance();
+
+ private:
+  friend struct base::DefaultSingletonTraits<UsbChooserContextFactory>;
+
+  UsbChooserContextFactory();
+  ~UsbChooserContextFactory() override;
+
+  // BrowserContextKeyedBaseFactory methods:
+  KeyedService* BuildServiceInstanceFor(
+      content::BrowserContext* profile) const override;
+  content::BrowserContext* GetBrowserContextToUse(
+      content::BrowserContext* context) const override;
+
+  DISALLOW_COPY_AND_ASSIGN(UsbChooserContextFactory);
+};
+
+#endif  // CHROME_BROWSER_USB_USB_CHOOSER_CONTEXT_FACTORY_H_
diff --git a/chrome/browser/usb/usb_chooser_context_unittest.cc b/chrome/browser/usb/usb_chooser_context_unittest.cc
new file mode 100644
index 0000000..cab3408
--- /dev/null
+++ b/chrome/browser/usb/usb_chooser_context_unittest.cc
@@ -0,0 +1,118 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/usb/usb_chooser_context.h"
+#include "chrome/browser/usb/usb_chooser_context_factory.h"
+#include "chrome/test/base/testing_profile.h"
+#include "content/public/test/test_browser_thread_bundle.h"
+#include "device/core/device_client.h"
+#include "device/usb/mock_usb_device.h"
+#include "device/usb/mock_usb_service.h"
+
+using device::MockUsbDevice;
+using device::UsbDevice;
+
+namespace {
+
+class TestDeviceClient : public device::DeviceClient {
+ public:
+  TestDeviceClient() {}
+  ~TestDeviceClient() override {}
+
+  device::MockUsbService& usb_service() { return usb_service_; }
+
+ private:
+  device::UsbService* GetUsbService() override { return &usb_service_; }
+
+  device::MockUsbService usb_service_;
+};
+
+}  // namespace
+
+class UsbChooserContextTest : public testing::Test {
+ public:
+  UsbChooserContextTest() {}
+  ~UsbChooserContextTest() override {}
+
+ protected:
+  Profile* profile() { return &profile_; }
+  device::MockUsbService& usb_service() { return device_client_.usb_service(); }
+
+ private:
+  content::TestBrowserThreadBundle thread_bundle_;
+  TestDeviceClient device_client_;
+  TestingProfile profile_;
+};
+
+TEST_F(UsbChooserContextTest, CheckGrantAndRevokePermission) {
+  GURL origin("https://www.google.com");
+  scoped_refptr<UsbDevice> device =
+      new MockUsbDevice(0, 0, "Google", "Gizmo", "123ABC");
+  usb_service().AddDevice(device);
+  UsbChooserContext* store = UsbChooserContextFactory::GetForProfile(profile());
+
+  EXPECT_FALSE(store->HasDevicePermission(origin, origin, device->guid()));
+  store->GrantDevicePermission(origin, origin, device->guid());
+  EXPECT_TRUE(store->HasDevicePermission(origin, origin, device->guid()));
+  store->RevokeDevicePermission(origin, origin, device->guid());
+  EXPECT_FALSE(store->HasDevicePermission(origin, origin, device->guid()));
+}
+
+TEST_F(UsbChooserContextTest, CheckGrantAndRevokeEphemeralPermission) {
+  GURL origin("https://www.google.com");
+  scoped_refptr<UsbDevice> device =
+      new MockUsbDevice(0, 0, "Google", "Gizmo", "");
+  scoped_refptr<UsbDevice> other_device =
+      new MockUsbDevice(0, 0, "Google", "Gizmo", "");
+  usb_service().AddDevice(device);
+  UsbChooserContext* store = UsbChooserContextFactory::GetForProfile(profile());
+
+  EXPECT_FALSE(store->HasDevicePermission(origin, origin, device->guid()));
+  store->GrantDevicePermission(origin, origin, device->guid());
+  EXPECT_TRUE(store->HasDevicePermission(origin, origin, device->guid()));
+  EXPECT_FALSE(
+      store->HasDevicePermission(origin, origin, other_device->guid()));
+  store->RevokeDevicePermission(origin, origin, device->guid());
+  EXPECT_FALSE(store->HasDevicePermission(origin, origin, device->guid()));
+}
+
+TEST_F(UsbChooserContextTest, DisconnectDeviceWithPermission) {
+  GURL origin("https://www.google.com");
+  scoped_refptr<UsbDevice> device =
+      new MockUsbDevice(0, 0, "Google", "Gizmo", "123ABC");
+  usb_service().AddDevice(device);
+  UsbChooserContext* store = UsbChooserContextFactory::GetForProfile(profile());
+
+  EXPECT_FALSE(store->HasDevicePermission(origin, origin, device->guid()));
+  store->GrantDevicePermission(origin, origin, device->guid());
+  EXPECT_TRUE(store->HasDevicePermission(origin, origin, device->guid()));
+  usb_service().RemoveDevice(device);
+  EXPECT_FALSE(store->HasDevicePermission(origin, origin, device->guid()));
+
+  scoped_refptr<UsbDevice> reconnected_device =
+      new MockUsbDevice(0, 0, "Google", "Gizmo", "123ABC");
+  usb_service().AddDevice(reconnected_device);
+  EXPECT_TRUE(
+      store->HasDevicePermission(origin, origin, reconnected_device->guid()));
+}
+
+TEST_F(UsbChooserContextTest, DisconnectDeviceWithEphemeralPermission) {
+  GURL origin("https://www.google.com");
+  scoped_refptr<UsbDevice> device =
+      new MockUsbDevice(0, 0, "Google", "Gizmo", "");
+  usb_service().AddDevice(device);
+  UsbChooserContext* store = UsbChooserContextFactory::GetForProfile(profile());
+
+  EXPECT_FALSE(store->HasDevicePermission(origin, origin, device->guid()));
+  store->GrantDevicePermission(origin, origin, device->guid());
+  EXPECT_TRUE(store->HasDevicePermission(origin, origin, device->guid()));
+  usb_service().RemoveDevice(device);
+  EXPECT_FALSE(store->HasDevicePermission(origin, origin, device->guid()));
+
+  scoped_refptr<UsbDevice> reconnected_device =
+      new MockUsbDevice(0, 0, "Google", "Gizmo", "");
+  usb_service().AddDevice(reconnected_device);
+  EXPECT_FALSE(
+      store->HasDevicePermission(origin, origin, reconnected_device->guid()));
+}
diff --git a/chrome/browser/usb/web_usb_permission_provider.cc b/chrome/browser/usb/web_usb_permission_provider.cc
index 53320fb..b8f3817 100644
--- a/chrome/browser/usb/web_usb_permission_provider.cc
+++ b/chrome/browser/usb/web_usb_permission_provider.cc
@@ -6,11 +6,15 @@
 
 #include "base/command_line.h"
 #include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/usb/usb_chooser_context.h"
+#include "chrome/browser/usb/usb_chooser_context_factory.h"
 #include "chrome/common/chrome_switches.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/render_frame_host.h"
+#include "content/public/browser/web_contents.h"
 #include "device/core/device_client.h"
 
+using content::WebContents;
 using device::usb::WebUsbDescriptorSet;
 using device::usb::WebUsbConfigurationSubsetPtr;
 using device::usb::WebUsbFunctionSubsetPtr;
@@ -73,14 +77,25 @@
     mojo::Array<device::usb::DeviceInfoPtr> requested_devices,
     const HasDevicePermissionCallback& callback) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
-  GURL origin = render_frame_host_->GetLastCommittedURL().GetOrigin();
+  WebContents* web_contents =
+      WebContents::FromRenderFrameHost(render_frame_host_);
+  GURL embedding_origin =
+      web_contents->GetMainFrame()->GetLastCommittedURL().GetOrigin();
+  GURL requesting_origin =
+      render_frame_host_->GetLastCommittedURL().GetOrigin();
+  Profile* profile =
+      Profile::FromBrowserContext(web_contents->GetBrowserContext());
+  UsbChooserContext* chooser_context =
+      UsbChooserContextFactory::GetForProfile(profile);
 
   mojo::Array<mojo::String> allowed_guids(0);
   for (size_t i = 0; i < requested_devices.size(); ++i) {
     const device::usb::DeviceInfoPtr& device = requested_devices[i];
-    if (FindOriginInDescriptorSet(device->webusb_allowed_origins.get(), origin,
-                                  nullptr, nullptr) &&
-        EnableWebUsbOnAnyOrigin())
+    if (FindOriginInDescriptorSet(device->webusb_allowed_origins.get(),
+                                  requesting_origin, nullptr, nullptr) &&
+        (EnableWebUsbOnAnyOrigin() ||
+         chooser_context->HasDevicePermission(requesting_origin,
+                                              embedding_origin, device->guid)))
       allowed_guids.push_back(device->guid);
   }
   callback.Run(allowed_guids.Pass());
diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi
index 9f36a6f..b86b437 100644
--- a/chrome/chrome_browser.gypi
+++ b/chrome/chrome_browser.gypi
@@ -106,8 +106,12 @@
       'browser/android/contextualsearch/resolved_search_term.h',
       'browser/android/cookies/cookies_fetcher.cc',
       'browser/android/cookies/cookies_fetcher.h',
+      'browser/android/data_usage/data_use_tab_model.cc',
+      'browser/android/data_usage/data_use_tab_model.h',
       'browser/android/data_usage/external_data_use_observer.cc',
       'browser/android/data_usage/external_data_use_observer.h',
+      'browser/android/data_usage/tab_data_use_entry.cc',
+      'browser/android/data_usage/tab_data_use_entry.h',
       'browser/android/dev_tools_discovery_provider_android.cc',
       'browser/android/dev_tools_discovery_provider_android.h',
       'browser/android/dev_tools_server.cc',
@@ -1311,6 +1315,10 @@
       'browser/sync/sync_ui_util.h',
       'browser/tracing/chrome_tracing_delegate.cc',
       'browser/tracing/chrome_tracing_delegate.h',
+      'browser/usb/usb_chooser_context.cc',
+      'browser/usb/usb_chooser_context.h',
+      'browser/usb/usb_chooser_context_factory.cc',
+      'browser/usb/usb_chooser_context_factory.h',
       'browser/upgrade_detector.cc',
       'browser/upgrade_detector.h',
       'browser/usb/usb_tab_helper.cc',
@@ -1479,6 +1487,12 @@
       'browser/content_settings/web_site_settings_uma_util.cc',
       'browser/content_settings/web_site_settings_uma_util.h',
     ],
+    'chrome_browser_data_usage_sources': [
+      'browser/data_usage/tab_id_annotator.cc',
+      'browser/data_usage/tab_id_annotator.h',
+      'browser/data_usage/tab_id_provider.cc',
+      'browser/data_usage/tab_id_provider.h',
+    ],
     'chrome_browser_engagement_sources': [
       'browser/engagement/site_engagement_eviction_policy.cc',
       'browser/engagement/site_engagement_eviction_policy.h',
@@ -2100,6 +2114,8 @@
       'browser/password_manager/save_password_infobar_delegate.h',
     ],
     'chrome_browser_permissions_sources': [
+      'browser/permissions/chooser_context_base.cc',
+      'browser/permissions/chooser_context_base.h',
       'browser/permissions/permission_context.cc',
       'browser/permissions/permission_context.h',
       'browser/permissions/permission_context_base.cc',
@@ -2648,8 +2664,6 @@
       'browser/local_discovery/privet_notifications_factory.h',
       'browser/local_discovery/privet_url_fetcher.cc',
       'browser/local_discovery/privet_url_fetcher.h',
-      'browser/local_discovery/privetv3_session.cc',
-      'browser/local_discovery/privetv3_session.h',
       'browser/local_discovery/service_discovery_client_mac.h',
       'browser/local_discovery/service_discovery_client_mac.mm',
       'browser/local_discovery/service_discovery_client_mac_factory.h',
@@ -2786,10 +2800,8 @@
       'browser/ssl/ssl_blocking_page.h',
       'browser/ssl/ssl_cert_reporter.h',
       'browser/ssl/ssl_client_certificate_selector.h',
-      'browser/ssl/ssl_error_classification.cc',
-      'browser/ssl/ssl_error_classification.h',
       'browser/ssl/ssl_error_handler.cc',
-      'browser/ssl/ssl_error_handler.h'
+      'browser/ssl/ssl_error_handler.h',
     ],
     'chrome_browser_supervised_user_sources': [
       'browser/content_settings/content_settings_supervised_provider.cc',
@@ -3222,7 +3234,6 @@
             '../components/components.gyp:packed_ct_ev_whitelist',
             '../components/components.gyp:password_manager_content_browser',
             '../components/components.gyp:password_manager_sync_browser',
-            '../components/components.gyp:plugins_common',
             '../components/components.gyp:power',
             '../components/components.gyp:profile_metrics',
             '../components/components.gyp:proxy_config',
@@ -3278,6 +3289,7 @@
             '<@(chrome_browser_bookmark_sources)',
             '<@(chrome_browser_browser_process_sources)',
             '<@(chrome_browser_content_settings_sources)',
+            '<@(chrome_browser_data_usage_sources)',
             '<@(chrome_browser_engagement_sources)',
             '<@(chrome_browser_favicon_sources)',
             '<@(chrome_browser_google_sources)',
diff --git a/chrome/chrome_browser_extensions.gypi b/chrome/chrome_browser_extensions.gypi
index 377d132..6506ab8 100644
--- a/chrome/chrome_browser_extensions.gypi
+++ b/chrome/chrome_browser_extensions.gypi
@@ -293,6 +293,8 @@
       'browser/extensions/api/font_settings/font_settings_api.h',
       'browser/extensions/api/gcd_private/gcd_private_api.cc',
       'browser/extensions/api/gcd_private/gcd_private_api.h',
+      'browser/extensions/api/gcd_private/privet_v3_session.cc',
+      'browser/extensions/api/gcd_private/privet_v3_session.h',
       'browser/extensions/api/gcm/gcm_api.cc',
       'browser/extensions/api/gcm/gcm_api.h',
       'browser/extensions/api/history/history_api.cc',
diff --git a/chrome/chrome_browser_ui.gypi b/chrome/chrome_browser_ui.gypi
index d08c0b22..749880e7 100644
--- a/chrome/chrome_browser_ui.gypi
+++ b/chrome/chrome_browser_ui.gypi
@@ -729,6 +729,8 @@
       'browser/ui/cocoa/animatable_image.mm',
       'browser/ui/cocoa/animatable_view.h',
       'browser/ui/cocoa/animatable_view.mm',
+      'browser/ui/cocoa/app_menu/app_menu_controller.h',
+      'browser/ui/cocoa/app_menu/app_menu_controller.mm',
       'browser/ui/cocoa/applescript/apple_event_util.h',
       'browser/ui/cocoa/applescript/apple_event_util.mm',
       'browser/ui/cocoa/applescript/bookmark_folder_applescript.h',
@@ -1280,8 +1282,6 @@
       'browser/ui/cocoa/wrench_menu/recent_tabs_menu_model_delegate.mm',
       'browser/ui/cocoa/wrench_menu/wrench_menu_button_cell.h',
       'browser/ui/cocoa/wrench_menu/wrench_menu_button_cell.mm',
-      'browser/ui/cocoa/wrench_menu/wrench_menu_controller.h',
-      'browser/ui/cocoa/wrench_menu/wrench_menu_controller.mm',
     ],
     # Files used only on desktop systems (not iOS, Android, ChromeOS).
     'chrome_browser_ui_desktop_sources': [
@@ -1957,6 +1957,8 @@
       'browser/ui/webui/settings/md_settings_localized_strings_provider.h',
       'browser/ui/webui/settings/md_settings_ui.cc',
       'browser/ui/webui/settings/md_settings_ui.h',
+      'browser/ui/webui/settings/reset_settings_handler.cc',
+      'browser/ui/webui/settings/reset_settings_handler.h',
       'browser/ui/webui/settings/settings_clear_browsing_data_handler.cc',
       'browser/ui/webui/settings/settings_clear_browsing_data_handler.h',
       'browser/ui/webui/settings/settings_default_browser_handler.cc',
diff --git a/chrome/chrome_exe.gypi b/chrome/chrome_exe.gypi
index 352a01b..a107569 100644
--- a/chrome/chrome_exe.gypi
+++ b/chrome/chrome_exe.gypi
@@ -410,7 +410,7 @@
             'chrome_process_finder',
             'chrome_version_resources',
             'installer_util',
-            'image_pre_reader',
+            'file_pre_reader',
             '../base/base.gyp:base',
             '../crypto/crypto.gyp:crypto',
             '../breakpad/breakpad.gyp:breakpad_handler',
@@ -509,11 +509,11 @@
     ['OS=="win"', {
       'targets': [
         {
-          'target_name': 'image_pre_reader',
+          'target_name': 'file_pre_reader',
           'type': 'static_library',
           'sources': [
-            'app/image_pre_reader_win.cc',
-            'app/image_pre_reader_win.h',
+            'app/file_pre_reader_win.cc',
+            'app/file_pre_reader_win.h',
           ],
           'dependencies': [
              '../base/base.gyp:base',
diff --git a/chrome/chrome_nibs.gyp b/chrome/chrome_nibs.gyp
index 2bdc53f..8d8f6ed 100644
--- a/chrome/chrome_nibs.gyp
+++ b/chrome/chrome_nibs.gyp
@@ -53,6 +53,8 @@
         'browser/app_controller_mac.mm',
         'browser/ui/cocoa/animatable_view.h',
         'browser/ui/cocoa/animatable_view.mm',
+        'browser/ui/cocoa/app_menu/app_menu_controller.h',
+        'browser/ui/cocoa/app_menu/app_menu_controller.mm',
         'browser/ui/cocoa/background_gradient_view.h',
         'browser/ui/cocoa/background_gradient_view.mm',
         'browser/ui/cocoa/base_bubble_controller.h',
@@ -235,8 +237,6 @@
         'browser/ui/cocoa/view_id_util.mm',
         'browser/ui/cocoa/wrench_menu/menu_tracked_root_view.h',
         'browser/ui/cocoa/wrench_menu/menu_tracked_root_view.mm',
-        'browser/ui/cocoa/wrench_menu/wrench_menu_controller.h',
-        'browser/ui/cocoa/wrench_menu/wrench_menu_controller.mm',
       ],
       'mac_bundle_resources': [
         '<@(mac_all_xibs)',
diff --git a/chrome/chrome_tests_unit.gypi b/chrome/chrome_tests_unit.gypi
index 38e3f3e..7f0dbf56 100644
--- a/chrome/chrome_tests_unit.gypi
+++ b/chrome/chrome_tests_unit.gypi
@@ -13,7 +13,9 @@
       'browser/after_startup_task_utils_unittest.cc',
       'browser/android/bookmarks/partner_bookmarks_shim_unittest.cc',
       'browser/android/contextualsearch/contextual_search_delegate_unittest.cc',
+      'browser/android/data_usage/data_use_tab_model_unittest.cc',
       'browser/android/data_usage/external_data_use_observer_unittest.cc',
+      'browser/android/data_usage/tab_data_use_entry_unittest.cc',
       'browser/android/history_report/delta_file_backend_leveldb_unittest.cc',
       'browser/android/history_report/delta_file_commons_unittest.cc',
       'browser/android/history_report/usage_reports_buffer_backend_unittest.cc',
@@ -80,6 +82,8 @@
       'browser/content_settings/mock_settings_observer.h',
       'browser/content_settings/tab_specific_content_settings_unittest.cc',
       'browser/custom_handlers/protocol_handler_registry_unittest.cc',
+      'browser/data_usage/tab_id_annotator_unittest.cc',
+      'browser/data_usage/tab_id_provider_unittest.cc',
       'browser/devtools/device/webrtc/devtools_bridge_instances_request_unittest.cc',
       'browser/devtools/devtools_network_controller_unittest.cc',
       'browser/download/all_download_item_notifier_unittest.cc',
@@ -212,7 +216,6 @@
       'browser/signin/signin_tracker_unittest.cc',
       'browser/signin/test_signin_client_builder.cc',
       'browser/ssl/security_state_model_unittest.cc',
-      'browser/ssl/ssl_error_classification_unittest.cc',
       'browser/ssl/ssl_error_handler_unittest.cc',
       'browser/status_icons/status_icon_menu_model_unittest.cc',
       'browser/status_icons/status_icon_unittest.cc',
@@ -260,6 +263,7 @@
       'browser/ui/cocoa/accelerators_cocoa_unittest.mm',
       'browser/ui/cocoa/animatable_image_unittest.mm',
       'browser/ui/cocoa/animatable_view_unittest.mm',
+      'browser/ui/cocoa/app_menu/app_menu_controller_unittest.mm',
       'browser/ui/cocoa/applescript/apple_event_util_unittest.mm',
       'browser/ui/cocoa/applescript/bookmark_applescript_utils_unittest.h',
       'browser/ui/cocoa/applescript/bookmark_applescript_utils_unittest.mm',
@@ -442,7 +446,6 @@
       'browser/ui/cocoa/window_size_autosaver_unittest.mm',
       'browser/ui/cocoa/wrench_menu/menu_tracked_root_view_unittest.mm',
       'browser/ui/cocoa/wrench_menu/wrench_menu_button_cell_unittest.mm',
-      'browser/ui/cocoa/wrench_menu/wrench_menu_controller_unittest.mm',
       'browser/ui/find_bar/find_backend_unittest.cc',
       'browser/ui/login/login_prompt_unittest.cc',
       'browser/ui/passwords/manage_passwords_state_unittest.cc',
@@ -620,6 +623,7 @@
       'browser/extensions/api/file_handlers/api_file_handler_util_unittest.cc',
       'browser/extensions/api/file_handlers/mime_util_unittest.cc',
       'browser/extensions/api/file_system/file_system_api_unittest.cc',
+      'browser/extensions/api/gcd_private/privet_v3_session_unittest.cc',
       'browser/extensions/api/identity/extension_token_key_unittest.cc',
       'browser/extensions/api/identity/gaia_web_auth_flow_unittest.cc',
       'browser/extensions/api/identity/identity_mint_queue_unittest.cc',
@@ -907,7 +911,6 @@
       'browser/local_discovery/privet_confirm_api_flow_unittest.cc',
       'browser/local_discovery/privet_http_unittest.cc',
       'browser/local_discovery/privet_url_fetcher_unittest.cc',
-      'browser/local_discovery/privetv3_session_unittest.cc',
       'browser/local_discovery/service_discovery_client_mac_unittest.mm',
     ],
     'chrome_unit_tests_configuration_policy_sources': [
@@ -1491,6 +1494,7 @@
       'browser/media_galleries/win/mtp_device_object_enumerator_unittest.cc',
       'browser/memory/tab_manager_delegate_chromeos_unittest.cc',
       'browser/memory/tab_manager_unittest.cc',
+      'browser/memory/tab_manager_web_contents_data_unittest.cc',
       'browser/net/firefox_proxy_settings_unittest.cc',
       'browser/platform_util_unittest.cc',
       'browser/power/process_power_collector_unittest.cc',
@@ -1581,6 +1585,7 @@
       'browser/ui/window_sizer/window_sizer_common_unittest.cc',
       'browser/ui/window_sizer/window_sizer_unittest.cc',
       'browser/ui/zoom/zoom_controller_unittest.cc',
+      'browser/usb/usb_chooser_context_unittest.cc',
       # The importer code is not used on Android.
       'common/importer/firefox_importer_utils_unittest.cc',
       # No service process (which also requires multiprocess lock).
@@ -1920,6 +1925,7 @@
             '../build/linux/system.gyp:dbus',
             '../chromeos/chromeos.gyp:chromeos_test_support',
             '../components/components.gyp:user_manager_test_support',
+            '../third_party/icu/icu.gyp:icui18n',
           ],
           'sources': [
             # Note: sources list duplicated in GN build.
diff --git a/chrome/common/chrome_switches.cc b/chrome/common/chrome_switches.cc
index a76cc807..3619c4cd 100644
--- a/chrome/common/chrome_switches.cc
+++ b/chrome/common/chrome_switches.cc
@@ -49,12 +49,6 @@
 // Specifies comma-separated list of extension ids or hosts to grant
 // access to TCP/UDP socket APIs.
 const char kAllowNaClSocketAPI[]            = "allow-nacl-socket-api";
-
-// Disables forcing on the experimental Plugin Power Saver feature.
-const char kDisablePluginPowerSaver[] = "disable-plugin-power-saver";
-
-// Enables forcing on the experimental Plugin Power Saver feature.
-const char kEnablePluginPowerSaver[] = "enable-plugin-power-saver";
 #endif
 
 #if defined(FULL_SAFE_BROWSING)
@@ -232,6 +226,10 @@
 const char kDisableChildAccountDetection[] =
     "disable-child-account-detection";
 
+// Disables data volume counters in the Clear Browsing Data dialog.
+const char kDisableClearBrowsingDataCounters[] =
+    "disable-clear-browsing-data-counters";
+
 // Disables the client-side phishing detection feature. Note that even if
 // client-side phishing detection is enabled, it will only be active if the
 // user has opted in to UMA stats and SafeBrowsing is enabled in the
@@ -390,8 +388,7 @@
 const char kEnableChildAccountDetection[] =
     "enable-child-account-detection";
 
-// If true, the clear browsing data dialog will show data volume counters,
-// where available.
+// Enables data volume counters in the Clear Browsing Data dialog.
 const char kEnableClearBrowsingDataCounters[] =
     "enable-clear-browsing-data-counters";
 
diff --git a/chrome/common/chrome_switches.h b/chrome/common/chrome_switches.h
index bb2ccdec..0c5be3c 100644
--- a/chrome/common/chrome_switches.h
+++ b/chrome/common/chrome_switches.h
@@ -67,6 +67,7 @@
 extern const char kDisableBundledPpapiFlash[];
 extern const char kDisableCastStreamingHWEncoding[];
 extern const char kDisableChildAccountDetection[];
+extern const char kDisableClearBrowsingDataCounters[];
 extern const char kDisableClientSidePhishingDetection[];
 extern const char kDisableComponentExtensionsWithBackgroundPages[];
 extern const char kDisableComponentUpdate[];
@@ -386,8 +387,6 @@
 extern const char kAllowNaClCrxFsAPI[];
 extern const char kAllowNaClFileHandleAPI[];
 extern const char kAllowNaClSocketAPI[];
-extern const char kDisablePluginPowerSaver[];
-extern const char kEnablePluginPowerSaver[];
 #endif
 
 #if defined(FULL_SAFE_BROWSING)
diff --git a/chrome/installer/mini_installer/BUILD.gn b/chrome/installer/mini_installer/BUILD.gn
index 1e20d80..0829120 100644
--- a/chrome/installer/mini_installer/BUILD.gn
+++ b/chrome/installer/mini_installer/BUILD.gn
@@ -126,7 +126,7 @@
 
   if (enable_nacl) {
     inputs += [ "$root_out_dir/nacl_irt_x86_64.nexe" ]
-    if (cpu_arch == "x86") {
+    if (current_cpu == "x86") {
       inputs += [
         "$root_out_dir/nacl64.exe",
         "$root_out_dir/nacl_irt_x86_32.nexe",
diff --git a/chrome/renderer/chrome_content_renderer_client.cc b/chrome/renderer/chrome_content_renderer_client.cc
index e5a0ea418..7962a95 100644
--- a/chrome/renderer/chrome_content_renderer_client.cc
+++ b/chrome/renderer/chrome_content_renderer_client.cc
@@ -1106,9 +1106,12 @@
 
   bool is_post = base::EqualsASCII(
       base::StringPiece16(failed_request.httpMethod()), "POST");
-
-  if (error_html)
-    NetErrorHelper::Get(render_frame)->GetErrorHTML(error, is_post, error_html);
+  bool is_ignoring_cache = failed_request.cachePolicy() ==
+                           blink::WebURLRequest::ReloadBypassingCache;
+  if (error_html) {
+    NetErrorHelper::Get(render_frame)
+        ->GetErrorHTML(error, is_post, is_ignoring_cache, error_html);
+  }
 
   if (error_description)
     *error_description = LocalizedError::GetErrorDetails(error, is_post);
diff --git a/chrome/renderer/net/net_error_helper.cc b/chrome/renderer/net/net_error_helper.cc
index af983a6..ef29146 100644
--- a/chrome/renderer/net/net_error_helper.cc
+++ b/chrome/renderer/net/net_error_helper.cc
@@ -155,12 +155,12 @@
   core_->NetworkStateChanged(enabled);
 }
 
-void NetErrorHelper::GetErrorHTML(
-    const blink::WebURLError& error,
-    bool is_failed_post,
-    std::string* error_html) {
+void NetErrorHelper::GetErrorHTML(const blink::WebURLError& error,
+                                  bool is_failed_post,
+                                  bool is_ignoring_cache,
+                                  std::string* error_html) {
   core_->GetErrorHTML(GetFrameType(render_frame()), error, is_failed_post,
-                      error_html);
+                      is_ignoring_cache, error_html);
 }
 
 bool NetErrorHelper::ShouldSuppressErrorPage(const GURL& url) {
@@ -289,8 +289,8 @@
                  base::Unretained(this)));
 }
 
-void NetErrorHelper::ReloadPage() {
-  render_frame()->GetWebFrame()->reload(false);
+void NetErrorHelper::ReloadPage(bool ignore_cache) {
+  render_frame()->GetWebFrame()->reload(ignore_cache);
 }
 
 void NetErrorHelper::LoadPageFromCache(const GURL& page_url) {
diff --git a/chrome/renderer/net/net_error_helper.h b/chrome/renderer/net/net_error_helper.h
index 3d4f535..9ec1d44 100644
--- a/chrome/renderer/net/net_error_helper.h
+++ b/chrome/renderer/net/net_error_helper.h
@@ -70,6 +70,7 @@
   // loaded immediately.
   void GetErrorHTML(const blink::WebURLError& error,
                     bool is_failed_post,
+                    bool is_ignoring_cache,
                     std::string* error_html);
 
   // Returns whether a load for |url| in the |frame| the NetErrorHelper is
@@ -98,7 +99,7 @@
   void CancelFetchNavigationCorrections() override;
   void SendTrackingRequest(const GURL& tracking_url,
                            const std::string& tracking_request_body) override;
-  void ReloadPage() override;
+  void ReloadPage(bool ignore_cache) override;
   void LoadPageFromCache(const GURL& page_url) override;
   void DiagnoseError(const GURL& page_url) override;
 
diff --git a/chrome/service/service_utility_process_host.cc b/chrome/service/service_utility_process_host.cc
index fbdf202..36392aa 100644
--- a/chrome/service/service_utility_process_host.cc
+++ b/chrome/service/service_utility_process_host.cc
@@ -26,7 +26,8 @@
 #include "content/public/common/sandboxed_process_launcher_delegate.h"
 #include "ipc/ipc_switches.h"
 #include "printing/emf_win.h"
-#include "sandbox/win/src/sandbox_policy_base.h"
+#include "sandbox/win/src/sandbox_policy.h"
+#include "sandbox/win/src/sandbox_types.h"
 #include "ui/base/ui_base_switches.h"
 
 namespace {
@@ -61,10 +62,10 @@
  public:
   ServiceSandboxedProcessLauncherDelegate() {}
 
-  void PreSpawnTarget(sandbox::TargetPolicy* policy, bool* success) override {
+  bool PreSpawnTarget(sandbox::TargetPolicy* policy) override {
     // Service process may run as windows service and it fails to create a
     // window station.
-    policy->SetAlternateDesktop(false);
+    return policy->SetAlternateDesktop(false) == sandbox::SBOX_ALL_OK;
   }
 
  private:
diff --git a/chrome/test/chromedriver/archive.py b/chrome/test/chromedriver/archive.py
index 387a396..17aaf2c 100644
--- a/chrome/test/chromedriver/archive.py
+++ b/chrome/test/chromedriver/archive.py
@@ -10,9 +10,9 @@
 
 import util
 
-CHROME_43_REVISION = '323865'
-CHROME_44_REVISION = '330231'
 CHROME_45_REVISION = '338390'
+CHROME_46_REVISION = '344997'
+CHROME_47_REVISION = '352825'
 
 _SITE = 'http://commondatastorage.googleapis.com'
 
diff --git a/chrome/test/chromedriver/chrome/version.cc b/chrome/test/chromedriver/chrome/version.cc
index 04000e4..591d74e4 100644
--- a/chrome/test/chromedriver/chrome/version.cc
+++ b/chrome/test/chromedriver/chrome/version.cc
@@ -9,7 +9,7 @@
 namespace {
 
 // This variable must be able to be found and parsed by the upload script.
-const int kMinimumSupportedChromeVersion[] = {43, 0, 2357, 0};
+const int kMinimumSupportedChromeVersion[] = {45, 0, 2454, 0};
 
 }  // namespace
 
diff --git a/chrome/test/chromedriver/test/run_all_tests.py b/chrome/test/chromedriver/test/run_all_tests.py
index ae40962..1907c8a4 100755
--- a/chrome/test/chromedriver/test/run_all_tests.py
+++ b/chrome/test/chromedriver/test/run_all_tests.py
@@ -191,9 +191,9 @@
     latest_snapshot_revision = archive.GetLatestSnapshotVersion()
     versions = [
         ['HEAD', latest_snapshot_revision],
+        ['47', archive.CHROME_47_REVISION],
+        ['46', archive.CHROME_46_REVISION],
         ['45', archive.CHROME_45_REVISION],
-        ['44', archive.CHROME_44_REVISION],
-        ['43', archive.CHROME_43_REVISION],
     ]
     code = 0
     for version in versions:
diff --git a/chrome/test/data/extensions/api_test/service_worker/notifications/has_permission/manifest.json b/chrome/test/data/extensions/api_test/service_worker/notifications/has_permission/manifest.json
new file mode 100644
index 0000000..a8a55c1
--- /dev/null
+++ b/chrome/test/data/extensions/api_test/service_worker/notifications/has_permission/manifest.json
@@ -0,0 +1,7 @@
+{
+  "name": "Service worker - notifications test",
+  "description": "Tests ServiceWorkerRegistration.showNotification() from an extension",
+  "version": "1",
+  "manifest_version": 2,
+  "permissions": ["notifications"]
+}
diff --git a/chrome/test/data/extensions/api_test/service_worker/notifications/has_permission/page.html b/chrome/test/data/extensions/api_test/service_worker/notifications/has_permission/page.html
new file mode 100644
index 0000000..f6e2de85
--- /dev/null
+++ b/chrome/test/data/extensions/api_test/service_worker/notifications/has_permission/page.html
@@ -0,0 +1 @@
+<script src="page.js"></script>
diff --git a/chrome/test/data/extensions/api_test/service_worker/notifications/has_permission/page.js b/chrome/test/data/extensions/api_test/service_worker/notifications/has_permission/page.js
new file mode 100644
index 0000000..2dcdc7d
--- /dev/null
+++ b/chrome/test/data/extensions/api_test/service_worker/notifications/has_permission/page.js
@@ -0,0 +1,43 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+var startServiceWorker = new Promise(function(resolve, reject) {
+  navigator.serviceWorker.register('sw.js').then(function() {
+    // Wait until the service worker is active.
+    return navigator.serviceWorker.ready;
+  }).then(function(registration) {
+    resolve(registration.active);
+  }).catch(function(err) {
+    reject(err);
+  });
+});
+
+var test = function(messageToSend) {
+  return new Promise(function(resolve, reject) {
+    startServiceWorker.then(function(serviceWorker) {
+      var mc = new MessageChannel();
+      mc.port1.onmessage = function(e) {
+        if (e.data == 'OK') {
+          resolve();
+        } else {
+          reject('Received bad response from ServiceWorker: ' + e.data);
+        }
+      };
+      serviceWorker.postMessage(messageToSend, [mc.port2]);
+    }).catch(function(err) {
+      reject('Failed to start ServiceWorker, error: ' + err);
+    });
+  });
+};
+
+chrome.test.runTests([
+  function checkNotification() {
+    test('checknotification').then(chrome.test.notifyPass,
+                                   chrome.test.notifyFail);
+  },
+  function showNotification() {
+    test('shownotification').then(chrome.test.notifyPass,
+                                  chrome.test.notifyFail);
+  }
+]);
diff --git a/chrome/test/data/extensions/api_test/service_worker/notifications/has_permission/sw.js b/chrome/test/data/extensions/api_test/service_worker/notifications/has_permission/sw.js
new file mode 100644
index 0000000..3b0345b
--- /dev/null
+++ b/chrome/test/data/extensions/api_test/service_worker/notifications/has_permission/sw.js
@@ -0,0 +1,29 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+this.onmessage = function(e) {
+  var respond = function(message) {
+    e.ports[0].postMessage(message);
+  };
+
+  switch (e.data) {
+    case 'checknotification':
+      var permission = Notification.permission;
+      respond(permission == 'granted' ?
+          'OK' : ('Unexpected Notification.permission: ' + permission));
+      break;
+    case 'shownotification':
+      var result = registration.showNotification(
+          'Hello title.', {body: 'Hello body.'});
+      e.waitUntil(result.then(function() {
+        respond('OK');
+      }, function(err) {
+        respond('showNotification failed.');
+      }));
+      break;
+    default:
+      respond('Received unexpected message: ' + e.data);
+      break;
+  }
+};
diff --git a/chrome/test/data/webui/extensions/extension_item_test.js b/chrome/test/data/webui/extensions/extension_item_test.js
index e08c08e..4b385ac 100644
--- a/chrome/test/data/webui/extensions/extension_item_test.js
+++ b/chrome/test/data/webui/extensions/extension_item_test.js
@@ -42,7 +42,10 @@
     setItemAllowedIncognito: function(id, enabled) {},
 
     /** @override */
-    isInDevMode: function() { return false; }
+    isInDevMode: function() { return false; },
+
+    /** @override: */
+    inspectItemView: function(id, view) {},
   };
 
   /** @type {string} The mock extension's id. */
@@ -111,6 +114,9 @@
   var devElements = [
     {selector: '#extension-id', text: 'ID:' + extensionData.id},
     {selector: '#inspect-views'},
+    {selector: '#inspect-views paper-button', text: 'foo.html'},
+    {selector: '#inspect-views paper-button:nth-of-type(0n + 2)',
+     text: 'bar.html'},
   ];
 
   /**
@@ -187,7 +193,7 @@
         document.body.appendChild(item);
       });
 
-      test(testNames.ElementVisibilityNormalState, function() {
+      test(assert(testNames.ElementVisibilityNormalState), function() {
         testNormalElementsAreVisible(item);
         testDetailElementsAreHidden(item);
         testDeveloperElementsAreHidden(item);
@@ -199,14 +205,14 @@
         expectEquals('Disabled', item.$.enabled.textContent);
       });
 
-      test(testNames.ElementVisibilityDetailState, function() {
+      test(assert(testNames.ElementVisibilityDetailState), function() {
         MockInteractions.tap(item.$['show-details']);
         testNormalElementsAreVisible(item);
         testDetailElementsAreVisible(item);
         testDeveloperElementsAreHidden(item);
       });
 
-      test(testNames.ElementVisibilitydevState, function() {
+      test(assert(testNames.ElementVisibilityDeveloperState), function() {
         MockInteractions.tap(item.$['show-details']);
         item.set('inDevMode', true);
 
@@ -222,7 +228,7 @@
       });
 
       /** Tests that the delegate methods are correctly called. */
-      test(testNames.ClickableItems, function() {
+      test(assert(testNames.ClickableItems), function() {
         MockInteractions.tap(item.$['show-details']);
         item.set('inDevMode', true);
 
@@ -235,6 +241,12 @@
             [item.data.id, true]);
         mockDelegate.testClickingCalls(
             item.$$('#details-button'), 'showItemDetails', [item.data.id]);
+        mockDelegate.testClickingCalls(
+            item.$$('#inspect-views paper-button'),
+            'inspectItemView', [item.data.id, item.data.views[0]]);
+        mockDelegate.testClickingCalls(
+            item.$$('#inspect-views paper-button:nth-of-type(0n + 2)'),
+            'inspectItemView', [item.data.id, item.data.views[1]]);
       });
     });
   }
diff --git a/chrome/test/data/webui/media_router/issue_banner_tests.js b/chrome/test/data/webui/media_router/issue_banner_tests.js
index 182956746..7d9e0cc 100644
--- a/chrome/test/data/webui/media_router/issue_banner_tests.js
+++ b/chrome/test/data/webui/media_router/issue_banner_tests.js
@@ -63,12 +63,12 @@
           checkElementText(issue.title, 'title');
 
           checkElementText(loadTimeData.getString(
-              banner.issueActionTypeToButtonTextResource_[
+              banner.actionTypeToButtonTextResource_[
                   issue.defaultActionType]), 'default-button');
 
           if (issue.secondaryActionType) {
             checkElementText(loadTimeData.getString(
-                banner.issueActionTypeToButtonTextResource_[
+                banner.actionTypeToButtonTextResource_[
                     issue.secondaryActionType]), 'opt-button');
           }
         } else {
diff --git a/chrome/test/media_router/media_router_integration_ui_browsertest.cc b/chrome/test/media_router/media_router_integration_ui_browsertest.cc
index a77f86f..23744542 100644
--- a/chrome/test/media_router/media_router_integration_ui_browsertest.cc
+++ b/chrome/test/media_router/media_router_integration_ui_browsertest.cc
@@ -53,9 +53,8 @@
   std::string sink_name_script = base::StringPrintf(
       "domAutomationController.send("
       "window.document.getElementById('media-router-container').shadowRoot."
-      "getElementById('route-details').shadowRoot.getElementById("
-      "'route-details-header').shadowRoot.getElementById('header-text')."
-      "innerText)");
+      "getElementById('container-header').shadowRoot.getElementById("
+      "'header-text').innerText)");
   std::string sink_name = ExecuteScriptAndExtractString(
       dialog_contents, sink_name_script);
   ASSERT_EQ(kTestSinkName, sink_name);
diff --git a/chrome_elf/BUILD.gn b/chrome_elf/BUILD.gn
index 1a1af75a..50eca48 100644
--- a/chrome_elf/BUILD.gn
+++ b/chrome_elf/BUILD.gn
@@ -31,7 +31,6 @@
     ":blacklist",
     ":breakpad",
     ":chrome_elf_manifest",
-    ":lib",
     ":chrome_elf_resources",
     "//build/config/sanitizers:deps",
   ]
@@ -47,20 +46,6 @@
   }
 }
 
-source_set("lib") {
-  sources = [
-    "create_file/chrome_create_file.cc",
-    "create_file/chrome_create_file.h",
-    "ntdll_cache.cc",
-    "ntdll_cache.h",
-  ]
-  deps = [
-    ":common",
-    "//base:base_static",
-    "//sandbox",
-  ]
-}
-
 source_set("constants") {
   sources = [
     "chrome_elf_constants.cc",
@@ -94,25 +79,6 @@
   ]
 }
 
-if (is_component_build) {
-  shared_library("chrome_redirects") {
-    sources = [
-      "chrome_redirects_main.cc",
-    ]
-    deps = [
-      ":lib",
-      "//build/config/sanitizers:deps",
-    ]
-    configs += [ "//build/config/win:windowed" ]
-    ldflags = [ "/DEF:" + rebase_path("chrome_redirects.def") ]
-
-    if (current_cpu == "x86") {
-      # Don't set an x64 base address (to avoid breaking HE-ASLR).
-      ldflags += [ "/BASE:0x01c20000" ]
-    }
-  }
-}
-
 source_set("dll_hash") {
   deps = [
     "//base",
@@ -156,15 +122,12 @@
   sources = [
     "blacklist/test/blacklist_test.cc",
     "chrome_elf_util_unittest.cc",
-    "create_file/chrome_create_file_unittest.cc",
     "elf_imports_unittest.cc",
-    "ntdll_cache_unittest.cc",
   ]
   include_dirs = [ "$target_gen_dir" ]
   deps = [
     ":blacklist",
     ":blacklist_test_main_dll",
-    ":lib",
     "//base",
     "//base/test:run_all_unittests",
     "//base/test:test_support",
diff --git a/chrome_elf/chrome_elf.def b/chrome_elf/chrome_elf.def
index 07541e2..cbf3543 100644
--- a/chrome_elf/chrome_elf.def
+++ b/chrome_elf/chrome_elf.def
@@ -5,8 +5,6 @@
 LIBRARY  "chrome_elf.dll"
 
 EXPORTS
-  CreateFileW=CreateFileWRedirect
-  GetRedirectCount
   IsBlacklistInitialized
   SignalChromeElf
   SuccessfullyBlocked
diff --git a/chrome_elf/chrome_elf.gyp b/chrome_elf/chrome_elf.gyp
index 5b7998d..1532c17 100644
--- a/chrome_elf/chrome_elf.gyp
+++ b/chrome_elf/chrome_elf.gyp
@@ -42,7 +42,6 @@
       'dependencies': [
         'blacklist',
         'chrome_elf_breakpad',
-        'chrome_elf_lib',
         'chrome_elf_resources',
       ],
       'msvs_settings': {
@@ -71,16 +70,13 @@
       'sources': [
         'blacklist/test/blacklist_test.cc',
         'chrome_elf_util_unittest.cc',
-        'create_file/chrome_create_file_unittest.cc',
         'elf_imports_unittest.cc',
-        'ntdll_cache_unittest.cc',
       ],
       'include_dirs': [
         '..',
         '<(SHARED_INTERMEDIATE_DIR)',
       ],
       'dependencies': [
-        'chrome_elf_lib',
         '../base/base.gyp:base',
         '../base/base.gyp:run_all_unittests',
         '../base/base.gyp:test_support_base',
@@ -106,24 +102,6 @@
       ],
     },
     {
-      'target_name': 'chrome_elf_lib',
-      'type': 'static_library',
-      'include_dirs': [
-        '..',
-      ],
-      'sources': [
-        'create_file/chrome_create_file.cc',
-        'create_file/chrome_create_file.h',
-        'ntdll_cache.cc',
-        'ntdll_cache.h',
-      ],
-      'dependencies': [
-        'chrome_elf_common',
-        '../base/base.gyp:base_static',
-        '../sandbox/sandbox.gyp:sandbox',
-      ],
-    },
-    {
       'target_name': 'chrome_elf_constants',
       'type': 'static_library',
       'include_dirs': [
@@ -169,36 +147,4 @@
       ],
     },
   ], # targets
-  'conditions': [
-    ['component=="shared_library"', {
-      'targets': [
-        {
-          'target_name': 'chrome_redirects',
-          'type': 'shared_library',
-          'include_dirs': [
-            '..',
-          ],
-          'sources': [
-            'chrome_redirects.def',
-            'chrome_redirects_main.cc',
-          ],
-          'dependencies': [
-            'chrome_elf_lib',
-          ],
-          'msvs_settings': {
-            'VCLinkerTool': {
-              'conditions': [
-                ['target_arch=="ia32"', {
-                  # Don't set an x64 base address (to avoid breaking HE-ASLR).
-                  'BaseAddress': '0x01c20000',
-                }],
-              ],
-              # Set /SUBSYSTEM:WINDOWS.
-              'SubSystem': '2',
-            },
-          },
-        },
-      ],
-    }],
-  ],
 }
diff --git a/chrome_elf/chrome_elf_constants.cc b/chrome_elf/chrome_elf_constants.cc
index ffb9b9d..0300b53 100644
--- a/chrome_elf/chrome_elf_constants.cc
+++ b/chrome_elf/chrome_elf_constants.cc
@@ -12,14 +12,7 @@
 #error Unknown branding
 #endif
 
-#if defined(GOOGLE_CHROME_BUILD)
-const wchar_t kAppDataDirName[] = L"Google\\Chrome";
-#else
-const wchar_t kAppDataDirName[] = L"Chromium";
-#endif
-const wchar_t kCanaryAppDataDirName[] = L"Google\\Chrome SxS";
 const wchar_t kLocalStateFilename[] = L"Local State";
-const wchar_t kPreferencesFilename[] = L"Preferences";
 const wchar_t kUserDataDirName[] = L"User Data";
 
 namespace blacklist {
diff --git a/chrome_elf/chrome_elf_constants.h b/chrome_elf/chrome_elf_constants.h
index 92e44cad..bda7a50 100644
--- a/chrome_elf/chrome_elf_constants.h
+++ b/chrome_elf/chrome_elf_constants.h
@@ -10,10 +10,7 @@
 #include <windows.h>
 
 // directory names
-extern const wchar_t kAppDataDirName[];
-extern const wchar_t kCanaryAppDataDirName[];
 extern const wchar_t kLocalStateFilename[];
-extern const wchar_t kPreferencesFilename[];
 extern const wchar_t kUserDataDirName[];
 
 namespace blacklist {
diff --git a/chrome_elf/chrome_elf_main.cc b/chrome_elf/chrome_elf_main.cc
index 52212cc..0cd740ac 100644
--- a/chrome_elf/chrome_elf_main.cc
+++ b/chrome_elf/chrome_elf_main.cc
@@ -9,7 +9,6 @@
 #include "chrome_elf/blacklist/blacklist.h"
 #include "chrome_elf/breakpad.h"
 #include "chrome_elf/chrome_elf_util.h"
-#include "chrome_elf/ntdll_cache.h"
 
 void SignalChromeElf() {
   blacklist::ResetBeacon();
@@ -21,7 +20,6 @@
     InitializeCrashReporting();
 
     __try {
-      InitCache();
       blacklist::Initialize(false);  // Don't force, abort if beacon is present.
     } __except(GenerateCrashDump(GetExceptionInformation())) {
     }
diff --git a/chrome_elf/chrome_elf_types.h b/chrome_elf/chrome_elf_types.h
deleted file mode 100644
index 9cad485..0000000
--- a/chrome_elf/chrome_elf_types.h
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2013 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_ELF_CHROME_ELF_TYPES_H_
-#define CHROME_ELF_CHROME_ELF_TYPES_H_
-
-#include <map>
-#include <string>
-
-typedef std::map<std::string, void*> FunctionLookupTable;
-
-#endif  // CHROME_ELF_CHROME_ELF_TYPES_H_
diff --git a/chrome_elf/chrome_redirects.def b/chrome_elf/chrome_redirects.def
deleted file mode 100644
index 1238dc6c..0000000
--- a/chrome_elf/chrome_redirects.def
+++ /dev/null
@@ -1,9 +0,0 @@
-; Copyright 2014 The Chromium Authors. All rights reserved.
-; Use of this source code is governed by a BSD-style license that can be
-; found in the LICENSE file.
-
-LIBRARY  "chrome_redirects.dll"
-
-EXPORTS
-  CreateFileW=CreateFileWRedirect
-  GetRedirectCount
diff --git a/chrome_elf/chrome_redirects_main.cc b/chrome_elf/chrome_redirects_main.cc
deleted file mode 100644
index 960d07c..0000000
--- a/chrome_elf/chrome_redirects_main.cc
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <windows.h>
-
-#include "chrome_elf/ntdll_cache.h"
-
-BOOL APIENTRY DllMain(HMODULE module, DWORD reason, LPVOID reserved) {
-  if (reason == DLL_PROCESS_ATTACH)
-    InitCache();
-
-  return TRUE;
-}
diff --git a/chrome_elf/create_file/chrome_create_file.cc b/chrome_elf/create_file/chrome_create_file.cc
deleted file mode 100644
index 2db6f8d..0000000
--- a/chrome_elf/create_file/chrome_create_file.cc
+++ /dev/null
@@ -1,330 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome_elf/create_file/chrome_create_file.h"
-
-#include <string>
-
-#include "base/strings/string16.h"
-#include "chrome_elf/chrome_elf_constants.h"
-#include "chrome_elf/chrome_elf_util.h"
-#include "chrome_elf/ntdll_cache.h"
-#include "sandbox/win/src/interception_internal.h"
-#include "sandbox/win/src/nt_internals.h"
-
-namespace {
-
-// From ShlObj.h in the Windows SDK.
-#define CSIDL_LOCAL_APPDATA 0x001c
-
-typedef BOOL (WINAPI *PathIsUNCFunction)(
-  IN LPCWSTR path);
-
-typedef BOOL (WINAPI *PathAppendFunction)(
-  IN LPWSTR path,
-  IN LPCWSTR more);
-
-typedef BOOL (WINAPI *PathIsPrefixFunction)(
-  IN LPCWSTR prefix,
-  IN LPCWSTR path);
-
-typedef LPCWSTR (WINAPI *PathFindFileName)(
-  IN LPCWSTR path);
-
-typedef HRESULT (WINAPI *SHGetFolderPathFunction)(
-  IN HWND hwnd_owner,
-  IN int folder,
-  IN HANDLE token,
-  IN DWORD flags,
-  OUT LPWSTR path);
-
-PathIsUNCFunction g_path_is_unc_func;
-PathAppendFunction g_path_append_func;
-PathIsPrefixFunction g_path_is_prefix_func;
-PathFindFileName g_path_find_filename_func;
-SHGetFolderPathFunction g_get_folder_func;
-
-// Record the number of calls we've redirected so far.
-int g_redirect_count = 0;
-
-// Populates the g_*_func pointers to functions which will be used in
-// ShouldBypass(). Chrome_elf cannot have a load-time dependency on shell32 or
-// shlwapi as this would induce a load-time dependency on user32.dll. Instead,
-// the addresses of the functions we need are retrieved the first time this
-// method is called, and cached to avoid subsequent calls to GetProcAddress().
-// It is assumed that the host process will never unload these functions.
-// Returns true if all the functions needed are present.
-bool PopulateShellFunctions() {
-  // Early exit if functions have already been populated.
-  if (g_path_is_unc_func && g_path_append_func &&
-      g_path_is_prefix_func && g_get_folder_func) {
-    return true;
-  }
-
-  // Get the addresses of the functions we need and store them for future use.
-  // These handles are intentionally leaked to ensure that these modules do not
-  // get unloaded.
-  HMODULE shell32 = ::LoadLibrary(L"shell32.dll");
-  HMODULE shlwapi = ::LoadLibrary(L"shlwapi.dll");
-
-  if (!shlwapi || !shell32)
-    return false;
-
-  g_path_is_unc_func = reinterpret_cast<PathIsUNCFunction>(
-      ::GetProcAddress(shlwapi, "PathIsUNCW"));
-  g_path_append_func = reinterpret_cast<PathAppendFunction>(
-      ::GetProcAddress(shlwapi, "PathAppendW"));
-  g_path_is_prefix_func = reinterpret_cast<PathIsPrefixFunction>(
-      ::GetProcAddress(shlwapi, "PathIsPrefixW"));
-  g_path_find_filename_func = reinterpret_cast<PathFindFileName>(
-      ::GetProcAddress(shlwapi, "PathFindFileNameW"));
-  g_get_folder_func = reinterpret_cast<SHGetFolderPathFunction>(
-      ::GetProcAddress(shell32, "SHGetFolderPathW"));
-
-  return g_path_is_unc_func && g_path_append_func && g_path_is_prefix_func &&
-      g_path_find_filename_func && g_get_folder_func;
-}
-
-}  // namespace
-
-// Turn off optimization to make sure these calls don't get inlined.
-#pragma optimize("", off)
-// Wrapper method for kernel32!CreateFile, to avoid setting off caller
-// mitigation detectors.
-HANDLE CreateFileWImpl(LPCWSTR file_name,
-                       DWORD desired_access,
-                       DWORD share_mode,
-                       LPSECURITY_ATTRIBUTES security_attributes,
-                       DWORD creation_disposition,
-                       DWORD flags_and_attributes,
-                       HANDLE template_file) {
-  return CreateFile(file_name,
-                    desired_access,
-                    share_mode,
-                    security_attributes,
-                    creation_disposition,
-                    flags_and_attributes,
-                    template_file);
-
-}
-
-HANDLE WINAPI CreateFileWRedirect(
-    LPCWSTR file_name,
-    DWORD desired_access,
-    DWORD share_mode,
-    LPSECURITY_ATTRIBUTES security_attributes,
-    DWORD creation_disposition,
-    DWORD flags_and_attributes,
-    HANDLE template_file) {
-  if (ShouldBypass(file_name)) {
-    ++g_redirect_count;
-    return CreateFileNTDLL(file_name,
-                           desired_access,
-                           share_mode,
-                           security_attributes,
-                           creation_disposition,
-                           flags_and_attributes,
-                           template_file);
-  }
-  return CreateFileWImpl(file_name,
-                         desired_access,
-                         share_mode,
-                         security_attributes,
-                         creation_disposition,
-                         flags_and_attributes,
-                         template_file);
-}
-#pragma optimize("", on)
-
-int GetRedirectCount() {
-  return g_redirect_count;
-}
-
-HANDLE CreateFileNTDLL(
-    LPCWSTR file_name,
-    DWORD desired_access,
-    DWORD share_mode,
-    LPSECURITY_ATTRIBUTES security_attributes,
-    DWORD creation_disposition,
-    DWORD flags_and_attributes,
-    HANDLE template_file) {
-  HANDLE file_handle = INVALID_HANDLE_VALUE;
-  NTSTATUS result = STATUS_UNSUCCESSFUL;
-  IO_STATUS_BLOCK io_status_block = {};
-  ULONG flags = 0;
-
-  // Convert from Win32 domain to to NT creation disposition values.
-  switch (creation_disposition) {
-    case CREATE_NEW:
-      creation_disposition = FILE_CREATE;
-      break;
-    case CREATE_ALWAYS:
-      creation_disposition = FILE_OVERWRITE_IF;
-      break;
-    case OPEN_EXISTING:
-      creation_disposition = FILE_OPEN;
-      break;
-    case OPEN_ALWAYS:
-      creation_disposition = FILE_OPEN_IF;
-      break;
-    case TRUNCATE_EXISTING:
-      creation_disposition = FILE_OVERWRITE;
-      break;
-    default:
-      SetLastError(ERROR_INVALID_PARAMETER);
-      return INVALID_HANDLE_VALUE;
-  }
-
-  // Translate the flags that need no validation:
-  if (!(flags_and_attributes & FILE_FLAG_OVERLAPPED))
-    flags |= FILE_SYNCHRONOUS_IO_NONALERT;
-
-  if (flags_and_attributes & FILE_FLAG_WRITE_THROUGH)
-    flags |= FILE_WRITE_THROUGH;
-
-  if (flags_and_attributes & FILE_FLAG_RANDOM_ACCESS)
-    flags |= FILE_RANDOM_ACCESS;
-
-  if (flags_and_attributes & FILE_FLAG_SEQUENTIAL_SCAN)
-    flags |= FILE_SEQUENTIAL_ONLY;
-
-  if (flags_and_attributes & FILE_FLAG_DELETE_ON_CLOSE) {
-    flags |= FILE_DELETE_ON_CLOSE;
-    desired_access |= DELETE;
-  }
-
-  if (flags_and_attributes & FILE_FLAG_BACKUP_SEMANTICS)
-    flags |= FILE_OPEN_FOR_BACKUP_INTENT;
-  else
-    flags |= FILE_NON_DIRECTORY_FILE;
-
-
-  if (flags_and_attributes & FILE_FLAG_OPEN_REPARSE_POINT)
-    flags |= FILE_OPEN_REPARSE_POINT;
-
-  if (flags_and_attributes & FILE_FLAG_OPEN_NO_RECALL)
-    flags |= FILE_OPEN_NO_RECALL;
-
-  if (!g_ntdll_lookup["RtlInitUnicodeString"])
-    return INVALID_HANDLE_VALUE;
-
-  NtCreateFileFunction create_file;
-  char thunk_buffer[sizeof(sandbox::ThunkData)] = {};
-
-  if (g_nt_thunk_storage.data[0] != 0) {
-    create_file = reinterpret_cast<NtCreateFileFunction>(&g_nt_thunk_storage);
-    // Copy the thunk data to a buffer on the stack for debugging purposes.
-    memcpy(&thunk_buffer, &g_nt_thunk_storage, sizeof(sandbox::ThunkData));
-  } else if (g_ntdll_lookup["NtCreateFile"]) {
-    create_file =
-        reinterpret_cast<NtCreateFileFunction>(g_ntdll_lookup["NtCreateFile"]);
-  } else {
-    return INVALID_HANDLE_VALUE;
-  }
-
-  RtlInitUnicodeStringFunction init_unicode_string =
-      reinterpret_cast<RtlInitUnicodeStringFunction>(
-          g_ntdll_lookup["RtlInitUnicodeString"]);
-
-  UNICODE_STRING path_unicode_string;
-
-  // Format the path into an NT path. Arguably this should be done with
-  // RtlDosPathNameToNtPathName_U, but afaict this is equivalent for
-  // local paths. Using this with a UNC path name will almost certainly
-  // break in interesting ways.
-  base::string16 filename_string(L"\\??\\");
-  filename_string += file_name;
-
-  init_unicode_string(&path_unicode_string, filename_string.c_str());
-
-  OBJECT_ATTRIBUTES path_attributes = {};
-  InitializeObjectAttributes(&path_attributes,
-                             &path_unicode_string,
-                             OBJ_CASE_INSENSITIVE,
-                             NULL,   // No Root Directory
-                             NULL);  // No Security Descriptor
-
-  // Set desired_access, and flags_and_attributes to match those
-  // set by kernel32!CreateFile.
-  desired_access |= 0x100080;
-  flags_and_attributes &= 0x2FFA7;
-
-  result = create_file(&file_handle,
-                       desired_access,
-                       &path_attributes,
-                       &io_status_block,
-                       0,  // Allocation size
-                       flags_and_attributes,
-                       share_mode,
-                       creation_disposition,
-                       flags,
-                       NULL,
-                       0);
-
-  if (result != STATUS_SUCCESS) {
-    if (result == STATUS_OBJECT_NAME_COLLISION &&
-        creation_disposition == FILE_CREATE) {
-      SetLastError(ERROR_FILE_EXISTS);
-    }
-    return INVALID_HANDLE_VALUE;
-  }
-
-  if (creation_disposition == FILE_OPEN_IF) {
-    SetLastError(io_status_block.Information == FILE_OPENED ?
-        ERROR_ALREADY_EXISTS : ERROR_SUCCESS);
-  } else if (creation_disposition == FILE_OVERWRITE_IF) {
-    SetLastError(io_status_block.Information == FILE_OVERWRITTEN ?
-        ERROR_ALREADY_EXISTS : ERROR_SUCCESS);
-  } else {
-    SetLastError(ERROR_SUCCESS);
-  }
-
-  return file_handle;
-}
-
-bool ShouldBypass(LPCWSTR file_path) {
-  // Do not redirect in non-browser processes.
-  if (IsNonBrowserProcess())
-    return false;
-
-  // If the shell functions are not present, forward the call to kernel32.
-  if (!PopulateShellFunctions())
-    return false;
-
-  // Forward all UNC filepaths to kernel32.
-  if (g_path_is_unc_func(file_path))
-    return false;
-
-  wchar_t local_appdata_path[MAX_PATH];
-
-  // Get the %LOCALAPPDATA% Path and append the location of our UserData
-  // directory to it.
-  HRESULT appdata_result = g_get_folder_func(
-      NULL, CSIDL_LOCAL_APPDATA, NULL, 0, local_appdata_path);
-
-  wchar_t buffer[MAX_PATH] = {};
-  if (!GetModuleFileNameW(NULL, buffer, MAX_PATH))
-    return false;
-
-  bool is_canary = IsCanary(buffer);
-
-  // If getting the %LOCALAPPDATA% path or appending to it failed, then forward
-  // the call to kernel32.
-  if (!SUCCEEDED(appdata_result) ||
-      !g_path_append_func(local_appdata_path, is_canary ?
-          kCanaryAppDataDirName : kAppDataDirName) ||
-      !g_path_append_func(local_appdata_path, kUserDataDirName)) {
-    return false;
-  }
-
-  LPCWSTR file_name = g_path_find_filename_func(file_path);
-
-  bool in_userdata_dir = !!g_path_is_prefix_func(local_appdata_path, file_path);
-  bool is_settings_file = wcscmp(file_name, kPreferencesFilename) == 0 ||
-      wcscmp(file_name, kLocalStateFilename) == 0;
-
-  // Check if we are trying to access the Preferences in the UserData dir. If
-  // so, then redirect the call to bypass kernel32.
-  return in_userdata_dir && is_settings_file;
-}
diff --git a/chrome_elf/create_file/chrome_create_file.h b/chrome_elf/create_file/chrome_create_file.h
deleted file mode 100644
index f9f15c3..0000000
--- a/chrome_elf/create_file/chrome_create_file.h
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_ELF_CREATE_FILE_CHROME_CREATE_FILE_H_
-#define CHROME_ELF_CREATE_FILE_CHROME_CREATE_FILE_H_
-
-#include <windows.h>
-
-#include "chrome_elf/chrome_elf_types.h"
-
-// A CreateFileW replacement that will call NTCreateFile directly when the
-// criteria defined in ShouldBypass() are satisfied for |lp_file_name|.
-extern "C" HANDLE WINAPI CreateFileWRedirect(
-    LPCWSTR file_name,
-    DWORD desired_access,
-    DWORD share_mode,
-    LPSECURITY_ATTRIBUTES security_attributes,
-    DWORD creation_disposition,
-    DWORD flags_and_attributes,
-    HANDLE template_file);
-
-// Returns the count of CreateFile calls redirected so far.
-extern "C" int GetRedirectCount();
-
-// Partial reimplementation of kernel32!CreateFile (very partial: only handles
-// reading and writing to files in the User Data directory).
-HANDLE CreateFileNTDLL(
-    LPCWSTR file_name,
-    DWORD desired_access,
-    DWORD share_mode,
-    LPSECURITY_ATTRIBUTES security_attributes,
-    DWORD creation_disposition,
-    DWORD flags_and_attributes,
-    HANDLE template_file);
-
-// Determines whether or not we should use our version of CreateFile, or the
-// system version (only uses ours if we're writing to the user data directory).
-bool ShouldBypass(LPCWSTR file_name);
-
-#endif  // CHROME_ELF_CREATE_FILE_CHROME_CREATE_FILE_H_
diff --git a/chrome_elf/create_file/chrome_create_file_unittest.cc b/chrome_elf/create_file/chrome_create_file_unittest.cc
deleted file mode 100644
index 8b0331fe..0000000
--- a/chrome_elf/create_file/chrome_create_file_unittest.cc
+++ /dev/null
@@ -1,409 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome_elf/create_file/chrome_create_file.h"
-
-#include <windows.h>
-
-#include <bitset>
-#include <string>
-
-#include "base/base_paths_win.h"
-#include "base/files/file_path.h"
-#include "base/files/file_util.h"
-#include "base/files/scoped_temp_dir.h"
-#include "base/path_service.h"
-#include "base/threading/platform_thread.h"
-#include "base/win/iat_patch_function.h"
-#include "base/win/scoped_handle.h"
-#include "base/win/windows_version.h"
-#include "chrome_elf/chrome_elf_constants.h"
-#include "chrome_elf/ntdll_cache.h"
-#include "sandbox/win/src/interception_internal.h"
-#include "sandbox/win/src/nt_internals.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "testing/platform_test.h"
-
-
-namespace {
-
-// Test fixtures -------------------------------------------------------------
-
-class ChromeCreateFileTest : public PlatformTest {
- protected:
-  struct NtCreateFileParams {
-    ACCESS_MASK desired_access;
-    OBJECT_ATTRIBUTES object_attributes;
-    PLARGE_INTEGER allocation_size;
-    ULONG file_attributes;
-    ULONG share_access;
-    ULONG create_disposition;
-    ULONG create_options;
-    PVOID ea_buffer;
-    ULONG ea_length;
-  };
-
-  enum CallPath {
-    ELF,
-    KERNEL
-  };
-
-  template<CallPath path>
-  static NTSTATUS WINAPI FakeNtCreateFile(
-      PHANDLE file_handle,
-      ACCESS_MASK desired_access,
-      POBJECT_ATTRIBUTES object_attributes,
-      PIO_STATUS_BLOCK io_status_block,
-      PLARGE_INTEGER allocation_size,
-      ULONG file_attributes,
-      ULONG share_access,
-      ULONG create_disposition,
-      ULONG create_options,
-      PVOID ea_buffer,
-      ULONG ea_length) {
-    return self_->HandleCreateFileCall(file_handle,
-        desired_access,
-        object_attributes,
-        io_status_block,
-        allocation_size,
-        file_attributes,
-        share_access,
-        create_disposition,
-        create_options,
-        ea_buffer,
-        ea_length,
-        path);
-  }
-
-  void SetUp() override {
-    original_thread_ = base::PlatformThread::CurrentId();
-    InitCache();
-    PlatformTest::SetUp();
-
-    base::FilePath user_data_dir;
-    PathService::Get(base::DIR_LOCAL_APP_DATA, &user_data_dir);
-    ASSERT_TRUE(temp_dir_.CreateUniqueTempDirUnderPath(user_data_dir));
-    ASSERT_TRUE(temp_dir2_.CreateUniqueTempDir());
-    self_ = this;
-  }
-
-  void UnsetThunkStorage() {
-    DWORD old_protect = 0;
-    EXPECT_TRUE(::VirtualProtect(&g_nt_thunk_storage,
-                                 sizeof(g_nt_thunk_storage),
-                                 PAGE_EXECUTE_READWRITE,
-                                 &old_protect));
-    memset(&g_nt_thunk_storage, 0, sizeof(g_nt_thunk_storage));
-
-    EXPECT_TRUE(::VirtualProtect(&g_nt_thunk_storage,
-                                 sizeof(g_nt_thunk_storage),
-                                 PAGE_EXECUTE_READ,
-                                 &old_protect));
-  }
-
-  void RedirectNtCreateFileCalls() {
-    UnsetThunkStorage();
-    old_func_ptr_ =
-        reinterpret_cast<NtCreateFileFunction>(g_ntdll_lookup["NtCreateFile"]);
-
-    // KernelBase.dll only exists for Win7 and later, prior to that, kernel32
-    // imports from ntdll directly.
-    if (base::win::GetVersion() < base::win::VERSION_WIN7) {
-      patcher_.Patch(L"kernel32.dll", "ntdll.dll", "NtCreateFile",
-          reinterpret_cast<void(*)()>(&FakeNtCreateFile<KERNEL>));
-    } else {
-      patcher_.Patch(L"kernelbase.dll", "ntdll.dll", "NtCreateFile",
-          reinterpret_cast<void(*)()>(&FakeNtCreateFile<KERNEL>));
-    }
-
-    g_ntdll_lookup["NtCreateFile"] = reinterpret_cast<void(*)()>(
-        &ChromeCreateFileTest::FakeNtCreateFile<ELF>);
-  }
-
-  void ResetNtCreateFileCalls() {
-    g_ntdll_lookup["NtCreateFile"] = reinterpret_cast<void*>(old_func_ptr_);
-    patcher_.Unpatch();
-  }
-
-  NTSTATUS HandleCreateFileCall(PHANDLE file_handle,
-      ACCESS_MASK desired_access,
-      POBJECT_ATTRIBUTES object_attributes,
-      PIO_STATUS_BLOCK io_status_block,
-      PLARGE_INTEGER allocation_size,
-      ULONG file_attributes,
-      ULONG share_access,
-      ULONG create_disposition,
-      ULONG create_options,
-      PVOID ea_buffer,
-      ULONG ea_length,
-      CallPath call_path) {
-    if (original_thread_ == base::PlatformThread::CurrentId()) {
-      SetParams(desired_access,
-          object_attributes,
-          allocation_size,
-          file_attributes,
-          share_access,
-          create_disposition,
-          create_options,
-          ea_buffer,
-          ea_length,
-          call_path == ELF ? &elf_params_ : &kernel_params_);
-    }
-
-    // Forward the call to the real NTCreateFile.
-    return old_func_ptr_(file_handle,
-        desired_access,
-        object_attributes,
-        io_status_block,
-        allocation_size,
-        file_attributes,
-        share_access,
-        create_disposition,
-        create_options,
-        ea_buffer,
-        ea_length);
-  }
-
-  void SetParams(ACCESS_MASK desired_access,
-      POBJECT_ATTRIBUTES object_attributes,
-      PLARGE_INTEGER allocation_size,
-      ULONG file_attributes,
-      ULONG share_access,
-      ULONG create_disposition,
-      ULONG create_options,
-      PVOID ea_buffer,
-      ULONG ea_length,
-      NtCreateFileParams* params) {
-    params->desired_access = desired_access;
-    params->object_attributes.Length = object_attributes->Length;
-    params->object_attributes.ObjectName = object_attributes->ObjectName;
-    params->object_attributes.RootDirectory = object_attributes->RootDirectory;
-    params->object_attributes.Attributes = object_attributes->Attributes;
-    params->object_attributes.SecurityDescriptor =
-        object_attributes->SecurityDescriptor;
-    params->object_attributes.SecurityQualityOfService =
-        object_attributes->SecurityQualityOfService;
-    params->allocation_size = allocation_size;
-    params->file_attributes = file_attributes;
-    params->share_access = share_access;
-    params->create_disposition = create_disposition;
-    params->create_options = create_options;
-    params->ea_buffer = ea_buffer;
-    params->ea_length = ea_length;
-  }
-
-  void CheckParams() {
-    std::bitset<32> elf((int) elf_params_.desired_access);
-    std::bitset<32> ker((int) kernel_params_.desired_access);
-
-    EXPECT_EQ(kernel_params_.desired_access, elf_params_.desired_access)
-        << elf << "\n" << ker;
-    EXPECT_EQ(kernel_params_.object_attributes.Length,
-              elf_params_.object_attributes.Length);
-    EXPECT_EQ(kernel_params_.object_attributes.RootDirectory,
-              elf_params_.object_attributes.RootDirectory);
-    EXPECT_EQ(kernel_params_.object_attributes.Attributes,
-              elf_params_.object_attributes.Attributes);
-    EXPECT_EQ(kernel_params_.object_attributes.SecurityDescriptor,
-              elf_params_.object_attributes.SecurityDescriptor);
-    EXPECT_EQ(kernel_params_.allocation_size, elf_params_.allocation_size);
-    EXPECT_EQ(kernel_params_.file_attributes, elf_params_.file_attributes);
-    EXPECT_EQ(kernel_params_.share_access, elf_params_.share_access);
-    EXPECT_EQ(kernel_params_.create_disposition,
-              elf_params_.create_disposition);
-    EXPECT_EQ(kernel_params_.create_options, elf_params_.create_options);
-    EXPECT_EQ(kernel_params_.ea_buffer, elf_params_.ea_buffer);
-    EXPECT_EQ(kernel_params_.ea_length, elf_params_.ea_length);
-  }
-
-  void DoWriteCheck(const base::FilePath& path, DWORD flag, bool is_system) {
-    base::win::ScopedHandle file_handle;
-    const char kTestData[] = "0123456789";
-    int buffer_size = sizeof(kTestData) - 1;
-    DWORD bytes_written;
-
-    if (is_system) {
-      file_handle.Set(::CreateFileW(path.value().c_str(),
-                                    GENERIC_WRITE,
-                                    FILE_SHARE_READ,
-                                    NULL,
-                                    CREATE_ALWAYS,
-                                    FILE_ATTRIBUTE_NORMAL | flag,
-                                    NULL));
-    } else {
-      file_handle.Set(CreateFileNTDLL(path.value().c_str(),
-                                      GENERIC_WRITE,
-                                      FILE_SHARE_READ,
-                                      NULL,
-                                      CREATE_ALWAYS,
-                                      FILE_ATTRIBUTE_NORMAL | flag,
-                                      NULL));
-    }
-
-
-    EXPECT_TRUE(file_handle.IsValid());
-    ::WriteFile(file_handle.Get(), kTestData, buffer_size, &bytes_written,
-                NULL);
-    EXPECT_EQ(buffer_size, bytes_written);
-  }
-
-  void DoReadCheck(const base::FilePath& path, DWORD flag, bool is_system) {
-    base::win::ScopedHandle file_handle;
-    const char kTestData[] = "0123456789";
-    int buffer_size = sizeof(kTestData) - 1;
-    DWORD bytes_read;
-    char read_buffer[10];
-
-    if (is_system) {
-      file_handle.Set(::CreateFileW(path.value().c_str(),
-                                    GENERIC_READ,
-                                    0,
-                                    NULL,
-                                    OPEN_ALWAYS,
-                                    FILE_ATTRIBUTE_NORMAL | flag,
-                                    NULL));
-    } else {
-      file_handle.Set(CreateFileNTDLL(path.value().c_str(),
-                                      GENERIC_READ,
-                                      0,
-                                      NULL,
-                                      OPEN_ALWAYS,
-                                      FILE_ATTRIBUTE_NORMAL | flag,
-                                      NULL));
-    }
-
-    EXPECT_TRUE(file_handle.IsValid());
-    ::ReadFile(file_handle.Get(), read_buffer, buffer_size, &bytes_read, NULL);
-    EXPECT_EQ(buffer_size, bytes_read);
-    EXPECT_EQ(0, memcmp(kTestData, read_buffer, bytes_read));
-  }
-
-  void RunChecks(DWORD flag, bool check_reads) {
-    // Make sure we can write to this file handle when called via the system.
-    base::FilePath junk_path_1 = temp_dir_.path().Append(L"junk_1.txt");
-    base::FilePath junk_path_2 = temp_dir_.path().Append(L"junk_2.txt");
-    DoWriteCheck(junk_path_1, flag, true);
-    DoWriteCheck(junk_path_2, flag, false);
-    CheckParams();
-
-    if (check_reads) {
-      // Make sure we can read from this file handle when called via the system.
-      DoReadCheck(junk_path_1, flag, true);
-      DoReadCheck(junk_path_2, flag, false);
-      CheckParams();
-    }
-    base::DeleteFile(junk_path_1, false);
-    base::DeleteFile(junk_path_2, false);
-
-  }
-
-  static ChromeCreateFileTest* self_;
-
-  NtCreateFileFunction old_func_ptr_;
-  base::ScopedTempDir temp_dir_;
-  base::ScopedTempDir temp_dir2_;
-  base::win::IATPatchFunction patcher_;
-  NtCreateFileParams kernel_params_;
-  NtCreateFileParams elf_params_;
-  base::PlatformThreadId original_thread_;
-};
-
-ChromeCreateFileTest* ChromeCreateFileTest::self_ = NULL;
-
-// Tests ---------------------------------------------------------------------
-TEST_F(ChromeCreateFileTest, CheckParams_FILE_ATTRIBUTE_NORMAL) {
-  RedirectNtCreateFileCalls();
-  RunChecks(FILE_ATTRIBUTE_NORMAL, true);
-  ResetNtCreateFileCalls();
-}
-
-TEST_F(ChromeCreateFileTest, CheckParams_FILE_FLAG_WRITE_THROUGH) {
-  RedirectNtCreateFileCalls();
-  RunChecks(FILE_FLAG_WRITE_THROUGH, true);
-  ResetNtCreateFileCalls();
-}
-
-TEST_F(ChromeCreateFileTest, CheckParams_FILE_FLAG_RANDOM_ACCESS) {
-  RedirectNtCreateFileCalls();
-  RunChecks(FILE_FLAG_RANDOM_ACCESS, true);
-  ResetNtCreateFileCalls();
-}
-
-TEST_F(ChromeCreateFileTest, CheckParams_FILE_FLAG_SEQUENTIAL_SCAN) {
-  RedirectNtCreateFileCalls();
-  RunChecks(FILE_FLAG_SEQUENTIAL_SCAN, true);
-  ResetNtCreateFileCalls();
-}
-
-TEST_F(ChromeCreateFileTest, CheckParams_FILE_FLAG_DELETE_ON_CLOSE) {
-  RedirectNtCreateFileCalls();
-  RunChecks(FILE_FLAG_DELETE_ON_CLOSE, false);
-  ResetNtCreateFileCalls();
-}
-
-TEST_F(ChromeCreateFileTest, CheckParams_FILE_FLAG_BACKUP_SEMANTICS) {
-  RedirectNtCreateFileCalls();
-  RunChecks(FILE_FLAG_BACKUP_SEMANTICS, true);
-  ResetNtCreateFileCalls();
-}
-
-TEST_F(ChromeCreateFileTest, CheckParams_FILE_FLAG_OPEN_REPARSE_POINT) {
-  RedirectNtCreateFileCalls();
-  RunChecks(FILE_FLAG_OPEN_REPARSE_POINT, true);
-  ResetNtCreateFileCalls();
-}
-
-TEST_F(ChromeCreateFileTest, CheckParams_FILE_FLAG_OPEN_NO_RECALL) {
-  RedirectNtCreateFileCalls();
-  RunChecks(FILE_FLAG_OPEN_NO_RECALL, true);
-  ResetNtCreateFileCalls();
-}
-
-TEST_F(ChromeCreateFileTest, BypassTest) {
-  std::wstring UNC_filepath_file(L"\\\\.\\some_file.txt");
-
-  base::FilePath local_path;
-  PathService::Get(base::DIR_LOCAL_APP_DATA, &local_path);
-
-  base::FilePath local_prefs_path = local_path.Append(kAppDataDirName).Append(
-      kUserDataDirName).Append(L"default\\Preferences");
-  base::FilePath local_state_path = local_path.Append(kAppDataDirName).Append(
-      kUserDataDirName).Append(L"ninja\\Local State");
-  base::FilePath local_junk_path = local_path.Append(kAppDataDirName).Append(
-      kUserDataDirName).Append(L"default\\Junk");
-
-  base::FilePath desktop_path;
-  PathService::Get(base::DIR_USER_DESKTOP, &desktop_path);
-  base::FilePath desktop_junk_path =
-      desktop_path.Append(L"Downloads\\junk.txt");
-  base::FilePath desktop_prefs_path =
-      desktop_path.Append(L"Downloads\\Preferences");
-
-  // Don't redirect UNC files.
-  EXPECT_FALSE(ShouldBypass(UNC_filepath_file.c_str()));
-
-  // Don't redirect if file is not in UserData directory.
-  EXPECT_FALSE(ShouldBypass(desktop_junk_path.value().c_str()));
-  EXPECT_FALSE(ShouldBypass(desktop_prefs_path.value().c_str()));
-
-  // Only redirect "Preferences" and "Local State" files.
-  EXPECT_TRUE(ShouldBypass(local_prefs_path.value().c_str()));
-  EXPECT_TRUE(ShouldBypass(local_state_path.value().c_str()));
-  EXPECT_FALSE(ShouldBypass(local_junk_path.value().c_str()));
-}
-
-TEST_F(ChromeCreateFileTest, ReadWriteFromNtDll) {
-  UnsetThunkStorage();
-  base::FilePath file_name = temp_dir_.path().Append(L"some_file.txt");
-  DoWriteCheck(file_name, FILE_ATTRIBUTE_NORMAL, false);
-  DoReadCheck(file_name, FILE_ATTRIBUTE_NORMAL, false);
-}
-
-TEST_F(ChromeCreateFileTest, ReadWriteFromThunk) {
-  base::FilePath file_name = temp_dir_.path().Append(L"some_file.txt");
-  DoWriteCheck(file_name, FILE_ATTRIBUTE_NORMAL, false);
-  DoReadCheck(file_name, FILE_ATTRIBUTE_NORMAL, false);
-}
-
-}  // namespace
diff --git a/chrome_elf/ntdll_cache.cc b/chrome_elf/ntdll_cache.cc
deleted file mode 100644
index a0429a45..0000000
--- a/chrome_elf/ntdll_cache.cc
+++ /dev/null
@@ -1,89 +0,0 @@
-// Copyright 2013 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_elf/ntdll_cache.h"
-
-#include <stdint.h>
-#include <windows.h>
-
-#include "base/basictypes.h"
-#include "base/memory/scoped_ptr.h"
-#include "base/win/pe_image.h"
-#include "chrome_elf/thunk_getter.h"
-#include "sandbox/win/src/interception_internal.h"
-#include "sandbox/win/src/internal_types.h"
-#include "sandbox/win/src/service_resolver.h"
-
-FunctionLookupTable g_ntdll_lookup;
-
-// Allocate storage for thunks in a page of this module to save on doing
-// an extra allocation at run time.
-#pragma section(".crthunk",read,execute)
-__declspec(allocate(".crthunk")) sandbox::ThunkData g_nt_thunk_storage;
-
-
-
-namespace {
-
-bool EnumExportsCallback(const base::win::PEImage& image,
-                         DWORD ordinal,
-                         DWORD hint,
-                         LPCSTR name,
-                         PVOID function_addr,
-                         LPCSTR forward,
-                         PVOID cookie) {
-  // Our lookup only cares about named functions that are in ntdll, so skip
-  // unnamed or forwarded exports.
-  if (name && function_addr)
-    g_ntdll_lookup[std::string(name)] = function_addr;
-
-  return true;
-}
-
-}  // namespace
-
-void InitCache() {
-  HMODULE ntdll_handle = ::GetModuleHandle(L"ntdll.dll");
-
-  base::win::PEImage ntdll_image(ntdll_handle);
-
-  ntdll_image.EnumExports(EnumExportsCallback, NULL);
-
-  // If ntdll has already been patched, don't copy it.
-  const bool kRelaxed = false;
-
-  // Create a thunk via the appropriate ServiceResolver instance.
-  scoped_ptr<sandbox::ServiceResolverThunk> thunk(GetThunk(kRelaxed));
-
-  if (thunk.get()) {
-    BYTE* thunk_storage = reinterpret_cast<BYTE*>(&g_nt_thunk_storage);
-
-    // Mark the thunk storage as readable and writeable, since we
-    // are ready to write to it.
-    DWORD old_protect = 0;
-    if (!::VirtualProtect(&g_nt_thunk_storage,
-                          sizeof(g_nt_thunk_storage),
-                          PAGE_EXECUTE_READWRITE,
-                          &old_protect)) {
-      return;
-    }
-
-    size_t storage_used = 0;
-    NTSTATUS ret = thunk->CopyThunk(::GetModuleHandle(sandbox::kNtdllName),
-                                    "NtCreateFile",
-                                    thunk_storage,
-                                    sizeof(sandbox::ThunkData),
-                                    &storage_used);
-
-    if (!NT_SUCCESS(ret)) {
-      memset(&g_nt_thunk_storage, 0, sizeof(g_nt_thunk_storage));
-    }
-
-    // Ensure that the pointer to the old function can't be changed.
-    ::VirtualProtect(&g_nt_thunk_storage,
-                     sizeof(g_nt_thunk_storage),
-                     PAGE_EXECUTE_READ,
-                     &old_protect);
-  }
-}
diff --git a/chrome_elf/ntdll_cache.h b/chrome_elf/ntdll_cache.h
deleted file mode 100644
index 5e4fb2b..0000000
--- a/chrome_elf/ntdll_cache.h
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright 2013 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_ELF_NTDLL_CACHE_H_
-#define CHROME_ELF_NTDLL_CACHE_H_
-
-#include "chrome_elf/chrome_elf_types.h"
-
-namespace sandbox {
-struct ThunkData;
-}
-
-// Caches the addresses of all functions exported by ntdll in  |g_ntdll_lookup|.
-void InitCache();
-
-extern FunctionLookupTable g_ntdll_lookup;
-
-extern sandbox::ThunkData g_nt_thunk_storage;
-
-#endif  // CHROME_ELF_NTDLL_CACHE_H_
diff --git a/chrome_elf/ntdll_cache_unittest.cc b/chrome_elf/ntdll_cache_unittest.cc
deleted file mode 100644
index d3f3555a..0000000
--- a/chrome_elf/ntdll_cache_unittest.cc
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright 2013 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 <windows.h>
-
-#include "base/basictypes.h"
-#include "base/compiler_specific.h"
-#include "chrome_elf/ntdll_cache.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace {
-
-class NTDLLCacheTest : public testing::Test {
- protected:
-  void SetUp() override {
-    InitCache();
-  }
-
-};
-
-TEST_F(NTDLLCacheTest, NtDLLCacheSanityCheck) {
-  HMODULE ntdll_handle = ::GetModuleHandle(L"ntdll.dll");
-  // Grab a couple random entries from the cache and make sure they match the
-  // addresses exported by ntdll.
-  EXPECT_EQ(::GetProcAddress(ntdll_handle, "A_SHAFinal"),
-            g_ntdll_lookup["A_SHAFinal"]);
-  EXPECT_EQ(::GetProcAddress(ntdll_handle, "ZwTraceControl"),
-            g_ntdll_lookup["ZwTraceControl"]);
-}
-
-}  // namespace
diff --git a/cloud_print/BUILD.gn b/cloud_print/BUILD.gn
index d92c3b28..af1eca8f 100644
--- a/cloud_print/BUILD.gn
+++ b/cloud_print/BUILD.gn
@@ -17,8 +17,7 @@
     # When compiling 32-bit, also reference the 64-bit driver for installing on
     # 64-bit systems.
     if (target_cpu == "x86" && current_cpu == "x86") {
-      # TODO(brettw) enable this when Windows cross-compiles are set up.
-      # public_deps += [ "//cloud_print/virtual_driver/win/port_monitor(//build/toolchain/win:x64)" ]
+      public_deps += [ "//cloud_print/virtual_driver/win/port_monitor(//build/toolchain/win:x64)" ]
     }
   }
 }
diff --git a/cloud_print/virtual_driver/win/port_monitor/BUILD.gn b/cloud_print/virtual_driver/win/port_monitor/BUILD.gn
index 4365337d..bda788b1 100644
--- a/cloud_print/virtual_driver/win/port_monitor/BUILD.gn
+++ b/cloud_print/virtual_driver/win/port_monitor/BUILD.gn
@@ -14,7 +14,30 @@
   arch_suffix = ""
 }
 
-shared_library("port_monitor") {
+# When compiling a 64-bit port monitor from a 32-bit build, copy the DLL to the
+# root build directory. When targeting 64-bit CPUs, there is no cross-compiling
+# so nothing extra needs to happen.
+if (target_cpu == "x86" && current_cpu == "x64") {
+  copy("port_monitor") {
+    sources = [
+      "$root_out_dir/gcp_portmon64.dll",
+    ]
+    outputs = [
+      "$root_build_dir/gcp_portmon64.dll",
+    ]
+    deps = [
+      ":port_monitor_dll",
+    ]
+  }
+} else {
+  group("port_monitor") {
+    public_deps = [
+      ":port_monitor_dll",
+    ]
+  }
+}
+
+shared_library("port_monitor_dll") {
   output_name = "gcp_portmon$arch_suffix"
 
   sources = [
diff --git a/components/BUILD.gn b/components/BUILD.gn
index 6ee2cb5..6acbea7 100644
--- a/components/BUILD.gn
+++ b/components/BUILD.gn
@@ -14,6 +14,7 @@
   visibility = [ "//:*" ]  # Only for the root targets to bring in.
 
   deps = [
+    "//components/bitmap_uploader",
     "//components/bookmarks/browser",
     "//components/bookmarks/common",
     "//components/bookmarks/managed",
@@ -111,7 +112,6 @@
       "//components/pdf/browser",
       "//components/pdf/common",
       "//components/pdf/renderer",
-      "//components/plugins/common",
       "//components/plugins/renderer",
       "//components/power",
       "//components/precache/core",
diff --git a/components/autofill.gypi b/components/autofill.gypi
index f30eb9d..19ff103 100644
--- a/components/autofill.gypi
+++ b/components/autofill.gypi
@@ -175,6 +175,9 @@
         'autofill/core/browser/options_util.h',
         'autofill/core/browser/password_generator.cc',
         'autofill/core/browser/password_generator.h',
+        'autofill/core/browser/payments/payments_client.cc',
+        'autofill/core/browser/payments/payments_client.h',
+        'autofill/core/browser/payments/payments_request.h',
         'autofill/core/browser/personal_data_manager.cc',
         'autofill/core/browser/personal_data_manager.h',
         'autofill/core/browser/personal_data_manager_observer.h',
@@ -197,8 +200,6 @@
         'autofill/core/browser/ui/card_unmask_prompt_view.h',
         'autofill/core/browser/validation.cc',
         'autofill/core/browser/validation.h',
-        'autofill/core/browser/wallet/real_pan_wallet_client.cc',
-        'autofill/core/browser/wallet/real_pan_wallet_client.h',
         'autofill/core/browser/webdata/autocomplete_syncable_service.cc',
         'autofill/core/browser/webdata/autocomplete_syncable_service.h',
         'autofill/core/browser/webdata/autofill_change.cc',
diff --git a/components/autofill/content/browser/BUILD.gn b/components/autofill/content/browser/BUILD.gn
index 02871f7..36f97605 100644
--- a/components/autofill/content/browser/BUILD.gn
+++ b/components/autofill/content/browser/BUILD.gn
@@ -70,7 +70,7 @@
     "content_autofill_driver_unittest.cc",
     "request_autocomplete_manager_unittest.cc",
     "wallet/full_wallet_unittest.cc",
-    "wallet/real_pan_wallet_client_unittest.cc",
+    "wallet/payments_client_unittest.cc",
     "wallet/wallet_address_unittest.cc",
     "wallet/wallet_service_url_unittest.cc",
   ]
diff --git a/components/autofill/content/browser/wallet/payments_client_unittest.cc b/components/autofill/content/browser/wallet/payments_client_unittest.cc
new file mode 100644
index 0000000..f761e99
--- /dev/null
+++ b/components/autofill/content/browser/wallet/payments_client_unittest.cc
@@ -0,0 +1,281 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/command_line.h"
+#include "base/thread_task_runner_handle.h"
+#include "base/values.h"
+#include "components/autofill/core/browser/autofill_test_utils.h"
+#include "components/autofill/core/browser/payments/payments_client.h"
+#include "components/autofill/core/common/autofill_switches.h"
+#include "content/public/test/test_browser_thread_bundle.h"
+#include "google_apis/gaia/fake_identity_provider.h"
+#include "google_apis/gaia/fake_oauth2_token_service.h"
+#include "net/url_request/test_url_fetcher_factory.h"
+#include "net/url_request/url_request_test_util.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace autofill {
+namespace payments {
+
+class PaymentsClientTest : public testing::Test, public PaymentsClientDelegate {
+ public:
+  PaymentsClientTest() : result_(AutofillClient::NONE) {}
+  ~PaymentsClientTest() override {}
+
+  void SetUp() override {
+    // Silence the warning for mismatching sync and Payments servers.
+    base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(
+        switches::kWalletServiceUseSandbox, "0");
+
+    result_ = AutofillClient::NONE;
+    real_pan_.clear();
+    legal_message_.reset();
+
+    request_context_ = new net::TestURLRequestContextGetter(
+        base::ThreadTaskRunnerHandle::Get());
+    token_service_.reset(new FakeOAuth2TokenService());
+    identity_provider_.reset(new FakeIdentityProvider(token_service_.get()));
+    client_.reset(new PaymentsClient(request_context_.get(), this));
+  }
+
+  void TearDown() override { client_.reset(); }
+
+  // PaymentsClientDelegate
+
+  IdentityProvider* GetIdentityProvider() override {
+    return identity_provider_.get();
+  }
+
+  void OnDidGetRealPan(AutofillClient::PaymentsRpcResult result,
+                       const std::string& real_pan) override {
+    result_ = result;
+    real_pan_ = real_pan;
+  }
+
+  void OnDidGetUploadDetails(
+      AutofillClient::PaymentsRpcResult result,
+      const base::string16& context_token,
+      scoped_ptr<base::DictionaryValue> legal_message) override {
+    result_ = result;
+    legal_message_ = legal_message.Pass();
+  }
+
+  void OnDidUploadCard(AutofillClient::PaymentsRpcResult result) override {
+    result_ = result;
+  }
+
+ protected:
+  void StartUnmasking() {
+    token_service_->AddAccount("example@gmail.com");
+    identity_provider_->LogIn("example@gmail.com");
+    PaymentsClient::UnmaskRequestDetails request_details;
+    request_details.card = test::GetMaskedServerCard();
+    request_details.user_response.cvc = base::ASCIIToUTF16("123");
+    request_details.risk_data = "some risk data";
+    client_->UnmaskCard(request_details);
+  }
+
+  void StartGettingUploadDetails() {
+    token_service_->AddAccount("example@gmail.com");
+    identity_provider_->LogIn("example@gmail.com");
+    client_->GetUploadDetails("language-LOCALE");
+  }
+
+  void StartUploading() {
+    token_service_->AddAccount("example@gmail.com");
+    identity_provider_->LogIn("example@gmail.com");
+    PaymentsClient::UploadRequestDetails request_details;
+    request_details.card = test::GetCreditCard();
+    request_details.cvc = base::ASCIIToUTF16("123");
+    request_details.context_token = base::ASCIIToUTF16("context token");
+    request_details.risk_data = "some risk data";
+    request_details.app_locale = "language-LOCALE";
+    client_->UploadCard(request_details);
+  }
+
+  void IssueOAuthToken() {
+    token_service_->IssueAllTokensForAccount(
+        "example@gmail.com", "totally_real_token",
+        base::Time::Now() + base::TimeDelta::FromDays(10));
+
+    // Verify the auth header.
+    net::TestURLFetcher* fetcher = factory_.GetFetcherByID(0);
+    net::HttpRequestHeaders request_headers;
+    fetcher->GetExtraRequestHeaders(&request_headers);
+    std::string auth_header_value;
+    EXPECT_TRUE(request_headers.GetHeader(
+        net::HttpRequestHeaders::kAuthorization, &auth_header_value))
+        << request_headers.ToString();
+    EXPECT_EQ("Bearer totally_real_token", auth_header_value);
+  }
+
+  void ReturnResponse(net::HttpStatusCode response_code,
+                      const std::string& response_body) {
+    net::TestURLFetcher* fetcher = factory_.GetFetcherByID(0);
+    ASSERT_TRUE(fetcher);
+    fetcher->set_response_code(response_code);
+    fetcher->SetResponseString(response_body);
+    fetcher->delegate()->OnURLFetchComplete(fetcher);
+  }
+
+  AutofillClient::PaymentsRpcResult result_;
+  std::string real_pan_;
+  scoped_ptr<base::DictionaryValue> legal_message_;
+
+  content::TestBrowserThreadBundle thread_bundle_;
+  net::TestURLFetcherFactory factory_;
+  scoped_refptr<net::TestURLRequestContextGetter> request_context_;
+  scoped_ptr<FakeOAuth2TokenService> token_service_;
+  scoped_ptr<FakeIdentityProvider> identity_provider_;
+  scoped_ptr<PaymentsClient> client_;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(PaymentsClientTest);
+};
+
+TEST_F(PaymentsClientTest, OAuthError) {
+  StartUnmasking();
+  token_service_->IssueErrorForAllPendingRequestsForAccount(
+      "example@gmail.com",
+      GoogleServiceAuthError(GoogleServiceAuthError::SERVICE_UNAVAILABLE));
+  EXPECT_EQ(AutofillClient::PERMANENT_FAILURE, result_);
+  EXPECT_TRUE(real_pan_.empty());
+}
+
+TEST_F(PaymentsClientTest, UnmaskSuccess) {
+  StartUnmasking();
+  IssueOAuthToken();
+  ReturnResponse(net::HTTP_OK, "{ \"pan\": \"1234\" }");
+  EXPECT_EQ(AutofillClient::SUCCESS, result_);
+  EXPECT_EQ("1234", real_pan_);
+}
+
+TEST_F(PaymentsClientTest, GetDetailsSuccess) {
+  StartGettingUploadDetails();
+  ReturnResponse(
+      net::HTTP_OK,
+      "{ \"context_token\": \"some_token\", \"legal_message\": {} }");
+  EXPECT_EQ(AutofillClient::SUCCESS, result_);
+  EXPECT_NE(nullptr, legal_message_.get());
+}
+
+TEST_F(PaymentsClientTest, UploadSuccess) {
+  StartUploading();
+  IssueOAuthToken();
+  ReturnResponse(net::HTTP_OK, "{}");
+  EXPECT_EQ(AutofillClient::SUCCESS, result_);
+}
+
+TEST_F(PaymentsClientTest, GetDetailsFollowedByUploadSuccess) {
+  StartGettingUploadDetails();
+  ReturnResponse(
+      net::HTTP_OK,
+      "{ \"context_token\": \"some_token\", \"legal_message\": {} }");
+  EXPECT_EQ(AutofillClient::SUCCESS, result_);
+
+  result_ = AutofillClient::NONE;
+
+  StartUploading();
+  IssueOAuthToken();
+  ReturnResponse(net::HTTP_OK, "{}");
+  EXPECT_EQ(AutofillClient::SUCCESS, result_);
+}
+
+TEST_F(PaymentsClientTest, UnmaskMissingPan) {
+  StartUnmasking();
+  ReturnResponse(net::HTTP_OK, "{}");
+  EXPECT_EQ(AutofillClient::PERMANENT_FAILURE, result_);
+}
+
+TEST_F(PaymentsClientTest, GetDetailsMissingContextToken) {
+  StartGettingUploadDetails();
+  ReturnResponse(net::HTTP_OK, "{ \"legal_message\": {} }");
+  EXPECT_EQ(AutofillClient::PERMANENT_FAILURE, result_);
+}
+
+TEST_F(PaymentsClientTest, GetDetailsMissingLegalMessage) {
+  StartGettingUploadDetails();
+  ReturnResponse(net::HTTP_OK, "{ \"context_token\": \"some_token\" }");
+  EXPECT_EQ(AutofillClient::PERMANENT_FAILURE, result_);
+  EXPECT_EQ(nullptr, legal_message_.get());
+}
+
+TEST_F(PaymentsClientTest, RetryFailure) {
+  StartUnmasking();
+  IssueOAuthToken();
+  ReturnResponse(net::HTTP_OK, "{ \"error\": { \"code\": \"INTERNAL\" } }");
+  EXPECT_EQ(AutofillClient::TRY_AGAIN_FAILURE, result_);
+  EXPECT_EQ("", real_pan_);
+}
+
+TEST_F(PaymentsClientTest, PermanentFailure) {
+  StartUnmasking();
+  IssueOAuthToken();
+  ReturnResponse(net::HTTP_OK,
+                 "{ \"error\": { \"code\": \"ANYTHING_ELSE\" } }");
+  EXPECT_EQ(AutofillClient::PERMANENT_FAILURE, result_);
+  EXPECT_EQ("", real_pan_);
+}
+
+TEST_F(PaymentsClientTest, MalformedResponse) {
+  StartUnmasking();
+  IssueOAuthToken();
+  ReturnResponse(net::HTTP_OK, "{ \"error_code\": \"WRONG_JSON_FORMAT\" }");
+  EXPECT_EQ(AutofillClient::PERMANENT_FAILURE, result_);
+  EXPECT_EQ("", real_pan_);
+}
+
+TEST_F(PaymentsClientTest, ReauthNeeded) {
+  {
+    StartUnmasking();
+    IssueOAuthToken();
+    ReturnResponse(net::HTTP_UNAUTHORIZED, "");
+    // No response yet.
+    EXPECT_EQ(AutofillClient::NONE, result_);
+    EXPECT_EQ("", real_pan_);
+
+    // Second HTTP_UNAUTHORIZED causes permanent failure.
+    IssueOAuthToken();
+    ReturnResponse(net::HTTP_UNAUTHORIZED, "");
+    EXPECT_EQ(AutofillClient::PERMANENT_FAILURE, result_);
+    EXPECT_EQ("", real_pan_);
+  }
+
+  result_ = AutofillClient::NONE;
+  real_pan_.clear();
+
+  {
+    StartUnmasking();
+    IssueOAuthToken();
+    ReturnResponse(net::HTTP_UNAUTHORIZED, "");
+    // No response yet.
+    EXPECT_EQ(AutofillClient::NONE, result_);
+    EXPECT_EQ("", real_pan_);
+
+    // HTTP_OK after first HTTP_UNAUTHORIZED results in success.
+    IssueOAuthToken();
+    ReturnResponse(net::HTTP_OK, "{ \"pan\": \"1234\" }");
+    EXPECT_EQ(AutofillClient::SUCCESS, result_);
+    EXPECT_EQ("1234", real_pan_);
+  }
+}
+
+TEST_F(PaymentsClientTest, NetworkError) {
+  StartUnmasking();
+  IssueOAuthToken();
+  ReturnResponse(net::HTTP_REQUEST_TIMEOUT, std::string());
+  EXPECT_EQ(AutofillClient::NETWORK_ERROR, result_);
+  EXPECT_EQ("", real_pan_);
+}
+
+TEST_F(PaymentsClientTest, OtherError) {
+  StartUnmasking();
+  IssueOAuthToken();
+  ReturnResponse(net::HTTP_FORBIDDEN, std::string());
+  EXPECT_EQ(AutofillClient::PERMANENT_FAILURE, result_);
+  EXPECT_EQ("", real_pan_);
+}
+
+}  // namespace autofill
+}  // namespace payments
diff --git a/components/autofill/content/browser/wallet/real_pan_wallet_client_unittest.cc b/components/autofill/content/browser/wallet/real_pan_wallet_client_unittest.cc
deleted file mode 100644
index 4bbc78c..0000000
--- a/components/autofill/content/browser/wallet/real_pan_wallet_client_unittest.cc
+++ /dev/null
@@ -1,197 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/command_line.h"
-#include "base/thread_task_runner_handle.h"
-#include "components/autofill/core/browser/autofill_test_utils.h"
-#include "components/autofill/core/browser/wallet/real_pan_wallet_client.h"
-#include "components/autofill/core/common/autofill_switches.h"
-#include "content/public/test/test_browser_thread_bundle.h"
-#include "google_apis/gaia/fake_identity_provider.h"
-#include "google_apis/gaia/fake_oauth2_token_service.h"
-#include "net/url_request/test_url_fetcher_factory.h"
-#include "net/url_request/url_request_test_util.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace autofill {
-namespace wallet {
-
-class RealPanWalletClientTest : public testing::Test,
-                                public RealPanWalletClient::Delegate {
- public:
-  RealPanWalletClientTest() : result_(AutofillClient::SUCCESS) {}
-  ~RealPanWalletClientTest() override {}
-
-  void SetUp() override {
-    // Silence the warning for mismatching sync and wallet servers.
-    base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(
-        switches::kWalletServiceUseSandbox, "0");
-
-    request_context_ = new net::TestURLRequestContextGetter(
-        base::ThreadTaskRunnerHandle::Get());
-    token_service_.reset(new FakeOAuth2TokenService());
-    identity_provider_.reset(new FakeIdentityProvider(token_service_.get()));
-    client_.reset(new RealPanWalletClient(request_context_.get(), this));
-  }
-
-  void TearDown() override { client_.reset(); }
-
-  // RealPanWalletClient::Delegate
-
-  IdentityProvider* GetIdentityProvider() override {
-    return identity_provider_.get();
-  }
-
-  void OnDidGetRealPan(AutofillClient::GetRealPanResult result,
-                       const std::string& real_pan) override {
-    result_ = result;
-    real_pan_ = real_pan;
-  }
-
- protected:
-  void StartUnmasking() {
-    token_service_->AddAccount("example@gmail.com");
-    identity_provider_->LogIn("example@gmail.com");
-    CreditCard card = test::GetMaskedServerCard();
-    CardUnmaskDelegate::UnmaskResponse response;
-    response.cvc = base::ASCIIToUTF16("123");
-    client_->UnmaskCard(card, response);
-  }
-
-  void IssueOAuthToken() {
-    token_service_->IssueAllTokensForAccount(
-        "example@gmail.com",
-        "totally_real_token",
-        base::Time::Now() + base::TimeDelta::FromDays(10));
-
-    // Verify the auth header.
-    net::TestURLFetcher* fetcher = factory_.GetFetcherByID(0);
-    net::HttpRequestHeaders request_headers;
-    fetcher->GetExtraRequestHeaders(&request_headers);
-    std::string auth_header_value;
-    EXPECT_TRUE(request_headers.GetHeader(
-        net::HttpRequestHeaders::kAuthorization,
-        &auth_header_value)) << request_headers.ToString();
-    EXPECT_EQ("Bearer totally_real_token", auth_header_value);
-  }
-
-  void ReturnResponse(net::HttpStatusCode response_code,
-                      const std::string& response_body) {
-    net::TestURLFetcher* fetcher = factory_.GetFetcherByID(0);
-    ASSERT_TRUE(fetcher);
-    fetcher->set_response_code(response_code);
-    fetcher->SetResponseString(response_body);
-    fetcher->delegate()->OnURLFetchComplete(fetcher);
-  }
-
-  AutofillClient::GetRealPanResult result_;
-  std::string real_pan_;
-
-  content::TestBrowserThreadBundle thread_bundle_;
-  net::TestURLFetcherFactory factory_;
-  scoped_refptr<net::TestURLRequestContextGetter> request_context_;
-  scoped_ptr<FakeOAuth2TokenService> token_service_;
-  scoped_ptr<FakeIdentityProvider> identity_provider_;
-  scoped_ptr<RealPanWalletClient> client_;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(RealPanWalletClientTest);
-};
-
-TEST_F(RealPanWalletClientTest, OAuthError) {
-  StartUnmasking();
-  token_service_->IssueErrorForAllPendingRequestsForAccount(
-      "example@gmail.com",
-      GoogleServiceAuthError(GoogleServiceAuthError::SERVICE_UNAVAILABLE));
-  EXPECT_EQ(AutofillClient::PERMANENT_FAILURE, result_);
-  EXPECT_TRUE(real_pan_.empty());
-}
-
-TEST_F(RealPanWalletClientTest, Success) {
-  StartUnmasking();
-  IssueOAuthToken();
-  ReturnResponse(net::HTTP_OK, "{ \"pan\": \"1234\" }");
-  EXPECT_EQ(AutofillClient::SUCCESS, result_);
-  EXPECT_EQ("1234", real_pan_);
-}
-
-TEST_F(RealPanWalletClientTest, RetryFailure) {
-  StartUnmasking();
-  IssueOAuthToken();
-  ReturnResponse(net::HTTP_OK, "{ \"error\": { \"code\": \"INTERNAL\" } }");
-  EXPECT_EQ(AutofillClient::TRY_AGAIN_FAILURE, result_);
-  EXPECT_EQ("", real_pan_);
-}
-
-TEST_F(RealPanWalletClientTest, PermanentFailure) {
-  StartUnmasking();
-  IssueOAuthToken();
-  ReturnResponse(net::HTTP_OK,
-      "{ \"error\": { \"code\": \"ANYTHING_ELSE\" } }");
-  EXPECT_EQ(AutofillClient::PERMANENT_FAILURE, result_);
-  EXPECT_EQ("", real_pan_);
-}
-
-TEST_F(RealPanWalletClientTest, MalformedResponse) {
-  StartUnmasking();
-  IssueOAuthToken();
-  ReturnResponse(net::HTTP_OK,
-      "{ \"error_code\": \"WRONG_JSON_FORMAT\" }");
-  EXPECT_EQ(AutofillClient::PERMANENT_FAILURE, result_);
-  EXPECT_EQ("", real_pan_);
-}
-
-TEST_F(RealPanWalletClientTest, ReauthNeeded) {
-  {
-    StartUnmasking();
-    IssueOAuthToken();
-    ReturnResponse(net::HTTP_UNAUTHORIZED, "");
-    // No response yet.
-    EXPECT_EQ(AutofillClient::SUCCESS, result_);
-    EXPECT_EQ("", real_pan_);
-
-    // Second HTTP_UNAUTHORIZED causes permanent failure.
-    IssueOAuthToken();
-    ReturnResponse(net::HTTP_UNAUTHORIZED, "");
-    EXPECT_EQ(AutofillClient::PERMANENT_FAILURE, result_);
-    EXPECT_EQ("", real_pan_);
-  }
-
-  result_ = AutofillClient::SUCCESS;
-  real_pan_.clear();
-
-  {
-    StartUnmasking();
-    IssueOAuthToken();
-    ReturnResponse(net::HTTP_UNAUTHORIZED, "");
-    // No response yet.
-    EXPECT_EQ(AutofillClient::SUCCESS, result_);
-    EXPECT_EQ("", real_pan_);
-
-    // HTTP_OK after first HTTP_UNAUTHORIZED results in success.
-    IssueOAuthToken();
-    ReturnResponse(net::HTTP_OK, "{ \"pan\": \"1234\" }");
-    EXPECT_EQ(AutofillClient::SUCCESS, result_);
-    EXPECT_EQ("1234", real_pan_);
-  }
-}
-
-TEST_F(RealPanWalletClientTest, NetworkError) {
-  StartUnmasking();
-  IssueOAuthToken();
-  ReturnResponse(net::HTTP_REQUEST_TIMEOUT, std::string());
-  EXPECT_EQ(AutofillClient::NETWORK_ERROR, result_);
-  EXPECT_EQ("", real_pan_);
-}
-
-TEST_F(RealPanWalletClientTest, OtherError) {
-  StartUnmasking();
-  IssueOAuthToken();
-  ReturnResponse(net::HTTP_FORBIDDEN, std::string());
-  EXPECT_EQ(AutofillClient::PERMANENT_FAILURE, result_);
-  EXPECT_EQ("", real_pan_);
-}
-
-}  // namespace autofill
-}  // namespace wallet
diff --git a/components/autofill/core/browser/BUILD.gn b/components/autofill/core/browser/BUILD.gn
index 1ecaf93..28ad3c59 100644
--- a/components/autofill/core/browser/BUILD.gn
+++ b/components/autofill/core/browser/BUILD.gn
@@ -90,6 +90,9 @@
     "options_util.h",
     "password_generator.cc",
     "password_generator.h",
+    "payments/payments_client.cc",
+    "payments/payments_client.h",
+    "payments/payments_request.h",
     "personal_data_manager.cc",
     "personal_data_manager.h",
     "personal_data_manager_observer.h",
@@ -112,8 +115,6 @@
     "ui/card_unmask_prompt_view.h",
     "validation.cc",
     "validation.h",
-    "wallet/real_pan_wallet_client.cc",
-    "wallet/real_pan_wallet_client.h",
     "webdata/autocomplete_syncable_service.cc",
     "webdata/autocomplete_syncable_service.h",
     "webdata/autofill_change.cc",
diff --git a/components/autofill/core/browser/autofill_client.h b/components/autofill/core/browser/autofill_client.h
index b89acc9..a1faf80 100644
--- a/components/autofill/core/browser/autofill_client.h
+++ b/components/autofill/core/browser/autofill_client.h
@@ -11,6 +11,7 @@
 #include "base/i18n/rtl.h"
 #include "base/memory/weak_ptr.h"
 #include "base/strings/string16.h"
+#include "base/values.h"
 #include "ui/base/window_open_disposition.h"
 #include "url/gurl.h"
 
@@ -60,7 +61,7 @@
     AutocompleteResultErrorInvalid,
   };
 
-  enum GetRealPanResult {
+  enum PaymentsRpcResult {
     // Empty result. Used for initializing variables and should generally
     // not be returned nor passed as arguments unless explicitly allowed by
     // the API.
@@ -75,7 +76,7 @@
     // Request failed; don't try again.
     PERMANENT_FAILURE,
 
-    // Unable to connect to Wallet servers. Prompt user to check internet
+    // Unable to connect to Payments servers. Prompt user to check internet
     // connection.
     NETWORK_ERROR,
   };
@@ -115,12 +116,21 @@
   // information to proceed.
   virtual void ShowUnmaskPrompt(const CreditCard& card,
                                 base::WeakPtr<CardUnmaskDelegate> delegate) = 0;
-  virtual void OnUnmaskVerificationResult(GetRealPanResult result) = 0;
+  virtual void OnUnmaskVerificationResult(PaymentsRpcResult result) = 0;
 
-  // Run |save_card_callback| if the credit card should be imported as personal
+  // Runs |callback| if the credit card should be imported as personal
   // data. |metric_logger| can be used to log user actions.
-  virtual void ConfirmSaveCreditCard(
-      const base::Closure& save_card_callback) = 0;
+  virtual void ConfirmSaveCreditCardLocally(const base::Closure& callback) = 0;
+
+  // Runs |callback| if the credit card should be uploaded to Payments. Displays
+  // the contents of |legal_message| to the user.
+  virtual void ConfirmSaveCreditCardToCloud(
+      const base::Closure& callback,
+      scoped_ptr<base::DictionaryValue> legal_message) = 0;
+
+  // Gathers risk data and provides it to |callback|.
+  virtual void LoadRiskData(
+      const base::Callback<void(const std::string&)>& callback) = 0;
 
   // Returns true if both the platform and the device support scanning credit
   // cards. Should be called before ScanCreditCard().
diff --git a/components/autofill/core/browser/autofill_experiments.cc b/components/autofill/core/browser/autofill_experiments.cc
index c43f5b4..23a6e25 100644
--- a/components/autofill/core/browser/autofill_experiments.cc
+++ b/components/autofill/core/browser/autofill_experiments.cc
@@ -7,8 +7,10 @@
 #include "base/command_line.h"
 #include "base/metrics/field_trial.h"
 #include "base/prefs/pref_service.h"
+#include "base/strings/string_util.h"
 #include "components/autofill/core/common/autofill_pref_names.h"
 #include "components/autofill/core/common/autofill_switches.h"
+#include "google_apis/gaia/gaia_auth_util.h"
 
 namespace autofill {
 
@@ -47,4 +49,30 @@
 #endif
 }
 
+bool IsCreditCardUploadEnabled(const PrefService* pref_service,
+                               const std::string& user_email) {
+  // Query the field trial before checking command line flags to ensure UMA
+  // reports the correct group.
+  std::string group_name =
+      base::FieldTrialList::FindFullName("OfferUploadCreditCards");
+
+  if (base::CommandLine::ForCurrentProcess()->HasSwitch(
+          switches::kEnableOfferUploadCreditCards))
+    return true;
+  if (base::CommandLine::ForCurrentProcess()->HasSwitch(
+          switches::kDisableOfferUploadCreditCards))
+    return false;
+
+  if (group_name.empty() || group_name == "Disabled")
+    return false;
+
+  if (!pref_service->GetBoolean(prefs::kAutofillWalletSyncExperimentEnabled) ||
+      !pref_service->GetBoolean(prefs::kAutofillWalletImportEnabled))
+    return false;
+
+  std::string domain = gaia::ExtractDomainName(user_email);
+  return domain == "googlemail.com" || domain == "gmail.com" ||
+         domain == "google.com";
+}
+
 }  // namespace autofill
diff --git a/components/autofill/core/browser/autofill_experiments.h b/components/autofill/core/browser/autofill_experiments.h
index cd2764e..3a152cc 100644
--- a/components/autofill/core/browser/autofill_experiments.h
+++ b/components/autofill/core/browser/autofill_experiments.h
@@ -5,6 +5,8 @@
 #ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_AUTOFILL_EXPERIMENTS_H_
 #define COMPONENTS_AUTOFILL_CORE_BROWSER_AUTOFILL_EXPERIMENTS_H_
 
+#include <string>
+
 class PrefService;
 
 namespace autofill {
@@ -24,6 +26,12 @@
 // response of the option.
 bool OfferStoreUnmaskedCards();
 
+// Returns true if uploading credit cards to Wallet servers is enabled. This
+// requires the appropriate flags and user settings to be true and the user to
+// be a member of a supported domain.
+bool IsCreditCardUploadEnabled(const PrefService* pref_service,
+                               const std::string& user_email);
+
 }  // namespace autofill
 
 #endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_AUTOFILL_EXPERIMENTS_H_
diff --git a/components/autofill/core/browser/autofill_manager.cc b/components/autofill/core/browser/autofill_manager.cc
index edc99de..a468fa00 100644
--- a/components/autofill/core/browser/autofill_manager.cc
+++ b/components/autofill/core/browser/autofill_manager.cc
@@ -52,6 +52,7 @@
 #include "components/autofill/core/common/form_field_data.h"
 #include "components/autofill/core/common/password_form_fill_data.h"
 #include "components/pref_registry/pref_registry_syncable.h"
+#include "google_apis/gaia/identity_provider.h"
 #include "grit/components_strings.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/gfx/geometry/rect.h"
@@ -135,7 +136,8 @@
     AutofillDownloadManagerState enable_download_manager)
     : driver_(driver),
       client_(client),
-      real_pan_client_(driver->GetURLRequestContext(), this),
+      payments_client_(
+          new payments::PaymentsClient(driver->GetURLRequestContext(), this)),
       app_locale_(app_locale),
       personal_data_(client->GetPersonalDataManager()),
       autocomplete_history_manager_(
@@ -150,6 +152,7 @@
       user_did_type_(false),
       user_did_autofill_(false),
       user_did_edit_autofilled_field_(false),
+      user_did_accept_upload_prompt_(false),
       external_delegate_(NULL),
       test_delegate_(NULL),
       weak_ptr_factory_(this) {
@@ -511,13 +514,15 @@
   if (action == AutofillDriver::FORM_DATA_ACTION_FILL) {
     if (credit_card.record_type() == CreditCard::MASKED_SERVER_CARD &&
         WillFillCreditCardNumber(form, field)) {
-      unmasking_card_ = credit_card;
+      unmask_request_.card = credit_card;
       unmasking_query_id_ = query_id;
       unmasking_form_ = form;
       unmasking_field_ = field;
-      real_pan_client_.Prepare();
-      client()->ShowUnmaskPrompt(unmasking_card_,
-                                 weak_ptr_factory_.GetWeakPtr());
+      payments_client_->Prepare();
+      client_->ShowUnmaskPrompt(unmask_request_.card,
+                                weak_ptr_factory_.GetWeakPtr());
+      client_->LoadRiskData(base::Bind(&AutofillManager::OnDidGetUnmaskRiskData,
+                                       weak_ptr_factory_.GetWeakPtr()));
       credit_card_form_event_logger_->OnDidSelectMaskedServerCardSuggestion();
       return;
     }
@@ -714,7 +719,7 @@
 }
 
 bool AutofillManager::IsShowingUnmaskPrompt() {
-  return unmasking_card_.Compare(CreditCard()) != 0;
+  return unmask_request_.card.Compare(CreditCard()) != 0;
 }
 
 const std::vector<FormStructure*>& AutofillManager::GetFormStructures() {
@@ -750,48 +755,103 @@
 }
 
 void AutofillManager::OnUnmaskResponse(const UnmaskResponse& response) {
-  unmask_response_ = response;
-  real_pan_request_timestamp_ = base::Time::Now();
-  real_pan_client_.UnmaskCard(unmasking_card_, response);
+  unmask_request_.user_response = response;
+  if (!unmask_request_.risk_data.empty()) {
+    real_pan_request_timestamp_ = base::Time::Now();
+    payments_client_->UnmaskCard(unmask_request_);
+  }
 }
 
 void AutofillManager::OnUnmaskPromptClosed() {
-  real_pan_client_.CancelRequest();
+  payments_client_->CancelRequest();
   driver_->RendererShouldClearPreviewedForm();
-  unmasking_card_ = CreditCard();
-  unmask_response_ = UnmaskResponse();
+  unmask_request_ = payments::PaymentsClient::UnmaskRequestDetails();
 }
 
 IdentityProvider* AutofillManager::GetIdentityProvider() {
-  return client()->GetIdentityProvider();
+  return client_->GetIdentityProvider();
 }
 
-void AutofillManager::OnDidGetRealPan(AutofillClient::GetRealPanResult result,
+void AutofillManager::OnDidGetRealPan(AutofillClient::PaymentsRpcResult result,
                                       const std::string& real_pan) {
   AutofillMetrics::LogRealPanDuration(
       base::Time::Now() - real_pan_request_timestamp_, result);
   if (!real_pan.empty()) {
     DCHECK_EQ(AutofillClient::SUCCESS, result);
-    credit_card_form_event_logger_->OnDidFillSuggestion(unmasking_card_);
-    recently_unmasked_cards_.push_back(unmasking_card_);
-    unmasking_card_.set_record_type(CreditCard::FULL_SERVER_CARD);
-    unmasking_card_.SetNumber(base::UTF8ToUTF16(real_pan));
-    if (!unmask_response_.exp_month.empty()) {
-      unmasking_card_.SetRawInfo(CREDIT_CARD_EXP_MONTH,
-                                 unmask_response_.exp_month);
+    credit_card_form_event_logger_->OnDidFillSuggestion(unmask_request_.card);
+    recently_unmasked_cards_.push_back(unmask_request_.card);
+    unmask_request_.card.set_record_type(CreditCard::FULL_SERVER_CARD);
+    unmask_request_.card.SetNumber(base::UTF8ToUTF16(real_pan));
+    if (!unmask_request_.user_response.exp_month.empty()) {
+      unmask_request_.card.SetRawInfo(CREDIT_CARD_EXP_MONTH,
+                                      unmask_request_.user_response.exp_month);
     }
-    if (!unmask_response_.exp_year.empty()) {
-      unmasking_card_.SetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR,
-                                 unmask_response_.exp_year);
+    if (!unmask_request_.user_response.exp_year.empty()) {
+      unmask_request_.card.SetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR,
+                                      unmask_request_.user_response.exp_year);
     }
-    if (unmask_response_.should_store_pan)
-      personal_data_->UpdateServerCreditCard(unmasking_card_);
+    if (unmask_request_.user_response.should_store_pan)
+      personal_data_->UpdateServerCreditCard(unmask_request_.card);
 
     FillCreditCardForm(unmasking_query_id_, unmasking_form_, unmasking_field_,
-                       unmasking_card_);
+                       unmask_request_.card);
   }
 
-  client()->OnUnmaskVerificationResult(result);
+  client_->OnUnmaskVerificationResult(result);
+}
+
+void AutofillManager::OnDidGetUploadDetails(
+    AutofillClient::PaymentsRpcResult result,
+    const base::string16& context_token,
+    scoped_ptr<base::DictionaryValue> legal_message) {
+  // TODO(jdonnelly): Log duration.
+  if (result == AutofillClient::SUCCESS) {
+    // Do *not* call payments_client_->Prepare() here. We shouldn't send
+    // credentials until the user has explicitly accepted a prompt to upload.
+    upload_request_.context_token = context_token;
+    user_did_accept_upload_prompt_ = false;
+    client_->ConfirmSaveCreditCardToCloud(
+        base::Bind(&AutofillManager::OnUserDidAcceptUpload,
+                   weak_ptr_factory_.GetWeakPtr()),
+        legal_message.Pass());
+    client_->LoadRiskData(base::Bind(&AutofillManager::OnDidGetUploadRiskData,
+                                     weak_ptr_factory_.GetWeakPtr()));
+  } else {
+    // Since the upload details request failed, fallback to a local save.
+    client_->ConfirmSaveCreditCardLocally(base::Bind(
+        base::IgnoreResult(&PersonalDataManager::SaveImportedCreditCard),
+        base::Unretained(personal_data_), upload_request_.card));
+  }
+}
+
+void AutofillManager::OnDidUploadCard(
+    AutofillClient::PaymentsRpcResult result) {
+  // We don't do anything user-visible if the upload attempt fails.
+  // TODO(jdonnelly): Log duration.
+}
+
+void AutofillManager::OnDidGetUnmaskRiskData(const std::string& risk_data) {
+  unmask_request_.risk_data = risk_data;
+  if (!unmask_request_.user_response.cvc.empty()) {
+    real_pan_request_timestamp_ = base::Time::Now();
+    payments_client_->UnmaskCard(unmask_request_);
+  }
+}
+
+void AutofillManager::OnUserDidAcceptUpload() {
+  user_did_accept_upload_prompt_ = true;
+  if (!upload_request_.risk_data.empty()) {
+    upload_request_.app_locale = app_locale_;
+    payments_client_->UploadCard(upload_request_);
+  }
+}
+
+void AutofillManager::OnDidGetUploadRiskData(const std::string& risk_data) {
+  upload_request_.risk_data = risk_data;
+  if (user_did_accept_upload_prompt_) {
+    upload_request_.app_locale = app_locale_;
+    payments_client_->UploadCard(upload_request_);
+  }
 }
 
 void AutofillManager::OnDidEndTextFieldEditing() {
@@ -802,6 +862,11 @@
   return ::autofill::IsAutofillEnabled(client_->GetPrefs());
 }
 
+bool AutofillManager::IsCreditCardUploadEnabled() {
+  return ::autofill::IsCreditCardUploadEnabled(
+      client_->GetPrefs(), GetIdentityProvider()->GetActiveUsername());
+}
+
 bool AutofillManager::ShouldUploadForm(const FormStructure& form) {
   if (!IsAutofillEnabled())
     return false;
@@ -860,11 +925,28 @@
           imported_credit_card->TypeAndLastFourDigits())
         return;
     }
-    client_->ConfirmSaveCreditCard(
-        base::Bind(
-            base::IgnoreResult(&PersonalDataManager::SaveImportedCreditCard),
-            base::Unretained(personal_data_),
-            *imported_credit_card));
+
+    // Check for a CVC in order to determine whether we can prompt the user to
+    // upload their card.
+    for (const auto& field : submitted_form) {
+      if (field->Type().GetStorableType() == CREDIT_CARD_VERIFICATION_CODE) {
+        upload_request_.cvc = field->value;
+        break;
+      }
+    }
+
+    if (!upload_request_.cvc.empty() && IsCreditCardUploadEnabled()) {
+      // Initiate the upload flow if a CVC was entered into the form and the
+      // feature is enabled.
+      upload_request_ = payments::PaymentsClient::UploadRequestDetails();
+      upload_request_.card = *imported_credit_card;
+      payments_client_->GetUploadDetails(app_locale_);
+    } else {
+      // Otherwise, prompt the user for local save.
+      client_->ConfirmSaveCreditCardLocally(base::Bind(
+          base::IgnoreResult(&PersonalDataManager::SaveImportedCreditCard),
+          base::Unretained(personal_data_), *imported_credit_card));
+    }
   }
 }
 
@@ -908,6 +990,8 @@
 }
 
 void AutofillManager::Reset() {
+  // Note that upload_request_ is not reset here because the prompt to
+  // save a card is shown after page navigation.
   form_structures_.clear();
   address_form_event_logger_.reset(
       new AutofillMetrics::FormEventLogger(false /* is_for_credit_card */));
@@ -919,7 +1003,7 @@
   user_did_type_ = false;
   user_did_autofill_ = false;
   user_did_edit_autofilled_field_ = false;
-  unmasking_card_ = CreditCard();
+  unmask_request_ = payments::PaymentsClient::UnmaskRequestDetails();
   unmasking_query_id_ = -1;
   unmasking_form_ = FormData();
   unmasking_field_ = FormFieldData();
@@ -933,7 +1017,8 @@
                                  PersonalDataManager* personal_data)
     : driver_(driver),
       client_(client),
-      real_pan_client_(driver->GetURLRequestContext(), this),
+      payments_client_(
+          new payments::PaymentsClient(driver->GetURLRequestContext(), this)),
       app_locale_("en-US"),
       personal_data_(personal_data),
       autocomplete_history_manager_(
@@ -1116,10 +1201,10 @@
     if (is_credit_card &&
         cached_field->Type().GetStorableType() ==
             CREDIT_CARD_VERIFICATION_CODE) {
-      // If this is |unmasking_card_|, |unmask_response_.cvc| should be
-      // non-empty and vice versa.
-      value = unmask_response_.cvc;
-      DCHECK_EQ(&unmasking_card_ == &data_model, !value.empty());
+      // If this is |unmask_request_.card|, |unmask_request_.user_response.cvc|
+      // should be non-empty and vice versa.
+      value = unmask_request_.user_response.cvc;
+      DCHECK_EQ(&unmask_request_.card == &data_model, !value.empty());
     }
 
     // Must match ForEachMatchingFormField() in form_autofill_util.cc.
@@ -1360,13 +1445,8 @@
   for (const FormData& form : forms) {
     scoped_ptr<FormStructure> form_structure(new FormStructure(form));
 
-    if (!form_structure->ShouldBeParsed()) {
-      if (form_structure->has_password_field()) {
-        AutofillMetrics::LogPasswordFormQueryVolume(
-            AutofillMetrics::NEW_PASSWORD_QUERY);
-      }
+    if (!form_structure->ShouldBeParsed())
       continue;
-    }
 
     form_structure->DetermineHeuristicTypes();
 
@@ -1375,13 +1455,10 @@
     // as long as receivers don't take ownership.
     form_structures_.push_back(form_structure.Pass());
 
-    if (form_structures_.back()->ShouldBeCrowdsourced()) {
-      AutofillMetrics::LogPasswordFormQueryVolume(
-          AutofillMetrics::CURRENT_QUERY);
+    if (form_structures_.back()->ShouldBeCrowdsourced())
       queryable_forms.push_back(form_structures_.back());
-    } else {
+    else
       non_queryable_forms.push_back(form_structures_.back());
-    }
   }
 
   if (!queryable_forms.empty() && download_manager_) {
diff --git a/components/autofill/core/browser/autofill_manager.h b/components/autofill/core/browser/autofill_manager.h
index c7b30297..90c30e4 100644
--- a/components/autofill/core/browser/autofill_manager.h
+++ b/components/autofill/core/browser/autofill_manager.h
@@ -26,8 +26,8 @@
 #include "components/autofill/core/browser/autofill_metrics.h"
 #include "components/autofill/core/browser/card_unmask_delegate.h"
 #include "components/autofill/core/browser/form_structure.h"
+#include "components/autofill/core/browser/payments/payments_client.h"
 #include "components/autofill/core/browser/personal_data_manager.h"
-#include "components/autofill/core/browser/wallet/real_pan_wallet_client.h"
 #include "components/autofill/core/common/form_data.h"
 
 // This define protects some debugging code (see DumpAutofillData). This
@@ -71,7 +71,7 @@
 // forms. One per frame; owned by the AutofillDriver.
 class AutofillManager : public AutofillDownloadManager::Observer,
                         public CardUnmaskDelegate,
-                        public wallet::RealPanWalletClient::Delegate {
+                        public payments::PaymentsClientDelegate {
  public:
   enum AutofillDownloadManagerState {
     ENABLE_AUTOFILL_DOWNLOAD_MANAGER,
@@ -127,7 +127,7 @@
   void RemoveAutocompleteEntry(const base::string16& name,
                                const base::string16& value);
 
-  // Returns true when the Wallet card unmask prompt is being displayed.
+  // Returns true when the Payments card unmask prompt is being displayed.
   bool IsShowingUnmaskPrompt();
 
   // Returns the present form structures seen by Autofill manager.
@@ -150,6 +150,8 @@
   void OnFormsSeen(const std::vector<FormData>& forms,
                    const base::TimeTicks& timestamp);
 
+  void set_app_locale(std::string app_locale) { app_locale_ = app_locale; }
+
   // IMPORTANT: On iOS, this method is called when the form is submitted,
   // immediately before OnFormSubmitted() is called. Do not assume that
   // OnWillSubmitForm() will run before the form submits.
@@ -184,6 +186,10 @@
   // Returns the value of the AutofillEnabled pref.
   virtual bool IsAutofillEnabled() const;
 
+  // Returns true if all the conditions for enabling the upload of credit card
+  // are satisfied.
+  virtual bool IsCreditCardUploadEnabled();
+
   // Shared code to determine if |form| should be uploaded to the Autofill
   // server. It verifies that uploading is allowed and |form| meets conditions
   // to be uploadable.
@@ -222,6 +228,7 @@
 
   ScopedVector<FormStructure>* form_structures() { return &form_structures_; }
 
+ protected:
   // Exposed for testing.
   AutofillExternalDelegate* external_delegate() {
     return external_delegate_;
@@ -232,6 +239,11 @@
     download_manager_.reset(manager);
   }
 
+  // Exposed for testing.
+  void set_payments_client(payments::PaymentsClient* payments_client) {
+    payments_client_.reset(payments_client);
+  }
+
  private:
   // AutofillDownloadManager::Observer:
   void OnLoadedServerPredictions(const std::string& response_xml) override;
@@ -240,10 +252,27 @@
   void OnUnmaskResponse(const UnmaskResponse& response) override;
   void OnUnmaskPromptClosed() override;
 
-  // wallet::RealPanWalletClient::Delegate:
+  // payments::PaymentsClientDelegate:
   IdentityProvider* GetIdentityProvider() override;
-  void OnDidGetRealPan(AutofillClient::GetRealPanResult result,
+  void OnDidGetRealPan(AutofillClient::PaymentsRpcResult result,
                        const std::string& real_pan) override;
+  void OnDidGetUploadDetails(
+      AutofillClient::PaymentsRpcResult result,
+      const base::string16& context_token,
+      scoped_ptr<base::DictionaryValue> legal_message) override;
+  void OnDidUploadCard(AutofillClient::PaymentsRpcResult result) override;
+
+  // Saves risk data in |unmasking_risk_data_| and calls UnmaskCard if the user
+  // has accepted the prompt.
+  void OnDidGetUnmaskRiskData(const std::string& risk_data);
+
+  // Sets |user_did_accept_upload_prompt_| and calls UploadCard if the risk data
+  // is available.
+  void OnUserDidAcceptUpload();
+
+  // Saves risk data in |uploading_risk_data_| and calls UploadCard if the user
+  // has accepted the prompt.
+  void OnDidGetUploadRiskData(const std::string& risk_data);
 
   // Returns false if Autofill is disabled or if no Autofill data is available.
   bool RefreshDataModels();
@@ -361,8 +390,8 @@
 
   AutofillClient* const client_;
 
-  // Handles real PAN requests.
-  wallet::RealPanWalletClient real_pan_client_;
+  // Handles Payments service requests.
+  scoped_ptr<payments::PaymentsClient> payments_client_;
 
   std::string app_locale_;
 
@@ -407,17 +436,19 @@
   // Our copy of the form data.
   ScopedVector<FormStructure> form_structures_;
 
-  // A copy of the credit card that's currently being unmasked, and data about
-  // the form.
-  CreditCard unmasking_card_;
-  // A copy of the latest card unmasking response.
-  UnmaskResponse unmask_response_;
+  // Collected information about a pending unmask request, and data about the
+  // form.
+  payments::PaymentsClient::UnmaskRequestDetails unmask_request_;
   int unmasking_query_id_;
   FormData unmasking_form_;
   FormFieldData unmasking_field_;
-  // Time when we requested the last real pan
+  // Time when we requested the last real pan.
   base::Time real_pan_request_timestamp_;
 
+  // Collected information about a pending upload request.
+  payments::PaymentsClient::UploadRequestDetails upload_request_;
+  bool user_did_accept_upload_prompt_;
+
   // Masked copies of recently unmasked cards, to help avoid double-asking to
   // save the card (in the prompt and in the infobar after submit).
   std::vector<CreditCard> recently_unmasked_cards_;
@@ -494,7 +525,7 @@
                            AutocompleteOffRespectedForAutocomplete);
   FRIEND_TEST_ALL_PREFIXES(AutofillManagerTest,
                            DontSaveCvcInAutocompleteHistory);
-  FRIEND_TEST_ALL_PREFIXES(AutofillManagerTest, DontOfferToSaveWalletCard);
+  FRIEND_TEST_ALL_PREFIXES(AutofillManagerTest, DontOfferToSavePaymentsCard);
   FRIEND_TEST_ALL_PREFIXES(AutofillManagerTest, FillInUpdatedExpirationDate);
   DISALLOW_COPY_AND_ASSIGN(AutofillManager);
 };
diff --git a/components/autofill/core/browser/autofill_manager_unittest.cc b/components/autofill/core/browser/autofill_manager_unittest.cc
index f5cbdfaf..7383a8e 100644
--- a/components/autofill/core/browser/autofill_manager_unittest.cc
+++ b/components/autofill/core/browser/autofill_manager_unittest.cc
@@ -63,13 +63,40 @@
 
   ~MockAutofillClient() override {}
 
-  MOCK_METHOD1(ConfirmSaveCreditCard,
-               void(const base::Closure& save_card_callback));
+  MOCK_METHOD1(ConfirmSaveCreditCardLocally,
+               void(const base::Closure& callback));
 
  private:
   DISALLOW_COPY_AND_ASSIGN(MockAutofillClient);
 };
 
+class TestPaymentsClient : public payments::PaymentsClient {
+ public:
+  TestPaymentsClient(net::URLRequestContextGetter* context_getter,
+                     payments::PaymentsClientDelegate* delegate)
+      : PaymentsClient(context_getter, delegate), delegate_(delegate) {}
+
+  ~TestPaymentsClient() override {}
+
+  void GetUploadDetails(const std::string& app_locale) override {
+    delegate_->OnDidGetUploadDetails(
+        app_locale == "en-US" ? AutofillClient::SUCCESS
+                              : AutofillClient::PERMANENT_FAILURE,
+        base::ASCIIToUTF16("this is a context token"),
+        scoped_ptr<base::DictionaryValue>(nullptr));
+  }
+
+  void UploadCard(const payments::PaymentsClient::UploadRequestDetails&
+                      request_details) override {
+    delegate_->OnDidUploadCard(AutofillClient::SUCCESS);
+  }
+
+ private:
+  payments::PaymentsClientDelegate* const delegate_;
+
+  DISALLOW_COPY_AND_ASSIGN(TestPaymentsClient);
+};
+
 class TestPersonalDataManager : public PersonalDataManager {
  public:
   TestPersonalDataManager()
@@ -297,7 +324,7 @@
                       bool use_month_type) {
   // The number of fields in the address and credit card forms created above.
   const size_t kAddressFormSize = 11;
-  const size_t kCreditCardFormSize = use_month_type ? 3 : 4;
+  const size_t kCreditCardFormSize = use_month_type ? 4 : 5;
 
   EXPECT_EQ(expected_page_id, page_id);
   EXPECT_EQ(ASCIIToUTF16("MyForm"), filled_form.name);
@@ -433,7 +460,12 @@
       : AutofillManager(driver, client, personal_data),
         personal_data_(personal_data),
         autofill_enabled_(true),
-        expect_all_unknown_possible_types_(false) {}
+        credit_card_upload_enabled_(true),
+        credit_card_was_uploaded_(false),
+        expect_all_unknown_possible_types_(false) {
+    set_payments_client(
+        new TestPaymentsClient(driver->GetURLRequestContext(), this));
+  }
   ~TestAutofillManager() override {}
 
   bool IsAutofillEnabled() const override { return autofill_enabled_; }
@@ -442,6 +474,16 @@
     autofill_enabled_ = autofill_enabled;
   }
 
+  bool IsCreditCardUploadEnabled() override {
+    return credit_card_upload_enabled_;
+  }
+
+  void set_credit_card_upload_enabled(bool credit_card_upload_enabled) {
+    credit_card_upload_enabled_ = credit_card_upload_enabled;
+  }
+
+  bool credit_card_was_uploaded() { return credit_card_was_uploaded_; }
+
   void set_expected_submitted_field_types(
       const std::vector<ServerFieldTypeSet>& expected_types) {
     expected_submitted_field_types_ = expected_types;
@@ -529,10 +571,16 @@
   }
 
  private:
+  void OnDidUploadCard(AutofillClient::PaymentsRpcResult result) override {
+    credit_card_was_uploaded_ = true;
+  };
+
   // Weak reference.
   TestPersonalDataManager* personal_data_;
 
   bool autofill_enabled_;
+  bool credit_card_upload_enabled_;
+  bool credit_card_was_uploaded_;
   bool expect_all_unknown_possible_types_;
 
   scoped_ptr<base::RunLoop> run_loop_;
@@ -774,6 +822,8 @@
       test::CreateTestFormField("", "ccyear", "", "text", &field);
       form->fields.push_back(field);
     }
+    test::CreateTestFormField("CVC", "cvc", "", "text", &field);
+    form->fields.push_back(field);
   }
 
   // Tests if credit card data gets saved
@@ -788,13 +838,13 @@
     form.fields[1].value = ASCIIToUTF16("4111111111111111");
     form.fields[2].value = ASCIIToUTF16("11");
     form.fields[3].value = ASCIIToUTF16("2017");
-    EXPECT_CALL(autofill_client_, ConfirmSaveCreditCard(_)).Times(1);
+    EXPECT_CALL(autofill_client_, ConfirmSaveCreditCardLocally(_)).Times(1);
     FormSubmitted(form);
   }
 
   void PrepareForRealPanResponse(FormData* form, CreditCard* card) {
-    // This line silences the warning from RealPanWalletClient about matching
-    // sync and wallet server types.
+    // This line silences the warning from PaymentsClient about matching sync
+    // and Payments server types.
     base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(
         "sync-url", "https://google.com");
 
@@ -805,7 +855,7 @@
                             "2017");
     card->SetTypeForMaskedCard(kVisaCard);
 
-    EXPECT_CALL(autofill_client_, ConfirmSaveCreditCard(_)).Times(0);
+    EXPECT_CALL(autofill_client_, ConfirmSaveCreditCardLocally(_)).Times(0);
     EXPECT_CALL(*autofill_driver_, SendFormDataToRenderer(_, _, _))
         .Times(AtLeast(1));
     autofill_manager_->FillOrPreviewCreditCardForm(
@@ -834,6 +884,7 @@
   scoped_ptr<TestAutofillManager> autofill_manager_;
   scoped_ptr<TestAutofillExternalDelegate> external_delegate_;
   scoped_refptr<net::TestURLRequestContextGetter> request_context_;
+  TestPaymentsClient* payments_client_;
   TestAutofillDownloadManager* download_manager_;
   TestPersonalDataManager personal_data_;
 };
@@ -2089,9 +2140,9 @@
 
   const int kPageID3 = 3;
   response_page_id = 0;
-  FillAutofillFormDataAndSaveResults(kPageID3, form, *form.fields.rbegin(),
-                                     MakeFrontendID(guid2, std::string()),
-                                     &response_page_id, &response_data);
+  FillAutofillFormDataAndSaveResults(
+      kPageID3, form, form.fields[form.fields.size() - 2],
+      MakeFrontendID(guid2, std::string()), &response_page_id, &response_data);
   {
     SCOPED_TRACE("Credit card 2");
     ExpectFilledForm(response_page_id, response_data, kPageID3, "", "", "", "",
@@ -2684,7 +2735,7 @@
   form.fields[1].value = ASCIIToUTF16("4111111111111111");
   form.fields[2].value = ASCIIToUTF16("11");
   form.fields[3].value = ASCIIToUTF16("2017");
-  EXPECT_CALL(autofill_client_, ConfirmSaveCreditCard(_)).Times(1);
+  EXPECT_CALL(autofill_client_, ConfirmSaveCreditCardLocally(_)).Times(1);
   FormSubmitted(form);
 }
 
@@ -2703,7 +2754,7 @@
   form.fields[1].value = ASCIIToUTF16(card);
   form.fields[2].value = ASCIIToUTF16("11");
   form.fields[3].value = ASCIIToUTF16("2017");
-  EXPECT_CALL(autofill_client_, ConfirmSaveCreditCard(_)).Times(0);
+  EXPECT_CALL(autofill_client_, ConfirmSaveCreditCardLocally(_)).Times(0);
   FormSubmitted(form);
 }
 
@@ -3176,7 +3227,7 @@
   }
 }
 
-TEST_F(AutofillManagerTest, DontOfferToSaveWalletCard) {
+TEST_F(AutofillManagerTest, DontOfferToSavePaymentsCard) {
   FormData form;
   CreditCard card;
   PrepareForRealPanResponse(&form, &card);
@@ -3250,10 +3301,92 @@
   autofill_manager_->OnDidGetRealPan(AutofillClient::SUCCESS,
                                      "4012888888881881");
 
-  EXPECT_EQ(ASCIIToUTF16("02"), autofill_manager_->unmasking_card_.GetRawInfo(
-                                    CREDIT_CARD_EXP_MONTH));
-  EXPECT_EQ(ASCIIToUTF16("2018"), autofill_manager_->unmasking_card_.GetRawInfo(
-                                      CREDIT_CARD_EXP_4_DIGIT_YEAR));
+  EXPECT_EQ(ASCIIToUTF16("02"),
+            autofill_manager_->unmask_request_.card.GetRawInfo(
+                CREDIT_CARD_EXP_MONTH));
+  EXPECT_EQ(ASCIIToUTF16("2018"),
+            autofill_manager_->unmask_request_.card.GetRawInfo(
+                CREDIT_CARD_EXP_4_DIGIT_YEAR));
+}
+
+TEST_F(AutofillManagerTest, UploadCreditCard) {
+  // Set up our form data.
+  FormData form;
+  CreateTestCreditCardFormData(&form, true, false);
+  std::vector<FormData> forms(1, form);
+  FormsSeen(forms);
+
+  // Edit the data, and submit
+  form.fields[1].value = ASCIIToUTF16("4111111111111111");
+  form.fields[2].value = ASCIIToUTF16("11");
+  form.fields[3].value = ASCIIToUTF16("2017");
+  form.fields[4].value = ASCIIToUTF16("123");
+
+  FormSubmitted(form);
+  EXPECT_TRUE(autofill_manager_->credit_card_was_uploaded());
+}
+
+TEST_F(AutofillManagerTest, DontUploadCreditCardIfFeatureNotEnabled) {
+  autofill_manager_->set_credit_card_upload_enabled(false);
+
+  // Set up our form data.
+  FormData form;
+  CreateTestCreditCardFormData(&form, true, false);
+  std::vector<FormData> forms(1, form);
+  FormsSeen(forms);
+
+  // Edit the data, and submit
+  form.fields[1].value = ASCIIToUTF16("4111111111111111");
+  form.fields[2].value = ASCIIToUTF16("11");
+  form.fields[3].value = ASCIIToUTF16("2017");
+  form.fields[4].value = ASCIIToUTF16("123");
+
+  // The save prompt should be shown instead of doing an upload.
+  EXPECT_CALL(autofill_client_, ConfirmSaveCreditCardLocally(_)).Times(1);
+  FormSubmitted(form);
+  EXPECT_FALSE(autofill_manager_->credit_card_was_uploaded());
+}
+
+TEST_F(AutofillManagerTest, DontUploadCreditCardIfCvcUnavailable) {
+  // Set up our form data.
+  FormData form;
+  CreateTestCreditCardFormData(&form, true, false);
+  std::vector<FormData> forms(1, form);
+  FormsSeen(forms);
+
+  // Edit the data, and submit
+  form.fields[1].value = ASCIIToUTF16("4111111111111111");
+  form.fields[2].value = ASCIIToUTF16("11");
+  form.fields[3].value = ASCIIToUTF16("2017");
+  form.fields[4].value = ASCIIToUTF16("");  // CVC
+
+  // The save prompt should be shown instead of doing an upload.
+  EXPECT_CALL(autofill_client_, ConfirmSaveCreditCardLocally(_)).Times(1);
+  FormSubmitted(form);
+  EXPECT_FALSE(autofill_manager_->credit_card_was_uploaded());
+}
+
+TEST_F(AutofillManagerTest, DontUploadCreditCardIfUploadDetailsFails) {
+  // Anything other than "en-US" will cause GetUploadDetails to return a failure
+  // response.
+  autofill_manager_->set_app_locale("pt-BR");
+
+  // Set up our form data.
+  FormData form;
+  CreateTestCreditCardFormData(&form, true, false);
+  std::vector<FormData> forms(1, form);
+  FormsSeen(forms);
+
+  // Edit the data, and submit
+  form.fields[1].value = ASCIIToUTF16("4111111111111111");
+  form.fields[2].value = ASCIIToUTF16("11");
+  form.fields[3].value = ASCIIToUTF16("2017");
+  form.fields[4].value = ASCIIToUTF16("123");
+
+  // The save prompt should be shown instead of doing an upload.
+  EXPECT_CALL(autofill_client_, ConfirmSaveCreditCardLocally(_)).Times(1);
+  FormSubmitted(form);
+  EXPECT_FALSE(autofill_manager_->credit_card_was_uploaded());
 }
 
 // Verify that typing "gmail" will match "theking@gmail.com" and
diff --git a/components/autofill/core/browser/autofill_metrics.cc b/components/autofill/core/browser/autofill_metrics.cc
index cacfe91..8639612 100644
--- a/components/autofill/core/browser/autofill_metrics.cc
+++ b/components/autofill/core/browser/autofill_metrics.cc
@@ -391,34 +391,33 @@
 
 // static
 void AutofillMetrics::LogRealPanResult(
-    AutofillClient::GetRealPanResult result) {
-  GetRealPanResult metric_result;
+    AutofillClient::PaymentsRpcResult result) {
+  PaymentsRpcResult metric_result;
   switch (result) {
     case AutofillClient::SUCCESS:
-      metric_result = GET_REAL_PAN_RESULT_SUCCESS;
+      metric_result = PAYMENTS_RESULT_SUCCESS;
       break;
     case AutofillClient::TRY_AGAIN_FAILURE:
-      metric_result = GET_REAL_PAN_RESULT_TRY_AGAIN_FAILURE;
+      metric_result = PAYMENTS_RESULT_TRY_AGAIN_FAILURE;
       break;
     case AutofillClient::PERMANENT_FAILURE:
-      metric_result = GET_REAL_PAN_RESULT_PERMANENT_FAILURE;
+      metric_result = PAYMENTS_RESULT_PERMANENT_FAILURE;
       break;
     case AutofillClient::NETWORK_ERROR:
-      metric_result = GET_REAL_PAN_RESULT_NETWORK_ERROR;
+      metric_result = PAYMENTS_RESULT_NETWORK_ERROR;
       break;
     default:
       NOTREACHED();
       return;
   }
   UMA_HISTOGRAM_ENUMERATION("Autofill.UnmaskPrompt.GetRealPanResult",
-                            metric_result,
-                            NUM_GET_REAL_PAN_RESULTS);
+                            metric_result, NUM_PAYMENTS_RESULTS);
 }
 
 // static
 void AutofillMetrics::LogRealPanDuration(
     const base::TimeDelta& duration,
-    AutofillClient::GetRealPanResult result) {
+    AutofillClient::PaymentsRpcResult result) {
   std::string suffix;
   switch (result) {
     case AutofillClient::SUCCESS:
@@ -444,7 +443,7 @@
 // static
 void AutofillMetrics::LogUnmaskingDuration(
     const base::TimeDelta& duration,
-    AutofillClient::GetRealPanResult result) {
+    AutofillClient::PaymentsRpcResult result) {
   std::string suffix;
   switch (result) {
     case AutofillClient::SUCCESS:
@@ -623,13 +622,6 @@
 }
 
 // static
-void AutofillMetrics::LogPasswordFormQueryVolume(
-    PasswordFormQueryVolumeMetric metric) {
-  UMA_HISTOGRAM_ENUMERATION("Autofill.PasswordFormQueryVolume", metric,
-                            NUM_PASSWORD_FORM_QUERY_VOLUME_METRIC);
-}
-
-// static
 void AutofillMetrics::LogNumberOfEditedAutofilledFieldsAtSubmission(
     size_t num_edited_autofilled_fields) {
   UMA_HISTOGRAM_COUNTS_1000(
diff --git a/components/autofill/core/browser/autofill_metrics.h b/components/autofill/core/browser/autofill_metrics.h
index 1219c97..b806a727 100644
--- a/components/autofill/core/browser/autofill_metrics.h
+++ b/components/autofill/core/browser/autofill_metrics.h
@@ -348,17 +348,17 @@
     NUM_UNMASK_PROMPT_EVENTS,
   };
 
-  // Possible results of the GetRealPan call.
-  enum GetRealPanResult {
+  // Possible results of Payments RPCs.
+  enum PaymentsRpcResult {
     // Request succeeded.
-    GET_REAL_PAN_RESULT_SUCCESS = 0,
+    PAYMENTS_RESULT_SUCCESS = 0,
     // Request failed; try again.
-    GET_REAL_PAN_RESULT_TRY_AGAIN_FAILURE,
+    PAYMENTS_RESULT_TRY_AGAIN_FAILURE,
     // Request failed; don't try again.
-    GET_REAL_PAN_RESULT_PERMANENT_FAILURE,
-    // Unable to connect to Wallet servers.
-    GET_REAL_PAN_RESULT_NETWORK_ERROR,
-    NUM_GET_REAL_PAN_RESULTS,
+    PAYMENTS_RESULT_PERMANENT_FAILURE,
+    // Unable to connect to Payments servers.
+    PAYMENTS_RESULT_NETWORK_ERROR,
+    NUM_PAYMENTS_RESULTS,
   };
 
   // For measuring the network request time of various Wallet API calls. See
@@ -436,14 +436,6 @@
     NUM_WALLET_REQUIRED_ACTIONS
   };
 
-  // For measuring the increased load on the Autofill server if the restriction
-  // on querying for password forms with fewer than 3 fields were omitted.
-  enum PasswordFormQueryVolumeMetric {
-    NEW_PASSWORD_QUERY,
-    CURRENT_QUERY,
-    NUM_PASSWORD_FORM_QUERY_VOLUME_METRIC,
-  };
-
   static void LogCreditCardInfoBarMetric(InfoBarMetric metric);
   static void LogScanCreditCardPromptMetric(ScanCreditCardPromptMetric metric);
 
@@ -509,15 +501,15 @@
   static void LogTimeBeforeAbandonUnmasking(const base::TimeDelta& duration);
 
   // Logs |result| to the get real pan result histogram.
-  static void LogRealPanResult(AutofillClient::GetRealPanResult result);
+  static void LogRealPanResult(AutofillClient::PaymentsRpcResult result);
 
   // Logs |result| to duration of the GetRealPan RPC.
   static void LogRealPanDuration(const base::TimeDelta& duration,
-                                 AutofillClient::GetRealPanResult result);
+                                 AutofillClient::PaymentsRpcResult result);
 
   // Logs |result| to the get real pan result histogram.
   static void LogUnmaskingDuration(const base::TimeDelta& duration,
-                                   AutofillClient::GetRealPanResult result);
+                                   AutofillClient::PaymentsRpcResult result);
 
   // Logs |metric| to the Wallet errors histogram.
   static void LogWalletErrorMetric(WalletErrorMetric metric);
@@ -583,10 +575,6 @@
   // Log the index of the selected Autocomplete suggestion in the popup.
   static void LogAutocompleteSuggestionAcceptedIndex(int index);
 
-  // Log password form query: current and if one-to-two fields password forms
-  // were allowed.
-  static void LogPasswordFormQueryVolume(PasswordFormQueryVolumeMetric metric);
-
   // Log how many autofilled fields in a given form were edited before
   // submission.
   static void LogNumberOfEditedAutofilledFieldsAtSubmission(
diff --git a/components/autofill/core/browser/autofill_metrics_unittest.cc b/components/autofill/core/browser/autofill_metrics_unittest.cc
index f91dcc2..ed36d534 100644
--- a/components/autofill/core/browser/autofill_metrics_unittest.cc
+++ b/components/autofill/core/browser/autofill_metrics_unittest.cc
@@ -16,10 +16,10 @@
 #include "components/autofill/core/browser/autofill_external_delegate.h"
 #include "components/autofill/core/browser/autofill_manager.h"
 #include "components/autofill/core/browser/autofill_test_utils.h"
+#include "components/autofill/core/browser/payments/payments_client.h"
 #include "components/autofill/core/browser/personal_data_manager.h"
 #include "components/autofill/core/browser/test_autofill_client.h"
 #include "components/autofill/core/browser/test_autofill_driver.h"
-#include "components/autofill/core/browser/wallet/real_pan_wallet_client.h"
 #include "components/autofill/core/browser/webdata/autofill_webdata_service.h"
 #include "components/autofill/core/common/autofill_pref_names.h"
 #include "components/autofill/core/common/form_data.h"
diff --git a/components/autofill/core/browser/card_unmask_delegate.cc b/components/autofill/core/browser/card_unmask_delegate.cc
index 709acc1..cb785d4 100644
--- a/components/autofill/core/browser/card_unmask_delegate.cc
+++ b/components/autofill/core/browser/card_unmask_delegate.cc
@@ -7,15 +7,7 @@
 namespace autofill {
 
 CardUnmaskDelegate::UnmaskResponse::UnmaskResponse()
-    : should_store_pan(false),
-      providing_risk_advisory_data(false) {
-#if defined(OS_IOS)
-  // On iOS, we generate a RiskAdvisoryData instead of the
-  // BrowserNativeFingerprinting produced on other platforms. This field
-  // directs the Wallet client to configure the request accordingly.
-  providing_risk_advisory_data = true;
-#endif
-}
+    : should_store_pan(false) {}
 
 CardUnmaskDelegate::UnmaskResponse::~UnmaskResponse() {}
 
diff --git a/components/autofill/core/browser/card_unmask_delegate.h b/components/autofill/core/browser/card_unmask_delegate.h
index 73ec3b0..26103e01 100644
--- a/components/autofill/core/browser/card_unmask_delegate.h
+++ b/components/autofill/core/browser/card_unmask_delegate.h
@@ -28,13 +28,6 @@
 
     // State of "copy to this device" checkbox.
     bool should_store_pan;
-
-    // Risk fingerprint.
-    std::string risk_data;
-
-    // Whether we're providing the alternative "risk advisory data" in risk_data
-    // (as opposed to the normal browser fingerprint).
-    bool providing_risk_advisory_data;
   };
 
   // Called when the user has attempted a verification. Prompt is still
diff --git a/components/autofill/core/browser/form_structure.h b/components/autofill/core/browser/form_structure.h
index 706f651..786485e 100644
--- a/components/autofill/core/browser/form_structure.h
+++ b/components/autofill/core/browser/form_structure.h
@@ -191,8 +191,6 @@
 
   const GURL& source_url() const { return source_url_; }
 
-  bool has_password_field() const { return has_password_field_; }
-
   void set_upload_required(UploadRequired required) {
     upload_required_ = required;
   }
diff --git a/components/autofill/core/browser/payments/payments_client.cc b/components/autofill/core/browser/payments/payments_client.cc
new file mode 100644
index 0000000..aacd534
--- /dev/null
+++ b/components/autofill/core/browser/payments/payments_client.cc
@@ -0,0 +1,484 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/autofill/core/browser/payments/payments_client.h"
+
+#include "base/command_line.h"
+#include "base/json/json_reader.h"
+#include "base/json/json_writer.h"
+#include "base/memory/scoped_ptr.h"
+#include "base/strings/string_number_conversions.h"
+#include "base/strings/string_util.h"
+#include "base/strings/stringprintf.h"
+#include "base/strings/utf_string_conversions.h"
+#include "base/values.h"
+#include "components/autofill/core/browser/autofill_type.h"
+#include "components/autofill/core/browser/credit_card.h"
+#include "components/autofill/core/browser/payments/payments_request.h"
+#include "components/autofill/core/common/autofill_switches.h"
+#include "components/data_use_measurement/core/data_use_user_data.h"
+#include "google_apis/gaia/identity_provider.h"
+#include "net/base/escape.h"
+#include "net/base/load_flags.h"
+#include "net/http/http_status_code.h"
+#include "net/url_request/url_fetcher.h"
+#include "net/url_request/url_request_context_getter.h"
+
+namespace autofill {
+namespace payments {
+
+namespace {
+
+const char kPaymentsRequestHost[] = "https://wallet.google.com";
+const char kPaymentsRequestHostSandbox[] = "https://sandbox.google.com";
+
+const char kUnmaskCardRequestPath[] =
+    "payments/apis-secure/creditcardservice/getrealpan?s7e_suffix=chromewallet";
+const char kUnmaskCardRequestFormat[] =
+    "requestContentType=application/json; charset=utf-8&request=%s"
+    "&s7e_13_cvc=%s";
+
+const char kGetUploadDetailsRequestPath[] =
+    "payments/apis/chromepaymentsservice/getdetailsforsavecard";
+
+const char kUploadCardRequestPath[] =
+    "payments/apis-secure/chromepaymentsservice/savecard"
+    "?s7e_suffix=chromewallet";
+const char kUploadCardRequestFormat[] =
+    "requestContentType=application/json; charset=utf-8&request=%s"
+    "&s7e_1_pan=%s&s7e_13_cvc=%s";
+
+const char kTokenServiceConsumerId[] = "wallet_client";
+const char kPaymentsOAuth2Scope[] =
+    "https://www.googleapis.com/auth/wallet.chrome";
+
+// This is mostly copied from wallet_service_url.cc, which is currently in
+// content/, hence inaccessible from here.
+bool IsPaymentsProductionEnabled() {
+  // If the command line flag exists, it takes precedence.
+  const base::CommandLine* command_line =
+      base::CommandLine::ForCurrentProcess();
+  std::string sandbox_enabled(
+      command_line->GetSwitchValueASCII(switches::kWalletServiceUseSandbox));
+  if (!sandbox_enabled.empty())
+    return sandbox_enabled != "1";
+
+#if defined(ENABLE_PROD_WALLET_SERVICE)
+  return true;
+#else
+  return false;
+#endif
+}
+
+GURL GetRequestUrl(const std::string& path) {
+  if (base::CommandLine::ForCurrentProcess()->HasSwitch("sync-url")) {
+    if (IsPaymentsProductionEnabled()) {
+      LOG(ERROR) << "You are using production Payments but you specified a "
+                    "--sync-url. You likely want to disable the sync sandbox "
+                    "or switch to sandbox Payments. Both are controlled in "
+                    "about:flags.";
+    }
+  } else if (!IsPaymentsProductionEnabled()) {
+    LOG(ERROR) << "You are using sandbox Payments but you didn't specify a "
+                  "--sync-url. You likely want to enable the sync sandbox "
+                  "or switch to production Payments. Both are controlled in "
+                  "about:flags.";
+  }
+
+  GURL base(IsPaymentsProductionEnabled() ? kPaymentsRequestHost
+                                          : kPaymentsRequestHostSandbox);
+  return base.Resolve(path);
+}
+
+scoped_ptr<base::DictionaryValue> BuildRiskDictionary(
+    const std::string& encoded_risk_data) {
+  scoped_ptr<base::DictionaryValue> risk_data(new base::DictionaryValue());
+#if defined(OS_IOS)
+  // Browser fingerprinting is not available on iOS. Instead, we generate
+  // RiskAdvisoryData.
+  risk_data->SetString("message_type", "RISK_ADVISORY_DATA");
+  risk_data->SetString("encoding_type", "BASE_64_URL");
+#else
+  risk_data->SetString("message_type", "BROWSER_NATIVE_FINGERPRINTING");
+  risk_data->SetString("encoding_type", "BASE_64");
+#endif
+
+  risk_data->SetString("value", encoded_risk_data);
+
+  return risk_data.Pass();
+}
+
+class UnmaskCardRequest : public PaymentsRequest {
+ public:
+  UnmaskCardRequest(const PaymentsClient::UnmaskRequestDetails& request_details)
+      : request_details_(request_details) {
+    DCHECK_EQ(CreditCard::MASKED_SERVER_CARD,
+              request_details.card.record_type());
+  }
+  ~UnmaskCardRequest() override {}
+
+  std::string GetRequestUrlPath() override { return kUnmaskCardRequestPath; }
+
+  std::string GetRequestContentType() override {
+    return "application/x-www-form-urlencoded";
+  }
+
+  std::string GetRequestContent() override {
+    base::DictionaryValue request_dict;
+    request_dict.SetString("encrypted_cvc", "__param:s7e_13_cvc");
+    request_dict.SetString("credit_card_id", request_details_.card.server_id());
+    request_dict.Set("risk_data_encoded",
+                     BuildRiskDictionary(request_details_.risk_data));
+    request_dict.Set("context", make_scoped_ptr(new base::DictionaryValue()));
+
+    int value = 0;
+    if (base::StringToInt(request_details_.user_response.exp_month, &value))
+      request_dict.SetInteger("expiration_month", value);
+    if (base::StringToInt(request_details_.user_response.exp_year, &value))
+      request_dict.SetInteger("expiration_year", value);
+
+    std::string json_request;
+    base::JSONWriter::Write(request_dict, &json_request);
+    std::string request_content = base::StringPrintf(
+        kUnmaskCardRequestFormat,
+        net::EscapeUrlEncodedData(json_request, true).c_str(),
+        net::EscapeUrlEncodedData(
+            base::UTF16ToASCII(request_details_.user_response.cvc), true)
+            .c_str());
+    VLOG(3) << "getrealpan request body: " << request_content;
+    return request_content;
+  }
+
+  void ParseResponse(scoped_ptr<base::DictionaryValue> response) override {
+    response->GetString("pan", &real_pan_);
+  }
+
+  bool IsResponseComplete() override { return !real_pan_.empty(); }
+
+  void RespondToDelegate(PaymentsClientDelegate* delegate,
+                         AutofillClient::PaymentsRpcResult result) override {
+    delegate->OnDidGetRealPan(result, real_pan_);
+  }
+
+ private:
+  PaymentsClient::UnmaskRequestDetails request_details_;
+  std::string real_pan_;
+};
+
+class GetUploadDetailsRequest : public PaymentsRequest {
+ public:
+  GetUploadDetailsRequest(const std::string& app_locale)
+      : app_locale_(app_locale) {}
+  ~GetUploadDetailsRequest() override {}
+
+  std::string GetRequestUrlPath() override {
+    return kGetUploadDetailsRequestPath;
+  }
+
+  std::string GetRequestContentType() override { return "application/json"; }
+
+  std::string GetRequestContent() override {
+    base::DictionaryValue request_dict;
+    scoped_ptr<base::DictionaryValue> context(new base::DictionaryValue());
+    context->SetString("language_code", app_locale_);
+    request_dict.Set("context", context.Pass());
+
+    std::string request_content;
+    base::JSONWriter::Write(request_dict, &request_content);
+    VLOG(3) << "getsavecarddetails request body: " << request_content;
+    return request_content;
+  }
+
+  void ParseResponse(scoped_ptr<base::DictionaryValue> response) override {
+    response->GetString("context_token", &context_token_);
+    base::DictionaryValue* unowned_legal_message;
+    if (response->GetDictionary("legal_message", &unowned_legal_message))
+      legal_message_ = unowned_legal_message->CreateDeepCopy();
+  }
+
+  bool IsResponseComplete() override {
+    return !context_token_.empty() && legal_message_;
+  }
+
+  void RespondToDelegate(PaymentsClientDelegate* delegate,
+                         AutofillClient::PaymentsRpcResult result) override {
+    delegate->OnDidGetUploadDetails(result, context_token_,
+                                    legal_message_.Pass());
+  }
+
+ private:
+  std::string app_locale_;
+  base::string16 context_token_;
+  scoped_ptr<base::DictionaryValue> legal_message_;
+};
+
+class UploadCardRequest : public PaymentsRequest {
+ public:
+  UploadCardRequest(const PaymentsClient::UploadRequestDetails& request_details)
+      : request_details_(request_details) {}
+  ~UploadCardRequest() override {}
+
+  std::string GetRequestUrlPath() override { return kUploadCardRequestPath; }
+
+  std::string GetRequestContentType() override {
+    return "application/x-www-form-urlencoded";
+  }
+
+  std::string GetRequestContent() override {
+    base::DictionaryValue request_dict;
+    request_dict.SetString("encrypted_pan", "__param:s7e_1_pan");
+    request_dict.SetString("encrypted_cvc", "__param:s7e_13_cvc");
+    request_dict.Set("risk_data_encoded",
+                     BuildRiskDictionary(request_details_.risk_data));
+
+    scoped_ptr<base::DictionaryValue> context(new base::DictionaryValue());
+    context->SetString("language_code", request_details_.app_locale);
+    request_dict.Set("context", context.Pass());
+
+    request_dict.SetString(
+        "cardholder_name",
+        request_details_.card.GetInfo(AutofillType(CREDIT_CARD_NAME),
+                                      request_details_.app_locale));
+
+    // TODO(jdonnelly): Get address(es) from the current session or available
+    // profiles and add to the request.
+
+    request_dict.SetString("context_token", request_details_.context_token);
+
+    int value = 0;
+    base::string16 exp_month = request_details_.card.GetInfo(
+        AutofillType(CREDIT_CARD_EXP_MONTH), request_details_.app_locale);
+    base::string16 exp_year = request_details_.card.GetInfo(
+        AutofillType(CREDIT_CARD_EXP_4_DIGIT_YEAR),
+        request_details_.app_locale);
+    if (base::StringToInt(exp_month, &value))
+      request_dict.SetInteger("expiration_month", value);
+    if (base::StringToInt(exp_year, &value))
+      request_dict.SetInteger("expiration_year", value);
+
+    base::string16 pan = request_details_.card.GetInfo(
+        AutofillType(CREDIT_CARD_NUMBER), request_details_.app_locale);
+    std::string json_request;
+    base::JSONWriter::Write(request_dict, &json_request);
+    std::string request_content = base::StringPrintf(
+        kUploadCardRequestFormat,
+        net::EscapeUrlEncodedData(json_request, true).c_str(),
+        net::EscapeUrlEncodedData(base::UTF16ToASCII(pan), true).c_str(),
+        net::EscapeUrlEncodedData(base::UTF16ToASCII(request_details_.cvc),
+                                  true)
+            .c_str());
+    VLOG(3) << "savecard request body: " << request_content;
+    return request_content;
+  }
+
+  void ParseResponse(scoped_ptr<base::DictionaryValue> response) override {}
+
+  bool IsResponseComplete() override { return true; }
+
+  void RespondToDelegate(PaymentsClientDelegate* delegate,
+                         AutofillClient::PaymentsRpcResult result) override {
+    delegate->OnDidUploadCard(result);
+  }
+
+ private:
+  PaymentsClient::UploadRequestDetails request_details_;
+};
+
+}  // namespace
+
+PaymentsClient::UnmaskRequestDetails::UnmaskRequestDetails() {}
+PaymentsClient::UnmaskRequestDetails::~UnmaskRequestDetails() {}
+
+PaymentsClient::UploadRequestDetails::UploadRequestDetails() {}
+PaymentsClient::UploadRequestDetails::~UploadRequestDetails() {}
+
+PaymentsClient::PaymentsClient(net::URLRequestContextGetter* context_getter,
+                               PaymentsClientDelegate* delegate)
+    : OAuth2TokenService::Consumer(kTokenServiceConsumerId),
+      context_getter_(context_getter),
+      delegate_(delegate),
+      has_retried_authorization_(false),
+      weak_ptr_factory_(this) {
+  DCHECK(delegate);
+}
+
+PaymentsClient::~PaymentsClient() {}
+
+void PaymentsClient::Prepare() {
+  if (access_token_.empty())
+    StartTokenFetch(false);
+}
+
+void PaymentsClient::UnmaskCard(
+    const PaymentsClient::UnmaskRequestDetails& request_details) {
+  IssueRequest(make_scoped_ptr(new UnmaskCardRequest(request_details)), true);
+}
+
+void PaymentsClient::GetUploadDetails(const std::string& app_locale) {
+  IssueRequest(make_scoped_ptr(new GetUploadDetailsRequest(app_locale)), false);
+}
+
+void PaymentsClient::UploadCard(
+    const PaymentsClient::UploadRequestDetails& request_details) {
+  IssueRequest(make_scoped_ptr(new UploadCardRequest(request_details)), true);
+}
+
+void PaymentsClient::IssueRequest(scoped_ptr<PaymentsRequest> request,
+                                  bool authenticate) {
+  request_ = request.Pass();
+  has_retried_authorization_ = false;
+  InitializeUrlFetcher();
+
+  if (!authenticate)
+    url_fetcher_->Start();
+  else if (access_token_.empty())
+    StartTokenFetch(false);
+  else
+    SetOAuth2TokenAndStartRequest();
+}
+
+void PaymentsClient::InitializeUrlFetcher() {
+  url_fetcher_ =
+      net::URLFetcher::Create(0, GetRequestUrl(request_->GetRequestUrlPath()),
+                              net::URLFetcher::POST, this);
+
+  data_use_measurement::DataUseUserData::AttachToFetcher(
+      url_fetcher_.get(), data_use_measurement::DataUseUserData::AUTOFILL);
+  url_fetcher_->SetRequestContext(context_getter_.get());
+  url_fetcher_->SetLoadFlags(net::LOAD_DO_NOT_SAVE_COOKIES |
+                             net::LOAD_DO_NOT_SEND_COOKIES |
+                             net::LOAD_DISABLE_CACHE);
+
+  url_fetcher_->SetUploadData(request_->GetRequestContentType(),
+                              request_->GetRequestContent());
+}
+
+void PaymentsClient::CancelRequest() {
+  request_.reset();
+  url_fetcher_.reset();
+  access_token_request_.reset();
+  access_token_.clear();
+  has_retried_authorization_ = false;
+}
+
+void PaymentsClient::OnURLFetchComplete(const net::URLFetcher* source) {
+  DCHECK_EQ(source, url_fetcher_.get());
+
+  // |url_fetcher_|, which is aliased to |source|, might continue to be used in
+  // this method, but should be freed once control leaves the method.
+  scoped_ptr<net::URLFetcher> scoped_url_fetcher(url_fetcher_.Pass());
+  scoped_ptr<base::DictionaryValue> response_dict;
+  int response_code = source->GetResponseCode();
+  std::string data;
+  source->GetResponseAsString(&data);
+  VLOG(2) << "Got data: " << data;
+
+  AutofillClient::PaymentsRpcResult result = AutofillClient::SUCCESS;
+
+  switch (response_code) {
+    // Valid response.
+    case net::HTTP_OK: {
+      std::string error_code;
+      scoped_ptr<base::Value> message_value = base::JSONReader::Read(data);
+      if (message_value.get() &&
+          message_value->IsType(base::Value::TYPE_DICTIONARY)) {
+        response_dict.reset(
+            static_cast<base::DictionaryValue*>(message_value.release()));
+        response_dict->GetString("error.code", &error_code);
+        request_->ParseResponse(response_dict.Pass());
+      }
+
+      if (base::LowerCaseEqualsASCII(error_code, "internal"))
+        result = AutofillClient::TRY_AGAIN_FAILURE;
+      else if (!error_code.empty() || !request_->IsResponseComplete())
+        result = AutofillClient::PERMANENT_FAILURE;
+
+      break;
+    }
+
+    case net::HTTP_UNAUTHORIZED: {
+      if (has_retried_authorization_) {
+        result = AutofillClient::PERMANENT_FAILURE;
+        break;
+      }
+      has_retried_authorization_ = true;
+
+      InitializeUrlFetcher();
+      StartTokenFetch(true);
+      return;
+    }
+
+    // TODO(estade): is this actually how network connectivity issues are
+    // reported?
+    case net::HTTP_REQUEST_TIMEOUT: {
+      result = AutofillClient::NETWORK_ERROR;
+      break;
+    }
+
+    // Handle anything else as a generic (permanent) failure.
+    default: {
+      result = AutofillClient::PERMANENT_FAILURE;
+      break;
+    }
+  }
+
+  if (result != AutofillClient::SUCCESS) {
+    VLOG(1) << "Payments returned error: " << response_code
+            << " with data: " << data;
+  }
+
+  request_->RespondToDelegate(delegate_, result);
+}
+
+void PaymentsClient::OnGetTokenSuccess(
+    const OAuth2TokenService::Request* request,
+    const std::string& access_token,
+    const base::Time& expiration_time) {
+  DCHECK_EQ(request, access_token_request_.get());
+  access_token_ = access_token;
+  if (url_fetcher_)
+    SetOAuth2TokenAndStartRequest();
+
+  access_token_request_.reset();
+}
+
+void PaymentsClient::OnGetTokenFailure(
+    const OAuth2TokenService::Request* request,
+    const GoogleServiceAuthError& error) {
+  DCHECK_EQ(request, access_token_request_.get());
+  VLOG(1) << "Unhandled OAuth2 error: " << error.ToString();
+  if (url_fetcher_) {
+    url_fetcher_.reset();
+    request_->RespondToDelegate(delegate_, AutofillClient::PERMANENT_FAILURE);
+  }
+  access_token_request_.reset();
+}
+
+void PaymentsClient::StartTokenFetch(bool invalidate_old) {
+  // We're still waiting for the last request to come back.
+  if (!invalidate_old && access_token_request_)
+    return;
+
+  OAuth2TokenService::ScopeSet payments_scopes;
+  payments_scopes.insert(kPaymentsOAuth2Scope);
+  IdentityProvider* identity = delegate_->GetIdentityProvider();
+  if (invalidate_old) {
+    DCHECK(!access_token_.empty());
+    identity->GetTokenService()->InvalidateAccessToken(
+        identity->GetActiveAccountId(), payments_scopes, access_token_);
+  }
+  access_token_.clear();
+  access_token_request_ = identity->GetTokenService()->StartRequest(
+      identity->GetActiveAccountId(), payments_scopes, this);
+}
+
+void PaymentsClient::SetOAuth2TokenAndStartRequest() {
+  url_fetcher_->AddExtraRequestHeader(net::HttpRequestHeaders::kAuthorization +
+                                      std::string(": Bearer ") + access_token_);
+
+  url_fetcher_->Start();
+}
+
+}  // namespace payments
+}  // namespace autofill
diff --git a/components/autofill/core/browser/payments/payments_client.h b/components/autofill/core/browser/payments/payments_client.h
new file mode 100644
index 0000000..a6a23af
--- /dev/null
+++ b/components/autofill/core/browser/payments/payments_client.h
@@ -0,0 +1,171 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_PAYMENTS_PAYMENTS_CLIENT_H_
+#define COMPONENTS_AUTOFILL_CORE_BROWSER_PAYMENTS_PAYMENTS_CLIENT_H_
+
+#include "base/macros.h"
+#include "base/memory/ref_counted.h"
+#include "base/memory/weak_ptr.h"
+#include "components/autofill/core/browser/autofill_client.h"
+#include "components/autofill/core/browser/card_unmask_delegate.h"
+#include "components/autofill/core/browser/credit_card.h"
+#include "google_apis/gaia/oauth2_token_service.h"
+#include "net/url_request/url_fetcher_delegate.h"
+
+class IdentityProvider;
+
+namespace net {
+class URLFetcher;
+class URLRequestContextGetter;
+}
+
+namespace autofill {
+
+namespace payments {
+
+class PaymentsRequest;
+
+class PaymentsClientDelegate {
+ public:
+  // The identity provider used to get OAuth2 tokens.
+  virtual IdentityProvider* GetIdentityProvider() = 0;
+
+  // Returns the real PAN retrieved from Payments. |real_pan| will be empty
+  // on failure.
+  virtual void OnDidGetRealPan(AutofillClient::PaymentsRpcResult result,
+                               const std::string& real_pan) = 0;
+
+  // Returns the legal message retrieved from Payments. On failure or not
+  // meeting Payments's conditions for upload, |legal_message| will contain
+  // nullptr.
+  virtual void OnDidGetUploadDetails(
+      AutofillClient::PaymentsRpcResult result,
+      const base::string16& context_token,
+      scoped_ptr<base::DictionaryValue> legal_message) = 0;
+
+  // Returns the result of an upload request.
+  virtual void OnDidUploadCard(AutofillClient::PaymentsRpcResult result) = 0;
+};
+
+// PaymentsClient issues Payments RPCs and manages responses and failure
+// conditions. Only one request may be active at a time. Initiating a new
+// request will cancel a pending request.
+// Tests are located in
+// src/components/autofill/content/browser/wallet/payments_client_unittest.cc.
+class PaymentsClient : public net::URLFetcherDelegate,
+                       public OAuth2TokenService::Consumer {
+ public:
+  // A collection of the information required to make a credit card unmask
+  // request.
+  struct UnmaskRequestDetails {
+    UnmaskRequestDetails();
+    ~UnmaskRequestDetails();
+
+    CreditCard card;
+    std::string risk_data;
+    CardUnmaskDelegate::UnmaskResponse user_response;
+  };
+
+  // A collection of the information required to make a credit card upload
+  // request.
+  struct UploadRequestDetails {
+    UploadRequestDetails();
+    ~UploadRequestDetails();
+
+    CreditCard card;
+    base::string16 cvc;
+    base::string16 context_token;
+    std::string risk_data;
+    std::string app_locale;
+  };
+
+  // |context_getter| is reference counted so it has no lifetime or ownership
+  // requirements. |delegate| must outlive |this|. |source_url| is the url
+  // of the merchant page.
+  PaymentsClient(net::URLRequestContextGetter* context_getter,
+                 PaymentsClientDelegate* delegate);
+
+  ~PaymentsClient() override;
+
+  // Starts fetching the OAuth2 token in anticipation of future Payments
+  // requests. Called as an optimization, but not strictly necessary. Should
+  // *not* be called in advance of GetUploadDetails or UploadCard because
+  // identifying information should not be sent until the user has explicitly
+  // accepted an upload prompt.
+  void Prepare();
+
+  // The user has attempted to unmask a card with the given cvc.
+  void UnmaskCard(const UnmaskRequestDetails& request_details);
+
+  // Determine if the user meets the Payments service's conditions for upload.
+  // If so, the required legal message for display will be returned via
+  // OnDidGetUploadDetails.
+  virtual void GetUploadDetails(const std::string& app_locale);
+
+  // The user has indicated that they would like to upload a card with the given
+  // cvc. This request will fail server-side if a successful call to
+  // GetUploadDetails has not already been made.
+  virtual void UploadCard(const UploadRequestDetails& details);
+
+  // Cancels and clears the current |request_|.
+  void CancelRequest();
+
+ private:
+  // Initiates a Payments request using the state in |request|. If
+  // |authenticate| is true, ensures that an OAuth token is avialble first.
+  // Takes ownership of |request|.
+  void IssueRequest(scoped_ptr<PaymentsRequest> request, bool authenticate);
+
+  // net::URLFetcherDelegate:
+  void OnURLFetchComplete(const net::URLFetcher* source) override;
+
+  // OAuth2TokenService::Consumer implementation.
+  void OnGetTokenSuccess(const OAuth2TokenService::Request* request,
+                         const std::string& access_token,
+                         const base::Time& expiration_time) override;
+  void OnGetTokenFailure(const OAuth2TokenService::Request* request,
+                         const GoogleServiceAuthError& error) override;
+
+  // Creates |url_fetcher_| based on the current state of |request_|.
+  void InitializeUrlFetcher();
+
+  // Initiates a new OAuth2 token request.
+  void StartTokenFetch(bool invalidate_old);
+
+  // Adds the token to |url_fetcher_| and starts the request.
+  void SetOAuth2TokenAndStartRequest();
+
+  // The context for the request.
+  scoped_refptr<net::URLRequestContextGetter> context_getter_;
+
+  // Observer class that has its various On* methods called based on the results
+  // of a Payments request.
+  PaymentsClientDelegate* const delegate_;  // must outlive |this|.
+
+  // The current request.
+  scoped_ptr<PaymentsRequest> request_;
+
+  // The fetcher being used to issue the current request.
+  scoped_ptr<net::URLFetcher> url_fetcher_;
+
+  // The current OAuth2 token request object.
+  scoped_ptr<OAuth2TokenService::Request> access_token_request_;
+
+  // The OAuth2 token, or empty if not fetched.
+  std::string access_token_;
+
+  // True if |request_| has already retried due to a 401 response from the
+  // server.
+  bool has_retried_authorization_;
+
+  base::WeakPtrFactory<PaymentsClient> weak_ptr_factory_;
+
+  DISALLOW_COPY_AND_ASSIGN(PaymentsClient);
+};
+
+}  // namespace payments
+}  // namespace autofill
+
+#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_PAYMENTS_PAYMENTS_CLIENT_H_
diff --git a/components/autofill/core/browser/payments/payments_request.h b/components/autofill/core/browser/payments/payments_request.h
new file mode 100644
index 0000000..be59661
--- /dev/null
+++ b/components/autofill/core/browser/payments/payments_request.h
@@ -0,0 +1,46 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_PAYMENTS_PAYMENTS_REQUEST_H_
+#define COMPONENTS_AUTOFILL_CORE_BROWSER_PAYMENTS_PAYMENTS_REQUEST_H_
+
+namespace autofill {
+
+class AutofillClient;
+
+namespace payments {
+
+class PaymentsClientDelegate;
+
+// Interface for the various Payments request types.
+class PaymentsRequest {
+ public:
+  virtual ~PaymentsRequest() {}
+
+  // Returns the URL path for this type of request.
+  virtual std::string GetRequestUrlPath() = 0;
+
+  // Returns the content type that should be used in the HTTP request.
+  virtual std::string GetRequestContentType() = 0;
+
+  // Returns the content that should be provided in the HTTP request.
+  virtual std::string GetRequestContent() = 0;
+
+  // Parses the required elements of the HTTP response.
+  virtual void ParseResponse(scoped_ptr<base::DictionaryValue> response) = 0;
+
+  // Returns true if all of the required elements were successfully retrieved by
+  // a call to ParseResponse.
+  virtual bool IsResponseComplete() = 0;
+
+  // Invokes the appropriate callback in the delegate based on what type of
+  // request this is.
+  virtual void RespondToDelegate(PaymentsClientDelegate* delegate,
+                                 AutofillClient::PaymentsRpcResult result) = 0;
+};
+
+}  // namespace payments
+}  // namespace autofill
+
+#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_PAYMENTS_PAYMENTS_REQUEST_H_
diff --git a/components/autofill/core/browser/test_autofill_client.cc b/components/autofill/core/browser/test_autofill_client.cc
index 0b1f279..f6c2278 100644
--- a/components/autofill/core/browser/test_autofill_client.cc
+++ b/components/autofill/core/browser/test_autofill_client.cc
@@ -48,11 +48,20 @@
     base::WeakPtr<CardUnmaskDelegate> delegate) {
 }
 
-void TestAutofillClient::OnUnmaskVerificationResult(GetRealPanResult result) {
+void TestAutofillClient::OnUnmaskVerificationResult(PaymentsRpcResult result) {}
+
+void TestAutofillClient::ConfirmSaveCreditCardLocally(
+    const base::Closure& callback) {}
+
+void TestAutofillClient::ConfirmSaveCreditCardToCloud(
+    const base::Closure& callback,
+    scoped_ptr<base::DictionaryValue> legal_message) {
+  callback.Run();
 }
 
-void TestAutofillClient::ConfirmSaveCreditCard(
-    const base::Closure& save_card_callback) {
+void TestAutofillClient::LoadRiskData(
+    const base::Callback<void(const std::string&)>& callback) {
+  callback.Run("some risk data");
 }
 
 bool TestAutofillClient::HasCreditCardScanFeature() {
diff --git a/components/autofill/core/browser/test_autofill_client.h b/components/autofill/core/browser/test_autofill_client.h
index bc423d2..11bebc8 100644
--- a/components/autofill/core/browser/test_autofill_client.h
+++ b/components/autofill/core/browser/test_autofill_client.h
@@ -32,8 +32,13 @@
   void ShowAutofillSettings() override;
   void ShowUnmaskPrompt(const CreditCard& card,
                         base::WeakPtr<CardUnmaskDelegate> delegate) override;
-  void OnUnmaskVerificationResult(GetRealPanResult result) override;
-  void ConfirmSaveCreditCard(const base::Closure& save_card_callback) override;
+  void OnUnmaskVerificationResult(PaymentsRpcResult result) override;
+  void ConfirmSaveCreditCardLocally(const base::Closure& callback) override;
+  void ConfirmSaveCreditCardToCloud(
+      const base::Closure& callback,
+      scoped_ptr<base::DictionaryValue> legal_message) override;
+  void LoadRiskData(
+      const base::Callback<void(const std::string&)>& callback) override;
   bool HasCreditCardScanFeature() override;
   void ScanCreditCard(const CreditCardScanCallback& callback) override;
   void ShowRequestAutocompleteDialog(const FormData& form,
diff --git a/components/autofill/core/browser/ui/card_unmask_prompt_controller_impl.cc b/components/autofill/core/browser/ui/card_unmask_prompt_controller_impl.cc
index 22628d9..1ac9687c 100644
--- a/components/autofill/core/browser/ui/card_unmask_prompt_controller_impl.cc
+++ b/components/autofill/core/browser/ui/card_unmask_prompt_controller_impl.cc
@@ -20,19 +20,16 @@
 namespace autofill {
 
 CardUnmaskPromptControllerImpl::CardUnmaskPromptControllerImpl(
-    const RiskDataCallback& risk_data_callback,
     PrefService* pref_service,
     bool is_off_the_record)
-    : risk_data_callback_(risk_data_callback),
-      pref_service_(pref_service),
+    : pref_service_(pref_service),
       new_card_link_clicked_(false),
       is_off_the_record_(is_off_the_record),
       card_unmask_view_(nullptr),
       unmasking_result_(AutofillClient::NONE),
       unmasking_initial_should_store_pan_(false),
       unmasking_number_of_attempts_(0),
-      weak_pointer_factory_(this) {
-}
+      weak_pointer_factory_(this) {}
 
 CardUnmaskPromptControllerImpl::~CardUnmaskPromptControllerImpl() {
   if (card_unmask_view_)
@@ -49,7 +46,6 @@
   new_card_link_clicked_ = false;
   shown_timestamp_ = base::Time::Now();
   pending_response_ = CardUnmaskDelegate::UnmaskResponse();
-  LoadRiskFingerprint();
   card_unmask_view_ = card_unmask_view;
   card_ = card;
   delegate_ = delegate;
@@ -61,7 +57,7 @@
 }
 
 bool CardUnmaskPromptControllerImpl::AllowsRetry(
-    AutofillClient::GetRealPanResult result) {
+    AutofillClient::PaymentsRpcResult result) {
   if (result == AutofillClient::NETWORK_ERROR ||
       result == AutofillClient::PERMANENT_FAILURE) {
     return false;
@@ -70,7 +66,7 @@
 }
 
 void CardUnmaskPromptControllerImpl::OnVerificationResult(
-    AutofillClient::GetRealPanResult result) {
+    AutofillClient::PaymentsRpcResult result) {
   if (!card_unmask_view_)
     return;
 
@@ -205,8 +201,7 @@
     pending_response_.should_store_pan = false;
   }
 
-  if (!pending_response_.risk_data.empty())
-    delegate_->OnUnmaskResponse(pending_response_);
+  delegate_->OnUnmaskResponse(pending_response_);
 }
 
 void CardUnmaskPromptControllerImpl::NewCardLinkClicked() {
@@ -311,17 +306,4 @@
   return base::TimeDelta::FromMilliseconds(500);
 }
 
-void CardUnmaskPromptControllerImpl::LoadRiskFingerprint() {
-  risk_data_callback_.Run(
-      base::Bind(&CardUnmaskPromptControllerImpl::OnDidLoadRiskFingerprint,
-                 weak_pointer_factory_.GetWeakPtr()));
-}
-
-void CardUnmaskPromptControllerImpl::OnDidLoadRiskFingerprint(
-    const std::string& risk_data) {
-  pending_response_.risk_data = risk_data;
-  if (!pending_response_.cvc.empty())
-    delegate_->OnUnmaskResponse(pending_response_);
-}
-
 }  // namespace autofill
diff --git a/components/autofill/core/browser/ui/card_unmask_prompt_controller_impl.h b/components/autofill/core/browser/ui/card_unmask_prompt_controller_impl.h
index 59ac7b7..df2b8c3 100644
--- a/components/autofill/core/browser/ui/card_unmask_prompt_controller_impl.h
+++ b/components/autofill/core/browser/ui/card_unmask_prompt_controller_impl.h
@@ -22,11 +22,7 @@
 
 class CardUnmaskPromptControllerImpl : public CardUnmaskPromptController {
  public:
-  typedef base::Callback<void(const base::Callback<void(const std::string&)>&)>
-      RiskDataCallback;
-
   CardUnmaskPromptControllerImpl(
-      const RiskDataCallback& risk_data_callback,
       PrefService* pref_service,
       bool is_off_the_record);
   virtual ~CardUnmaskPromptControllerImpl();
@@ -36,7 +32,7 @@
                   const CreditCard& card,
                   base::WeakPtr<CardUnmaskDelegate> delegate);
   // The CVC the user entered went through validation.
-  void OnVerificationResult(AutofillClient::GetRealPanResult result);
+  void OnVerificationResult(AutofillClient::PaymentsRpcResult result);
 
   // CardUnmaskPromptController implementation.
   void OnUnmaskDialogClosed() override;
@@ -57,21 +53,14 @@
   base::TimeDelta GetSuccessMessageDuration() const override;
 
  protected:
-  // Virtual so tests can suppress it.
-  virtual void LoadRiskFingerprint();
-
-  // Protected so tests can call it.
-  void OnDidLoadRiskFingerprint(const std::string& risk_data);
-
   // Exposed for testing.
   CardUnmaskPromptView* view() { return card_unmask_view_; }
 
  private:
-  bool AllowsRetry(AutofillClient::GetRealPanResult result);
+  bool AllowsRetry(AutofillClient::PaymentsRpcResult result);
   void LogOnCloseEvents();
   AutofillMetrics::UnmaskPromptEvent GetCloseReasonEvent();
 
-  RiskDataCallback risk_data_callback_;
   PrefService* pref_service_;
   bool new_card_link_clicked_;
   bool is_off_the_record_;
@@ -79,7 +68,7 @@
   base::WeakPtr<CardUnmaskDelegate> delegate_;
   CardUnmaskPromptView* card_unmask_view_;
 
-  AutofillClient::GetRealPanResult unmasking_result_;
+  AutofillClient::PaymentsRpcResult unmasking_result_;
   bool unmasking_initial_should_store_pan_;
   int unmasking_number_of_attempts_;
   base::Time shown_timestamp_;
diff --git a/components/autofill/core/browser/ui/card_unmask_prompt_controller_impl_unittest.cc b/components/autofill/core/browser/ui/card_unmask_prompt_controller_impl_unittest.cc
index f45e79e..e0ff1ea 100644
--- a/components/autofill/core/browser/ui/card_unmask_prompt_controller_impl_unittest.cc
+++ b/components/autofill/core/browser/ui/card_unmask_prompt_controller_impl_unittest.cc
@@ -54,23 +54,14 @@
                              bool allow_retry) override {}
 };
 
-void TestGetRiskData(const base::Callback<void(const std::string&)>& callback) {
-  callback.Run("some risk data");
-}
-
 class TestCardUnmaskPromptController : public CardUnmaskPromptControllerImpl {
  public:
   explicit TestCardUnmaskPromptController(
       TestingPrefServiceSimple* pref_service)
-      : CardUnmaskPromptControllerImpl(
-            base::Bind(&TestGetRiskData), pref_service, false),
+      : CardUnmaskPromptControllerImpl(pref_service, false),
         can_store_locally_(true),
         weak_factory_(this) {}
 
-  void LoadRiskFingerprint() override {
-    OnDidLoadRiskFingerprint("risk aversion");
-  }
-
   bool CanStoreLocally() const override { return can_store_locally_; }
 
   void set_can_store_locally(bool can) { can_store_locally_ = can; }
@@ -394,9 +385,9 @@
   base::HistogramTester histogram_tester;
   controller_->OnVerificationResult(AutofillClient::SUCCESS);
 
-  histogram_tester.ExpectBucketCount(
-      "Autofill.UnmaskPrompt.GetRealPanResult",
-      AutofillMetrics::GET_REAL_PAN_RESULT_SUCCESS, 1);
+  histogram_tester.ExpectBucketCount("Autofill.UnmaskPrompt.GetRealPanResult",
+                                     AutofillMetrics::PAYMENTS_RESULT_SUCCESS,
+                                     1);
 }
 
 TEST_F(CardUnmaskPromptControllerImplTest, LogRealPanTryAgainFailure) {
@@ -407,7 +398,7 @@
 
   histogram_tester.ExpectBucketCount(
       "Autofill.UnmaskPrompt.GetRealPanResult",
-      AutofillMetrics::GET_REAL_PAN_RESULT_TRY_AGAIN_FAILURE, 1);
+      AutofillMetrics::PAYMENTS_RESULT_TRY_AGAIN_FAILURE, 1);
 }
 
 TEST_F(CardUnmaskPromptControllerImplTest, LogUnmaskingDurationResultSuccess) {
diff --git a/components/autofill/core/browser/wallet/real_pan_wallet_client.cc b/components/autofill/core/browser/wallet/real_pan_wallet_client.cc
deleted file mode 100644
index d9055b5..0000000
--- a/components/autofill/core/browser/wallet/real_pan_wallet_client.cc
+++ /dev/null
@@ -1,286 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "components/autofill/core/browser/wallet/real_pan_wallet_client.h"
-
-#include "base/bind.h"
-#include "base/command_line.h"
-#include "base/json/json_reader.h"
-#include "base/json/json_writer.h"
-#include "base/memory/scoped_ptr.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/strings/string_util.h"
-#include "base/strings/stringprintf.h"
-#include "base/strings/utf_string_conversions.h"
-#include "base/values.h"
-#include "components/autofill/core/browser/credit_card.h"
-#include "components/autofill/core/common/autofill_switches.h"
-#include "components/data_use_measurement/core/data_use_user_data.h"
-#include "google_apis/gaia/identity_provider.h"
-#include "net/base/escape.h"
-#include "net/base/load_flags.h"
-#include "net/http/http_status_code.h"
-#include "net/url_request/url_fetcher.h"
-#include "net/url_request/url_request_context_getter.h"
-
-namespace autofill {
-namespace wallet {
-
-namespace {
-
-const char kUnmaskCardRequestFormat[] =
-    "requestContentType=application/json; charset=utf-8&request=%s"
-    "&s7e_13_cvc=%s";
-
-const char kUnmaskCardRequestHost[] = "https://wallet.google.com";
-const char kUnmaskCardRequestHostSandbox[] = "https://sandbox.google.com";
-const char kUnmaskCardRequestPath[] =
-    "payments/apis-secure/creditcardservice/getrealpan?s7e_suffix=chromewallet";
-
-const char kTokenServiceConsumerId[] = "real_pan_wallet_client";
-const char kWalletOAuth2Scope[] =
-    "https://www.googleapis.com/auth/wallet.chrome";
-
-// This is mostly copied from wallet_service_url.cc, which is currently in
-// content/, hence inaccessible from here.
-bool IsWalletProductionEnabled() {
-  // If the command line flag exists, it takes precedence.
-  const base::CommandLine* command_line =
-      base::CommandLine::ForCurrentProcess();
-  std::string sandbox_enabled(
-      command_line->GetSwitchValueASCII(switches::kWalletServiceUseSandbox));
-  if (!sandbox_enabled.empty())
-    return sandbox_enabled != "1";
-
-#if defined(ENABLE_PROD_WALLET_SERVICE)
-  return true;
-#else
-  return false;
-#endif
-}
-
-GURL GetUnmaskCardRequestUrl() {
-  if (base::CommandLine::ForCurrentProcess()->HasSwitch("sync-url")) {
-    if (IsWalletProductionEnabled()) {
-      LOG(ERROR) << "You are using production Wallet but you specified a "
-                    "--sync-url. You likely want to disable the sync sandbox "
-                    "or switch to sandbox Wallet. Both are controlled in "
-                    "about:flags.";
-    }
-  } else if (!IsWalletProductionEnabled()) {
-    LOG(ERROR) << "You are using sandbox Wallet but you didn't specify a "
-                  "--sync-url. You likely want to enable the sync sandbox "
-                  "or switch to production Wallet. Both are controlled in "
-                  "about:flags.";
-  }
-
-  GURL base(IsWalletProductionEnabled() ? kUnmaskCardRequestHost
-                                        : kUnmaskCardRequestHostSandbox);
-  return base.Resolve(kUnmaskCardRequestPath);
-}
-
-}  // namespace
-
-RealPanWalletClient::RealPanWalletClient(
-    net::URLRequestContextGetter* context_getter,
-    Delegate* delegate)
-    : OAuth2TokenService::Consumer(kTokenServiceConsumerId),
-      context_getter_(context_getter),
-      delegate_(delegate),
-      has_retried_authorization_(false),
-      weak_ptr_factory_(this) {
-  DCHECK(delegate);
-}
-
-RealPanWalletClient::~RealPanWalletClient() {
-}
-
-void RealPanWalletClient::Prepare() {
-  if (access_token_.empty())
-    StartTokenFetch(false);
-}
-
-void RealPanWalletClient::UnmaskCard(
-    const CreditCard& card,
-    const CardUnmaskDelegate::UnmaskResponse& response) {
-  DCHECK_EQ(CreditCard::MASKED_SERVER_CARD, card.record_type());
-  card_ = card;
-  response_ = response;
-  has_retried_authorization_ = false;
-
-  CreateRequest();
-  if (access_token_.empty())
-    StartTokenFetch(false);
-  else
-    SetOAuth2TokenAndStartRequest();
-}
-
-void RealPanWalletClient::CancelRequest() {
-  request_.reset();
-}
-
-void RealPanWalletClient::OnURLFetchComplete(const net::URLFetcher* source) {
-  DCHECK_EQ(source, request_.get());
-
-  // |request_|, which is aliased to |source|, might continue to be used in this
-  // |method, but should be freed once control leaves the method.
-  scoped_ptr<net::URLFetcher> scoped_request(request_.Pass());
-  scoped_ptr<base::DictionaryValue> response_dict;
-  int response_code = source->GetResponseCode();
-  std::string data;
-  source->GetResponseAsString(&data);
-  VLOG(2) << "Got data: " << data;
-
-  std::string real_pan;
-  AutofillClient::GetRealPanResult result = AutofillClient::SUCCESS;
-
-  switch (response_code) {
-    // Valid response.
-    case net::HTTP_OK: {
-      std::string error_code;
-      scoped_ptr<base::Value> message_value = base::JSONReader::Read(data);
-      if (message_value.get() &&
-          message_value->IsType(base::Value::TYPE_DICTIONARY)) {
-        response_dict.reset(
-            static_cast<base::DictionaryValue*>(message_value.release()));
-        response_dict->GetString("pan", &real_pan);
-        response_dict->GetString("error.code", &error_code);
-      }
-
-      if (base::LowerCaseEqualsASCII(error_code, "internal"))
-        result = AutofillClient::TRY_AGAIN_FAILURE;
-      else if (real_pan.empty() || !error_code.empty())
-        result = AutofillClient::PERMANENT_FAILURE;
-
-      break;
-    }
-
-    case net::HTTP_UNAUTHORIZED: {
-      if (has_retried_authorization_) {
-        result = AutofillClient::PERMANENT_FAILURE;
-        break;
-      }
-      has_retried_authorization_ = true;
-
-      CreateRequest();
-      StartTokenFetch(true);
-      return;
-    }
-
-    // TODO(estade): is this actually how network connectivity issues are
-    // reported?
-    case net::HTTP_REQUEST_TIMEOUT: {
-      result = AutofillClient::NETWORK_ERROR;
-      break;
-    }
-
-    // Handle anything else as a generic (permanent) failure.
-    default: {
-      result = AutofillClient::PERMANENT_FAILURE;
-      break;
-    }
-  }
-
-  if (real_pan.empty()) {
-    VLOG(1) << "Wallet returned error: " << response_code
-            << " with data: " << data;
-  }
-
-  DCHECK_EQ(result != AutofillClient::SUCCESS, real_pan.empty());
-  delegate_->OnDidGetRealPan(result, real_pan);
-}
-
-void RealPanWalletClient::OnGetTokenSuccess(
-    const OAuth2TokenService::Request* request,
-    const std::string& access_token,
-    const base::Time& expiration_time) {
-  DCHECK_EQ(request, access_token_request_.get());
-  access_token_ = access_token;
-  if (request_)
-    SetOAuth2TokenAndStartRequest();
-
-  access_token_request_.reset();
-}
-
-void RealPanWalletClient::OnGetTokenFailure(
-    const OAuth2TokenService::Request* request,
-    const GoogleServiceAuthError& error) {
-  DCHECK_EQ(request, access_token_request_.get());
-  VLOG(1) << "Unhandled OAuth2 error: " << error.ToString();
-  if (request_) {
-    request_.reset();
-    delegate_->OnDidGetRealPan(AutofillClient::PERMANENT_FAILURE,
-                               std::string());
-  }
-  access_token_request_.reset();
-}
-
-void RealPanWalletClient::CreateRequest() {
-  request_ = net::URLFetcher::Create(0, GetUnmaskCardRequestUrl(),
-                                     net::URLFetcher::POST, this);
-  data_use_measurement::DataUseUserData::AttachToFetcher(
-      request_.get(), data_use_measurement::DataUseUserData::AUTOFILL);
-  request_->SetRequestContext(context_getter_.get());
-  request_->SetLoadFlags(net::LOAD_DO_NOT_SAVE_COOKIES |
-      net::LOAD_DO_NOT_SEND_COOKIES | net::LOAD_DISABLE_CACHE);
-
-  base::DictionaryValue request_dict;
-  request_dict.SetString("encrypted_cvc", "__param:s7e_13_cvc");
-  request_dict.SetString("credit_card_id", card_.server_id());
-  scoped_ptr<base::DictionaryValue> risk_data(new base::DictionaryValue());
-  if (response_.providing_risk_advisory_data) {
-    risk_data->SetString("message_type", "RISK_ADVISORY_DATA");
-    risk_data->SetString("encoding_type", "BASE_64_URL");
-  } else {
-    risk_data->SetString("message_type", "BROWSER_NATIVE_FINGERPRINTING");
-    risk_data->SetString("encoding_type", "BASE_64");
-  }
-  risk_data->SetString("value", response_.risk_data);
-  request_dict.Set("risk_data_encoded", risk_data.Pass());
-  request_dict.Set("context", make_scoped_ptr(new base::DictionaryValue()));
-
-  int value = 0;
-  if (base::StringToInt(response_.exp_month, &value))
-    request_dict.SetInteger("expiration_month", value);
-  if (base::StringToInt(response_.exp_year, &value))
-    request_dict.SetInteger("expiration_year", value);
-
-  std::string json_request;
-  base::JSONWriter::Write(request_dict, &json_request);
-  std::string post_body =
-      base::StringPrintf(kUnmaskCardRequestFormat,
-                         net::EscapeUrlEncodedData(json_request, true).c_str(),
-                         net::EscapeUrlEncodedData(
-                             base::UTF16ToASCII(response_.cvc), true).c_str());
-  VLOG(3) << "getrealpan request body: " << post_body;
-  request_->SetUploadData("application/x-www-form-urlencoded", post_body);
-}
-
-void RealPanWalletClient::StartTokenFetch(bool invalidate_old) {
-  // We're still waiting for the last request to come back.
-  if (!invalidate_old && access_token_request_)
-    return;
-
-  OAuth2TokenService::ScopeSet wallet_scopes;
-  wallet_scopes.insert(kWalletOAuth2Scope);
-  IdentityProvider* identity = delegate_->GetIdentityProvider();
-  if (invalidate_old) {
-    DCHECK(!access_token_.empty());
-    identity->GetTokenService()->InvalidateAccessToken(
-        identity->GetActiveAccountId(), wallet_scopes, access_token_);
-  }
-  access_token_.clear();
-  access_token_request_ = identity->GetTokenService()->StartRequest(
-      identity->GetActiveAccountId(), wallet_scopes, this);
-}
-
-void RealPanWalletClient::SetOAuth2TokenAndStartRequest() {
-  request_->AddExtraRequestHeader(net::HttpRequestHeaders::kAuthorization +
-                                  std::string(": Bearer ") + access_token_);
-
-  request_->Start();
-}
-
-}  // namespace wallet
-}  // namespace autofill
diff --git a/components/autofill/core/browser/wallet/real_pan_wallet_client.h b/components/autofill/core/browser/wallet/real_pan_wallet_client.h
deleted file mode 100644
index b656d4a..0000000
--- a/components/autofill/core/browser/wallet/real_pan_wallet_client.h
+++ /dev/null
@@ -1,115 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_WALLET_REAL_PAN_WALLET_CLIENT_H_
-#define COMPONENTS_AUTOFILL_CORE_BROWSER_WALLET_REAL_PAN_WALLET_CLIENT_H_
-
-#include "base/memory/ref_counted.h"
-#include "base/memory/weak_ptr.h"
-#include "components/autofill/core/browser/autofill_client.h"
-#include "components/autofill/core/browser/card_unmask_delegate.h"
-#include "components/autofill/core/browser/credit_card.h"
-#include "google_apis/gaia/oauth2_token_service.h"
-#include "net/url_request/url_fetcher_delegate.h"
-
-class IdentityProvider;
-
-namespace net {
-class URLFetcher;
-class URLRequestContextGetter;
-}
-
-namespace autofill {
-
-namespace wallet {
-
-// RealPanWalletClient is modelled on WalletClient. Whereas the latter is used
-// for requestAutocomplete-related requests, RealPanWalletClient is used to
-// import user data from Wallet for normal web Autofill.
-// Tests: See content/browser/wallet/real_pan_wallet_client_unittest.cc
-class RealPanWalletClient : public net::URLFetcherDelegate,
-                            public OAuth2TokenService::Consumer  {
- public:
-  class Delegate {
-   public:
-    // The identity provider used to get OAuth2 tokens.
-    virtual IdentityProvider* GetIdentityProvider() = 0;
-
-    // Returns the real PAN retrieved from Wallet. |real_pan| will be empty
-    // on failure.
-    virtual void OnDidGetRealPan(AutofillClient::GetRealPanResult result,
-                                 const std::string& real_pan) = 0;
-  };
-
-  // |context_getter| is reference counted so it has no lifetime or ownership
-  // requirements. |delegate| must outlive |this|. |source_url| is the url
-  // of the merchant page.
-  RealPanWalletClient(net::URLRequestContextGetter* context_getter,
-                      Delegate* delegate);
-
-  ~RealPanWalletClient() override;
-
-  // Starts fetching the OAuth2 token in anticipation of future wallet requests.
-  // Called as an optimization, but not strictly necessary.
-  void Prepare();
-
-  // The user has attempted to unmask a card with the given cvc.
-  void UnmaskCard(const CreditCard& card,
-                  const CardUnmaskDelegate::UnmaskResponse& response);
-
-  // Cancels and clears the current |request_|.
-  void CancelRequest();
-
- private:
-  // net::URLFetcherDelegate:
-  void OnURLFetchComplete(const net::URLFetcher* source) override;
-
-  // OAuth2TokenService::Consumer implementation.
-  void OnGetTokenSuccess(const OAuth2TokenService::Request* request,
-                         const std::string& access_token,
-                         const base::Time& expiration_time) override;
-  void OnGetTokenFailure(const OAuth2TokenService::Request* request,
-                         const GoogleServiceAuthError& error) override;
-
-  // Creates |request_| from |card_| and |response_|.
-  void CreateRequest();
-
-  // Initiates a new OAuth2 token request.
-  void StartTokenFetch(bool invalidate_old);
-
-  // Adds the token to |request_| and starts the request.
-  void SetOAuth2TokenAndStartRequest();
-
-  // The context for the request.
-  scoped_refptr<net::URLRequestContextGetter> context_getter_;
-
-  // Observer class that has its various On* methods called based on the results
-  // of a request to Online Wallet.
-  Delegate* const delegate_;  // must outlive |this|.
-
-  // The card and response for the latest unmask request.
-  CreditCard card_;
-  CardUnmaskDelegate::UnmaskResponse response_;
-
-  // The current Wallet request object.
-  scoped_ptr<net::URLFetcher> request_;
-
-  // The current OAuth2 token request object;
-  scoped_ptr<OAuth2TokenService::Request> access_token_request_;
-
-  // The OAuth2 token, or empty if not fetched.
-  std::string access_token_;
-
-  // True if |this| has already retried due to a 401 response from the server.
-  bool has_retried_authorization_;
-
-  base::WeakPtrFactory<RealPanWalletClient> weak_ptr_factory_;
-
-  DISALLOW_COPY_AND_ASSIGN(RealPanWalletClient);
-};
-
-}  // namespace wallet
-}  // namespace autofill
-
-#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_WALLET_REAL_PAN_WALLET_CLIENT_H_
diff --git a/components/autofill/core/common/autofill_switches.cc b/components/autofill/core/common/autofill_switches.cc
index 79e8db4..63edd24 100644
--- a/components/autofill/core/common/autofill_switches.cc
+++ b/components/autofill/core/common/autofill_switches.cc
@@ -24,6 +24,10 @@
 const char kDisableOfferStoreUnmaskedWalletCards[] =
     "disable-offer-store-unmasked-wallet-cards";
 
+// Disables offering to upload credit cards.
+const char kDisableOfferUploadCreditCards[] =
+    "disable-offer-upload-credit-cards";
+
 // Disables password generation when we detect that the user is going through
 // account creation.
 const char kDisablePasswordGeneration[]     = "disable-password-generation";
@@ -53,6 +57,9 @@
 const char kEnableOfferStoreUnmaskedWalletCards[] =
     "enable-offer-store-unmasked-wallet-cards";
 
+// Enables offering to upload credit cards.
+const char kEnableOfferUploadCreditCards[] = "enable-offer-upload-credit-cards";
+
 // Enables password generation when we detect that the user is going through
 // account creation.
 const char kEnablePasswordGeneration[]      = "enable-password-generation";
diff --git a/components/autofill/core/common/autofill_switches.h b/components/autofill/core/common/autofill_switches.h
index b4e7a35..1c34827 100644
--- a/components/autofill/core/common/autofill_switches.h
+++ b/components/autofill/core/common/autofill_switches.h
@@ -16,6 +16,7 @@
 extern const char kDisableFillOnAccountSelect[];
 extern const char kDisableFullFormAutofillIOS[];
 extern const char kDisableOfferStoreUnmaskedWalletCards[];
+extern const char kDisableOfferUploadCreditCards[];
 extern const char kDisablePasswordGeneration[];
 extern const char kDisableSingleClickAutofill[];
 extern const char kEnableCreditCardScan[];
@@ -23,6 +24,7 @@
 extern const char kEnableFillOnAccountSelectNoHighlighting[];
 extern const char kEnableFullFormAutofillIOS[];
 extern const char kEnableOfferStoreUnmaskedWalletCards[];
+extern const char kEnableOfferUploadCreditCards[];
 extern const char kEnablePasswordGeneration[];
 extern const char kEnableSingleClickAutofill[];
 extern const char kEnableSuggestionsWithSubstringMatch[];
diff --git a/components/bitmap_uploader/BUILD.gn b/components/bitmap_uploader/BUILD.gn
new file mode 100644
index 0000000..75198b5
--- /dev/null
+++ b/components/bitmap_uploader/BUILD.gn
@@ -0,0 +1,21 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+source_set("bitmap_uploader") {
+  sources = [
+    "bitmap_uploader.cc",
+    "bitmap_uploader.h",
+  ]
+
+  defines = [ "GL_GLEXT_PROTOTYPES" ]
+
+  deps = [
+    "//base",
+    "//components/mus/public/interfaces",
+    "//components/mus/public/cpp",
+    "//gpu",
+    "//mojo/converters/surfaces",
+    "//third_party/mojo/src/mojo/public/c/gles2",
+  ]
+}
diff --git a/components/bitmap_uploader/DEPS b/components/bitmap_uploader/DEPS
new file mode 100644
index 0000000..8a0ec23
--- /dev/null
+++ b/components/bitmap_uploader/DEPS
@@ -0,0 +1,11 @@
+include_rules = [
+  "+components/mus/public",
+  "+gpu/GLES2",
+  "+mojo/application/public",
+  "+mojo/common",
+  "+mojo/converters/geometry",
+  "+mojo/converters/surfaces",
+  "+mojo/public",
+  "+mojo/services/network/public/interfaces",
+  "+ui/gfx/geometry",
+]
diff --git a/components/bitmap_uploader/OWNERS b/components/bitmap_uploader/OWNERS
new file mode 100644
index 0000000..bb698f3
--- /dev/null
+++ b/components/bitmap_uploader/OWNERS
@@ -0,0 +1,11 @@
+ben@chromium.org
+erg@chromium.org
+fsamuel@chromium.org
+jam@chromium.org
+jochen@chromium.org
+msw@chromium.org
+penghuang@chromium.org
+rjkroege@chromium.org
+sadrul@chromium.org
+sky@chromium.org
+yzshen@chromium.org
diff --git a/components/bitmap_uploader/bitmap_uploader.cc b/components/bitmap_uploader/bitmap_uploader.cc
new file mode 100644
index 0000000..f6525da
--- /dev/null
+++ b/components/bitmap_uploader/bitmap_uploader.cc
@@ -0,0 +1,257 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/bitmap_uploader/bitmap_uploader.h"
+
+#include "base/bind.h"
+#include "base/callback.h"
+#include "components/mus/public/cpp/window.h"
+#include "components/mus/public/cpp/window_surface.h"
+#include "mojo/application/public/cpp/connect.h"
+#include "mojo/application/public/interfaces/shell.mojom.h"
+#include "mojo/converters/geometry/geometry_type_converters.h"
+#include "mojo/converters/surfaces/surfaces_type_converters.h"
+#include "mojo/converters/surfaces/surfaces_utils.h"
+#include "mojo/public/c/gles2/gles2.h"
+#include "mojo/services/network/public/interfaces/url_loader.mojom.h"
+
+namespace bitmap_uploader {
+namespace {
+
+const uint32_t g_transparent_color = 0x00000000;
+
+void LostContext(void*) {
+  DCHECK(false);
+}
+
+void OnGotContentHandlerID(uint32_t content_handler_id) {}
+
+}  // namespace
+
+BitmapUploader::BitmapUploader(mus::Window* window)
+    : window_(window),
+      color_(g_transparent_color),
+      width_(0),
+      height_(0),
+      format_(BGRA),
+      next_resource_id_(1u),
+      id_namespace_(0u),
+      local_id_(0u),
+      surface_client_binding_(this) {}
+
+BitmapUploader::~BitmapUploader() {
+  MojoGLES2DestroyContext(gles2_context_);
+}
+
+void BitmapUploader::Init(mojo::Shell* shell) {
+  surface_ = window_->RequestSurface(mus::mojom::SURFACE_TYPE_DEFAULT);
+  surface_->BindToThread();
+
+  mojo::ServiceProviderPtr gpu_service_provider;
+  mojo::URLRequestPtr request2(mojo::URLRequest::New());
+  request2->url = mojo::String::From("mojo:mus");
+  shell->ConnectToApplication(request2.Pass(),
+                              mojo::GetProxy(&gpu_service_provider), nullptr,
+                              nullptr, base::Bind(&OnGotContentHandlerID));
+  ConnectToService(gpu_service_provider.get(), &gpu_service_);
+
+  mus::mojom::CommandBufferPtr gles2_client;
+  gpu_service_->CreateOffscreenGLES2Context(GetProxy(&gles2_client));
+  gles2_context_ = MojoGLES2CreateContext(
+      gles2_client.PassInterface().PassHandle().release().value(),
+      nullptr,
+      &LostContext, NULL, mojo::Environment::GetDefaultAsyncWaiter());
+  MojoGLES2MakeCurrent(gles2_context_);
+}
+
+// Sets the color which is RGBA.
+void BitmapUploader::SetColor(uint32_t color) {
+  if (color_ == color)
+    return;
+  color_ = color;
+  if (surface_)
+    Upload();
+}
+
+// Sets a bitmap.
+void BitmapUploader::SetBitmap(int width,
+                               int height,
+                               scoped_ptr<std::vector<unsigned char>> data,
+                               Format format) {
+  width_ = width;
+  height_ = height;
+  bitmap_ = data.Pass();
+  format_ = format;
+  if (surface_)
+    Upload();
+}
+
+void BitmapUploader::Upload() {
+  const gfx::Rect bounds(window_->bounds());
+  mus::mojom::PassPtr pass = mojo::CreateDefaultPass(1, bounds);
+  mus::mojom::CompositorFramePtr frame = mus::mojom::CompositorFrame::New();
+
+  // TODO(rjkroege): Support device scale factor in PDF viewer
+  mus::mojom::CompositorFrameMetadataPtr meta =
+      mus::mojom::CompositorFrameMetadata::New();
+  meta->device_scale_factor = 1.0f;
+  frame->metadata = meta.Pass();
+
+  frame->resources.resize(0u);
+
+  pass->quads.resize(0u);
+  pass->shared_quad_states.push_back(
+      mojo::CreateDefaultSQS(bounds.size()));
+
+  MojoGLES2MakeCurrent(gles2_context_);
+  if (bitmap_.get()) {
+    mojo::Size bitmap_size;
+    bitmap_size.width = width_;
+    bitmap_size.height = height_;
+    GLuint texture_id = BindTextureForSize(bitmap_size);
+    glTexSubImage2D(GL_TEXTURE_2D,
+                    0,
+                    0,
+                    0,
+                    bitmap_size.width,
+                    bitmap_size.height,
+                    TextureFormat(),
+                    GL_UNSIGNED_BYTE,
+                    &((*bitmap_)[0]));
+
+    GLbyte mailbox[GL_MAILBOX_SIZE_CHROMIUM];
+    glGenMailboxCHROMIUM(mailbox);
+    glProduceTextureCHROMIUM(GL_TEXTURE_2D, mailbox);
+    gpu::SyncToken sync_token(glInsertSyncPointCHROMIUM());
+
+    mus::mojom::TransferableResourcePtr resource =
+        mus::mojom::TransferableResource::New();
+    resource->id = next_resource_id_++;
+    resource_to_texture_id_map_[resource->id] = texture_id;
+    resource->format = mus::mojom::RESOURCE_FORMAT_RGBA_8888;
+    resource->filter = GL_LINEAR;
+    resource->size = bitmap_size.Clone();
+    mus::mojom::MailboxHolderPtr mailbox_holder =
+        mus::mojom::MailboxHolder::New();
+    mailbox_holder->mailbox = mus::mojom::Mailbox::New();
+    for (int i = 0; i < GL_MAILBOX_SIZE_CHROMIUM; ++i)
+      mailbox_holder->mailbox->name.push_back(mailbox[i]);
+    mailbox_holder->texture_target = GL_TEXTURE_2D;
+    mailbox_holder->sync_token =
+        mus::mojom::SyncToken::From<gpu::SyncToken>(sync_token);
+    resource->mailbox_holder = mailbox_holder.Pass();
+    resource->is_repeated = false;
+    resource->is_software = false;
+
+    mus::mojom::QuadPtr quad = mus::mojom::Quad::New();
+    quad->material = mus::mojom::MATERIAL_TEXTURE_CONTENT;
+
+    mojo::RectPtr rect = mojo::Rect::New();
+    if (width_ <= bounds.width() && height_ <= bounds.height()) {
+      rect->width = width_;
+      rect->height = height_;
+    } else {
+      // The source bitmap is larger than the viewport. Resize it while
+      // maintaining the aspect ratio.
+      float width_ratio = static_cast<float>(width_) / bounds.width();
+      float height_ratio = static_cast<float>(height_) / bounds.height();
+      if (width_ratio > height_ratio) {
+        rect->width = bounds.width();
+        rect->height = height_ / width_ratio;
+      } else {
+        rect->height = bounds.height();
+        rect->width = width_ / height_ratio;
+      }
+    }
+    quad->rect = rect.Clone();
+    quad->opaque_rect = rect.Clone();
+    quad->visible_rect = rect.Clone();
+    quad->needs_blending = true;
+    quad->shared_quad_state_index = 0u;
+
+    mus::mojom::TextureQuadStatePtr texture_state =
+        mus::mojom::TextureQuadState::New();
+    texture_state->resource_id = resource->id;
+    texture_state->premultiplied_alpha = true;
+    texture_state->uv_top_left = mojo::PointF::New();
+    texture_state->uv_bottom_right = mojo::PointF::New();
+    texture_state->uv_bottom_right->x = 1.f;
+    texture_state->uv_bottom_right->y = 1.f;
+    texture_state->background_color = mus::mojom::Color::New();
+    texture_state->background_color->rgba = g_transparent_color;
+    for (int i = 0; i < 4; ++i)
+      texture_state->vertex_opacity.push_back(1.f);
+    texture_state->y_flipped = false;
+
+    frame->resources.push_back(resource.Pass());
+    quad->texture_quad_state = texture_state.Pass();
+    pass->quads.push_back(quad.Pass());
+  }
+
+  if (color_ != g_transparent_color) {
+    mus::mojom::QuadPtr quad = mus::mojom::Quad::New();
+    quad->material = mus::mojom::MATERIAL_SOLID_COLOR;
+    quad->rect = mojo::Rect::From(bounds);
+    quad->opaque_rect = mojo::Rect::New();
+    quad->visible_rect = mojo::Rect::From(bounds);
+    quad->needs_blending = true;
+    quad->shared_quad_state_index = 0u;
+
+    mus::mojom::SolidColorQuadStatePtr color_state =
+        mus::mojom::SolidColorQuadState::New();
+    color_state->color = mus::mojom::Color::New();
+    color_state->color->rgba = color_;
+    color_state->force_anti_aliasing_off = false;
+
+    quad->solid_color_quad_state = color_state.Pass();
+    pass->quads.push_back(quad.Pass());
+  }
+
+  frame->passes.push_back(pass.Pass());
+
+  // TODO(rjkroege, fsamuel): We should throttle frames.
+  surface_->SubmitCompositorFrame(frame.Pass(), mojo::Closure());
+}
+
+uint32_t BitmapUploader::BindTextureForSize(const mojo::Size size) {
+  // TODO(jamesr): Recycle textures.
+  GLuint texture = 0u;
+  glGenTextures(1, &texture);
+  glBindTexture(GL_TEXTURE_2D, texture);
+  glTexImage2D(GL_TEXTURE_2D,
+                0,
+                TextureFormat(),
+                size.width,
+                size.height,
+                0,
+                TextureFormat(),
+                GL_UNSIGNED_BYTE,
+                0);
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+  return texture;
+}
+
+void BitmapUploader::SetIdNamespace(uint32_t id_namespace) {
+  id_namespace_ = id_namespace;
+  if (color_ != g_transparent_color || bitmap_.get())
+    Upload();
+}
+
+void BitmapUploader::ReturnResources(
+    mojo::Array<mus::mojom::ReturnedResourcePtr> resources) {
+  MojoGLES2MakeCurrent(gles2_context_);
+  // TODO(jamesr): Recycle.
+  for (size_t i = 0; i < resources.size(); ++i) {
+    mus::mojom::ReturnedResourcePtr resource = resources[i].Pass();
+    DCHECK_EQ(1, resource->count);
+    glWaitSyncTokenCHROMIUM(
+        resource->sync_token.To<gpu::SyncToken>().GetConstData());
+    uint32_t texture_id = resource_to_texture_id_map_[resource->id];
+    DCHECK_NE(0u, texture_id);
+    resource_to_texture_id_map_.erase(resource->id);
+    glDeleteTextures(1, &texture_id);
+  }
+}
+
+}  // namespace bitmap_uploader
diff --git a/components/bitmap_uploader/bitmap_uploader.h b/components/bitmap_uploader/bitmap_uploader.h
new file mode 100644
index 0000000..ccb4d7a7
--- /dev/null
+++ b/components/bitmap_uploader/bitmap_uploader.h
@@ -0,0 +1,83 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_BITMAP_UPLOADER_BITMAP_UPLOADER_H_
+#define COMPONENTS_BITMAP_UPLOADER_BITMAP_UPLOADER_H_
+
+#include "base/containers/hash_tables.h"
+#include "base/macros.h"
+#include "components/mus/public/cpp/window_surface.h"
+#include "components/mus/public/interfaces/compositor_frame.mojom.h"
+#include "components/mus/public/interfaces/gpu.mojom.h"
+#include "gpu/GLES2/gl2chromium.h"
+#include "gpu/GLES2/gl2extchromium.h"
+#include "mojo/public/c/gles2/gles2.h"
+
+namespace mojo {
+class Shell;
+}
+
+namespace bitmap_uploader {
+
+// BitmapUploader is useful if you want to draw a bitmap or color in a
+// mus::Window.
+class BitmapUploader : public mus::mojom::SurfaceClient {
+ public:
+  explicit BitmapUploader(mus::Window* window);
+  ~BitmapUploader() override;
+
+  void Init(mojo::Shell* shell);
+
+  // Sets the color which is RGBA.
+  void SetColor(uint32_t color);
+
+  enum Format {
+    RGBA,  // Pixel layout on Android.
+    BGRA,  // Pixel layout everywhere else.
+  };
+
+  // Sets a bitmap.
+  void SetBitmap(int width,
+                 int height,
+                 scoped_ptr<std::vector<unsigned char>> data,
+                 Format format);
+
+ private:
+  void Upload();
+
+  uint32_t BindTextureForSize(const mojo::Size size);
+
+  uint32_t TextureFormat() const {
+    return format_ == BGRA ? GL_BGRA_EXT : GL_RGBA;
+  }
+
+  void SetIdNamespace(uint32_t id_namespace);
+
+  // SurfaceClient implementation.
+  void ReturnResources(
+      mojo::Array<mus::mojom::ReturnedResourcePtr> resources) override;
+
+  mus::Window* window_;
+  mus::mojom::GpuPtr gpu_service_;
+  scoped_ptr<mus::WindowSurface> surface_;
+  MojoGLES2Context gles2_context_;
+
+  mojo::Size size_;
+  uint32_t color_;
+  int width_;
+  int height_;
+  Format format_;
+  scoped_ptr<std::vector<unsigned char>> bitmap_;
+  uint32_t next_resource_id_;
+  uint32_t id_namespace_;
+  uint32_t local_id_;
+  base::hash_map<uint32_t, uint32_t> resource_to_texture_id_map_;
+  mojo::Binding<mus::mojom::SurfaceClient> surface_client_binding_;
+
+  DISALLOW_COPY_AND_ASSIGN(BitmapUploader);
+};
+
+}  // namespace bitmap_uploader
+
+#endif  // COMPONENTS_BITMAP_UPLOADER_BITMAP_UPLAODER_H_
diff --git a/components/components_tests.gyp b/components/components_tests.gyp
index f9975f03..437bf940 100644
--- a/components/components_tests.gyp
+++ b/components/components_tests.gyp
@@ -19,8 +19,8 @@
       'autofill/content/browser/content_autofill_driver_unittest.cc',
       'autofill/content/browser/request_autocomplete_manager_unittest.cc',
       'autofill/content/browser/wallet/full_wallet_unittest.cc',
-      'autofill/content/browser/wallet/real_pan_wallet_client_unittest.cc',
       'autofill/content/browser/wallet/wallet_address_unittest.cc',
+      'autofill/content/browser/wallet/payments_client_unittest.cc',
       'autofill/content/browser/wallet/wallet_service_url_unittest.cc',
       'autofill/content/renderer/renderer_save_password_progress_logger_unittest.cc',
       'autofill/core/browser/address_field_unittest.cc',
@@ -650,6 +650,9 @@
     'ssl_config_unittest_sources': [
       'ssl_config/ssl_config_service_manager_pref_unittest.cc',
     ],
+    'ssl_errors_unittest_sources': [
+      'ssl_errors/error_classification_unittest.cc'
+    ],
     'storage_monitor_unittest_sources': [
       'storage_monitor/image_capture_device_manager_unittest.mm',
       'storage_monitor/media_storage_util_unittest.cc',
@@ -900,6 +903,7 @@
         '<@(sessions_unittest_sources)',
         '<@(signin_unittest_sources)',
         '<@(ssl_config_unittest_sources)',
+        '<@(ssl_errors_unittest_sources)',
         '<@(suggestions_unittest_sources)',
         '<@(sync_bookmarks_unittest_sources)',
         '<@(sync_driver_unittest_sources)',
@@ -1025,6 +1029,7 @@
         'components.gyp:signin_core_browser',
         'components.gyp:signin_core_browser_test_support',
         'components.gyp:ssl_config',
+        'components.gyp:ssl_errors',
         'components.gyp:suggestions',
         'components.gyp:sync_bookmarks',
         'components.gyp:sync_driver_test_support',
diff --git a/components/content_settings.gypi b/components/content_settings.gypi
index f6ac047..fdca4ba 100644
--- a/components/content_settings.gypi
+++ b/components/content_settings.gypi
@@ -68,9 +68,6 @@
             'content_settings/core/browser/plugins_field_trial.cc',
             'content_settings/core/browser/plugins_field_trial.h',
           ],
-          'dependencies': [
-            'plugins_common',
-          ],
         }],
       ],
       # TODO(jschuh): crbug.com/167187 fix size_t to int truncations.
diff --git a/components/content_settings/core/browser/BUILD.gn b/components/content_settings/core/browser/BUILD.gn
index 5898a00..6cf81ef 100644
--- a/components/content_settings/core/browser/BUILD.gn
+++ b/components/content_settings/core/browser/BUILD.gn
@@ -64,10 +64,6 @@
     "//url",
   ]
 
-  if (enable_plugins) {
-    deps += [ "//components/plugins/common" ]
-  }
-
   configs += [ "//build/config/compiler:no_size_t_to_int_warning" ]
 }
 
@@ -94,7 +90,6 @@
     "//base/test:test_support",
     "//components/content_settings/core/common",
     "//components/content_settings/core/test:test_support",
-    "//components/plugins/common",
     "//components/pref_registry:test_support",
     "//testing/gtest",
     "//url",
diff --git a/components/content_settings/core/browser/DEPS b/components/content_settings/core/browser/DEPS
index 106fea22..485e8ed 100644
--- a/components/content_settings/core/browser/DEPS
+++ b/components/content_settings/core/browser/DEPS
@@ -2,7 +2,6 @@
   "+components/content_settings/core/common",
   "+components/content_settings/core/test",
   "+components/keyed_service/core",
-  "+components/plugins/common",
   "+components/pref_registry",
   "+components/url_formatter",
   "+net/base",
diff --git a/components/content_settings/core/browser/website_settings_registry.cc b/components/content_settings/core/browser/website_settings_registry.cc
index f0e9e15..cf237501 100644
--- a/components/content_settings/core/browser/website_settings_registry.cc
+++ b/components/content_settings/core/browser/website_settings_registry.cc
@@ -88,6 +88,8 @@
            WebsiteSettingsInfo::UNSYNCABLE, WebsiteSettingsInfo::LOSSY);
   Register(CONTENT_SETTINGS_TYPE_SITE_ENGAGEMENT, "site-engagement", nullptr,
            WebsiteSettingsInfo::UNSYNCABLE, WebsiteSettingsInfo::LOSSY);
+  Register(CONTENT_SETTINGS_TYPE_USB_CHOOSER_DATA, "usb-chooser-data", nullptr,
+           WebsiteSettingsInfo::UNSYNCABLE, WebsiteSettingsInfo::NOT_LOSSY);
 }
 
 }  // namespace content_settings
diff --git a/components/content_settings/core/common/content_settings_types.h b/components/content_settings/core/common/content_settings_types.h
index 0bda5bf3..fe062eb 100644
--- a/components/content_settings/core/common/content_settings_types.h
+++ b/components/content_settings/core/common/content_settings_types.h
@@ -44,6 +44,7 @@
   CONTENT_SETTINGS_TYPE_APP_BANNER,
   CONTENT_SETTINGS_TYPE_SITE_ENGAGEMENT,
   CONTENT_SETTINGS_TYPE_DURABLE_STORAGE,
+  CONTENT_SETTINGS_TYPE_USB_CHOOSER_DATA,
 
   // WARNING: This enum is going to be removed soon. Do not depend on NUM_TYPES.
   CONTENT_SETTINGS_NUM_TYPES_DO_NOT_USE,
diff --git a/components/crash/content/app/crashpad_mac.mm b/components/crash/content/app/crashpad_mac.mm
index a058594f..bee4aad 100644
--- a/components/crash/content/app/crashpad_mac.mm
+++ b/components/crash/content/app/crashpad_mac.mm
@@ -152,7 +152,8 @@
                                                  database_path,
                                                  url,
                                                  process_annotations,
-                                                 arguments);
+                                                 arguments,
+                                                 false);
       if (result) {
         result = crashpad_client.UseHandler();
       }
diff --git a/components/data_usage.gypi b/components/data_usage.gypi
index 8151539..ba77b57 100644
--- a/components/data_usage.gypi
+++ b/components/data_usage.gypi
@@ -16,6 +16,7 @@
         'data_usage/core/data_use.h',
         'data_usage/core/data_use_aggregator.cc',
         'data_usage/core/data_use_aggregator.h',
+        'data_usage/core/data_use_annotator.h',
       ]
     },
   ]
diff --git a/components/data_usage/core/BUILD.gn b/components/data_usage/core/BUILD.gn
index 963e9e95..06e19b9 100644
--- a/components/data_usage/core/BUILD.gn
+++ b/components/data_usage/core/BUILD.gn
@@ -8,6 +8,7 @@
     "data_use.h",
     "data_use_aggregator.cc",
     "data_use_aggregator.h",
+    "data_use_annotator.h",
   ]
   deps = [
     "//base",
diff --git a/components/data_usage/core/data_use.cc b/components/data_usage/core/data_use.cc
index 94daab76..f073dba 100644
--- a/components/data_usage/core/data_use.cc
+++ b/components/data_usage/core/data_use.cc
@@ -6,6 +6,21 @@
 
 namespace data_usage {
 
+namespace {
+
+bool AreNonByteCountFieldsEqual(const DataUse& a, const DataUse& b) {
+  return a.url == b.url && a.request_start == b.request_start &&
+         a.first_party_for_cookies == b.first_party_for_cookies &&
+         a.tab_id == b.tab_id && a.connection_type == b.connection_type &&
+         a.mcc_mnc == b.mcc_mnc;
+}
+
+bool AreByteCountFieldsEqual(const DataUse& a, const DataUse& b) {
+  return a.tx_bytes == b.tx_bytes && a.rx_bytes == b.rx_bytes;
+}
+
+}  // namespace
+
 DataUse::DataUse(const GURL& url,
                  const base::TimeTicks& request_start,
                  const GURL& first_party_for_cookies,
@@ -25,11 +40,13 @@
 
 DataUse::~DataUse() {}
 
+bool DataUse::operator==(const DataUse& other) const {
+  return AreNonByteCountFieldsEqual(*this, other) &&
+         AreByteCountFieldsEqual(*this, other);
+}
+
 bool DataUse::CanCombineWith(const DataUse& other) const {
-  return url == other.url && request_start == other.request_start &&
-         first_party_for_cookies == other.first_party_for_cookies &&
-         tab_id == other.tab_id && connection_type == other.connection_type &&
-         mcc_mnc == other.mcc_mnc;
+  return AreNonByteCountFieldsEqual(*this, other);
 }
 
 }  // namespace data_usage
diff --git a/components/data_usage/core/data_use.h b/components/data_usage/core/data_use.h
index ac005b3..e04d04cd 100644
--- a/components/data_usage/core/data_use.h
+++ b/components/data_usage/core/data_use.h
@@ -27,6 +27,8 @@
 
   ~DataUse();
 
+  bool operator==(const DataUse& other) const;
+
   // Returns true if |this| and |other| are identical except for byte counts.
   bool CanCombineWith(const DataUse& other) const;
 
diff --git a/components/data_usage/core/data_use_aggregator.cc b/components/data_usage/core/data_use_aggregator.cc
index 792510b..091a9008 100644
--- a/components/data_usage/core/data_use_aggregator.cc
+++ b/components/data_usage/core/data_use_aggregator.cc
@@ -5,11 +5,13 @@
 #include "components/data_usage/core/data_use_aggregator.h"
 
 #include "base/bind.h"
+#include "base/callback.h"
 #include "base/memory/scoped_ptr.h"
 #include "base/message_loop/message_loop.h"
 #include "base/single_thread_task_runner.h"
 #include "base/stl_util.h"
 #include "components/data_usage/core/data_use.h"
+#include "components/data_usage/core/data_use_annotator.h"
 #include "net/base/load_timing_info.h"
 #include "net/base/network_change_notifier.h"
 #include "net/url_request/url_request.h"
@@ -20,8 +22,9 @@
 
 namespace data_usage {
 
-DataUseAggregator::DataUseAggregator()
-    : connection_type_(net::NetworkChangeNotifier::GetConnectionType()),
+DataUseAggregator::DataUseAggregator(scoped_ptr<DataUseAnnotator> annotator)
+    : annotator_(annotator.Pass()),
+      connection_type_(net::NetworkChangeNotifier::GetConnectionType()),
       off_the_record_tx_bytes_since_last_flush_(0),
       off_the_record_rx_bytes_since_last_flush_(0),
       is_flush_pending_(false),
@@ -46,39 +49,27 @@
   observer_list_.RemoveObserver(observer);
 }
 
-void DataUseAggregator::ReportDataUse(const net::URLRequest& request,
-                                      int32_t tab_id,
+void DataUseAggregator::ReportDataUse(net::URLRequest* request,
                                       int64_t tx_bytes,
                                       int64_t rx_bytes) {
   DCHECK(thread_checker_.CalledOnValidThread());
+
   net::LoadTimingInfo load_timing_info;
-  request.GetLoadTimingInfo(&load_timing_info);
+  request->GetLoadTimingInfo(&load_timing_info);
 
   scoped_ptr<DataUse> data_use(
-      new DataUse(request.url(), load_timing_info.request_start,
-                  request.first_party_for_cookies(), tab_id, connection_type_,
-                  mcc_mnc_, tx_bytes, rx_bytes));
+      new DataUse(request->url(), load_timing_info.request_start,
+                  request->first_party_for_cookies(), -1 /* tab_id */,
+                  connection_type_, mcc_mnc_, tx_bytes, rx_bytes));
 
-  // As an optimization, attempt to combine the newly reported data use with the
-  // most recent buffered data use, if the annotations on the data use are the
-  // same.
-  if (!buffered_data_use_.empty() &&
-      buffered_data_use_.back()->CanCombineWith(*data_use)) {
-    buffered_data_use_.back()->tx_bytes += tx_bytes;
-    buffered_data_use_.back()->rx_bytes += rx_bytes;
-  } else {
-    buffered_data_use_.push_back(data_use.Pass());
+  if (!annotator_) {
+    AppendDataUse(data_use.Pass());
+    return;
   }
 
-  if (!is_flush_pending_) {
-    // Post a flush operation to happen in the future, so that the
-    // DataUseAggregator has a chance to batch together some data use before
-    // notifying observers.
-    base::MessageLoop::current()->task_runner()->PostTask(
-        FROM_HERE,
-        base::Bind(&DataUseAggregator::FlushBufferedDataUse, GetWeakPtr()));
-    is_flush_pending_ = true;
-  }
+  annotator_->Annotate(
+      request, data_use.Pass(),
+      base::Bind(&DataUseAggregator::AppendDataUse, GetWeakPtr()));
 }
 
 void DataUseAggregator::ReportOffTheRecordDataUse(int64_t tx_bytes,
@@ -89,6 +80,7 @@
 }
 
 base::WeakPtr<DataUseAggregator> DataUseAggregator::GetWeakPtr() {
+  DCHECK(thread_checker_.CalledOnValidThread());
   return weak_ptr_factory_.GetWeakPtr();
 }
 
@@ -107,6 +99,32 @@
   mcc_mnc_ = mcc_mnc;
 }
 
+void DataUseAggregator::AppendDataUse(scoped_ptr<DataUse> data_use) {
+  DCHECK(thread_checker_.CalledOnValidThread());
+  DCHECK(data_use);
+
+  // As an optimization, attempt to combine the newly reported data use with the
+  // most recent buffered data use, if the annotations on the data use are the
+  // same.
+  if (!buffered_data_use_.empty() &&
+      buffered_data_use_.back()->CanCombineWith(*data_use)) {
+    buffered_data_use_.back()->tx_bytes += data_use->tx_bytes;
+    buffered_data_use_.back()->rx_bytes += data_use->rx_bytes;
+  } else {
+    buffered_data_use_.push_back(data_use.Pass());
+  }
+
+  if (!is_flush_pending_) {
+    // Post a flush operation to happen in the future, so that the
+    // DataUseAggregator has a chance to batch together some data use before
+    // notifying observers.
+    base::MessageLoop::current()->task_runner()->PostTask(
+        FROM_HERE,
+        base::Bind(&DataUseAggregator::FlushBufferedDataUse, GetWeakPtr()));
+    is_flush_pending_ = true;
+  }
+}
+
 void DataUseAggregator::FlushBufferedDataUse() {
   DCHECK(thread_checker_.CalledOnValidThread());
 
diff --git a/components/data_usage/core/data_use_aggregator.h b/components/data_usage/core/data_use_aggregator.h
index b10f9459..36d8ef09 100644
--- a/components/data_usage/core/data_use_aggregator.h
+++ b/components/data_usage/core/data_use_aggregator.h
@@ -11,6 +11,7 @@
 #include <vector>
 
 #include "base/macros.h"
+#include "base/memory/scoped_ptr.h"
 #include "base/memory/scoped_vector.h"
 #include "base/memory/weak_ptr.h"
 #include "base/observer_list.h"
@@ -22,6 +23,8 @@
 }
 
 namespace data_usage {
+
+class DataUseAnnotator;
 struct DataUse;
 
 // Class that collects and aggregates network usage, reporting the usage to
@@ -38,15 +41,16 @@
         const std::vector<const DataUse*>& data_use_sequence) = 0;
   };
 
-  DataUseAggregator();
+  // Constructs a new DataUseAggregator with the given |annotator|. A NULL
+  // annotator will be treated as a no-op annotator.
+  explicit DataUseAggregator(scoped_ptr<DataUseAnnotator> annotator);
   ~DataUseAggregator() override;
 
   void AddObserver(Observer* observer);
   void RemoveObserver(Observer* observer);
 
   // Virtual for testing.
-  virtual void ReportDataUse(const net::URLRequest& request,
-                             int32_t tab_id,
+  virtual void ReportDataUse(net::URLRequest* request,
                              int64_t tx_bytes,
                              int64_t rx_bytes);
 
@@ -69,10 +73,15 @@
   void SetMccMncForTests(const std::string& mcc_mnc);
 
  private:
+  // Appends |data_use| to the buffer of unreported data use and prepares to
+  // notify observers.
+  void AppendDataUse(scoped_ptr<DataUse> data_use);
+
   // Flush any buffered data use and notify observers.
   void FlushBufferedDataUse();
 
   base::ThreadChecker thread_checker_;
+  scoped_ptr<DataUseAnnotator> annotator_;
   base::ObserverList<Observer> observer_list_;
 
   // Buffer of unreported data use.
diff --git a/components/data_usage/core/data_use_aggregator_unittest.cc b/components/data_usage/core/data_use_aggregator_unittest.cc
index fcd5b262..f0d5f44 100644
--- a/components/data_usage/core/data_use_aggregator_unittest.cc
+++ b/components/data_usage/core/data_use_aggregator_unittest.cc
@@ -10,9 +10,12 @@
 #include <string>
 #include <vector>
 
+#include "base/callback.h"
 #include "base/memory/scoped_ptr.h"
 #include "base/message_loop/message_loop.h"
+#include "base/time/time.h"
 #include "components/data_usage/core/data_use.h"
+#include "components/data_usage/core/data_use_annotator.h"
 #include "net/base/load_timing_info.h"
 #include "net/base/network_change_notifier.h"
 #include "net/base/network_delegate_impl.h"
@@ -26,8 +29,20 @@
 
 namespace {
 
+base::TimeTicks GetRequestStart(const net::URLRequest& request) {
+  net::LoadTimingInfo load_timing_info;
+  request.GetLoadTimingInfo(&load_timing_info);
+  return load_timing_info.request_start;
+}
+
 // Test class that can set the network operator's MCCMNC.
 class TestDataUseAggregator : public DataUseAggregator {
+ public:
+  TestDataUseAggregator(scoped_ptr<DataUseAnnotator> annotator)
+      : DataUseAggregator(annotator.Pass()) {}
+
+  ~TestDataUseAggregator() override {}
+
  private:
   friend class TestNetworkChangeNotifier;
   using DataUseAggregator::OnConnectionTypeChanged;
@@ -64,6 +79,29 @@
   DISALLOW_COPY_AND_ASSIGN(TestNetworkChangeNotifier);
 };
 
+// A fake DataUseAnnotator that sets the tab ID of DataUse objects to a
+// predetermined fake tab ID.
+class FakeDataUseAnnotator : public DataUseAnnotator {
+ public:
+  FakeDataUseAnnotator() : tab_id_(-1) {}
+  ~FakeDataUseAnnotator() override {}
+
+  void Annotate(
+      net::URLRequest* request,
+      scoped_ptr<DataUse> data_use,
+      const base::Callback<void(scoped_ptr<DataUse>)>& callback) override {
+    data_use->tab_id = tab_id_;
+    callback.Run(data_use.Pass());
+  }
+
+  void set_tab_id(int32_t tab_id) { tab_id_ = tab_id; }
+
+ private:
+  int32_t tab_id_;
+
+  DISALLOW_COPY_AND_ASSIGN(FakeDataUseAnnotator);
+};
+
 // A network delegate that reports all received and sent network bytes to a
 // DataUseAggregator.
 class ReportingNetworkDelegate : public net::NetworkDelegateImpl {
@@ -88,8 +126,10 @@
 
   ReportingNetworkDelegate(
       TestDataUseAggregator* data_use_aggregator,
+      FakeDataUseAnnotator* fake_data_use_annotator,
       TestNetworkChangeNotifier* test_network_change_notifier)
       : data_use_aggregator_(data_use_aggregator),
+        fake_data_use_annotator_(fake_data_use_annotator),
         test_network_change_notifier_(test_network_change_notifier) {}
 
   ~ReportingNetworkDelegate() override {}
@@ -99,7 +139,7 @@
   }
 
  private:
-  DataUseContext UpdateDataUseContext(const net::URLRequest& request) {
+  void UpdateDataUseContext(const net::URLRequest& request) {
     DataUseContextMap::const_iterator data_use_context_it =
         data_use_context_map_.find(&request);
     DataUseContext data_use_context =
@@ -107,29 +147,30 @@
             ? DataUseContext()
             : data_use_context_it->second;
 
+    fake_data_use_annotator_->set_tab_id(data_use_context.tab_id);
+
     if (test_network_change_notifier_->GetCurrentConnectionType() !=
         data_use_context.connection_type) {
       test_network_change_notifier_->SimulateNetworkConnectionChange(
           data_use_context.connection_type, data_use_context.mcc_mnc);
     }
-    return data_use_context;
   }
 
-  void OnNetworkBytesReceived(const net::URLRequest& request,
+  void OnNetworkBytesReceived(net::URLRequest* request,
                               int64_t bytes_received) override {
-    DataUseContext data_use_context = UpdateDataUseContext(request);
-    data_use_aggregator_->ReportDataUse(request, data_use_context.tab_id,
-                                        0 /* tx_bytes */, bytes_received);
+    UpdateDataUseContext(*request);
+    data_use_aggregator_->ReportDataUse(request, 0 /* tx_bytes */,
+                                        bytes_received);
   }
 
-  void OnNetworkBytesSent(const net::URLRequest& request,
+  void OnNetworkBytesSent(net::URLRequest* request,
                           int64_t bytes_sent) override {
-    DataUseContext data_use_context = UpdateDataUseContext(request);
-    data_use_aggregator_->ReportDataUse(request, data_use_context.tab_id,
-                                        bytes_sent, 0 /* rx_bytes */);
+    UpdateDataUseContext(*request);
+    data_use_aggregator_->ReportDataUse(request, bytes_sent, 0 /* rx_bytes */);
   }
 
   TestDataUseAggregator* data_use_aggregator_;
+  FakeDataUseAnnotator* fake_data_use_annotator_;
   TestNetworkChangeNotifier* test_network_change_notifier_;
   DataUseContextMap data_use_context_map_;
 
@@ -171,8 +212,12 @@
 class DataUseAggregatorTest : public testing::Test {
  public:
   DataUseAggregatorTest()
-      : test_network_change_notifier_(&data_use_aggregator_),
+      : fake_data_use_annotator_(new FakeDataUseAnnotator()),
+        data_use_aggregator_(
+            scoped_ptr<DataUseAnnotator>(fake_data_use_annotator_)),
+        test_network_change_notifier_(&data_use_aggregator_),
         reporting_network_delegate_(&data_use_aggregator_,
+                                    fake_data_use_annotator_,
                                     &test_network_change_notifier_),
         context_(true),
         test_observer_(&data_use_aggregator_) {
@@ -229,6 +274,8 @@
 
  private:
   base::MessageLoopForIO loop_;
+  // Weak, owned by |data_use_aggregator_|.
+  FakeDataUseAnnotator* fake_data_use_annotator_;
   TestDataUseAggregator data_use_aggregator_;
   TestNetworkChangeNotifier test_network_change_notifier_;
   net::MockClientSocketFactory mock_socket_factory_;
@@ -262,10 +309,7 @@
   int64_t observed_foo_tx_bytes = 0, observed_foo_rx_bytes = 0;
   while (data_use_it != test_observer()->observed_data_use().end() &&
          data_use_it->url == GURL("http://foo.com")) {
-    net::LoadTimingInfo foo_load_timing_info;
-    foo_request->GetLoadTimingInfo(&foo_load_timing_info);
-
-    EXPECT_EQ(foo_load_timing_info.request_start, data_use_it->request_start);
+    EXPECT_EQ(GetRequestStart(*foo_request), data_use_it->request_start);
     EXPECT_EQ(GURL("http://foofirstparty.com"),
               data_use_it->first_party_for_cookies);
     EXPECT_EQ(kFooTabId, data_use_it->tab_id);
@@ -282,11 +326,8 @@
   // Then, the |bar_request| data use should have happened.
   int64_t observed_bar_tx_bytes = 0, observed_bar_rx_bytes = 0;
   while (data_use_it != test_observer()->observed_data_use().end()) {
-    net::LoadTimingInfo bar_load_timing_info;
-    bar_request->GetLoadTimingInfo(&bar_load_timing_info);
-
     EXPECT_EQ(GURL("http://bar.com"), data_use_it->url);
-    EXPECT_EQ(bar_load_timing_info.request_start, data_use_it->request_start);
+    EXPECT_EQ(GetRequestStart(*bar_request), data_use_it->request_start);
     EXPECT_EQ(GURL("http://barfirstparty.com"),
               data_use_it->first_party_for_cookies);
     EXPECT_EQ(kBarTabId, data_use_it->tab_id);
@@ -367,9 +408,7 @@
   // DataUse element.
   const DataUse& foo_data_use = test_observer()->observed_data_use().front();
   EXPECT_EQ(GURL("http://foo.com"), foo_data_use.url);
-  net::LoadTimingInfo foo_load_timing_info;
-  foo_request->GetLoadTimingInfo(&foo_load_timing_info);
-  EXPECT_EQ(foo_load_timing_info.request_start, foo_data_use.request_start);
+  EXPECT_EQ(GetRequestStart(*foo_request), foo_data_use.request_start);
   EXPECT_EQ(GURL("http://foofirstparty.com"),
             foo_data_use.first_party_for_cookies);
   EXPECT_EQ(kFooTabId, foo_data_use.tab_id);
@@ -382,9 +421,7 @@
   // DataUse element.
   const DataUse& bar_data_use = test_observer()->observed_data_use().back();
   EXPECT_EQ(GURL("http://bar.com"), bar_data_use.url);
-  net::LoadTimingInfo bar_load_timing_info;
-  bar_request->GetLoadTimingInfo(&bar_load_timing_info);
-  EXPECT_EQ(bar_load_timing_info.request_start, bar_data_use.request_start);
+  EXPECT_EQ(GetRequestStart(*bar_request), bar_data_use.request_start);
   EXPECT_EQ(GURL("http://barfirstparty.com"),
             bar_data_use.first_party_for_cookies);
   EXPECT_EQ(kBarTabId, bar_data_use.tab_id);
diff --git a/components/data_usage/core/data_use_annotator.h b/components/data_usage/core/data_use_annotator.h
new file mode 100644
index 0000000..5e1a031
--- /dev/null
+++ b/components/data_usage/core/data_use_annotator.h
@@ -0,0 +1,38 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_DATA_USAGE_CORE_DATA_USE_ANNOTATOR_H_
+#define COMPONENTS_DATA_USAGE_CORE_DATA_USE_ANNOTATOR_H_
+
+#include "base/callback.h"
+#include "base/memory/scoped_ptr.h"
+
+namespace net {
+class URLRequest;
+}
+
+namespace data_usage {
+
+struct DataUse;
+
+// Interface for an object that can annotate DataUse objects with additional
+// information.
+class DataUseAnnotator {
+ public:
+  typedef base::Callback<void(scoped_ptr<DataUse>)> DataUseConsumerCallback;
+
+  virtual ~DataUseAnnotator() {}
+
+  // Annotate |data_use| with additional information, possibly from |request|,
+  // before passing the annotated |data_use| to |callback|. |request| is passed
+  // in as a non-const pointer so that the DataUseAnnotator can add UserData on
+  // to the |request| if desired.
+  virtual void Annotate(net::URLRequest* request,
+                        scoped_ptr<DataUse> data_use,
+                        const DataUseConsumerCallback& callback) = 0;
+};
+
+}  // namespace data_usage
+
+#endif  // COMPONENTS_DATA_USAGE_CORE_DATA_USE_ANNOTATOR_H_
diff --git a/components/domain_reliability.gypi b/components/domain_reliability.gypi
index 4412b61..8f2f12a6 100644
--- a/components/domain_reliability.gypi
+++ b/components/domain_reliability.gypi
@@ -72,9 +72,9 @@
           # bake_in_configs.py will read the filenames out of it manually.
           'action': ['python',
                      '<(bake_in_configs_script)',
-                     '.',
-                     'domain_reliability/baked_in_configs.gypi',
-                     '<(baked_in_configs_cc)'],
+                     '--gypi-relative-to=.',
+                     '--gypi-file=domain_reliability/baked_in_configs.gypi',
+                     '--output=<(baked_in_configs_cc)'],
           'process_outputs_as_sources': 1,
           'message': 'Baking in Domain Reliability configs',
         },
diff --git a/components/domain_reliability/BUILD.gn b/components/domain_reliability/BUILD.gn
index add26b47..7b937e2e 100644
--- a/components/domain_reliability/BUILD.gn
+++ b/components/domain_reliability/BUILD.gn
@@ -14,24 +14,53 @@
                                     [ rebase_path("baked_in_configs.gypi") ],
                                     "scope",
                                     [ "baked_in_configs.gypi" ])
+
+# The config file names in the .gypi are relative to "//components".
 baked_in_configs =
-    rebase_path(baked_in_configs_gypi.baked_in_configs, "domain_reliability")
+    rebase_path(baked_in_configs_gypi.baked_in_configs, ".", "//components")
 
-action("bake_in_configs") {
-  visibility = [ ":*" ]
-  script = "bake_in_configs.py"
+# TODO(brettw) enable once GN supports response_file_contents for actions.
+if (false) {
+  action("bake_in_configs") {
+    visibility = [ ":*" ]
+    script = "bake_in_configs.py"
 
-  inputs = baked_in_configs
-  outputs = [
-    "$target_gen_dir/baked_in_configs.cc",
-  ]
+    inputs = baked_in_configs
+    output_file = "$target_gen_dir/baked_in_configs.cc"
+    outputs = [
+      output_file,
+    ]
 
-  # The actual list of JSON files will overflow the command line length limit
-  # on Windows, so pass the name of the .gypi file and bake_in_configs.py will
-  # read the filenames out of it manually.
-  args = [ rebase_path("//components", root_build_dir) ] +
-         [ rebase_path("baked_in_configs.gypi", root_build_dir) ] +
-         rebase_path(outputs, root_build_dir)
+    # The JSON file list is too long for the command line on Windows, so put
+    # them in a response file.
+    response_file_contents = rebase_path(inputs, root_build_dir)
+    args = [
+      "--file-list",
+      "{{response_file_name}}",
+      "--output",
+      rebase_path(output_file, root_build_dir),
+    ]
+  }
+} else {
+  action("bake_in_configs") {
+    visibility = [ ":*" ]
+    script = "bake_in_configs.py"
+
+    inputs = baked_in_configs
+    output_file = "$target_gen_dir/baked_in_configs.cc"
+    outputs = [
+      output_file,
+    ]
+
+    # The actual list of JSON files will overflow the command line length limit
+    # on Windows, so pass the name of the .gypi file and bake_in_configs.py will
+    # read the filenames out of it manually.
+    args = [
+      "--gypi-file=" + rebase_path("baked_in_configs.gypi", root_build_dir),
+      "--gypi-relative-to=" + rebase_path("//components", root_build_dir),
+      "--output=" + rebase_path(output_file, root_build_dir),
+    ]
+  }
 }
 
 component("domain_reliability") {
diff --git a/components/domain_reliability/bake_in_configs.py b/components/domain_reliability/bake_in_configs.py
index 8cee936..1a171c7 100755
--- a/components/domain_reliability/bake_in_configs.py
+++ b/components/domain_reliability/bake_in_configs.py
@@ -11,7 +11,9 @@
 
 import ast
 import json
+import optparse
 import os
+import shlex
 import sys
 
 
@@ -475,6 +477,12 @@
   return json_files
 
 
+def read_json_files_from_file(list_file):
+  with open(list_file, 'r') as f:
+    list_text = f.read()
+  return shlex.split(list_text)
+
+
 def domain_is_whitelisted(domain):
   return any(domain == e or domain.endswith('.' + e)  for e in DOMAIN_WHITELIST)
 
@@ -500,19 +508,42 @@
 
 
 def main():
-  if len(sys.argv) != 4:
-    print >> sys.stderr, (('Usage: %s <JSON pathname base directory> ' +
-                           '<input .gypi file> <output .cpp file>') %
-                          sys.argv[0])
-    print >> sys.stderr, sys.modules[__name__].__doc__
-    return 1
-  json_path = sys.argv[1]
-  gypi_file = sys.argv[2]
-  cpp_file = sys.argv[3]
+  parser = optparse.OptionParser(usage="bake_in_configs.py [options]")
+  parser.add_option("", "--output", metavar="FILE",
+                    help="[Required] Name of the .cc file to write.")
 
-  json_files = read_json_files_from_gypi(gypi_file)
-  json_files = [ os.path.join(json_path, f) for f in json_files ]
-  json_files = [ os.path.normpath(f) for f in json_files ]
+  # For response file reading.
+  parser.add_option("", "--file-list", metavar="FILE",
+                    help="File containing whitespace separated names of "
+                         "the baked in configs files.")
+
+  # For .gypi file reading.
+  parser.add_option("", "--gypi-file", metavar="FILE",
+                    help=".gypi file containing baked_in_configs variable.")
+  parser.add_option("", "--gypi-relative-to", metavar="PATH",
+                    help="Directory the baked_in_configs in the --gypi-file"
+                         "are relative to.""")
+
+  opts, args = parser.parse_args()
+
+  if not opts.output:
+    print >> sys.stderr, "--output argument required"
+    return 1
+
+  if opts.gypi_file:
+    # .gypi-style input.
+    if not opts.gypi_relative_to:
+      print >> sys.stderr, "--gypi-relative-to is required with --gypi-file"
+      return 1
+    json_files = read_json_files_from_gypi(opts.gypi_file)
+    json_files = [ os.path.join(opts.gypi_relative_to, f) for f in json_files ]
+    json_files = [ os.path.normpath(f) for f in json_files ]
+  elif opts.file_list:
+    # Regular file list input.
+    json_files = read_json_files_from_file(opts.file_list)
+  else:
+    print >> sys.stderr, "Either --file-list or --gypi-file is required."
+    return 1
 
   cpp_code = CC_HEADER
   found_invalid_config = False
@@ -549,7 +580,7 @@
   if found_invalid_config:
     return 1
 
-  with open(cpp_file, 'wb') as f:
+  with open(opts.output, 'wb') as f:
     f.write(cpp_code)
 
   return 0
diff --git a/components/error_page/renderer/net_error_helper_core.cc b/components/error_page/renderer/net_error_helper_core.cc
index e193073..ccb1a46 100644
--- a/components/error_page/renderer/net_error_helper_core.cc
+++ b/components/error_page/renderer/net_error_helper_core.cc
@@ -369,21 +369,24 @@
 }  // namespace
 
 struct NetErrorHelperCore::ErrorPageInfo {
-  ErrorPageInfo(blink::WebURLError error, bool was_failed_post)
+  ErrorPageInfo(blink::WebURLError error,
+                bool was_failed_post,
+                bool was_ignoring_cache)
       : error(error),
         was_failed_post(was_failed_post),
+        was_ignoring_cache(was_ignoring_cache),
         needs_dns_updates(false),
         needs_load_navigation_corrections(false),
         reload_button_in_page(false),
         show_saved_copy_button_in_page(false),
         show_cached_copy_button_in_page(false),
         is_finished_loading(false),
-        auto_reload_triggered(false) {
-  }
+        auto_reload_triggered(false) {}
 
   // Information about the failed page load.
   blink::WebURLError error;
   bool was_failed_post;
+  bool was_ignoring_cache;
 
   // Information about the status of the error page.
 
@@ -623,18 +626,19 @@
   UpdateErrorPage();
 }
 
-void NetErrorHelperCore::GetErrorHTML(
-    FrameType frame_type,
-    const blink::WebURLError& error,
-    bool is_failed_post,
-    std::string* error_html) {
+void NetErrorHelperCore::GetErrorHTML(FrameType frame_type,
+                                      const blink::WebURLError& error,
+                                      bool is_failed_post,
+                                      bool is_ignoring_cache,
+                                      std::string* error_html) {
   if (frame_type == MAIN_FRAME) {
     // If navigation corrections were needed before, that should have been
     // cancelled earlier by starting a new page load (Which has now failed).
     DCHECK(!committed_error_page_info_ ||
            !committed_error_page_info_->needs_load_navigation_corrections);
 
-    pending_error_page_info_.reset(new ErrorPageInfo(error, is_failed_post));
+    pending_error_page_info_.reset(
+        new ErrorPageInfo(error, is_failed_post, is_ignoring_cache));
     pending_error_page_info_->navigation_correction_params.reset(
         new NavigationCorrectionParams(navigation_correction_params_));
     GetErrorHtmlForMainFrame(pending_error_page_info_.get(), error_html);
@@ -753,9 +757,10 @@
   DCHECK(committed_error_page_info_->needs_load_navigation_corrections);
   DCHECK(committed_error_page_info_->navigation_correction_params);
 
-  pending_error_page_info_.reset(
-      new ErrorPageInfo(committed_error_page_info_->error,
-                        committed_error_page_info_->was_failed_post));
+  pending_error_page_info_.reset(new ErrorPageInfo(
+      committed_error_page_info_->error,
+      committed_error_page_info_->was_failed_post,
+      committed_error_page_info_->was_ignoring_cache));
   pending_error_page_info_->navigation_correction_response =
       ParseNavigationCorrectionResponse(corrections);
 
@@ -811,11 +816,11 @@
   return updated_error;
 }
 
-void NetErrorHelperCore::Reload() {
+void NetErrorHelperCore::Reload(bool ignore_cache) {
   if (!committed_error_page_info_) {
     return;
   }
-  delegate_->ReloadPage();
+  delegate_->ReloadPage(ignore_cache);
 }
 
 bool NetErrorHelperCore::MaybeStartAutoReloadTimer() {
@@ -859,7 +864,7 @@
 
   auto_reload_count_++;
   auto_reload_in_flight_ = true;
-  Reload();
+  Reload(committed_error_page_info_->was_ignoring_cache);
 }
 
 void NetErrorHelperCore::PauseAutoReloadTimer() {
@@ -918,7 +923,7 @@
         RecordEvent(NETWORK_ERROR_PAGE_BOTH_BUTTONS_RELOAD_CLICKED);
       }
       navigation_from_button_ = RELOAD_BUTTON;
-      Reload();
+      Reload(false);
       return;
     case SHOW_SAVED_COPY_BUTTON:
       RecordEvent(NETWORK_ERROR_PAGE_SHOW_SAVED_COPY_BUTTON_CLICKED);
diff --git a/components/error_page/renderer/net_error_helper_core.h b/components/error_page/renderer/net_error_helper_core.h
index 6a3dc7b..ef60d68f 100644
--- a/components/error_page/renderer/net_error_helper_core.h
+++ b/components/error_page/renderer/net_error_helper_core.h
@@ -100,7 +100,7 @@
         const std::string& tracking_request_body) = 0;
 
     // Starts a reload of the page in the observed frame.
-    virtual void ReloadPage() = 0;
+    virtual void ReloadPage(bool ignore_cache) = 0;
 
     // Load the original page from cache.
     virtual void LoadPageFromCache(const GURL& page_url) = 0;
@@ -137,6 +137,7 @@
   void GetErrorHTML(FrameType frame_type,
                     const blink::WebURLError& error,
                     bool is_failed_post,
+                    bool is_ignoring_cache,
                     std::string* error_html);
 
   // These methods handle tracking the actual state of the page.
@@ -217,7 +218,7 @@
 
   blink::WebURLError GetUpdatedError(const blink::WebURLError& error) const;
 
-  void Reload();
+  void Reload(bool ignore_cache);
   bool MaybeStartAutoReloadTimer();
   void StartAutoReloadTimer();
   void AutoReloadTimerFired();
diff --git a/components/error_page/renderer/net_error_helper_core_unittest.cc b/components/error_page/renderer/net_error_helper_core_unittest.cc
index 6fa8caf..35bf6d47 100644
--- a/components/error_page/renderer/net_error_helper_core_unittest.cc
+++ b/components/error_page/renderer/net_error_helper_core_unittest.cc
@@ -152,16 +152,18 @@
 class NetErrorHelperCoreTest : public testing::Test,
                                public NetErrorHelperCore::Delegate {
  public:
-  NetErrorHelperCoreTest() : timer_(NULL),
-                             update_count_(0),
-                             error_html_update_count_(0),
-                             reload_count_(0),
-                             show_saved_count_(0),
-                             diagnose_error_count_(0),
-                             enable_page_helper_functions_count_(0),
-                             default_url_(GURL(kFailedUrl)),
-                             error_url_(GURL(content::kUnreachableWebDataURL)),
-                             tracking_request_count_(0) {
+  NetErrorHelperCoreTest()
+      : timer_(NULL),
+        update_count_(0),
+        error_html_update_count_(0),
+        reload_count_(0),
+        reload_bypassing_cache_count_(0),
+        show_saved_count_(0),
+        diagnose_error_count_(0),
+        enable_page_helper_functions_count_(0),
+        default_url_(GURL(kFailedUrl)),
+        error_url_(GURL(content::kUnreachableWebDataURL)),
+        tracking_request_count_(0) {
     SetUpCore(false, false, true);
     test_runner::EnsureBlinkInitialized();
   }
@@ -195,6 +197,10 @@
     return reload_count_;
   }
 
+  int reload_bypassing_cache_count() const {
+    return reload_bypassing_cache_count_;
+  }
+
   int show_saved_count() const {
     return show_saved_count_;
   }
@@ -265,7 +271,8 @@
                         NetErrorHelperCore::NON_ERROR_PAGE);
     std::string html;
     core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
-                         NetErrorForURL(error, url), false, &html);
+                         NetErrorForURL(error, url), false /* is_failed_post */,
+                         false /* is_ignoring_cache */, &html);
     EXPECT_FALSE(html.empty());
     EXPECT_EQ(NetErrorStringForURL(error, url), html);
 
@@ -280,6 +287,23 @@
     DoErrorLoadOfURL(error, GURL(kFailedUrl));
   }
 
+  void DoErrorReoadBypassingCache(net::Error error) {
+    const GURL url(kFailedUrl);
+    core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
+                        NetErrorHelperCore::NON_ERROR_PAGE);
+    std::string html;
+    core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
+                         NetErrorForURL(error, url), false /* is_failed_post */,
+                         true /* is_ignoring_cache */, &html);
+    EXPECT_FALSE(html.empty());
+    EXPECT_EQ(NetErrorStringForURL(error, url), html);
+
+    core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
+                        NetErrorHelperCore::ERROR_PAGE);
+    core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
+    core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
+  }
+
   void DoSuccessLoad() {
     core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
                         NetErrorHelperCore::NON_ERROR_PAGE);
@@ -382,7 +406,11 @@
     request_body_.clear();
   }
 
-  void ReloadPage() override { reload_count_++; }
+  void ReloadPage(bool ignore_cache) override {
+    reload_count_++;
+    if (ignore_cache)
+      reload_bypassing_cache_count_++;
+  }
 
   void LoadPageFromCache(const GURL& page_url) override {
     show_saved_count_++;
@@ -439,6 +467,7 @@
   mutable scoped_ptr<ErrorPageParams> last_error_page_params_;
 
   int reload_count_;
+  int reload_bypassing_cache_count_;
   int show_saved_count_;
   GURL show_saved_url_;
   int diagnose_error_count_;
@@ -489,8 +518,9 @@
 
   // It fails, and an error page is requested.
   std::string html;
-  core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
-                       NetError(net::ERR_CONNECTION_RESET), false, &html);
+  core()->GetErrorHTML(
+      NetErrorHelperCore::MAIN_FRAME, NetError(net::ERR_CONNECTION_RESET),
+      false /* is_failed_post */, false /* is_ignoring_cache */, &html);
   // Should have returned a local error page.
   EXPECT_FALSE(html.empty());
   EXPECT_EQ(NetErrorString(net::ERR_CONNECTION_RESET), html);
@@ -515,8 +545,9 @@
 
   // It fails, and an error page is requested.
   std::string html;
-  core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
-                       NetError(net::ERR_CONNECTION_RESET), false, &html);
+  core()->GetErrorHTML(
+      NetErrorHelperCore::MAIN_FRAME, NetError(net::ERR_CONNECTION_RESET),
+      false /* is_failed_post */, false /* is_ignoring_cache */, &html);
   // Should have returned a local error page.
   EXPECT_FALSE(html.empty());
   EXPECT_EQ(NetErrorString(net::ERR_CONNECTION_RESET), html);
@@ -540,9 +571,9 @@
 
   // It fails, and an error page is requested.
   std::string html;
-  core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
-                       NetError(net::ERR_CONNECTION_RESET),
-                       false, &html);
+  core()->GetErrorHTML(
+      NetErrorHelperCore::MAIN_FRAME, NetError(net::ERR_CONNECTION_RESET),
+      false /* is_failed_post */, false /* is_ignoring_cache */, &html);
   core()->OnNetErrorInfo(DNS_PROBE_FINISHED_NXDOMAIN);
 
   // Should have returned a local error page.
@@ -572,9 +603,9 @@
 
   // It fails, and an error page is requested.
   std::string html;
-  core()->GetErrorHTML(NetErrorHelperCore::SUB_FRAME,
-                       NetError(net::ERR_NAME_NOT_RESOLVED),
-                       false, &html);
+  core()->GetErrorHTML(
+      NetErrorHelperCore::SUB_FRAME, NetError(net::ERR_NAME_NOT_RESOLVED),
+      false /* is_failed_post */, false /* is_ignoring_cache */, &html);
   // Should have returned a local error page.
   EXPECT_EQ(NetErrorString(net::ERR_NAME_NOT_RESOLVED), html);
 
@@ -596,9 +627,9 @@
 
   // It fails, and an error page is requested.
   std::string html;
-  core()->GetErrorHTML(NetErrorHelperCore::SUB_FRAME,
-                       NetError(net::ERR_NAME_NOT_RESOLVED),
-                       false, &html);
+  core()->GetErrorHTML(
+      NetErrorHelperCore::SUB_FRAME, NetError(net::ERR_NAME_NOT_RESOLVED),
+      false /* is_failed_post */, false /* is_ignoring_cache */, &html);
   // Should have returned a local error page.
   EXPECT_EQ(NetErrorString(net::ERR_NAME_NOT_RESOLVED), html);
 
@@ -621,9 +652,9 @@
 
   // It fails, and an error page is requested.
   std::string html;
-  core()->GetErrorHTML(NetErrorHelperCore::SUB_FRAME,
-                       NetError(net::ERR_NAME_NOT_RESOLVED),
-                       false, &html);
+  core()->GetErrorHTML(
+      NetErrorHelperCore::SUB_FRAME, NetError(net::ERR_NAME_NOT_RESOLVED),
+      false /* is_failed_post */, false /* is_ignoring_cache */, &html);
   core()->OnNetErrorInfo(DNS_PROBE_FINISHED_NXDOMAIN);
 
   // Should have returned a local error page.
@@ -659,9 +690,9 @@
 
   // It fails, and an error page is requested.
   std::string html;
-  core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
-                       NetError(net::ERR_NAME_NOT_RESOLVED),
-                       false, &html);
+  core()->GetErrorHTML(
+      NetErrorHelperCore::MAIN_FRAME, NetError(net::ERR_NAME_NOT_RESOLVED),
+      false /* is_failed_post */, false /* is_ignoring_cache */, &html);
   // Should have returned a local error page indicating a probe may run.
   EXPECT_EQ(ProbeErrorString(DNS_PROBE_POSSIBLE), html);
 
@@ -695,9 +726,9 @@
 
   // It fails, and an error page is requested.
   std::string html;
-  core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
-                       NetError(net::ERR_NAME_NOT_RESOLVED),
-                       false, &html);
+  core()->GetErrorHTML(
+      NetErrorHelperCore::MAIN_FRAME, NetError(net::ERR_NAME_NOT_RESOLVED),
+      false /* is_failed_post */, false /* is_ignoring_cache */, &html);
   // Should have returned a local error page indicating a probe may run.
   EXPECT_EQ(ProbeErrorString(DNS_PROBE_POSSIBLE), html);
 
@@ -729,9 +760,9 @@
 
   // It fails, and an error page is requested.
   std::string html;
-  core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
-                       NetError(net::ERR_NAME_NOT_RESOLVED),
-                       false, &html);
+  core()->GetErrorHTML(
+      NetErrorHelperCore::MAIN_FRAME, NetError(net::ERR_NAME_NOT_RESOLVED),
+      false /* is_failed_post */, false /* is_ignoring_cache */, &html);
   // Should have returned a local error page indicating a probe may run.
   EXPECT_EQ(ProbeErrorString(DNS_PROBE_POSSIBLE), html);
 
@@ -766,9 +797,9 @@
 
   // It fails, and an error page is requested.
   std::string html;
-  core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
-                       NetError(net::ERR_NAME_NOT_RESOLVED),
-                       false, &html);
+  core()->GetErrorHTML(
+      NetErrorHelperCore::MAIN_FRAME, NetError(net::ERR_NAME_NOT_RESOLVED),
+      false /* is_failed_post */, false /* is_ignoring_cache */, &html);
   // Should have returned a local error page indicating a probe may run.
   EXPECT_EQ(ProbeErrorString(DNS_PROBE_POSSIBLE), html);
 
@@ -804,9 +835,9 @@
 
   // It fails, and an error page is requested.
   std::string html;
-  core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
-                       NetError(net::ERR_NAME_NOT_RESOLVED),
-                       false, &html);
+  core()->GetErrorHTML(
+      NetErrorHelperCore::MAIN_FRAME, NetError(net::ERR_NAME_NOT_RESOLVED),
+      false /* is_failed_post */, false /* is_ignoring_cache */, &html);
   // Should have returned a local error page indicating a probe may run.
   EXPECT_EQ(ProbeErrorString(DNS_PROBE_POSSIBLE), html);
 
@@ -842,9 +873,9 @@
 
   // It fails, and an error page is requested.
   std::string html;
-  core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
-                       NetError(net::ERR_NAME_NOT_RESOLVED),
-                       false, &html);
+  core()->GetErrorHTML(
+      NetErrorHelperCore::MAIN_FRAME, NetError(net::ERR_NAME_NOT_RESOLVED),
+      false /* is_failed_post */, false /* is_ignoring_cache */, &html);
   // Should have returned a local error page indicating a probe may run.
   EXPECT_EQ(ProbeErrorString(DNS_PROBE_POSSIBLE), html);
 
@@ -883,9 +914,9 @@
 
   // It fails, and an error page is requested.
   std::string html;
-  core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
-                       NetError(net::ERR_NAME_NOT_RESOLVED),
-                       true, &html);
+  core()->GetErrorHTML(
+      NetErrorHelperCore::MAIN_FRAME, NetError(net::ERR_NAME_NOT_RESOLVED),
+      true /* is_failed_post */, false /* is_ignoring_cache */, &html);
   // Should have returned a local error page indicating a probe may run.
   EXPECT_EQ(ErrorToString(ProbeError(DNS_PROBE_POSSIBLE), true), html);
 
@@ -918,9 +949,9 @@
 
   // It fails, and an error page is requested.
   std::string html;
-  core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
-                       NetError(net::ERR_NAME_NOT_RESOLVED),
-                       false, &html);
+  core()->GetErrorHTML(
+      NetErrorHelperCore::MAIN_FRAME, NetError(net::ERR_NAME_NOT_RESOLVED),
+      false /* is_failed_post */, false /* is_ignoring_cache */, &html);
   // Should have returned a local error page indicating a probe may run.
   EXPECT_EQ(ProbeErrorString(DNS_PROBE_POSSIBLE), html);
 
@@ -958,9 +989,9 @@
 
   // It fails, and an error page is requested.
   std::string html;
-  core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
-                       NetError(net::ERR_NAME_NOT_RESOLVED),
-                       false, &html);
+  core()->GetErrorHTML(
+      NetErrorHelperCore::MAIN_FRAME, NetError(net::ERR_NAME_NOT_RESOLVED),
+      false /* is_failed_post */, false /* is_ignoring_cache */, &html);
   // Should have returned a local error page indicating a probe may run.
   EXPECT_EQ(ProbeErrorString(DNS_PROBE_POSSIBLE), html);
 
@@ -983,9 +1014,9 @@
                       NetErrorHelperCore::NON_ERROR_PAGE);
 
   // It fails, and an error page is requested.
-  core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
-                       NetError(net::ERR_NAME_NOT_RESOLVED),
-                       false, &html);
+  core()->GetErrorHTML(
+      NetErrorHelperCore::MAIN_FRAME, NetError(net::ERR_NAME_NOT_RESOLVED),
+      false /* is_failed_post */, false /* is_ignoring_cache */, &html);
   // Should have returned a local error page indicating a probe may run.
   EXPECT_EQ(ProbeErrorString(DNS_PROBE_POSSIBLE), html);
 
@@ -1018,9 +1049,9 @@
 
   // It fails, and an error page is requested.
   std::string html;
-  core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
-                       NetError(net::ERR_NAME_NOT_RESOLVED),
-                       false, &html);
+  core()->GetErrorHTML(
+      NetErrorHelperCore::MAIN_FRAME, NetError(net::ERR_NAME_NOT_RESOLVED),
+      false /* is_failed_post */, false /* is_ignoring_cache */, &html);
   // Should have returned a local error page indicating a probe may run.
   EXPECT_EQ(ProbeErrorString(DNS_PROBE_POSSIBLE), html);
 
@@ -1037,9 +1068,9 @@
                       NetErrorHelperCore::NON_ERROR_PAGE);
 
   // It fails, and an error page is requested.
-  core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
-                       NetError(net::ERR_NAME_NOT_RESOLVED),
-                       false, &html);
+  core()->GetErrorHTML(
+      NetErrorHelperCore::MAIN_FRAME, NetError(net::ERR_NAME_NOT_RESOLVED),
+      false /* is_failed_post */, false /* is_ignoring_cache */, &html);
   // Should have returned a local error page indicating a probe may run.
   EXPECT_EQ(ProbeErrorString(DNS_PROBE_POSSIBLE), html);
 
@@ -1073,9 +1104,9 @@
 
   // It fails, and an error page is requested.
   std::string html;
-  core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
-                       NetError(net::ERR_NAME_NOT_RESOLVED),
-                       false, &html);
+  core()->GetErrorHTML(
+      NetErrorHelperCore::MAIN_FRAME, NetError(net::ERR_NAME_NOT_RESOLVED),
+      false /* is_failed_post */, false /* is_ignoring_cache */, &html);
   // Should have returned a local error page indicating a probe may run.
   EXPECT_EQ(ProbeErrorString(DNS_PROBE_POSSIBLE), html);
 
@@ -1092,9 +1123,9 @@
                       NetErrorHelperCore::NON_ERROR_PAGE);
 
   // And fails.
-  core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
-                       NetError(net::ERR_NAME_NOT_RESOLVED),
-                       false, &html);
+  core()->GetErrorHTML(
+      NetErrorHelperCore::MAIN_FRAME, NetError(net::ERR_NAME_NOT_RESOLVED),
+      false /* is_failed_post */, false /* is_ignoring_cache */, &html);
   // Should have returned a local error page indicating a probe may run.
   EXPECT_EQ(ProbeErrorString(DNS_PROBE_POSSIBLE), html);
 
@@ -1130,7 +1161,9 @@
   std::string html;
   blink::WebURLError error = NetError(net::ERR_NAME_NOT_RESOLVED);
   error.unreachableURL = GURL(kFailedHttpsUrl);
-  core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME, error, false, &html);
+  core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME, error,
+                       false /* is_failed_post */,
+                       false /* is_ignoring_cache */, &html);
 
   blink::WebURLError probe_error = ProbeError(DNS_PROBE_POSSIBLE);
   probe_error.unreachableURL = GURL(kFailedHttpsUrl);
@@ -1168,9 +1201,9 @@
 
   // It fails.
   std::string html;
-  core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
-                       NetError(net::ERR_NAME_NOT_RESOLVED),
-                       false, &html);
+  core()->GetErrorHTML(
+      NetErrorHelperCore::MAIN_FRAME, NetError(net::ERR_NAME_NOT_RESOLVED),
+      false /* is_failed_post */, false /* is_ignoring_cache */, &html);
   EXPECT_TRUE(html.empty());
   EXPECT_FALSE(is_url_being_fetched());
   EXPECT_FALSE(last_error_page_params());
@@ -1219,9 +1252,9 @@
 
   // It fails, and corrections are requested.
   std::string html;
-  core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
-                       NetError(net::ERR_NAME_NOT_RESOLVED),
-                       false, &html);
+  core()->GetErrorHTML(
+      NetErrorHelperCore::MAIN_FRAME, NetError(net::ERR_NAME_NOT_RESOLVED),
+      false /* is_failed_post */, false /* is_ignoring_cache */, &html);
   EXPECT_TRUE(html.empty());
 
   // The blank page loads.
@@ -1267,9 +1300,9 @@
 
   // It fails, and corrections are requested.
   std::string html;
-  core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
-                       NetError(net::ERR_CONNECTION_FAILED),
-                       false, &html);
+  core()->GetErrorHTML(
+      NetErrorHelperCore::MAIN_FRAME, NetError(net::ERR_CONNECTION_FAILED),
+      false /* is_failed_post */, false /* is_ignoring_cache */, &html);
   EXPECT_TRUE(html.empty());
 
   // The blank page loads.
@@ -1311,9 +1344,9 @@
 
   // It fails, and corrections are requested.
   std::string html;
-  core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
-                       NetError(net::ERR_NAME_NOT_RESOLVED),
-                       false, &html);
+  core()->GetErrorHTML(
+      NetErrorHelperCore::MAIN_FRAME, NetError(net::ERR_NAME_NOT_RESOLVED),
+      false /* is_failed_post */, false /* is_ignoring_cache */, &html);
   EXPECT_TRUE(html.empty());
 
   // The blank page loads.
@@ -1361,9 +1394,9 @@
 
   // It fails, and corrections are requested.
   std::string html;
-  core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
-                       NetError(net::ERR_NAME_NOT_RESOLVED),
-                       false, &html);
+  core()->GetErrorHTML(
+      NetErrorHelperCore::MAIN_FRAME, NetError(net::ERR_NAME_NOT_RESOLVED),
+      false /* is_failed_post */, false /* is_ignoring_cache */, &html);
   EXPECT_TRUE(html.empty());
 
   // The blank page loads.
@@ -1408,9 +1441,9 @@
 
   // It fails, and corrections are requested.
   std::string html;
-  core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
-                       NetError(net::ERR_NAME_NOT_RESOLVED),
-                       false, &html);
+  core()->GetErrorHTML(
+      NetErrorHelperCore::MAIN_FRAME, NetError(net::ERR_NAME_NOT_RESOLVED),
+      false /* is_failed_post */, false /* is_ignoring_cache */, &html);
   EXPECT_TRUE(html.empty());
 
   // The blank page starts loading.
@@ -1446,9 +1479,9 @@
 
   // It fails, and corrections are requested.
   std::string html;
-  core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
-                       NetError(net::ERR_NAME_NOT_RESOLVED),
-                       false, &html);
+  core()->GetErrorHTML(
+      NetErrorHelperCore::MAIN_FRAME, NetError(net::ERR_NAME_NOT_RESOLVED),
+      false /* is_failed_post */, false /* is_ignoring_cache */, &html);
   EXPECT_TRUE(html.empty());
 
   // The blank page starts loading and is committed.
@@ -1480,9 +1513,9 @@
 
   // It fails, and corrections are requested.
   std::string html;
-  core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
-                       NetError(net::ERR_NAME_NOT_RESOLVED),
-                       false, &html);
+  core()->GetErrorHTML(
+      NetErrorHelperCore::MAIN_FRAME, NetError(net::ERR_NAME_NOT_RESOLVED),
+      false /* is_failed_post */, false /* is_ignoring_cache */, &html);
   EXPECT_TRUE(html.empty());
 
   // The blank page loads.
@@ -1503,9 +1536,9 @@
   EXPECT_FALSE(is_url_being_fetched());
 
   // It fails, and corrections are requested again once a blank page is loaded.
-  core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
-                       NetError(net::ERR_NAME_NOT_RESOLVED),
-                       false, &html);
+  core()->GetErrorHTML(
+      NetErrorHelperCore::MAIN_FRAME, NetError(net::ERR_NAME_NOT_RESOLVED),
+      false /* is_failed_post */, false /* is_ignoring_cache */, &html);
   EXPECT_TRUE(html.empty());
   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
                       NetErrorHelperCore::ERROR_PAGE);
@@ -1539,9 +1572,9 @@
 
   // It fails, and corrections are requested.
   std::string html;
-  core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
-                       NetError(net::ERR_NAME_NOT_RESOLVED),
-                       false, &html);
+  core()->GetErrorHTML(
+      NetErrorHelperCore::MAIN_FRAME, NetError(net::ERR_NAME_NOT_RESOLVED),
+      false /* is_failed_post */, false /* is_ignoring_cache */, &html);
   EXPECT_TRUE(html.empty());
 
   // The blank page loads.
@@ -1564,9 +1597,9 @@
                       NetErrorHelperCore::NON_ERROR_PAGE);
 
   // It fails, and corrections are requested again.
-  core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
-                       NetError(net::ERR_NAME_NOT_RESOLVED),
-                       false, &html);
+  core()->GetErrorHTML(
+      NetErrorHelperCore::MAIN_FRAME, NetError(net::ERR_NAME_NOT_RESOLVED),
+      false /* is_failed_post */, false /* is_ignoring_cache */, &html);
   EXPECT_TRUE(html.empty());
 
   // The blank page loads again.
@@ -1609,9 +1642,9 @@
 
   // It fails, and corrections are requested.
   std::string html;
-  core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
-                       NetError(net::ERR_NAME_NOT_RESOLVED),
-                       false, &html);
+  core()->GetErrorHTML(
+      NetErrorHelperCore::MAIN_FRAME, NetError(net::ERR_NAME_NOT_RESOLVED),
+      false /* is_failed_post */, false /* is_ignoring_cache */, &html);
   EXPECT_TRUE(html.empty());
 
   // The blank page loads.
@@ -1651,9 +1684,9 @@
 
   // It fails, and corrections are requested.
   std::string html;
-  core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
-                       NetError(net::ERR_NAME_NOT_RESOLVED),
-                       false, &html);
+  core()->GetErrorHTML(
+      NetErrorHelperCore::MAIN_FRAME, NetError(net::ERR_NAME_NOT_RESOLVED),
+      false /* is_failed_post */, false /* is_ignoring_cache */, &html);
   EXPECT_TRUE(html.empty());
 
   // The blank page loads.
@@ -1697,9 +1730,9 @@
 
   // It fails, and corrections are requested.
   std::string html;
-  core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
-                       NetError(net::ERR_NAME_NOT_RESOLVED),
-                       false, &html);
+  core()->GetErrorHTML(
+      NetErrorHelperCore::MAIN_FRAME, NetError(net::ERR_NAME_NOT_RESOLVED),
+      false /* is_failed_post */, false /* is_ignoring_cache */, &html);
   EXPECT_TRUE(html.empty());
 
   // The blank page loads.
@@ -1745,9 +1778,9 @@
 
   // It fails, and corrections are requested.
   std::string html;
-  core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
-                       NetError(net::ERR_NAME_NOT_RESOLVED),
-                       false, &html);
+  core()->GetErrorHTML(
+      NetErrorHelperCore::MAIN_FRAME, NetError(net::ERR_NAME_NOT_RESOLVED),
+      false /* is_failed_post */, false /* is_ignoring_cache */, &html);
   EXPECT_TRUE(html.empty());
 
   // The blank page loads.
@@ -1789,9 +1822,9 @@
 
   // It fails, and corrections are requested.
   std::string html;
-  core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
-                       NetError(net::ERR_CONNECTION_FAILED),
-                       false, &html);
+  core()->GetErrorHTML(
+      NetErrorHelperCore::MAIN_FRAME, NetError(net::ERR_CONNECTION_FAILED),
+      false /* is_failed_post */, false /* is_ignoring_cache */, &html);
   EXPECT_TRUE(html.empty());
 
   // The blank page loads.
@@ -1826,9 +1859,9 @@
 
   // It fails, and corrections are requested.
   std::string html;
-  core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
-                       NetError(net::ERR_CONNECTION_FAILED),
-                       false, &html);
+  core()->GetErrorHTML(
+      NetErrorHelperCore::MAIN_FRAME, NetError(net::ERR_CONNECTION_FAILED),
+      false /* is_failed_post */, false /* is_ignoring_cache */, &html);
   EXPECT_TRUE(html.empty());
 
   // The blank page loads.
@@ -1863,9 +1896,9 @@
 
   // It fails.
   std::string html;
-  core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
-                       NetError(net::ERR_NAME_NOT_RESOLVED),
-                       false, &html);
+  core()->GetErrorHTML(
+      NetErrorHelperCore::MAIN_FRAME, NetError(net::ERR_NAME_NOT_RESOLVED),
+      false /* is_failed_post */, false /* is_ignoring_cache */, &html);
   EXPECT_TRUE(html.empty());
   EXPECT_FALSE(is_url_being_fetched());
   EXPECT_FALSE(last_error_page_params());
@@ -1961,10 +1994,29 @@
 
   EXPECT_TRUE(timer()->IsRunning());
   EXPECT_EQ(0, reload_count());
+  EXPECT_EQ(0, reload_bypassing_cache_count());
 
   timer()->Fire();
   EXPECT_FALSE(timer()->IsRunning());
   EXPECT_EQ(1, reload_count());
+  EXPECT_EQ(0, reload_bypassing_cache_count());
+
+  DoSuccessLoad();
+
+  EXPECT_FALSE(timer()->IsRunning());
+}
+
+TEST_F(NetErrorHelperCoreAutoReloadTest, BypassingCache) {
+  DoErrorReoadBypassingCache(net::ERR_CONNECTION_RESET);
+
+  EXPECT_TRUE(timer()->IsRunning());
+  EXPECT_EQ(0, reload_count());
+  EXPECT_EQ(0, reload_bypassing_cache_count());
+
+  timer()->Fire();
+  EXPECT_FALSE(timer()->IsRunning());
+  EXPECT_EQ(1, reload_count());
+  EXPECT_EQ(1, reload_bypassing_cache_count());
 
   DoSuccessLoad();
 
@@ -2099,8 +2151,9 @@
   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
                       NetErrorHelperCore::NON_ERROR_PAGE);
   std::string html;
-  core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
-                       NetError(net::ERR_CONNECTION_RESET), false, &html);
+  core()->GetErrorHTML(
+      NetErrorHelperCore::MAIN_FRAME, NetError(net::ERR_CONNECTION_RESET),
+      false /* is_failed_post */, false /* is_ignoring_cache */, &html);
   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
                       NetErrorHelperCore::ERROR_PAGE);
   core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
@@ -2122,8 +2175,9 @@
   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
                       NetErrorHelperCore::NON_ERROR_PAGE);
   std::string html;
-  core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
-                       NetError(net::ERR_CONNECTION_RESET), false, &html);
+  core()->GetErrorHTML(
+      NetErrorHelperCore::MAIN_FRAME, NetError(net::ERR_CONNECTION_RESET),
+      false /* is_failed_post */, false /* is_ignoring_cache */, &html);
   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
                       NetErrorHelperCore::ERROR_PAGE);
   core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
@@ -2142,8 +2196,9 @@
   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
                       NetErrorHelperCore::NON_ERROR_PAGE);
   std::string html;
-  core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
-                       NetError(net::ERR_CONNECTION_RESET), false, &html);
+  core()->GetErrorHTML(
+      NetErrorHelperCore::MAIN_FRAME, NetError(net::ERR_CONNECTION_RESET),
+      false /* is_failed_post */, false /* is_ignoring_cache */, &html);
   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
                       NetErrorHelperCore::ERROR_PAGE);
   EXPECT_FALSE(timer()->IsRunning());
@@ -2162,16 +2217,18 @@
   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
                       NetErrorHelperCore::NON_ERROR_PAGE);
   std::string html;
-  core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
-                       NetError(net::ERR_CONNECTION_RESET), false, &html);
+  core()->GetErrorHTML(
+      NetErrorHelperCore::MAIN_FRAME, NetError(net::ERR_CONNECTION_RESET),
+      false /* is_failed_post */, false /* is_ignoring_cache */, &html);
   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
                       NetErrorHelperCore::ERROR_PAGE);
   core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
   core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
                       NetErrorHelperCore::NON_ERROR_PAGE);
-  core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
-                       NetError(net::ERR_CONNECTION_RESET), false, &html);
+  core()->GetErrorHTML(
+      NetErrorHelperCore::MAIN_FRAME, NetError(net::ERR_CONNECTION_RESET),
+      false /* is_failed_post */, false /* is_ignoring_cache */, &html);
   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
                       NetErrorHelperCore::ERROR_PAGE);
   EXPECT_FALSE(timer()->IsRunning());
@@ -2458,8 +2515,19 @@
 TEST_F(NetErrorHelperCoreTest, ExplicitReloadSucceeds) {
   DoErrorLoad(net::ERR_CONNECTION_RESET);
   EXPECT_EQ(0, reload_count());
+  EXPECT_EQ(0, reload_bypassing_cache_count());
   core()->ExecuteButtonPress(NetErrorHelperCore::RELOAD_BUTTON);
   EXPECT_EQ(1, reload_count());
+  EXPECT_EQ(0, reload_bypassing_cache_count());
+}
+
+TEST_F(NetErrorHelperCoreTest, ExplicitReloadDoNotBypassCache) {
+  DoErrorReoadBypassingCache(net::ERR_CONNECTION_RESET);
+  EXPECT_EQ(0, reload_count());
+  EXPECT_EQ(0, reload_bypassing_cache_count());
+  core()->ExecuteButtonPress(NetErrorHelperCore::RELOAD_BUTTON);
+  EXPECT_EQ(1, reload_count());
+  EXPECT_EQ(0, reload_bypassing_cache_count());
 }
 
 TEST_F(NetErrorHelperCoreTest, ExplicitShowSavedSucceeds) {
diff --git a/components/plugins/common/BUILD.gn b/components/mus/common/BUILD.gn
similarity index 62%
rename from components/plugins/common/BUILD.gn
rename to components/mus/common/BUILD.gn
index c0ca042..f9c375e 100644
--- a/components/plugins/common/BUILD.gn
+++ b/components/mus/common/BUILD.gn
@@ -2,9 +2,11 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-static_library("common") {
+source_set("common") {
   sources = [
-    "plugins_switches.cc",
-    "plugins_switches.h",
+    "transient_window_utils.h",
+  ]
+  deps = [
+    "//components/mus/public/interfaces",
   ]
 }
diff --git a/components/mus/common/transient_window_utils.h b/components/mus/common/transient_window_utils.h
new file mode 100644
index 0000000..1a8d0ca
--- /dev/null
+++ b/components/mus/common/transient_window_utils.h
@@ -0,0 +1,116 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_MUS_COMMON_TRANSIENT_WINDOW_UTILS_H_
+#define COMPONENTS_MUS_COMMON_TRANSIENT_WINDOW_UTILS_H_
+
+#include <vector>
+
+#include "components/mus/public/interfaces/mus_constants.mojom.h"
+
+namespace mus {
+
+// Returns true if |window| has |ancestor| as a transient ancestor. A transient
+// ancestor is found by following the transient parent chain of the window.
+template <class T>
+bool HasTransientAncestor(const T* window, const T* ancestor) {
+  const T* transient_parent = window->transient_parent();
+  if (transient_parent == ancestor)
+    return true;
+  return transient_parent ? HasTransientAncestor(transient_parent, ancestor)
+                          : false;
+}
+
+// Populates |ancestors| with all transient ancestors of |window| that are
+// siblings of |window|. Returns true if any ancestors were found, false if not.
+template <class T>
+bool GetAllTransientAncestors(T* window, std::vector<T*>* ancestors) {
+  T* parent = window->parent();
+  for (; window; window = window->transient_parent()) {
+    if (window->parent() == parent)
+      ancestors->push_back(window);
+  }
+  return !ancestors->empty();
+}
+
+// Replaces |window1| and |window2| with their possible transient ancestors that
+// are still siblings (have a common transient parent).  |window1| and |window2|
+// are not modified if such ancestors cannot be found.
+template <class T>
+void FindCommonTransientAncestor(T** window1, T** window2) {
+  DCHECK(window1);
+  DCHECK(window2);
+  DCHECK(*window1);
+  DCHECK(*window2);
+  // Assemble chains of ancestors of both windows.
+  std::vector<T*> ancestors1;
+  std::vector<T*> ancestors2;
+  if (!GetAllTransientAncestors(*window1, &ancestors1) ||
+      !GetAllTransientAncestors(*window2, &ancestors2)) {
+    return;
+  }
+  // Walk the two chains backwards and look for the first difference.
+  auto it1 = ancestors1.rbegin();
+  auto it2 = ancestors2.rbegin();
+  for (; it1 != ancestors1.rend() && it2 != ancestors2.rend(); ++it1, ++it2) {
+    if (*it1 != *it2) {
+      *window1 = *it1;
+      *window2 = *it2;
+      break;
+    }
+  }
+}
+
+template <class T>
+bool AdjustStackingForTransientWindows(T** child,
+                                       T** target,
+                                       mojom::OrderDirection* direction,
+                                       T* stacking_target) {
+  if (stacking_target == *target)
+    return true;
+
+  // For windows that have transient children stack the transient ancestors that
+  // are siblings. This prevents one transient group from being inserted in the
+  // middle of another.
+  FindCommonTransientAncestor(child, target);
+
+  // When stacking above skip to the topmost transient descendant of the target.
+  if (*direction == mojom::ORDER_DIRECTION_ABOVE &&
+      !HasTransientAncestor(*child, *target)) {
+    const std::vector<T*>& siblings((*child)->parent()->children());
+    size_t target_i =
+        std::find(siblings.begin(), siblings.end(), *target) - siblings.begin();
+    while (target_i + 1 < siblings.size() &&
+           HasTransientAncestor(siblings[target_i + 1], *target)) {
+      ++target_i;
+    }
+    *target = siblings[target_i];
+  }
+
+  return *child != *target;
+}
+
+// Stacks transient descendants of |window| that are its siblings just above it.
+template <class T>
+void RestackTransientDescendants(T* window, T** (*GetStackingTarget)(T*)) {
+  T* parent = window->parent();
+  if (!parent)
+    return;
+
+  // stack any transient children that share the same parent to be in front of
+  // |window_|. the existing stacking order is preserved by iterating backwards
+  // and always stacking on top.
+  std::vector<T*> children(parent->children());
+  for (auto it = children.rbegin(); it != children.rend(); ++it) {
+    if ((*it) != window && HasTransientAncestor(*it, window)) {
+      T* old_stacking_target = *GetStackingTarget(*it);
+      *GetStackingTarget(*it) = window;
+      (*it)->Reorder(window, mojom::ORDER_DIRECTION_ABOVE);
+      *GetStackingTarget(*it) = old_stacking_target;
+    }
+  }
+}
+}  // namespace mus
+
+#endif  // COMPONENTS_MUS_COMMON_TRANSIENT_WINDOW_UTILS_H_
diff --git a/components/mus/example/wm/non_client_frame_controller.cc b/components/mus/example/wm/non_client_frame_controller.cc
index fba2aef..a069601 100644
--- a/components/mus/example/wm/non_client_frame_controller.cc
+++ b/components/mus/example/wm/non_client_frame_controller.cc
@@ -62,17 +62,20 @@
 }
 
 bool NonClientFrameController::CanResize() const {
-  return (GetResizeBehavior(window_) &
+  return window_ &&
+         (GetResizeBehavior(window_) &
           mus::mojom::RESIZE_BEHAVIOR_CAN_RESIZE) != 0;
 }
 
 bool NonClientFrameController::CanMaximize() const {
-  return (GetResizeBehavior(window_) &
+  return window_ &&
+         (GetResizeBehavior(window_) &
           mus::mojom::RESIZE_BEHAVIOR_CAN_MAXIMIZE) != 0;
 }
 
 bool NonClientFrameController::CanMinimize() const {
-  return (GetResizeBehavior(window_) &
+  return window_ &&
+         (GetResizeBehavior(window_) &
           mus::mojom::RESIZE_BEHAVIOR_CAN_MINIMIZE) != 0;
 }
 
diff --git a/components/mus/example/wm/non_client_frame_controller.h b/components/mus/example/wm/non_client_frame_controller.h
index 7b101be..57373841 100644
--- a/components/mus/example/wm/non_client_frame_controller.h
+++ b/components/mus/example/wm/non_client_frame_controller.h
@@ -42,6 +42,9 @@
   void OnWindowDestroyed(mus::Window* window) override;
 
   views::Widget* widget_;
+
+  // WARNING: as widget delays destruction there is a portion of time when this
+  // is null.
   mus::Window* window_;
 
   DISALLOW_COPY_AND_ASSIGN(NonClientFrameController);
diff --git a/components/mus/gles2/command_buffer_driver.cc b/components/mus/gles2/command_buffer_driver.cc
index ba13464..2a7265a5 100644
--- a/components/mus/gles2/command_buffer_driver.cc
+++ b/components/mus/gles2/command_buffer_driver.cc
@@ -26,6 +26,7 @@
 #include "gpu/command_buffer/service/valuebuffer_manager.h"
 #include "mojo/converters/geometry/geometry_type_converters.h"
 #include "mojo/platform_handle/platform_handle_functions.h"
+#include "ui/gfx/buffer_format_util.h"
 #include "ui/gfx/gpu_memory_buffer.h"
 #include "ui/gfx/vsync_provider.h"
 #include "ui/gl/gl_context.h"
@@ -250,7 +251,9 @@
   scoped_refptr<gl::GLImageSharedMemory> image =
       new gl::GLImageSharedMemory(gfx_size, internal_format);
   // TODO(jam): also need a mojo enum for this enum
-  if (!image->Initialize(handle, gfx::GpuMemoryBufferId(id), gpu_format, 0)) {
+  if (!image->Initialize(
+          handle, gfx::GpuMemoryBufferId(id), gpu_format, 0,
+          gfx::RowSizeForBufferFormat(gfx_size.width(), gpu_format, 0))) {
     NOTREACHED();
     return;
   }
diff --git a/components/mus/gles2/command_buffer_local.cc b/components/mus/gles2/command_buffer_local.cc
index 2e0535bb..461262b 100644
--- a/components/mus/gles2/command_buffer_local.cc
+++ b/components/mus/gles2/command_buffer_local.cc
@@ -18,6 +18,7 @@
 #include "gpu/command_buffer/service/shader_translator_cache.h"
 #include "gpu/command_buffer/service/transfer_buffer_manager.h"
 #include "gpu/command_buffer/service/valuebuffer_manager.h"
+#include "ui/gfx/buffer_format_util.h"
 #include "ui/gfx/vsync_provider.h"
 #include "ui/gl/gl_context.h"
 #include "ui/gl/gl_image_shared_memory.h"
@@ -139,7 +140,9 @@
       gfx::Size(static_cast<int>(width), static_cast<int>(height)),
       internalformat));
   if (!image->Initialize(base::SharedMemory::DuplicateHandle(handle.handle),
-                         handle.id, gpu_memory_buffer->GetFormat(), 0)) {
+                         handle.id, gpu_memory_buffer->GetFormat(), 0,
+                         gfx::RowSizeForBufferFormat(
+                             width, gpu_memory_buffer->GetFormat(), 0))) {
     return -1;
   }
 
diff --git a/components/mus/gles2/mojo_gpu_memory_buffer.cc b/components/mus/gles2/mojo_gpu_memory_buffer.cc
index dfa7d8b6..c0603e6a 100644
--- a/components/mus/gles2/mojo_gpu_memory_buffer.cc
+++ b/components/mus/gles2/mojo_gpu_memory_buffer.cc
@@ -87,6 +87,8 @@
   handle.type = gfx::SHARED_MEMORY_BUFFER;
   handle.handle = shared_memory_->handle();
   handle.offset = 0;
+  handle.stride = static_cast<int32_t>(
+      gfx::RowSizeForBufferFormat(size_.width(), format_, 0));
   return handle;
 }
 
diff --git a/components/mus/public/cpp/lib/window_tree_client_impl.cc b/components/mus/public/cpp/lib/window_tree_client_impl.cc
index f781ac3..1056ead0 100644
--- a/components/mus/public/cpp/lib/window_tree_client_impl.cc
+++ b/components/mus/public/cpp/lib/window_tree_client_impl.cc
@@ -23,7 +23,7 @@
 namespace mus {
 namespace {
 
-void WindowManagerCallback(mus::mojom::WindowManagerErrorCode error_code) {}
+void WindowManagerCallback(mojom::WindowManagerErrorCode error_code) {}
 
 }  // namespace
 
@@ -83,7 +83,7 @@
 
 WindowTreeConnection* WindowTreeConnection::Create(
     WindowTreeDelegate* delegate,
-    mojo::InterfaceRequest<mus::mojom::WindowTreeClient> request,
+    mojo::InterfaceRequest<mojom::WindowTreeClient> request,
     CreateType create_type) {
   WindowTreeClientImpl* client =
       new WindowTreeClientImpl(delegate, nullptr, request.Pass());
@@ -94,7 +94,7 @@
 
 WindowTreeConnection* WindowTreeConnection::CreateForWindowManager(
     WindowTreeDelegate* delegate,
-    mojo::InterfaceRequest<mus::mojom::WindowTreeClient> request,
+    mojo::InterfaceRequest<mojom::WindowTreeClient> request,
     CreateType create_type,
     WindowManagerDelegate* window_manager_delegate) {
   WindowTreeClientImpl* client = new WindowTreeClientImpl(
@@ -107,7 +107,7 @@
 WindowTreeClientImpl::WindowTreeClientImpl(
     WindowTreeDelegate* delegate,
     WindowManagerDelegate* window_manager_delegate,
-    mojo::InterfaceRequest<mus::mojom::WindowTreeClient> request)
+    mojo::InterfaceRequest<mojom::WindowTreeClient> request)
     : connection_id_(0),
       next_window_id_(1),
       next_change_id_(1),
@@ -115,9 +115,14 @@
       window_manager_delegate_(window_manager_delegate),
       root_(nullptr),
       focused_window_(nullptr),
-      binding_(this, request.Pass()),
+      binding_(this),
+      tree_(nullptr),
       is_embed_root_(false),
-      in_destructor_(false) {}
+      in_destructor_(false) {
+  // Allow for a null request in tests.
+  if (request.is_pending())
+    binding_.Bind(request.Pass());
+}
 
 WindowTreeClientImpl::~WindowTreeClientImpl() {
   in_destructor_ = true;
@@ -233,9 +238,9 @@
 
 void WindowTreeClientImpl::Embed(
     Id window_id,
-    mus::mojom::WindowTreeClientPtr client,
+    mojom::WindowTreeClientPtr client,
     uint32_t policy_bitmask,
-    const mus::mojom::WindowTree::EmbedCallback& callback) {
+    const mojom::WindowTree::EmbedCallback& callback) {
   DCHECK(tree_);
   tree_->Embed(window_id, client.Pass(), policy_bitmask, callback);
 }
@@ -299,9 +304,6 @@
   tree_->SetResizeBehavior(window_id, resize_behavior);
 }
 
-////////////////////////////////////////////////////////////////////////////////
-// WindowTreeClientImpl, WindowTreeConnection implementation:
-
 Id WindowTreeClientImpl::CreateWindowOnServer() {
   DCHECK(tree_);
   const Id window_id = MakeTransportId(connection_id_, next_window_id_++);
@@ -323,6 +325,24 @@
   return nullptr;
 }
 
+void WindowTreeClientImpl::OnEmbedImpl(mojom::WindowTree* window_tree,
+                                       ConnectionSpecificId connection_id,
+                                       mojom::WindowDataPtr root_data,
+                                       Id focused_window_id,
+                                       uint32 access_policy) {
+  tree_ = window_tree;
+  connection_id_ = connection_id;
+  is_embed_root_ =
+      (access_policy & mojom::WindowTree::ACCESS_POLICY_EMBED_ROOT) != 0;
+
+  DCHECK(!root_);
+  root_ = AddWindowToConnection(this, nullptr, root_data);
+
+  focused_window_ = GetWindowById(focused_window_id);
+
+  delegate_->OnEmbed(root_);
+}
+
 ////////////////////////////////////////////////////////////////////////////////
 // WindowTreeClientImpl, WindowTreeConnection implementation:
 
@@ -358,24 +378,14 @@
 
 void WindowTreeClientImpl::OnEmbed(ConnectionSpecificId connection_id,
                                    mojom::WindowDataPtr root_data,
-                                   mus::mojom::WindowTreePtr tree,
+                                   mojom::WindowTreePtr tree,
                                    Id focused_window_id,
                                    uint32 access_policy) {
-  if (tree) {
-    DCHECK(!tree_);
-    tree_ = tree.Pass();
-    tree_.set_connection_error_handler([this]() { delete this; });
-  }
-  connection_id_ = connection_id;
-  is_embed_root_ =
-      (access_policy & mus::mojom::WindowTree::ACCESS_POLICY_EMBED_ROOT) != 0;
-
-  DCHECK(!root_);
-  root_ = AddWindowToConnection(this, nullptr, root_data);
-
-  focused_window_ = GetWindowById(focused_window_id);
-
-  delegate_->OnEmbed(root_);
+  DCHECK(!tree_ptr_);
+  tree_ptr_ = tree.Pass();
+  tree_ptr_.set_connection_error_handler([this]() { delete this; });
+  OnEmbedImpl(tree_ptr_.get(), connection_id, root_data.Pass(),
+              focused_window_id, access_policy);
 }
 
 void WindowTreeClientImpl::OnEmbeddedAppDisconnected(Id window_id) {
@@ -399,7 +409,7 @@
       GetOldestInFlightChangeMatching(window_id, ChangeType::BOUNDS);
   if (change) {
     static_cast<InFlightBoundsChange*>(change)
-        ->set_revert_bounds(old_bounds.To<gfx::Rect>());
+        ->set_revert_bounds(new_bounds.To<gfx::Rect>());
     // Wait for the change we initiated on the server to complete before
     // deciding if |new_bounds| should be applied.
     return;
diff --git a/components/mus/public/cpp/lib/window_tree_client_impl.h b/components/mus/public/cpp/lib/window_tree_client_impl.h
index 99b19a3..41aca1c 100644
--- a/components/mus/public/cpp/lib/window_tree_client_impl.h
+++ b/components/mus/public/cpp/lib/window_tree_client_impl.h
@@ -19,6 +19,7 @@
 
 namespace mus {
 class InFlightChange;
+class WindowTreeClientImplPrivate;
 class WindowTreeConnection;
 class WindowTreeDelegate;
 
@@ -26,18 +27,17 @@
 
 // Manages the connection with the Window Server service.
 class WindowTreeClientImpl : public WindowTreeConnection,
-                             public mus::mojom::WindowTreeClient {
+                             public mojom::WindowTreeClient {
  public:
-  WindowTreeClientImpl(
-      WindowTreeDelegate* delegate,
-      WindowManagerDelegate* window_manager_delegate,
-      mojo::InterfaceRequest<mus::mojom::WindowTreeClient> request);
+  WindowTreeClientImpl(WindowTreeDelegate* delegate,
+                       WindowManagerDelegate* window_manager_delegate,
+                       mojo::InterfaceRequest<mojom::WindowTreeClient> request);
   ~WindowTreeClientImpl() override;
 
   // Wait for OnEmbed(), returning when done.
   void WaitForEmbed();
 
-  bool connected() const { return tree_; }
+  bool connected() const { return tree_ != nullptr; }
   ConnectionSpecificId connection_id() const { return connection_id_; }
 
   // API exposed to the window implementations that pushes local changes to the
@@ -72,9 +72,9 @@
                         mojo::TextInputStatePtr state);
 
   void Embed(Id window_id,
-             mus::mojom::WindowTreeClientPtr client,
+             mojom::WindowTreeClientPtr client,
              uint32_t policy_bitmask,
-             const mus::mojom::WindowTree::EmbedCallback& callback);
+             const mojom::WindowTree::EmbedCallback& callback);
 
   void RequestSurface(Id window_id,
                       mojom::SurfaceType type,
@@ -103,6 +103,8 @@
   void SetResizeBehavior(Id window_id, mojom::ResizeBehavior resize_behavior);
 
  private:
+  friend class WindowTreeClientImplPrivate;
+
   typedef std::map<Id, Window*> IdToWindowMap;
 
   using InFlightMap = base::ScopedPtrMap<uint32_t, scoped_ptr<InFlightChange>>;
@@ -113,6 +115,13 @@
   InFlightChange* GetOldestInFlightChangeMatching(Id window_id,
                                                   ChangeType change_type);
 
+  // OnEmbed() calls into this. Exposed as a separate function for testing.
+  void OnEmbedImpl(mojom::WindowTree* window_tree,
+                   ConnectionSpecificId connection_id,
+                   mojom::WindowDataPtr root_data,
+                   Id focused_window_id,
+                   uint32 access_policy);
+
   // Overridden from WindowTreeConnection:
   Window* GetRoot() override;
   Window* GetWindowById(Id id) override;
@@ -189,7 +198,10 @@
   Window* focused_window_;
 
   mojo::Binding<WindowTreeClient> binding_;
-  mus::mojom::WindowTreePtr tree_;
+  mojom::WindowTreePtr tree_ptr_;
+  // Typically this is the value contained in |tree_ptr_|, but tests may
+  // directly set this.
+  mojom::WindowTree* tree_;
 
   bool is_embed_root_;
 
diff --git a/components/mus/public/cpp/tests/BUILD.gn b/components/mus/public/cpp/tests/BUILD.gn
index 9787e49..edb7809a 100644
--- a/components/mus/public/cpp/tests/BUILD.gn
+++ b/components/mus/public/cpp/tests/BUILD.gn
@@ -37,8 +37,11 @@
 test("mojo_view_manager_lib_unittests") {
   sources = [
     "run_all_unittests.cc",
+    "test_window_tree.cc",
+    "test_window_tree.h",
     "window_server_test_suite.cc",
     "window_server_test_suite.h",
+    "window_tree_client_impl_unittest.cc",
     "window_unittest.cc",
   ]
 
@@ -48,6 +51,7 @@
     "//base/test:test_support",
     "//components/mus/public/cpp",
     "//mojo/application/public/cpp",
+    "//mojo/converters/geometry",
     "//mojo/gles2",
     "//mojo/platform_handle:platform_handle_impl",
     "//testing/gtest",
diff --git a/components/mus/public/cpp/tests/test_window_tree.cc b/components/mus/public/cpp/tests/test_window_tree.cc
new file mode 100644
index 0000000..38f0bc9
--- /dev/null
+++ b/components/mus/public/cpp/tests/test_window_tree.cc
@@ -0,0 +1,100 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/mus/public/cpp/tests/test_window_tree.h"
+
+namespace mus {
+
+TestWindowTree::TestWindowTree() : got_change_(false), change_id_(0) {}
+
+TestWindowTree::~TestWindowTree() {}
+
+bool TestWindowTree::GetAndClearChangeId(uint32_t* change_id) {
+  if (!got_change_)
+    return false;
+
+  if (change_id)
+    *change_id = change_id_;
+  got_change_ = false;
+  return true;
+}
+
+void TestWindowTree::NewWindow(uint32_t window_id,
+                               const NewWindowCallback& callback) {}
+
+void TestWindowTree::DeleteWindow(uint32_t window_id,
+                                  const DeleteWindowCallback& callback) {}
+
+void TestWindowTree::SetWindowBounds(uint32_t change_id,
+                                     uint32_t window_id,
+                                     mojo::RectPtr bounds) {
+  got_change_ = true;
+  change_id_ = change_id;
+}
+
+void TestWindowTree::SetClientArea(uint32_t window_id, mojo::InsetsPtr insets) {
+}
+
+void TestWindowTree::SetWindowVisibility(
+    uint32_t window_id,
+    bool visible,
+    const SetWindowVisibilityCallback& callback) {}
+
+void TestWindowTree::SetWindowProperty(
+    uint32_t window_id,
+    const mojo::String& name,
+    mojo::Array<uint8_t> value,
+    const SetWindowPropertyCallback& callback) {}
+
+void TestWindowTree::RequestSurface(
+    uint32_t window_id,
+    mojom::SurfaceType type,
+    mojo::InterfaceRequest<mojom::Surface> surface,
+    mojom::SurfaceClientPtr client) {}
+
+void TestWindowTree::AddWindow(uint32_t parent,
+                               uint32_t child,
+                               const AddWindowCallback& callback) {}
+
+void TestWindowTree::RemoveWindowFromParent(
+    uint32_t window_id,
+    const RemoveWindowFromParentCallback& callback) {}
+
+void TestWindowTree::ReorderWindow(uint32_t window_id,
+                                   uint32_t relative_window_id,
+                                   mojom::OrderDirection direction,
+                                   const ReorderWindowCallback& callback) {}
+
+void TestWindowTree::GetWindowTree(uint32_t window_id,
+                                   const GetWindowTreeCallback& callback) {}
+
+void TestWindowTree::Embed(uint32_t window_id,
+                           mojom::WindowTreeClientPtr client,
+                           uint32_t policy_bitmask,
+                           const EmbedCallback& callback) {}
+
+void TestWindowTree::SetFocus(uint32_t window_id) {}
+
+void TestWindowTree::SetWindowTextInputState(uint32_t window_id,
+                                             mojo::TextInputStatePtr state) {}
+
+void TestWindowTree::SetImeVisibility(uint32_t window_id,
+                                      bool visible,
+                                      mojo::TextInputStatePtr state) {}
+
+void TestWindowTree::SetPreferredSize(
+    uint32_t window_id,
+    mojo::SizePtr size,
+    const SetPreferredSizeCallback& callback) {}
+
+void TestWindowTree::SetShowState(uint32_t window_id,
+                                  mojom::ShowState show_state,
+                                  const SetShowStateCallback& callback) {}
+
+void TestWindowTree::SetResizeBehavior(uint32_t window_id,
+                                       mojom::ResizeBehavior resize_behavior) {}
+
+void TestWindowTree::WmResponse(uint32_t change_id, bool response) {}
+
+}  // namespace mus
diff --git a/components/mus/public/cpp/tests/test_window_tree.h b/components/mus/public/cpp/tests/test_window_tree.h
new file mode 100644
index 0000000..e732476e2
--- /dev/null
+++ b/components/mus/public/cpp/tests/test_window_tree.h
@@ -0,0 +1,86 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_MUS_PUBLIC_CPP_TESTS_TEST_WINDOW_TREE_H_
+#define COMPONENTS_MUS_PUBLIC_CPP_TESTS_TEST_WINDOW_TREE_H_
+
+#include "base/macros.h"
+#include "components/mus/public/interfaces/window_tree.mojom.h"
+
+namespace mus {
+
+// Testing WindowTree implementation.
+class TestWindowTree : public mojom::WindowTree {
+ public:
+  TestWindowTree();
+  ~TestWindowTree() override;
+
+  // Returns the most recent change_id supplied to one of the WindowTree
+  // functions. Returns false if one of the WindowTree functions has not been
+  // invoked since the last GetAndClearChangeId().
+  bool GetAndClearChangeId(uint32_t* change_id);
+
+ private:
+  // mojom::WindowTree:
+  void NewWindow(uint32_t window_id,
+                 const NewWindowCallback& callback) override;
+  void DeleteWindow(uint32_t window_id,
+                    const DeleteWindowCallback& callback) override;
+  void SetWindowBounds(uint32_t change_id,
+                       uint32_t window_id,
+                       mojo::RectPtr bounds) override;
+  void SetClientArea(uint32_t window_id, mojo::InsetsPtr insets) override;
+  void SetWindowVisibility(
+      uint32_t window_id,
+      bool visible,
+      const SetWindowVisibilityCallback& callback) override;
+  void SetWindowProperty(uint32_t window_id,
+                         const mojo::String& name,
+                         mojo::Array<uint8_t> value,
+                         const SetWindowPropertyCallback& callback) override;
+  void RequestSurface(uint32_t window_id,
+                      mojom::SurfaceType type,
+                      mojo::InterfaceRequest<mojom::Surface> surface,
+                      mojom::SurfaceClientPtr client) override;
+  void AddWindow(uint32_t parent,
+                 uint32_t child,
+                 const AddWindowCallback& callback) override;
+  void RemoveWindowFromParent(
+      uint32_t window_id,
+      const RemoveWindowFromParentCallback& callback) override;
+  void ReorderWindow(uint32_t window_id,
+                     uint32_t relative_window_id,
+                     mojom::OrderDirection direction,
+                     const ReorderWindowCallback& callback) override;
+  void GetWindowTree(uint32_t window_id,
+                     const GetWindowTreeCallback& callback) override;
+  void Embed(uint32_t window_id,
+             mojom::WindowTreeClientPtr client,
+             uint32_t policy_bitmask,
+             const EmbedCallback& callback) override;
+  void SetFocus(uint32_t window_id) override;
+  void SetWindowTextInputState(uint32_t window_id,
+                               mojo::TextInputStatePtr state) override;
+  void SetImeVisibility(uint32_t window_id,
+                        bool visible,
+                        mojo::TextInputStatePtr state) override;
+  void SetPreferredSize(uint32_t window_id,
+                        mojo::SizePtr size,
+                        const SetPreferredSizeCallback& callback) override;
+  void SetShowState(uint32_t window_id,
+                    mojom::ShowState show_state,
+                    const SetShowStateCallback& callback) override;
+  void SetResizeBehavior(uint32_t window_id,
+                         mojom::ResizeBehavior resize_behavior) override;
+  void WmResponse(uint32_t change_id, bool response) override;
+
+  bool got_change_;
+  uint32_t change_id_;
+
+  DISALLOW_COPY_AND_ASSIGN(TestWindowTree);
+};
+
+}  // namespace mus
+
+#endif  // COMPONENTS_MUS_PUBLIC_CPP_TESTS_TEST_WINDOW_TREE_H_
diff --git a/components/mus/public/cpp/tests/window_tree_client_impl_unittest.cc b/components/mus/public/cpp/tests/window_tree_client_impl_unittest.cc
new file mode 100644
index 0000000..d2593c32
--- /dev/null
+++ b/components/mus/public/cpp/tests/window_tree_client_impl_unittest.cc
@@ -0,0 +1,170 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/mus/public/cpp/lib/window_tree_client_impl.h"
+
+#include "base/logging.h"
+#include "components/mus/public/cpp/lib/window_private.h"
+#include "components/mus/public/cpp/property_type_converters.h"
+#include "components/mus/public/cpp/tests/test_window.h"
+#include "components/mus/public/cpp/tests/test_window_tree.h"
+#include "components/mus/public/cpp/util.h"
+#include "components/mus/public/cpp/window.h"
+#include "components/mus/public/cpp/window_observer.h"
+#include "components/mus/public/cpp/window_property.h"
+#include "components/mus/public/cpp/window_tree_delegate.h"
+#include "mojo/converters/geometry/geometry_type_converters.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "ui/gfx/geometry/rect.h"
+
+namespace mus {
+
+class TestWindowTreeDelegate : public WindowTreeDelegate {
+ public:
+  TestWindowTreeDelegate() {}
+  ~TestWindowTreeDelegate() override {}
+
+  // WindowTreeDelegate:
+  void OnEmbed(Window* root) override {}
+  void OnConnectionLost(WindowTreeConnection* connection) override {}
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(TestWindowTreeDelegate);
+};
+
+class WindowTreeClientImplPrivate {
+ public:
+  WindowTreeClientImplPrivate(WindowTreeClientImpl* tree_client_impl)
+      : tree_client_impl_(tree_client_impl) {}
+  ~WindowTreeClientImplPrivate() {}
+
+  void Init(mojom::WindowTree* window_tree, uint32 access_policy) {
+    mojom::WindowDataPtr root_data(mojom::WindowData::New());
+    root_data->parent_id = 0;
+    root_data->window_id = 1;
+    root_data->bounds = mojo::Rect::From(gfx::Rect());
+    root_data->properties.mark_non_null();
+    root_data->visible = true;
+    root_data->drawn = true;
+    root_data->viewport_metrics = mojom::ViewportMetrics::New();
+    root_data->viewport_metrics->size_in_pixels =
+        mojo::Size::From(gfx::Size(1000, 1000));
+    root_data->viewport_metrics->device_pixel_ratio = 1;
+    tree_client_impl_->OnEmbedImpl(window_tree, 1, root_data.Pass(), 0,
+                                   access_policy);
+  }
+
+ private:
+  WindowTreeClientImpl* tree_client_impl_;
+
+  DISALLOW_COPY_AND_ASSIGN(WindowTreeClientImplPrivate);
+};
+
+class WindowTreeSetup {
+ public:
+  WindowTreeSetup() : tree_client_(&window_tree_delegate_, nullptr, nullptr) {
+    WindowTreeClientImplPrivate(&tree_client_)
+        .Init(&window_tree_, mojom::WindowTree::ACCESS_POLICY_DEFAULT);
+    window_tree_.GetAndClearChangeId(nullptr);
+  }
+
+  WindowTreeConnection* window_tree_connection() {
+    return static_cast<WindowTreeConnection*>(&tree_client_);
+  }
+
+  mojom::WindowTreeClient* window_tree_client() {
+    return static_cast<mojom::WindowTreeClient*>(&tree_client_);
+  }
+
+  TestWindowTree* window_tree() { return &window_tree_; }
+
+ private:
+  TestWindowTree window_tree_;
+  TestWindowTreeDelegate window_tree_delegate_;
+  WindowTreeClientImpl tree_client_;
+
+  DISALLOW_COPY_AND_ASSIGN(WindowTreeSetup);
+};
+
+using WindowTreeClientImplTest = testing::Test;
+
+// Verifies bounds are reverted if the server replied that the change failed.
+TEST_F(WindowTreeClientImplTest, SetBoundsFailed) {
+  WindowTreeSetup setup;
+  Window* root = setup.window_tree_connection()->GetRoot();
+  ASSERT_TRUE(root);
+  const gfx::Rect original_bounds(root->bounds());
+  const gfx::Rect new_bounds(gfx::Rect(0, 0, 100, 100));
+  ASSERT_NE(new_bounds, root->bounds());
+  root->SetBounds(new_bounds);
+  uint32_t change_id;
+  ASSERT_TRUE(setup.window_tree()->GetAndClearChangeId(&change_id));
+  setup.window_tree_client()->OnChangeCompleted(change_id, false);
+  EXPECT_EQ(original_bounds, root->bounds());
+}
+
+// Simulates a bounds change, and while the bounds change is in flight the
+// server replies with a new bounds and the original bounds change fails.
+TEST_F(WindowTreeClientImplTest, SetBoundsFailedWithPendingChange) {
+  WindowTreeSetup setup;
+  Window* root = setup.window_tree_connection()->GetRoot();
+  ASSERT_TRUE(root);
+  const gfx::Rect original_bounds(root->bounds());
+  const gfx::Rect new_bounds(gfx::Rect(0, 0, 100, 100));
+  ASSERT_NE(new_bounds, root->bounds());
+  root->SetBounds(new_bounds);
+  EXPECT_EQ(new_bounds, root->bounds());
+  uint32_t change_id;
+  ASSERT_TRUE(setup.window_tree()->GetAndClearChangeId(&change_id));
+
+  // Simulate the server responding with a bounds change.
+  const gfx::Rect server_changed_bounds(gfx::Rect(0, 0, 101, 102));
+  setup.window_tree_client()->OnWindowBoundsChanged(
+      root->id(), mojo::Rect::From(original_bounds),
+      mojo::Rect::From(server_changed_bounds));
+
+  // This shouldn't trigger the bounds changing yet.
+  EXPECT_EQ(new_bounds, root->bounds());
+
+  // Tell the client the change failed, which should trigger failing to the
+  // most recent bounds from server.
+  setup.window_tree_client()->OnChangeCompleted(change_id, false);
+  EXPECT_EQ(server_changed_bounds, root->bounds());
+
+  // Simulate server changing back to original bounds. Should take immediately.
+  setup.window_tree_client()->OnWindowBoundsChanged(
+      root->id(), mojo::Rect::From(server_changed_bounds),
+      mojo::Rect::From(original_bounds));
+  EXPECT_EQ(original_bounds, root->bounds());
+}
+
+TEST_F(WindowTreeClientImplTest, TwoInFlightBoundsChangesBothCanceled) {
+  WindowTreeSetup setup;
+  Window* root = setup.window_tree_connection()->GetRoot();
+  ASSERT_TRUE(root);
+  const gfx::Rect original_bounds(root->bounds());
+  const gfx::Rect bounds1(gfx::Rect(0, 0, 100, 100));
+  const gfx::Rect bounds2(gfx::Rect(0, 0, 100, 102));
+  root->SetBounds(bounds1);
+  EXPECT_EQ(bounds1, root->bounds());
+  uint32_t change_id1;
+  ASSERT_TRUE(setup.window_tree()->GetAndClearChangeId(&change_id1));
+
+  root->SetBounds(bounds2);
+  EXPECT_EQ(bounds2, root->bounds());
+  uint32_t change_id2;
+  ASSERT_TRUE(setup.window_tree()->GetAndClearChangeId(&change_id2));
+
+  // Tell the client change 1 failed. As there is a still a change in flight
+  // nothing should happen.
+  setup.window_tree_client()->OnChangeCompleted(change_id1, false);
+  EXPECT_EQ(bounds2, root->bounds());
+
+  // And tell the client change 2 failed too. Should now fallback to original
+  // bounds.
+  setup.window_tree_client()->OnChangeCompleted(change_id2, false);
+  EXPECT_EQ(original_bounds, root->bounds());
+}
+
+}  // namespace mus
diff --git a/components/mus/ws/BUILD.gn b/components/mus/ws/BUILD.gn
index 7a186d6..2757e75 100644
--- a/components/mus/ws/BUILD.gn
+++ b/components/mus/ws/BUILD.gn
@@ -40,19 +40,12 @@
     "server_window_surface.h",
     "server_window_surface_manager.cc",
     "server_window_surface_manager.h",
-    "transient_window_manager.cc",
-    "transient_window_manager.h",
-    "transient_window_observer.h",
-    "transient_window_stacking_client.cc",
-    "transient_window_stacking_client.h",
     "window_coordinate_conversions.cc",
     "window_coordinate_conversions.h",
     "window_finder.cc",
     "window_finder.h",
     "window_manager_access_policy.cc",
     "window_manager_access_policy.h",
-    "window_stacking_client.cc",
-    "window_stacking_client.h",
     "window_tree_host_connection.cc",
     "window_tree_host_connection.h",
     "window_tree_host_delegate.h",
@@ -60,8 +53,6 @@
     "window_tree_host_impl.h",
     "window_tree_impl.cc",
     "window_tree_impl.h",
-    "window_utils.cc",
-    "window_utils.h",
   ]
 
   deps = [
@@ -69,6 +60,7 @@
     "//cc",
     "//cc/surfaces",
     "//cc/surfaces:surface_id",
+    "//components/mus/common",
     "//components/mus/gles2:gles2",
     "//components/mus/public/cpp:common",
     "//components/mus/public/interfaces",
@@ -127,7 +119,7 @@
     "server_window_drawn_tracker_unittest.cc",
     "test_server_window_delegate.cc",
     "test_server_window_delegate.h",
-    "transient_window_manager_unittest.cc",
+    "transient_windows_unittest.cc",
     "window_coordinate_conversions_unittest.cc",
     "window_tree_unittest.cc",
   ]
diff --git a/components/mus/ws/server_window.cc b/components/mus/ws/server_window.cc
index e29c0aa..458cb9a 100644
--- a/components/mus/ws/server_window.cc
+++ b/components/mus/ws/server_window.cc
@@ -7,10 +7,10 @@
 #include <inttypes.h>
 
 #include "base/strings/stringprintf.h"
+#include "components/mus/common/transient_window_utils.h"
 #include "components/mus/ws/server_window_delegate.h"
 #include "components/mus/ws/server_window_observer.h"
 #include "components/mus/ws/server_window_surface_manager.h"
-#include "components/mus/ws/window_stacking_client.h"
 #include "mojo/converters/geometry/geometry_type_converters.h"
 
 namespace mus {
@@ -21,6 +21,8 @@
     : delegate_(delegate),
       id_(id),
       parent_(nullptr),
+      stacking_target_(nullptr),
+      transient_parent_(nullptr),
       visible_(false),
       opacity_(1),
       // Don't notify newly added observers during notification. This causes
@@ -35,6 +37,16 @@
   FOR_EACH_OBSERVER(ServerWindowObserver, observers_,
                     OnWillDestroyWindow(this));
 
+  if (transient_parent_)
+    transient_parent_->RemoveTransientWindow(this);
+
+  // Destroy transient children, only after we've removed ourselves from our
+  // parent, as destroying an active transient child may otherwise attempt to
+  // refocus us.
+  Windows transient_children(transient_children_);
+  STLDeleteElements(&transient_children);
+  DCHECK(transient_children_.empty());
+
   while (!children_.empty())
     children_.front()->parent()->Remove(children_.front());
 
@@ -67,7 +79,7 @@
   if (child->parent() == this) {
     if (children_.size() == 1)
       return;  // Already in the right position.
-    Reorder(child, children_.back(), mojom::ORDER_DIRECTION_ABOVE);
+    child->Reorder(children_.back(), mojom::ORDER_DIRECTION_ABOVE);
     return;
   }
 
@@ -80,6 +92,11 @@
 
   child->parent_ = this;
   children_.push_back(child);
+
+  // Stack the child properly if it is a transient child of a sibling.
+  if (child->transient_parent_ && child->transient_parent_->parent() == this)
+    RestackTransientDescendants(child->transient_parent_, &GetStackingTarget);
+
   FOR_EACH_OBSERVER(ServerWindowObserver, child->observers_,
                     OnWindowHierarchyChanged(child, this, old_parent));
 }
@@ -93,49 +110,55 @@
   FOR_EACH_OBSERVER(ServerWindowObserver, child->observers_,
                     OnWillChangeWindowHierarchy(child, nullptr, this));
   RemoveImpl(child);
+
+  // Stack the child properly if it is a transient child of a sibling.
+  if (child->transient_parent_ && child->transient_parent_->parent() == this)
+    RestackTransientDescendants(child->transient_parent_, &GetStackingTarget);
+
   FOR_EACH_OBSERVER(ServerWindowObserver, child->observers_,
                     OnWindowHierarchyChanged(child, nullptr, this));
 }
 
-void ServerWindow::Reorder(ServerWindow* child,
-                           ServerWindow* relative,
+void ServerWindow::Reorder(ServerWindow* relative,
                            mojom::OrderDirection direction) {
-  // We assume validation checks happened else where.
-  DCHECK(child);
-  DCHECK(child->parent() == this);
-  DCHECK_GT(children_.size(), 1u);
+  ServerWindow* window = this;
+  DCHECK(relative);
+  DCHECK_NE(window, relative);
+  DCHECK_EQ(window->parent(), relative->parent());
 
-  WindowStackingClient* stacking_client = GetWindowStackingClient();
-  if (stacking_client &&
-      !stacking_client->AdjustStacking(&child, &relative, &direction))
+  if (!AdjustStackingForTransientWindows(&window, &relative, &direction,
+                                         stacking_target_))
     return;
 
-  children_.erase(std::find(children_.begin(), children_.end(), child));
-  Windows::iterator i = std::find(children_.begin(), children_.end(), relative);
+  window->parent_->children_.erase(std::find(window->parent_->children_.begin(),
+                                             window->parent_->children_.end(),
+                                             window));
+  Windows::iterator i = std::find(window->parent_->children_.begin(),
+                                  window->parent_->children_.end(), relative);
   if (direction == mojom::ORDER_DIRECTION_ABOVE) {
-    DCHECK(i != children_.end());
-    children_.insert(++i, child);
+    DCHECK(i != window->parent_->children_.end());
+    window->parent_->children_.insert(++i, window);
   } else if (direction == mojom::ORDER_DIRECTION_BELOW) {
-    DCHECK(i != children_.end());
-    children_.insert(i, child);
+    DCHECK(i != window->parent_->children_.end());
+    window->parent_->children_.insert(i, window);
   }
   FOR_EACH_OBSERVER(ServerWindowObserver, observers_,
                     OnWindowReordered(this, relative, direction));
-  child->OnStackingChanged();
+  window->OnStackingChanged();
 }
 
 void ServerWindow::StackChildAtBottom(ServerWindow* child) {
   // There's nothing to do if the child is already at the bottom.
   if (children_.size() <= 1 || child == children_.front())
     return;
-  Reorder(child, children_.front(), mojom::ORDER_DIRECTION_BELOW);
+  child->Reorder(children_.front(), mojom::ORDER_DIRECTION_BELOW);
 }
 
 void ServerWindow::StackChildAtTop(ServerWindow* child) {
   // There's nothing to do if the child is already at the top.
   if (children_.size() <= 1 || child == children_.back())
     return;
-  Reorder(child, children_.back(), mojom::ORDER_DIRECTION_ABOVE);
+  child->Reorder(children_.back(), mojom::ORDER_DIRECTION_ABOVE);
 }
 
 void ServerWindow::SetBounds(const gfx::Rect& bounds) {
@@ -190,6 +213,42 @@
   return nullptr;
 }
 
+void ServerWindow::AddTransientWindow(ServerWindow* child) {
+  if (child->transient_parent())
+    child->transient_parent()->RemoveTransientWindow(child);
+
+  DCHECK(std::find(transient_children_.begin(), transient_children_.end(),
+                   child) == transient_children_.end());
+  transient_children_.push_back(child);
+  child->transient_parent_ = this;
+
+  // Restack |child| properly above its transient parent, if they share the same
+  // parent.
+  if (child->parent() == parent())
+    RestackTransientDescendants(this, &GetStackingTarget);
+
+  FOR_EACH_OBSERVER(ServerWindowObserver, observers_,
+                    OnTransientWindowAdded(this, child));
+}
+
+void ServerWindow::RemoveTransientWindow(ServerWindow* child) {
+  Windows::iterator i =
+      std::find(transient_children_.begin(), transient_children_.end(), child);
+  DCHECK(i != transient_children_.end());
+  transient_children_.erase(i);
+  DCHECK_EQ(this, child->transient_parent());
+  child->transient_parent_ = nullptr;
+
+  // If |child| and its former transient parent share the same parent, |child|
+  // should be restacked properly so it is not among transient children of its
+  // former parent, anymore.
+  if (parent() == child->parent())
+    RestackTransientDescendants(this, &GetStackingTarget);
+
+  FOR_EACH_OBSERVER(ServerWindowObserver, observers_,
+                    OnTransientWindowRemoved(this, child));
+}
+
 bool ServerWindow::Contains(const ServerWindow* window) const {
   for (const ServerWindow* parent = window; parent; parent = parent->parent_) {
     if (parent == this)
@@ -231,7 +290,8 @@
     if (value && it->second == *value)
       return;
   } else if (!value) {
-    // This property isn't set in |properties_| and |value| is NULL, so there's
+    // This property isn't set in |properties_| and |value| is nullptr, so
+    // there's
     // no change.
     return;
   }
@@ -293,13 +353,26 @@
 #endif
 
 void ServerWindow::RemoveImpl(ServerWindow* window) {
-  window->parent_ = NULL;
+  window->parent_ = nullptr;
   children_.erase(std::find(children_.begin(), children_.end(), window));
 }
 
 void ServerWindow::OnStackingChanged() {
-  FOR_EACH_OBSERVER(ServerWindowObserver, observers_,
-                    OnWindowStackingChanged(this));
+  if (stacking_target_) {
+    Windows::const_iterator window_i = std::find(
+        parent()->children().begin(), parent()->children().end(), this);
+    DCHECK(window_i != parent()->children().end());
+    if (window_i != parent()->children().begin() &&
+        (*(window_i - 1) == stacking_target_)) {
+      return;
+    }
+  }
+  RestackTransientDescendants(this, &GetStackingTarget);
+}
+
+// static
+ServerWindow** ServerWindow::GetStackingTarget(ServerWindow* window) {
+  return &window->stacking_target_;
 }
 
 }  // namespace ws
diff --git a/components/mus/ws/server_window.h b/components/mus/ws/server_window.h
index 5f34873..62748a4 100644
--- a/components/mus/ws/server_window.h
+++ b/components/mus/ws/server_window.h
@@ -57,9 +57,7 @@
 
   void Add(ServerWindow* child);
   void Remove(ServerWindow* child);
-  void Reorder(ServerWindow* child,
-               ServerWindow* relative,
-               mojom::OrderDirection direction);
+  void Reorder(ServerWindow* releative, mojom::OrderDirection diretion);
   void StackChildAtBottom(ServerWindow* child);
   void StackChildAtTop(ServerWindow* child);
 
@@ -88,6 +86,15 @@
   // subtree of |this|.
   ServerWindow* GetChildWindow(const WindowId& id);
 
+  // Transient window management.
+  void AddTransientWindow(ServerWindow* child);
+  void RemoveTransientWindow(ServerWindow* child);
+
+  ServerWindow* transient_parent() { return transient_parent_; }
+  const ServerWindow* transient_parent() const { return transient_parent_; }
+
+  const Windows& transient_children() const { return transient_children_; }
+
   // Returns true if this contains |window| or is |window|.
   bool Contains(const ServerWindow* window) const;
 
@@ -135,10 +142,22 @@
   // Called when this window's stacking order among its siblings is changed.
   void OnStackingChanged();
 
+  // Returns a pointer to the stacking target that can be used by
+  // RestackTransientDescendants.
+  static ServerWindow** GetStackingTarget(ServerWindow* window);
+
   ServerWindowDelegate* delegate_;
   const WindowId id_;
   ServerWindow* parent_;
   Windows children_;
+
+  // Transient window management.
+  // If non-null we're actively restacking transient as the result of a
+  // transient ancestor changing.
+  ServerWindow* stacking_target_;
+  ServerWindow* transient_parent_;
+  Windows transient_children_;
+
   bool visible_;
   gfx::Rect bounds_;
   gfx::Insets client_area_;
diff --git a/components/mus/ws/server_window_observer.h b/components/mus/ws/server_window_observer.h
index 952610bc..61d5d16 100644
--- a/components/mus/ws/server_window_observer.h
+++ b/components/mus/ws/server_window_observer.h
@@ -30,8 +30,7 @@
   virtual void OnWillDestroyWindow(ServerWindow* window) {}
 
   // Invoked at the end of the window's destructor (after it has been removed
-  // from
-  // the hierarchy.
+  // from the hierarchy.
   virtual void OnWindowDestroyed(ServerWindow* window) {}
 
   virtual void OnWillChangeWindowHierarchy(ServerWindow* window,
@@ -54,8 +53,6 @@
                                  ServerWindow* relative,
                                  mojom::OrderDirection direction) {}
 
-  virtual void OnWindowStackingChanged(ServerWindow* window) {}
-
   virtual void OnWillChangeWindowVisibility(ServerWindow* window) {}
   virtual void OnWindowVisibilityChanged(ServerWindow* window) {}
 
@@ -67,6 +64,14 @@
       const std::string& name,
       const std::vector<uint8_t>* new_data) {}
 
+  // Called when a transient child is added to |window|.
+  virtual void OnTransientWindowAdded(ServerWindow* window,
+                                      ServerWindow* transient_child) {}
+
+  // Called when a transient child is removed from |window|.
+  virtual void OnTransientWindowRemoved(ServerWindow* window,
+                                        ServerWindow* transient_child) {}
+
  protected:
   virtual ~ServerWindowObserver() {}
 };
diff --git a/components/mus/ws/transient_window_manager.cc b/components/mus/ws/transient_window_manager.cc
deleted file mode 100644
index 81f0977..0000000
--- a/components/mus/ws/transient_window_manager.cc
+++ /dev/null
@@ -1,180 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "components/mus/ws/transient_window_manager.h"
-
-#include <vector>
-
-#include "base/auto_reset.h"
-#include "base/lazy_instance.h"
-#include "base/stl_util.h"
-#include "components/mus/ws/server_window.h"
-#include "components/mus/ws/transient_window_observer.h"
-#include "components/mus/ws/window_utils.h"
-
-namespace mus {
-namespace ws {
-
-namespace {
-using TransientWindowManagerMap =
-    std::map<const ServerWindow*, TransientWindowManager*>;
-
-static base::LazyInstance<TransientWindowManagerMap>
-    transient_window_manager_map = LAZY_INSTANCE_INITIALIZER;
-}
-
-TransientWindowManager::~TransientWindowManager() {}
-
-// static
-TransientWindowManager* TransientWindowManager::GetOrCreate(
-    ServerWindow* window) {
-  TransientWindowManagerMap* map = transient_window_manager_map.Pointer();
-  auto it = map->find(window);
-  if (it != map->end())
-    return it->second;
-  TransientWindowManager* manager = new TransientWindowManager(window);
-  transient_window_manager_map.Get().insert(std::make_pair(window, manager));
-  return manager;
-}
-
-// static
-TransientWindowManager* TransientWindowManager::Get(ServerWindow* window) {
-  return const_cast<TransientWindowManager*>(
-      Get(const_cast<const ServerWindow*>(window)));
-}
-
-const TransientWindowManager* TransientWindowManager::Get(
-    const ServerWindow* window) {
-  TransientWindowManagerMap* map = transient_window_manager_map.Pointer();
-  auto it = map->find(window);
-  return it == map->end() ? nullptr : it->second;
-}
-
-void TransientWindowManager::AddObserver(TransientWindowObserver* observer) {
-  observers_.AddObserver(observer);
-}
-
-void TransientWindowManager::RemoveObserver(TransientWindowObserver* observer) {
-  observers_.RemoveObserver(observer);
-}
-
-void TransientWindowManager::AddTransientChild(ServerWindow* child) {
-  TransientWindowManager* child_manager = GetOrCreate(child);
-  if (child_manager->transient_parent_)
-    Get(child_manager->transient_parent_)->RemoveTransientChild(child);
-  DCHECK(std::find(transient_children_.begin(), transient_children_.end(),
-                   child) == transient_children_.end());
-  transient_children_.push_back(child);
-  child_manager->transient_parent_ = window_;
-
-  // Restack |child| properly above its transient parent, if they share the same
-  // parent.
-  if (child->parent() == window_->parent())
-    RestackTransientDescendants();
-
-  FOR_EACH_OBSERVER(TransientWindowObserver, observers_,
-                    OnTransientChildAdded(window_, child));
-}
-
-void TransientWindowManager::RemoveTransientChild(ServerWindow* child) {
-  Windows::iterator i =
-      std::find(transient_children_.begin(), transient_children_.end(), child);
-  DCHECK(i != transient_children_.end());
-  transient_children_.erase(i);
-  TransientWindowManager* child_manager = Get(child);
-  DCHECK(child_manager);
-  DCHECK_EQ(window_, child_manager->transient_parent_);
-  child_manager->transient_parent_ = nullptr;
-
-  // If |child| and its former transient parent share the same parent, |child|
-  // should be restacked properly so it is not among transient children of its
-  // former parent, anymore.
-  if (window_->parent() == child->parent())
-    RestackTransientDescendants();
-
-  FOR_EACH_OBSERVER(TransientWindowObserver, observers_,
-                    OnTransientChildRemoved(window_, child));
-}
-
-bool TransientWindowManager::IsStackingTransient(
-    const ServerWindow* target) const {
-  return stacking_target_ == target;
-}
-
-TransientWindowManager::TransientWindowManager(ServerWindow* window)
-    : window_(window), transient_parent_(nullptr), stacking_target_(nullptr) {
-  window_->AddObserver(this);
-}
-
-void TransientWindowManager::RestackTransientDescendants() {
-  ServerWindow* parent = window_->parent();
-  if (!parent)
-    return;
-
-  // stack any transient children that share the same parent to be in front of
-  // |window_|. the existing stacking order is preserved by iterating backwards
-  // and always stacking on top.
-  Windows children(parent->children());
-  for (auto it = children.rbegin(); it != children.rend(); ++it) {
-    if ((*it) != window_ && HasTransientAncestor(*it, window_)) {
-      TransientWindowManager* descendant_manager = GetOrCreate(*it);
-      base::AutoReset<ServerWindow*> resetter(
-          &descendant_manager->stacking_target_, window_);
-      parent->Reorder((*it), window_, mojom::ORDER_DIRECTION_ABOVE);
-    }
-  }
-}
-
-void TransientWindowManager::OnWillDestroyWindow(ServerWindow* window) {
-  // Removes ourselves from our transient parent (if it hasn't been done by the
-  // RootWindow).
-  if (transient_parent_) {
-    TransientWindowManager::Get(transient_parent_)
-        ->RemoveTransientChild(window_);
-  }
-
-  // Destroy transient children, only after we've removed ourselves from our
-  // parent, as destroying an active transient child may otherwise attempt to
-  // refocus us.
-  Windows transient_children(transient_children_);
-  STLDeleteElements(&transient_children);
-  DCHECK(transient_children_.empty());
-}
-
-void TransientWindowManager::OnWindowStackingChanged(ServerWindow* window) {
-  // Do nothing if we initiated the stacking change.
-  const TransientWindowManager* transient_manager = Get(window);
-  if (transient_manager && transient_manager->stacking_target_) {
-    Windows::const_iterator window_i =
-        std::find(window->parent()->children().begin(),
-                  window->parent()->children().end(), window);
-    DCHECK(window_i != window->parent()->children().end());
-    if (window_i != window->parent()->children().begin() &&
-        (*(window_i - 1) == transient_manager->stacking_target_))
-      return;
-  }
-
-  RestackTransientDescendants();
-}
-
-void TransientWindowManager::OnWindowDestroyed(ServerWindow* window) {
-  transient_window_manager_map.Get().erase(window_);
-  delete this;
-}
-
-void TransientWindowManager::OnWindowHierarchyChanged(
-    ServerWindow* window,
-    ServerWindow* new_parent,
-    ServerWindow* old_parent) {
-  DCHECK_EQ(window_, window);
-  // Stack |window| properly if it is transient child of a sibling.
-  ServerWindow* transient_parent = GetTransientParent(window);
-  if (transient_parent && transient_parent->parent() == new_parent) {
-    TransientWindowManager* transient_parent_manager = Get(transient_parent);
-    transient_parent_manager->RestackTransientDescendants();
-  }
-}
-
-}  // namespace ws
-}  // namespace mus
diff --git a/components/mus/ws/transient_window_manager.h b/components/mus/ws/transient_window_manager.h
deleted file mode 100644
index 543ab13..0000000
--- a/components/mus/ws/transient_window_manager.h
+++ /dev/null
@@ -1,91 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef COMPONENTS_MUS_WS_TRANSIENT_WINDOW_MANAGER_H_
-#define COMPONENTS_MUS_WS_TRANSIENT_WINDOW_MANAGER_H_
-
-#include "base/macros.h"
-#include "base/observer_list.h"
-#include "components/mus/ws/server_window_observer.h"
-
-namespace mus {
-namespace ws {
-
-class TransientWindowObserver;
-
-// TransientWindowManager manages the set of transient children for a window
-// along with the transient parent. Transient children get the following
-// behavior:
-// . The transient parent destroys any transient children when it is
-//   destroyed. This means a transient child is destroyed if either its parent
-//   or transient parent is destroyed.
-// . TODO(fsamuel): If a transient child and its transient parent share the same
-//   parent, then transient children are always ordered above the transient
-//   parent.
-// Transient windows are typically used for popups and menus.
-class TransientWindowManager : public ServerWindowObserver {
- public:
-  using Windows = std::vector<ServerWindow*>;
-
-  ~TransientWindowManager() override;
-
-  // Returns the TransientWindowManager for |window|. This never returns
-  // nullptr.
-  static TransientWindowManager* GetOrCreate(ServerWindow* window);
-
-  // Returns the TransientWindowManager for |window| only if it already exists.
-  // WARNING: this may return nullptr.
-  static TransientWindowManager* Get(ServerWindow* window);
-  static const TransientWindowManager* Get(const ServerWindow* window);
-
-  void AddObserver(TransientWindowObserver* observer);
-  void RemoveObserver(TransientWindowObserver* observer);
-
-  void AddTransientChild(ServerWindow* child);
-  void RemoveTransientChild(ServerWindow* child);
-
-  const Windows& transient_children() const { return transient_children_; }
-
-  ServerWindow* transient_parent() { return transient_parent_; }
-  const ServerWindow* transient_parent() const { return transient_parent_; }
-
-  // Returns true if in the process of stacking |window_| on top of |target|.
-  // That is, when the stacking order of a window changes
-  // (OnWindowStackingChanged()) the transients may get restacked as well. This
-  // function can be used to detect if TransientWindowManager is in the process
-  // of stacking a transient as the result of window stacking changing.
-  bool IsStackingTransient(const ServerWindow* target) const;
-
- private:
-  explicit TransientWindowManager(ServerWindow* window);
-
-  // Stacks transient descendants of this window that are its siblings just
-  // above it.
-  void RestackTransientDescendants();
-
-  // ServerWindowObserver:
-  void OnWillDestroyWindow(ServerWindow* window) override;
-  void OnWindowStackingChanged(ServerWindow* window) override;
-  void OnWindowDestroyed(ServerWindow* window) override;
-  void OnWindowHierarchyChanged(ServerWindow* window,
-                                ServerWindow* new_parent,
-                                ServerWindow* old_parent) override;
-
-  ServerWindow* window_;
-  ServerWindow* transient_parent_;
-  Windows transient_children_;
-
-  // If non-null we're actively restacking transient as the result of a
-  // transient ancestor changing.
-  ServerWindow* stacking_target_;
-
-  base::ObserverList<TransientWindowObserver> observers_;
-
-  DISALLOW_COPY_AND_ASSIGN(TransientWindowManager);
-};
-
-}  // namespace ws
-}  // namespace mus
-
-#endif  // COMPONENTS_MUS_WS_TRANSIENT_WINDOW_MANAGER_H_
diff --git a/components/mus/ws/transient_window_observer.h b/components/mus/ws/transient_window_observer.h
deleted file mode 100644
index 8485250..0000000
--- a/components/mus/ws/transient_window_observer.h
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef COMPONENTS_MUS_WS_TRANSIENT_WINDOW_OBSERVER_H_
-#define COMPONENTS_MUS_WS_TRANSIENT_WINDOW_OBSERVER_H_
-
-namespace mus {
-namespace ws {
-
-class TransientWindowObserver {
- public:
-  // Called when a transient child is added to |window|.
-  virtual void OnTransientChildAdded(ServerWindow* window,
-                                     ServerWindow* transient_child) = 0;
-
-  // Called when a transient child is removed from |window|.
-  virtual void OnTransientChildRemoved(ServerWindow* window,
-                                       ServerWindow* transient_child) = 0;
-
- protected:
-  virtual ~TransientWindowObserver() {}
-};
-
-}  // namespace ws
-}  // namespace mus
-
-#endif  // COMPONENTS_MUS_WS_TRANSIENT_WINDOW_OBSERVER_H_
diff --git a/components/mus/ws/transient_window_stacking_client.cc b/components/mus/ws/transient_window_stacking_client.cc
deleted file mode 100644
index 3ca2bebd..0000000
--- a/components/mus/ws/transient_window_stacking_client.cc
+++ /dev/null
@@ -1,103 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "components/mus/ws/transient_window_stacking_client.h"
-
-#include <algorithm>
-
-#include "components/mus/ws/server_window.h"
-#include "components/mus/ws/transient_window_manager.h"
-#include "components/mus/ws/window_utils.h"
-
-namespace mus {
-namespace ws {
-
-namespace {
-
-// Populates |ancestors| with all transient ancestors of |window| that are
-// siblings of |window|. Returns true if any ancestors were found, false if not.
-bool GetAllTransientAncestors(ServerWindow* window,
-                              ServerWindow::Windows* ancestors) {
-  ServerWindow* parent = window->parent();
-  for (; window; window = GetTransientParent(window)) {
-    if (window->parent() == parent)
-      ancestors->push_back(window);
-  }
-  return !ancestors->empty();
-}
-
-// Replaces |window1| and |window2| with their possible transient ancestors that
-// are still siblings (have a common transient parent).  |window1| and |window2|
-// are not modified if such ancestors cannot be found.
-void FindCommonTransientAncestor(ServerWindow** window1,
-                                 ServerWindow** window2) {
-  DCHECK(window1);
-  DCHECK(window2);
-  DCHECK(*window1);
-  DCHECK(*window2);
-  // Assemble chains of ancestors of both windows.
-  ServerWindow::Windows ancestors1;
-  ServerWindow::Windows ancestors2;
-  if (!GetAllTransientAncestors(*window1, &ancestors1) ||
-      !GetAllTransientAncestors(*window2, &ancestors2)) {
-    return;
-  }
-  // Walk the two chains backwards and look for the first difference.
-  ServerWindow::Windows::reverse_iterator it1 = ancestors1.rbegin();
-  ServerWindow::Windows::reverse_iterator it2 = ancestors2.rbegin();
-  for (; it1 != ancestors1.rend() && it2 != ancestors2.rend(); ++it1, ++it2) {
-    if (*it1 != *it2) {
-      *window1 = *it1;
-      *window2 = *it2;
-      break;
-    }
-  }
-}
-
-}  // namespace
-
-// static
-TransientWindowStackingClient* TransientWindowStackingClient::instance_ = NULL;
-
-TransientWindowStackingClient::TransientWindowStackingClient() {
-  instance_ = this;
-}
-
-TransientWindowStackingClient::~TransientWindowStackingClient() {
-  if (instance_ == this)
-    instance_ = NULL;
-}
-
-bool TransientWindowStackingClient::AdjustStacking(
-    ServerWindow** child,
-    ServerWindow** target,
-    mojom::OrderDirection* direction) {
-  const TransientWindowManager* transient_manager =
-      TransientWindowManager::Get(static_cast<const ServerWindow*>(*child));
-  if (transient_manager && transient_manager->IsStackingTransient(*target))
-    return true;
-
-  // For windows that have transient children stack the transient ancestors that
-  // are siblings. This prevents one transient group from being inserted in the
-  // middle of another.
-  FindCommonTransientAncestor(child, target);
-
-  // When stacking above skip to the topmost transient descendant of the target.
-  if (*direction == mojom::ORDER_DIRECTION_ABOVE &&
-      !HasTransientAncestor(*child, *target)) {
-    const ServerWindow::Windows& siblings((*child)->parent()->children());
-    size_t target_i =
-        std::find(siblings.begin(), siblings.end(), *target) - siblings.begin();
-    while (target_i + 1 < siblings.size() &&
-           HasTransientAncestor(siblings[target_i + 1], *target)) {
-      ++target_i;
-    }
-    *target = siblings[target_i];
-  }
-
-  return *child != *target;
-}
-
-}  // namespace ws
-}  // namespace mus
diff --git a/components/mus/ws/transient_window_stacking_client.h b/components/mus/ws/transient_window_stacking_client.h
deleted file mode 100644
index e336a7bd..0000000
--- a/components/mus/ws/transient_window_stacking_client.h
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef COMPONENTS_MUS_WS_TRANSIENT_WINDOW_STACKING_CLIENT_H_
-#define COMPONENTS_MUS_WS_TRANSIENT_WINDOW_STACKING_CLIENT_H_
-
-#include "components/mus/ws/window_stacking_client.h"
-
-#include "base/macros.h"
-
-namespace mus {
-namespace ws {
-
-class TransientWindowManager;
-
-class TransientWindowStackingClient : public WindowStackingClient {
- public:
-  TransientWindowStackingClient();
-  ~TransientWindowStackingClient() override;
-
-  // WindowStackingClient:
-  bool AdjustStacking(ServerWindow** child,
-                      ServerWindow** target,
-                      mojom::OrderDirection* direction) override;
-
- private:
-  // Purely for DCHECKs.
-  friend class TransientWindowManager;
-
-  static TransientWindowStackingClient* instance_;
-
-  DISALLOW_COPY_AND_ASSIGN(TransientWindowStackingClient);
-};
-
-}  // namespace ws
-}  // namespace mus
-
-#endif  // COMPONENTS_MUS_WS_TRANSIENT_WINDOW_STACKING_CLIENT_H_
diff --git a/components/mus/ws/transient_window_manager_unittest.cc b/components/mus/ws/transient_windows_unittest.cc
similarity index 75%
rename from components/mus/ws/transient_window_manager_unittest.cc
rename to components/mus/ws/transient_windows_unittest.cc
index c33f95df..741fd31 100644
--- a/components/mus/ws/transient_window_manager_unittest.cc
+++ b/components/mus/ws/transient_windows_unittest.cc
@@ -4,11 +4,8 @@
 
 #include "base/strings/string_number_conversions.h"
 #include "components/mus/ws/server_window.h"
+#include "components/mus/ws/server_window_observer.h"
 #include "components/mus/ws/test_server_window_delegate.h"
-#include "components/mus/ws/transient_window_manager.h"
-#include "components/mus/ws/transient_window_observer.h"
-#include "components/mus/ws/transient_window_stacking_client.h"
-#include "components/mus/ws/window_utils.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace mus {
@@ -16,7 +13,7 @@
 
 namespace {
 
-class TestTransientWindowObserver : public TransientWindowObserver {
+class TestTransientWindowObserver : public ServerWindowObserver {
  public:
   TestTransientWindowObserver() : add_count_(0), remove_count_(0) {}
 
@@ -26,12 +23,12 @@
   int remove_count() const { return remove_count_; }
 
   // TransientWindowObserver overrides:
-  void OnTransientChildAdded(ServerWindow* window,
-                             ServerWindow* transient) override {
+  void OnTransientWindowAdded(ServerWindow* window,
+                              ServerWindow* transient) override {
     add_count_++;
   }
-  void OnTransientChildRemoved(ServerWindow* window,
-                               ServerWindow* transient) override {
+  void OnTransientWindowRemoved(ServerWindow* window,
+                                ServerWindow* transient) override {
     remove_count_++;
   }
 
@@ -67,24 +64,16 @@
 
 }  // namespace
 
-class TransientWindowManagerTest : public testing::Test {
+class TransientWindowsTest : public testing::Test {
  public:
-  TransientWindowManagerTest() {}
-  ~TransientWindowManagerTest() override {}
-
-  void SetUp() override {
-    client_.reset(new TransientWindowStackingClient);
-    SetWindowStackingClient(client_.get());
-  }
-
-  void TearDown() override { SetWindowStackingClient(nullptr); }
+  TransientWindowsTest() {}
+  ~TransientWindowsTest() override {}
 
  private:
-  scoped_ptr<TransientWindowStackingClient> client_;
-  DISALLOW_COPY_AND_ASSIGN(TransientWindowManagerTest);
+  DISALLOW_COPY_AND_ASSIGN(TransientWindowsTest);
 };
 
-TEST_F(TransientWindowManagerTest, TransientChildren) {
+TEST_F(TransientWindowsTest, TransientChildren) {
   TestServerWindowDelegate server_window_delegate;
 
   scoped_ptr<ServerWindow> parent(
@@ -98,7 +87,7 @@
       CreateTestWindow(&server_window_delegate, WindowId(1, 3), parent.get());
 
   // w2 is now owned by w1.
-  AddTransientChild(w1.get(), w2);
+  w1->AddTransientWindow(w2);
   // Stack w1 at the top (end), this should force w2 to be last (on top of w1).
   parent->StackChildAtTop(w1.get());
   ASSERT_EQ(3u, parent->children().size());
@@ -112,7 +101,7 @@
 }
 
 // Tests that transient children are stacked as a unit when using stack above.
-TEST_F(TransientWindowManagerTest, TransientChildrenGroupAbove) {
+TEST_F(TransientWindowsTest, TransientChildrenGroupAbove) {
   TestServerWindowDelegate server_window_delegate;
 
   scoped_ptr<ServerWindow> parent(
@@ -138,17 +127,17 @@
   ASSERT_EQ(8u, parent->children().size());
 
   // w11 is now owned by w1.
-  AddTransientChild(w1.get(), w11);
+  w1->AddTransientWindow(w11);
   // w21 is now owned by w2.
-  AddTransientChild(w2.get(), w21);
+  w2->AddTransientWindow(w21);
   // w22 is now owned by w2.
-  AddTransientChild(w2.get(), w22);
+  w2->AddTransientWindow(w22);
   // w211 is now owned by w21.
-  AddTransientChild(w21, w211);
+  w21->AddTransientWindow(w211);
   // w212 is now owned by w21.
-  AddTransientChild(w21, w212);
+  w21->AddTransientWindow(w212);
   // w213 is now owned by w21.
-  AddTransientChild(w21, w213);
+  w21->AddTransientWindow(w213);
   EXPECT_EQ("1 11 2 21 211 212 213 22", ChildWindowIDsAsString(parent.get()));
 
   // Stack w1 at the top (end), this should force w11 to be last (on top of w1).
@@ -163,44 +152,44 @@
   EXPECT_EQ(w22, parent->children().back());
   EXPECT_EQ("1 11 2 21 211 212 213 22", ChildWindowIDsAsString(parent.get()));
 
-  parent->Reorder(w11, w2.get(), mojom::ORDER_DIRECTION_ABOVE);
+  w11->Reorder(w2.get(), mojom::ORDER_DIRECTION_ABOVE);
   EXPECT_EQ(w11, parent->children().back());
   EXPECT_EQ("2 21 211 212 213 22 1 11", ChildWindowIDsAsString(parent.get()));
 
-  parent->Reorder(w21, w1.get(), mojom::ORDER_DIRECTION_ABOVE);
+  w21->Reorder(w1.get(), mojom::ORDER_DIRECTION_ABOVE);
   EXPECT_EQ(w22, parent->children().back());
   EXPECT_EQ("1 11 2 21 211 212 213 22", ChildWindowIDsAsString(parent.get()));
 
-  parent->Reorder(w21, w22, mojom::ORDER_DIRECTION_ABOVE);
+  w21->Reorder(w22, mojom::ORDER_DIRECTION_ABOVE);
   EXPECT_EQ(w213, parent->children().back());
   EXPECT_EQ("1 11 2 22 21 211 212 213", ChildWindowIDsAsString(parent.get()));
 
-  parent->Reorder(w11, w21, mojom::ORDER_DIRECTION_ABOVE);
+  w11->Reorder(w21, mojom::ORDER_DIRECTION_ABOVE);
   EXPECT_EQ(w11, parent->children().back());
   EXPECT_EQ("2 22 21 211 212 213 1 11", ChildWindowIDsAsString(parent.get()));
 
-  parent->Reorder(w213, w21, mojom::ORDER_DIRECTION_ABOVE);
+  w213->Reorder(w21, mojom::ORDER_DIRECTION_ABOVE);
   EXPECT_EQ(w11, parent->children().back());
   EXPECT_EQ("2 22 21 213 211 212 1 11", ChildWindowIDsAsString(parent.get()));
 
   // No change when stacking a transient parent above its transient child.
-  parent->Reorder(w21, w211, mojom::ORDER_DIRECTION_ABOVE);
+  w21->Reorder(w211, mojom::ORDER_DIRECTION_ABOVE);
   EXPECT_EQ(w11, parent->children().back());
   EXPECT_EQ("2 22 21 213 211 212 1 11", ChildWindowIDsAsString(parent.get()));
 
   // This tests that the order in children_ array rather than in
   // transient_children_ array is used when reinserting transient children.
   // If transient_children_ array was used '22' would be following '21'.
-  parent->Reorder(w2.get(), w1.get(), mojom::ORDER_DIRECTION_ABOVE);
+  w2->Reorder(w1.get(), mojom::ORDER_DIRECTION_ABOVE);
   EXPECT_EQ(w212, parent->children().back());
   EXPECT_EQ("1 11 2 22 21 213 211 212", ChildWindowIDsAsString(parent.get()));
 
-  parent->Reorder(w11, w213, mojom::ORDER_DIRECTION_ABOVE);
+  w11->Reorder(w213, mojom::ORDER_DIRECTION_ABOVE);
   EXPECT_EQ(w11, parent->children().back());
   EXPECT_EQ("2 22 21 213 211 212 1 11", ChildWindowIDsAsString(parent.get()));
 }
 
-TEST_F(TransientWindowManagerTest, TransienChildGroupBelow) {
+TEST_F(TransientWindowsTest, TransienChildGroupBelow) {
   TestServerWindowDelegate server_window_delegate;
 
   scoped_ptr<ServerWindow> parent(
@@ -226,17 +215,17 @@
   ASSERT_EQ(8u, parent->children().size());
 
   // w11 is now owned by w1.
-  AddTransientChild(w1.get(), w11);
+  w1->AddTransientWindow(w11);
   // w21 is now owned by w2.
-  AddTransientChild(w2.get(), w21);
+  w2->AddTransientWindow(w21);
   // w22 is now owned by w2.
-  AddTransientChild(w2.get(), w22);
+  w2->AddTransientWindow(w22);
   // w211 is now owned by w21.
-  AddTransientChild(w21, w211);
+  w21->AddTransientWindow(w211);
   // w212 is now owned by w21.
-  AddTransientChild(w21, w212);
+  w21->AddTransientWindow(w212);
   // w213 is now owned by w21.
-  AddTransientChild(w21, w213);
+  w21->AddTransientWindow(w213);
   EXPECT_EQ("1 11 2 21 211 212 213 22", ChildWindowIDsAsString(parent.get()));
 
   // Stack w2 at the bottom, this should force w11 to be last (on top of w1).
@@ -251,42 +240,42 @@
   EXPECT_EQ(w22, parent->children().back());
   EXPECT_EQ("1 11 2 21 211 212 213 22", ChildWindowIDsAsString(parent.get()));
 
-  parent->Reorder(w21, w1.get(), mojom::ORDER_DIRECTION_BELOW);
+  w21->Reorder(w1.get(), mojom::ORDER_DIRECTION_BELOW);
   EXPECT_EQ(w11, parent->children().back());
   EXPECT_EQ("2 21 211 212 213 22 1 11", ChildWindowIDsAsString(parent.get()));
 
-  parent->Reorder(w11, w2.get(), mojom::ORDER_DIRECTION_BELOW);
+  w11->Reorder(w2.get(), mojom::ORDER_DIRECTION_BELOW);
   EXPECT_EQ(w22, parent->children().back());
   EXPECT_EQ("1 11 2 21 211 212 213 22", ChildWindowIDsAsString(parent.get()));
 
-  parent->Reorder(w22, w21, mojom::ORDER_DIRECTION_BELOW);
+  w22->Reorder(w21, mojom::ORDER_DIRECTION_BELOW);
   EXPECT_EQ(w213, parent->children().back());
   EXPECT_EQ("1 11 2 22 21 211 212 213", ChildWindowIDsAsString(parent.get()));
 
-  parent->Reorder(w21, w11, mojom::ORDER_DIRECTION_BELOW);
+  w21->Reorder(w11, mojom::ORDER_DIRECTION_BELOW);
   EXPECT_EQ(w11, parent->children().back());
   EXPECT_EQ("2 22 21 211 212 213 1 11", ChildWindowIDsAsString(parent.get()));
 
-  parent->Reorder(w213, w211, mojom::ORDER_DIRECTION_BELOW);
+  w213->Reorder(w211, mojom::ORDER_DIRECTION_BELOW);
   EXPECT_EQ(w11, parent->children().back());
   EXPECT_EQ("2 22 21 213 211 212 1 11", ChildWindowIDsAsString(parent.get()));
 
   // No change when stacking a transient parent below its transient child.
-  parent->Reorder(w21, w211, mojom::ORDER_DIRECTION_BELOW);
+  w21->Reorder(w211, mojom::ORDER_DIRECTION_BELOW);
   EXPECT_EQ(w11, parent->children().back());
   EXPECT_EQ("2 22 21 213 211 212 1 11", ChildWindowIDsAsString(parent.get()));
 
-  parent->Reorder(w1.get(), w2.get(), mojom::ORDER_DIRECTION_BELOW);
+  w1->Reorder(w2.get(), mojom::ORDER_DIRECTION_BELOW);
   EXPECT_EQ(w212, parent->children().back());
   EXPECT_EQ("1 11 2 22 21 213 211 212", ChildWindowIDsAsString(parent.get()));
 
-  parent->Reorder(w213, w11, mojom::ORDER_DIRECTION_BELOW);
+  w213->Reorder(w11, mojom::ORDER_DIRECTION_BELOW);
   EXPECT_EQ(w11, parent->children().back());
   EXPECT_EQ("2 22 21 213 211 212 1 11", ChildWindowIDsAsString(parent.get()));
 }
 
 // Tests that transient windows are stacked properly when created.
-TEST_F(TransientWindowManagerTest, StackUponCreation) {
+TEST_F(TransientWindowsTest, StackUponCreation) {
   TestServerWindowDelegate delegate;
   scoped_ptr<ServerWindow> parent(
       CreateTestWindow(&delegate, WindowId(), nullptr));
@@ -297,13 +286,13 @@
 
   ServerWindow* window2 =
       CreateTestWindow(&delegate, WindowId(0, 3), parent.get());
-  AddTransientChild(window0.get(), window2);
+  window0->AddTransientWindow(window2);
   EXPECT_EQ("1 3 2", ChildWindowIDsAsString(parent.get()));
 }
 
-// Tests that windows are restacked properly after a call to AddTransientChild()
-// or RemoveTransientChild().
-TEST_F(TransientWindowManagerTest, RestackUponAddOrRemoveTransientChild) {
+// Tests that windows are restacked properly after a call to
+// AddTransientWindow() or RemoveTransientWindow().
+TEST_F(TransientWindowsTest, RestackUponAddOrRemoveTransientWindow) {
   TestServerWindowDelegate delegate;
   scoped_ptr<ServerWindow> parent(
       CreateTestWindow(&delegate, WindowId(), nullptr));
@@ -313,21 +302,21 @@
 
   EXPECT_EQ("0 1 2 3", ChildWindowIDsAsString(parent.get()));
 
-  AddTransientChild(windows[0].get(), windows[2].get());
+  windows[0]->AddTransientWindow(windows[2].get());
   EXPECT_EQ("0 2 1 3", ChildWindowIDsAsString(parent.get()));
 
-  AddTransientChild(windows[0].get(), windows[3].get());
+  windows[0]->AddTransientWindow(windows[3].get());
   EXPECT_EQ("0 2 3 1", ChildWindowIDsAsString(parent.get()));
 
-  RemoveTransientChild(windows[0].get(), windows[2].get());
+  windows[0]->RemoveTransientWindow(windows[2].get());
   EXPECT_EQ("0 3 2 1", ChildWindowIDsAsString(parent.get()));
 
-  RemoveTransientChild(windows[0].get(), windows[3].get());
+  windows[0]->RemoveTransientWindow(windows[3].get());
   EXPECT_EQ("0 3 2 1", ChildWindowIDsAsString(parent.get()));
 }
 
 // Verifies TransientWindowObserver is notified appropriately.
-TEST_F(TransientWindowManagerTest, TransientWindowObserverNotified) {
+TEST_F(TransientWindowsTest, TransientWindowObserverNotified) {
   TestServerWindowDelegate delegate;
   scoped_ptr<ServerWindow> parent(
       CreateTestWindow(&delegate, WindowId(), nullptr));
@@ -335,18 +324,17 @@
       CreateTestWindow(&delegate, WindowId(0, 1), parent.get()));
 
   TestTransientWindowObserver test_observer;
-  TransientWindowManager::GetOrCreate(parent.get())
-      ->AddObserver(&test_observer);
+  parent->AddObserver(&test_observer);
 
-  AddTransientChild(parent.get(), w1.get());
+  parent->AddTransientWindow(w1.get());
   EXPECT_EQ(1, test_observer.add_count());
   EXPECT_EQ(0, test_observer.remove_count());
 
-  RemoveTransientChild(parent.get(), w1.get());
+  parent->RemoveTransientWindow(w1.get());
   EXPECT_EQ(1, test_observer.add_count());
   EXPECT_EQ(1, test_observer.remove_count());
 
-  TransientWindowManager::Get(parent.get())->RemoveObserver(&test_observer);
+  parent->RemoveObserver(&test_observer);
 }
 
 }  // namespace ws
diff --git a/components/mus/ws/window_stacking_client.cc b/components/mus/ws/window_stacking_client.cc
deleted file mode 100644
index 84ecd16..0000000
--- a/components/mus/ws/window_stacking_client.cc
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "components/mus/ws/window_stacking_client.h"
-
-namespace mus {
-namespace ws {
-
-namespace {
-
-WindowStackingClient* instance = nullptr;
-
-}  // namespace
-
-void SetWindowStackingClient(WindowStackingClient* client) {
-  instance = client;
-}
-
-WindowStackingClient* GetWindowStackingClient() {
-  return instance;
-}
-
-}  // namespace ws
-}  // namespace mus
diff --git a/components/mus/ws/window_stacking_client.h b/components/mus/ws/window_stacking_client.h
deleted file mode 100644
index 9c86d55..0000000
--- a/components/mus/ws/window_stacking_client.h
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef COMPONENTS_MUS_WS_WINDOW_STACKING_CLIENT_H_
-#define COMPONENTS_MUS_WS_WINDOW_STACKING_CLIENT_H_
-
-#include "base/basictypes.h"
-#include "base/memory/scoped_ptr.h"
-#include "components/mus/public/interfaces/window_tree.mojom.h"
-
-namespace mus {
-namespace ws {
-
-class ServerWindow;
-
-class WindowStackingClient {
- public:
-  // Invoked from the various Window stacking functions. Allows the
-  // WindowStackingClient to alter the source, target and/or direction to stack.
-  // Returns true if stacking should continue; false if the stacking should not
-  // happen.
-  virtual bool AdjustStacking(ServerWindow** child,
-                              ServerWindow** target,
-                              mojom::OrderDirection* direction) = 0;
-
- protected:
-  virtual ~WindowStackingClient() {}
-};
-
-// Sets/gets the WindowStackingClient. This does *not* take ownership of
-// |client|. It is assumed the caller will invoke SetWindowStackingClient(NULL)
-// before deleting |client|.
-void SetWindowStackingClient(WindowStackingClient* client);
-WindowStackingClient* GetWindowStackingClient();
-
-}  // namespace ws
-}  // namespace mus
-
-#endif  // COMPONENTS_MUS_WS_WINDOW_STACKING_CLIENT_H_
diff --git a/components/mus/ws/window_tree_impl.cc b/components/mus/ws/window_tree_impl.cc
index 56ccf6a9..627a6f2 100644
--- a/components/mus/ws/window_tree_impl.cc
+++ b/components/mus/ws/window_tree_impl.cc
@@ -613,7 +613,7 @@
   if (CanReorderWindow(window, relative_window, direction)) {
     success = true;
     Operation op(this, connection_manager_, OperationType::REORDER_WINDOW);
-    window->parent()->Reorder(window, relative_window, direction);
+    window->Reorder(relative_window, direction);
     connection_manager_->ProcessWindowReorder(window, relative_window,
                                               direction);
   }
diff --git a/components/mus/ws/window_utils.cc b/components/mus/ws/window_utils.cc
deleted file mode 100644
index cc70cf8..0000000
--- a/components/mus/ws/window_utils.cc
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "components/mus/ws/window_utils.h"
-
-#include "components/mus/ws/transient_window_manager.h"
-
-namespace mus {
-namespace ws {
-
-ServerWindow* GetTransientParent(ServerWindow* window) {
-  return const_cast<ServerWindow*>(
-      GetTransientParent(const_cast<const ServerWindow*>(window)));
-}
-
-const ServerWindow* GetTransientParent(const ServerWindow* window) {
-  const TransientWindowManager* manager = TransientWindowManager::Get(window);
-  return manager ? manager->transient_parent() : NULL;
-}
-
-const std::vector<ServerWindow*>& GetTransientChildren(
-    const ServerWindow* window) {
-  const TransientWindowManager* manager = TransientWindowManager::Get(window);
-  if (manager)
-    return manager->transient_children();
-
-  static std::vector<ServerWindow*>* shared = new std::vector<ServerWindow*>;
-  return *shared;
-}
-
-void AddTransientChild(ServerWindow* parent, ServerWindow* child) {
-  TransientWindowManager::GetOrCreate(parent)->AddTransientChild(child);
-}
-
-void RemoveTransientChild(ServerWindow* parent, ServerWindow* child) {
-  TransientWindowManager::Get(parent)->RemoveTransientChild(child);
-}
-
-bool HasTransientAncestor(const ServerWindow* window,
-                          const ServerWindow* ancestor) {
-  const ServerWindow* transient_parent = GetTransientParent(window);
-  if (transient_parent == ancestor)
-    return true;
-  return transient_parent ? HasTransientAncestor(transient_parent, ancestor)
-                          : false;
-}
-
-}  // namespace ws
-}  // namespace mus
diff --git a/components/mus/ws/window_utils.h b/components/mus/ws/window_utils.h
deleted file mode 100644
index 12af2ba..0000000
--- a/components/mus/ws/window_utils.h
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef COMPONENTS_MUS_WS_WINDOW_UTILS_H_
-#define COMPONENTS_MUS_WS_WINDOW_UTILS_H_
-
-#include <vector>
-
-namespace mus {
-namespace ws {
-
-class ServerWindow;
-
-// Convenience functions that get the TransientWindowManager for the window and
-// redirect appropriately. These are preferable to calling functions on
-// TransientWindowManager as they handle the appropriate nullptr checks.
-ServerWindow* GetTransientParent(ServerWindow* window);
-
-const ServerWindow* GetTransientParent(const ServerWindow* window);
-
-const std::vector<ServerWindow*>& GetTransientChildren(
-    const ServerWindow* window);
-
-void AddTransientChild(ServerWindow* parent, ServerWindow* child);
-
-void RemoveTransientChild(ServerWindow* parent, ServerWindow* child);
-
-// Returns true if |window| has |ancestor| as a transient ancestor. A transient
-// ancestor is found by following the transient parent chain of the window.
-bool HasTransientAncestor(const ServerWindow* window,
-                          const ServerWindow* ancestor);
-
-}  // namespace ws
-}  // namespace mus
-
-#endif  // COMPONENTS_MUS_WS_WINDOW_UTILS_H_
diff --git a/components/nacl/broker/nacl_broker_listener.cc b/components/nacl/broker/nacl_broker_listener.cc
index f150049..3f28cd0 100644
--- a/components/nacl/broker/nacl_broker_listener.cc
+++ b/components/nacl/broker/nacl_broker_listener.cc
@@ -51,8 +51,7 @@
 }
 
 // NOTE: changes to this method need to be reviewed by the security team.
-void NaClBrokerListener::PreSpawnTarget(sandbox::TargetPolicy* policy,
-                                        bool* success) {
+bool NaClBrokerListener::PreSpawnTarget(sandbox::TargetPolicy* policy) {
   // This code is duplicated in chrome_content_browser_client.cc.
 
   // Allow the server side of a pipe restricted to the "chrome.nacl."
@@ -62,7 +61,7 @@
       sandbox::TargetPolicy::SUBSYS_NAMED_PIPES,
       sandbox::TargetPolicy::NAMEDPIPES_ALLOW_ANY,
       L"\\\\.\\pipe\\chrome.nacl.*");
-  *success = (result == sandbox::SBOX_ALL_OK);
+  return result == sandbox::SBOX_ALL_OK;
 }
 
 void NaClBrokerListener::OnChannelConnected(int32 peer_pid) {
diff --git a/components/nacl/broker/nacl_broker_listener.h b/components/nacl/broker/nacl_broker_listener.h
index 0585008..ab47b4bd 100644
--- a/components/nacl/broker/nacl_broker_listener.h
+++ b/components/nacl/broker/nacl_broker_listener.h
@@ -27,7 +27,7 @@
   void Listen();
 
   // content::SandboxedProcessLauncherDelegate implementation:
-  void PreSpawnTarget(sandbox::TargetPolicy* policy, bool* success) override;
+  bool PreSpawnTarget(sandbox::TargetPolicy* policy) override;
 
   // IPC::Listener implementation.
   void OnChannelConnected(int32 peer_pid) override;
diff --git a/components/omnibox/browser/search_provider.cc b/components/omnibox/browser/search_provider.cc
index 926c3df..914aeb5 100644
--- a/components/omnibox/browser/search_provider.cc
+++ b/components/omnibox/browser/search_provider.cc
@@ -215,8 +215,13 @@
   if (!minimal_changes) {
     for (SearchSuggestionParser::SuggestResults::iterator sug_it =
              results->suggest_results.begin();
-         sug_it != results->suggest_results.end(); ++sug_it) {
-      sug_it->set_received_after_last_keystroke(false);
+         sug_it != results->suggest_results.end(); ) {
+      if (sug_it->type() == AutocompleteMatchType::CALCULATOR) {
+        sug_it = results->suggest_results.erase(sug_it);
+      } else {
+        sug_it->set_received_after_last_keystroke(false);
+        ++sug_it;
+      }
     }
     for (SearchSuggestionParser::NavigationResults::iterator nav_it =
              results->navigation_results.begin();
diff --git a/components/pdf_viewer/BUILD.gn b/components/pdf_viewer/BUILD.gn
index 4ec5149..c5a635a 100644
--- a/components/pdf_viewer/BUILD.gn
+++ b/components/pdf_viewer/BUILD.gn
@@ -13,6 +13,7 @@
 
   deps = [
     "//base",
+    "//components/bitmap_uploader",
     "//components/mus/public/interfaces",
     "//components/mus/public/cpp",
     "//components/web_view/public/interfaces",
diff --git a/components/pdf_viewer/DEPS b/components/pdf_viewer/DEPS
index 25792e3c..d6857afc 100644
--- a/components/pdf_viewer/DEPS
+++ b/components/pdf_viewer/DEPS
@@ -1,4 +1,5 @@
 include_rules = [
+  "+components/bitmap_uploader",
   "+components/mus/public",
   "+components/web_view/public",
   "+gpu/GLES2",
diff --git a/components/pdf_viewer/pdf_viewer.cc b/components/pdf_viewer/pdf_viewer.cc
index f3ba929..dcc5f93 100644
--- a/components/pdf_viewer/pdf_viewer.cc
+++ b/components/pdf_viewer/pdf_viewer.cc
@@ -6,21 +6,16 @@
 #include "base/callback.h"
 #include "base/containers/hash_tables.h"
 #include "base/memory/scoped_ptr.h"
+#include "components/bitmap_uploader/bitmap_uploader.h"
 #include "components/mus/public/cpp/scoped_window_ptr.h"
 #include "components/mus/public/cpp/types.h"
 #include "components/mus/public/cpp/window.h"
 #include "components/mus/public/cpp/window_observer.h"
-#include "components/mus/public/cpp/window_surface.h"
 #include "components/mus/public/cpp/window_tree_connection.h"
 #include "components/mus/public/cpp/window_tree_delegate.h"
-#include "components/mus/public/interfaces/compositor_frame.mojom.h"
-#include "components/mus/public/interfaces/gpu.mojom.h"
 #include "components/mus/public/interfaces/input_events.mojom.h"
 #include "components/mus/public/interfaces/input_key_codes.mojom.h"
-#include "components/mus/public/interfaces/surface_id.mojom.h"
 #include "components/web_view/public/interfaces/frame.mojom.h"
-#include "gpu/GLES2/gl2chromium.h"
-#include "gpu/GLES2/gl2extchromium.h"
 #include "mojo/application/public/cpp/application_connection.h"
 #include "mojo/application/public/cpp/application_delegate.h"
 #include "mojo/application/public/cpp/application_impl.h"
@@ -31,290 +26,19 @@
 #include "mojo/application/public/interfaces/content_handler.mojom.h"
 #include "mojo/application/public/interfaces/shell.mojom.h"
 #include "mojo/common/data_pipe_utils.h"
-#include "mojo/converters/geometry/geometry_type_converters.h"
-#include "mojo/converters/surfaces/surfaces_type_converters.h"
-#include "mojo/converters/surfaces/surfaces_utils.h"
-#include "mojo/public/c/gles2/gles2.h"
 #include "mojo/public/c/system/main.h"
 #include "mojo/public/cpp/bindings/binding.h"
 #include "mojo/services/tracing/public/cpp/tracing_impl.h"
 #include "third_party/pdfium/public/fpdf_ext.h"
 #include "third_party/pdfium/public/fpdfview.h"
 #include "ui/gfx/geometry/rect.h"
-#include "ui/mojo/geometry/geometry.mojom.h"
-#include "ui/mojo/geometry/geometry_util.h"
 #include "v8/include/v8.h"
 
 const uint32_t g_background_color = 0xFF888888;
-const uint32_t g_transparent_color = 0x00000000;
 
 namespace pdf_viewer {
 namespace {
 
-void LostContext(void*) {
-  DCHECK(false);
-}
-
-void OnGotContentHandlerID(uint32_t content_handler_id) {}
-
-// BitmapUploader is useful if you want to draw a bitmap or color in a View.
-class BitmapUploader : public mus::mojom::SurfaceClient {
- public:
-  explicit BitmapUploader(mus::Window* view)
-      : view_(view),
-        color_(g_transparent_color),
-        width_(0),
-        height_(0),
-        format_(BGRA),
-        next_resource_id_(1u),
-        id_namespace_(0u),
-        local_id_(0u),
-        returner_binding_(this) {}
-  ~BitmapUploader() override {
-    MojoGLES2DestroyContext(gles2_context_);
-  }
-
-  void Init(mojo::Shell* shell) {
-    surface_ = view_->RequestSurface(mus::mojom::SURFACE_TYPE_DEFAULT);
-    surface_->BindToThread();
-
-    mojo::ServiceProviderPtr gpu_service_provider;
-    mojo::URLRequestPtr request2(mojo::URLRequest::New());
-    request2->url = mojo::String::From("mojo:mus");
-    shell->ConnectToApplication(request2.Pass(),
-                                mojo::GetProxy(&gpu_service_provider), nullptr,
-                                nullptr, base::Bind(&OnGotContentHandlerID));
-    ConnectToService(gpu_service_provider.get(), &gpu_service_);
-
-    mus::mojom::CommandBufferPtr gles2_client;
-    gpu_service_->CreateOffscreenGLES2Context(GetProxy(&gles2_client));
-    gles2_context_ = MojoGLES2CreateContext(
-        gles2_client.PassInterface().PassHandle().release().value(),
-        nullptr,
-        &LostContext, NULL, mojo::Environment::GetDefaultAsyncWaiter());
-    MojoGLES2MakeCurrent(gles2_context_);
-  }
-
-  // Sets the color which is RGBA.
-  void SetColor(uint32_t color) {
-    if (color_ == color)
-      return;
-    color_ = color;
-    if (surface_)
-      Upload();
-  }
-
-  enum Format {
-    RGBA,  // Pixel layout on Android.
-    BGRA,  // Pixel layout everywhere else.
-  };
-
-  // Sets a bitmap.
-  void SetBitmap(int width,
-                 int height,
-                 scoped_ptr<std::vector<unsigned char>> data,
-                 Format format) {
-    width_ = width;
-    height_ = height;
-    bitmap_ = data.Pass();
-    format_ = format;
-    if (surface_)
-      Upload();
-  }
-
- private:
-  void Upload() {
-    const gfx::Rect bounds(view_->bounds());
-    mus::mojom::PassPtr pass = mojo::CreateDefaultPass(1, bounds);
-    mus::mojom::CompositorFramePtr frame = mus::mojom::CompositorFrame::New();
-
-    // TODO(rjkroege): Support device scale factor in PDF viewer
-    mus::mojom::CompositorFrameMetadataPtr meta =
-        mus::mojom::CompositorFrameMetadata::New();
-    meta->device_scale_factor = 1.0f;
-    frame->metadata = meta.Pass();
-
-    frame->resources.resize(0u);
-
-    pass->quads.resize(0u);
-    pass->shared_quad_states.push_back(
-        mojo::CreateDefaultSQS(bounds.size()));
-
-    MojoGLES2MakeCurrent(gles2_context_);
-    if (bitmap_.get()) {
-      mojo::Size bitmap_size;
-      bitmap_size.width = width_;
-      bitmap_size.height = height_;
-      GLuint texture_id = BindTextureForSize(bitmap_size);
-      glTexSubImage2D(GL_TEXTURE_2D,
-                      0,
-                      0,
-                      0,
-                      bitmap_size.width,
-                      bitmap_size.height,
-                      TextureFormat(),
-                      GL_UNSIGNED_BYTE,
-                      &((*bitmap_)[0]));
-
-      GLbyte mailbox[GL_MAILBOX_SIZE_CHROMIUM];
-      glGenMailboxCHROMIUM(mailbox);
-      glProduceTextureCHROMIUM(GL_TEXTURE_2D, mailbox);
-      gpu::SyncToken sync_token(glInsertSyncPointCHROMIUM());
-
-      mus::mojom::TransferableResourcePtr resource =
-          mus::mojom::TransferableResource::New();
-      resource->id = next_resource_id_++;
-      resource_to_texture_id_map_[resource->id] = texture_id;
-      resource->format = mus::mojom::RESOURCE_FORMAT_RGBA_8888;
-      resource->filter = GL_LINEAR;
-      resource->size = bitmap_size.Clone();
-      mus::mojom::MailboxHolderPtr mailbox_holder =
-          mus::mojom::MailboxHolder::New();
-      mailbox_holder->mailbox = mus::mojom::Mailbox::New();
-      for (int i = 0; i < GL_MAILBOX_SIZE_CHROMIUM; ++i)
-        mailbox_holder->mailbox->name.push_back(mailbox[i]);
-      mailbox_holder->texture_target = GL_TEXTURE_2D;
-      mailbox_holder->sync_token =
-          mus::mojom::SyncToken::From<gpu::SyncToken>(sync_token);
-      resource->mailbox_holder = mailbox_holder.Pass();
-      resource->is_repeated = false;
-      resource->is_software = false;
-
-      mus::mojom::QuadPtr quad = mus::mojom::Quad::New();
-      quad->material = mus::mojom::MATERIAL_TEXTURE_CONTENT;
-
-      mojo::RectPtr rect = mojo::Rect::New();
-      if (width_ <= bounds.width() && height_ <= bounds.height()) {
-        rect->width = width_;
-        rect->height = height_;
-      } else {
-        // The source bitmap is larger than the viewport. Resize it while
-        // maintaining the aspect ratio.
-        float width_ratio = static_cast<float>(width_) / bounds.width();
-        float height_ratio = static_cast<float>(height_) / bounds.height();
-        if (width_ratio > height_ratio) {
-          rect->width = bounds.width();
-          rect->height = height_ / width_ratio;
-        } else {
-          rect->height = bounds.height();
-          rect->width = width_ / height_ratio;
-        }
-      }
-      quad->rect = rect.Clone();
-      quad->opaque_rect = rect.Clone();
-      quad->visible_rect = rect.Clone();
-      quad->needs_blending = true;
-      quad->shared_quad_state_index = 0u;
-
-      mus::mojom::TextureQuadStatePtr texture_state =
-          mus::mojom::TextureQuadState::New();
-      texture_state->resource_id = resource->id;
-      texture_state->premultiplied_alpha = true;
-      texture_state->uv_top_left = mojo::PointF::New();
-      texture_state->uv_bottom_right = mojo::PointF::New();
-      texture_state->uv_bottom_right->x = 1.f;
-      texture_state->uv_bottom_right->y = 1.f;
-      texture_state->background_color = mus::mojom::Color::New();
-      texture_state->background_color->rgba = g_transparent_color;
-      for (int i = 0; i < 4; ++i)
-        texture_state->vertex_opacity.push_back(1.f);
-      texture_state->y_flipped = false;
-
-      frame->resources.push_back(resource.Pass());
-      quad->texture_quad_state = texture_state.Pass();
-      pass->quads.push_back(quad.Pass());
-    }
-
-    if (color_ != g_transparent_color) {
-      mus::mojom::QuadPtr quad = mus::mojom::Quad::New();
-      quad->material = mus::mojom::MATERIAL_SOLID_COLOR;
-      quad->rect = mojo::Rect::From(bounds);
-      quad->opaque_rect = mojo::Rect::New();
-      quad->visible_rect = mojo::Rect::From(bounds);
-      quad->needs_blending = true;
-      quad->shared_quad_state_index = 0u;
-
-      mus::mojom::SolidColorQuadStatePtr color_state =
-          mus::mojom::SolidColorQuadState::New();
-      color_state->color = mus::mojom::Color::New();
-      color_state->color->rgba = color_;
-      color_state->force_anti_aliasing_off = false;
-
-      quad->solid_color_quad_state = color_state.Pass();
-      pass->quads.push_back(quad.Pass());
-    }
-
-    frame->passes.push_back(pass.Pass());
-
-    // TODO(rjkroege, fsamuel): We should throttle frames.
-    surface_->SubmitCompositorFrame(frame.Pass(), mojo::Closure());
-  }
-
-  uint32_t BindTextureForSize(const mojo::Size size) {
-    // TODO(jamesr): Recycle textures.
-    GLuint texture = 0u;
-    glGenTextures(1, &texture);
-    glBindTexture(GL_TEXTURE_2D, texture);
-    glTexImage2D(GL_TEXTURE_2D,
-                 0,
-                 TextureFormat(),
-                 size.width,
-                 size.height,
-                 0,
-                 TextureFormat(),
-                 GL_UNSIGNED_BYTE,
-                 0);
-    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-    return texture;
-  }
-
-  uint32_t TextureFormat() {
-    return format_ == BGRA ? GL_BGRA_EXT : GL_RGBA;
-  }
-
-  void SetIdNamespace(uint32_t id_namespace) {
-    id_namespace_ = id_namespace;
-    if (color_ != g_transparent_color || bitmap_.get())
-      Upload();
-  }
-
-  // SurfaceClient implementation.
-  void ReturnResources(
-      mojo::Array<mus::mojom::ReturnedResourcePtr> resources) override {
-    MojoGLES2MakeCurrent(gles2_context_);
-    // TODO(jamesr): Recycle.
-    for (size_t i = 0; i < resources.size(); ++i) {
-      mus::mojom::ReturnedResourcePtr resource = resources[i].Pass();
-      DCHECK_EQ(1, resource->count);
-      glWaitSyncTokenCHROMIUM(
-          resource->sync_token.To<gpu::SyncToken>().GetConstData());
-      uint32_t texture_id = resource_to_texture_id_map_[resource->id];
-      DCHECK_NE(0u, texture_id);
-      resource_to_texture_id_map_.erase(resource->id);
-      glDeleteTextures(1, &texture_id);
-    }
-  }
-
-  mus::Window* view_;
-  mus::mojom::GpuPtr gpu_service_;
-  scoped_ptr<mus::WindowSurface> surface_;
-  MojoGLES2Context gles2_context_;
-
-  mojo::Size size_;
-  uint32_t color_;
-  int width_;
-  int height_;
-  Format format_;
-  scoped_ptr<std::vector<unsigned char>> bitmap_;
-  uint32_t next_resource_id_;
-  uint32_t id_namespace_;
-  uint32_t local_id_;
-  base::hash_map<uint32_t, uint32_t> resource_to_texture_id_map_;
-  mojo::Binding<mus::mojom::SurfaceClient> returner_binding_;
-
-  DISALLOW_COPY_AND_ASSIGN(BitmapUploader);
-};
-
 // Responsible for managing a particlar view displaying a PDF document.
 class PDFView : public mus::WindowTreeDelegate,
                 public mus::WindowObserver,
@@ -373,7 +97,7 @@
     FPDF_ClosePage(page);
 
     bitmap_uploader_->SetBitmap(width, height, bitmap.Pass(),
-                                BitmapUploader::BGRA);
+                                bitmap_uploader::BitmapUploader::BGRA);
   }
 
   // WindowTreeDelegate:
@@ -381,7 +105,7 @@
     DCHECK(!root_);
     root_ = root;
     root_->AddObserver(this);
-    bitmap_uploader_.reset(new BitmapUploader(root_));
+    bitmap_uploader_.reset(new bitmap_uploader::BitmapUploader(root_));
     bitmap_uploader_->Init(shell_);
     bitmap_uploader_->SetColor(g_background_color);
     DrawBitmap();
@@ -492,7 +216,7 @@
   int current_page_;
   int page_count_;
 
-  scoped_ptr<BitmapUploader> bitmap_uploader_;
+  scoped_ptr<bitmap_uploader::BitmapUploader> bitmap_uploader_;
 
   mojo::Shell* shell_;
   mus::Window* root_;
diff --git a/components/plugins.gypi b/components/plugins.gypi
index 9061833..3696b4d2 100644
--- a/components/plugins.gypi
+++ b/components/plugins.gypi
@@ -3,20 +3,6 @@
 # found in the LICENSE file.
 
 {
-  'targets': [
-    {
-      # GN version: //components/plugins/common
-      'target_name': 'plugins_common',
-      'type': 'static_library',
-      'include_dirs': [
-        '..',
-      ],
-      'sources': [
-        'plugins/common/plugins_switches.cc',
-        'plugins/common/plugins_switches.h',
-      ],
-    },
-  ],
   'conditions': [
     ['OS!="ios"', {
       'targets': [
diff --git a/components/plugins/common/plugins_switches.cc b/components/plugins/common/plugins_switches.cc
deleted file mode 100644
index 83c9652..0000000
--- a/components/plugins/common/plugins_switches.cc
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "components/plugins/common/plugins_switches.h"
-
-namespace plugins {
-namespace switches {
-
-// Disables the experimental Plugin Power Saver feature.
-const char kDisablePluginPowerSaver[] = "disable-plugin-power-saver";
-
-// Enables the experimental Plugin Power Saver feature.
-const char kEnablePluginPowerSaver[] = "enable-plugin-power-saver";
-
-}  // namespace switches
-}  // namespace plugins
diff --git a/components/plugins/common/plugins_switches.h b/components/plugins/common/plugins_switches.h
deleted file mode 100644
index 57500b73..0000000
--- a/components/plugins/common/plugins_switches.h
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef COMPONENTS_PLUGINS_COMMON_PLUGIN_SWITCHES_H_
-#define COMPONENTS_PLUGINS_COMMON_PLUGIN_SWITCHES_H_
-
-namespace plugins {
-namespace switches {
-
-extern const char kDisablePluginPowerSaver[];
-extern const char kEnablePluginPowerSaver[];
-
-}  // namespace switches
-}  // namespace plugins
-
-#endif  // COMPONENTS_PLUGINS_COMMON_PLUGIN_SWITCHES_H_
diff --git a/components/search_provider_logos/google_logo_api.cc b/components/search_provider_logos/google_logo_api.cc
index 5010e2c7..83542e9 100644
--- a/components/search_provider_logos/google_logo_api.cc
+++ b/components/search_provider_logos/google_logo_api.cc
@@ -49,7 +49,8 @@
 
 scoped_ptr<EncodedLogo> GoogleParseLogoResponse(
     const scoped_ptr<std::string>& response,
-    base::Time response_time) {
+    base::Time response_time,
+    bool* parsing_failed) {
   // Google doodles are sent as JSON with a prefix. Example:
   //   )]}' {"update":{"logo":{
   //     "data": "/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/...",
@@ -67,9 +68,15 @@
     response_sp.remove_prefix(strlen(kResponsePreamble));
 
   scoped_ptr<base::Value> value = base::JSONReader::Read(response_sp);
-  if (!value.get())
-    return scoped_ptr<EncodedLogo>();
 
+  // Check if no logo today.
+  if (!value.get()) {
+    *parsing_failed = false;
+    return scoped_ptr<EncodedLogo>();
+  }
+
+  // Default parsing failure to be true.
+  *parsing_failed = true;
   // The important data lives inside several nested dictionaries:
   // {"update": {"logo": { "mime_type": ..., etc } } }
   const base::DictionaryValue* outer_dict;
@@ -117,6 +124,8 @@
   }
   logo->metadata.expiration_time = response_time + time_to_live;
 
+  // If this point is reached, parsing has succeeded.
+  *parsing_failed = false;
   return logo.Pass();
 }
 
diff --git a/components/search_provider_logos/google_logo_api.h b/components/search_provider_logos/google_logo_api.h
index 84e41948..f648dd6 100644
--- a/components/search_provider_logos/google_logo_api.h
+++ b/components/search_provider_logos/google_logo_api.h
@@ -23,7 +23,8 @@
 // Implements ParseLogoResponse, defined in logo_tracker.h, for Google doodles.
 scoped_ptr<EncodedLogo> GoogleParseLogoResponse(
     const scoped_ptr<std::string>& response,
-    base::Time response_time);
+    base::Time response_time,
+    bool* parsing_failed);
 
 }  // namespace search_provider_logos
 
diff --git a/components/search_provider_logos/logo_tracker.cc b/components/search_provider_logos/logo_tracker.cc
index 6e8ad20..fc98897 100644
--- a/components/search_provider_logos/logo_tracker.cc
+++ b/components/search_provider_logos/logo_tracker.cc
@@ -7,6 +7,7 @@
 #include <algorithm>
 
 #include "base/message_loop/message_loop.h"
+#include "base/metrics/histogram_macros.h"
 #include "base/task_runner_util.h"
 #include "base/thread_task_runner_handle.h"
 #include "base/time/default_clock.h"
@@ -80,7 +81,7 @@
       weak_ptr_factory_(this) {}
 
 LogoTracker::~LogoTracker() {
-  ReturnToIdle();
+  ReturnToIdle(kDownloadOutcomeNotTracked);
   file_task_runner_->PostTask(
       FROM_HERE, base::Bind(&DeleteLogoCacheOnFileThread, logo_cache_));
   logo_cache_ = NULL;
@@ -94,7 +95,7 @@
   if (logo_url == logo_url_)
     return;
 
-  ReturnToIdle();
+  ReturnToIdle(kDownloadOutcomeNotTracked);
 
   logo_url_ = logo_url;
   parse_logo_response_func_ = parse_logo_response_func;
@@ -137,7 +138,11 @@
   clock_ = clock.Pass();
 }
 
-void LogoTracker::ReturnToIdle() {
+void LogoTracker::ReturnToIdle(int outcome) {
+  if (outcome != kDownloadOutcomeNotTracked) {
+    UMA_HISTOGRAM_ENUMERATION("NewTabPage.LogoDownloadOutcome", outcome,
+                              DOWNLOAD_OUTCOME_COUNT);
+  }
   // Cancel the current asynchronous operation, if any.
   fetcher_.reset();
   weak_ptr_factory_.InvalidateWeakPtrs();
@@ -211,16 +216,18 @@
   fetcher_ = net::URLFetcher::Create(url, net::URLFetcher::GET, this);
   fetcher_->SetRequestContext(request_context_getter_.get());
   fetcher_->Start();
+  logo_download_start_time_ = base::TimeTicks::Now();
 }
 
-void LogoTracker::OnFreshLogoParsed(scoped_ptr<EncodedLogo> logo) {
+void LogoTracker::OnFreshLogoParsed(bool* parsing_failed,
+                                    scoped_ptr<EncodedLogo> logo) {
   DCHECK(!is_idle_);
 
   if (logo)
     logo->metadata.source_url = logo_url_.spec();
 
   if (!logo || !logo->encoded_image.get()) {
-    OnFreshLogoAvailable(logo.Pass(), SkBitmap());
+    OnFreshLogoAvailable(logo.Pass(), *parsing_failed, SkBitmap());
   } else {
     // Store the value of logo->encoded_image for use below. This ensures that
     // logo->encoded_image is evaulated before base::Passed(&logo), which sets
@@ -230,14 +237,18 @@
         encoded_image,
         base::Bind(&LogoTracker::OnFreshLogoAvailable,
                    weak_ptr_factory_.GetWeakPtr(),
-                   base::Passed(&logo)));
+                   base::Passed(&logo),
+                   *parsing_failed));
   }
 }
 
 void LogoTracker::OnFreshLogoAvailable(scoped_ptr<EncodedLogo> encoded_logo,
+                                       bool parsing_failed,
                                        const SkBitmap& image) {
   DCHECK(!is_idle_);
 
+  int download_outcome = kDownloadOutcomeNotTracked;
+
   if (encoded_logo && !encoded_logo->encoded_image.get() && cached_logo_ &&
       !encoded_logo->metadata.fingerprint.empty() &&
       encoded_logo->metadata.fingerprint ==
@@ -246,8 +257,10 @@
     // mime_type isn't sent when revalidating, so copy it from the cached logo.
     encoded_logo->metadata.mime_type = cached_logo_->metadata.mime_type;
     SetCachedMetadata(encoded_logo->metadata);
+    download_outcome = DOWNLOAD_OUTCOME_LOGO_REVALIDATED;
   } else if (encoded_logo && image.isNull()) {
     // Image decoding failed. Do nothing.
+    download_outcome = DOWNLOAD_OUTCOME_DECODING_FAILED;
   } else {
     scoped_ptr<Logo> logo;
     // Check if the server returned a valid, non-empty response.
@@ -258,6 +271,15 @@
       logo->image = image;
     }
 
+    if (logo) {
+      download_outcome = DOWNLOAD_OUTCOME_NEW_LOGO_SUCCESS;
+    } else {
+      if (parsing_failed)
+        download_outcome = DOWNLOAD_OUTCOME_PARSING_FAILED;
+      else
+        download_outcome = DOWNLOAD_OUTCOME_NO_LOGO_TODAY;
+    }
+
     // Notify observers if a new logo was fetched, or if the new logo is NULL
     // but the cached logo was non-NULL.
     if (logo || cached_logo_) {
@@ -268,7 +290,8 @@
     }
   }
 
-  ReturnToIdle();
+  DCHECK(download_outcome != kDownloadOutcomeNotTracked);
+  ReturnToIdle(download_outcome);
 }
 
 void LogoTracker::OnURLFetchComplete(const net::URLFetcher* source) {
@@ -276,21 +299,24 @@
   scoped_ptr<net::URLFetcher> cleanup_fetcher(fetcher_.release());
 
   if (!source->GetStatus().is_success() || (source->GetResponseCode() != 200)) {
-    ReturnToIdle();
+    ReturnToIdle(DOWNLOAD_OUTCOME_DOWNLOAD_FAILED);
     return;
   }
 
+  UMA_HISTOGRAM_TIMES("NewTabPage.LogoDownloadTime",
+                      base::TimeTicks::Now() - logo_download_start_time_);
+
   scoped_ptr<std::string> response(new std::string());
   source->GetResponseAsString(response.get());
   base::Time response_time = clock_->Now();
 
+  bool* parsing_failed = new bool(false);
   base::PostTaskAndReplyWithResult(
-      background_task_runner_.get(),
-      FROM_HERE,
-      base::Bind(
-          parse_logo_response_func_, base::Passed(&response), response_time),
+      background_task_runner_.get(), FROM_HERE,
+      base::Bind(parse_logo_response_func_, base::Passed(&response),
+                 response_time, parsing_failed),
       base::Bind(&LogoTracker::OnFreshLogoParsed,
-                 weak_ptr_factory_.GetWeakPtr()));
+                 weak_ptr_factory_.GetWeakPtr(), base::Owned(parsing_failed)));
 }
 
 void LogoTracker::OnURLFetchDownloadProgress(const net::URLFetcher* source,
@@ -298,7 +324,7 @@
                                              int64 total) {
   if (total > kMaxDownloadBytes || current > kMaxDownloadBytes) {
     LOG(WARNING) << "Search provider logo exceeded download size limit";
-    ReturnToIdle();
+    ReturnToIdle(DOWNLOAD_OUTCOME_DOWNLOAD_FAILED);
   }
 }
 
diff --git a/components/search_provider_logos/logo_tracker.h b/components/search_provider_logos/logo_tracker.h
index 4756085..d65d889c 100644
--- a/components/search_provider_logos/logo_tracker.h
+++ b/components/search_provider_logos/logo_tracker.h
@@ -66,9 +66,10 @@
 
 // Parses the response from the server and returns it as an EncodedLogo. Returns
 // NULL if the response is invalid.
-typedef base::Callback<
-    scoped_ptr<EncodedLogo>(const scoped_ptr<std::string>& response,
-                            base::Time response_time)> ParseLogoResponse;
+typedef base::Callback<scoped_ptr<EncodedLogo>(
+    const scoped_ptr<std::string>& response,
+    base::Time response_time,
+    bool* parsing_failed)> ParseLogoResponse;
 
 // Encodes the fingerprint of the cached logo in the logo URL. This enables the
 // server to verify whether the cached logo is up-to-date.
@@ -142,9 +143,26 @@
   void SetClockForTests(scoped_ptr<base::Clock> clock);
 
  private:
+
+  // These values must stay in sync with the NewTabPageLogoDownloadOutcome enum
+  // in histograms.xml. And any addtion should be treated as append-only!
+  // Animated doodle is not covered by this enum.
+  enum LogoDownloadOutcome {
+      DOWNLOAD_OUTCOME_NEW_LOGO_SUCCESS,
+      DOWNLOAD_OUTCOME_NO_LOGO_TODAY,
+      DOWNLOAD_OUTCOME_DOWNLOAD_FAILED,
+      DOWNLOAD_OUTCOME_PARSING_FAILED,
+      DOWNLOAD_OUTCOME_DECODING_FAILED,
+      DOWNLOAD_OUTCOME_LOGO_REVALIDATED,
+      DOWNLOAD_OUTCOME_COUNT,
+  };
+
+  const int kDownloadOutcomeNotTracked = -1;
+
   // Cancels the current asynchronous operation, if any, and resets all member
-  // variables that change as the logo is fetched.
-  void ReturnToIdle();
+  // variables that change as the logo is fetched. This method also records UMA
+  // histograms for for the given LogoDownloadOutcome.
+  void ReturnToIdle(int outcome);
 
   // Called when the cached logo has been read from the cache. |cached_logo|
   // will be NULL if there wasn't a valid, up-to-date logo in the cache.
@@ -166,11 +184,12 @@
 
   // Called when the logo has been downloaded and parsed. |logo| will be NULL
   // if the server's response was invalid.
-  void OnFreshLogoParsed(scoped_ptr<EncodedLogo> logo);
+  void OnFreshLogoParsed(bool* parsing_failed, scoped_ptr<EncodedLogo> logo);
 
   // Called when the fresh logo has been decoded into an SkBitmap. |image| will
   // be NULL if decoding failed.
   void OnFreshLogoAvailable(scoped_ptr<EncodedLogo> logo,
+                            bool parsing_failed,
                             const SkBitmap& image);
 
   // net::URLFetcherDelegate:
@@ -205,6 +224,9 @@
   // logo is cached.
   bool is_cached_logo_valid_;
 
+  // The timestamp for the last time a logo is stated to be downloaded.
+  base::TimeTicks logo_download_start_time_;
+
   // The URLFetcher currently fetching the logo. NULL when not fetching.
   scoped_ptr<net::URLFetcher> fetcher_;
 
diff --git a/components/ssl_errors.gypi b/components/ssl_errors.gypi
index b66444b0..c95a9b9 100644
--- a/components/ssl_errors.gypi
+++ b/components/ssl_errors.gypi
@@ -13,12 +13,15 @@
         '../net/net.gyp:net',
         '../ui/base/ui_base.gyp:ui_base',
         'components_strings.gyp:components_strings',
+        'url_formatter/url_formatter.gyp:url_formatter'
       ],
       'include_dirs': [
         '..',
       ],
       'sources': [
         # Note: sources list duplicated in GN build.
+        'ssl_errors/error_classification.cc',
+        'ssl_errors/error_classification.h',
         'ssl_errors/error_info.cc',
         'ssl_errors/error_info.h',
       ]
diff --git a/components/ssl_errors/BUILD.gn b/components/ssl_errors/BUILD.gn
index fc3da15..cc1c7ce 100644
--- a/components/ssl_errors/BUILD.gn
+++ b/components/ssl_errors/BUILD.gn
@@ -5,6 +5,8 @@
 # GYP version: components/ssl_errors.gyp
 source_set("ssl_errors") {
   sources = [
+    "error_classification.cc",
+    "error_classification.h",
     "error_info.cc",
     "error_info.h",
   ]
@@ -16,3 +18,15 @@
     "//ui/base",
   ]
 }
+
+source_set("unit_tests") {
+  testonly = true
+  sources = [
+    "error_classification_unittests.cc",
+  ]
+
+  deps = [
+    ":ssl_errors",
+    "//testing/gtest",
+  ]
+}
diff --git a/components/ssl_errors/DEPS b/components/ssl_errors/DEPS
index 37f0ae0..74d972b 100644
--- a/components/ssl_errors/DEPS
+++ b/components/ssl_errors/DEPS
@@ -1,4 +1,5 @@
 include_rules = [
+  "+components/url_formatter",
   "+grit",
   "+net",
   "+ui/base"
diff --git a/chrome/browser/ssl/ssl_error_classification.cc b/components/ssl_errors/error_classification.cc
similarity index 65%
rename from chrome/browser/ssl/ssl_error_classification.cc
rename to components/ssl_errors/error_classification.cc
index 98945bf9d..75b2c981 100644
--- a/chrome/browser/ssl/ssl_error_classification.cc
+++ b/components/ssl_errors/error_classification.cc
@@ -1,10 +1,10 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
+// Copyright 2015 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include <vector>
+#include "components/ssl_errors/error_classification.h"
 
-#include "chrome/browser/ssl/ssl_error_classification.h"
+#include <vector>
 
 #include "base/build_time.h"
 #include "base/lazy_instance.h"
@@ -29,6 +29,7 @@
 using base::TimeTicks;
 using base::TimeDelta;
 
+namespace ssl_errors {
 namespace {
 
 // Events for UMA. Do not reorder or change!
@@ -60,16 +61,15 @@
   }
 }
 
-int GetLevensteinDistance(const std::string& str1,
-                          const std::string& str2) {
+size_t GetLevensteinDistance(const std::string& str1, const std::string& str2) {
   if (str1 == str2)
     return 0;
   if (str1.size() == 0)
     return str2.size();
   if (str2.size() == 0)
     return str1.size();
-  std::vector<int> kFirstRow(str2.size() + 1, 0);
-  std::vector<int> kSecondRow(str2.size() + 1, 0);
+  std::vector<size_t> kFirstRow(str2.size() + 1, 0);
+  std::vector<size_t> kSecondRow(str2.size() + 1, 0);
 
   for (size_t i = 0; i < kFirstRow.size(); ++i)
     kFirstRow[i] = i;
@@ -77,8 +77,9 @@
     kSecondRow[0] = i + 1;
     for (size_t j = 0; j < str2.size(); ++j) {
       int cost = str1[i] == str2[j] ? 0 : 1;
-      kSecondRow[j+1] = std::min(std::min(
-          kSecondRow[j] + 1, kFirstRow[j + 1] + 1), kFirstRow[j] + cost);
+      kSecondRow[j + 1] =
+          std::min(std::min(kSecondRow[j] + 1, kFirstRow[j + 1] + 1),
+                   kFirstRow[j] + cost);
     }
     for (size_t j = 0; j < kFirstRow.size(); j++)
       kFirstRow[j] = kSecondRow[j];
@@ -86,160 +87,24 @@
   return kSecondRow[str2.size()];
 }
 
-// The time to use when doing build time operations in browser tests.
-base::LazyInstance<base::Time> g_testing_build_time = LAZY_INSTANCE_INITIALIZER;
-
-} // namespace
-
-SSLErrorClassification::SSLErrorClassification(const base::Time& current_time,
-                                               const GURL& url,
-                                               int cert_error,
-                                               const net::X509Certificate& cert)
-    : current_time_(current_time),
-      request_url_(url),
-      cert_error_(cert_error),
-      cert_(cert) {}
-
-SSLErrorClassification::~SSLErrorClassification() { }
-
-void SSLErrorClassification::RecordUMAStatistics(
-    bool overridable) const {
-  ssl_errors::ErrorInfo::ErrorType type =
-      ssl_errors::ErrorInfo::NetErrorToErrorType(cert_error_);
-  UMA_HISTOGRAM_ENUMERATION("interstitial.ssl_error_type", type,
-                            ssl_errors::ErrorInfo::END_OF_ENUM);
-  switch (type) {
-    case ssl_errors::ErrorInfo::CERT_DATE_INVALID: {
-      if (IsUserClockInThePast(base::Time::NowFromSystemTime())) {
-        RecordSSLInterstitialCause(overridable, CLOCK_PAST);
-      } else if (IsUserClockInTheFuture(base::Time::NowFromSystemTime())) {
-        RecordSSLInterstitialCause(overridable, CLOCK_FUTURE);
-      } else if (cert_.HasExpired() &&
-                 (current_time_ - cert_.valid_expiry()).InDays() < 28) {
-        RecordSSLInterstitialCause(overridable, EXPIRED_RECENTLY);
-      }
-      break;
-    }
-    case ssl_errors::ErrorInfo::CERT_COMMON_NAME_INVALID: {
-      std::string host_name = request_url_.host();
-      if (IsHostNameKnownTLD(host_name)) {
-        Tokens host_name_tokens = Tokenize(host_name);
-        if (IsWWWSubDomainMatch())
-          RecordSSLInterstitialCause(overridable, WWW_SUBDOMAIN_MATCH);
-        if (IsSubDomainOutsideWildcard(host_name_tokens))
-          RecordSSLInterstitialCause(overridable, SUBDOMAIN_OUTSIDE_WILDCARD);
-        std::vector<std::string> dns_names;
-        cert_.GetDNSNames(&dns_names);
-        std::vector<Tokens> dns_name_tokens = GetTokenizedDNSNames(dns_names);
-        if (NameUnderAnyNames(host_name_tokens, dns_name_tokens))
-          RecordSSLInterstitialCause(overridable, SUBDOMAIN_MATCH);
-        if (AnyNamesUnderName(dns_name_tokens, host_name_tokens))
-          RecordSSLInterstitialCause(overridable, SUBDOMAIN_INVERSE_MATCH);
-        if (IsCertLikelyFromMultiTenantHosting())
-          RecordSSLInterstitialCause(overridable, LIKELY_MULTI_TENANT_HOSTING);
-        if (IsCertLikelyFromSameDomain())
-          RecordSSLInterstitialCause(overridable, LIKELY_SAME_DOMAIN);
-      } else {
-         RecordSSLInterstitialCause(overridable, HOST_NAME_NOT_KNOWN_TLD);
-      }
-      break;
-    }
-    case ssl_errors::ErrorInfo::CERT_AUTHORITY_INVALID: {
-      const std::string& hostname = request_url_.HostNoBrackets();
-      if (net::IsLocalhost(hostname))
-        RecordSSLInterstitialCause(overridable, LOCALHOST);
-      if (IsHostnameNonUniqueOrDotless(hostname))
-        RecordSSLInterstitialCause(overridable, PRIVATE_URL);
-      if (net::X509Certificate::IsSelfSigned(cert_.os_cert_handle()))
-        RecordSSLInterstitialCause(overridable, SELF_SIGNED);
-      break;
-    }
-    default:
-      break;
-  }
-  UMA_HISTOGRAM_ENUMERATION("interstitial.ssl.connection_type",
-                            net::NetworkChangeNotifier::GetConnectionType(),
-                            net::NetworkChangeNotifier::CONNECTION_LAST);
-}
-
-bool SSLErrorClassification::IsUserClockInThePast(const base::Time& time_now) {
-  base::Time build_time;
-  if (!g_testing_build_time.Get().is_null()) {
-    build_time = g_testing_build_time.Get();
-  } else {
-#if defined(DONT_EMBED_BUILD_METADATA) && !defined(OFFICIAL_BUILD)
-    return false;
-#else
-    build_time = base::GetBuildTime();
-#endif
-  }
-
-  if (time_now < build_time - base::TimeDelta::FromDays(2))
-    return true;
-  return false;
-}
-
-bool SSLErrorClassification::IsUserClockInTheFuture(
-    const base::Time& time_now) {
-  base::Time build_time;
-  if (!g_testing_build_time.Get().is_null()) {
-    build_time = g_testing_build_time.Get();
-  } else {
-#if defined(DONT_EMBED_BUILD_METADATA) && !defined(OFFICIAL_BUILD)
-    return false;
-#else
-    build_time = base::GetBuildTime();
-#endif
-  }
-
-  if (time_now > build_time + base::TimeDelta::FromDays(365))
-    return true;
-  return false;
-}
-
-// static
-void SSLErrorClassification::SetBuildTimeForTesting(
-    const base::Time& testing_time) {
-  g_testing_build_time.Get() = testing_time;
-}
-
-bool SSLErrorClassification::MaybeWindowsLacksSHA256Support() {
-#if defined(OS_WIN)
-  return !base::win::MaybeHasSHA256Support();
-#else
-  return false;
-#endif
-}
-
-bool SSLErrorClassification::IsHostNameKnownTLD(const std::string& host_name) {
-  size_t tld_length =
-      net::registry_controlled_domains::GetRegistryLength(
-          host_name,
-          net::registry_controlled_domains::EXCLUDE_UNKNOWN_REGISTRIES,
-          net::registry_controlled_domains::INCLUDE_PRIVATE_REGISTRIES);
-  if (tld_length == 0 || tld_length == std::string::npos)
-    return false;
-  return true;
-}
-
-std::vector<SSLErrorClassification::Tokens> SSLErrorClassification::
-GetTokenizedDNSNames(const std::vector<std::string>& dns_names) {
-  std::vector<std::vector<std::string>> dns_name_tokens;
-  for (size_t i = 0; i < dns_names.size(); ++i) {
-    std::vector<std::string> dns_name_token_single;
-    if (dns_names[i].empty() || dns_names[i].find('\0') != std::string::npos
-        || !(IsHostNameKnownTLD(dns_names[i]))) {
+std::vector<HostnameTokens> GetTokenizedDNSNames(
+    const std::vector<std::string>& dns_names) {
+  std::vector<HostnameTokens> dns_name_tokens;
+  for (const auto& dns_name : dns_names) {
+    HostnameTokens dns_name_token_single;
+    if (dns_name.empty() || dns_name.find('\0') != std::string::npos ||
+        !(IsHostNameKnownTLD(dns_name))) {
       dns_name_token_single.push_back(std::string());
     } else {
-      dns_name_token_single = Tokenize(dns_names[i]);
+      dns_name_token_single = Tokenize(dns_name);
     }
     dns_name_tokens.push_back(dns_name_token_single);
   }
   return dns_name_tokens;
 }
 
-size_t SSLErrorClassification::FindSubDomainDifference(
-    const Tokens& potential_subdomain, const Tokens& parent) const {
+size_t FindSubDomainDifference(const HostnameTokens& potential_subdomain,
+                               const HostnameTokens& parent) {
   // A check to ensure that the number of tokens in the tokenized_parent is
   // less than the tokenized_potential_subdomain.
   if (parent.size() >= potential_subdomain.size())
@@ -256,17 +121,141 @@
   return 0;
 }
 
-SSLErrorClassification::Tokens SSLErrorClassification::
-Tokenize(const std::string& name) {
-  return base::SplitString(
-      name, ".", base::KEEP_WHITESPACE, base::SPLIT_WANT_ALL);
+// The time to use when doing build time operations in browser tests.
+base::LazyInstance<base::Time> g_testing_build_time = LAZY_INSTANCE_INITIALIZER;
+
+}  // namespace
+
+void RecordUMAStatistics(bool overridable,
+                         const base::Time& current_time,
+                         const GURL& request_url,
+                         int cert_error,
+                         const net::X509Certificate& cert) {
+  ssl_errors::ErrorInfo::ErrorType type =
+      ssl_errors::ErrorInfo::NetErrorToErrorType(cert_error);
+  UMA_HISTOGRAM_ENUMERATION("interstitial.ssl_error_type", type,
+                            ssl_errors::ErrorInfo::END_OF_ENUM);
+  switch (type) {
+    case ssl_errors::ErrorInfo::CERT_DATE_INVALID: {
+      if (IsUserClockInThePast(base::Time::NowFromSystemTime())) {
+        RecordSSLInterstitialCause(overridable, CLOCK_PAST);
+      } else if (IsUserClockInTheFuture(base::Time::NowFromSystemTime())) {
+        RecordSSLInterstitialCause(overridable, CLOCK_FUTURE);
+      } else if (cert.HasExpired() &&
+                 (current_time - cert.valid_expiry()).InDays() < 28) {
+        RecordSSLInterstitialCause(overridable, EXPIRED_RECENTLY);
+      }
+      break;
+    }
+    case ssl_errors::ErrorInfo::CERT_COMMON_NAME_INVALID: {
+      std::string host_name = request_url.host();
+      if (IsHostNameKnownTLD(host_name)) {
+        HostnameTokens host_name_tokens = Tokenize(host_name);
+        if (IsWWWSubDomainMatch(request_url, cert))
+          RecordSSLInterstitialCause(overridable, WWW_SUBDOMAIN_MATCH);
+        if (IsSubDomainOutsideWildcard(request_url, cert))
+          RecordSSLInterstitialCause(overridable, SUBDOMAIN_OUTSIDE_WILDCARD);
+        std::vector<std::string> dns_names;
+        cert.GetDNSNames(&dns_names);
+        std::vector<HostnameTokens> dns_name_tokens =
+            GetTokenizedDNSNames(dns_names);
+        if (NameUnderAnyNames(host_name_tokens, dns_name_tokens))
+          RecordSSLInterstitialCause(overridable, SUBDOMAIN_MATCH);
+        if (AnyNamesUnderName(dns_name_tokens, host_name_tokens))
+          RecordSSLInterstitialCause(overridable, SUBDOMAIN_INVERSE_MATCH);
+        if (IsCertLikelyFromMultiTenantHosting(request_url, cert))
+          RecordSSLInterstitialCause(overridable, LIKELY_MULTI_TENANT_HOSTING);
+        if (IsCertLikelyFromSameDomain(request_url, cert))
+          RecordSSLInterstitialCause(overridable, LIKELY_SAME_DOMAIN);
+      } else {
+        RecordSSLInterstitialCause(overridable, HOST_NAME_NOT_KNOWN_TLD);
+      }
+      break;
+    }
+    case ssl_errors::ErrorInfo::CERT_AUTHORITY_INVALID: {
+      const std::string& hostname = request_url.HostNoBrackets();
+      if (net::IsLocalhost(hostname))
+        RecordSSLInterstitialCause(overridable, LOCALHOST);
+      if (IsHostnameNonUniqueOrDotless(hostname))
+        RecordSSLInterstitialCause(overridable, PRIVATE_URL);
+      if (net::X509Certificate::IsSelfSigned(cert.os_cert_handle()))
+        RecordSSLInterstitialCause(overridable, SELF_SIGNED);
+      break;
+    }
+    default:
+      break;
+  }
+  UMA_HISTOGRAM_ENUMERATION("interstitial.ssl.connection_type",
+                            net::NetworkChangeNotifier::GetConnectionType(),
+                            net::NetworkChangeNotifier::CONNECTION_LAST);
+}
+
+bool IsUserClockInThePast(const base::Time& time_now) {
+  base::Time build_time;
+  if (!g_testing_build_time.Get().is_null()) {
+    build_time = g_testing_build_time.Get();
+  } else {
+#if defined(DONT_EMBED_BUILD_METADATA) && !defined(OFFICIAL_BUILD)
+    return false;
+#else
+    build_time = base::GetBuildTime();
+#endif
+  }
+
+  if (time_now < build_time - base::TimeDelta::FromDays(2))
+    return true;
+  return false;
+}
+
+bool IsUserClockInTheFuture(const base::Time& time_now) {
+  base::Time build_time;
+  if (!g_testing_build_time.Get().is_null()) {
+    build_time = g_testing_build_time.Get();
+  } else {
+#if defined(DONT_EMBED_BUILD_METADATA) && !defined(OFFICIAL_BUILD)
+    return false;
+#else
+    build_time = base::GetBuildTime();
+#endif
+  }
+
+  if (time_now > build_time + base::TimeDelta::FromDays(365))
+    return true;
+  return false;
+}
+
+void SetBuildTimeForTesting(const base::Time& testing_time) {
+  g_testing_build_time.Get() = testing_time;
+}
+
+bool IsHostNameKnownTLD(const std::string& host_name) {
+  size_t tld_length = net::registry_controlled_domains::GetRegistryLength(
+      host_name, net::registry_controlled_domains::EXCLUDE_UNKNOWN_REGISTRIES,
+      net::registry_controlled_domains::INCLUDE_PRIVATE_REGISTRIES);
+  if (tld_length == 0 || tld_length == std::string::npos)
+    return false;
+  return true;
+}
+
+HostnameTokens Tokenize(const std::string& name) {
+  return base::SplitString(name, ".", base::KEEP_WHITESPACE,
+                           base::SPLIT_WANT_ALL);
 }
 
 // We accept the inverse case for www for historical reasons.
-bool SSLErrorClassification::GetWWWSubDomainMatch(
-    const std::string& host_name,
-    const std::vector<std::string>& dns_names,
-    std::string* www_match_host_name) {
+bool IsWWWSubDomainMatch(const GURL& request_url,
+                         const net::X509Certificate& cert) {
+  std::string www_host;
+  std::vector<std::string> dns_names;
+  cert.GetDNSNames(&dns_names);
+  return GetWWWSubDomainMatch(request_url, dns_names, &www_host);
+}
+
+bool GetWWWSubDomainMatch(const GURL& request_url,
+                          const std::vector<std::string>& dns_names,
+                          std::string* www_match_host_name) {
+  const std::string& host_name = request_url.host();
+
   if (IsHostNameKnownTLD(host_name)) {
     // Need to account for all possible domains given in the SSL certificate.
     for (size_t i = 0; i < dns_names.size(); ++i) {
@@ -293,17 +282,8 @@
   return false;
 }
 
-bool SSLErrorClassification::IsWWWSubDomainMatch() const {
-  const std::string& host_name = request_url_.host();
-  std::vector<std::string> dns_names;
-  cert_.GetDNSNames(&dns_names);
-  std::string www_host;
-  return GetWWWSubDomainMatch(host_name, dns_names, &www_host);
-}
-
-bool SSLErrorClassification::NameUnderAnyNames(
-    const Tokens& child,
-    const std::vector<Tokens>& potential_parents) const {
+bool NameUnderAnyNames(const HostnameTokens& child,
+                       const std::vector<HostnameTokens>& potential_parents) {
   bool result = false;
   // Need to account for all the possible domains given in the SSL certificate.
   for (size_t i = 0; i < potential_parents.size(); ++i) {
@@ -311,18 +291,16 @@
         potential_parents[i].size() >= child.size()) {
       result = result || false;
     } else {
-      size_t domain_diff = FindSubDomainDifference(child,
-                                                   potential_parents[i]);
-      if (domain_diff == 1 &&  child[0] != "www")
+      size_t domain_diff = FindSubDomainDifference(child, potential_parents[i]);
+      if (domain_diff == 1 && child[0] != "www")
         result = result || true;
     }
   }
   return result;
 }
 
-bool SSLErrorClassification::AnyNamesUnderName(
-    const std::vector<Tokens>& potential_children,
-    const Tokens& parent) const {
+bool AnyNamesUnderName(const std::vector<HostnameTokens>& potential_children,
+                       const HostnameTokens& parent) {
   bool result = false;
   // Need to account for all the possible domains given in the SSL certificate.
   for (size_t i = 0; i < potential_children.size(); ++i) {
@@ -330,20 +308,21 @@
         potential_children[i].size() <= parent.size()) {
       result = result || false;
     } else {
-      size_t domain_diff = FindSubDomainDifference(potential_children[i],
-                                                   parent);
-      if (domain_diff == 1 &&  potential_children[i][0] != "www")
+      size_t domain_diff =
+          FindSubDomainDifference(potential_children[i], parent);
+      if (domain_diff == 1 && potential_children[i][0] != "www")
         result = result || true;
     }
   }
   return result;
 }
 
-bool SSLErrorClassification::IsSubDomainOutsideWildcard(
-    const Tokens& host_name_tokens) const {
-  std::string host_name = request_url_.host();
+bool IsSubDomainOutsideWildcard(const GURL& request_url,
+                                const net::X509Certificate& cert) {
+  std::string host_name = request_url.host();
+  HostnameTokens host_name_tokens = Tokenize(host_name);
   std::vector<std::string> dns_names;
-  cert_.GetDNSNames(&dns_names);
+  cert.GetDNSNames(&dns_names);
   bool result = false;
 
   // This method requires that the host name be longer than the dns name on
@@ -351,27 +330,27 @@
   for (size_t i = 0; i < dns_names.size(); ++i) {
     const std::string& name = dns_names[i];
     if (name.length() < 2 || name.length() >= host_name.length() ||
-        name.find('\0') != std::string::npos ||
-        !IsHostNameKnownTLD(name)
-        || name[0] != '*' || name[1] != '.') {
+        name.find('\0') != std::string::npos || !IsHostNameKnownTLD(name) ||
+        name[0] != '*' || name[1] != '.') {
       continue;
     }
 
     // Move past the "*.".
     std::string extracted_dns_name = name.substr(2);
-    if (FindSubDomainDifference(
-        host_name_tokens, Tokenize(extracted_dns_name)) == 2) {
+    if (FindSubDomainDifference(host_name_tokens,
+                                Tokenize(extracted_dns_name)) == 2) {
       return true;
     }
   }
   return result;
 }
 
-bool SSLErrorClassification::IsCertLikelyFromMultiTenantHosting() const {
-  std::string host_name = request_url_.host();
+bool IsCertLikelyFromMultiTenantHosting(const GURL& request_url,
+                                        const net::X509Certificate& cert) {
+  std::string host_name = request_url.host();
   std::vector<std::string> dns_names;
   std::vector<std::string> dns_names_domain;
-  cert_.GetDNSNames(&dns_names);
+  cert.GetDNSNames(&dns_names);
   size_t dns_names_size = dns_names.size();
 
   // If there is only 1 DNS name then it is definitely not a shared certificate.
@@ -382,8 +361,7 @@
   // the same or not.
   for (size_t i = 0; i < dns_names_size; ++i) {
     dns_names_domain.push_back(
-        net::registry_controlled_domains::
-        GetDomainAndRegistry(
+        net::registry_controlled_domains::GetDomainAndRegistry(
             dns_names[i],
             net::registry_controlled_domains::INCLUDE_PRIVATE_REGISTRIES));
   }
@@ -404,10 +382,10 @@
   // considered as a shared certificate. Include the host name in the URL also
   // while comparing.
   dns_names.push_back(host_name);
-  static const int kMinimumEditDsitance = 5;
+  static const size_t kMinimumEditDsitance = 5;
   for (size_t i = 0; i < dns_names_size; ++i) {
     for (size_t j = i + 1; j < dns_names_size; ++j) {
-      int edit_distance = GetLevensteinDistance(dns_names[i], dns_names[j]);
+      size_t edit_distance = GetLevensteinDistance(dns_names[i], dns_names[j]);
       if (edit_distance < kMinimumEditDsitance)
         return false;
     }
@@ -415,10 +393,11 @@
   return true;
 }
 
-bool SSLErrorClassification::IsCertLikelyFromSameDomain() const {
-  std::string host_name = request_url_.host();
+bool IsCertLikelyFromSameDomain(const GURL& request_url,
+                                const net::X509Certificate& cert) {
+  std::string host_name = request_url.host();
   std::vector<std::string> dns_names;
-  cert_.GetDNSNames(&dns_names);
+  cert.GetDNSNames(&dns_names);
 
   dns_names.push_back(host_name);
   std::vector<std::string> dns_names_domain;
@@ -438,9 +417,9 @@
                    host_name_domain) != dns_names_domain.end() - 1;
 }
 
-// static
-bool SSLErrorClassification::IsHostnameNonUniqueOrDotless(
-    const std::string& hostname) {
+bool IsHostnameNonUniqueOrDotless(const std::string& hostname) {
   return net::IsHostnameNonUnique(hostname) ||
          hostname.find('.') == std::string::npos;
 }
+
+}  // namespace ssl_errors
diff --git a/components/ssl_errors/error_classification.h b/components/ssl_errors/error_classification.h
new file mode 100644
index 0000000..3e8ce96f
--- /dev/null
+++ b/components/ssl_errors/error_classification.h
@@ -0,0 +1,109 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_SSL_ERRORS_ERROR_CLASSIFICATION_H_
+#define COMPONENTS_SSL_ERRORS_ERROR_CLASSIFICATION_H_
+
+#include <string>
+#include <vector>
+
+namespace base {
+class Time;
+}
+
+class GURL;
+
+namespace net {
+class X509Certificate;
+}
+
+namespace ssl_errors {
+
+typedef std::vector<std::string> HostnameTokens;
+
+// Methods for identifying specific error causes. ------------------------------
+
+// Returns true if the system time is in the past.
+bool IsUserClockInThePast(const base::Time& time_now);
+
+// Returns true if the system time is too far in the future or the user is
+// using a version of Chrome which is more than 1 year old.
+bool IsUserClockInTheFuture(const base::Time& time_now);
+
+// Returns true if |hostname| is too broad for the scope of a wildcard
+// certificate. E.g.:
+//     a.b.example.com ~ *.example.com --> true
+//     b.example.com ~ *.example.com --> false
+bool IsSubDomainOutsideWildcard(const GURL& request_url,
+                                const net::X509Certificate& cert);
+
+// Returns true if the certificate is a shared certificate. Note - This
+// function should be used with caution (only for UMA histogram) as an
+// attacker could easily get a certificate with more than 5 names in the SAN
+// fields.
+bool IsCertLikelyFromMultiTenantHosting(const GURL& request_url,
+                                        const net::X509Certificate& cert);
+
+// Returns true if the hostname in |request_url_| has the same domain
+// (effective TLD + 1 label) as at least one of the subject
+// alternative names in |cert_|.
+bool IsCertLikelyFromSameDomain(const GURL& request_url,
+                                const net::X509Certificate& cert);
+
+// Returns true if the site's hostname differs from one of the DNS
+// names in the certificate (CN or SANs) only by the presence or
+// absence of the single-label prefix "www". E.g.: (The first domain
+// is hostname and the second domain is a DNS name in the certificate)
+//     www.example.com ~ example.com -> true
+//     example.com ~ www.example.com -> true
+//     www.food.example.com ~ example.com -> false
+//     mail.example.com ~ example.com -> false
+bool IsWWWSubDomainMatch(const GURL& request_url,
+                         const net::X509Certificate& cert);
+
+// Provides the output of IsWWWSubDomainMatch() as well as the matching name.
+bool GetWWWSubDomainMatch(const GURL& request_url,
+                          const std::vector<std::string>& dns_names,
+                          std::string* www_match_host_name);
+
+// Method for recording results. -----------------------------------------------
+
+void RecordUMAStatistics(bool overridable,
+                         const base::Time& current_time,
+                         const GURL& request_url,
+                         int cert_error,
+                         const net::X509Certificate& cert);
+
+// Helper methods for classification. ------------------------------------------
+
+// Tokenize DNS names and hostnames.
+HostnameTokens Tokenize(const std::string& name);
+
+// Sets a clock for browser tests that check the build time. Used by
+// IsUserClockInThePast and IsUserClockInTheFuture.
+void SetBuildTimeForTesting(const base::Time& testing_time);
+
+// Returns true if the hostname has a known Top Level Domain.
+bool IsHostNameKnownTLD(const std::string& host_name);
+
+// Returns true if any one of the following conditions hold:
+// 1.|hostname| is an IP Address in an IANA-reserved range.
+// 2.|hostname| is a not-yet-assigned by ICANN gTLD.
+// 3.|hostname| is a dotless domain.
+bool IsHostnameNonUniqueOrDotless(const std::string& hostname);
+
+// Returns true if |child| is a subdomain of any of the |potential_parents|.
+bool NameUnderAnyNames(const HostnameTokens& child,
+                       const std::vector<HostnameTokens>& potential_parents);
+
+// Returns true if any of the |potential_children| is a subdomain of the
+// |parent|. The inverse case should be treated carefully as this is most
+// likely a MITM attack. We don't want foo.appspot.com to be able to MITM for
+// appspot.com.
+bool AnyNamesUnderName(const std::vector<HostnameTokens>& potential_children,
+                       const HostnameTokens& parent);
+
+}  // namespace ssl_errors
+
+#endif  // COMPONENTS_SSL_ERRORS_ERROR_CLASSIFICATION_H_
diff --git a/components/ssl_errors/error_classification_unittest.cc b/components/ssl_errors/error_classification_unittest.cc
new file mode 100644
index 0000000..2defc23
--- /dev/null
+++ b/components/ssl_errors/error_classification_unittest.cc
@@ -0,0 +1,130 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/ssl_errors/error_classification.h"
+
+#include "base/files/file_path.h"
+#include "base/strings/string_split.h"
+#include "net/base/net_errors.h"
+#include "net/base/test_data_directory.h"
+#include "net/cert/x509_cert_types.h"
+#include "net/cert/x509_certificate.h"
+#include "net/test/cert_test_util.h"
+#include "net/test/test_certificate_data.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "url/gurl.h"
+
+class SSLErrorClassificationTest : public testing::Test {};
+
+TEST_F(SSLErrorClassificationTest, TestNameMismatch) {
+  scoped_refptr<net::X509Certificate> google_cert(
+      net::X509Certificate::CreateFromBytes(
+          reinterpret_cast<const char*>(google_der), sizeof(google_der)));
+  ASSERT_NE(static_cast<net::X509Certificate*>(NULL), google_cert.get());
+  std::vector<std::string> dns_names_google;
+  dns_names_google.push_back("www");
+  dns_names_google.push_back("google");
+  dns_names_google.push_back("com");
+  std::vector<std::vector<std::string>> dns_name_tokens_google;
+  dns_name_tokens_google.push_back(dns_names_google);
+  {
+    GURL origin("https://google.com");
+    std::vector<std::string> host_name_tokens = base::SplitString(
+        origin.host(), ".", base::KEEP_WHITESPACE, base::SPLIT_WANT_ALL);
+    EXPECT_TRUE(ssl_errors::IsWWWSubDomainMatch(origin, *google_cert));
+    EXPECT_FALSE(ssl_errors::NameUnderAnyNames(host_name_tokens,
+                                               dns_name_tokens_google));
+    EXPECT_FALSE(ssl_errors::AnyNamesUnderName(dns_name_tokens_google,
+                                               host_name_tokens));
+    EXPECT_FALSE(ssl_errors::IsSubDomainOutsideWildcard(origin, *google_cert));
+    EXPECT_FALSE(
+        ssl_errors::IsCertLikelyFromMultiTenantHosting(origin, *google_cert));
+    EXPECT_TRUE(ssl_errors::IsCertLikelyFromSameDomain(origin, *google_cert));
+  }
+
+  {
+    GURL origin("https://foo.blah.google.com");
+    std::vector<std::string> host_name_tokens = base::SplitString(
+        origin.host(), ".", base::KEEP_WHITESPACE, base::SPLIT_WANT_ALL);
+    EXPECT_FALSE(ssl_errors::IsWWWSubDomainMatch(origin, *google_cert));
+    EXPECT_FALSE(ssl_errors::NameUnderAnyNames(host_name_tokens,
+                                               dns_name_tokens_google));
+    EXPECT_FALSE(ssl_errors::AnyNamesUnderName(dns_name_tokens_google,
+                                               host_name_tokens));
+    EXPECT_TRUE(ssl_errors::IsCertLikelyFromSameDomain(origin, *google_cert));
+  }
+
+  {
+    GURL origin("https://foo.www.google.com");
+    std::vector<std::string> host_name_tokens = base::SplitString(
+        origin.host(), ".", base::KEEP_WHITESPACE, base::SPLIT_WANT_ALL);
+    EXPECT_FALSE(ssl_errors::IsWWWSubDomainMatch(origin, *google_cert));
+    EXPECT_TRUE(ssl_errors::NameUnderAnyNames(host_name_tokens,
+                                              dns_name_tokens_google));
+    EXPECT_FALSE(ssl_errors::AnyNamesUnderName(dns_name_tokens_google,
+                                               host_name_tokens));
+    EXPECT_TRUE(ssl_errors::IsCertLikelyFromSameDomain(origin, *google_cert));
+  }
+
+  {
+    GURL origin("https://www.google.com.foo");
+    std::vector<std::string> host_name_tokens = base::SplitString(
+        origin.host(), ".", base::KEEP_WHITESPACE, base::SPLIT_WANT_ALL);
+    EXPECT_FALSE(ssl_errors::IsWWWSubDomainMatch(origin, *google_cert));
+    EXPECT_FALSE(ssl_errors::NameUnderAnyNames(host_name_tokens,
+                                               dns_name_tokens_google));
+    EXPECT_FALSE(ssl_errors::AnyNamesUnderName(dns_name_tokens_google,
+                                               host_name_tokens));
+    EXPECT_FALSE(ssl_errors::IsCertLikelyFromSameDomain(origin, *google_cert));
+  }
+
+  {
+    GURL origin("https://www.foogoogle.com.");
+    std::vector<std::string> host_name_tokens = base::SplitString(
+        origin.host(), ".", base::KEEP_WHITESPACE, base::SPLIT_WANT_ALL);
+    EXPECT_FALSE(ssl_errors::IsWWWSubDomainMatch(origin, *google_cert));
+    EXPECT_FALSE(ssl_errors::NameUnderAnyNames(host_name_tokens,
+                                               dns_name_tokens_google));
+    EXPECT_FALSE(ssl_errors::AnyNamesUnderName(dns_name_tokens_google,
+                                               host_name_tokens));
+    EXPECT_FALSE(ssl_errors::IsCertLikelyFromSameDomain(origin, *google_cert));
+  }
+
+  scoped_refptr<net::X509Certificate> webkit_cert(
+      net::X509Certificate::CreateFromBytes(
+          reinterpret_cast<const char*>(webkit_der), sizeof(webkit_der)));
+  ASSERT_NE(static_cast<net::X509Certificate*>(NULL), webkit_cert.get());
+  std::vector<std::string> dns_names_webkit;
+  dns_names_webkit.push_back("webkit");
+  dns_names_webkit.push_back("org");
+  std::vector<std::vector<std::string>> dns_name_tokens_webkit;
+  dns_name_tokens_webkit.push_back(dns_names_webkit);
+  {
+    GURL origin("https://a.b.webkit.org");
+    std::vector<std::string> host_name_tokens = base::SplitString(
+        origin.host(), ".", base::KEEP_WHITESPACE, base::SPLIT_WANT_ALL);
+    EXPECT_FALSE(ssl_errors::IsWWWSubDomainMatch(origin, *webkit_cert));
+    EXPECT_FALSE(ssl_errors::NameUnderAnyNames(host_name_tokens,
+                                               dns_name_tokens_webkit));
+    EXPECT_FALSE(ssl_errors::AnyNamesUnderName(dns_name_tokens_webkit,
+                                               host_name_tokens));
+    EXPECT_TRUE(ssl_errors::IsSubDomainOutsideWildcard(origin, *webkit_cert));
+    EXPECT_FALSE(
+        ssl_errors::IsCertLikelyFromMultiTenantHosting(origin, *webkit_cert));
+    EXPECT_TRUE(ssl_errors::IsCertLikelyFromSameDomain(origin, *webkit_cert));
+  }
+}
+
+TEST_F(SSLErrorClassificationTest, TestHostNameHasKnownTLD) {
+  EXPECT_TRUE(ssl_errors::IsHostNameKnownTLD("www.google.com"));
+  EXPECT_TRUE(ssl_errors::IsHostNameKnownTLD("b.appspot.com"));
+  EXPECT_FALSE(ssl_errors::IsHostNameKnownTLD("a.private"));
+}
+
+TEST_F(SSLErrorClassificationTest, TestPrivateURL) {
+  EXPECT_FALSE(ssl_errors::IsHostnameNonUniqueOrDotless("www.foogoogle.com."));
+  EXPECT_TRUE(ssl_errors::IsHostnameNonUniqueOrDotless("go"));
+  EXPECT_TRUE(ssl_errors::IsHostnameNonUniqueOrDotless("172.17.108.108"));
+  EXPECT_TRUE(ssl_errors::IsHostnameNonUniqueOrDotless("foo.blah"));
+}
diff --git a/components/test_runner/web_ax_object_proxy.cc b/components/test_runner/web_ax_object_proxy.cc
index 8c91d97..1c3b8d7 100644
--- a/components/test_runner/web_ax_object_proxy.cc
+++ b/components/test_runner/web_ax_object_proxy.cc
@@ -259,16 +259,6 @@
   }
 }
 
-std::string DeprecatedGetDescription(const blink::WebAXObject& object) {
-  std::string description = object.deprecatedAccessibilityDescription().utf8();
-  return description.insert(0, "AXDescription: ");
-}
-
-std::string DeprecatedGetHelpText(const blink::WebAXObject& object) {
-  std::string help_text = object.deprecatedHelpText().utf8();
-  return help_text.insert(0, "AXHelp: ");
-}
-
 std::string GetStringValue(const blink::WebAXObject& object) {
   std::string value;
   if (object.role() == blink::WebAXRoleColorWell) {
@@ -298,11 +288,6 @@
   return role_string;
 }
 
-std::string DeprecatedGetTitle(const blink::WebAXObject& object) {
-  std::string title = object.deprecatedTitle().utf8();
-  return title.insert(0, "AXTitle: ");
-}
-
 std::string GetValueDescription(const blink::WebAXObject& object) {
   std::string value_description = object.valueDescription().utf8();
   return value_description.insert(0, "AXValueDescription: ");
@@ -314,12 +299,11 @@
 }
 
 std::string GetAttributes(const blink::WebAXObject& object) {
-  // FIXME: Concatenate all attributes of the AXObject.
-  std::string attributes(DeprecatedGetTitle(object));
+  blink::WebAXNameFrom nameFrom;
+  blink::WebVector<blink::WebAXObject> nameObjects;
+  std::string attributes(object.name(nameFrom, nameObjects).utf8());
   attributes.append("\n");
   attributes.append(GetRole(object));
-  attributes.append("\n");
-  attributes.append(DeprecatedGetDescription(object));
   return attributes;
 }
 
@@ -596,17 +580,6 @@
       .SetMethod("removeNotificationListener",
                  &WebAXObjectProxy::UnsetNotificationListener)
       //
-      // DEPRECATED accessible name and description accessors
-      //
-      .SetProperty("deprecatedTitle",
-                   &WebAXObjectProxy::DeprecatedTitle)
-      .SetProperty("deprecatedDescription",
-                   &WebAXObjectProxy::DeprecatedDescription)
-      .SetProperty("deprecatedHelpText",
-                   &WebAXObjectProxy::DeprecatedHelpText)
-      .SetMethod("deprecatedTitleUIElement",
-                 &WebAXObjectProxy::DeprecatedTitleUIElement)
-      //
       // NEW accessible name and description accessors
       //
       .SetProperty("name", &WebAXObjectProxy::Name)
@@ -667,21 +640,6 @@
   return GetRole(accessibility_object_);
 }
 
-std::string WebAXObjectProxy::DeprecatedTitle() {
-  accessibility_object_.updateLayoutAndCheckValidity();
-  return DeprecatedGetTitle(accessibility_object_);
-}
-
-std::string WebAXObjectProxy::DeprecatedDescription() {
-  accessibility_object_.updateLayoutAndCheckValidity();
-  return DeprecatedGetDescription(accessibility_object_);
-}
-
-std::string WebAXObjectProxy::DeprecatedHelpText() {
-  accessibility_object_.updateLayoutAndCheckValidity();
-  return DeprecatedGetHelpText(accessibility_object_);
-}
-
 std::string WebAXObjectProxy::StringValue() {
   accessibility_object_.updateLayoutAndCheckValidity();
   return GetStringValue(accessibility_object_);
@@ -1165,15 +1123,6 @@
   return factory_->GetOrCreate(obj);
 }
 
-v8::Local<v8::Object> WebAXObjectProxy::DeprecatedTitleUIElement() {
-  accessibility_object_.updateLayoutAndCheckValidity();
-  blink::WebAXObject obj = accessibility_object_.deprecatedTitleUIElement();
-  if (obj.isNull())
-    return v8::Local<v8::Object>();
-
-  return factory_->GetOrCreate(obj);
-}
-
 void WebAXObjectProxy::SetSelectedTextRange(int selection_start,
                                             int length) {
   accessibility_object_.updateLayoutAndCheckValidity();
diff --git a/components/test_runner/web_ax_object_proxy.h b/components/test_runner/web_ax_object_proxy.h
index a02f93d..d25fac64 100644
--- a/components/test_runner/web_ax_object_proxy.h
+++ b/components/test_runner/web_ax_object_proxy.h
@@ -163,13 +163,6 @@
   v8::Local<v8::Object> NextOnLine();
   v8::Local<v8::Object> PreviousOnLine();
 
-  // DEPRECATED accessible name and description accessors
-  std::string DeprecatedTitle();
-  std::string DeprecatedDescription();
-  std::string DeprecatedHelpText();
-  v8::Local<v8::Object> DeprecatedTitleUIElement();
-
-  // NEW accessible name and description accessors
   std::string Name();
   std::string NameFrom();
   int NameElementCount();
diff --git a/components/wallpaper/wallpaper_manager_base.cc b/components/wallpaper/wallpaper_manager_base.cc
index cd0bf89..d526dbe5 100644
--- a/components/wallpaper/wallpaper_manager_base.cc
+++ b/components/wallpaper/wallpaper_manager_base.cc
@@ -611,13 +611,16 @@
   if (!base::PathExists(valid_path)) {
     // Falls back to custom wallpaper that uses email as part of its file path.
     // Note that email is used instead of user_id_hash here.
+    LOG(ERROR) << "Failed to load custom wallpaper from its original fallback "
+                  "file path: " << valid_path.value();
     valid_path = GetCustomWallpaperPath(kOriginalWallpaperSubDir, user_id,
                                         info.location);
   }
 
   if (!base::PathExists(valid_path)) {
     LOG(ERROR) << "Failed to load previously selected custom wallpaper. "
-               << "Fallback to default wallpaper";
+               << "Fallback to default wallpaper. Expected wallpaper path: "
+               << wallpaper_path.value();
     BrowserThread::PostTask(
         BrowserThread::UI, FROM_HERE,
         base::Bind(&WallpaperManagerBase::DoSetDefaultWallpaper, weak_ptr,
diff --git a/content/browser/BUILD.gn b/content/browser/BUILD.gn
index b05a0c84..64a9267 100644
--- a/content/browser/BUILD.gn
+++ b/content/browser/BUILD.gn
@@ -421,6 +421,8 @@
     ]
   } else {  # Not aura.
     sources -= [
+      "media/capture/cursor_renderer_aura.cc",
+      "media/capture/cursor_renderer_aura.h",
       "renderer_host/compositor_resize_lock_aura.cc",
       "renderer_host/compositor_resize_lock_aura.h",
       "renderer_host/input/synthetic_gesture_target_aura.cc",
diff --git a/content/browser/accessibility/browser_accessibility_cocoa.mm b/content/browser/accessibility/browser_accessibility_cocoa.mm
index 4dbeff2..1007e5e6 100644
--- a/content/browser/accessibility/browser_accessibility_cocoa.mm
+++ b/content/browser/accessibility/browser_accessibility_cocoa.mm
@@ -259,11 +259,10 @@
   NSDictionary* dictionary = parameter;
 
   id startElementParameter = [dictionary objectForKey:@"AXStartElement"];
-  BrowserAccessibility* startNode = nullptr;
   if ([startElementParameter isKindOfClass:[BrowserAccessibilityCocoa class]]) {
     BrowserAccessibilityCocoa* startNodeCocoa =
         (BrowserAccessibilityCocoa*)startElementParameter;
-    startNode = [startNodeCocoa browserAccessibility];
+    search->SetStartNode([startNodeCocoa browserAccessibility]);
   }
 
   bool immediateDescendantsOnly = false;
@@ -297,7 +296,6 @@
   if ([searchTextParameter isKindOfClass:[NSString class]])
     searchText = base::SysNSStringToUTF8(searchTextParameter);
 
-  search->SetStartNode(startNode);
   search->SetDirection(direction);
   search->SetImmediateDescendantsOnly(immediateDescendantsOnly);
   search->SetVisibleOnly(visibleOnly);
diff --git a/content/browser/accessibility/one_shot_accessibility_tree_search.cc b/content/browser/accessibility/one_shot_accessibility_tree_search.cc
index 42e5d55..1757c997 100644
--- a/content/browser/accessibility/one_shot_accessibility_tree_search.cc
+++ b/content/browser/accessibility/one_shot_accessibility_tree_search.cc
@@ -46,6 +46,8 @@
 void OneShotAccessibilityTreeSearch::SetStartNode(
     BrowserAccessibility* start_node) {
   DCHECK(!did_search_);
+  CHECK(start_node);
+
   if (!scope_node_->GetParent() ||
       start_node->IsDescendantOf(scope_node_->GetParent())) {
     start_node_ = start_node;
diff --git a/content/browser/android/synchronous_compositor_host.cc b/content/browser/android/synchronous_compositor_host.cc
index 9c7d9ce3..6880bd1 100644
--- a/content/browser/android/synchronous_compositor_host.cc
+++ b/content/browser/android/synchronous_compositor_host.cc
@@ -40,6 +40,7 @@
   bool handled = true;
   IPC_BEGIN_MESSAGE_MAP(SynchronousCompositorHost, message)
     IPC_MESSAGE_HANDLER(SyncCompositorHostMsg_UpdateState, ProcessCommonParams)
+    IPC_MESSAGE_HANDLER(SyncCompositorHostMsg_OverScroll, OnOverScroll)
     IPC_MESSAGE_UNHANDLED(handled = false)
   IPC_END_MESSAGE_MAP()
   return handled;
@@ -158,6 +159,15 @@
   ProcessCommonParams(common_renderer_params);
 }
 
+void SynchronousCompositorHost::OnOverScroll(
+    const SyncCompositorCommonRendererParams& params,
+    const DidOverscrollParams& over_scroll_params) {
+  ProcessCommonParams(params);
+  client_->DidOverscroll(over_scroll_params.accumulated_overscroll,
+                         over_scroll_params.latest_overscroll_delta,
+                         over_scroll_params.current_fling_velocity);
+}
+
 void SynchronousCompositorHost::PopulateCommonParams(
     SyncCompositorCommonBrowserParams* params) {
   DCHECK(params);
diff --git a/content/browser/android/synchronous_compositor_host.h b/content/browser/android/synchronous_compositor_host.h
index 9def14f..0b741aa 100644
--- a/content/browser/android/synchronous_compositor_host.h
+++ b/content/browser/android/synchronous_compositor_host.h
@@ -19,6 +19,7 @@
 
 class RenderWidgetHostViewAndroid;
 class SynchronousCompositorClient;
+struct DidOverscrollParams;
 struct SyncCompositorCommonBrowserParams;
 struct SyncCompositorCommonRendererParams;
 
@@ -56,6 +57,8 @@
   void ProcessCommonParams(const SyncCompositorCommonRendererParams& params);
   void UpdateNeedsBeginFrames();
   void UpdateFrameMetaData(const cc::CompositorFrameMetadata& frame_metadata);
+  void OnOverScroll(const SyncCompositorCommonRendererParams& params,
+                    const DidOverscrollParams& over_scroll_params);
 
   RenderWidgetHostViewAndroid* const rwhva_;
   SynchronousCompositorClient* const client_;
diff --git a/content/browser/cache_storage/cache_storage_manager_unittest.cc b/content/browser/cache_storage/cache_storage_manager_unittest.cc
index 4c37584..99d5af3 100644
--- a/content/browser/cache_storage/cache_storage_manager_unittest.cc
+++ b/content/browser/cache_storage/cache_storage_manager_unittest.cc
@@ -294,12 +294,14 @@
   }
 
  protected:
+  // Temporary directory must be allocated first so as to be destroyed last.
+  base::ScopedTempDir temp_dir_;
+
   TestBrowserContext browser_context_;
   TestBrowserThreadBundle browser_thread_bundle_;
   scoped_ptr<net::URLRequestJobFactoryImpl> url_request_job_factory_;
   storage::BlobStorageContext* blob_storage_context_;
 
-  base::ScopedTempDir temp_dir_;
   scoped_refptr<MockQuotaManagerProxy> quota_manager_proxy_;
   scoped_ptr<CacheStorageManager> cache_manager_;
 
diff --git a/content/browser/compositor/delegated_frame_host.cc b/content/browser/compositor/delegated_frame_host.cc
index 293f96f9..2221c29d 100644
--- a/content/browser/compositor/delegated_frame_host.cc
+++ b/content/browser/compositor/delegated_frame_host.cc
@@ -4,6 +4,10 @@
 
 #include "content/browser/compositor/delegated_frame_host.h"
 
+#include <algorithm>
+#include <string>
+#include <vector>
+
 #include "base/callback_helpers.h"
 #include "base/command_line.h"
 #include "base/time/default_tick_clock.h"
@@ -154,11 +158,11 @@
 }
 
 void DelegatedFrameHost::CopyFromCompositingSurfaceToVideoFrame(
-      const gfx::Rect& src_subrect,
-      const scoped_refptr<media::VideoFrame>& target,
-      const base::Callback<void(bool)>& callback) {
+    const gfx::Rect& src_subrect,
+    const scoped_refptr<media::VideoFrame>& target,
+    const base::Callback<void(const gfx::Rect&, bool)>& callback) {
   if (!CanCopyToVideoFrame()) {
-    callback.Run(false);
+    callback.Run(gfx::Rect(), false);
     return;
   }
 
@@ -746,11 +750,13 @@
     base::WeakPtr<DelegatedFrameHost> dfh,
     scoped_refptr<OwnedMailbox> subscriber_texture,
     scoped_refptr<media::VideoFrame> video_frame,
-    const base::Callback<void(bool)>& callback,
+    const base::Callback<void(const gfx::Rect&, bool)>& callback,
     scoped_ptr<cc::CopyOutputResult> result) {
-  base::ScopedClosureRunner scoped_callback_runner(base::Bind(callback, false));
-  base::ScopedClosureRunner scoped_return_subscriber_texture(base::Bind(
-      &ReturnSubscriberTexture, dfh, subscriber_texture, gpu::SyncToken()));
+  base::ScopedClosureRunner scoped_callback_runner(
+      base::Bind(callback, gfx::Rect(), false));
+  base::ScopedClosureRunner scoped_return_subscriber_texture(
+      base::Bind(&ReturnSubscriberTexture, dfh, subscriber_texture,
+      gpu::SyncToken()));
 
   if (!dfh)
     return;
@@ -799,7 +805,7 @@
           video_frame.get());
     }
     ignore_result(scoped_callback_runner.Release());
-    callback.Run(true);
+    callback.Run(region_in_frame, true);
     return;
   }
 
@@ -852,15 +858,16 @@
 
   ignore_result(scoped_callback_runner.Release());
   ignore_result(scoped_return_subscriber_texture.Release());
+
   base::Callback<void(bool result)> finished_callback = base::Bind(
       &DelegatedFrameHost::CopyFromCompositingSurfaceFinishedForVideo,
-      dfh->AsWeakPtr(),
-      callback,
-      subscriber_texture,
-      base::Passed(&release_callback));
-  yuv_readback_pipeline->ReadbackYUV(
-      texture_mailbox.mailbox(), texture_mailbox.sync_token(),
-      video_frame.get(), region_in_frame.origin(), finished_callback);
+      dfh->AsWeakPtr(), base::Bind(callback, region_in_frame),
+      subscriber_texture, base::Passed(&release_callback));
+  yuv_readback_pipeline->ReadbackYUV(texture_mailbox.mailbox(),
+                                     texture_mailbox.sync_token(),
+                                     video_frame.get(),
+                                     region_in_frame.origin(),
+                                     finished_callback);
 }
 
 ////////////////////////////////////////////////////////////////////////////////
diff --git a/content/browser/compositor/delegated_frame_host.h b/content/browser/compositor/delegated_frame_host.h
index 0f2b28c..99c431a 100644
--- a/content/browser/compositor/delegated_frame_host.h
+++ b/content/browser/compositor/delegated_frame_host.h
@@ -5,6 +5,8 @@
 #ifndef CONTENT_BROWSER_COMPOSITOR_DELEGATED_FRAME_HOST_H_
 #define CONTENT_BROWSER_COMPOSITOR_DELEGATED_FRAME_HOST_H_
 
+#include <vector>
+
 #include "base/gtest_prod_util.h"
 #include "cc/layers/delegated_frame_provider.h"
 #include "cc/layers/delegated_frame_resource_collection.h"
@@ -22,6 +24,7 @@
 #include "ui/compositor/compositor_vsync_manager.h"
 #include "ui/compositor/layer.h"
 #include "ui/compositor/layer_owner_delegate.h"
+#include "ui/events/event.h"
 #include "ui/gfx/geometry/rect_conversions.h"
 
 namespace base {
@@ -149,7 +152,7 @@
   void CopyFromCompositingSurfaceToVideoFrame(
       const gfx::Rect& src_subrect,
       const scoped_refptr<media::VideoFrame>& target,
-      const base::Callback<void(bool)>& callback);
+      const base::Callback<void(const gfx::Rect&, bool)>& callback);
   bool CanCopyToVideoFrame() const;
   void BeginFrameSubscription(
       scoped_ptr<RenderWidgetHostViewFrameSubscriber> subscriber);
@@ -229,7 +232,7 @@
       base::WeakPtr<DelegatedFrameHost> rwhva,
       scoped_refptr<OwnedMailbox> subscriber_texture,
       scoped_refptr<media::VideoFrame> video_frame,
-      const base::Callback<void(bool)>& callback,
+      const base::Callback<void(const gfx::Rect&, bool)>& callback,
       scoped_ptr<cc::CopyOutputResult> result);
   static void CopyFromCompositingSurfaceFinishedForVideo(
       base::WeakPtr<DelegatedFrameHost> rwhva,
diff --git a/content/browser/frame_host/render_widget_host_view_child_frame.cc b/content/browser/frame_host/render_widget_host_view_child_frame.cc
index 5e001bf..da5e12d4 100644
--- a/content/browser/frame_host/render_widget_host_view_child_frame.cc
+++ b/content/browser/frame_host/render_widget_host_view_child_frame.cc
@@ -4,6 +4,9 @@
 
 #include "content/browser/frame_host/render_widget_host_view_child_frame.h"
 
+#include <algorithm>
+#include <vector>
+
 #include "cc/surfaces/surface.h"
 #include "cc/surfaces/surface_factory.h"
 #include "cc/surfaces/surface_manager.h"
@@ -417,11 +420,11 @@
 }
 
 void RenderWidgetHostViewChildFrame::CopyFromCompositingSurfaceToVideoFrame(
-      const gfx::Rect& src_subrect,
-      const scoped_refptr<media::VideoFrame>& target,
-      const base::Callback<void(bool)>& callback) {
+    const gfx::Rect& src_subrect,
+    const scoped_refptr<media::VideoFrame>& target,
+    const base::Callback<void(const gfx::Rect&, bool)>& callback) {
   NOTIMPLEMENTED();
-  callback.Run(false);
+  callback.Run(gfx::Rect(), false);
 }
 
 bool RenderWidgetHostViewChildFrame::CanCopyToVideoFrame() const {
diff --git a/content/browser/frame_host/render_widget_host_view_child_frame.h b/content/browser/frame_host/render_widget_host_view_child_frame.h
index 78d0ea9..d4bba98 100644
--- a/content/browser/frame_host/render_widget_host_view_child_frame.h
+++ b/content/browser/frame_host/render_widget_host_view_child_frame.h
@@ -5,6 +5,8 @@
 #ifndef CONTENT_BROWSER_FRAME_HOST_RENDER_WIDGET_HOST_VIEW_CHILD_FRAME_H_
 #define CONTENT_BROWSER_FRAME_HOST_RENDER_WIDGET_HOST_VIEW_CHILD_FRAME_H_
 
+#include <vector>
+
 #include "base/memory/scoped_ptr.h"
 #include "cc/resources/returned_resource.h"
 #include "cc/surfaces/surface_factory_client.h"
@@ -100,7 +102,7 @@
   void CopyFromCompositingSurfaceToVideoFrame(
       const gfx::Rect& src_subrect,
       const scoped_refptr<media::VideoFrame>& target,
-      const base::Callback<void(bool)>& callback) override;
+      const base::Callback<void(const gfx::Rect&, bool)>& callback) override;
   bool CanCopyToVideoFrame() const override;
   bool HasAcceleratedSurface(const gfx::Size& desired_size) override;
   void OnSwapCompositorFrame(uint32 output_surface_id,
diff --git a/content/browser/gpu/browser_gpu_memory_buffer_manager.cc b/content/browser/gpu/browser_gpu_memory_buffer_manager.cc
index 7a5921a2d..b4b474e 100644
--- a/content/browser/gpu/browser_gpu_memory_buffer_manager.cc
+++ b/content/browser/gpu/browser_gpu_memory_buffer_manager.cc
@@ -546,6 +546,7 @@
   handle.id = new_id;
   handle.handle = request->handle.handle;
   handle.offset = request->handle.offset;
+  handle.stride = request->handle.stride;
 
   // Note: Unretained is safe as IO thread is stopped before manager is
   // destroyed.
diff --git a/content/browser/gpu/gpu_process_host.cc b/content/browser/gpu/gpu_process_host.cc
index a3b56cc..7cc4525 100644
--- a/content/browser/gpu/gpu_process_host.cc
+++ b/content/browser/gpu/gpu_process_host.cc
@@ -189,16 +189,15 @@
     return sandbox;
   }
 
-  void PreSandbox(bool* disable_default_policy,
-                  base::FilePath* exposed_dir) override {
-    *disable_default_policy = true;
+  bool DisableDefaultPolicy() override {
+    return true;
   }
 
   // For the GPU process we gotten as far as USER_LIMITED. The next level
   // which is USER_RESTRICTED breaks both the DirectX backend and the OpenGL
   // backend. Note that the GPU process is connected to the interactive
   // desktop.
-  void PreSpawnTarget(sandbox::TargetPolicy* policy, bool* success) override {
+  bool PreSpawnTarget(sandbox::TargetPolicy* policy) override {
     if (base::win::GetVersion() > base::win::VERSION_XP) {
       if (cmd_line_->GetSwitchValueASCII(switches::kUseGL) ==
           gfx::kGLImplementationDesktopName) {
@@ -239,10 +238,8 @@
         sandbox::TargetPolicy::SUBSYS_NAMED_PIPES,
         sandbox::TargetPolicy::NAMEDPIPES_ALLOW_ANY,
         L"\\\\.\\pipe\\chrome.gpu.*");
-    if (result != sandbox::SBOX_ALL_OK) {
-      *success = false;
-      return;
-    }
+    if (result != sandbox::SBOX_ALL_OK)
+      return false;
 
     // Block this DLL even if it is not loaded by the browser process.
     policy->AddDllToUnload(L"cmsetac.dll");
@@ -253,10 +250,8 @@
     result = policy->AddRule(sandbox::TargetPolicy::SUBSYS_HANDLES,
                              sandbox::TargetPolicy::HANDLES_DUP_BROKER,
                              L"Section");
-    if (result != sandbox::SBOX_ALL_OK) {
-      *success = false;
-      return;
-    }
+    if (result != sandbox::SBOX_ALL_OK)
+      return false;
 #endif
 
     if (cmd_line_->HasSwitch(switches::kEnableLogging)) {
@@ -265,12 +260,12 @@
         result = policy->AddRule(sandbox::TargetPolicy::SUBSYS_FILES,
                                  sandbox::TargetPolicy::FILES_ALLOW_ANY,
                                  log_file_path.c_str());
-        if (result != sandbox::SBOX_ALL_OK) {
-          *success = false;
-          return;
-        }
+        if (result != sandbox::SBOX_ALL_OK)
+          return false;
       }
     }
+
+    return true;
   }
 #elif defined(OS_POSIX)
 
diff --git a/content/browser/media/capture/DEPS b/content/browser/media/capture/DEPS
index f3e90f1..bc724e1 100644
--- a/content/browser/media/capture/DEPS
+++ b/content/browser/media/capture/DEPS
@@ -2,3 +2,11 @@
   "+media/capture/content",
   "+third_party/libyuv",  # For scaling in desktop_capture_device.cc.
 ]
+
+specific_include_rules = {
+  ".*test\.cc": [
+    # Allow inclusion of specific components that we depend on for testing
+    "+ui/base/resource/resource_bundle.h",
+  ],
+}
+
diff --git a/content/browser/media/capture/aura_window_capture_machine.cc b/content/browser/media/capture/aura_window_capture_machine.cc
index 4198adb..d6578c9 100644
--- a/content/browser/media/capture/aura_window_capture_machine.cc
+++ b/content/browser/media/capture/aura_window_capture_machine.cc
@@ -4,6 +4,8 @@
 
 #include "content/browser/media/capture/aura_window_capture_machine.h"
 
+#include <algorithm>
+
 #include "base/logging.h"
 #include "base/metrics/histogram.h"
 #include "base/timer/timer.h"
@@ -36,85 +38,6 @@
 
 namespace {
 
-int clip_byte(int x) {
-  return std::max(0, std::min(x, 255));
-}
-
-int alpha_blend(int alpha, int src, int dst) {
-  return (src * alpha + dst * (255 - alpha)) / 255;
-}
-
-// Helper function to composite a cursor bitmap on a YUV420 video frame.
-void RenderCursorOnVideoFrame(
-    const scoped_refptr<media::VideoFrame>& target,
-    const SkBitmap& cursor_bitmap,
-    const gfx::Point& cursor_position) {
-  DCHECK(target.get());
-  DCHECK(!cursor_bitmap.isNull());
-
-  gfx::Rect rect = gfx::IntersectRects(
-      gfx::Rect(cursor_bitmap.width(), cursor_bitmap.height()) +
-          gfx::Vector2d(cursor_position.x(), cursor_position.y()),
-      target->visible_rect());
-
-  cursor_bitmap.lockPixels();
-  for (int y = rect.y(); y < rect.bottom(); ++y) {
-    int cursor_y = y - cursor_position.y();
-    uint8* yplane = target->data(media::VideoFrame::kYPlane) +
-        y * target->row_bytes(media::VideoFrame::kYPlane);
-    uint8* uplane = target->data(media::VideoFrame::kUPlane) +
-        (y / 2) * target->row_bytes(media::VideoFrame::kUPlane);
-    uint8* vplane = target->data(media::VideoFrame::kVPlane) +
-        (y / 2) * target->row_bytes(media::VideoFrame::kVPlane);
-    for (int x = rect.x(); x < rect.right(); ++x) {
-      int cursor_x = x - cursor_position.x();
-      SkColor color = cursor_bitmap.getColor(cursor_x, cursor_y);
-      int alpha = SkColorGetA(color);
-      int color_r = SkColorGetR(color);
-      int color_g = SkColorGetG(color);
-      int color_b = SkColorGetB(color);
-      int color_y = clip_byte(((color_r * 66 + color_g * 129 + color_b * 25 +
-                                128) >> 8) + 16);
-      yplane[x] = alpha_blend(alpha, color_y, yplane[x]);
-
-      // Only sample U and V at even coordinates.
-      if ((x % 2 == 0) && (y % 2 == 0)) {
-        int color_u = clip_byte(((color_r * -38 + color_g * -74 +
-                                  color_b * 112 + 128) >> 8) + 128);
-        int color_v = clip_byte(((color_r * 112 + color_g * -94 +
-                                  color_b * -18 + 128) >> 8) + 128);
-        uplane[x / 2] = alpha_blend(alpha, color_u, uplane[x / 2]);
-        vplane[x / 2] = alpha_blend(alpha, color_v, vplane[x / 2]);
-      }
-    }
-  }
-  cursor_bitmap.unlockPixels();
-}
-
-using CaptureFrameCallback =
-    media::ThreadSafeCaptureOracle::CaptureFrameCallback;
-
-void CopyOutputFinishedForVideo(
-    base::WeakPtr<AuraWindowCaptureMachine> machine,
-    base::TimeTicks start_time,
-    const CaptureFrameCallback& capture_frame_cb,
-    const scoped_refptr<media::VideoFrame>& target,
-    const SkBitmap& cursor_bitmap,
-    const gfx::Point& cursor_position,
-    scoped_ptr<cc::SingleReleaseCallback> release_callback,
-    bool result) {
-  DCHECK_CURRENTLY_ON(BrowserThread::UI);
-
-  if (!cursor_bitmap.isNull())
-    RenderCursorOnVideoFrame(target, cursor_bitmap, cursor_position);
-  release_callback->Run(gpu::SyncToken(), false);
-
-  // Only deliver the captured frame if the AuraWindowCaptureMachine has not
-  // been stopped (i.e., the WeakPtr is still valid).
-  if (machine.get())
-    capture_frame_cb.Run(target, start_time, result);
-}
-
 void RunSingleReleaseCallback(scoped_ptr<cc::SingleReleaseCallback> cb,
                               const gpu::SyncToken& sync_token) {
   cb->Run(sync_token, false);
@@ -212,6 +135,7 @@
       window_host->compositor()->RemoveObserver(this);
     desktop_window_->RemoveObserver(this);
     desktop_window_ = NULL;
+    cursor_renderer_.reset();
   }
 
   // Stop timer.
@@ -225,6 +149,7 @@
 
   DCHECK(!desktop_window_);
   desktop_window_ = window;
+  cursor_renderer_.reset(new CursorRendererAura(window));
 
   // Start observing window events.
   desktop_window_->AddObserver(this);
@@ -243,7 +168,7 @@
      oracle_proxy_->UpdateCaptureSize(ui::ConvertSizeToPixel(
          layer, layer->bounds().size()));
   }
-  ClearCursorState();
+  cursor_renderer_->Clear();
 }
 
 void AuraWindowCaptureMachine::Capture(bool dirty) {
@@ -388,78 +313,38 @@
                                              true));
   }
 
-  gfx::Point cursor_position_in_frame = UpdateCursorState(region_in_frame);
+  cursor_renderer_->SnapshotCursorState(region_in_frame);
   yuv_readback_pipeline_->ReadbackYUV(
       texture_mailbox.mailbox(), texture_mailbox.sync_token(),
       video_frame.get(), region_in_frame.origin(),
       base::Bind(&CopyOutputFinishedForVideo, weak_factory_.GetWeakPtr(),
                  start_time, capture_frame_cb, video_frame,
-                 scaled_cursor_bitmap_, cursor_position_in_frame,
                  base::Passed(&release_callback)));
   return true;
 }
 
-gfx::Point AuraWindowCaptureMachine::UpdateCursorState(
-    const gfx::Rect& region_in_frame) {
-  const gfx::Rect window_bounds = desktop_window_->GetBoundsInScreen();
-  gfx::Point cursor_position = aura::Env::GetInstance()->last_mouse_location();
-  if (!window_bounds.Contains(cursor_position)) {
-    // Return early if there is no need to draw the cursor.
-    ClearCursorState();
-    return gfx::Point();
+using CaptureFrameCallback =
+    media::ThreadSafeCaptureOracle::CaptureFrameCallback;
+
+void AuraWindowCaptureMachine::CopyOutputFinishedForVideo(
+    base::WeakPtr<AuraWindowCaptureMachine> machine,
+    base::TimeTicks start_time,
+    const CaptureFrameCallback& capture_frame_cb,
+    const scoped_refptr<media::VideoFrame>& target,
+    scoped_ptr<cc::SingleReleaseCallback> release_callback,
+    bool result) {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+
+  release_callback->Run(gpu::SyncToken(), false);
+
+  // Render the cursor and deliver the captured frame if the
+  // AuraWindowCaptureMachine has not been stopped (i.e., the WeakPtr is
+  // still valid).
+  if (machine.get()) {
+    if (machine->cursor_renderer_ && result)
+      machine->cursor_renderer_->RenderOnVideoFrame(target);
+    capture_frame_cb.Run(target, start_time, result);
   }
-
-  aura::client::ActivationClient* activation_client =
-      aura::client::GetActivationClient(desktop_window_->GetRootWindow());
-  DCHECK(activation_client);
-  aura::Window* active_window = activation_client->GetActiveWindow();
-  if (!desktop_window_->Contains(active_window)) {
-    // Return early if the target window is not active.
-    ClearCursorState();
-    return gfx::Point();
-  }
-
-  gfx::NativeCursor cursor = desktop_window_->GetHost()->last_cursor();
-  gfx::Point cursor_hot_point;
-  if (last_cursor_ != cursor ||
-      window_size_when_cursor_last_updated_ != window_bounds.size()) {
-    SkBitmap cursor_bitmap;
-    if (ui::GetCursorBitmap(cursor, &cursor_bitmap, &cursor_hot_point)) {
-      const int scaled_width = cursor_bitmap.width() *
-          region_in_frame.width() / window_bounds.width();
-      const int scaled_height = cursor_bitmap.height() *
-          region_in_frame.height() / window_bounds.height();
-      if (scaled_width <= 0 || scaled_height <= 0) {
-        ClearCursorState();
-        return gfx::Point();
-      }
-      scaled_cursor_bitmap_ = skia::ImageOperations::Resize(
-          cursor_bitmap,
-          skia::ImageOperations::RESIZE_BEST,
-          scaled_width,
-          scaled_height);
-      last_cursor_ = cursor;
-      window_size_when_cursor_last_updated_ = window_bounds.size();
-    } else {
-      // Clear cursor state if ui::GetCursorBitmap failed so that we do not
-      // render cursor on the captured frame.
-      ClearCursorState();
-    }
-  }
-
-  cursor_position.Offset(-window_bounds.x() - cursor_hot_point.x(),
-                         -window_bounds.y() - cursor_hot_point.y());
-  return gfx::Point(
-      region_in_frame.x() + cursor_position.x() *
-          region_in_frame.width() / window_bounds.width(),
-      region_in_frame.y() + cursor_position.y() *
-          region_in_frame.height() / window_bounds.height());
-}
-
-void AuraWindowCaptureMachine::ClearCursorState() {
-  last_cursor_ = ui::Cursor();
-  window_size_when_cursor_last_updated_ = gfx::Size();
-  scaled_cursor_bitmap_.reset();
 }
 
 void AuraWindowCaptureMachine::OnWindowBoundsChanged(
diff --git a/content/browser/media/capture/aura_window_capture_machine.h b/content/browser/media/capture/aura_window_capture_machine.h
index 858c714..8407e94 100644
--- a/content/browser/media/capture/aura_window_capture_machine.h
+++ b/content/browser/media/capture/aura_window_capture_machine.h
@@ -8,6 +8,7 @@
 #include "base/memory/scoped_ptr.h"
 #include "base/memory/weak_ptr.h"
 #include "base/timer/timer.h"
+#include "content/browser/media/capture/cursor_renderer_aura.h"
 #include "media/capture/content/screen_capture_device_core.h"
 #include "ui/aura/window.h"
 #include "ui/aura/window_observer.h"
@@ -91,14 +92,14 @@
       const CaptureFrameCallback& capture_frame_cb,
       scoped_ptr<cc::CopyOutputResult> result);
 
-  // Helper function to update cursor state.
-  // |region_in_frame| defines where the desktop is rendered in the captured
-  // frame.
-  // Returns the current cursor position in captured frame.
-  gfx::Point UpdateCursorState(const gfx::Rect& region_in_frame);
-
-  // Clears cursor state.
-  void ClearCursorState();
+  // Renders the cursor if needed and then delivers the captured frame.
+  static void CopyOutputFinishedForVideo(
+      base::WeakPtr<AuraWindowCaptureMachine> machine,
+      base::TimeTicks start_time,
+      const CaptureFrameCallback& capture_frame_cb,
+      const scoped_refptr<media::VideoFrame>& target,
+      scoped_ptr<cc::SingleReleaseCallback> release_callback,
+      bool result);
 
   // The window associated with the desktop.
   aura::Window* desktop_window_;
@@ -118,10 +119,8 @@
   // YUV readback pipeline.
   scoped_ptr<content::ReadbackYUVInterface> yuv_readback_pipeline_;
 
-  // Cursor state.
-  ui::Cursor last_cursor_;
-  gfx::Size window_size_when_cursor_last_updated_;
-  SkBitmap scaled_cursor_bitmap_;
+  // Renders mouse cursor on frame.
+  scoped_ptr<content::CursorRendererAura> cursor_renderer_;
 
   // TODO(jiayl): Remove power_save_blocker_ when there is an API to keep the
   // screen from sleeping for the drive-by web.
diff --git a/content/browser/media/capture/cursor_renderer.h b/content/browser/media/capture/cursor_renderer.h
new file mode 100644
index 0000000..7416413
--- /dev/null
+++ b/content/browser/media/capture/cursor_renderer.h
@@ -0,0 +1,55 @@
+// Copyright (c) 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CONTENT_BROWSER_MEDIA_CAPTURE_CURSOR_RENDERER_H_
+#define CONTENT_BROWSER_MEDIA_CAPTURE_CURSOR_RENDERER_H_
+
+#include "base/macros.h"
+#include "base/memory/ref_counted.h"
+#include "base/memory/weak_ptr.h"
+#include "content/common/content_export.h"
+#include "media/base/video_frame.h"
+#include "ui/gfx/native_widget_types.h"
+
+namespace content {
+
+// CursorRenderer is an interface that can be implememented to do cursor
+// rendering on a video frame.
+//
+// In order to track the cursor, the platform-specific implementation
+// will listen to mouse events.
+class CONTENT_EXPORT CursorRenderer {
+ public:
+  virtual ~CursorRenderer() {}
+
+  // Clears the cursor state being tracked. Called when there is a need to
+  // reset the state.
+  virtual void Clear() = 0;
+
+  // Takes a snapshot of the current cursor state and determines whether
+  // the cursor will be rendered, which cursor image to render, and at what
+  // location within |region_in_frame| to render it. Returns true if cursor
+  // needs to be rendered.
+  virtual bool SnapshotCursorState(const gfx::Rect& region_in_frame) = 0;
+
+  // Renders cursor on the |target| video frame.
+  virtual void RenderOnVideoFrame(
+      const scoped_refptr<media::VideoFrame>& target) const = 0;
+
+  // Returns a weak pointer.
+  virtual base::WeakPtr<CursorRenderer> GetWeakPtr() = 0;
+
+ protected:
+  enum {
+    // Minium movement before cursor is rendered on frame.
+    MIN_MOVEMENT_PIXELS = 15,
+    // Maximum idle time allowed before we stop rendering the cursor
+    // on frame.
+    MAX_IDLE_TIME_SECONDS = 2
+  };
+};
+
+}  // namespace content
+
+#endif  // CONTENT_BROWSER_MEDIA_CAPTURE_CURSOR_RENDERER_H_
diff --git a/content/browser/media/capture/cursor_renderer_aura.cc b/content/browser/media/capture/cursor_renderer_aura.cc
new file mode 100644
index 0000000..f2ce8ae
--- /dev/null
+++ b/content/browser/media/capture/cursor_renderer_aura.cc
@@ -0,0 +1,214 @@
+// Copyright (c) 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "content/browser/media/capture/cursor_renderer_aura.h"
+
+#include <algorithm>
+#include <cmath>
+
+#include "base/logging.h"
+#include "base/time/default_tick_clock.h"
+#include "ui/aura/client/screen_position_client.h"
+#include "ui/aura/env.h"
+#include "ui/aura/window.h"
+#include "ui/aura/window_tree_host.h"
+#include "ui/base/cursor/cursors_aura.h"
+#include "ui/compositor/dip_util.h"
+#include "ui/compositor/layer.h"
+#include "ui/events/event_utils.h"
+#include "ui/wm/public/activation_client.h"
+
+namespace content {
+
+namespace {
+
+inline int clip_byte(int x) {
+  return std::max(0, std::min(x, 255));
+}
+
+inline int alpha_blend(int alpha, int src, int dst) {
+  return (src * alpha + dst * (255 - alpha)) / 255;
+}
+
+}  // namespace
+
+CursorRendererAura::CursorRendererAura(aura::Window* window)
+    : window_(window), tick_clock_(&default_tick_clock_), weak_factory_(this) {
+  if (window_) {
+    window_->AddObserver(this);
+    window_->AddPreTargetHandler(this);
+  }
+  Clear();
+}
+
+CursorRendererAura::~CursorRendererAura() {
+  if (window_) {
+    window_->RemoveObserver(this);
+    window_->RemovePreTargetHandler(this);
+  }
+}
+
+base::WeakPtr<CursorRenderer> CursorRendererAura::GetWeakPtr() {
+  return weak_factory_.GetWeakPtr();
+}
+
+void CursorRendererAura::Clear() {
+  last_cursor_ = ui::Cursor();
+  window_size_when_cursor_last_updated_ = gfx::Size();
+  scaled_cursor_bitmap_.reset();
+  last_mouse_position_x_ = 0;
+  last_mouse_position_y_ = 0;
+  cursor_displayed_ = false;
+}
+
+bool CursorRendererAura::SnapshotCursorState(const gfx::Rect& region_in_frame) {
+  if (!window_) {
+    DVLOG(2) << "Skipping update with no window being tracked";
+    return false;
+  }
+  const gfx::Rect window_bounds = window_->GetBoundsInScreen();
+  gfx::Point cursor_position = aura::Env::GetInstance()->last_mouse_location();
+  if (!window_bounds.Contains(cursor_position)) {
+    // Return early if there is no need to draw the cursor.
+    DVLOG(2) << "Skipping update with cursor outside the window";
+    Clear();
+    return false;
+  }
+
+  aura::client::ActivationClient* activation_client =
+      aura::client::GetActivationClient(window_->GetRootWindow());
+  DCHECK(activation_client);
+  aura::Window* active_window = activation_client->GetActiveWindow();
+  if (!active_window->Contains(window_)) {
+    // Return early if the target window is not active.
+    DVLOG(2) << "Skipping update on an inactive window";
+    Clear();
+    return false;
+  }
+
+  gfx::NativeCursor cursor = window_->GetHost()->last_cursor();
+  gfx::Point cursor_hot_point;
+  if (last_cursor_ != cursor ||
+      window_size_when_cursor_last_updated_ != window_bounds.size()) {
+    SkBitmap cursor_bitmap;
+    if (ui::GetCursorBitmap(cursor, &cursor_bitmap, &cursor_hot_point)) {
+      const int scaled_width = cursor_bitmap.width() * region_in_frame.width() /
+                               window_bounds.width();
+      const int scaled_height = cursor_bitmap.height() *
+                                region_in_frame.height() /
+                                window_bounds.height();
+      if (scaled_width <= 0 || scaled_height <= 0) {
+        DVLOG(2) << "scaled_width <= 0";
+        Clear();
+        return false;
+      }
+      scaled_cursor_bitmap_ = skia::ImageOperations::Resize(
+          cursor_bitmap, skia::ImageOperations::RESIZE_BEST, scaled_width,
+          scaled_height);
+      last_cursor_ = cursor;
+      window_size_when_cursor_last_updated_ = window_bounds.size();
+    } else {
+      // Clear cursor state if ui::GetCursorBitmap failed so that we do not
+      // render cursor on the captured frame.
+      Clear();
+    }
+  }
+
+  cursor_position.Offset(-window_bounds.x() - cursor_hot_point.x(),
+                         -window_bounds.y() - cursor_hot_point.y());
+  cursor_position_in_frame_ = gfx::Point(
+      region_in_frame.x() +
+          cursor_position.x() * region_in_frame.width() / window_bounds.width(),
+      region_in_frame.y() +
+          cursor_position.y() * region_in_frame.height() /
+              window_bounds.height());
+
+  if (cursor_displayed_) {
+    // Stop displaying cursor if there has been no mouse movement
+    base::TimeDelta now = tick_clock_->NowTicks() - base::TimeTicks();
+    if ((now - last_mouse_movement_timestamp_) >
+        base::TimeDelta::FromSeconds(MAX_IDLE_TIME_SECONDS)) {
+      cursor_displayed_ = false;
+      DVLOG(2) << "Turning off cursor display after idle time";
+    }
+  }
+  return cursor_displayed_;
+}
+
+// Helper function to composite a cursor bitmap on a YUV420 video frame.
+void CursorRendererAura::RenderOnVideoFrame(
+    const scoped_refptr<media::VideoFrame>& target) const {
+  if (scaled_cursor_bitmap_.isNull())
+    return;
+
+  DCHECK(target);
+
+  gfx::Rect rect = gfx::IntersectRects(
+      gfx::Rect(scaled_cursor_bitmap_.width(), scaled_cursor_bitmap_.height()) +
+          gfx::Vector2d(cursor_position_in_frame_.x(),
+                        cursor_position_in_frame_.y()),
+      target->visible_rect());
+
+  scaled_cursor_bitmap_.lockPixels();
+  for (int y = rect.y(); y < rect.bottom(); ++y) {
+    int cursor_y = y - cursor_position_in_frame_.y();
+    uint8* yplane = target->data(media::VideoFrame::kYPlane) +
+                    y * target->row_bytes(media::VideoFrame::kYPlane);
+    uint8* uplane = target->data(media::VideoFrame::kUPlane) +
+                    (y / 2) * target->row_bytes(media::VideoFrame::kUPlane);
+    uint8* vplane = target->data(media::VideoFrame::kVPlane) +
+                    (y / 2) * target->row_bytes(media::VideoFrame::kVPlane);
+    for (int x = rect.x(); x < rect.right(); ++x) {
+      int cursor_x = x - cursor_position_in_frame_.x();
+      SkColor color = scaled_cursor_bitmap_.getColor(cursor_x, cursor_y);
+      int alpha = SkColorGetA(color);
+      int color_r = SkColorGetR(color);
+      int color_g = SkColorGetG(color);
+      int color_b = SkColorGetB(color);
+      int color_y = clip_byte(
+          ((color_r * 66 + color_g * 129 + color_b * 25 + 128) >> 8) + 16);
+      yplane[x] = alpha_blend(alpha, color_y, yplane[x]);
+
+      // Only sample U and V at even coordinates.
+      if ((x % 2 == 0) && (y % 2 == 0)) {
+        int color_u = clip_byte(
+            ((color_r * -38 + color_g * -74 + color_b * 112 + 128) >> 8) + 128);
+        int color_v = clip_byte(
+            ((color_r * 112 + color_g * -94 + color_b * -18 + 128) >> 8) + 128);
+        uplane[x / 2] = alpha_blend(alpha, color_u, uplane[x / 2]);
+        vplane[x / 2] = alpha_blend(alpha, color_v, vplane[x / 2]);
+      }
+    }
+  }
+  scaled_cursor_bitmap_.unlockPixels();
+}
+
+void CursorRendererAura::OnMouseEvent(ui::MouseEvent* event) {
+  switch (event->type()) {
+    case ui::ET_MOUSE_MOVED:
+      if (!cursor_displayed_) {
+        if (std::abs(event->x() - last_mouse_position_x_) >
+                MIN_MOVEMENT_PIXELS ||
+            std::abs(event->y() - last_mouse_position_y_) > MIN_MOVEMENT_PIXELS)
+          cursor_displayed_ = true;
+      }
+      if (cursor_displayed_) {
+        last_mouse_movement_timestamp_ = event->time_stamp();
+        last_mouse_position_x_ = event->x();
+        last_mouse_position_y_ = event->y();
+      }
+      break;
+    default:
+      break;
+  }
+}
+
+void CursorRendererAura::OnWindowDestroying(aura::Window* window) {
+  DCHECK_EQ(window_, window);
+  window_->RemovePreTargetHandler(this);
+  window_->RemoveObserver(this);
+  window_ = nullptr;
+}
+
+}  // namespace content
diff --git a/content/browser/media/capture/cursor_renderer_aura.h b/content/browser/media/capture/cursor_renderer_aura.h
new file mode 100644
index 0000000..42dffa6
--- /dev/null
+++ b/content/browser/media/capture/cursor_renderer_aura.h
@@ -0,0 +1,78 @@
+// Copyright (c) 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CONTENT_BROWSER_MEDIA_CAPTURE_CURSOR_RENDERER_AURA_H_
+#define CONTENT_BROWSER_MEDIA_CAPTURE_CURSOR_RENDERER_AURA_H_
+
+#include "base/macros.h"
+#include "base/memory/ref_counted.h"
+#include "base/memory/weak_ptr.h"
+#include "base/time/default_tick_clock.h"
+#include "base/time/tick_clock.h"
+#include "content/browser/media/capture/cursor_renderer.h"
+#include "content/common/content_export.h"
+#include "media/base/video_frame.h"
+#include "skia/ext/image_operations.h"
+#include "ui/aura/window.h"
+#include "ui/base/cursor/cursor.h"
+#include "ui/events/event_handler.h"
+#include "ui/gfx/geometry/point.h"
+#include "ui/gfx/geometry/rect.h"
+#include "ui/gfx/geometry/size.h"
+
+namespace content {
+
+// Tracks state for making decisions on cursor display on a captured video
+// frame.
+class CONTENT_EXPORT CursorRendererAura : public CursorRenderer,
+                                          public ui::EventHandler,
+                                          public aura::WindowObserver {
+ public:
+  explicit CursorRendererAura(aura::Window* window);
+  ~CursorRendererAura() final;
+
+  // CursorRender implementation.
+  void Clear() final;
+  bool SnapshotCursorState(const gfx::Rect& region_in_frame) final;
+  void RenderOnVideoFrame(
+      const scoped_refptr<media::VideoFrame>& target) const final;
+  base::WeakPtr<CursorRenderer> GetWeakPtr() final;
+
+  // ui::EventHandler overrides.
+  void OnMouseEvent(ui::MouseEvent* event) final;
+
+  // aura::WindowObserver overrides.
+  void OnWindowDestroying(aura::Window* window) final;
+
+ private:
+  friend class CursorRendererAuraTest;
+
+  aura::Window* window_;
+
+  // Snapshot of cursor, source size, position, and cursor bitmap; as of the
+  // last call to SnapshotCursorState.
+  ui::Cursor last_cursor_;
+  gfx::Size window_size_when_cursor_last_updated_;
+  gfx::Point cursor_position_in_frame_;
+  SkBitmap scaled_cursor_bitmap_;
+
+  // Updated in mouse event listener and used to make a decision on
+  // when the cursor is rendered.
+  base::TimeDelta last_mouse_movement_timestamp_;
+  float last_mouse_position_x_;
+  float last_mouse_position_y_;
+  bool cursor_displayed_;
+
+  // Allows tests to replace the clock.
+  base::DefaultTickClock default_tick_clock_;
+  base::TickClock* tick_clock_;
+
+  base::WeakPtrFactory<CursorRendererAura> weak_factory_;
+
+  DISALLOW_COPY_AND_ASSIGN(CursorRendererAura);
+};
+
+}  // namespace content
+
+#endif  // CONTENT_BROWSER_MEDIA_CAPTURE_CURSOR_RENDERER_AURA_H_
diff --git a/content/browser/media/capture/cursor_renderer_aura_unittest.cc b/content/browser/media/capture/cursor_renderer_aura_unittest.cc
new file mode 100644
index 0000000..813c8ba
--- /dev/null
+++ b/content/browser/media/capture/cursor_renderer_aura_unittest.cc
@@ -0,0 +1,201 @@
+// Copyright (c) 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "content/browser/media/capture/cursor_renderer_aura.h"
+
+#include "base/files/file_path.h"
+#include "base/memory/scoped_ptr.h"
+#include "base/path_service.h"
+#include "base/test/simple_test_tick_clock.h"
+#include "base/time/time.h"
+#include "media/base/video_frame.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "ui/aura/env.h"
+#include "ui/aura/test/aura_test_base.h"
+#include "ui/aura/test/test_windows.h"
+#include "ui/aura/window.h"
+#include "ui/base/resource/resource_bundle.h"
+#include "ui/events/event.h"
+#include "ui/events/event_utils.h"
+#include "ui/wm/core/default_activation_client.h"
+#include "ui/wm/core/window_util.h"
+
+namespace content {
+
+using aura::test::AuraTestBase;
+
+class CursorRendererAuraTest : public AuraTestBase {
+ public:
+  CursorRendererAuraTest() {}
+  ~CursorRendererAuraTest() override {}
+
+  void SetUp() override {
+    AuraTestBase::SetUp();
+    // This is needed to avoid duplicate initialization across tests that leads
+    // to a failure.
+    if (!ui::ResourceBundle::HasSharedInstance()) {
+      // Initialize the shared global resource bundle that has bitmap
+      // resources needed by CursorRenderer
+      base::FilePath pak_file;
+      bool r = PathService::Get(base::DIR_MODULE, &pak_file);
+      DCHECK(r);
+      pak_file = pak_file.Append(FILE_PATH_LITERAL("content_shell.pak"));
+      ui::ResourceBundle::InitSharedInstanceWithPakPath(pak_file);
+    }
+
+    window_.reset(aura::test::CreateTestWindowWithBounds(
+        gfx::Rect(0, 0, 800, 600), root_window()));
+    cursor_renderer_.reset(new CursorRendererAura(window_.get()));
+    new wm::DefaultActivationClient(root_window());
+  }
+
+  void TearDown() override {
+    cursor_renderer_.reset();
+    window_.reset();
+    AuraTestBase::TearDown();
+  }
+
+  void SetTickClock(base::SimpleTestTickClock* clock) {
+    cursor_renderer_->tick_clock_ = clock;
+  }
+
+  base::TimeDelta Now() {
+    return cursor_renderer_->tick_clock_->NowTicks() - base::TimeTicks();
+  }
+
+  bool CursorDisplayed() { return cursor_renderer_->cursor_displayed_; }
+
+  void RenderCursorOnVideoFrame(
+      const scoped_refptr<media::VideoFrame>& target) {
+    cursor_renderer_->RenderOnVideoFrame(target);
+  }
+
+  void SnapshotCursorState(gfx::Rect region_in_frame) {
+    cursor_renderer_->SnapshotCursorState(region_in_frame);
+  }
+
+  void MoveMouseCursorWithinWindow() {
+    gfx::Point point1(20, 20);
+    ui::MouseEvent event1(ui::ET_MOUSE_MOVED, point1, point1, Now(), 0, 0);
+    cursor_renderer_->OnMouseEvent(&event1);
+    gfx::Point point2(60, 60);
+    ui::MouseEvent event2(ui::ET_MOUSE_MOVED, point2, point2, Now(), 0, 0);
+    cursor_renderer_->OnMouseEvent(&event2);
+    aura::Env::GetInstance()->set_last_mouse_location(point2);
+  }
+
+  void MoveMouseCursorWithinWindow(gfx::Point point) {
+    ui::MouseEvent event(ui::ET_MOUSE_MOVED, point, point, Now(), 0, 0);
+    cursor_renderer_->OnMouseEvent(&event);
+    aura::Env::GetInstance()->set_last_mouse_location(point);
+  }
+
+  void MoveMouseCursorOutsideWindow() {
+    gfx::Point point(1000, 1000);
+    ui::MouseEvent event1(ui::ET_MOUSE_MOVED, point, point, Now(), 0, 0);
+    cursor_renderer_->OnMouseEvent(&event1);
+    aura::Env::GetInstance()->set_last_mouse_location(point);
+  }
+
+  // A very simple test of whether there are any non-zero pixels
+  // in the region |rect| within |frame|.
+  bool NonZeroPixelsInRegion(scoped_refptr<media::VideoFrame> frame,
+                             gfx::Rect rect) {
+    bool y_found = false, u_found = false, v_found = false;
+    for (int y = rect.y(); y < rect.bottom(); ++y) {
+      uint8* yplane = frame->data(media::VideoFrame::kYPlane) +
+                      y * frame->row_bytes(media::VideoFrame::kYPlane);
+      uint8* uplane = frame->data(media::VideoFrame::kUPlane) +
+                      (y / 2) * frame->row_bytes(media::VideoFrame::kUPlane);
+      uint8* vplane = frame->data(media::VideoFrame::kVPlane) +
+                      (y / 2) * frame->row_bytes(media::VideoFrame::kVPlane);
+      for (int x = rect.x(); x < rect.right(); ++x) {
+        if (yplane[x] != 0)
+          y_found = true;
+        if (uplane[x / 2])
+          u_found = true;
+        if (vplane[x / 2])
+          v_found = true;
+      }
+    }
+    return (y_found && u_found && v_found);
+  }
+
+ protected:
+  scoped_ptr<aura::Window> window_;
+  scoped_ptr<CursorRendererAura> cursor_renderer_;
+};
+
+TEST_F(CursorRendererAuraTest, CursorDuringMouseMovement) {
+  // Keep window activated.
+  wm::ActivateWindow(window_.get());
+
+  EXPECT_FALSE(CursorDisplayed());
+
+  base::SimpleTestTickClock clock;
+  SetTickClock(&clock);
+
+  // Cursor displayed after mouse movement.
+  MoveMouseCursorWithinWindow();
+  EXPECT_TRUE(CursorDisplayed());
+
+  // Cursor not be displayed after idle period.
+  clock.Advance(base::TimeDelta::FromSeconds(5));
+  SnapshotCursorState(gfx::Rect(10, 10, 200, 200));
+  EXPECT_FALSE(CursorDisplayed());
+
+  // Cursor displayed with mouse movement following idle period.
+  MoveMouseCursorWithinWindow();
+  SnapshotCursorState(gfx::Rect(10, 10, 200, 200));
+  EXPECT_TRUE(CursorDisplayed());
+
+  // Cursor not displayed if mouse outside the window
+  MoveMouseCursorOutsideWindow();
+  SnapshotCursorState(gfx::Rect(10, 10, 200, 200));
+  EXPECT_FALSE(CursorDisplayed());
+}
+
+TEST_F(CursorRendererAuraTest, CursorOnActiveWindow) {
+  EXPECT_FALSE(CursorDisplayed());
+
+  // Cursor displayed after mouse movement.
+  MoveMouseCursorWithinWindow();
+  EXPECT_TRUE(CursorDisplayed());
+
+  // Cursor not be displayed if a second window is activated.
+  scoped_ptr<aura::Window> window2(aura::test::CreateTestWindowWithBounds(
+      gfx::Rect(0, 0, 800, 600), root_window()));
+  wm::ActivateWindow(window2.get());
+  SnapshotCursorState(gfx::Rect(10, 10, 200, 200));
+  EXPECT_FALSE(CursorDisplayed());
+
+  // Cursor displayed if window activated again.
+  MoveMouseCursorWithinWindow();
+  wm::ActivateWindow(window_.get());
+  SnapshotCursorState(gfx::Rect(10, 10, 200, 200));
+  EXPECT_TRUE(CursorDisplayed());
+}
+
+TEST_F(CursorRendererAuraTest, CursorRenderedOnFrame) {
+  // Keep window activated.
+  wm::ActivateWindow(window_.get());
+
+  EXPECT_FALSE(CursorDisplayed());
+
+  gfx::Size size(800, 600);
+  scoped_refptr<media::VideoFrame> frame =
+      media::VideoFrame::CreateZeroInitializedFrame(media::PIXEL_FORMAT_YV12,
+                                                    size, gfx::Rect(size), size,
+                                                    base::TimeDelta());
+
+  MoveMouseCursorWithinWindow(gfx::Point(60, 60));
+  SnapshotCursorState(gfx::Rect(size));
+  EXPECT_TRUE(CursorDisplayed());
+
+  EXPECT_FALSE(NonZeroPixelsInRegion(frame, gfx::Rect(50, 50, 70, 70)));
+  RenderCursorOnVideoFrame(frame);
+  EXPECT_TRUE(NonZeroPixelsInRegion(frame, gfx::Rect(50, 50, 70, 70)));
+}
+
+}  // namespace content
diff --git a/content/browser/media/capture/web_contents_video_capture_device.cc b/content/browser/media/capture/web_contents_video_capture_device.cc
index e8e55ad..3a432d85 100644
--- a/content/browser/media/capture/web_contents_video_capture_device.cc
+++ b/content/browser/media/capture/web_contents_video_capture_device.cc
@@ -50,6 +50,8 @@
 
 #include "content/browser/media/capture/web_contents_video_capture_device.h"
 
+#include <algorithm>
+
 #include "base/basictypes.h"
 #include "base/bind.h"
 #include "base/callback_helpers.h"
@@ -63,6 +65,7 @@
 #include "base/threading/thread.h"
 #include "base/threading/thread_checker.h"
 #include "base/time/time.h"
+#include "content/browser/media/capture/cursor_renderer.h"
 #include "content/browser/media/capture/web_contents_capture_util.h"
 #include "content/browser/media/capture/web_contents_tracker.h"
 #include "content/browser/renderer_host/render_widget_host_impl.h"
@@ -72,6 +75,7 @@
 #include "content/public/browser/render_widget_host_view.h"
 #include "content/public/browser/render_widget_host_view_frame_subscriber.h"
 #include "content/public/browser/web_contents.h"
+#include "media/base/bind_to_current_loop.h"
 #include "media/base/video_capture_types.h"
 #include "media/base/video_util.h"
 #include "media/capture/content/screen_capture_device_core.h"
@@ -84,6 +88,10 @@
 #include "ui/gfx/geometry/dip_util.h"
 #include "ui/gfx/geometry/size_conversions.h"
 
+#if defined(USE_AURA)
+#include "content/browser/media/capture/cursor_renderer_aura.h"
+#endif
+
 namespace content {
 
 namespace {
@@ -119,10 +127,13 @@
  public:
   FrameSubscriber(media::VideoCaptureOracle::Event event_type,
                   const scoped_refptr<media::ThreadSafeCaptureOracle>& oracle,
-                  VideoFrameDeliveryLog* delivery_log)
+                  VideoFrameDeliveryLog* delivery_log,
+                  base::WeakPtr<content::CursorRenderer> cursor_renderer)
       : event_type_(event_type),
         oracle_proxy_(oracle),
-        delivery_log_(delivery_log) {}
+        delivery_log_(delivery_log),
+        cursor_renderer_(cursor_renderer),
+        weak_ptr_factory_(this) {}
 
   bool ShouldCaptureFrame(
       const gfx::Rect& damage_rect,
@@ -131,10 +142,23 @@
       RenderWidgetHostViewFrameSubscriber::DeliverFrameCallback*
           deliver_frame_cb) override;
 
+  static void DidCaptureFrame(
+      base::WeakPtr<FrameSubscriber> frame_subscriber_,
+      const media::ThreadSafeCaptureOracle::CaptureFrameCallback&
+          capture_frame_cb,
+      const scoped_refptr<media::VideoFrame>& frame,
+      base::TimeTicks timestamp,
+      const gfx::Rect& region_in_frame,
+      bool success);
+
  private:
   const media::VideoCaptureOracle::Event event_type_;
   scoped_refptr<media::ThreadSafeCaptureOracle> oracle_proxy_;
   VideoFrameDeliveryLog* const delivery_log_;
+  // We need a weak pointer since FrameSubscriber is owned externally and
+  // may outlive the cursor renderer.
+  base::WeakPtr<CursorRenderer> cursor_renderer_;
+  base::WeakPtrFactory<FrameSubscriber> weak_ptr_factory_;
 };
 
 // ContentCaptureSubscription is the relationship between a RenderWidgetHost
@@ -177,10 +201,15 @@
   const int render_widget_id_;
 
   VideoFrameDeliveryLog delivery_log_;
-  FrameSubscriber timer_subscriber_;
+  scoped_ptr<FrameSubscriber> timer_subscriber_;
   CaptureCallback capture_callback_;
   base::Timer timer_;
 
+  // Responsible for tracking the cursor state and input events to make
+  // decisions and then render the mouse cursor on the video frame after
+  // capture is completed.
+  scoped_ptr<content::CursorRenderer> cursor_renderer_;
+
   DISALLOW_COPY_AND_ASSIGN(ContentCaptureSubscription);
 };
 
@@ -193,9 +222,10 @@
 // these activities is not possible. This operation may be expensive (tens to
 // hundreds of milliseconds), so the caller should ensure that it runs on a
 // thread where such a pause would cause UI jank.
-void RenderVideoFrame(const SkBitmap& input,
-                      const scoped_refptr<media::VideoFrame>& output,
-                      const base::Callback<void(bool)>& done_cb);
+void RenderVideoFrame(
+    const SkBitmap& input,
+    const scoped_refptr<media::VideoFrame>& output,
+    const base::Callback<void(const gfx::Rect&, bool)>& done_cb);
 
 // Renews capture subscriptions based on feedback from WebContentsTracker, and
 // also executes copying of the backing store on the UI BrowserThread.
@@ -249,6 +279,7 @@
       const base::TimeTicks& start_time,
       const RenderWidgetHostViewFrameSubscriber::DeliverFrameCallback&
           deliver_frame_cb,
+      const gfx::Rect& region_in_frame,
       bool success);
 
   // Remove the old subscription, and attempt to start a new one if |had_target|
@@ -304,16 +335,44 @@
                "instance", this);
 
   media::ThreadSafeCaptureOracle::CaptureFrameCallback capture_frame_cb;
+
   bool oracle_decision = oracle_proxy_->ObserveEventAndDecideCapture(
       event_type_, damage_rect, present_time, storage, &capture_frame_cb);
 
   if (!capture_frame_cb.is_null())
-    *deliver_frame_cb = base::Bind(capture_frame_cb, *storage);
+    *deliver_frame_cb =
+        base::Bind(&FrameSubscriber::DidCaptureFrame,
+                   weak_ptr_factory_.GetWeakPtr(), capture_frame_cb, *storage);
   if (oracle_decision)
     delivery_log_->ChronicleFrameDelivery(present_time);
   return oracle_decision;
 }
 
+void FrameSubscriber::DidCaptureFrame(
+    base::WeakPtr<FrameSubscriber> frame_subscriber_,
+    const media::ThreadSafeCaptureOracle::CaptureFrameCallback&
+        capture_frame_cb,
+    const scoped_refptr<media::VideoFrame>& frame,
+    base::TimeTicks timestamp,
+    const gfx::Rect& region_in_frame,
+    bool success) {
+  // We can get a callback in the shutdown sequence for the browser main loop
+  // and this can result in a DCHECK failure. Avoid this by doing DCHECK only
+  // on success.
+  if (success) {
+    DCHECK_CURRENTLY_ON(BrowserThread::UI);
+    // TODO(isheriff): Unclear if taking a snapshot of cursor here affects user
+    // experience in any particular scenarios. Doing it prior to capture may
+    // require evaluating region_in_frame in this file.
+    if (frame_subscriber_ && frame_subscriber_->cursor_renderer_) {
+      if (frame_subscriber_->cursor_renderer_->SnapshotCursorState(
+              region_in_frame))
+        frame_subscriber_->cursor_renderer_->RenderOnVideoFrame(frame);
+    }
+  }
+  capture_frame_cb.Run(frame, timestamp, success);
+}
+
 ContentCaptureSubscription::ContentCaptureSubscription(
     const RenderWidgetHost& source,
     const scoped_refptr<media::ThreadSafeCaptureOracle>& oracle_proxy,
@@ -321,20 +380,32 @@
     : render_process_id_(source.GetProcess()->GetID()),
       render_widget_id_(source.GetRoutingID()),
       delivery_log_(),
-      timer_subscriber_(media::VideoCaptureOracle::kTimerPoll, oracle_proxy,
-                        &delivery_log_),
       capture_callback_(capture_callback),
       timer_(true, true) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
 
   RenderWidgetHostView* const view = source.GetView();
+// TODO(isheriff): Cursor resources currently only available on linux. Remove
+// this once we add the necessary resources for windows.
+#if defined(USE_AURA) && defined(OS_LINUX)
+  if (view)
+    cursor_renderer_.reset(
+        new content::CursorRendererAura(view->GetNativeView()));
+#endif
+  timer_subscriber_.reset(new FrameSubscriber(
+      media::VideoCaptureOracle::kTimerPoll, oracle_proxy, &delivery_log_,
+      cursor_renderer_ ? cursor_renderer_->GetWeakPtr()
+                       : base::WeakPtr<CursorRenderer>()));
 
   // Subscribe to compositor updates. These will be serviced directly by the
   // oracle.
   if (view) {
     scoped_ptr<RenderWidgetHostViewFrameSubscriber> subscriber(
         new FrameSubscriber(media::VideoCaptureOracle::kCompositorUpdate,
-            oracle_proxy, &delivery_log_));
+                            oracle_proxy, &delivery_log_,
+                            cursor_renderer_
+                                ? cursor_renderer_->GetWeakPtr()
+                                : base::WeakPtr<CursorRenderer>()));
     view->BeginFrameSubscription(subscriber.Pass());
   }
 
@@ -370,18 +441,18 @@
   RenderWidgetHostViewFrameSubscriber::DeliverFrameCallback deliver_frame_cb;
 
   const base::TimeTicks start_time = base::TimeTicks::Now();
-  if (timer_subscriber_.ShouldCaptureFrame(gfx::Rect(),
-                                           start_time,
-                                           &frame,
-                                           &deliver_frame_cb)) {
+  if (timer_subscriber_->ShouldCaptureFrame(gfx::Rect(), start_time, &frame,
+                                            &deliver_frame_cb)) {
     capture_callback_.Run(start_time, frame, deliver_frame_cb);
   }
 }
 
-void RenderVideoFrame(const SkBitmap& input,
-                      const scoped_refptr<media::VideoFrame>& output,
-                      const base::Callback<void(bool)>& done_cb) {
-  base::ScopedClosureRunner failure_handler(base::Bind(done_cb, false));
+void RenderVideoFrame(
+    const SkBitmap& input,
+    const scoped_refptr<media::VideoFrame>& output,
+    const base::Callback<void(const gfx::Rect&, bool)>& done_cb) {
+  base::ScopedClosureRunner failure_handler(
+      base::Bind(done_cb, gfx::Rect(), false));
 
   SkAutoLockPixels locker(input);
 
@@ -412,7 +483,6 @@
   SkBitmap scaled_bitmap;
   if (input.width() != region_in_frame.width() ||
       input.height() != region_in_frame.height()) {
-
     skia::ImageOperations::ResizeMethod method;
     if (input.width() < region_in_frame.width() ||
         input.height() < region_in_frame.height()) {
@@ -453,7 +523,7 @@
 
   // The result is now ready.
   ignore_result(failure_handler.Release());
-  done_cb.Run(true);
+  done_cb.Run(region_in_frame, true);
 }
 
 VideoFrameDeliveryLog::VideoFrameDeliveryLog()
@@ -597,7 +667,7 @@
   RenderWidgetHostViewBase* view =
       rwh ? static_cast<RenderWidgetHostViewBase*>(rwh->GetView()) : NULL;
   if (!view) {
-    deliver_frame_cb.Run(base::TimeTicks(), false);
+    deliver_frame_cb.Run(base::TimeTicks(), gfx::Rect(), false);
     return;
   }
 
@@ -717,12 +787,13 @@
     TRACE_EVENT_ASYNC_STEP_INTO0("gpu.capture", "Capture", target.get(),
                                  "Render");
     render_thread_->task_runner()->PostTask(
-        FROM_HERE, base::Bind(&RenderVideoFrame, bitmap, target,
-                              base::Bind(deliver_frame_cb, start_time)));
+        FROM_HERE, media::BindToCurrentLoop(
+            base::Bind(&RenderVideoFrame, bitmap, target,
+                              base::Bind(deliver_frame_cb, start_time))));
   } else {
     // Capture can fail due to transient issues, so just skip this frame.
     DVLOG(1) << "CopyFromBackingStore failed; skipping frame.";
-    deliver_frame_cb.Run(start_time, false);
+    deliver_frame_cb.Run(start_time, gfx::Rect(), false);
   }
 }
 
@@ -730,6 +801,7 @@
     const base::TimeTicks& start_time,
     const RenderWidgetHostViewFrameSubscriber::DeliverFrameCallback&
         deliver_frame_cb,
+    const gfx::Rect& region_in_frame,
     bool success) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   base::TimeTicks now = base::TimeTicks::Now();
@@ -740,7 +812,7 @@
     // Capture can fail due to transient issues, so just skip this frame.
     DVLOG(1) << "CopyFromCompositingSurface failed; skipping frame.";
   }
-  deliver_frame_cb.Run(start_time, success);
+  deliver_frame_cb.Run(start_time, region_in_frame, success);
 }
 
 void WebContentsCaptureMachine::RenewFrameSubscription(bool had_target) {
diff --git a/content/browser/media/capture/web_contents_video_capture_device_unittest.cc b/content/browser/media/capture/web_contents_video_capture_device_unittest.cc
index 7a6463a4..ba0b588 100644
--- a/content/browser/media/capture/web_contents_video_capture_device_unittest.cc
+++ b/content/browser/media/capture/web_contents_video_capture_device_unittest.cc
@@ -194,11 +194,11 @@
   void CopyFromCompositingSurfaceToVideoFrame(
       const gfx::Rect& src_subrect,
       const scoped_refptr<media::VideoFrame>& target,
-      const base::Callback<void(bool)>& callback) override {
+      const base::Callback<void(const gfx::Rect&, bool)>& callback) override {
     SkColor c = ConvertRgbToYuv(controller_->GetSolidColor());
     media::FillYUV(
         target.get(), SkColorGetR(c), SkColorGetG(c), SkColorGetB(c));
-    callback.Run(true);
+    callback.Run(gfx::Rect(), true);
     controller_->SignalCopy();
   }
 
@@ -219,9 +219,9 @@
       SkColor c = ConvertRgbToYuv(controller_->GetSolidColor());
       media::FillYUV(
           target.get(), SkColorGetR(c), SkColorGetG(c), SkColorGetB(c));
-      BrowserThread::PostTask(BrowserThread::UI,
-                              FROM_HERE,
-                              base::Bind(callback, present_time, true));
+      BrowserThread::PostTask(
+          BrowserThread::UI, FROM_HERE,
+          base::Bind(callback, present_time, gfx::Rect(), true));
       controller_->SignalCopy();
     }
   }
diff --git a/content/browser/ppapi_plugin_process_host.cc b/content/browser/ppapi_plugin_process_host.cc
index 794a5a1..4d87474 100644
--- a/content/browser/ppapi_plugin_process_host.cc
+++ b/content/browser/ppapi_plugin_process_host.cc
@@ -59,10 +59,10 @@
     return !is_broker_;
   }
 
-  void PreSpawnTarget(sandbox::TargetPolicy* policy, bool* success) override {
+  bool PreSpawnTarget(sandbox::TargetPolicy* policy) override {
     if (is_broker_)
-      return;
-    *success = false;
+      return true;
+
     // The Pepper process is as locked-down as a renderer except that it can
     // create the server side of Chrome pipes.
     sandbox::ResultCode result;
@@ -70,12 +70,13 @@
                              sandbox::TargetPolicy::NAMEDPIPES_ALLOW_ANY,
                              L"\\\\.\\pipe\\chrome.*");
     if (result != sandbox::SBOX_ALL_OK)
-      return;
+      return false;
+
 #if !defined(NACL_WIN64)
     for (const auto& mime_type : info_.mime_types) {
       if (IsWin32kLockdownEnabledForMimeType(mime_type.mime_type)) {
         if (!AddWin32kLockdownPolicy(policy))
-          return;
+          return false;
         break;
       }
     }
@@ -86,7 +87,7 @@
     if (!sid.empty())
       AddAppContainerPolicy(policy, sid.c_str());
 
-    *success = true;
+    return true;
   }
 
 #elif defined(OS_POSIX)
diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc
index e9e71e2..ce71efd 100644
--- a/content/browser/renderer_host/render_process_host_impl.cc
+++ b/content/browser/renderer_host/render_process_host_impl.cc
@@ -367,7 +367,7 @@
   ~RendererSandboxedProcessLauncherDelegate() override {}
 
 #if defined(OS_WIN)
-  void PreSpawnTarget(sandbox::TargetPolicy* policy, bool* success) override {
+  bool PreSpawnTarget(sandbox::TargetPolicy* policy) override {
     AddBaseHandleClosePolicy(policy);
 
     const base::string16& sid =
@@ -376,7 +376,7 @@
     if (!sid.empty())
       AddAppContainerPolicy(policy, sid.c_str());
 
-    GetContentClient()->browser()->PreSpawnRenderer(policy, success);
+    return GetContentClient()->browser()->PreSpawnRenderer(policy);
   }
 
 #elif defined(OS_POSIX)
diff --git a/content/browser/renderer_host/render_view_host_delegate.cc b/content/browser/renderer_host/render_view_host_delegate.cc
index 0b10991..c169a056 100644
--- a/content/browser/renderer_host/render_view_host_delegate.cc
+++ b/content/browser/renderer_host/render_view_host_delegate.cc
@@ -22,14 +22,6 @@
   return NULL;
 }
 
-bool RenderViewHostDelegate::IsFullscreenForCurrentTab() const {
-  return false;
-}
-
-blink::WebDisplayMode RenderViewHostDelegate::GetDisplayMode() const {
-  return blink::WebDisplayModeBrowser;
-}
-
 SessionStorageNamespace* RenderViewHostDelegate::GetSessionStorageNamespace(
     SiteInstance* instance) {
   return NULL;
diff --git a/content/browser/renderer_host/render_view_host_delegate.h b/content/browser/renderer_host/render_view_host_delegate.h
index cb08ab8..2ea9fdd2 100644
--- a/content/browser/renderer_host/render_view_host_delegate.h
+++ b/content/browser/renderer_host/render_view_host_delegate.h
@@ -14,7 +14,6 @@
 #include "content/browser/dom_storage/session_storage_namespace_impl.h"
 #include "content/common/content_export.h"
 #include "net/base/load_states.h"
-#include "third_party/WebKit/public/platform/WebDisplayMode.h"
 #include "third_party/WebKit/public/web/WebPopupType.h"
 #include "ui/base/window_open_disposition.h"
 
@@ -146,26 +145,14 @@
   // JavaScript window.focus() method).
   virtual void Activate() {}
 
-  // Notification that the view has lost capture.
-  virtual void LostCapture() {}
-
   // Called when a file selection is to be done.
   virtual void RunFileChooser(
       RenderViewHost* render_view_host,
       const FileChooserParams& params) {}
 
-  // Returns whether the associated tab is in fullscreen mode.
-  virtual bool IsFullscreenForCurrentTab() const;
-
-  // Returns the display mode for the view.
-  virtual blink::WebDisplayMode GetDisplayMode() const;
-
   // The contents' preferred size changed.
   virtual void UpdatePreferredSize(const gfx::Size& pref_size) {}
 
-  // Notification that the view has lost the mouse lock.
-  virtual void LostMouseLock() {}
-
   // The page is trying to open a new page (e.g. a popup window). The window
   // should be created associated with the given |route_id| in the process of
   // |source_site_instance|, but it should not be shown yet. That
diff --git a/content/browser/renderer_host/render_view_host_impl.cc b/content/browser/renderer_host/render_view_host_impl.cc
index c5d2387..f4cca0d 100644
--- a/content/browser/renderer_host/render_view_host_impl.cc
+++ b/content/browser/renderer_host/render_view_host_impl.cc
@@ -830,16 +830,6 @@
     view->GotFocus();
 }
 
-void RenderViewHostImpl::LostCapture() {
-  RenderWidgetHostImpl::LostCapture();
-  delegate_->LostCapture();
-}
-
-void RenderViewHostImpl::LostMouseLock() {
-  RenderWidgetHostImpl::LostMouseLock();
-  delegate_->LostMouseLock();
-}
-
 void RenderViewHostImpl::SetInitialFocus(bool reverse) {
   Send(new ViewMsg_SetInitialFocus(GetRoutingID(), reverse));
 }
@@ -1234,14 +1224,6 @@
   ClosePageIgnoringUnloadEvents();
 }
 
-bool RenderViewHostImpl::IsFullscreenGranted() const {
-  return delegate_->IsFullscreenForCurrentTab();
-}
-
-blink::WebDisplayMode RenderViewHostImpl::GetDisplayMode() const {
-  return delegate_->GetDisplayMode();
-}
-
 void RenderViewHostImpl::OnFocus() {
   // Note: We allow focus and blur from swapped out RenderViewHosts, even when
   // the active RenderViewHost is in a different BrowsingInstance (e.g., WebUI).
diff --git a/content/browser/renderer_host/render_view_host_impl.h b/content/browser/renderer_host/render_view_host_impl.h
index 88ec881..55e57a8 100644
--- a/content/browser/renderer_host/render_view_host_impl.h
+++ b/content/browser/renderer_host/render_view_host_impl.h
@@ -284,8 +284,6 @@
   void WasShown(const ui::LatencyInfo& latency_info) override;
   bool OnMessageReceived(const IPC::Message& msg) override;
   void GotFocus() override;
-  void LostCapture() override;
-  void LostMouseLock() override;
   void SetIsLoading(bool is_loading) override;
   void ForwardMouseEvent(const blink::WebMouseEvent& mouse_event) override;
   void ForwardKeyboardEvent(const NativeWebKeyboardEvent& key_event) override;
@@ -332,8 +330,6 @@
 
  protected:
   // RenderWidgetHost protected overrides.
-  bool IsFullscreenGranted() const override;
-  blink::WebDisplayMode GetDisplayMode() const override;
   void OnFocus() override;
 
   // IPC message handlers.
diff --git a/content/browser/renderer_host/render_widget_host_delegate.cc b/content/browser/renderer_host/render_widget_host_delegate.cc
index 1bf6ee8..2026575 100644
--- a/content/browser/renderer_host/render_widget_host_delegate.cc
+++ b/content/browser/renderer_host/render_widget_host_delegate.cc
@@ -59,4 +59,14 @@
   return gfx::Rect();
 };
 
+bool RenderWidgetHostDelegate::IsFullscreenForCurrentTab(
+    RenderWidgetHostImpl* render_widget_host) const {
+  return false;
+}
+
+blink::WebDisplayMode RenderWidgetHostDelegate::GetDisplayMode(
+    RenderWidgetHostImpl* render_widget_host) const {
+  return blink::WebDisplayModeBrowser;
+}
+
 }  // namespace content
diff --git a/content/browser/renderer_host/render_widget_host_delegate.h b/content/browser/renderer_host/render_widget_host_delegate.h
index 635fc42..a96428c 100644
--- a/content/browser/renderer_host/render_widget_host_delegate.h
+++ b/content/browser/renderer_host/render_widget_host_delegate.h
@@ -8,6 +8,7 @@
 #include "base/basictypes.h"
 #include "build/build_config.h"
 #include "content/common/content_export.h"
+#include "third_party/WebKit/public/platform/WebDisplayMode.h"
 #include "third_party/WebKit/public/web/WebInputEvent.h"
 #include "ui/gfx/native_widget_types.h"
 
@@ -144,6 +145,20 @@
   virtual gfx::Rect GetRootWindowResizerRect(
       RenderWidgetHostImpl* render_widget_host) const;
 
+  // Returns whether the associated tab is in fullscreen mode.
+  virtual bool IsFullscreenForCurrentTab(
+      RenderWidgetHostImpl* render_widget_host) const;
+
+  // Returns the display mode for the view.
+  virtual blink::WebDisplayMode GetDisplayMode(
+      RenderWidgetHostImpl* render_widget_host) const;
+
+  // Notification that the widget has lost capture.
+  virtual void LostCapture(RenderWidgetHostImpl* render_widget_host) {}
+
+  // Notification that the widget has lost the mouse lock.
+  virtual void LostMouseLock(RenderWidgetHostImpl* render_widget_host) {}
+
 #if defined(OS_WIN)
   virtual gfx::NativeViewAccessible GetParentNativeViewAccessible();
 #endif
diff --git a/content/browser/renderer_host/render_widget_host_impl.cc b/content/browser/renderer_host/render_widget_host_impl.cc
index dd3da41..78491a5b 100644
--- a/content/browser/renderer_host/render_widget_host_impl.cc
+++ b/content/browser/renderer_host/render_widget_host_impl.cc
@@ -573,8 +573,15 @@
   *resize_params = ViewMsg_Resize_Params();
 
   GetWebScreenInfo(&resize_params->screen_info);
-  if (delegate_)
+  if (delegate_) {
     resize_params->resizer_rect = delegate_->GetRootWindowResizerRect(this);
+    resize_params->is_fullscreen_granted =
+        delegate_->IsFullscreenForCurrentTab(this);
+    resize_params->display_mode = delegate_->GetDisplayMode(this);
+  } else {
+    resize_params->is_fullscreen_granted = false;
+    resize_params->display_mode = blink::WebDisplayModeBrowser;
+  }
 
   if (view_) {
     resize_params->new_size = view_->GetRequestedRendererSize();
@@ -583,8 +590,6 @@
     resize_params->top_controls_shrink_blink_size =
         view_->DoTopControlsShrinkBlinkSize();
     resize_params->visible_viewport_size = view_->GetVisibleViewportSize();
-    resize_params->is_fullscreen_granted = IsFullscreenGranted();
-    resize_params->display_mode = GetDisplayMode();
   }
 
   const bool size_changed =
@@ -735,6 +740,9 @@
     touch_emulator_->CancelTouch();
 
   Send(new InputMsg_MouseCaptureLost(routing_id_));
+
+  if (delegate_)
+    delegate_->LostCapture(this);
 }
 
 void RenderWidgetHostImpl::SetActive(bool active) {
@@ -743,6 +751,9 @@
 
 void RenderWidgetHostImpl::LostMouseLock() {
   Send(new ViewMsg_MouseLockLost(routing_id_));
+
+  if (delegate_)
+    delegate_->LostMouseLock(this);
 }
 
 void RenderWidgetHostImpl::ViewDestroyed() {
@@ -1391,14 +1402,6 @@
   return view_ ? view_->IsMouseLocked() : false;
 }
 
-bool RenderWidgetHostImpl::IsFullscreenGranted() const {
-  return false;
-}
-
-blink::WebDisplayMode RenderWidgetHostImpl::GetDisplayMode() const {
-  return blink::WebDisplayModeBrowser;
-}
-
 void RenderWidgetHostImpl::SetAutoResize(bool enable,
                                          const gfx::Size& min_size,
                                          const gfx::Size& max_size) {
diff --git a/content/browser/renderer_host/render_widget_host_impl.h b/content/browser/renderer_host/render_widget_host_impl.h
index d8f07a3..b40c33f 100644
--- a/content/browser/renderer_host/render_widget_host_impl.h
+++ b/content/browser/renderer_host/render_widget_host_impl.h
@@ -218,7 +218,7 @@
   // Called to notify the RenderWidget that its associated native window
   // got/lost focused.
   virtual void GotFocus();
-  virtual void LostCapture();
+  void LostCapture();
 
   // Indicates whether the RenderWidgetHost thinks it is focused.
   // This is different from RenderWidgetHostView::HasFocus() in the sense that
@@ -230,7 +230,7 @@
   bool is_focused() const { return is_focused_; }
 
   // Called to notify the RenderWidget that it has lost the mouse lock.
-  virtual void LostMouseLock();
+  void LostMouseLock();
 
   // Noifies the RenderWidget of the current mouse cursor visibility state.
   void SendCursorVisibilityState(bool is_visible);
@@ -383,8 +383,8 @@
   bool GotResponseToLockMouseRequest(bool allowed);
 
   // Tells the RenderWidget about the latest vsync parameters.
-  virtual void UpdateVSyncParameters(base::TimeTicks timebase,
-                                     base::TimeDelta interval);
+  void UpdateVSyncParameters(base::TimeTicks timebase,
+                             base::TimeDelta interval);
 
   // Called by the view in response to OnSwapCompositorFrame.
   static void SendSwapCompositorFrameAck(
@@ -506,12 +506,9 @@
   gfx::NativeViewId GetNativeViewId() const;
 
   // ---------------------------------------------------------------------------
-  // The following methods are overridden by RenderViewHost to send upwards to
+  // The following method is overridden by RenderViewHost to send upwards to
   // its delegate.
 
-  // Called when a mousewheel event was not processed by the renderer.
-  virtual void UnhandledWheelEvent(const blink::WebMouseWheelEvent& event) {}
-
   // Callback for notification that we failed to receive any rendered graphics
   // from a newly loaded page. Used for testing.
   virtual void NotifyNewContentRenderingTimeoutForTesting() {}
@@ -520,12 +517,6 @@
 
   bool IsMouseLocked() const;
 
-  // RenderViewHost overrides this method to report whether tab-initiated
-  // fullscreen was granted.
-  virtual bool IsFullscreenGranted() const;
-
-  virtual blink::WebDisplayMode GetDisplayMode() const;
-
   // The View associated with the RenderViewHost. The lifetime of this object
   // is associated with the lifetime of the Render process. If the Renderer
   // crashes, its View is destroyed and this pointer becomes NULL, even though
diff --git a/content/browser/renderer_host/render_widget_host_view_android.cc b/content/browser/renderer_host/render_widget_host_view_android.cc
index 11c2e74..adc7f87 100644
--- a/content/browser/renderer_host/render_widget_host_view_android.cc
+++ b/content/browser/renderer_host/render_widget_host_view_android.cc
@@ -359,9 +359,7 @@
 bool RenderWidgetHostViewAndroid::OnMessageReceived(
     const IPC::Message& message) {
   if (IPC_MESSAGE_ID_CLASS(message.type()) == SyncCompositorMsgStart) {
-    bool handled = SyncCompositorOnMessageReceived(message);
-    DCHECK(handled);
-    return handled;
+    return SyncCompositorOnMessageReceived(message);
   }
   bool handled = true;
   IPC_BEGIN_MESSAGE_MAP(RenderWidgetHostViewAndroid, message)
@@ -379,6 +377,7 @@
 
 bool RenderWidgetHostViewAndroid::SyncCompositorOnMessageReceived(
     const IPC::Message& message) {
+  DCHECK(!content_view_core_ || sync_compositor_) << !!content_view_core_;
   return sync_compositor_ && sync_compositor_->OnMessageReceived(message);
 }
 
@@ -925,11 +924,11 @@
 }
 
 void RenderWidgetHostViewAndroid::CopyFromCompositingSurfaceToVideoFrame(
-      const gfx::Rect& src_subrect,
-      const scoped_refptr<media::VideoFrame>& target,
-      const base::Callback<void(bool)>& callback) {
+    const gfx::Rect& src_subrect,
+    const scoped_refptr<media::VideoFrame>& target,
+    const base::Callback<void(const gfx::Rect&, bool)>& callback) {
   NOTIMPLEMENTED();
-  callback.Run(false);
+  callback.Run(gfx::Rect(), false);
 }
 
 bool RenderWidgetHostViewAndroid::CanCopyToVideoFrame() const {
diff --git a/content/browser/renderer_host/render_widget_host_view_android.h b/content/browser/renderer_host/render_widget_host_view_android.h
index f3688718..49d7a614 100644
--- a/content/browser/renderer_host/render_widget_host_view_android.h
+++ b/content/browser/renderer_host/render_widget_host_view_android.h
@@ -132,7 +132,7 @@
   void CopyFromCompositingSurfaceToVideoFrame(
       const gfx::Rect& src_subrect,
       const scoped_refptr<media::VideoFrame>& target,
-      const base::Callback<void(bool)>& callback) override;
+      const base::Callback<void(const gfx::Rect&, bool)>& callback) override;
   bool CanCopyToVideoFrame() const override;
   void GetScreenInfo(blink::WebScreenInfo* results) override;
   bool GetScreenColorProfile(std::vector<char>* color_profile) override;
diff --git a/content/browser/renderer_host/render_widget_host_view_aura.cc b/content/browser/renderer_host/render_widget_host_view_aura.cc
index c4349df..b62519e 100644
--- a/content/browser/renderer_host/render_widget_host_view_aura.cc
+++ b/content/browser/renderer_host/render_widget_host_view_aura.cc
@@ -1124,9 +1124,9 @@
 }
 
 void RenderWidgetHostViewAura::CopyFromCompositingSurfaceToVideoFrame(
-      const gfx::Rect& src_subrect,
-      const scoped_refptr<media::VideoFrame>& target,
-      const base::Callback<void(bool)>& callback) {
+    const gfx::Rect& src_subrect,
+    const scoped_refptr<media::VideoFrame>& target,
+    const base::Callback<void(const gfx::Rect&, bool)>& callback) {
   delegated_frame_host_->CopyFromCompositingSurfaceToVideoFrame(
       src_subrect, target, callback);
 }
diff --git a/content/browser/renderer_host/render_widget_host_view_aura.h b/content/browser/renderer_host/render_widget_host_view_aura.h
index d5c7e9e4..0cc916f 100644
--- a/content/browser/renderer_host/render_widget_host_view_aura.h
+++ b/content/browser/renderer_host/render_widget_host_view_aura.h
@@ -55,6 +55,7 @@
 namespace gfx {
 class Canvas;
 class Display;
+class Rect;
 }
 
 namespace gpu {
@@ -153,7 +154,7 @@
   void CopyFromCompositingSurfaceToVideoFrame(
       const gfx::Rect& src_subrect,
       const scoped_refptr<media::VideoFrame>& target,
-      const base::Callback<void(bool)>& callback) override;
+      const base::Callback<void(const gfx::Rect&, bool)>& callback) override;
   bool CanCopyToVideoFrame() const override;
   void BeginFrameSubscription(
       scoped_ptr<RenderWidgetHostViewFrameSubscriber> subscriber) override;
diff --git a/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc b/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc
index b8c6132..8191441 100644
--- a/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc
+++ b/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc
@@ -210,6 +210,7 @@
 
   static void CallbackMethod(base::Callback<void(bool)> callback,
                              base::TimeTicks present_time,
+                             const gfx::Rect& region_in_frame,
                              bool success) {
     callback.Run(success);
   }
diff --git a/content/browser/renderer_host/render_widget_host_view_base.h b/content/browser/renderer_host/render_widget_host_view_base.h
index bf3b8e1..caea620 100644
--- a/content/browser/renderer_host/render_widget_host_view_base.h
+++ b/content/browser/renderer_host/render_widget_host_view_base.h
@@ -282,7 +282,7 @@
   virtual void CopyFromCompositingSurfaceToVideoFrame(
       const gfx::Rect& src_subrect,
       const scoped_refptr<media::VideoFrame>& target,
-      const base::Callback<void(bool)>& callback) = 0;
+      const base::Callback<void(const gfx::Rect&, bool)>& callback) = 0;
 
   // Returns true if CopyFromCompositingSurfaceToVideoFrame() is likely to
   // succeed.
diff --git a/content/browser/renderer_host/render_widget_host_view_browsertest.cc b/content/browser/renderer_host/render_widget_host_view_browsertest.cc
index 1ef3846..794d8ce 100644
--- a/content/browser/renderer_host/render_widget_host_view_browsertest.cc
+++ b/content/browser/renderer_host/render_widget_host_view_browsertest.cc
@@ -122,6 +122,7 @@
 
   // Callback when using CopyFromCompositingSurfaceToVideoFrame() API.
   void FinishCopyFromCompositingSurface(const base::Closure& quit_closure,
+                                        const gfx::Rect& region_in_frame,
                                         bool frame_captured) {
     ++callback_invoke_count_;
     if (frame_captured)
@@ -135,6 +136,7 @@
       const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
       base::Closure quit_closure,
       base::TimeTicks timestamp,
+      const gfx::Rect& region_in_frame,
       bool frame_captured) {
     ++callback_invoke_count_;
     if (frame_captured)
@@ -493,6 +495,7 @@
   void ReadbackRequestCallbackForVideo(
       scoped_refptr<media::VideoFrame> video_frame,
       base::Closure quit_callback,
+      const gfx::Rect& region_in_frame,
       bool result) {
     if (!result) {
       readback_response_ = READBACK_TO_VIDEO_FRAME_FAILED;
@@ -607,11 +610,10 @@
                                            output_size, gfx::Rect(output_size),
                                            output_size, base::TimeDelta());
 
-        base::Callback<void(bool success)> callback =
+        base::Callback<void(const gfx::Rect& rect, bool success)> callback =
             base::Bind(&CompositingRenderWidgetHostViewBrowserTestTabCapture::
                            ReadbackRequestCallbackForVideo,
-                       base::Unretained(this),
-                       video_frame,
+                       base::Unretained(this), video_frame,
                        run_loop.QuitClosure());
         rwhv->CopyFromCompositingSurfaceToVideoFrame(
             copy_rect, video_frame, callback);
diff --git a/content/browser/renderer_host/render_widget_host_view_mac.h b/content/browser/renderer_host/render_widget_host_view_mac.h
index 437e9a7..ee8de08a 100644
--- a/content/browser/renderer_host/render_widget_host_view_mac.h
+++ b/content/browser/renderer_host/render_widget_host_view_mac.h
@@ -317,7 +317,7 @@
   void CopyFromCompositingSurfaceToVideoFrame(
       const gfx::Rect& src_subrect,
       const scoped_refptr<media::VideoFrame>& target,
-      const base::Callback<void(bool)>& callback) override;
+      const base::Callback<void(const gfx::Rect&, bool)>& callback) override;
   bool CanCopyToVideoFrame() const override;
   void BeginFrameSubscription(
       scoped_ptr<RenderWidgetHostViewFrameSubscriber> subscriber) override;
diff --git a/content/browser/renderer_host/render_widget_host_view_mac.mm b/content/browser/renderer_host/render_widget_host_view_mac.mm
index a938f7d..278fa99ce7 100644
--- a/content/browser/renderer_host/render_widget_host_view_mac.mm
+++ b/content/browser/renderer_host/render_widget_host_view_mac.mm
@@ -1250,9 +1250,9 @@
 }
 
 void RenderWidgetHostViewMac::CopyFromCompositingSurfaceToVideoFrame(
-      const gfx::Rect& src_subrect,
-      const scoped_refptr<media::VideoFrame>& target,
-      const base::Callback<void(bool)>& callback) {
+    const gfx::Rect& src_subrect,
+    const scoped_refptr<media::VideoFrame>& target,
+    const base::Callback<void(const gfx::Rect&, bool)>& callback) {
   DCHECK(delegated_frame_host_);
   delegated_frame_host_->CopyFromCompositingSurfaceToVideoFrame(
       src_subrect, target, callback);
diff --git a/content/browser/storage_partition_impl_map_unittest.cc b/content/browser/storage_partition_impl_map_unittest.cc
index 39b6c69c..b28902f 100644
--- a/content/browser/storage_partition_impl_map_unittest.cc
+++ b/content/browser/storage_partition_impl_map_unittest.cc
@@ -6,6 +6,7 @@
 
 #include "base/files/file_util.h"
 #include "base/run_loop.h"
+#include "content/public/browser/browser_thread.h"
 #include "content/public/test/test_browser_context.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -84,6 +85,7 @@
   storage_partition_impl_map.GarbageCollect(
       active_paths.Pass(), run_loop.QuitClosure());
   run_loop.Run();
+  BrowserThread::GetBlockingPool()->FlushForTesting();
 
   EXPECT_TRUE(base::PathExists(active_path));
   EXPECT_FALSE(base::PathExists(inactive_path));
diff --git a/content/browser/utility_process_host_impl.cc b/content/browser/utility_process_host_impl.cc
index e087f11..4e2b07c 100644
--- a/content/browser/utility_process_host_impl.cc
+++ b/content/browser/utility_process_host_impl.cc
@@ -8,6 +8,7 @@
 #include "base/bind.h"
 #include "base/bind_helpers.h"
 #include "base/command_line.h"
+#include "base/files/file_path.h"
 #include "base/lazy_instance.h"
 #include "base/message_loop/message_loop.h"
 #include "base/process/process_handle.h"
@@ -32,6 +33,11 @@
 #include "ipc/ipc_switches.h"
 #include "ui/base/ui_base_switches.h"
 
+#if defined(OS_WIN)
+#include "sandbox/win/src/sandbox_policy.h"
+#include "sandbox/win/src/sandbox_types.h"
+#endif
+
 namespace content {
 
 // NOTE: changes to this class need to be reviewed by the security team.
@@ -57,10 +63,25 @@
 
 #if defined(OS_WIN)
   bool ShouldLaunchElevated() override { return launch_elevated_; }
-  void PreSandbox(bool* disable_default_policy,
-                  base::FilePath* exposed_dir) override {
-    *exposed_dir = exposed_dir_;
+
+  bool PreSpawnTarget(sandbox::TargetPolicy* policy) override {
+    if (exposed_dir_.empty())
+      return true;
+
+    sandbox::ResultCode result;
+    result = policy->AddRule(sandbox::TargetPolicy::SUBSYS_FILES,
+                             sandbox::TargetPolicy::FILES_ALLOW_ANY,
+                             exposed_dir_.value().c_str());
+    if (result != sandbox::SBOX_ALL_OK)
+      return false;
+
+    base::FilePath exposed_files = exposed_dir_.AppendASCII("*");
+    result = policy->AddRule(sandbox::TargetPolicy::SUBSYS_FILES,
+                             sandbox::TargetPolicy::FILES_ALLOW_ANY,
+                             exposed_files.value().c_str());
+    return result == sandbox::SBOX_ALL_OK;
   }
+
 #elif defined(OS_POSIX)
 
   bool ShouldUseZygote() override {
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc
index ece7e1b..c07fa27 100644
--- a/content/browser/web_contents/web_contents_impl.cc
+++ b/content/browser/web_contents/web_contents_impl.cc
@@ -1480,7 +1480,10 @@
     delegate_->ActivateContents(this);
 }
 
-void WebContentsImpl::LostCapture() {
+void WebContentsImpl::LostCapture(RenderWidgetHostImpl* render_widget_host) {
+  if (!RenderViewHostImpl::From(render_widget_host))
+    return;
+
   if (delegate_)
     delegate_->LostCapture();
 }
@@ -1617,7 +1620,8 @@
     delegate_->EnterFullscreenModeForTab(this, origin);
 
   FOR_EACH_OBSERVER(WebContentsObserver, observers_,
-                    DidToggleFullscreenModeForTab(IsFullscreenForCurrentTab()));
+                    DidToggleFullscreenModeForTab(IsFullscreenForCurrentTab(
+                        GetRenderViewHost()->GetWidget())));
 }
 
 void WebContentsImpl::ExitFullscreenMode() {
@@ -1647,16 +1651,24 @@
       render_widget_host->WasResized();
   }
 
-  FOR_EACH_OBSERVER(WebContentsObserver,
-                    observers_,
-                    DidToggleFullscreenModeForTab(IsFullscreenForCurrentTab()));
+  FOR_EACH_OBSERVER(WebContentsObserver, observers_,
+                    DidToggleFullscreenModeForTab(IsFullscreenForCurrentTab(
+                        GetRenderViewHost()->GetWidget())));
 }
 
-bool WebContentsImpl::IsFullscreenForCurrentTab() const {
+bool WebContentsImpl::IsFullscreenForCurrentTab(
+    RenderWidgetHostImpl* render_widget_host) const {
+  if (!RenderViewHostImpl::From(render_widget_host))
+    return false;
+
   return delegate_ ? delegate_->IsFullscreenForTabOrPending(this) : false;
 }
 
-blink::WebDisplayMode WebContentsImpl::GetDisplayMode() const {
+blink::WebDisplayMode WebContentsImpl::GetDisplayMode(
+    RenderWidgetHostImpl* render_widget_host) const {
+  if (!RenderViewHostImpl::From(render_widget_host))
+    return blink::WebDisplayModeBrowser;
+
   return delegate_ ? delegate_->GetDisplayMode(this)
                    : blink::WebDisplayModeBrowser;
 }
@@ -1676,7 +1688,10 @@
     GotResponseToLockMouseRequest(false);
 }
 
-void WebContentsImpl::LostMouseLock() {
+void WebContentsImpl::LostMouseLock(RenderWidgetHostImpl* render_widget_host) {
+  if (!RenderViewHostImpl::From(render_widget_host))
+    return;
+
   if (delegate_)
     delegate_->LostMouseLock();
 }
@@ -2972,9 +2987,9 @@
     // No page change?  Then, the renderer and browser can remain in fullscreen.
     return;
   }
-  if (IsFullscreenForCurrentTab())
+  if (IsFullscreenForCurrentTab(GetRenderViewHost()->GetWidget()))
     ExitFullscreen();
-  DCHECK(!IsFullscreenForCurrentTab());
+  DCHECK(!IsFullscreenForCurrentTab(GetRenderViewHost()->GetWidget()));
 }
 
 void WebContentsImpl::DidNavigateMainFramePostCommit(
@@ -3895,7 +3910,7 @@
 
   // Ensure fullscreen mode is exited in the |delegate_| since a crashed
   // renderer may not have made a clean exit.
-  if (IsFullscreenForCurrentTab())
+  if (IsFullscreenForCurrentTab(GetRenderViewHost()->GetWidget()))
     ExitFullscreenMode();
 
   // Cancel any visible dialogs so they are not left dangling over the sad tab.
diff --git a/content/browser/web_contents/web_contents_impl.h b/content/browser/web_contents/web_contents_impl.h
index 5a520a8..8fc9649 100644
--- a/content/browser/web_contents/web_contents_impl.h
+++ b/content/browser/web_contents/web_contents_impl.h
@@ -480,13 +480,9 @@
                         uint64 upload_position,
                         uint64 upload_size) override;
   void Activate() override;
-  void LostCapture() override;
   void RunFileChooser(RenderViewHost* render_view_host,
                       const FileChooserParams& params) override;
-  bool IsFullscreenForCurrentTab() const override;
-  blink::WebDisplayMode GetDisplayMode() const override;
   void UpdatePreferredSize(const gfx::Size& pref_size) override;
-  void LostMouseLock() override;
   void CreateNewWindow(
       SiteInstance* source_site_instance,
       int32_t route_id,
@@ -600,6 +596,12 @@
                           bool last_unlocked_by_target) override;
   gfx::Rect GetRootWindowResizerRect(
       RenderWidgetHostImpl* render_widget_host) const override;
+  bool IsFullscreenForCurrentTab(
+      RenderWidgetHostImpl* render_widget_host) const override;
+  blink::WebDisplayMode GetDisplayMode(
+      RenderWidgetHostImpl* render_widget_host) const override;
+  void LostCapture(RenderWidgetHostImpl* render_widget_host) override;
+  void LostMouseLock(RenderWidgetHostImpl* render_widget_host) override;
 
   // RenderFrameHostManager::Delegate ------------------------------------------
 
diff --git a/content/browser/web_contents/web_contents_impl_unittest.cc b/content/browser/web_contents/web_contents_impl_unittest.cc
index acdfc42..2e38619c 100644
--- a/content/browser/web_contents/web_contents_impl_unittest.cc
+++ b/content/browser/web_contents/web_contents_impl_unittest.cc
@@ -1511,7 +1511,6 @@
   FakeFullscreenDelegate fake_delegate;
   contents()->SetDelegate(&fake_delegate);
   TestRenderFrameHost* orig_rfh = contents()->GetMainFrame();
-  TestRenderViewHost* orig_rvh = orig_rfh->GetRenderViewHost();
 
   // Navigate to a site.
   const GURL url("http://www.google.com");
@@ -1524,13 +1523,11 @@
   EXPECT_EQ(orig_rfh, contents()->GetMainFrame());
 
   // Toggle fullscreen mode on (as if initiated via IPC from renderer).
-  EXPECT_FALSE(orig_rvh->IsFullscreenGranted());
-  EXPECT_FALSE(contents()->IsFullscreenForCurrentTab());
+  EXPECT_FALSE(contents()->IsFullscreenForCurrentTab(test_rvh()->GetWidget()));
   EXPECT_FALSE(fake_delegate.IsFullscreenForTabOrPending(contents()));
   orig_rfh->OnMessageReceived(
       FrameHostMsg_ToggleFullscreen(orig_rfh->GetRoutingID(), true));
-  EXPECT_TRUE(orig_rvh->IsFullscreenGranted());
-  EXPECT_TRUE(contents()->IsFullscreenForCurrentTab());
+  EXPECT_TRUE(contents()->IsFullscreenForCurrentTab(test_rvh()->GetWidget()));
   EXPECT_TRUE(fake_delegate.IsFullscreenForTabOrPending(contents()));
 
   // Navigate to a new site.
@@ -1544,8 +1541,7 @@
                               ui::PAGE_TRANSITION_TYPED);
 
   // Confirm fullscreen has exited.
-  EXPECT_FALSE(orig_rvh->IsFullscreenGranted());
-  EXPECT_FALSE(contents()->IsFullscreenForCurrentTab());
+  EXPECT_FALSE(contents()->IsFullscreenForCurrentTab(test_rvh()->GetWidget()));
   EXPECT_FALSE(fake_delegate.IsFullscreenForTabOrPending(contents()));
 
   contents()->SetDelegate(nullptr);
@@ -1556,8 +1552,7 @@
 TEST_F(WebContentsImplTest, HistoryNavigationExitsFullscreen) {
   FakeFullscreenDelegate fake_delegate;
   contents()->SetDelegate(&fake_delegate);
-  TestRenderFrameHost* const orig_rfh = contents()->GetMainFrame();
-  TestRenderViewHost* const orig_rvh = orig_rfh->GetRenderViewHost();
+  TestRenderFrameHost* orig_rfh = contents()->GetMainFrame();
 
   // Navigate to a site.
   const GURL url("http://www.google.com");
@@ -1581,16 +1576,14 @@
   EXPECT_EQ(orig_rfh, contents()->GetMainFrame());
 
   // Sanity-check: Confirm we're not starting out in fullscreen mode.
-  EXPECT_FALSE(orig_rvh->IsFullscreenGranted());
-  EXPECT_FALSE(contents()->IsFullscreenForCurrentTab());
+  EXPECT_FALSE(contents()->IsFullscreenForCurrentTab(test_rvh()->GetWidget()));
   EXPECT_FALSE(fake_delegate.IsFullscreenForTabOrPending(contents()));
 
   for (int i = 0; i < 2; ++i) {
     // Toggle fullscreen mode on (as if initiated via IPC from renderer).
     orig_rfh->OnMessageReceived(
         FrameHostMsg_ToggleFullscreen(orig_rfh->GetRoutingID(), true));
-    EXPECT_TRUE(orig_rvh->IsFullscreenGranted());
-    EXPECT_TRUE(contents()->IsFullscreenForCurrentTab());
+    EXPECT_TRUE(contents()->IsFullscreenForCurrentTab(test_rvh()->GetWidget()));
     EXPECT_TRUE(fake_delegate.IsFullscreenForTabOrPending(contents()));
 
     // Navigate backward (or forward).
@@ -1607,8 +1600,8 @@
     orig_rfh->SimulateNavigationStop();
 
     // Confirm fullscreen has exited.
-    EXPECT_FALSE(orig_rvh->IsFullscreenGranted());
-    EXPECT_FALSE(contents()->IsFullscreenForCurrentTab());
+    EXPECT_FALSE(
+        contents()->IsFullscreenForCurrentTab(test_rvh()->GetWidget()));
     EXPECT_FALSE(fake_delegate.IsFullscreenForTabOrPending(contents()));
   }
 
@@ -1647,21 +1640,18 @@
                               url, ui::PAGE_TRANSITION_TYPED);
 
   // Toggle fullscreen mode on (as if initiated via IPC from renderer).
-  EXPECT_FALSE(test_rvh()->IsFullscreenGranted());
-  EXPECT_FALSE(contents()->IsFullscreenForCurrentTab());
+  EXPECT_FALSE(contents()->IsFullscreenForCurrentTab(test_rvh()->GetWidget()));
   EXPECT_FALSE(fake_delegate.IsFullscreenForTabOrPending(contents()));
   contents()->GetMainFrame()->OnMessageReceived(FrameHostMsg_ToggleFullscreen(
       contents()->GetMainFrame()->GetRoutingID(), true));
-  EXPECT_TRUE(test_rvh()->IsFullscreenGranted());
-  EXPECT_TRUE(contents()->IsFullscreenForCurrentTab());
+  EXPECT_TRUE(contents()->IsFullscreenForCurrentTab(test_rvh()->GetWidget()));
   EXPECT_TRUE(fake_delegate.IsFullscreenForTabOrPending(contents()));
 
   // Crash the renderer.
   main_test_rfh()->GetProcess()->SimulateCrash();
 
   // Confirm fullscreen has exited.
-  EXPECT_FALSE(test_rvh()->IsFullscreenGranted());
-  EXPECT_FALSE(contents()->IsFullscreenForCurrentTab());
+  EXPECT_FALSE(contents()->IsFullscreenForCurrentTab(test_rvh()->GetWidget()));
   EXPECT_FALSE(fake_delegate.IsFullscreenForTabOrPending(contents()));
 
   contents()->SetDelegate(nullptr);
diff --git a/content/common/android/sync_compositor_messages.h b/content/common/android/sync_compositor_messages.h
index 4ea5b15..d779f25 100644
--- a/content/common/android/sync_compositor_messages.h
+++ b/content/common/android/sync_compositor_messages.h
@@ -7,6 +7,7 @@
 #include "cc/output/compositor_frame_ack.h"
 #include "content/common/content_export.h"
 #include "content/common/content_param_traits.h"
+#include "content/common/input/did_overscroll_params.h"
 #include "content/common/input/input_event_ack_state.h"
 #include "ipc/ipc_message_macros.h"
 #include "third_party/WebKit/public/web/WebInputEvent.h"
@@ -125,3 +126,7 @@
 
 IPC_MESSAGE_ROUTED1(SyncCompositorHostMsg_UpdateState,
                     content::SyncCompositorCommonRendererParams)
+
+IPC_MESSAGE_ROUTED2(SyncCompositorHostMsg_OverScroll,
+                    content::SyncCompositorCommonRendererParams,
+                    content::DidOverscrollParams)
diff --git a/content/common/child_process_messages.h b/content/common/child_process_messages.h
index ec2a4bf..da73059 100644
--- a/content/common/child_process_messages.h
+++ b/content/common/child_process_messages.h
@@ -70,6 +70,7 @@
   IPC_STRUCT_TRAITS_MEMBER(type)
   IPC_STRUCT_TRAITS_MEMBER(handle)
   IPC_STRUCT_TRAITS_MEMBER(offset)
+  IPC_STRUCT_TRAITS_MEMBER(stride)
 #if defined(USE_OZONE)
   IPC_STRUCT_TRAITS_MEMBER(native_pixmap_handle)
 #endif
diff --git a/content/common/gpu/client/gpu_channel_host.cc b/content/common/gpu/client/gpu_channel_host.cc
index 8ff3ab854..80dfe0a 100644
--- a/content/common/gpu/client/gpu_channel_host.cc
+++ b/content/common/gpu/client/gpu_channel_host.cc
@@ -372,6 +372,7 @@
       handle.type = gfx::SHARED_MEMORY_BUFFER;
       handle.handle = ShareToGpuProcess(source_handle.handle);
       handle.offset = source_handle.offset;
+      handle.stride = source_handle.stride;
       *requires_sync_point = false;
       return handle;
     }
diff --git a/content/common/gpu/client/gpu_memory_buffer_impl_shared_memory.cc b/content/common/gpu/client/gpu_memory_buffer_impl_shared_memory.cc
index 9a36a3b..8b840739 100644
--- a/content/common/gpu/client/gpu_memory_buffer_impl_shared_memory.cc
+++ b/content/common/gpu/client/gpu_memory_buffer_impl_shared_memory.cc
@@ -23,10 +23,12 @@
     gfx::BufferFormat format,
     const DestructionCallback& callback,
     scoped_ptr<base::SharedMemory> shared_memory,
-    size_t offset)
+    size_t offset,
+    int stride)
     : GpuMemoryBufferImpl(id, size, format, callback),
       shared_memory_(shared_memory.Pass()),
-      offset_(offset) {
+      offset_(offset),
+      stride_(stride) {
   DCHECK(IsSizeValidForFormat(size, format));
 }
 
@@ -48,7 +50,8 @@
     return nullptr;
 
   return make_scoped_ptr(new GpuMemoryBufferImplSharedMemory(
-      id, size, format, callback, shared_memory.Pass(), 0));
+      id, size, format, callback, shared_memory.Pass(), 0,
+      gfx::RowSizeForBufferFormat(size.width(), format, 0)));
 }
 
 // static
@@ -70,6 +73,8 @@
   handle.type = gfx::SHARED_MEMORY_BUFFER;
   handle.id = id;
   handle.offset = 0;
+  handle.stride = static_cast<int32_t>(
+      gfx::RowSizeForBufferFormat(size.width(), format, 0));
   shared_memory.GiveToProcess(child_process, &handle.handle);
   return handle;
 }
@@ -88,7 +93,7 @@
   return make_scoped_ptr(new GpuMemoryBufferImplSharedMemory(
       handle.id, size, format, callback,
       make_scoped_ptr(new base::SharedMemory(handle.handle, false)),
-      handle.offset));
+      handle.offset, handle.stride));
 }
 
 // static
@@ -162,6 +167,8 @@
   DCHECK(rv);
   handle->type = gfx::SHARED_MEMORY_BUFFER;
   handle->offset = 0;
+  handle->stride = static_cast<int32_t>(
+      gfx::RowSizeForBufferFormat(size.width(), format, 0));
   handle->handle = base::SharedMemory::DuplicateHandle(shared_memory.handle());
   return base::Bind(&Noop);
 }
@@ -172,6 +179,8 @@
   // Map the buffer first time Map() is called then keep it mapped for the
   // lifetime of the buffer. This avoids mapping the buffer unless necessary.
   if (!shared_memory_->memory()) {
+    DCHECK_EQ(static_cast<size_t>(stride_),
+              gfx::RowSizeForBufferFormat(size_.width(), format_, 0));
     size_t buffer_size = gfx::BufferSizeForBufferFormat(size_, format_);
     // Note: offset_ != 0 is not common use-case. To keep it simple we
     // map offset + buffer_size here but this can be avoided using MapAt().
@@ -205,6 +214,7 @@
   handle.type = gfx::SHARED_MEMORY_BUFFER;
   handle.id = id_;
   handle.offset = offset_;
+  handle.stride = stride_;
   handle.handle = shared_memory_->handle();
   return handle;
 }
diff --git a/content/common/gpu/client/gpu_memory_buffer_impl_shared_memory.h b/content/common/gpu/client/gpu_memory_buffer_impl_shared_memory.h
index bb5f29b..22f292a 100644
--- a/content/common/gpu/client/gpu_memory_buffer_impl_shared_memory.h
+++ b/content/common/gpu/client/gpu_memory_buffer_impl_shared_memory.h
@@ -59,10 +59,12 @@
                                   gfx::BufferFormat format,
                                   const DestructionCallback& callback,
                                   scoped_ptr<base::SharedMemory> shared_memory,
-                                  size_t offset);
+                                  size_t offset,
+                                  int stride);
 
   scoped_ptr<base::SharedMemory> shared_memory_;
   size_t offset_;
+  int stride_;
 
   DISALLOW_COPY_AND_ASSIGN(GpuMemoryBufferImplSharedMemory);
 };
diff --git a/content/common/gpu/gpu_channel.cc b/content/common/gpu/gpu_channel.cc
index 746bc11..f8559b9 100644
--- a/content/common/gpu/gpu_channel.cc
+++ b/content/common/gpu/gpu_channel.cc
@@ -17,6 +17,7 @@
 #include "base/bind.h"
 #include "base/command_line.h"
 #include "base/location.h"
+#include "base/numerics/safe_conversions.h"
 #include "base/single_thread_task_runner.h"
 #include "base/stl_util.h"
 #include "base/strings/string_util.h"
@@ -1040,10 +1041,14 @@
     uint32 internalformat) {
   switch (handle.type) {
     case gfx::SHARED_MEMORY_BUFFER: {
+      if (!base::IsValueInRangeForNumericType<size_t>(handle.stride))
+        return nullptr;
       scoped_refptr<gl::GLImageSharedMemory> image(
           new gl::GLImageSharedMemory(size, internalformat));
-      if (!image->Initialize(handle.handle, handle.id, format, handle.offset))
+      if (!image->Initialize(handle.handle, handle.id, format, handle.offset,
+                             handle.stride)) {
         return nullptr;
+      }
 
       return image;
     }
diff --git a/content/common/gpu/image_transport_surface_android.cc b/content/common/gpu/image_transport_surface_android.cc
index 8f37418..79a16c0b 100644
--- a/content/common/gpu/image_transport_surface_android.cc
+++ b/content/common/gpu/image_transport_surface_android.cc
@@ -24,12 +24,14 @@
   DCHECK_EQ(handle.transport_type, gfx::NATIVE_DIRECT);
   ANativeWindow* window =
       GpuSurfaceLookup::GetInstance()->AcquireNativeWidget(handle.handle);
-  CHECK(window) << "Failed to retrieve window handle.";
+  if (!window) {
+    LOG(WARNING) << "Failed to acquire native widget.";
+    return scoped_refptr<gfx::GLSurface>();
+  }
   scoped_refptr<gfx::GLSurface> surface =
       new gfx::NativeViewGLSurfaceEGL(window);
   bool initialize_success = surface->Initialize();
-  if (window)
-    ANativeWindow_release(window);
+  ANativeWindow_release(window);
   if (!initialize_success)
     return scoped_refptr<gfx::GLSurface>();
 
diff --git a/content/common/page_state_serialization.cc b/content/common/page_state_serialization.cc
index c067725f..73743f78 100644
--- a/content/common/page_state_serialization.cc
+++ b/content/common/page_state_serialization.cc
@@ -495,8 +495,8 @@
   WriteInteger64(state.item_sequence_number, obj);
   WriteInteger64(state.document_sequence_number, obj);
   WriteInteger(state.referrer_policy, obj);
-  WriteReal(state.pinch_viewport_scroll_offset.x(), obj);
-  WriteReal(state.pinch_viewport_scroll_offset.y(), obj);
+  WriteReal(state.visual_viewport_scroll_offset.x(), obj);
+  WriteReal(state.visual_viewport_scroll_offset.y(), obj);
 
   WriteInteger(state.scroll_restoration_type, obj);
 
@@ -566,9 +566,9 @@
   if (obj->version >= 20) {
     double x = ReadReal(obj);
     double y = ReadReal(obj);
-    state->pinch_viewport_scroll_offset = gfx::PointF(x, y);
+    state->visual_viewport_scroll_offset = gfx::PointF(x, y);
   } else {
-    state->pinch_viewport_scroll_offset = gfx::PointF(-1, -1);
+    state->visual_viewport_scroll_offset = gfx::PointF(-1, -1);
   }
 
   if (obj->version >= 22) {
@@ -708,7 +708,7 @@
   state_object = other.state_object;
   document_state = other.document_state;
   scroll_restoration_type = other.scroll_restoration_type;
-  pinch_viewport_scroll_offset = other.pinch_viewport_scroll_offset;
+  visual_viewport_scroll_offset = other.visual_viewport_scroll_offset;
   scroll_offset = other.scroll_offset;
   item_sequence_number = other.item_sequence_number;
   document_sequence_number = other.document_sequence_number;
diff --git a/content/common/page_state_serialization.h b/content/common/page_state_serialization.h
index 4d60e14e..226aa04 100644
--- a/content/common/page_state_serialization.h
+++ b/content/common/page_state_serialization.h
@@ -50,7 +50,7 @@
   base::NullableString16 state_object;
   std::vector<base::NullableString16> document_state;
   blink::WebHistoryScrollRestorationType scroll_restoration_type;
-  gfx::PointF pinch_viewport_scroll_offset;
+  gfx::PointF visual_viewport_scroll_offset;
   gfx::Point scroll_offset;
   int64 item_sequence_number;
   int64 document_sequence_number;
diff --git a/content/common/page_state_serialization_unittest.cc b/content/common/page_state_serialization_unittest.cc
index abb2a395..f660fc2 100644
--- a/content/common/page_state_serialization_unittest.cc
+++ b/content/common/page_state_serialization_unittest.cc
@@ -71,7 +71,7 @@
   EXPECT_EQ(a.state_object, b.state_object);
   ExpectEquality(a.document_state, b.document_state);
   EXPECT_EQ(a.scroll_restoration_type, b.scroll_restoration_type);
-  EXPECT_EQ(a.pinch_viewport_scroll_offset, b.pinch_viewport_scroll_offset);
+  EXPECT_EQ(a.visual_viewport_scroll_offset, b.visual_viewport_scroll_offset);
   EXPECT_EQ(a.scroll_offset, b.scroll_offset);
   EXPECT_EQ(a.item_sequence_number, b.item_sequence_number);
   EXPECT_EQ(a.document_sequence_number, b.document_sequence_number);
@@ -102,7 +102,7 @@
     frame_state->document_state.push_back(NS16("dev.chromium.org"));
     frame_state->scroll_restoration_type =
         blink::WebHistoryScrollRestorationManual;
-    frame_state->pinch_viewport_scroll_offset = gfx::PointF(10, 15);
+    frame_state->visual_viewport_scroll_offset = gfx::PointF(10, 15);
     frame_state->scroll_offset = gfx::Point(0, 100);
     frame_state->item_sequence_number = 1;
     frame_state->document_sequence_number = 2;
@@ -142,7 +142,7 @@
       frame_state->target = NS16("target");
     frame_state->scroll_restoration_type =
         blink::WebHistoryScrollRestorationAuto;
-    frame_state->pinch_viewport_scroll_offset = gfx::PointF(-1, -1);
+    frame_state->visual_viewport_scroll_offset = gfx::PointF(-1, -1);
     frame_state->scroll_offset = gfx::Point(42, -42);
     frame_state->item_sequence_number = 123;
     frame_state->document_sequence_number = 456;
diff --git a/content/common/sandbox_win.cc b/content/common/sandbox_win.cc
index 88f703c..4e441bc 100644
--- a/content/common/sandbox_win.cc
+++ b/content/common/sandbox_win.cc
@@ -661,6 +661,7 @@
 base::Process StartSandboxedProcess(
     SandboxedProcessLauncherDelegate* delegate,
     base::CommandLine* cmd_line) {
+  DCHECK(delegate);
   const base::CommandLine& browser_command_line =
       *base::CommandLine::ForCurrentProcess();
   std::string type_str = cmd_line->GetSwitchValueASCII(switches::kProcessType);
@@ -680,7 +681,7 @@
   // to create separate pretetch settings for browser, renderer etc.
   cmd_line->AppendArg(base::StringPrintf("/prefetch:%d", base::Hash(type_str)));
 
-  if ((delegate && !delegate->ShouldSandbox()) ||
+  if ((!delegate->ShouldSandbox()) ||
       browser_command_line.HasSwitch(switches::kNoSandbox) ||
       cmd_line->HasSwitch(switches::kNoSandbox)) {
     base::Process process =
@@ -717,13 +718,10 @@
 
   SetJobLevel(*cmd_line, sandbox::JOB_LOCKDOWN, 0, policy);
 
-  bool disable_default_policy = false;
-  base::FilePath exposed_dir;
-  if (delegate)
-    delegate->PreSandbox(&disable_default_policy, &exposed_dir);
-
-  if (!disable_default_policy && !AddPolicyForSandboxedProcess(policy))
-    return base::Process();
+  if (!delegate->DisableDefaultPolicy()) {
+    if (!AddPolicyForSandboxedProcess(policy))
+      return base::Process();
+  }
 
 #if !defined(NACL_WIN64)
   if (type_str == switches::kRendererProcess ||
@@ -761,22 +759,6 @@
     cmd_line->AppendSwitchASCII("ignored", " --type=renderer ");
   }
 
-  sandbox::ResultCode result;
-  if (!exposed_dir.empty()) {
-    result = policy->AddRule(sandbox::TargetPolicy::SUBSYS_FILES,
-                             sandbox::TargetPolicy::FILES_ALLOW_ANY,
-                             exposed_dir.value().c_str());
-    if (result != sandbox::SBOX_ALL_OK)
-      return base::Process();
-
-    base::FilePath exposed_files = exposed_dir.AppendASCII("*");
-    result = policy->AddRule(sandbox::TargetPolicy::SUBSYS_FILES,
-                             sandbox::TargetPolicy::FILES_ALLOW_ANY,
-                             exposed_files.value().c_str());
-    if (result != sandbox::SBOX_ALL_OK)
-      return base::Process();
-  }
-
   if (!AddGenericPolicy(policy)) {
     NOTREACHED();
     return base::Process();
@@ -800,17 +782,13 @@
   policy->SetStderrHandle(GetStdHandle(STD_ERROR_HANDLE));
 #endif
 
-  if (delegate) {
-    bool success = true;
-    delegate->PreSpawnTarget(policy, &success);
-    if (!success)
-      return base::Process();
-  }
+  if (!delegate->PreSpawnTarget(policy))
+    return base::Process();
 
   TRACE_EVENT_BEGIN0("startup", "StartProcessWithAccess::LAUNCHPROCESS");
 
   PROCESS_INFORMATION temp_process_info = {};
-  result = g_broker_services->SpawnTarget(
+  sandbox::ResultCode result = g_broker_services->SpawnTarget(
       cmd_line->GetProgram().value().c_str(),
       cmd_line->GetCommandLineString().c_str(), policy, &temp_process_info);
   DWORD last_error = ::GetLastError();
@@ -833,13 +811,10 @@
     } else
       DLOG(ERROR) << "Failed to launch process. Error: " << result;
 
-    policy->Release();
     return base::Process();
   }
-  policy->Release();
 
-  if (delegate)
-    delegate->PostSpawnTarget(target.process_handle());
+  delegate->PostSpawnTarget(target.process_handle());
 
   CHECK(ResumeThread(target.thread_handle()) != -1);
   return base::Process(target.TakeProcessHandle());
@@ -855,7 +830,6 @@
     return !!::DuplicateHandle(::GetCurrentProcess(), source_handle,
                                ::GetCurrentProcess(), target_handle,
                                desired_access, FALSE, options);
-
   }
 
   // Try the broker next
diff --git a/content/content_browser.gypi b/content/content_browser.gypi
index 7cc9fa2..569e2bd 100644
--- a/content/content_browser.gypi
+++ b/content/content_browser.gypi
@@ -986,6 +986,9 @@
       'browser/media/audio_stream_monitor.h',
       'browser/media/capture/audio_mirroring_manager.cc',
       'browser/media/capture/audio_mirroring_manager.h',
+      'browser/media/capture/cursor_renderer.h',
+      'browser/media/capture/cursor_renderer_aura.cc',
+      'browser/media/capture/cursor_renderer_aura.h',
       'browser/media/capture/web_contents_audio_input_stream.cc',
       'browser/media/capture/web_contents_audio_input_stream.h',
       'browser/media/capture/web_contents_audio_muter.cc',
@@ -2100,6 +2103,8 @@
       ],
     }, {
       'sources/': [
+        ['exclude', '^browser/media/capture/cursor_renderer_aura.cc'],
+        ['exclude', '^browser/media/capture/cursor_renderer_aura.h'],
         ['exclude', '^browser/renderer_host/input/touch_selection_controller_client_aura.cc'],
         ['exclude', '^browser/renderer_host/input/touch_selection_controller_client_aura.h'],
         ['exclude', '^browser/renderer_host/render_widget_host_view_aura.cc'],
diff --git a/content/content_renderer.gypi b/content/content_renderer.gypi
index 36a7b0f..47448c2 100644
--- a/content/content_renderer.gypi
+++ b/content/content_renderer.gypi
@@ -322,6 +322,8 @@
       'renderer/media/renderer_gpu_video_accelerator_factories.h',
       'renderer/media/renderer_webaudiodevice_impl.cc',
       'renderer/media/renderer_webaudiodevice_impl.h',
+      'renderer/media/renderer_webmediaplayer_delegate.cc',
+      'renderer/media/renderer_webmediaplayer_delegate.h',
       'renderer/media/renderer_webmidiaccessor_impl.cc',
       'renderer/media/renderer_webmidiaccessor_impl.h',
       'renderer/media/video_capture_impl.cc',
diff --git a/content/content_tests.gypi b/content/content_tests.gypi
index 728c41c..2eb0e09 100644
--- a/content/content_tests.gypi
+++ b/content/content_tests.gypi
@@ -493,6 +493,7 @@
       'browser/media/capture/audio_mirroring_manager_unittest.cc',
       'browser/media/capture/web_contents_audio_input_stream_unittest.cc',
       'browser/media/capture/web_contents_video_capture_device_unittest.cc',
+      'browser/media/capture/cursor_renderer_aura_unittest.cc',
       'browser/media/media_internals_unittest.cc',
       'browser/media/midi_host_unittest.cc',
       'browser/media/webrtc_identity_store_unittest.cc',
@@ -971,7 +972,7 @@
             '../third_party/iaccessible2/iaccessible2.gyp:iaccessible2',
           ],
         }],
-        ['OS!="android" and OS!="ios"', {
+        ['use_aura==1 or OS=="mac"', {
           'sources': [
             'browser/compositor/test/no_transport_image_transport_factory.cc',
             'browser/compositor/test/no_transport_image_transport_factory.h',
@@ -1263,6 +1264,12 @@
                 '../third_party/libvpx_new/libvpx.gyp:libvpx_new',
               ],
             }],
+            # Avoid windows due to non-availability of cursor resources in test.
+            ['OS != "linux"', {
+              'sources!': [
+              'browser/media/capture/cursor_renderer_aura_unittest.cc',
+              ],
+            }],
             ['use_aura!=1 and OS!="android"', {
               'sources!': [
                 'browser/renderer_host/input/tap_suppression_controller_unittest.cc',
diff --git a/content/public/android/java/src/org/chromium/content/browser/ChildProcessLauncher.java b/content/public/android/java/src/org/chromium/content/browser/ChildProcessLauncher.java
index ee4d63a..146129b 100644
--- a/content/public/android/java/src/org/chromium/content/browser/ChildProcessLauncher.java
+++ b/content/public/android/java/src/org/chromium/content/browser/ChildProcessLauncher.java
@@ -41,7 +41,7 @@
  */
 @JNINamespace("content")
 public class ChildProcessLauncher {
-    private static final String TAG = "cr.ChildProcessLaunch";
+    private static final String TAG = "cr.ChildProcLauncher";
 
     static final int CALLBACK_FOR_UNKNOWN_PROCESS = 0;
     static final int CALLBACK_FOR_GPU_PROCESS = 1;
@@ -722,7 +722,10 @@
                     Log.e(TAG, "Invalid surfaceId.");
                     return null;
                 }
-                assert surface.isValid();
+                if (!surface.isValid()) {
+                    Log.e(TAG, "Requested surface is not valid.");
+                    return null;
+                }
                 return new SurfaceWrapper(surface);
             }
 
diff --git a/content/public/browser/content_browser_client.cc b/content/public/browser/content_browser_client.cc
index 3be2a8f..5ec8af5 100644
--- a/content/public/browser/content_browser_client.cc
+++ b/content/public/browser/content_browser_client.cc
@@ -392,6 +392,10 @@
   return nullptr;
 }
 
+bool ContentBrowserClient::PreSpawnRenderer(sandbox::TargetPolicy* policy) {
+  return true;
+}
+
 base::string16 ContentBrowserClient::GetAppContainerSidForSandboxType(
     int sandbox_type) const {
   // Embedders should override this method and return different SIDs for each
diff --git a/content/public/browser/content_browser_client.h b/content/public/browser/content_browser_client.h
index a4bad09..18524101 100644
--- a/content/public/browser/content_browser_client.h
+++ b/content/public/browser/content_browser_client.h
@@ -739,8 +739,7 @@
   // This is called on the PROCESS_LAUNCHER thread before the renderer process
   // is launched. It gives the embedder a chance to add loosen the sandbox
   // policy.
-  virtual void PreSpawnRenderer(sandbox::TargetPolicy* policy,
-                                bool* success) {}
+  virtual bool PreSpawnRenderer(sandbox::TargetPolicy* policy);
 
   // Returns the AppContainer SID for the specified sandboxed process type, or
   // empty string if this sandboxed process type does not support living inside
diff --git a/content/public/browser/render_widget_host_view_frame_subscriber.h b/content/public/browser/render_widget_host_view_frame_subscriber.h
index 6533166..b5448b4 100644
--- a/content/public/browser/render_widget_host_view_frame_subscriber.h
+++ b/content/public/browser/render_widget_host_view_frame_subscriber.h
@@ -40,7 +40,11 @@
   // If |frame_captured| is false then the content in frame provided is
   // invalid. There was an error during the process of frame capture or the
   // platform layer is shutting down. |timestamp| is also invalid in this case.
+  //
+  // |region_in_frame| is the location within the Videoframe where the
+  // captured content resides, with the rest of the VideoFrame blacked out.
   typedef base::Callback<void(base::TimeTicks /* timestamp */,
+                              const gfx::Rect& /* region_in_frame */,
                               bool /* frame_captured */)> DeliverFrameCallback;
 
   // Called when a new frame is going to be presented at time
diff --git a/content/public/browser/screen_orientation_provider.cc b/content/public/browser/screen_orientation_provider.cc
index 5fa5b23..165c0a7d 100644
--- a/content/public/browser/screen_orientation_provider.cc
+++ b/content/public/browser/screen_orientation_provider.cc
@@ -4,8 +4,8 @@
 
 #include "content/public/browser/screen_orientation_provider.h"
 
-#include "content/browser/renderer_host/render_view_host_delegate.h"
-#include "content/public/browser/render_view_host.h"
+#include "content/browser/renderer_host/render_view_host_impl.h"
+#include "content/browser/web_contents/web_contents_impl.h"
 #include "content/public/browser/render_widget_host.h"
 #include "content/public/browser/screen_orientation_delegate.h"
 #include "content/public/browser/screen_orientation_dispatcher_host.h"
@@ -44,19 +44,15 @@
   }
 
   if (delegate_->FullScreenRequired(web_contents())) {
-    RenderViewHost* rvh = web_contents()->GetRenderViewHost();
-    if (!rvh) {
+    RenderViewHostImpl* rvhi =
+        static_cast<RenderViewHostImpl*>(web_contents()->GetRenderViewHost());
+    if (!rvhi) {
       dispatcher_->NotifyLockError(request_id,
                                    blink::WebLockOrientationErrorCanceled);
       return;
     }
-    RenderViewHostDelegate* rvhd = rvh->GetDelegate();
-    if (!rvhd) {
-      dispatcher_->NotifyLockError(request_id,
-                                   blink::WebLockOrientationErrorCanceled);
-      return;
-    }
-    if (!rvhd->IsFullscreenForCurrentTab()) {
+    if (!static_cast<WebContentsImpl*>(web_contents())
+             ->IsFullscreenForCurrentTab(rvhi->GetWidget())) {
       dispatcher_->NotifyLockError(request_id,
           blink::WebLockOrientationErrorFullScreenRequired);
       return;
diff --git a/content/public/common/page_state.cc b/content/public/common/page_state.cc
index 9d100d3..258eb77 100644
--- a/content/public/common/page_state.cc
+++ b/content/public/common/page_state.cc
@@ -42,7 +42,7 @@
 
 void RecursivelyRemoveScrollOffset(ExplodedFrameState* state) {
   state->scroll_offset = gfx::Point();
-  state->pinch_viewport_scroll_offset = gfx::PointF();
+  state->visual_viewport_scroll_offset = gfx::PointF();
 }
 
 void RecursivelyRemoveReferrer(ExplodedFrameState* state) {
diff --git a/content/public/common/sandboxed_process_launcher_delegate.cc b/content/public/common/sandboxed_process_launcher_delegate.cc
index 22f89283..59e577cc 100644
--- a/content/public/common/sandboxed_process_launcher_delegate.cc
+++ b/content/public/common/sandboxed_process_launcher_delegate.cc
@@ -15,6 +15,15 @@
   return true;
 }
 
+bool SandboxedProcessLauncherDelegate::DisableDefaultPolicy() {
+  return false;
+}
+
+bool SandboxedProcessLauncherDelegate::PreSpawnTarget(
+    sandbox::TargetPolicy* policy) {
+  return true;
+}
+
 #elif(OS_POSIX)
 bool SandboxedProcessLauncherDelegate::ShouldUseZygote() {
   return false;
diff --git a/content/public/common/sandboxed_process_launcher_delegate.h b/content/public/common/sandboxed_process_launcher_delegate.h
index 05acf5a..39e2cc88 100644
--- a/content/public/common/sandboxed_process_launcher_delegate.h
+++ b/content/public/common/sandboxed_process_launcher_delegate.h
@@ -39,16 +39,12 @@
   // (i.e. through base::LaunchProcess directly).
   virtual bool ShouldSandbox();
 
-  // Called before the default sandbox is applied. If the default policy is too
-  // restrictive, the caller should set |disable_default_policy| to true and
-  // apply their policy in PreSpawnTarget. |exposed_dir| is used to allow a
-  //directory through the sandbox.
-  virtual void PreSandbox(bool* disable_default_policy,
-                          base::FilePath* exposed_dir) {}
+  // Whether to disable the default policy specified in
+  // AddPolicyForSandboxedProcess.
+  virtual bool DisableDefaultPolicy();
 
-  // Called right before spawning the process.
-  virtual void PreSpawnTarget(sandbox::TargetPolicy* policy,
-                              bool* success) {}
+  // Called right before spawning the process. Returns false on failure.
+  virtual bool PreSpawnTarget(sandbox::TargetPolicy* policy);
 
   // Called right after the process is launched, but before its thread is run.
   virtual void PostSpawnTarget(base::ProcessHandle process) {}
diff --git a/content/public/test/content_test_suite_base.cc b/content/public/test/content_test_suite_base.cc
index 379ed25..859e60d 100644
--- a/content/public/test/content_test_suite_base.cc
+++ b/content/public/test/content_test_suite_base.cc
@@ -32,7 +32,6 @@
 #include "base/android/jni_android.h"
 #include "content/browser/android/browser_jni_registrar.h"
 #include "content/common/android/common_jni_registrar.h"
-#include "content/public/browser/android/compositor.h"
 #include "media/base/android/media_jni_registrar.h"
 #include "net/android/net_jni_registrar.h"
 #include "ui/android/ui_android_jni_registrar.h"
@@ -40,6 +39,10 @@
 #include "ui/events/android/events_jni_registrar.h"
 #include "ui/gfx/android/gfx_jni_registrar.h"
 #include "ui/gl/android/gl_jni_registrar.h"
+#endif
+
+#if defined(OS_ANDROID) && !defined(USE_AURA)
+#include "content/public/browser/android/compositor.h"
 #include "ui/shell_dialogs/android/shell_dialogs_jni_registrar.h"
 #endif
 
@@ -90,10 +93,11 @@
   ui::RegisterUIAndroidJni(env);
   ui::gl::android::RegisterJni(env);
   ui::events::android::RegisterJni(env);
+#if !defined(USE_AURA)
   ui::shell_dialogs::RegisterJni(env);
-
   content::Compositor::Initialize();
 #endif
+#endif
 
 #if defined(USE_OZONE)
   ui::OzonePlatform::InitializeForUI();
diff --git a/content/renderer/android/synchronous_compositor_filter.cc b/content/renderer/android/synchronous_compositor_filter.cc
index 5c54e99..34cff90 100644
--- a/content/renderer/android/synchronous_compositor_filter.cc
+++ b/content/renderer/android/synchronous_compositor_filter.cc
@@ -8,6 +8,7 @@
 #include "base/stl_util.h"
 #include "base/thread_task_runner_handle.h"
 #include "content/common/android/sync_compositor_messages.h"
+#include "content/common/input_messages.h"
 #include "content/renderer/android/synchronous_compositor_proxy.h"
 
 namespace content {
@@ -53,6 +54,15 @@
   return result;
 }
 
+SynchronousCompositorProxy* SynchronousCompositorFilter::FindProxy(
+    int routing_id) {
+  auto itr = sync_compositor_map_.find(routing_id);
+  if (itr == sync_compositor_map_.end()) {
+    return nullptr;
+  }
+  return itr->second;
+}
+
 bool SynchronousCompositorFilter::GetSupportedMessageClasses(
     std::vector<uint32_t>* supported_message_classes) const {
   supported_message_classes->push_back(SyncCompositorMsgStart);
@@ -63,9 +73,9 @@
     const IPC::Message& message) {
   DCHECK(compositor_task_runner_->BelongsToCurrentThread());
 
-  auto itr = sync_compositor_map_.find(message.routing_id());
-  if (itr != sync_compositor_map_.end()) {
-    itr->second->OnMessageReceived(message);
+  SynchronousCompositorProxy* proxy = FindProxy(message.routing_id());
+  if (proxy) {
+    proxy->OnMessageReceived(message);
     return;
   }
   IPC::Message* reply = IPC::SyncMessage::GenerateReply(&message);
@@ -228,12 +238,17 @@
     int routing_id,
     const DidOverscrollParams& params) {
   DCHECK(compositor_task_runner_->BelongsToCurrentThread());
-  // TODO(boliu): Implement
+  SynchronousCompositorProxy* proxy = FindProxy(routing_id);
+  if (!proxy) {
+    DLOG(WARNING) << "No matching proxy in DidOverScroll " << routing_id;
+    return;
+  }
+  proxy->DidOverscroll(params);
 }
 
 void SynchronousCompositorFilter::DidStopFlinging(int routing_id) {
   DCHECK(compositor_task_runner_->BelongsToCurrentThread());
-  // TODO(boliu): Implement
+  Send(new InputHostMsg_DidStopFlinging(routing_id));
 }
 
 SynchronousCompositorFilter::Entry::Entry()
diff --git a/content/renderer/android/synchronous_compositor_filter.h b/content/renderer/android/synchronous_compositor_filter.h
index 50507b1..bf7ba12 100644
--- a/content/renderer/android/synchronous_compositor_filter.h
+++ b/content/renderer/android/synchronous_compositor_filter.h
@@ -73,6 +73,7 @@
   void CheckIsReady(int routing_id);
   void UnregisterObjects(int routing_id);
   void RemoveEntryIfNeeded(int routing_id);
+  SynchronousCompositorProxy* FindProxy(int routing_id);
 
   const scoped_refptr<base::SingleThreadTaskRunner> compositor_task_runner_;
 
diff --git a/content/renderer/android/synchronous_compositor_proxy.cc b/content/renderer/android/synchronous_compositor_proxy.cc
index 625a751..b8ae7ca2 100644
--- a/content/renderer/android/synchronous_compositor_proxy.cc
+++ b/content/renderer/android/synchronous_compositor_proxy.cc
@@ -207,6 +207,14 @@
   PopulateCommonParams(common_renderer_params);
 }
 
+void SynchronousCompositorProxy::DidOverscroll(
+    const DidOverscrollParams& did_overscroll_params) {
+  SyncCompositorCommonRendererParams params;
+  PopulateCommonParams(&params);
+  Send(new SyncCompositorHostMsg_OverScroll(routing_id_, params,
+                                            did_overscroll_params));
+}
+
 void SynchronousCompositorProxy::ProcessCommonParams(
     const SyncCompositorCommonBrowserParams& common_params) {
   if (bytes_limit_ != common_params.bytes_limit) {
diff --git a/content/renderer/android/synchronous_compositor_proxy.h b/content/renderer/android/synchronous_compositor_proxy.h
index ad09d14..82341b65b 100644
--- a/content/renderer/android/synchronous_compositor_proxy.h
+++ b/content/renderer/android/synchronous_compositor_proxy.h
@@ -65,6 +65,7 @@
 
   void OnMessageReceived(const IPC::Message& message);
   bool Send(IPC::Message* message);
+  void DidOverscroll(const DidOverscrollParams& did_overscroll_params);
 
  private:
   void ProcessCommonParams(
diff --git a/content/renderer/history_serialization.cc b/content/renderer/history_serialization.cc
index 5dd704c..d015cf2 100644
--- a/content/renderer/history_serialization.cc
+++ b/content/renderer/history_serialization.cc
@@ -90,7 +90,7 @@
   if (!item.stateObject().isNull())
     state->state_object = item.stateObject().toString();
   state->scroll_restoration_type = item.scrollRestorationType();
-  state->pinch_viewport_scroll_offset = item.pinchViewportScrollOffset();
+  state->visual_viewport_scroll_offset = item.visualViewportScrollOffset();
   state->scroll_offset = item.scrollOffset();
   state->item_sequence_number = item.itemSequenceNumber();
   state->document_sequence_number =
@@ -142,7 +142,7 @@
   }
   item.setDocumentState(state.document_state);
   item.setScrollRestorationType(state.scroll_restoration_type);
-  item.setPinchViewportScrollOffset(state.pinch_viewport_scroll_offset);
+  item.setVisualViewportScrollOffset(state.visual_viewport_scroll_offset);
   item.setScrollOffset(state.scroll_offset);
   item.setPageScaleFactor(state.page_scale_factor);
 
diff --git a/content/renderer/media/renderer_webmediaplayer_delegate.cc b/content/renderer/media/renderer_webmediaplayer_delegate.cc
new file mode 100644
index 0000000..e573107b
--- /dev/null
+++ b/content/renderer/media/renderer_webmediaplayer_delegate.cc
@@ -0,0 +1,34 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "content/renderer/media/renderer_webmediaplayer_delegate.h"
+
+#include "content/common/frame_messages.h"
+#include "third_party/WebKit/public/platform/WebMediaPlayer.h"
+
+namespace media {
+
+RendererWebMediaPlayerDelegate::RendererWebMediaPlayerDelegate(
+    content::RenderFrame* render_frame)
+    : RenderFrameObserver(render_frame) {}
+
+RendererWebMediaPlayerDelegate::~RendererWebMediaPlayerDelegate() {}
+
+void RendererWebMediaPlayerDelegate::DidPlay(blink::WebMediaPlayer* player) {
+  has_played_media_ = true;
+  Send(new FrameHostMsg_MediaPlayingNotification(
+      routing_id(), reinterpret_cast<int64>(player), player->hasVideo(),
+      player->hasAudio(), player->isRemote()));
+}
+
+void RendererWebMediaPlayerDelegate::DidPause(blink::WebMediaPlayer* player) {
+  Send(new FrameHostMsg_MediaPausedNotification(
+      routing_id(), reinterpret_cast<int64>(player)));
+}
+
+void RendererWebMediaPlayerDelegate::PlayerGone(blink::WebMediaPlayer* player) {
+  DidPause(player);
+}
+
+}  // namespace media
diff --git a/content/renderer/media/renderer_webmediaplayer_delegate.h b/content/renderer/media/renderer_webmediaplayer_delegate.h
new file mode 100644
index 0000000..76a6686
--- /dev/null
+++ b/content/renderer/media/renderer_webmediaplayer_delegate.h
@@ -0,0 +1,45 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CONTENT_RENDERER_MEDIA_RENDERER_WEBMEDIAPLAYER_DELEGATE_H_
+#define CONTENT_RENDERER_MEDIA_RENDERER_WEBMEDIAPLAYER_DELEGATE_H_
+
+#include "base/macros.h"
+#include "base/memory/weak_ptr.h"
+#include "content/public/renderer/render_frame_observer.h"
+#include "media/blink/webmediaplayer_delegate.h"
+
+namespace blink {
+class WebMediaPlayer;
+}
+
+namespace media {
+
+// An interface to allow a WebMediaPlayerImpl to communicate changes of state
+// to objects that need to know.
+class RendererWebMediaPlayerDelegate
+    : public content::RenderFrameObserver,
+      public WebMediaPlayerDelegate,
+      public base::SupportsWeakPtr<RendererWebMediaPlayerDelegate> {
+ public:
+  explicit RendererWebMediaPlayerDelegate(content::RenderFrame* render_frame);
+  ~RendererWebMediaPlayerDelegate() override;
+
+  // Returns true if this RenderFrame has ever seen media playback before.
+  bool has_played_media() const { return has_played_media_; }
+
+  // WebMediaPlayerDelegate implementation.
+  void DidPlay(blink::WebMediaPlayer* player) override;
+  void DidPause(blink::WebMediaPlayer* player) override;
+  void PlayerGone(blink::WebMediaPlayer* player) override;
+
+ private:
+  bool has_played_media_ = false;
+
+  DISALLOW_COPY_AND_ASSIGN(RendererWebMediaPlayerDelegate);
+};
+
+}  // namespace media
+
+#endif  // CONTENT_RENDERER_MEDIA_RENDERER_WEBMEDIAPLAYER_DELEGATE_H_
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc
index 0d2acf7..587efda8 100644
--- a/content/renderer/render_frame_impl.cc
+++ b/content/renderer/render_frame_impl.cc
@@ -87,6 +87,7 @@
 #include "content/renderer/media/media_stream_renderer_factory_impl.h"
 #include "content/renderer/media/midi_dispatcher.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/webmediaplayer_ms.h"
 #include "content/renderer/memory_benchmarking_extension.h"
@@ -749,7 +750,6 @@
 #if defined(VIDEO_HOLE)
       contains_media_player_(false),
 #endif
-      has_played_media_(false),
       devtools_agent_(nullptr),
       wakelock_dispatcher_(nullptr),
       geolocation_dispatcher_(NULL),
@@ -759,6 +759,7 @@
       manifest_manager_(NULL),
       accessibility_mode_(AccessibilityModeOff),
       renderer_accessibility_(NULL),
+      media_player_delegate_(NULL),
       is_using_lofi_(false),
       weak_factory_(this) {
   std::pair<RoutingIDFrameMap::iterator, bool> result =
@@ -2165,7 +2166,8 @@
   media::WebMediaPlayerParams params(
       base::Bind(&ContentRendererClient::DeferMediaLoad,
                  base::Unretained(GetContentClient()->renderer()),
-                 static_cast<RenderFrame*>(this), has_played_media_),
+                 static_cast<RenderFrame*>(this),
+                 GetWebMediaPlayerDelegate()->has_played_media()),
       audio_renderer_sink, media_log, render_thread->GetMediaThreadTaskRunner(),
       render_thread->GetWorkerTaskRunner(),
       render_thread->compositor_task_runner(), context_3d_cb,
@@ -2201,7 +2203,7 @@
         // !defined(ENABLE_MEDIA_PIPELINE_ON_ANDROID)
 
   return new media::WebMediaPlayerImpl(
-      frame, client, encrypted_client, weak_factory_.GetWeakPtr(),
+      frame, client, encrypted_client, GetWebMediaPlayerDelegate()->AsWeakPtr(),
       media_renderer_factory.Pass(), GetCdmFactory(), params);
 #endif  // defined(OS_ANDROID) && !defined(ENABLE_MEDIA_PIPELINE_ON_ANDROID)
 }
@@ -3996,22 +3998,6 @@
 }
 #endif
 
-void RenderFrameImpl::DidPlay(WebMediaPlayer* player) {
-  has_played_media_ = true;
-  Send(new FrameHostMsg_MediaPlayingNotification(
-      routing_id_, reinterpret_cast<int64>(player), player->hasVideo(),
-      player->hasAudio(), player->isRemote()));
-}
-
-void RenderFrameImpl::DidPause(WebMediaPlayer* player) {
-  Send(new FrameHostMsg_MediaPausedNotification(
-      routing_id_, reinterpret_cast<int64>(player)));
-}
-
-void RenderFrameImpl::PlayerGone(WebMediaPlayer* player) {
-  DidPause(player);
-}
-
 void RenderFrameImpl::didSerializeDataForFrame(
     const WebCString& data,
     WebPageSerializerClient::PageSerializationStatus status) {
@@ -4936,8 +4922,8 @@
     compositor_task_runner = base::MessageLoop::current()->task_runner();
 
   return new WebMediaPlayerMS(
-      frame_, client, weak_factory_.GetWeakPtr(), new RenderMediaLog(),
-      CreateRendererFactory(), compositor_task_runner,
+      frame_, client, GetWebMediaPlayerDelegate()->AsWeakPtr(),
+      new RenderMediaLog(), CreateRendererFactory(), compositor_task_runner,
       render_thread->GetMediaThreadTaskRunner(),
       render_thread->GetWorkerTaskRunner(), render_thread->GetGpuFactories(),
       sink_id, security_origin);
@@ -5250,9 +5236,10 @@
         context_provider, gpu_channel_host, routing_id_);
   }
 
-  return new WebMediaPlayerAndroid(
-      frame_, client, encrypted_client, weak_factory_.GetWeakPtr(),
-      GetMediaPlayerManager(), GetCdmFactory(), stream_texture_factory, params);
+  return new WebMediaPlayerAndroid(frame_, client, encrypted_client,
+                                   GetWebMediaPlayerDelegate()->AsWeakPtr(),
+                                   GetMediaPlayerManager(), GetCdmFactory(),
+                                   stream_texture_factory, params);
 }
 
 RendererMediaPlayerManager* RenderFrameImpl::GetMediaPlayerManager() {
@@ -5355,4 +5342,11 @@
   return service_provider.Pass();
 }
 
+media::RendererWebMediaPlayerDelegate*
+RenderFrameImpl::GetWebMediaPlayerDelegate() {
+  if (!media_player_delegate_)
+    media_player_delegate_ = new media::RendererWebMediaPlayerDelegate(this);
+  return media_player_delegate_;
+}
+
 }  // namespace content
diff --git a/content/renderer/render_frame_impl.h b/content/renderer/render_frame_impl.h
index e29cc90..a6bd1de 100644
--- a/content/renderer/render_frame_impl.h
+++ b/content/renderer/render_frame_impl.h
@@ -82,6 +82,7 @@
 namespace media {
 class CdmFactory;
 class MediaPermission;
+class RendererWebMediaPlayerDelegate;
 class WebEncryptedMediaClientImpl;
 }
 
@@ -137,7 +138,6 @@
 class CONTENT_EXPORT RenderFrameImpl
     : public RenderFrame,
       NON_EXPORTED_BASE(public blink::WebFrameClient),
-      NON_EXPORTED_BASE(public media::WebMediaPlayerDelegate),
       NON_EXPORTED_BASE(public blink::WebPageSerializerClient) {
  public:
   // Creates a new RenderFrame as the main frame of |render_view|.
@@ -589,11 +589,6 @@
   blink::WebVRClient* webVRClient() override;
 #endif
 
-  // WebMediaPlayerDelegate implementation:
-  void DidPlay(blink::WebMediaPlayer* player) override;
-  void DidPause(blink::WebMediaPlayer* player) override;
-  void PlayerGone(blink::WebMediaPlayer* player) override;
-
   // WebPageSerializerClient implementation:
   void didSerializeDataForFrame(
       const blink::WebCString& data,
@@ -902,6 +897,10 @@
   // ServiceProvider.
   mojo::ServiceProviderPtr ConnectToApplication(const GURL& url);
 
+  // Returns the media delegate for WebMediaPlayer usage.  If
+  // |media_player_delegate_| is NULL, one is created.
+  media::RendererWebMediaPlayerDelegate* GetWebMediaPlayerDelegate();
+
   // Stores the WebLocalFrame we are associated with.  This is null from the
   // constructor until SetWebFrame is called, and it is null after
   // frameDetached is called until destruction (which is asynchronous in the
@@ -1036,9 +1035,6 @@
   bool contains_media_player_;
 #endif
 
-  // True if this RenderFrame has ever played media.
-  bool has_played_media_;
-
   // The devtools agent for this frame; only created for main frame and
   // local roots.
   DevToolsAgent* devtools_agent_;
@@ -1083,6 +1079,10 @@
 
   scoped_ptr<blink::WebUSBClient> usb_client_;
 
+  // Manages play, pause notifications for WebMediaPlayer implementations; its
+  // lifetime is tied to the RenderFrame via the RenderFrameObserver interface.
+  media::RendererWebMediaPlayerDelegate* media_player_delegate_;
+
   // Whether or not this RenderFrame is using Lo-Fi mode.
   bool is_using_lofi_;
 
diff --git a/content/shell/browser/shell_content_browser_client.cc b/content/shell/browser/shell_content_browser_client.cc
index c18e4ff..394738e 100644
--- a/content/shell/browser/shell_content_browser_client.cc
+++ b/content/shell/browser/shell_content_browser_client.cc
@@ -386,8 +386,8 @@
 #endif  // defined(OS_ANDROID)
 
 #if defined(OS_WIN)
-void ShellContentBrowserClient::PreSpawnRenderer(sandbox::TargetPolicy* policy,
-                                                 bool* success) {
+bool ShellContentBrowserClient::PreSpawnRenderer(
+    sandbox::TargetPolicy* policy) {
   // Add sideloaded font files for testing. See also DIR_WINDOWS_FONTS
   // addition in |StartSandboxedProcess|.
   std::vector<std::string> font_files = switches::GetSideloadFontFiles();
@@ -398,6 +398,7 @@
         sandbox::TargetPolicy::FILES_ALLOW_READONLY,
         base::UTF8ToWide(*i).c_str());
   }
+  return true;
 }
 #endif  // OS_WIN
 
diff --git a/content/shell/browser/shell_content_browser_client.h b/content/shell/browser/shell_content_browser_client.h
index 6eb56b9..5841d90 100644
--- a/content/shell/browser/shell_content_browser_client.h
+++ b/content/shell/browser/shell_content_browser_client.h
@@ -87,7 +87,7 @@
       content::FileDescriptorInfo* mappings) override;
 #endif  // defined(OS_ANDROID)
 #if defined(OS_WIN)
-  void PreSpawnRenderer(sandbox::TargetPolicy* policy, bool* success) override;
+  bool PreSpawnRenderer(sandbox::TargetPolicy* policy) override;
 #endif
 
   ShellBrowserContext* browser_context();
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn
index 83d36b3a..363acdf 100644
--- a/content/test/BUILD.gn
+++ b/content/test/BUILD.gn
@@ -133,7 +133,15 @@
     }
 
     if (use_aura || is_mac) {
-      deps += [ "//ui/compositor" ]
+      deps += [
+        "//ui/compositor",
+        "//third_party/libvpx_new",
+      ]
+
+      sources += [
+        "../browser/compositor/test/no_transport_image_transport_factory.cc",
+        "../browser/compositor/test/no_transport_image_transport_factory.h",
+      ]
     }
 
     if (use_ozone) {
@@ -147,17 +155,6 @@
       ]
     }
 
-    if (!is_android && !is_ios) {
-      sources += [
-        "../browser/compositor/test/no_transport_image_transport_factory.cc",
-        "../browser/compositor/test/no_transport_image_transport_factory.h",
-      ]
-      deps += [
-        "//ui/compositor",
-        "//third_party/libvpx_new",
-      ]
-    }
-
     if (is_android) {
       deps += [
         "//content/shell/android:copy_content_shell_assets",
@@ -719,6 +716,11 @@
       "../browser/web_contents/web_contents_view_aura_unittest.cc",
     ]
   }
+
+  # Avoid windows due to non-availability of cursor resources in test.
+  if (!use_aura || is_win) {
+    sources -= [ "../browser/media/capture/cursor_renderer_aura_unittest.cc" ]
+  }
   if (use_aura || toolkit_views) {
     deps += [ "//ui/events:test_support" ]
   }
diff --git a/content/test/data/accessibility/html/area-expected-mac.txt b/content/test/data/accessibility/html/area-expected-mac.txt
index 50bf6b1..ce5d07a7 100644
--- a/content/test/data/accessibility/html/area-expected-mac.txt
+++ b/content/test/data/accessibility/html/area-expected-mac.txt
@@ -2,5 +2,4 @@
 ++AXGroup AXRoleDescription='group'
 ++++AXGroup AXRoleDescription='group' AXDescription='pipe'
 ++++++AXLink AXRoleDescription='link' AXDescription='pipe1'
-++++AXLink AXRoleDescription='link'
-++++AXUnknown AXRoleDescription='unknown'
+++++++AXLink AXRoleDescription='link' AXDescription='pipe2'
diff --git a/content/test/data/accessibility/html/area-expected-win.txt b/content/test/data/accessibility/html/area-expected-win.txt
index 0d8df9a..b0a2682 100644
--- a/content/test/data/accessibility/html/area-expected-win.txt
+++ b/content/test/data/accessibility/html/area-expected-win.txt
@@ -1,6 +1,5 @@
 ROLE_SYSTEM_DOCUMENT READONLY FOCUSABLE
 ++IA2_ROLE_SECTION
 ++++IA2_ROLE_IMAGE_MAP name='pipe' READONLY
-++++++ROLE_SYSTEM_LINK name='pipe1' LINKED
-++++ROLE_SYSTEM_LINK FOCUSABLE LINKED
-++++ROLE_SYSTEM_CLIENT
+++++++ROLE_SYSTEM_LINK name='pipe1' FOCUSABLE LINKED
+++++++ROLE_SYSTEM_LINK name='pipe2' LINKED
diff --git a/content/test/test_render_view_host.cc b/content/test/test_render_view_host.cc
index 71142de..8536768 100644
--- a/content/test/test_render_view_host.cc
+++ b/content/test/test_render_view_host.cc
@@ -137,8 +137,8 @@
 void TestRenderWidgetHostView::CopyFromCompositingSurfaceToVideoFrame(
     const gfx::Rect& src_subrect,
     const scoped_refptr<media::VideoFrame>& target,
-    const base::Callback<void(bool)>& callback) {
-  callback.Run(false);
+    const base::Callback<void(const gfx::Rect&, bool)>& callback) {
+  callback.Run(gfx::Rect(), false);
 }
 
 bool TestRenderWidgetHostView::CanCopyToVideoFrame() const {
@@ -268,10 +268,6 @@
   return true;
 }
 
-bool TestRenderViewHost::IsFullscreenGranted() const {
-  return RenderViewHostImpl::IsFullscreenGranted();
-}
-
 MockRenderProcessHost* TestRenderViewHost::GetProcess() const {
   return static_cast<MockRenderProcessHost*>(RenderViewHostImpl::GetProcess());
 }
diff --git a/content/test/test_render_view_host.h b/content/test/test_render_view_host.h
index 2ba38c7..3c0e132 100644
--- a/content/test/test_render_view_host.h
+++ b/content/test/test_render_view_host.h
@@ -121,7 +121,7 @@
   void CopyFromCompositingSurfaceToVideoFrame(
       const gfx::Rect& src_subrect,
       const scoped_refptr<media::VideoFrame>& target,
-      const base::Callback<void(bool)>& callback) override;
+      const base::Callback<void(const gfx::Rect&, bool)>& callback) override;
   bool CanCopyToVideoFrame() const override;
   bool HasAcceleratedSurface(const gfx::Size& desired_size) override;
 #if defined(OS_MACOSX)
@@ -244,7 +244,6 @@
                         int32 max_page_id,
                         const FrameReplicationState& replicated_frame_state,
                         bool window_was_created_with_opener) override;
-  bool IsFullscreenGranted() const override;
 
  private:
   FRIEND_TEST_ALL_PREFIXES(RenderViewHostTest, FilterNavigate);
diff --git a/device/hid/BUILD.gn b/device/hid/BUILD.gn
index f57fe86c..9288f70e 100644
--- a/device/hid/BUILD.gn
+++ b/device/hid/BUILD.gn
@@ -6,10 +6,6 @@
 
 source_set("hid") {
   sources = [
-    "device_monitor_linux.cc",
-    "device_monitor_linux.h",
-    "fake_input_service_linux.cc",
-    "fake_input_service_linux.h",
     "hid_collection_info.cc",
     "hid_collection_info.h",
     "hid_connection.cc",
@@ -32,16 +28,12 @@
     "hid_report_descriptor_item.h",
     "hid_service.cc",
     "hid_service.h",
-    "hid_service_linux.cc",
-    "hid_service_linux.h",
     "hid_service_mac.cc",
     "hid_service_mac.h",
     "hid_service_win.cc",
     "hid_service_win.h",
     "hid_usage_and_page.cc",
     "hid_usage_and_page.h",
-    "input_service_linux.cc",
-    "input_service_linux.h",
   ]
 
   deps = [
@@ -51,9 +43,20 @@
     "//net",
   ]
 
-  if (use_udev) {
+  if (is_linux && use_udev) {
+    sources += [
+      "device_monitor_linux.cc",
+      "device_monitor_linux.h",
+      "fake_input_service_linux.cc",
+      "fake_input_service_linux.h",
+      "hid_service_linux.cc",
+      "hid_service_linux.h",
+      "input_service_linux.cc",
+      "input_service_linux.h",
+    ]
     deps += [ "//device/udev_linux" ]
   }
+
   if (is_chromeos) {
     deps += [ "//chromeos" ]
   }
diff --git a/device/hid/hid.gyp b/device/hid/hid.gyp
index 00b9a90..f7a0bafb 100644
--- a/device/hid/hid.gyp
+++ b/device/hid/hid.gyp
@@ -19,10 +19,6 @@
         '../core/core.gyp:device_core',
       ],
       'sources': [
-        'device_monitor_linux.cc',
-        'device_monitor_linux.h',
-        'fake_input_service_linux.cc',
-        'fake_input_service_linux.h',
         'hid_collection_info.cc',
         'hid_collection_info.h',
         'hid_connection.cc',
@@ -45,31 +41,25 @@
         'hid_report_descriptor_item.h',
         'hid_service.cc',
         'hid_service.h',
-        'hid_service_linux.cc',
-        'hid_service_linux.h',
         'hid_service_mac.cc',
         'hid_service_mac.h',
         'hid_service_win.cc',
         'hid_service_win.h',
         'hid_usage_and_page.cc',
         'hid_usage_and_page.h',
-        'input_service_linux.cc',
-        'input_service_linux.h',
       ],
       'conditions': [
-        ['use_udev==1', {
+        ['OS=="linux" and use_udev==1', {
           'dependencies': [
             '../udev_linux/udev.gyp:udev_linux',
           ],
-        }, {  # use_udev==0
-          # The Linux implementation is based on Udev.
-          'sources!': [
+          'sources': [
             'device_monitor_linux.cc',
             'device_monitor_linux.h',
-            'hid_service_linux.cc',
-            'hid_service_linux.h',
             'fake_input_service_linux.cc',
             'fake_input_service_linux.h',
+            'hid_service_linux.cc',
+            'hid_service_linux.h',
             'input_service_linux.cc',
             'input_service_linux.h',
           ],
diff --git a/extensions/common/api/_permission_features.json b/extensions/common/api/_permission_features.json
index 44a2ae04..c395360 100644
--- a/extensions/common/api/_permission_features.json
+++ b/extensions/common/api/_permission_features.json
@@ -138,7 +138,7 @@
   "bluetoothPrivate": {
     "channel": "stable",
     "extension_types": ["platform_app"],
-    "platforms": ["chromeos", "win", "mac"],
+    "platforms": ["chromeos", "win", "mac", "linux"],
     "whitelist": [
       "1C93BD3CF875F4A73C0B2A163BB8FBDA8B8B3D80",  // http://crbug.com/387169
       "A3BC37E2148AC4E99BE4B16AF9D42DD1E592BBBE",  // http://crbug.com/387169
diff --git a/gpu/command_buffer/service/in_process_command_buffer.cc b/gpu/command_buffer/service/in_process_command_buffer.cc
index 5e1921a..3f22542 100644
--- a/gpu/command_buffer/service/in_process_command_buffer.cc
+++ b/gpu/command_buffer/service/in_process_command_buffer.cc
@@ -15,6 +15,7 @@
 #include "base/location.h"
 #include "base/logging.h"
 #include "base/memory/weak_ptr.h"
+#include "base/numerics/safe_conversions.h"
 #include "base/sequence_checker.h"
 #include "base/single_thread_task_runner.h"
 #include "base/thread_task_runner_handle.h"
@@ -114,6 +115,7 @@
       handle.type = gfx::SHARED_MEMORY_BUFFER;
       handle.handle = ShareToGpuThread(source_handle.handle);
       handle.offset = source_handle.offset;
+      handle.stride = source_handle.stride;
       *requires_sync_point = false;
       return handle;
     }
@@ -735,9 +737,14 @@
 
   switch (handle.type) {
     case gfx::SHARED_MEMORY_BUFFER: {
+      if (!base::IsValueInRangeForNumericType<size_t>(handle.stride)) {
+        LOG(ERROR) << "Invalid stride for image.";
+        return;
+      }
       scoped_refptr<gl::GLImageSharedMemory> image(
           new gl::GLImageSharedMemory(size, internalformat));
-      if (!image->Initialize(handle.handle, handle.id, format, handle.offset)) {
+      if (!image->Initialize(handle.handle, handle.id, format, handle.offset,
+                             handle.stride)) {
         LOG(ERROR) << "Failed to initialize image.";
         return;
       }
diff --git a/ios/chrome/browser/crash_report/breakpad_helper.h b/ios/chrome/browser/crash_report/breakpad_helper.h
index 0167b5c..71c27af 100644
--- a/ios/chrome/browser/crash_report/breakpad_helper.h
+++ b/ios/chrome/browser/crash_report/breakpad_helper.h
@@ -87,6 +87,11 @@
 // enum (values decimal from 0 to 7).
 void SetCurrentOrientation(int statusBarOrientation, int deviceOrientation);
 
+// Sets a key in browser_state dictionary to store the device horizontal size
+// class. The values are from the UIKit UIUserInterfaceSizeClass enum (decimal
+// values from 0 to 2).
+void SetCurrentHorizontalSizeClass(int horizontalSizeClass);
+
 // Sets a key in browser to store the playback state of media player (audio or
 // video). This function records a new start. This function is called for each
 // stream in the media (once or twice for audio, two or three times for video).
diff --git a/ios/chrome/browser/crash_report/breakpad_helper.mm b/ios/chrome/browser/crash_report/breakpad_helper.mm
index 526ab12..b3a60f3d9 100644
--- a/ios/chrome/browser/crash_report/breakpad_helper.mm
+++ b/ios/chrome/browser/crash_report/breakpad_helper.mm
@@ -47,6 +47,7 @@
 // These are the values grouped in the user_application_state parameter.
 NSString* const kDataProxyIsEnabled = @"dataproxy";
 NSString* const kOrientationState = @"orient";
+NSString* const kHorizontalSizeClass = @"sizeclass";
 NSString* const kSignedIn = @"signIn";
 NSString* const kIsShowingPDF = @"pdf";
 NSString* const kVideoPlaying = @"avplay";
@@ -272,6 +273,12 @@
       withValue:deviceAndUIOrientation];
 }
 
+void SetCurrentHorizontalSizeClass(int horizontalSizeClass) {
+  [[CrashReportUserApplicationState sharedInstance]
+       setValue:kHorizontalSizeClass
+      withValue:horizontalSizeClass];
+}
+
 void SetCurrentlySignedIn(bool signedIn) {
   if (signedIn) {
     [[CrashReportUserApplicationState sharedInstance] setValue:kSignedIn
diff --git a/ios/chrome/browser/ui/autofill/autofill_client_ios.h b/ios/chrome/browser/ui/autofill/autofill_client_ios.h
index 856bc24..34d51a11 100644
--- a/ios/chrome/browser/ui/autofill/autofill_client_ios.h
+++ b/ios/chrome/browser/ui/autofill/autofill_client_ios.h
@@ -53,8 +53,13 @@
   void ShowAutofillSettings() override;
   void ShowUnmaskPrompt(const CreditCard& card,
                         base::WeakPtr<CardUnmaskDelegate> delegate) override;
-  void OnUnmaskVerificationResult(GetRealPanResult result) override;
-  void ConfirmSaveCreditCard(const base::Closure& save_card_callback) override;
+  void OnUnmaskVerificationResult(PaymentsRpcResult result) override;
+  void ConfirmSaveCreditCardLocally(const base::Closure& callback) override;
+  void ConfirmSaveCreditCardToCloud(
+      const base::Closure& callback,
+      scoped_ptr<base::DictionaryValue> legal_message) override;
+  void LoadRiskData(
+      const base::Callback<void(const std::string&)>& callback) override;
   bool HasCreditCardScanFeature() override;
   void ScanCreditCard(const CreditCardScanCallback& callback) override;
   void ShowRequestAutocompleteDialog(
diff --git a/ios/chrome/browser/ui/autofill/autofill_client_ios.mm b/ios/chrome/browser/ui/autofill/autofill_client_ios.mm
index 7f8afc5..1aefa98 100644
--- a/ios/chrome/browser/ui/autofill/autofill_client_ios.mm
+++ b/ios/chrome/browser/ui/autofill/autofill_client_ios.mm
@@ -21,11 +21,6 @@
 
 namespace autofill {
 
-void GetRiskDataWithCallback(
-    const base::Callback<void(const std::string&)>& callback) {
-  callback.Run(ios::GetChromeBrowserProvider()->GetRiskData());
-}
-
 AutofillClientIOS::AutofillClientIOS(
     ios::ChromeBrowserState* browser_state,
     infobars::InfoBarManager* infobar_manager,
@@ -37,10 +32,8 @@
       bridge_(bridge),
       password_generation_manager_(password_generation_manager),
       identity_provider_(identity_provider.Pass()),
-      unmask_controller_(base::Bind(&GetRiskDataWithCallback),
-                         browser_state->GetPrefs(),
-                         browser_state->IsOffTheRecord()) {
-}
+      unmask_controller_(browser_state->GetPrefs(),
+                         browser_state->IsOffTheRecord()) {}
 
 AutofillClientIOS::~AutofillClientIOS() {
   HideAutofillPopup();
@@ -79,18 +72,29 @@
       delegate);
 }
 
-void AutofillClientIOS::OnUnmaskVerificationResult(GetRealPanResult result) {
+void AutofillClientIOS::OnUnmaskVerificationResult(PaymentsRpcResult result) {
   unmask_controller_.OnVerificationResult(result);
 }
 
-void AutofillClientIOS::ConfirmSaveCreditCard(
-    const base::Closure& save_card_callback) {
+void AutofillClientIOS::ConfirmSaveCreditCardLocally(
+    const base::Closure& callback) {
   // This method is invoked synchronously from
   // AutofillManager::OnFormSubmitted(); at the time of detecting that a form
   // was submitted, the WebContents is guaranteed to be live. Since the
   // InfoBarService is a WebContentsUserData, it must also be alive at this
   // time.
-  AutofillCCInfoBarDelegate::Create(infobar_manager_, this, save_card_callback);
+  AutofillCCInfoBarDelegate::Create(infobar_manager_, this, callback);
+}
+
+void AutofillClientIOS::ConfirmSaveCreditCardToCloud(
+    const base::Closure& callback,
+    scoped_ptr<base::DictionaryValue> legal_message) {
+  NOTIMPLEMENTED();
+}
+
+void AutofillClientIOS::LoadRiskData(
+    const base::Callback<void(const std::string&)>& callback) {
+  callback.Run(ios::GetChromeBrowserProvider()->GetRiskData());
 }
 
 bool AutofillClientIOS::HasCreditCardScanFeature() {
diff --git a/ios/web/web_state/ui/web_view_js_utils.mm b/ios/web/web_state/ui/web_view_js_utils.mm
index 8f7b202..bd5b943 100644
--- a/ios/web/web_state/ui/web_view_js_utils.mm
+++ b/ios/web/web_state/ui/web_view_js_utils.mm
@@ -56,22 +56,16 @@
                         NSString* script,
                         JavaScriptCompletion completion_handler) {
   DCHECK([script length]);
-  // __block qualifier ensures that web_view_completion_handler is correctly
-  // captured by itself.
-  __block void (^web_view_completion_handler)(id, NSError*) = nil;
-  // Do not create a web_view_completion_handler if no |handler| is passed to
-  // this function. This results in no creation of an unnecessary block.
+  void (^web_view_completion_handler)(id, NSError*) = nil;
+  // Do not create a web_view_completion_handler if no |completion_handler| is
+  // passed to this function. WKWebView guarantees to call all completion
+  // handlers before deallocation. Passing nil as completion handler (when
+  // appropriate) may speed up web view deallocation, because there will be no
+  // need to call those completion handlers.
   if (completion_handler) {
-    // WKWebView crashes on deallocation when it flushes scripts that did not
-    // finish the execution but have |completion_handler|. Passing
-    // |completion_handler| ownership to the block itself and keeping it alive
-    // until it's executed fixes the crash. No memory leak is expected since
-    // |completion_handler| is always executed even if WKWebView is deallocated.
-    // https://bugs.webkit.org/show_bug.cgi?id=140203
-    web_view_completion_handler = [^(id result, NSError* error) {
+    web_view_completion_handler = ^(id result, NSError* error) {
       completion_handler(UIResultFromWKResult(result), error);
-      [web_view_completion_handler autorelease];
-    } copy];
+    };
   }
   [web_view evaluateJavaScript:script
              completionHandler:web_view_completion_handler];
diff --git a/mandoline/tools/data/FILES.cfg b/mandoline/tools/data/FILES.cfg
index 43b7fcc4..5bba0c0 100644
--- a/mandoline/tools/data/FILES.cfg
+++ b/mandoline/tools/data/FILES.cfg
@@ -55,4 +55,9 @@
     'platforms': ['linux', 'win'],
     'directory': True,
   },
+  {
+    'filepath': 'pdf_viewer',
+    'platforms': ['linux', 'win'],
+    'directory': True,
+  },
 ]
diff --git a/media/base/android/java/src/org/chromium/media/MediaPlayerBridge.java b/media/base/android/java/src/org/chromium/media/MediaPlayerBridge.java
index df2a627..e662db3 100644
--- a/media/base/android/java/src/org/chromium/media/MediaPlayerBridge.java
+++ b/media/base/android/java/src/org/chromium/media/MediaPlayerBridge.java
@@ -80,7 +80,11 @@
     protected boolean prepareAsync() {
         try {
             getLocalPlayer().prepareAsync();
-        } catch (IllegalStateException e) {
+        } catch (IllegalStateException ise) {
+            Log.e(TAG, "Unable to prepare MediaPlayer.", ise);
+            return false;
+        } catch (Exception e) {
+            // Catch IOException thrown by android MediaPlayer native code.
             Log.e(TAG, "Unable to prepare MediaPlayer.", e);
             return false;
         }
diff --git a/media/base/audio_splicer.cc b/media/base/audio_splicer.cc
index 3fd6dac..0eb9b14 100644
--- a/media/base/audio_splicer.cc
+++ b/media/base/audio_splicer.cc
@@ -349,7 +349,9 @@
   // may not actually have a splice.  Here we check if any frames exist before
   // the splice.  In this case, just transfer all data to the output sanitizer.
   const int frames_before_splice =
-      output_ts_helper.GetFramesToTarget(splice_timestamp_);
+      output_ts_helper.base_timestamp() == kNoTimestamp()
+          ? 0
+          : output_ts_helper.GetFramesToTarget(splice_timestamp_);
   if (frames_before_splice < 0 ||
       pre_splice_sanitizer_->GetFrameCount() <= frames_before_splice) {
     CHECK(pre_splice_sanitizer_->DrainInto(output_sanitizer_.get()));
diff --git a/media/base/video_frame_pool.cc b/media/base/video_frame_pool.cc
index 52af8ece..52e17a9 100644
--- a/media/base/video_frame_pool.cc
+++ b/media/base/video_frame_pool.cc
@@ -73,6 +73,7 @@
           pool_frame->natural_size() == natural_size) {
         frame = pool_frame;
         frame->set_timestamp(timestamp);
+        frame->metadata()->Clear();
         break;
       }
   }
diff --git a/media/blink/BUILD.gn b/media/blink/BUILD.gn
index f53b422..66a11143 100644
--- a/media/blink/BUILD.gn
+++ b/media/blink/BUILD.gn
@@ -113,10 +113,12 @@
     "buffered_resource_loader_unittest.cc",
     "cache_util_unittest.cc",
     "key_system_config_selector_unittest.cc",
+    "lru_unittest.cc",
     "mock_webframeclient.h",
     "mock_weburlloader.cc",
     "mock_weburlloader.h",
     "run_all_unittests.cc",
+    "test_random.h",
     "test_response_generator.cc",
     "test_response_generator.h",
     "video_frame_compositor_unittest.cc",
diff --git a/media/blink/lru.h b/media/blink/lru.h
new file mode 100644
index 0000000..1dc1f6d
--- /dev/null
+++ b/media/blink/lru.h
@@ -0,0 +1,93 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef MEDIA_BLINK_LRU_H_
+#define MEDIA_BLINK_LRU_H_
+
+#include <list>
+
+#include "base/containers/hash_tables.h"
+#include "base/macros.h"
+
+namespace media {
+
+// Simple LRU (least recently used) class.
+// Keeps track of a set of data and lets you get the least recently used
+// (oldest) element at any time. All operations are O(1). Elements are expected
+// to be hashable and unique.
+// Example:
+//  LRU<int> lru;
+//  lru.Insert(1);
+//  lru.Insert(2);
+//  lru.Insert(3);
+//  lru.Use(1);
+//  cout << lru.Pop();  // this will print "2"
+template <typename T>
+class LRU {
+ public:
+  LRU() {}
+
+  // Adds |x| to LRU.
+  // |x| must not already be in the LRU.
+  // Faster than Use(), and will DCHECK that |x| is not in the LRU.
+  void Insert(const T& x) {
+    DCHECK(!Contains(x));
+    lru_.push_front(x);
+    pos_[x] = lru_.begin();
+  }
+
+  // Removes |x| from LRU.
+  // |x| must be in the LRU.
+  void Remove(const T& x) {
+    DCHECK(Contains(x));
+    lru_.erase(pos_[x]);
+    pos_.erase(x);
+  }
+
+  // Moves |x| to front of LRU. (most recently used)
+  // If |x| is not in LRU, it is added.
+  // Please call Insert() if you know that |x| is not in the LRU.
+  void Use(const T& x) {
+    if (Contains(x))
+      Remove(x);
+    Insert(x);
+  }
+
+  bool Empty() const { return lru_.empty(); }
+
+  // Returns the Least Recently Used T and removes it.
+  T Pop() {
+    DCHECK(!Empty());
+    T ret = lru_.back();
+    lru_.pop_back();
+    pos_.erase(ret);
+    return ret;
+  }
+
+  // Returns the Least Recently Used T _without_ removing it.
+  T Peek() const {
+    DCHECK(!Empty());
+    return lru_.back();
+  }
+
+  bool Contains(const T& x) const { return pos_.find(x) != pos_.end(); }
+
+  size_t Size() const { return pos_.size(); }
+
+ private:
+  friend class LRUTest;
+
+  // Linear list of elements, most recently used first.
+  std::list<T> lru_;
+
+  // Maps element values to positions in the list so that we
+  // can quickly remove elements.
+  base::hash_map<T, typename std::list<T>::iterator> pos_;
+
+  DISALLOW_COPY_AND_ASSIGN(LRU);
+};
+
+}  // namespace media
+
+#endif  // MEDIA_BLINK_LRU_H
diff --git a/media/blink/lru_unittest.cc b/media/blink/lru_unittest.cc
new file mode 100644
index 0000000..e23ca07
--- /dev/null
+++ b/media/blink/lru_unittest.cc
@@ -0,0 +1,235 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <list>
+
+#include "base/logging.h"
+#include "media/blink/lru.h"
+#include "media/blink/test_random.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+// Range of integer used in tests below.
+// We keep the integers small to get lots of re-use of integers.
+const int kTestIntRange = 16;
+
+namespace media {
+
+class LRUTest;
+
+class SimpleLRU {
+ public:
+  void Insert(int x) {
+    DCHECK(!Contains(x));
+    data_.push_back(x);
+  }
+
+  void Remove(int x) {
+    for (std::list<int>::iterator i = data_.begin(); i != data_.end(); ++i) {
+      if (*i == x) {
+        data_.erase(i);
+        DCHECK(!Contains(x));
+        return;
+      }
+    }
+    LOG(FATAL) << "Remove non-existing element " << x;
+  }
+
+  void Use(int x) {
+    if (Contains(x))
+      Remove(x);
+    Insert(x);
+  }
+
+  bool Empty() const { return data_.empty(); }
+
+  int Pop() {
+    DCHECK(!Empty());
+    int ret = data_.front();
+    data_.pop_front();
+    return ret;
+  }
+
+  int Peek() {
+    DCHECK(!Empty());
+    return data_.front();
+  }
+
+  bool Contains(int x) const {
+    for (std::list<int>::const_iterator i = data_.begin(); i != data_.end();
+         ++i) {
+      if (*i == x) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  size_t Size() const { return data_.size(); }
+
+ private:
+  friend class LRUTest;
+  std::list<int> data_;
+};
+
+class LRUTest : public testing::Test {
+ public:
+  LRUTest() : rnd_(42) {}
+
+  void Insert(int x) {
+    truth_.Insert(x);
+    testee_.Insert(x);
+    Compare();
+  }
+
+  void Remove(int x) {
+    truth_.Remove(x);
+    testee_.Remove(x);
+    Compare();
+  }
+
+  void Use(int x) {
+    truth_.Use(x);
+    testee_.Use(x);
+    Compare();
+  }
+
+  int Pop() {
+    int truth_value = truth_.Pop();
+    int testee_value = testee_.Pop();
+    EXPECT_EQ(truth_value, testee_value);
+    Compare();
+    return truth_value;
+  }
+
+  void Compare() {
+    EXPECT_EQ(truth_.Size(), testee_.Size());
+    auto testee_iterator = testee_.lru_.rbegin();
+    for (const auto truth : truth_.data_) {
+      EXPECT_TRUE(testee_iterator != testee_.lru_.rend());
+      EXPECT_EQ(truth, *testee_iterator);
+      ++testee_iterator;
+    }
+    EXPECT_TRUE(testee_iterator == testee_.lru_.rend());
+  }
+
+  bool Empty() const {
+    EXPECT_EQ(truth_.Empty(), testee_.Empty());
+    return truth_.Empty();
+  }
+
+  bool Contains(int i) const {
+    EXPECT_EQ(truth_.Contains(i), testee_.Contains(i));
+    return testee_.Contains(i);
+  }
+
+  void Clear() {
+    while (!Empty())
+      Pop();
+  }
+
+  int Peek() {
+    EXPECT_EQ(truth_.Peek(), testee_.Peek());
+    return testee_.Peek();
+  }
+
+ protected:
+  media::TestRandom rnd_;
+  SimpleLRU truth_;
+  media::LRU<int> testee_;
+};
+
+TEST_F(LRUTest, SimpleTest) {
+  Insert(1);  // 1
+  Insert(2);  // 1 2
+  Insert(3);  // 1 2 3
+  EXPECT_EQ(1, Peek());
+  EXPECT_EQ(1, Pop());  // 2 3
+  EXPECT_EQ(2, Peek());
+  Use(2);  // 3 2
+  EXPECT_EQ(3, Peek());
+  EXPECT_EQ(3, Pop());  // 2
+  EXPECT_EQ(2, Pop());
+  EXPECT_TRUE(Empty());
+}
+
+TEST_F(LRUTest, UseTest) {
+  EXPECT_TRUE(Empty());
+  // Using a value that's not on the LRU adds it.
+  Use(3);  // 3
+  EXPECT_EQ(3, Peek());
+  Use(5);  // 3 5
+  EXPECT_EQ(3, Peek());
+  EXPECT_TRUE(Contains(5));
+  Use(7);  // 3 5 7
+  EXPECT_EQ(3, Peek());
+  EXPECT_TRUE(Contains(7));
+  // Using a value that's alraedy on the LRU moves it to the top.
+  Use(3);  // 5 7 3
+  EXPECT_EQ(5, Peek());
+  EXPECT_TRUE(Contains(5));
+  EXPECT_EQ(5, Pop());  // 7 3
+  EXPECT_FALSE(Contains(5));
+  EXPECT_EQ(7, Peek());
+  EXPECT_TRUE(Contains(7));
+  EXPECT_TRUE(Contains(3));
+  Use(9);  // 7 3 9
+  EXPECT_EQ(7, Peek());
+  // Using the same value again has no effect.
+  Use(9);  // 7 3 9
+  EXPECT_EQ(7, Peek());
+  Use(3);  // 7 9 3
+  EXPECT_EQ(7, Pop());
+  EXPECT_EQ(9, Pop());
+  EXPECT_EQ(3, Pop());
+  EXPECT_TRUE(Empty());
+}
+
+TEST_F(LRUTest, RemoveTest) {
+  Insert(5);  // 5
+  Insert(4);  // 5 4
+  Insert(3);  // 5 4 3
+  Insert(2);  // 5 4 3 2
+  Insert(1);  // 5 4 3 2 1
+  EXPECT_EQ(5, Peek());
+  Remove(5);  // 4 3 2 1
+  EXPECT_EQ(4, Peek());
+  Remove(1);  // 4 3 2
+  EXPECT_EQ(4, Peek());
+  Remove(3);  // 4 2
+  EXPECT_EQ(4, Pop());
+  EXPECT_EQ(2, Pop());
+  EXPECT_TRUE(Empty());
+}
+
+TEST_F(LRUTest, RandomTest) {
+  for (int j = 0; j < 100; j++) {
+    Clear();
+    for (int i = 0; i < 1000; i++) {
+      int value = rnd_.Rand() % kTestIntRange;
+      switch (rnd_.Rand() % 3) {
+        case 0:
+          if (!Empty())
+            Pop();
+          break;
+
+        case 1:
+          Use(value);
+          break;
+
+        case 2:
+          if (Contains(value)) {
+            Remove(value);
+          } else {
+            Insert(value);
+          }
+          break;
+      }
+      if (HasFailure()) {
+        return;
+      }
+    }
+  }
+}
+
+}  // namespace media
diff --git a/media/blink/media_blink.gyp b/media/blink/media_blink.gyp
index 86e5e0f..afdf558 100644
--- a/media/blink/media_blink.gyp
+++ b/media/blink/media_blink.gyp
@@ -119,10 +119,12 @@
         'buffered_resource_loader_unittest.cc',
         'cache_util_unittest.cc',
         'key_system_config_selector_unittest.cc',
+        'lru_unittest.cc',
         'mock_webframeclient.h',
         'mock_weburlloader.cc',
         'mock_weburlloader.h',
         'run_all_unittests.cc',
+        'test_random.h',
         'test_response_generator.cc',
         'test_response_generator.h',
         'video_frame_compositor_unittest.cc',
diff --git a/media/blink/test_random.h b/media/blink/test_random.h
new file mode 100644
index 0000000..a3603b4
--- /dev/null
+++ b/media/blink/test_random.h
@@ -0,0 +1,41 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef MEDIA_BLINK_TEST_RANDOM_H_
+#define MEDIA_BLINK_TEST_RANDOM_H_
+
+// Vastly simplified ACM random class meant to only be used for testing.
+// This class is meant to generate predictable sequences of pseudorandom
+// numbers, unlike the classes in base/rand_util.h which are meant to generate
+// unpredictable sequences.
+// See
+// https://code.google.com/p/szl/source/browse/trunk/src/utilities/acmrandom.h
+// for more information.
+
+namespace media {
+
+class TestRandom {
+ public:
+  explicit TestRandom(uint32_t seed) {
+    seed_ = seed & 0x7fffffff;  // make this a non-negative number
+    if (seed_ == 0 || seed_ == M) {
+      seed_ = 1;
+    }
+  }
+
+  int32_t Rand() {
+    static const uint64 A = 16807;  // bits 14, 8, 7, 5, 2, 1, 0
+    seed_ = static_cast<int32_t>((seed_ * A) % M);
+    CHECK_GT(seed_, 0);
+    return seed_;
+  }
+
+ private:
+  static const uint64 M = 2147483647L;  // 2^32-1
+  int32_t seed_;
+};
+
+}  // namespace media
+
+#endif  // MEDIA_BLINK_TEST_RANDOM_H_
diff --git a/media/cast/BUILD.gn b/media/cast/BUILD.gn
index c9c8fc5..d0ae8f1 100644
--- a/media/cast/BUILD.gn
+++ b/media/cast/BUILD.gn
@@ -204,6 +204,7 @@
     "//media",
     "//media:shared_memory_support",
     "//third_party/libvpx_new",
+    "//third_party/libyuv",
     "//third_party/opus",
     "//ui/gfx",
   ]
diff --git a/media/cast/cast.gyp b/media/cast/cast.gyp
index 1ef6cda5..da4d230d 100644
--- a/media/cast/cast.gyp
+++ b/media/cast/cast.gyp
@@ -93,6 +93,7 @@
         '<(DEPTH)/media/media.gyp:shared_memory_support',
         '<(DEPTH)/third_party/opus/opus.gyp:opus',
         '<(DEPTH)/third_party/libvpx_new/libvpx.gyp:libvpx_new',
+        '<(DEPTH)/third_party/libyuv/libyuv.gyp:libyuv',
         '<(DEPTH)/ui/gfx/gfx.gyp:gfx_geometry',
       ],
       'sources': [
@@ -194,7 +195,7 @@
             'sender/vp8_encoder.cc',
             'sender/vp8_encoder.h',
             'sender/vp8_quantizer_parser.cc',
-	    'sender/vp8_quantizer_parser.h', 
+	    'sender/vp8_quantizer_parser.h',
           ],
         }], # OS=="ios"
         # iOS and OS X encoders
diff --git a/media/cast/receiver/video_decoder.cc b/media/cast/receiver/video_decoder.cc
index 534eac0..dca038c 100644
--- a/media/cast/receiver/video_decoder.cc
+++ b/media/cast/receiver/video_decoder.cc
@@ -10,6 +10,7 @@
 #include "base/location.h"
 #include "base/logging.h"
 #include "base/values.h"
+#include "media/base/video_frame_pool.h"
 #include "media/base/video_util.h"
 #include "media/cast/cast_defines.h"
 #include "media/cast/cast_environment.h"
@@ -18,6 +19,7 @@
 #define VPX_CODEC_DISABLE_COMPAT 1
 #include "third_party/libvpx_new/source/libvpx/vpx/vp8dx.h"
 #include "third_party/libvpx_new/source/libvpx/vpx/vpx_decoder.h"
+#include "third_party/libyuv/include/libyuv/convert.h"
 #include "ui/gfx/geometry/size.h"
 
 namespace media {
@@ -91,6 +93,9 @@
   // Subclass' ctor is expected to set this to STATUS_INITIALIZED.
   OperationalStatus operational_status_;
 
+  // Pool of VideoFrames to decode incoming frames into.
+  media::VideoFramePool video_frame_pool_;
+
  private:
   bool seen_first_frame_;
   uint32 last_frame_id_;
@@ -140,8 +145,8 @@
     vpx_image_t* const image = vpx_codec_get_frame(&context_, &iter);
     if (!image)
       return NULL;
-    if (image->fmt != VPX_IMG_FMT_I420 && image->fmt != VPX_IMG_FMT_YV12) {
-      NOTREACHED();
+    if (image->fmt != VPX_IMG_FMT_I420) {
+      NOTREACHED() << "Only pixel format supported is I420, got " << image->fmt;
       return NULL;
     }
     DCHECK(vpx_codec_get_frame(&context_, &iter) == NULL)
@@ -149,21 +154,22 @@
 
     const gfx::Size frame_size(image->d_w, image->d_h);
     // Note: Timestamp for the VideoFrame will be set in VideoReceiver.
-    const scoped_refptr<VideoFrame> decoded_frame = VideoFrame::CreateFrame(
-        PIXEL_FORMAT_YV12, frame_size, gfx::Rect(frame_size), frame_size,
-        base::TimeDelta());
-    CopyYPlane(image->planes[VPX_PLANE_Y],
-               image->stride[VPX_PLANE_Y],
-               image->d_h,
-               decoded_frame.get());
-    CopyUPlane(image->planes[VPX_PLANE_U],
-               image->stride[VPX_PLANE_U],
-               (image->d_h + 1) / 2,
-               decoded_frame.get());
-    CopyVPlane(image->planes[VPX_PLANE_V],
-               image->stride[VPX_PLANE_V],
-               (image->d_h + 1) / 2,
-               decoded_frame.get());
+    // |decoded_frame| will be returned to |video_frame_pool_| on destruction to
+    // be reused.
+    const scoped_refptr<VideoFrame> decoded_frame =
+        video_frame_pool_.CreateFrame(PIXEL_FORMAT_I420, frame_size,
+                                      gfx::Rect(frame_size), frame_size,
+                                      base::TimeDelta());
+    libyuv::I420Copy(image->planes[VPX_PLANE_Y], image->stride[VPX_PLANE_Y],
+                     image->planes[VPX_PLANE_U], image->stride[VPX_PLANE_U],
+                     image->planes[VPX_PLANE_V], image->stride[VPX_PLANE_V],
+                     decoded_frame->visible_data(media::VideoFrame::kYPlane),
+                     decoded_frame->stride(media::VideoFrame::kYPlane),
+                     decoded_frame->visible_data(media::VideoFrame::kUPlane),
+                     decoded_frame->stride(media::VideoFrame::kUPlane),
+                     decoded_frame->visible_data(media::VideoFrame::kVPlane),
+                     decoded_frame->stride(media::VideoFrame::kVPlane),
+                     frame_size.width(), frame_size.height());
     return decoded_frame;
   }
 
diff --git a/media/ffmpeg/ffmpeg_common.h b/media/ffmpeg/ffmpeg_common.h
index f4a8237..299946b 100644
--- a/media/ffmpeg/ffmpeg_common.h
+++ b/media/ffmpeg/ffmpeg_common.h
@@ -22,10 +22,7 @@
 // Disable deprecated features which result in spammy compile warnings.  This
 // list of defines must mirror those in the 'defines' section of the ffmpeg.gyp
 // file or the headers below will generate different structures.
-#define FF_API_PIX_FMT_DESC 0
-#define FF_API_OLD_DECODE_AUDIO 0
-#define FF_API_DESTRUCT_PACKET 0
-#define FF_API_GET_BUFFER 0
+// None currently.
 
 // Temporarily disable possible loss of data warning.
 // TODO(scherkus): fix and upstream the compiler warnings.
diff --git a/media/ffmpeg/ffmpeg_regression_tests.cc b/media/ffmpeg/ffmpeg_regression_tests.cc
index c7043b3..36067b4 100644
--- a/media/ffmpeg/ffmpeg_regression_tests.cc
+++ b/media/ffmpeg/ffmpeg_regression_tests.cc
@@ -87,7 +87,10 @@
                  "security/110849.mkv",
                  DEMUXER_ERROR_COULD_NOT_OPEN,
                  DEMUXER_ERROR_NO_SUPPORTED_STREAMS);
-FFMPEG_TEST_CASE(Cr112384, "security/112384.webm", PIPELINE_OK, PIPELINE_OK);
+FFMPEG_TEST_CASE(Cr112384,
+                 "security/112384.webm",
+                 DEMUXER_ERROR_COULD_NOT_PARSE,
+                 DEMUXER_ERROR_COULD_NOT_PARSE);
 FFMPEG_TEST_CASE(Cr112976, "security/112976.ogg", PIPELINE_OK, PIPELINE_OK);
 FFMPEG_TEST_CASE(Cr116927,
                  "security/116927.ogv",
@@ -333,6 +336,7 @@
 FLAKY_FFMPEG_TEST_CASE(MP4_10, "security/null1.m4a");
 FLAKY_FFMPEG_TEST_CASE(Cr112670, "security/112670.mp4");
 
+// Uses ASSERTs to prevent sharded tests from hanging on failure.
 TEST_P(FFmpegRegressionTest, BasicPlayback) {
   if (GetParam().init_status == PIPELINE_OK) {
     ASSERT_EQ(PIPELINE_OK, Start(GetParam().filename, kClockless));
diff --git a/media/formats/mp4/aac.cc b/media/formats/mp4/aac.cc
index 853271f3..1e30918 100644
--- a/media/formats/mp4/aac.cc
+++ b/media/formats/mp4/aac.cc
@@ -38,12 +38,11 @@
   frequency_ = 0;
   extension_frequency_ = 0;
 
-  // TODO(msu.koo): Need to update comments after checking which version of
-  // ISO 14496-3 this implementation is according to. Also need to reflect
-  // ISO 14496-3:2009 if ISO 14496-3:2005 was reflected here.
+  // TODO(msu.koo): Need to consider whether ISO 14496-3:2009 needs
+  // to be reflected instead of ISO 14496-3:2005.
   // https://crbug.com/532281
 
-  // The following code is written according to ISO 14496 Part 3 Table 1.13 -
+  // The following code is written according to ISO 14496-3:2005 Table 1.13 -
   // Syntax of AudioSpecificConfig.
 
   // Read base configuration
@@ -161,7 +160,7 @@
   if (!sbr_in_mimetype)
     return frequency_;
 
-  // The following code is written according to ISO 14496 Part 3 Table 1.11 and
+  // The following code is written according to ISO 14496-3:2005 Table 1.11 and
   // Table 1.22. (Table 1.11 refers to the capping to 48000, Table 1.22 refers
   // to SBR doubling the AAC sample rate.)
   // TODO(acolwell) : Extend sample rate cap to 96kHz for Level 5 content.
@@ -172,7 +171,7 @@
 ChannelLayout AAC::GetChannelLayout(bool sbr_in_mimetype) const {
   // Check for implicit signalling of HE-AAC and indicate stereo output
   // if the mono channel configuration is signalled.
-  // See ISO-14496-3 Section 1.6.6.1.2 for details about this special casing.
+  // See ISO 14496-3:2005 Section 1.6.5.3 for details about this special casing.
   if (sbr_in_mimetype && channel_config_ == 1)
     return CHANNEL_LAYOUT_STEREO;
 
@@ -205,7 +204,7 @@
 }
 
 // Currently this function only support GASpecificConfig defined in
-// ISO 14496 Part 3 Table 4.1 - Syntax of GASpecificConfig()
+// ISO 14496-3:2005 Table 4.1 - Syntax of GASpecificConfig()
 bool AAC::SkipDecoderGASpecificConfig(BitReader* bit_reader) const {
   switch (profile_) {
     case 1:
@@ -248,7 +247,7 @@
   return true;
 }
 
-// The following code is written according to ISO 14496 part 3 Table 4.1 -
+// The following code is written according to ISO 14496-3:2005 Table 4.1 -
 // GASpecificConfig.
 bool AAC::SkipGASpecificConfig(BitReader* bit_reader) const {
   uint8 extension_flag = 0;
diff --git a/media/formats/mp4/aac_unittest.cc b/media/formats/mp4/aac_unittest.cc
index a31952a..8a079bc 100644
--- a/media/formats/mp4/aac_unittest.cc
+++ b/media/formats/mp4/aac_unittest.cc
@@ -110,7 +110,7 @@
 // Test implicit SBR with mono channel config.
 // Mono channel layout should only be reported if SBR is not
 // specified. Otherwise stereo should be reported.
-// See ISO-14496-3 Section 1.6.6.1.2 for details about this special casing.
+// See ISO 14496-3:2005 Section 1.6.5.3 for details about this special casing.
 TEST_F(AACTest, ImplicitSBR_ChannelConfig0) {
   uint8 buffer[] = {0x13, 0x08};
   std::vector<uint8> data;
diff --git a/mojo/runner/child_process_host.cc b/mojo/runner/child_process_host.cc
index b485671f..298fb80 100644
--- a/mojo/runner/child_process_host.cc
+++ b/mojo/runner/child_process_host.cc
@@ -12,10 +12,10 @@
 #include "base/message_loop/message_loop.h"
 #include "base/process/kill.h"
 #include "base/process/launch.h"
+#include "base/task_runner.h"
 #include "base/thread_task_runner_handle.h"
 #include "mojo/public/cpp/bindings/interface_ptr_info.h"
 #include "mojo/public/cpp/system/core.h"
-#include "mojo/runner/context.h"
 #include "mojo/runner/switches.h"
 #include "mojo/runner/task_runners.h"
 #include "third_party/mojo/src/mojo/edk/embedder/embedder.h"
@@ -27,10 +27,10 @@
 namespace mojo {
 namespace runner {
 
-ChildProcessHost::ChildProcessHost(Context* context,
+ChildProcessHost::ChildProcessHost(base::TaskRunner* launch_process_runner,
                                    bool start_sandboxed,
                                    const base::FilePath& app_path)
-    : context_(context),
+    : launch_process_runner_(launch_process_runner),
       start_sandboxed_(start_sandboxed),
       app_path_(app_path),
       channel_info_(nullptr),
@@ -56,7 +56,7 @@
 
   controller_.Bind(InterfacePtrInfo<ChildController>(handle.Pass(), 0u));
 
-  context_->task_runners()->blocking_pool()->PostTaskAndReply(
+  launch_process_runner_->PostTaskAndReply(
       FROM_HERE,
       base::Bind(&ChildProcessHost::DoLaunch, base::Unretained(this)),
       base::Bind(&ChildProcessHost::DidStart, weak_factory_.GetWeakPtr()));
@@ -126,6 +126,23 @@
   base::LaunchOptions options;
 #if defined(OS_WIN)
   options.handles_to_inherit = &handle_passing_info;
+  options.stdin_handle = INVALID_HANDLE_VALUE;
+  options.stdout_handle = GetStdHandle(STD_OUTPUT_HANDLE);
+  options.stderr_handle = GetStdHandle(STD_ERROR_HANDLE);
+
+  // Pseudo handles are used when stdout and stderr redirect to the console. In
+  // that case, they're automatically inherited by child processes. See
+  // https://msdn.microsoft.com/en-us/library/windows/desktop/ms682075.aspx
+  // Trying to add them to the list of handles to inherit causes CreateProcess
+  // to fail. When this process is launched from Python
+  // (i.e. by apptest_runner.py) then a real handle is used. In that case, we do
+  // want to add it to the list of handles that is inherited.
+  if (GetFileType(options.stdout_handle) != FILE_TYPE_CHAR)
+    handle_passing_info.push_back(options.stdout_handle);
+  if (GetFileType(options.stderr_handle) != FILE_TYPE_CHAR &&
+      options.stdout_handle != options.stdout_handle) {
+    handle_passing_info.push_back(options.stderr_handle);
+  }
 #elif defined(OS_POSIX)
   handle_passing_info.push_back(std::make_pair(STDIN_FILENO, STDIN_FILENO));
   handle_passing_info.push_back(std::make_pair(STDOUT_FILENO, STDOUT_FILENO));
diff --git a/mojo/runner/child_process_host.h b/mojo/runner/child_process_host.h
index 346f0d5..42f0773d4 100644
--- a/mojo/runner/child_process_host.h
+++ b/mojo/runner/child_process_host.h
@@ -16,11 +16,13 @@
 #include "third_party/mojo/src/mojo/edk/embedder/platform_channel_pair.h"
 #include "third_party/mojo/src/mojo/edk/embedder/scoped_platform_handle.h"
 
+namespace base {
+class TaskRunner;
+}
+
 namespace mojo {
 namespace runner {
 
-class Context;
-
 // This class represents a "child process host". Handles launching and
 // connecting a platform-specific "pipe" to the child, and supports joining the
 // child process. Currently runs a single app (loaded from the file system).
@@ -36,7 +38,7 @@
   // |name| is just for debugging ease. We will spawn off a process so that it
   // can be sandboxed if |start_sandboxed| is true. |app_path| is a path to the
   // mojo application we wish to start.
-  ChildProcessHost(Context* context,
+  ChildProcessHost(base::TaskRunner* launch_process_runner,
                    bool start_sandboxed,
                    const base::FilePath& app_path);
   virtual ~ChildProcessHost();
@@ -65,7 +67,7 @@
   // Callback for |embedder::CreateChannel()|.
   void DidCreateChannel(embedder::ChannelInfo* channel_info);
 
-  Context* const context_;
+  base::TaskRunner* const launch_process_runner_;
   bool start_sandboxed_;
   const base::FilePath app_path_;
   base::Process child_process_;
diff --git a/mojo/runner/child_process_host_unittest.cc b/mojo/runner/child_process_host_unittest.cc
index 9d5b1d0..8d07843 100644
--- a/mojo/runner/child_process_host_unittest.cc
+++ b/mojo/runner/child_process_host_unittest.cc
@@ -10,9 +10,12 @@
 #include "base/macros.h"
 #include "base/message_loop/message_loop.h"
 #include "base/path_service.h"
+#include "base/threading/thread.h"
 #include "mojo/message_pump/message_pump_mojo.h"
 #include "mojo/runner/context.h"
 #include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/mojo/src/mojo/edk/embedder/embedder.h"
+#include "third_party/mojo/src/mojo/edk/embedder/process_delegate.h"
 
 namespace mojo {
 namespace runner {
@@ -21,8 +24,8 @@
 // Subclass just so we can observe |DidStart()|.
 class TestChildProcessHost : public ChildProcessHost {
  public:
-  explicit TestChildProcessHost(Context* context)
-      : ChildProcessHost(context, false, base::FilePath()) {}
+  explicit TestChildProcessHost(base::TaskRunner* launch_process_runner)
+      : ChildProcessHost(launch_process_runner, false, base::FilePath()) {}
   ~TestChildProcessHost() override {}
 
   void DidStart() override {
@@ -34,6 +37,16 @@
   DISALLOW_COPY_AND_ASSIGN(TestChildProcessHost);
 };
 
+class ProcessDelegate : public embedder::ProcessDelegate {
+ public:
+  ProcessDelegate() {}
+  ~ProcessDelegate() override {}
+
+ private:
+  void OnShutdownComplete() override {}
+  DISALLOW_COPY_AND_ASSIGN(ProcessDelegate);
+};
+
 #if defined(OS_ANDROID)
 // TODO(qsr): Multiprocess shell tests are not supported on android.
 #define MAYBE_StartJoin DISABLED_StartJoin
@@ -43,21 +56,35 @@
 // Just tests starting the child process and joining it (without starting an
 // app).
 TEST(ChildProcessHostTest, MAYBE_StartJoin) {
+  // TODO(beng): will have to call embedder::Init() here once we move to a
+  //             different suite.
+  Context::EnsureEmbedderIsInitialized();
   base::FilePath shell_dir;
   PathService::Get(base::DIR_MODULE, &shell_dir);
-  Context context(shell_dir, nullptr);
   base::MessageLoop message_loop(
       scoped_ptr<base::MessagePump>(new common::MessagePumpMojo()));
-  context.Init();
-  TestChildProcessHost child_process_host(&context);
+  scoped_refptr<base::SequencedWorkerPool> blocking_pool(
+      new base::SequencedWorkerPool(3, "blocking_pool"));
+
+  base::Thread io_thread("io_thread");
+  base::Thread::Options options;
+  options.message_loop_type = base::MessageLoop::TYPE_IO;
+  io_thread.StartWithOptions(options);
+
+  ProcessDelegate delegate;
+  embedder::InitIPCSupport(
+      embedder::ProcessType::NONE, base::MessageLoop::current()->task_runner(),
+      &delegate, io_thread.task_runner(), embedder::ScopedPlatformHandle());
+
+  TestChildProcessHost child_process_host(blocking_pool.get());
   child_process_host.Start();
   message_loop.Run();
   child_process_host.ExitNow(123);
   int exit_code = child_process_host.Join();
   VLOG(2) << "Joined child: exit_code = " << exit_code;
   EXPECT_EQ(123, exit_code);
-
-  context.Shutdown();
+  blocking_pool->Shutdown();
+  embedder::ShutdownIPCSupport();
 }
 
 }  // namespace
diff --git a/mojo/runner/context.cc b/mojo/runner/context.cc
index 87e4157..1923bad 100644
--- a/mojo/runner/context.cc
+++ b/mojo/runner/context.cc
@@ -209,14 +209,16 @@
 
   scoped_ptr<shell::NativeRunnerFactory> runner_factory;
   if (command_line.HasSwitch(switches::kEnableMultiprocess)) {
-    runner_factory.reset(new OutOfProcessNativeRunnerFactory(this));
+    runner_factory.reset(
+        new OutOfProcessNativeRunnerFactory(task_runners_->blocking_pool()));
   } else {
 #if defined(COMPONENT_BUILD)
     LOG(ERROR) << "Running Mojo in single process component build, which isn't "
                << "supported because statics in apps interact. Use static build"
                << " or don't pass --single-process.";
 #endif
-    runner_factory.reset(new InProcessNativeRunnerFactory(this));
+    runner_factory.reset(
+        new InProcessNativeRunnerFactory(task_runners_->blocking_pool()));
   }
   application_manager_.reset(new shell::ApplicationManager(
       make_scoped_ptr(package_manager_), runner_factory.Pass(),
diff --git a/mojo/runner/in_process_native_runner.cc b/mojo/runner/in_process_native_runner.cc
index b5a8b27c..654f365 100644
--- a/mojo/runner/in_process_native_runner.cc
+++ b/mojo/runner/in_process_native_runner.cc
@@ -7,6 +7,7 @@
 #include "base/bind.h"
 #include "base/callback_helpers.h"
 #include "base/location.h"
+#include "base/task_runner.h"
 #include "base/thread_task_runner_handle.h"
 #include "base/threading/platform_thread.h"
 #include "mojo/runner/native_application_support.h"
@@ -15,8 +16,7 @@
 namespace mojo {
 namespace runner {
 
-InProcessNativeRunner::InProcessNativeRunner(Context* context)
-    : app_library_(nullptr) {}
+InProcessNativeRunner::InProcessNativeRunner() : app_library_(nullptr) {}
 
 InProcessNativeRunner::~InProcessNativeRunner() {
   // It is important to let the thread exit before unloading the DSO (when
@@ -65,9 +65,11 @@
 scoped_ptr<shell::NativeRunner> InProcessNativeRunnerFactory::Create(
     const base::FilePath& app_path) {
   // Non-Mojo apps are always run in a new process.
-  if (!app_path.MatchesExtension(FILE_PATH_LITERAL(".mojo")))
-    return make_scoped_ptr(new OutOfProcessNativeRunner(context_));
-  return make_scoped_ptr(new InProcessNativeRunner(context_));
+  if (!app_path.MatchesExtension(FILE_PATH_LITERAL(".mojo"))) {
+    return make_scoped_ptr(
+        new OutOfProcessNativeRunner(launch_process_runner_));
+  }
+  return make_scoped_ptr(new InProcessNativeRunner);
 }
 
 }  // namespace runner
diff --git a/mojo/runner/in_process_native_runner.h b/mojo/runner/in_process_native_runner.h
index 21674258..3c69e0b 100644
--- a/mojo/runner/in_process_native_runner.h
+++ b/mojo/runner/in_process_native_runner.h
@@ -14,17 +14,19 @@
 #include "mojo/runner/native_application_support.h"
 #include "mojo/shell/native_runner.h"
 
+namespace base {
+class TaskRunner;
+}
+
 namespace mojo {
 namespace runner {
 
-class Context;
-
 // An implementation of |NativeRunner| that loads/runs the given app (from the
 // file system) on a separate thread (in the current process).
 class InProcessNativeRunner : public shell::NativeRunner,
                               public base::DelegateSimpleThread::Delegate {
  public:
-  explicit InProcessNativeRunner(Context* context);
+  InProcessNativeRunner();
   ~InProcessNativeRunner() override;
 
   // |NativeRunner| method:
@@ -49,14 +51,15 @@
 
 class InProcessNativeRunnerFactory : public shell::NativeRunnerFactory {
  public:
-  explicit InProcessNativeRunnerFactory(Context* context) : context_(context) {}
+  explicit InProcessNativeRunnerFactory(base::TaskRunner* launch_process_runner)
+      : launch_process_runner_(launch_process_runner) {}
   ~InProcessNativeRunnerFactory() override {}
 
   scoped_ptr<shell::NativeRunner> Create(
       const base::FilePath& app_path) override;
 
  private:
-  Context* const context_;
+  base::TaskRunner* const launch_process_runner_;
 
   DISALLOW_COPY_AND_ASSIGN(InProcessNativeRunnerFactory);
 };
diff --git a/mojo/runner/in_process_native_runner_unittest.cc b/mojo/runner/in_process_native_runner_unittest.cc
index b676581..5fe2b5da 100644
--- a/mojo/runner/in_process_native_runner_unittest.cc
+++ b/mojo/runner/in_process_native_runner_unittest.cc
@@ -4,22 +4,13 @@
 
 #include "mojo/runner/in_process_native_runner.h"
 
-#include "base/path_service.h"
-#include "mojo/runner/context.h"
-#include "mojo/runner/tracer.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace mojo {
 namespace runner {
 
 TEST(InProcessNativeRunnerTest, NotStarted) {
-  base::FilePath shell_dir;
-  PathService::Get(base::DIR_MODULE, &shell_dir);
-  Context context(shell_dir, nullptr);
-  base::MessageLoop loop;
-  context.Init();
-  InProcessNativeRunner runner(&context);
-  context.Shutdown();
+  InProcessNativeRunner runner;
   // Shouldn't crash or DCHECK on destruction.
 }
 
diff --git a/mojo/runner/out_of_process_native_runner.cc b/mojo/runner/out_of_process_native_runner.cc
index a3a9bc5..f2a394e 100644
--- a/mojo/runner/out_of_process_native_runner.cc
+++ b/mojo/runner/out_of_process_native_runner.cc
@@ -8,15 +8,16 @@
 #include "base/callback_helpers.h"
 #include "base/files/file_util.h"
 #include "base/logging.h"
+#include "base/task_runner.h"
 #include "mojo/runner/child_process_host.h"
 #include "mojo/runner/in_process_native_runner.h"
 
 namespace mojo {
 namespace runner {
 
-OutOfProcessNativeRunner::OutOfProcessNativeRunner(Context* context)
-    : context_(context) {
-}
+OutOfProcessNativeRunner::OutOfProcessNativeRunner(
+    base::TaskRunner* launch_process_runner)
+    : launch_process_runner_(launch_process_runner) {}
 
 OutOfProcessNativeRunner::~OutOfProcessNativeRunner() {
   if (child_process_host_)
@@ -34,7 +35,7 @@
   app_completed_callback_ = app_completed_callback;
 
   child_process_host_.reset(
-      new ChildProcessHost(context_, start_sandboxed, app_path));
+      new ChildProcessHost(launch_process_runner_, start_sandboxed, app_path));
   child_process_host_->Start();
 
   child_process_host_->StartApp(
@@ -57,7 +58,7 @@
 
 scoped_ptr<shell::NativeRunner> OutOfProcessNativeRunnerFactory::Create(
     const base::FilePath& app_path) {
-  return make_scoped_ptr(new OutOfProcessNativeRunner(context_));
+  return make_scoped_ptr(new OutOfProcessNativeRunner(launch_process_runner_));
 }
 
 }  // namespace runner
diff --git a/mojo/runner/out_of_process_native_runner.h b/mojo/runner/out_of_process_native_runner.h
index 4021c4f..b4e2b92 100644
--- a/mojo/runner/out_of_process_native_runner.h
+++ b/mojo/runner/out_of_process_native_runner.h
@@ -11,17 +11,20 @@
 #include "base/memory/scoped_ptr.h"
 #include "mojo/shell/native_runner.h"
 
+namespace base {
+class TaskRunner;
+}
+
 namespace mojo {
 namespace runner {
 
 class ChildProcessHost;
-class Context;
 
 // An implementation of |NativeRunner| that loads/runs the given app (from the
 // file system) in a separate process (of its own).
 class OutOfProcessNativeRunner : public shell::NativeRunner {
  public:
-  explicit OutOfProcessNativeRunner(Context* context);
+  explicit OutOfProcessNativeRunner(base::TaskRunner* launch_process_runner);
   ~OutOfProcessNativeRunner() override;
 
   // |NativeRunner| method:
@@ -34,7 +37,7 @@
   // |ChildController::StartApp()| callback:
   void AppCompleted(int32_t result);
 
-  Context* const context_;
+  base::TaskRunner* const launch_process_runner_;
 
   base::FilePath app_path_;
   base::Closure app_completed_callback_;
@@ -46,15 +49,16 @@
 
 class OutOfProcessNativeRunnerFactory : public shell::NativeRunnerFactory {
  public:
-  explicit OutOfProcessNativeRunnerFactory(Context* context)
-      : context_(context) {}
+  explicit OutOfProcessNativeRunnerFactory(
+      base::TaskRunner* launch_process_runner)
+      : launch_process_runner_(launch_process_runner) {}
   ~OutOfProcessNativeRunnerFactory() override {}
 
   scoped_ptr<shell::NativeRunner> Create(
       const base::FilePath& app_path) override;
 
  private:
-  Context* const context_;
+  base::TaskRunner* const launch_process_runner_;
 
   DISALLOW_COPY_AND_ASSIGN(OutOfProcessNativeRunnerFactory);
 };
diff --git a/native_client_sdk/src/build_tools/sdk_tools/sdk_update_main.py b/native_client_sdk/src/build_tools/sdk_tools/sdk_update_main.py
index f61a9d2..9d69ce1 100755
--- a/native_client_sdk/src/build_tools/sdk_tools/sdk_update_main.py
+++ b/native_client_sdk/src/build_tools/sdk_tools/sdk_update_main.py
@@ -37,8 +37,8 @@
 GSTORE_URL = 'https://storage.googleapis.com/nativeclient-mirror'
 CONFIG_FILENAME = 'naclsdk_config.json'
 MANIFEST_FILENAME = 'naclsdk_manifest2.json'
-DEFAULT_SDK_ROOT = os.path.abspath(PARENT_DIR)
-USER_DATA_DIR = os.path.join(DEFAULT_SDK_ROOT, 'sdk_cache')
+SDK_ROOT = PARENT_DIR
+USER_DATA_DIR = os.path.join(SDK_ROOT, 'sdk_cache')
 
 
 def usage(more):
@@ -115,6 +115,7 @@
       raise
     else:
       logging.warn(str(e))
+
   return manifest
 
 
@@ -166,6 +167,25 @@
   return manifest
 
 
+def PruneLocalManifest(local_manifest, remote_manifest):
+  """Remove SDKs from the local manifest that don't exist remotely and
+  are not installed locally.
+
+  Without this the local manifest will grown unboundedly.
+  """
+  local_only_bundles = set([b.name for b in local_manifest.GetBundles()])
+  local_only_bundles -= set([b.name for b in remote_manifest.GetBundles()])
+  dirty = False
+  for bundle in local_only_bundles:
+    root = os.path.join(SDK_ROOT, bundle)
+    if not os.path.exists(root):
+      local_manifest.RemoveBundle(bundle)
+      dirty = True
+
+  if dirty:
+    WriteLocalManifest(local_manifest)
+
+
 # Commands #####################################################################
 
 
@@ -188,6 +208,7 @@
   local_manifest = LoadLocalManifest()
   cfg = LoadConfig()
   remote_manifest = LoadCombinedRemoteManifest(options.manifest_url, cfg)
+  PruneLocalManifest(local_manifest, remote_manifest)
   command.list.List(remote_manifest, local_manifest, options.revision)
   return 0
 
@@ -206,9 +227,10 @@
   cfg = LoadConfig()
   remote_manifest = LoadCombinedRemoteManifest(options.manifest_url, cfg)
 
+  PruneLocalManifest(local_manifest, remote_manifest)
+
   try:
-    delegate = command.update.RealUpdateDelegate(USER_DATA_DIR,
-                                                 DEFAULT_SDK_ROOT, cfg)
+    delegate = command.update.RealUpdateDelegate(USER_DATA_DIR, SDK_ROOT, cfg)
     command.update.Update(delegate, remote_manifest, local_manifest,
                           options.bundles, options.force)
   finally:
@@ -237,7 +259,7 @@
   parser.add_argument('bundles', nargs='+', help='bundles to uninstall')
   options = parser.parse_args(args)
   local_manifest = LoadLocalManifest()
-  command.uninstall.Uninstall(DEFAULT_SDK_ROOT, local_manifest, options.bundles)
+  command.uninstall.Uninstall(SDK_ROOT, local_manifest, options.bundles)
   WriteLocalManifest(local_manifest)
   return 0
 
@@ -255,8 +277,7 @@
 
   cfg = LoadConfig()
   try:
-    delegate = command.update.RealUpdateDelegate(USER_DATA_DIR,
-                                                 DEFAULT_SDK_ROOT, cfg)
+    delegate = command.update.RealUpdateDelegate(USER_DATA_DIR, SDK_ROOT, cfg)
     command.update.Reinstall(delegate, local_manifest, options.bundles)
   finally:
     # Always write out the local manifest, we may have successfully updated one
@@ -342,8 +363,7 @@
   remote_manifest = LoadCombinedRemoteManifest(options.manifest_url, cfg)
 
   try:
-    delegate = command.update.RealUpdateDelegate(USER_DATA_DIR,
-                                                 DEFAULT_SDK_ROOT, cfg)
+    delegate = command.update.RealUpdateDelegate(USER_DATA_DIR, SDK_ROOT, cfg)
     command.update.UpdateBundleIfNeeded(
         delegate,
         remote_manifest,
diff --git a/native_client_sdk/src/build_tools/tests/sdktools_commands_test.py b/native_client_sdk/src/build_tools/tests/sdktools_commands_test.py
index 7dd9e61..d118186a 100755
--- a/native_client_sdk/src/build_tools/tests/sdktools_commands_test.py
+++ b/native_client_sdk/src/build_tools/tests/sdktools_commands_test.py
@@ -156,12 +156,13 @@
     self._WriteManifest()
     p23bundle = self._AddDummyBundle(self.manifest, 'pepper_23')
     self._WriteCacheManifest(self.manifest)
+    # Create pepper_23 directory so that manifest entry doesn't get purged
+    os.mkdir(os.path.join(self.nacl_sdk_base, 'pepper_23'))
     output = self._Run(['list', '-r'])
     message = 'Bundles installed locally that are not available remotely:'
-    message_loc = output.find(message)
-    self.assertNotEqual(message_loc, -1)
+    self.assertIn(message, output)
     # Make sure pepper_23 is listed after the message above.
-    self.assertTrue('pepper_23' in output[message_loc:])
+    self.assertTrue('pepper_23' in output[output.find(message):])
 
   def testSources(self):
     """The sources command should allow adding/listing/removing of sources.
diff --git a/native_client_sdk/src/build_tools/tests/sdktools_test.py b/native_client_sdk/src/build_tools/tests/sdktools_test.py
index 71891f6..66c041b 100755
--- a/native_client_sdk/src/build_tools/tests/sdktools_test.py
+++ b/native_client_sdk/src/build_tools/tests/sdktools_test.py
@@ -39,7 +39,8 @@
 
   def SetupWithBaseDirPrefix(self, basedir_prefix, tmpdir=None):
     self.basedir = tempfile.mkdtemp(prefix=basedir_prefix, dir=tmpdir)
-    self.cache_dir = os.path.join(self.basedir, 'nacl_sdk', 'sdk_cache')
+    self.nacl_sdk_base = os.path.join(self.basedir, 'nacl_sdk')
+    self.cache_dir = os.path.join(self.nacl_sdk_base, 'sdk_cache')
     # We have to make sure that we build our updaters with a version that is at
     # least as large as the version in the sdk_tools bundle. If not, update
     # tests may fail because the "current" version (according to the sdk_cache)
@@ -121,7 +122,7 @@
     return archive
 
   def _Run(self, args, expect_error=False):
-    naclsdk_shell_script = os.path.join(self.basedir, 'nacl_sdk', 'naclsdk')
+    naclsdk_shell_script = os.path.join(self.nacl_sdk_base, 'naclsdk')
     if getos.GetPlatform() == 'win':
       naclsdk_shell_script += '.bat'
     cmd = [naclsdk_shell_script]
@@ -214,8 +215,7 @@
     self.sdk_tools_bundle.revision = new_revision
     self._WriteManifest()
 
-    sdk_tools_update_dir = os.path.join(self.basedir, 'nacl_sdk',
-        'sdk_tools_update')
+    sdk_tools_update_dir = os.path.join(self.nacl_sdk_base, 'sdk_tools_update')
     self.assertFalse(os.path.exists(sdk_tools_update_dir))
     stdout = self._Run(['update', 'sdk_tools'])
     self.assertTrue(stdout.find('Ignoring manual update request.') != -1)
diff --git a/net/base/layered_network_delegate.cc b/net/base/layered_network_delegate.cc
index 9652d1c..6f8d89a7 100644
--- a/net/base/layered_network_delegate.cc
+++ b/net/base/layered_network_delegate.cc
@@ -138,25 +138,24 @@
 void LayeredNetworkDelegate::OnResponseStartedInternal(URLRequest* request) {
 }
 
-void LayeredNetworkDelegate::OnNetworkBytesReceived(const URLRequest& request,
+void LayeredNetworkDelegate::OnNetworkBytesReceived(URLRequest* request,
                                                     int64_t bytes_received) {
   OnNetworkBytesReceivedInternal(request, bytes_received);
   nested_network_delegate_->NotifyNetworkBytesReceived(request, bytes_received);
 }
 
 void LayeredNetworkDelegate::OnNetworkBytesReceivedInternal(
-    const URLRequest& request,
+    URLRequest* request,
     int64_t bytes_received) {}
 
-void LayeredNetworkDelegate::OnNetworkBytesSent(const URLRequest& request,
+void LayeredNetworkDelegate::OnNetworkBytesSent(URLRequest* request,
                                                 int64_t bytes_sent) {
   OnNetworkBytesSentInternal(request, bytes_sent);
   nested_network_delegate_->NotifyNetworkBytesSent(request, bytes_sent);
 }
 
-void LayeredNetworkDelegate::OnNetworkBytesSentInternal(
-    const URLRequest& request,
-    int64_t bytes_sent) {}
+void LayeredNetworkDelegate::OnNetworkBytesSentInternal(URLRequest* request,
+                                                        int64_t bytes_sent) {}
 
 void LayeredNetworkDelegate::OnCompleted(URLRequest* request, bool started) {
   OnCompletedInternal(request, started);
diff --git a/net/base/layered_network_delegate.h b/net/base/layered_network_delegate.h
index 381aac99..e6e7dea 100644
--- a/net/base/layered_network_delegate.h
+++ b/net/base/layered_network_delegate.h
@@ -64,9 +64,9 @@
       GURL* allowed_unsafe_redirect_url) final;
   void OnBeforeRedirect(URLRequest* request, const GURL& new_location) final;
   void OnResponseStarted(URLRequest* request) final;
-  void OnNetworkBytesReceived(const URLRequest& request,
+  void OnNetworkBytesReceived(URLRequest* request,
                               int64_t bytes_received) final;
-  void OnNetworkBytesSent(const URLRequest& request, int64_t bytes_sent) final;
+  void OnNetworkBytesSent(URLRequest* request, int64_t bytes_sent) final;
   void OnCompleted(URLRequest* request, bool started) final;
   void OnURLRequestDestroyed(URLRequest* request) final;
   void OnURLRequestJobOrphaned(URLRequest* request) final;
@@ -126,10 +126,10 @@
 
   virtual void OnResponseStartedInternal(URLRequest* request);
 
-  virtual void OnNetworkBytesReceivedInternal(const URLRequest& request,
+  virtual void OnNetworkBytesReceivedInternal(URLRequest* request,
                                               int64_t bytes_received);
 
-  virtual void OnNetworkBytesSentInternal(const URLRequest& request,
+  virtual void OnNetworkBytesSentInternal(URLRequest* request,
                                           int64_t bytes_sent);
 
   virtual void OnCompletedInternal(URLRequest* request, bool started);
diff --git a/net/base/layered_network_delegate_unittest.cc b/net/base/layered_network_delegate_unittest.cc
index bfdbe7b8..fb427a49 100644
--- a/net/base/layered_network_delegate_unittest.cc
+++ b/net/base/layered_network_delegate_unittest.cc
@@ -93,13 +93,12 @@
     IncrementAndCompareCounter("on_response_started_count");
   }
 
-  void OnNetworkBytesReceived(const URLRequest& request,
+  void OnNetworkBytesReceived(URLRequest* request,
                               int64_t bytes_received) override {
     IncrementAndCompareCounter("on_network_bytes_received_count");
   }
 
-  void OnNetworkBytesSent(const URLRequest& request,
-                          int64_t bytes_sent) override {
+  void OnNetworkBytesSent(URLRequest* request, int64_t bytes_sent) override {
     IncrementAndCompareCounter("on_network_bytes_sent_count");
   }
 
@@ -202,11 +201,11 @@
                                       request_headers.get()));
     OnBeforeSendProxyHeaders(NULL, ProxyInfo(), request_headers.get());
     OnSendHeaders(NULL, *request_headers);
-    OnNetworkBytesSent(*request, 42);
+    OnNetworkBytesSent(request.get(), 42);
     EXPECT_EQ(OK, OnHeadersReceived(NULL, completion_callback.callback(),
                                     response_headers.get(), NULL, NULL));
     OnResponseStarted(request.get());
-    OnNetworkBytesReceived(*request, 42);
+    OnNetworkBytesReceived(request.get(), 42);
     OnCompleted(request.get(), false);
     OnURLRequestDestroyed(request.get());
     OnPACScriptError(0, base::string16());
@@ -284,13 +283,13 @@
     EXPECT_EQ(1, (*counters_)["on_response_started_count"]);
   }
 
-  void OnNetworkBytesReceivedInternal(const URLRequest& request,
+  void OnNetworkBytesReceivedInternal(URLRequest* request,
                                       int64_t bytes_received) override {
     ++(*counters_)["on_network_bytes_received_count"];
     EXPECT_EQ(1, (*counters_)["on_network_bytes_received_count"]);
   }
 
-  void OnNetworkBytesSentInternal(const URLRequest& request,
+  void OnNetworkBytesSentInternal(URLRequest* request,
                                   int64_t bytes_sent) override {
     ++(*counters_)["on_network_bytes_sent_count"];
     EXPECT_EQ(1, (*counters_)["on_network_bytes_sent_count"]);
diff --git a/net/base/network_delegate.cc b/net/base/network_delegate.cc
index dfe2abb7..6cf7c96 100644
--- a/net/base/network_delegate.cc
+++ b/net/base/network_delegate.cc
@@ -89,14 +89,14 @@
   OnResponseStarted(request);
 }
 
-void NetworkDelegate::NotifyNetworkBytesReceived(const URLRequest& request,
+void NetworkDelegate::NotifyNetworkBytesReceived(URLRequest* request,
                                                  int64_t bytes_received) {
   DCHECK(CalledOnValidThread());
   DCHECK_GT(bytes_received, 0);
   OnNetworkBytesReceived(request, bytes_received);
 }
 
-void NetworkDelegate::NotifyNetworkBytesSent(const URLRequest& request,
+void NetworkDelegate::NotifyNetworkBytesSent(URLRequest* request,
                                              int64_t bytes_sent) {
   DCHECK(CalledOnValidThread());
   DCHECK_GT(bytes_sent, 0);
diff --git a/net/base/network_delegate.h b/net/base/network_delegate.h
index e8d82a3..fa266f5 100644
--- a/net/base/network_delegate.h
+++ b/net/base/network_delegate.h
@@ -87,9 +87,8 @@
   void NotifyBeforeRedirect(URLRequest* request,
                             const GURL& new_location);
   void NotifyResponseStarted(URLRequest* request);
-  void NotifyNetworkBytesReceived(const URLRequest& request,
-                                  int64_t bytes_received);
-  void NotifyNetworkBytesSent(const URLRequest& request, int64_t bytes_sent);
+  void NotifyNetworkBytesReceived(URLRequest* request, int64_t bytes_received);
+  void NotifyNetworkBytesSent(URLRequest* request, int64_t bytes_sent);
   void NotifyCompleted(URLRequest* request, bool started);
   void NotifyURLRequestDestroyed(URLRequest* request);
   void NotifyURLRequestJobOrphaned(URLRequest* request);
@@ -212,7 +211,7 @@
   // greater than 0.
   // Currently, this is only implemented for HTTP transactions, and
   // |bytes_received| does not include TLS overhead or TCP retransmits.
-  virtual void OnNetworkBytesReceived(const URLRequest& request,
+  virtual void OnNetworkBytesReceived(URLRequest* request,
                                       int64_t bytes_received) = 0;
 
   // Called when bytes are sent over the network, such as when sending request
@@ -222,8 +221,7 @@
   // OnNetworkBytesSent was called. |bytes_sent| will always be greater than 0.
   // Currently, this is only implemented for HTTP transactions, and |bytes_sent|
   // does not include TLS overhead or TCP retransmits.
-  virtual void OnNetworkBytesSent(const URLRequest& request,
-                                  int64_t bytes_sent) = 0;
+  virtual void OnNetworkBytesSent(URLRequest* request, int64_t bytes_sent) = 0;
 
   // Indicates that the URL request has been completed or failed.
   // |started| indicates whether the request has been started. If false,
diff --git a/net/base/network_delegate_impl.cc b/net/base/network_delegate_impl.cc
index 5b3a946..b5822a16 100644
--- a/net/base/network_delegate_impl.cc
+++ b/net/base/network_delegate_impl.cc
@@ -56,10 +56,10 @@
 void NetworkDelegateImpl::OnResponseStarted(URLRequest* request) {
 }
 
-void NetworkDelegateImpl::OnNetworkBytesReceived(const URLRequest& request,
+void NetworkDelegateImpl::OnNetworkBytesReceived(URLRequest* request,
                                                  int64_t bytes_received) {}
 
-void NetworkDelegateImpl::OnNetworkBytesSent(const URLRequest& request,
+void NetworkDelegateImpl::OnNetworkBytesSent(URLRequest* request,
                                              int64_t bytes_sent) {}
 
 void NetworkDelegateImpl::OnCompleted(URLRequest* request, bool started) {
diff --git a/net/base/network_delegate_impl.h b/net/base/network_delegate_impl.h
index 4b68d95..231a6467 100644
--- a/net/base/network_delegate_impl.h
+++ b/net/base/network_delegate_impl.h
@@ -125,7 +125,7 @@
   // greater than 0.
   // Currently, this is only implemented for HTTP transactions, and
   // |bytes_received| does not include TLS overhead or TCP retransmits.
-  void OnNetworkBytesReceived(const URLRequest& request,
+  void OnNetworkBytesReceived(URLRequest* request,
                               int64_t bytes_received) override;
 
   // Called when bytes are sent over the network, such as when sending request
@@ -135,8 +135,7 @@
   // OnNetworkBytesSent was called. |bytes_sent| will always be greater than 0.
   // Currently, this is only implemented for HTTP transactions, and |bytes_sent|
   // does not include TLS overhead or TCP retransmits.
-  void OnNetworkBytesSent(const URLRequest& request,
-                          int64_t bytes_sent) override;
+  void OnNetworkBytesSent(URLRequest* request, int64_t bytes_sent) override;
 
   // Indicates that the URL request has been completed or failed.
   // |started| indicates whether the request has been started. If false,
diff --git a/net/cert/internal/parse_certificate.cc b/net/cert/internal/parse_certificate.cc
index 9535459..d2bc980 100644
--- a/net/cert/internal/parse_certificate.cc
+++ b/net/cert/internal/parse_certificate.cc
@@ -353,4 +353,56 @@
   return true;
 }
 
+// From RFC 5280:
+//
+//    Extension  ::=  SEQUENCE  {
+//            extnID      OBJECT IDENTIFIER,
+//            critical    BOOLEAN DEFAULT FALSE,
+//            extnValue   OCTET STRING
+//                        -- contains the DER encoding of an ASN.1 value
+//                        -- corresponding to the extension type identified
+//                        -- by extnID
+//            }
+bool ParseExtension(const der::Input& extension_tlv, ParsedExtension* out) {
+  der::Parser parser(extension_tlv);
+
+  //    Extension  ::=  SEQUENCE  {
+  der::Parser extension_parser;
+  if (!parser.ReadSequence(&extension_parser))
+    return false;
+
+  //            extnID      OBJECT IDENTIFIER,
+  if (!extension_parser.ReadTag(der::kOid, &out->oid))
+    return false;
+
+  //            critical    BOOLEAN DEFAULT FALSE,
+  out->critical = false;
+  bool has_critical;
+  der::Input critical;
+  if (!extension_parser.ReadOptionalTag(der::kBool, &critical, &has_critical))
+    return false;
+  if (has_critical) {
+    if (!der::ParseBool(critical, &out->critical))
+      return false;
+    if (!out->critical)
+      return false;  // DER-encoding requires DEFAULT values be omitted.
+  }
+
+  //            extnValue   OCTET STRING
+  if (!extension_parser.ReadTag(der::kOctetString, &out->value))
+    return false;
+
+  // The Extension type does not have an extension point (everything goes in
+  // extnValue).
+  if (extension_parser.HasMore())
+    return false;
+
+  // By definition the input was a single Extension sequence, so there shouldn't
+  // be unconsumed data.
+  if (parser.HasMore())
+    return false;
+
+  return true;
+}
+
 }  // namespace net
diff --git a/net/cert/internal/parse_certificate.h b/net/cert/internal/parse_certificate.h
index 0f6b0bb..7d2d826 100644
--- a/net/cert/internal/parse_certificate.h
+++ b/net/cert/internal/parse_certificate.h
@@ -214,6 +214,37 @@
   der::Input extensions_tlv;
 };
 
+// ParsedExtension represents a parsed "Extension" from RFC 5280. It contains
+// der:Inputs which are not owned so the associated data must be kept alive.
+//
+//    Extension  ::=  SEQUENCE  {
+//            extnID      OBJECT IDENTIFIER,
+//            critical    BOOLEAN DEFAULT FALSE,
+//            extnValue   OCTET STRING
+//                        -- contains the DER encoding of an ASN.1 value
+//                        -- corresponding to the extension type identified
+//                        -- by extnID
+//            }
+struct NET_EXPORT ParsedExtension {
+  der::Input oid;
+  // |value| will contain the contents of the OCTET STRING. For instance for
+  // basicConstraints it will be the TLV for a SEQUENCE.
+  der::Input value;
+  bool critical = false;
+};
+
+// Parses a DER-encoded "Extension" as specified by RFC 5280. Returns true on
+// success and sets the results in |out|.
+//
+// Note that on success |out| aliases data from the input |extension_tlv|.
+// Hence the fields of the ParsedExtension are only valid as long as
+// |extension_tlv| remains valid.
+//
+// On failure |out| has an undefined state. Some of its fields may have been
+// updated during parsing, whereas others may not have been changed.
+NET_EXPORT bool ParseExtension(const der::Input& extension_tlv,
+                               ParsedExtension* out) WARN_UNUSED_RESULT;
+
 }  // namespace net
 
 #endif  // NET_CERT_INTERNAL_PARSE_CERTIFICATE_H_
diff --git a/net/cert/internal/parse_certificate_unittest.cc b/net/cert/internal/parse_certificate_unittest.cc
index cf6da4a..99312cd 100644
--- a/net/cert/internal/parse_certificate_unittest.cc
+++ b/net/cert/internal/parse_certificate_unittest.cc
@@ -326,6 +326,71 @@
   EnsureParsingTbsFails("tbs_validity_relaxed.pem");
 }
 
+// Reads a PEM file containing a block "EXTENSION". This input will be
+// passed to ParseExtension, and the results filled in |out|.
+bool ParseExtensionFromFile(const std::string& file_name,
+                            ParsedExtension* out,
+                            std::string* data) {
+  const PemBlockMapping mappings[] = {
+      {"EXTENSION", data},
+  };
+
+  EXPECT_TRUE(ReadTestDataFromPemFile(GetFilePath(file_name), mappings));
+  return ParseExtension(InputFromString(data), out);
+}
+
+// Parses an Extension whose critical field is true (255).
+TEST(ParseExtensionTest, Critical) {
+  std::string data;
+  ParsedExtension extension;
+  ASSERT_TRUE(
+      ParseExtensionFromFile("extension_critical.pem", &extension, &data));
+
+  EXPECT_TRUE(extension.critical);
+
+  const uint8_t kExpectedOid[] = {0x55, 0x1d, 0x13};
+  EXPECT_EQ(der::Input(kExpectedOid), extension.oid);
+
+  const uint8_t kExpectedValue[] = {0x30, 0x00};
+  EXPECT_EQ(der::Input(kExpectedValue), extension.value);
+}
+
+// Parses an Extension whose critical field is false (omitted).
+TEST(ParseExtensionTest, NotCritical) {
+  std::string data;
+  ParsedExtension extension;
+  ASSERT_TRUE(
+      ParseExtensionFromFile("extension_not_critical.pem", &extension, &data));
+
+  EXPECT_FALSE(extension.critical);
+
+  const uint8_t kExpectedOid[] = {0x55, 0x1d, 0x13};
+  EXPECT_EQ(der::Input(kExpectedOid), extension.oid);
+
+  const uint8_t kExpectedValue[] = {0x30, 0x00};
+  EXPECT_EQ(der::Input(kExpectedValue), extension.value);
+}
+
+// Parses an Extension whose critical field is 0. This is in one sense FALSE,
+// however because critical has DEFAULT of false this is in fact invalid
+// DER-encoding.
+TEST(ParseExtensionTest, Critical0) {
+  std::string data;
+  ParsedExtension extension;
+  ASSERT_FALSE(
+      ParseExtensionFromFile("extension_critical_0.pem", &extension, &data));
+}
+
+// Parses an Extension whose critical field is 3. Under DER-encoding BOOLEAN
+// values must an octet of either all zero bits, or all 1 bits, so this is not
+// valid.
+TEST(ParseExtensionTest, Critical3) {
+  std::string data;
+  ParsedExtension extension;
+  ASSERT_FALSE(
+      ParseExtensionFromFile("extension_critical_3.pem", &extension, &data));
+}
+
 }  // namespace
 
 }  // namespace net
diff --git a/net/data/parse_certificate_unittest/extension_critical.pem b/net/data/parse_certificate_unittest/extension_critical.pem
new file mode 100644
index 0000000..fb105bc
--- /dev/null
+++ b/net/data/parse_certificate_unittest/extension_critical.pem
@@ -0,0 +1,12 @@
+This is a basic constraints extension, which is marked as critical.
+
+
+$ openssl asn1parse -i < [EXTENSION]
+    0:d=0  hl=2 l=  12 cons: SEQUENCE          
+    2:d=1  hl=2 l=   3 prim:  OBJECT            :X509v3 Basic Constraints
+    7:d=1  hl=2 l=   1 prim:  BOOLEAN           :255
+   10:d=1  hl=2 l=   2 prim:  OCTET STRING      [HEX DUMP]:3000
+
+-----BEGIN EXTENSION-----
+MAwGA1UdEwEB/wQCMAA=
+-----END EXTENSION-----
diff --git a/net/data/parse_certificate_unittest/extension_critical_0.pem b/net/data/parse_certificate_unittest/extension_critical_0.pem
new file mode 100644
index 0000000..a057ac54
--- /dev/null
+++ b/net/data/parse_certificate_unittest/extension_critical_0.pem
@@ -0,0 +1,15 @@
+This is a basic constraints extension, where the critical field (BOOLEAN) is 0.
+
+This is not valid because the critical field has a default of FALSE, so under
+DER-encoding it should be omitted.
+
+
+$ openssl asn1parse -i < [EXTENSION]
+    0:d=0  hl=2 l=  12 cons: SEQUENCE          
+    2:d=1  hl=2 l=   3 prim:  OBJECT            :X509v3 Basic Constraints
+    7:d=1  hl=2 l=   1 prim:  BOOLEAN           :0
+   10:d=1  hl=2 l=   2 prim:  OCTET STRING      [HEX DUMP]:3000
+
+-----BEGIN EXTENSION-----
+MAwGA1UdEwEBAAQCMAA=
+-----END EXTENSION-----
diff --git a/net/data/parse_certificate_unittest/extension_critical_3.pem b/net/data/parse_certificate_unittest/extension_critical_3.pem
new file mode 100644
index 0000000..435c8432
--- /dev/null
+++ b/net/data/parse_certificate_unittest/extension_critical_3.pem
@@ -0,0 +1,15 @@
+This is a basic constraints extension, where the critical field (BOOLEAN) is 3.
+
+This is not valid because BOOLEANs in DER-encoding should use an octet of
+either all 0 bits or all 1 bits.
+
+
+$ openssl asn1parse -i < [EXTENSION]
+    0:d=0  hl=2 l=  12 cons: SEQUENCE          
+    2:d=1  hl=2 l=   3 prim:  OBJECT            :X509v3 Basic Constraints
+    7:d=1  hl=2 l=   1 prim:  BOOLEAN           :3
+   10:d=1  hl=2 l=   2 prim:  OCTET STRING      [HEX DUMP]:3000
+
+-----BEGIN EXTENSION-----
+MAwGA1UdEwEBAwQCMAA=
+-----END EXTENSION-----
diff --git a/net/data/parse_certificate_unittest/extension_not_critical.pem b/net/data/parse_certificate_unittest/extension_not_critical.pem
new file mode 100644
index 0000000..0c84535
--- /dev/null
+++ b/net/data/parse_certificate_unittest/extension_not_critical.pem
@@ -0,0 +1,12 @@
+This is a modified basic constraints extension, where the critical field was
+removed (in other words, FALSE).
+
+
+$ openssl asn1parse -i < [EXTENSION]
+    0:d=0  hl=2 l=   9 cons: SEQUENCE          
+    2:d=1  hl=2 l=   3 prim:  OBJECT            :X509v3 Basic Constraints
+    7:d=1  hl=2 l=   2 prim:  OCTET STRING      [HEX DUMP]:3000
+
+-----BEGIN EXTENSION-----
+MAkGA1UdEwQCMAA=
+-----END EXTENSION-----
diff --git a/net/http/http_auth_gssapi_posix.cc b/net/http/http_auth_gssapi_posix.cc
index 0b87b33..5fc1690 100644
--- a/net/http/http_auth_gssapi_posix.cc
+++ b/net/http/http_auth_gssapi_posix.cc
@@ -430,8 +430,7 @@
   } else {
     static const char* const kDefaultLibraryNames[] = {
 #if defined(OS_MACOSX)
-      // This library is provided by Kerberos.framework.
-      "libgssapi_krb5.dylib"
+      "/System/Library/Frameworks/Kerberos.framework/Kerberos"
 #elif defined(OS_OPENBSD)
       "libgssapi.so"          // Heimdal - OpenBSD
 #else
@@ -452,12 +451,16 @@
     // TODO(asanka): Move library loading to a separate thread.
     //               http://crbug.com/66702
     base::ThreadRestrictions::ScopedAllowIO allow_io_temporarily;
-    base::NativeLibrary lib = base::LoadNativeLibrary(file_path, NULL);
+    base::NativeLibraryLoadError load_error;
+    base::NativeLibrary lib = base::LoadNativeLibrary(file_path, &load_error);
     if (lib) {
       // Only return this library if we can bind the functions we need.
       if (BindMethods(lib))
         return lib;
       base::UnloadNativeLibrary(lib);
+    } else {
+      // If this is the only library available, log the reason for failure.
+      LOG_IF(WARNING, num_lib_names == 1) << load_error.ToString();
     }
   }
   LOG(WARNING) << "Unable to find a compatible GSSAPI library";
diff --git a/net/http/transport_security_state.cc b/net/http/transport_security_state.cc
index a2dbd16..2404db02 100644
--- a/net/http/transport_security_state.cc
+++ b/net/http/transport_security_state.cc
@@ -29,7 +29,6 @@
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/time/time.h"
 #include "base/values.h"
 #include "crypto/sha2.h"
 #include "net/base/host_port_pair.h"
@@ -50,6 +49,10 @@
 
 #include "net/http/transport_security_state_static.h"
 
+const size_t kMaxHPKPReportCacheEntries = 50;
+const int kTimeToRememberHPKPReportsMins = 60;
+const size_t kReportCacheKeyLength = 16;
+
 std::string TimeToISO8601(const base::Time& t) {
   base::Time::Exploded exploded;
   t.UTCExplode(&exploded);
@@ -73,23 +76,34 @@
   return result.Pass();
 }
 
+bool HashReportForCache(const base::DictionaryValue& report,
+                        const GURL& report_uri,
+                        std::string* cache_key) {
+  char hashed[crypto::kSHA256Length];
+  std::string to_hash;
+  if (!base::JSONWriter::Write(report, &to_hash))
+    return false;
+  to_hash += "," + report_uri.spec();
+  crypto::SHA256HashString(to_hash, hashed, sizeof(hashed));
+  static_assert(kReportCacheKeyLength <= sizeof(hashed),
+                "HPKP report cache key size is larger than hash size.");
+  *cache_key = std::string(hashed, kReportCacheKeyLength);
+  return true;
+}
+
 bool GetHPKPReport(const HostPortPair& host_port_pair,
                    const TransportSecurityState::PKPState& pkp_state,
                    const X509Certificate* served_certificate_chain,
                    const X509Certificate* validated_certificate_chain,
-                   std::string* serialized_report) {
-  // TODO(estark): keep track of reports already sent and rate-limit,
-  // break loops
+                   std::string* serialized_report,
+                   std::string* cache_key) {
   if (pkp_state.report_uri.is_empty())
     return false;
 
   base::DictionaryValue report;
   base::Time now = base::Time::Now();
-  report.SetString("date-time", TimeToISO8601(now));
   report.SetString("hostname", host_port_pair.host());
   report.SetInteger("port", host_port_pair.port());
-  report.SetString("effective-expiration-date",
-                   TimeToISO8601(pkp_state.expiry));
   report.SetBoolean("include-subdomains", pkp_state.include_subdomains);
   report.SetString("noted-hostname", pkp_state.domain);
 
@@ -127,6 +141,18 @@
 
   report.Set("known-pins", known_pin_list.Pass());
 
+  // For the sent reports cache, do not include the effective expiration
+  // date. The expiration date will likely change every time the user
+  // visits the site, so it would prevent reports from being effectively
+  // deduplicated.
+  if (!HashReportForCache(report, pkp_state.report_uri, cache_key)) {
+    LOG(ERROR) << "Failed to compute cache key for HPKP violation report.";
+    return false;
+  }
+
+  report.SetString("date-time", TimeToISO8601(now));
+  report.SetString("effective-expiration-date",
+                   TimeToISO8601(pkp_state.expiry));
   if (!base::JSONWriter::Write(report, serialized_report)) {
     LOG(ERROR) << "Failed to serialize HPKP violation report.";
     return false;
@@ -145,42 +171,6 @@
           !report_uri.SchemeIsCryptographic());
 }
 
-bool CheckPinsAndMaybeSendReport(
-    const HostPortPair& host_port_pair,
-    const TransportSecurityState::PKPState& pkp_state,
-    const HashValueVector& hashes,
-    const X509Certificate* served_certificate_chain,
-    const X509Certificate* validated_certificate_chain,
-    const TransportSecurityState::PublicKeyPinReportStatus report_status,
-    TransportSecurityState::ReportSender* report_sender,
-    std::string* failure_log) {
-  if (pkp_state.CheckPublicKeyPins(hashes, failure_log))
-    return true;
-
-  if (!report_sender ||
-      report_status != TransportSecurityState::ENABLE_PIN_REPORTS ||
-      pkp_state.report_uri.is_empty()) {
-    return false;
-  }
-
-  DCHECK(pkp_state.report_uri.is_valid());
-  // Report URIs should not be used if they are the same host as the pin
-  // and are HTTPS, to avoid going into a report-sending loop.
-  if (!IsReportUriValidForHost(pkp_state.report_uri, host_port_pair.host()))
-    return false;
-
-  std::string serialized_report;
-
-  if (!GetHPKPReport(host_port_pair, pkp_state, served_certificate_chain,
-                     validated_certificate_chain, &serialized_report)) {
-    return false;
-  }
-
-  report_sender->Send(pkp_state.report_uri, serialized_report);
-
-  return false;
-}
-
 std::string HashesToBase64String(const HashValueVector& hashes) {
   std::string str;
   for (size_t i = 0; i != hashes.size(); ++i) {
@@ -606,7 +596,10 @@
 }  // namespace
 
 TransportSecurityState::TransportSecurityState()
-    : delegate_(nullptr), report_sender_(nullptr), enable_static_pins_(true) {
+    : delegate_(nullptr),
+      report_sender_(nullptr),
+      enable_static_pins_(true),
+      sent_reports_cache_(kMaxHPKPReportCacheEntries) {
 // Static pinning is only enabled for official builds to make sure that
 // others don't end up with pins that cannot be easily updated.
 #if !defined(OFFICIAL_BUILD) || defined(OS_ANDROID) || defined(OS_IOS)
@@ -782,6 +775,53 @@
   DirtyNotify();
 }
 
+bool TransportSecurityState::CheckPinsAndMaybeSendReport(
+    const HostPortPair& host_port_pair,
+    const TransportSecurityState::PKPState& pkp_state,
+    const HashValueVector& hashes,
+    const X509Certificate* served_certificate_chain,
+    const X509Certificate* validated_certificate_chain,
+    const TransportSecurityState::PublicKeyPinReportStatus report_status,
+    std::string* failure_log) {
+  if (pkp_state.CheckPublicKeyPins(hashes, failure_log))
+    return true;
+
+  if (!report_sender_ ||
+      report_status != TransportSecurityState::ENABLE_PIN_REPORTS ||
+      pkp_state.report_uri.is_empty()) {
+    return false;
+  }
+
+  DCHECK(pkp_state.report_uri.is_valid());
+  // Report URIs should not be used if they are the same host as the pin
+  // and are HTTPS, to avoid going into a report-sending loop.
+  if (!IsReportUriValidForHost(pkp_state.report_uri, host_port_pair.host()))
+    return false;
+
+  std::string serialized_report;
+  std::string report_cache_key;
+  if (!GetHPKPReport(host_port_pair, pkp_state, served_certificate_chain,
+                     validated_certificate_chain, &serialized_report,
+                     &report_cache_key)) {
+    return false;
+  }
+
+  // Limit the rate at which duplicate reports are sent to the same
+  // report URI. The same report will not be sent within
+  // |kTimeToRememberHPKPReportsMins|, which reduces load on servers and
+  // also prevents accidental loops (a.com triggers a report to b.com
+  // which triggers a report to a.com). See section 2.1.4 of RFC 7469.
+  if (sent_reports_cache_.Get(report_cache_key, base::TimeTicks::Now()))
+    return false;
+  sent_reports_cache_.Put(
+      report_cache_key, true, base::TimeTicks::Now(),
+      base::TimeTicks::Now() +
+          base::TimeDelta::FromMinutes(kTimeToRememberHPKPReportsMins));
+
+  report_sender_->Send(pkp_state.report_uri, serialized_report);
+  return false;
+}
+
 bool TransportSecurityState::DeleteDynamicDataForHost(const std::string& host) {
   DCHECK(CalledOnValidThread());
 
@@ -951,7 +991,7 @@
   CheckPinsAndMaybeSendReport(
       host_port_pair, pkp_state, ssl_info.public_key_hashes,
       ssl_info.unverified_cert.get(), ssl_info.cert.get(), ENABLE_PIN_REPORTS,
-      report_sender_, &unused_failure_log);
+      &unused_failure_log);
   return true;
 }
 
@@ -1004,7 +1044,7 @@
 
   return CheckPinsAndMaybeSendReport(
       host_port_pair, pkp_state, hashes, served_certificate_chain,
-      validated_certificate_chain, report_status, report_sender_, failure_log);
+      validated_certificate_chain, report_status, failure_log);
 }
 
 bool TransportSecurityState::GetStaticDomainState(const std::string& host,
diff --git a/net/http/transport_security_state.h b/net/http/transport_security_state.h
index 554326a8..d46993b 100644
--- a/net/http/transport_security_state.h
+++ b/net/http/transport_security_state.h
@@ -15,6 +15,7 @@
 #include "base/gtest_prod_util.h"
 #include "base/threading/non_thread_safe.h"
 #include "base/time/time.h"
+#include "net/base/expiring_cache.h"
 #include "net/base/net_export.h"
 #include "net/cert/x509_cert_types.h"
 #include "net/cert/x509_certificate.h"
@@ -368,6 +369,22 @@
   void EnableSTSHost(const std::string& host, const STSState& state);
   void EnablePKPHost(const std::string& host, const PKPState& state);
 
+  // Returns true if a request to |host_port_pair| with the given
+  // SubjectPublicKeyInfo |hashes| satisfies the pins in |pkp_state|,
+  // and false otherwise. If a violation is found and reporting is
+  // configured (i.e. there is a report URI in |pkp_state| and
+  // |report_status| says to), this method sends an HPKP violation
+  // report containing |served_certificate_chain| and
+  // |validated_certificate_chain|.
+  bool CheckPinsAndMaybeSendReport(
+      const HostPortPair& host_port_pair,
+      const TransportSecurityState::PKPState& pkp_state,
+      const HashValueVector& hashes,
+      const X509Certificate* served_certificate_chain,
+      const X509Certificate* validated_certificate_chain,
+      const TransportSecurityState::PublicKeyPinReportStatus report_status,
+      std::string* failure_log);
+
   // The sets of hosts that have enabled TransportSecurity. |domain| will always
   // be empty for a STSState or PKPState in these maps; the domain
   // comes from the map keys instead. In addition, |upgrade_mode| in the
@@ -383,6 +400,11 @@
   // True if static pins should be used.
   bool enable_static_pins_;
 
+  // Keeps track of reports that have been sent recently for
+  // rate-limiting.
+  ExpiringCache<std::string, bool, base::TimeTicks, std::less<base::TimeTicks>>
+      sent_reports_cache_;
+
   DISALLOW_COPY_AND_ASSIGN(TransportSecurityState);
 };
 
diff --git a/net/http/transport_security_state_static.h b/net/http/transport_security_state_static.h
index 45da2ec10..2a2f63e2 100644
--- a/net/http/transport_security_state_static.h
+++ b/net/http/transport_security_state_static.h
@@ -698,8 +698,8 @@
 // it's a pointer to the n'th element of the array.
 static const uint8 kHSTSHuffmanTree[] = {
     0xf0, 0xe4, 0x00, 0xf2, 0x01, 0x80, 0xe6, 0xae, 0x03, 0xed, 0xe9, 0x04,
-    0xb3, 0xf1, 0xb9, 0xb5, 0xb8, 0x07, 0xb4, 0x08, 0x06, 0x09, 0xb1, 0xb0,
-    0xb6, 0xb7, 0x0c, 0xb2, 0x0b, 0x0d, 0x0e, 0xea, 0x0a, 0x0f, 0x10, 0xf7,
+    0xb2, 0xf1, 0xb9, 0xb5, 0xb8, 0x07, 0xb4, 0x08, 0x06, 0x09, 0xb0, 0xb1,
+    0xb6, 0xb7, 0x0c, 0xb3, 0x0b, 0x0d, 0x0e, 0xea, 0x0a, 0x0f, 0x10, 0xf7,
     0x11, 0xe7, 0x12, 0xef, 0x05, 0x13, 0x02, 0x14, 0xeb, 0xe2, 0xe3, 0x16,
     0xe1, 0x17, 0x18, 0xff, 0xfa, 0xf8, 0xf6, 0x1a, 0x1b, 0xe8, 0xf3, 0x1c,
     0xe5, 0x1d, 0xec, 0xee, 0xad, 0xf9, 0x20, 0xf5, 0xf4, 0x21, 0x1f, 0x22,
@@ -714,2926 +714,3065 @@
     0x0b, 0xf4, 0xeb, 0xb3, 0x47, 0x5e, 0x77, 0x69, 0xa2, 0x2d, 0xa9, 0x22,
     0x1b, 0x12, 0x9a, 0x2b, 0x77, 0x34, 0x75, 0x70, 0xf1, 0x74, 0x5f, 0x7f,
     0xfe, 0xfd, 0xfb, 0x83, 0xce, 0x66, 0xf2, 0xf2, 0x2c, 0xeb, 0xd8, 0xd8,
-    0x3a, 0xfe, 0x08, 0xc3, 0x57, 0xf9, 0xd7, 0xf4, 0x6e, 0x1e, 0x3c, 0x8e,
-    0xbf, 0xe6, 0x45, 0x34, 0x83, 0xbc, 0x8e, 0xbc, 0x14, 0x9c, 0xea, 0x43,
-    0xd4, 0x73, 0x8b, 0xff, 0x9b, 0xc8, 0x52, 0x07, 0xcc, 0x33, 0x0c, 0xc4,
-    0x1d, 0x7f, 0x93, 0xa3, 0xfb, 0xa8, 0xd3, 0xaa, 0x11, 0x0d, 0x8a, 0x77,
-    0xff, 0x90, 0x46, 0x37, 0xfb, 0x9c, 0xd6, 0x32, 0x75, 0xd9, 0xb9, 0x56,
-    0x82, 0xac, 0x0e, 0x1a, 0x50, 0x0b, 0x5f, 0xef, 0x67, 0x00, 0xb4, 0xd1,
-    0x4a, 0x9a, 0x7b, 0xfa, 0x5d, 0x4d, 0x99, 0x31, 0xd5, 0x07, 0xe4, 0xe8,
-    0x77, 0xf7, 0x51, 0xb0, 0xb4, 0x3a, 0xff, 0x40, 0x27, 0x79, 0x43, 0x19,
-    0xd6, 0x18, 0x3e, 0x01, 0x2b, 0xb2, 0xac, 0x42, 0xec, 0x63, 0x0e, 0x17,
-    0x88, 0x4c, 0x4e, 0x5d, 0x90, 0xfc, 0x50, 0x89, 0xaa, 0xa8, 0x35, 0x31,
-    0x6f, 0x61, 0x02, 0x30, 0xa6, 0xd1, 0x0e, 0xdc, 0x61, 0x1f, 0x61, 0x01,
-    0x7f, 0xff, 0xf3, 0xad, 0x54, 0xe7, 0x3f, 0xe7, 0x20, 0x71, 0x44, 0xef,
-    0x73, 0xe9, 0xd7, 0xff, 0x98, 0x65, 0x19, 0x63, 0x9c, 0x2c, 0x2f, 0x9f,
-    0x3b, 0xb6, 0x75, 0xfb, 0x8d, 0x77, 0x69, 0xa2, 0xa2, 0xbf, 0x47, 0x73,
-    0x98, 0x75, 0xff, 0xf8, 0x12, 0x9d, 0x86, 0x86, 0x04, 0xed, 0xe7, 0xcf,
-    0x9d, 0xdb, 0x3a, 0xff, 0xfc, 0xf2, 0x18, 0xd6, 0x6e, 0xd1, 0x7c, 0xdd,
-    0xa7, 0x59, 0x59, 0x26, 0xed, 0x8c, 0x4d, 0x33, 0xe9, 0x2e, 0xc6, 0x9b,
-    0xff, 0x07, 0x16, 0xae, 0xde, 0x0a, 0x78, 0xeb, 0xd8, 0xce, 0x1d, 0x7f,
-    0xb3, 0x27, 0x0c, 0x60, 0x4e, 0xbd, 0xd8, 0x09, 0xd7, 0xfa, 0x21, 0x04,
-    0x7f, 0x63, 0x3a, 0xe7, 0xfc, 0xeb, 0xee, 0xa7, 0x55, 0x62, 0xd1, 0x60,
-    0xa0, 0xdc, 0xc6, 0x3d, 0x1b, 0x64, 0xce, 0xfd, 0xc6, 0xbb, 0xb4, 0xd1,
-    0x5e, 0xdf, 0x93, 0x69, 0xbf, 0xce, 0x75, 0xd1, 0x23, 0xae, 0x80, 0x1d,
-    0x65, 0x71, 0x11, 0x3c, 0x33, 0x72, 0xc0, 0x0a, 0xdf, 0xfc, 0xab, 0xc9,
-    0x5c, 0xe3, 0x5d, 0xda, 0x68, 0x91, 0xaf, 0xff, 0x2a, 0xb7, 0x92, 0xb9,
-    0xc6, 0xbb, 0xb4, 0xd1, 0x3c, 0x5f, 0xfe, 0x55, 0x6f, 0x25, 0x73, 0x8d,
-    0x77, 0x69, 0xa2, 0x7f, 0xbf, 0xfc, 0xaa, 0xde, 0x4a, 0xe7, 0x1a, 0xee,
-    0xd3, 0x45, 0x0d, 0x7f, 0xf2, 0xde, 0x4a, 0xe7, 0x1a, 0xee, 0xd3, 0x45,
-    0x11, 0x7f, 0xe9, 0x2b, 0xfe, 0xbe, 0x46, 0xa2, 0x47, 0x52, 0xa8, 0x92,
-    0x85, 0x0b, 0xff, 0x4c, 0x9d, 0xdf, 0x3c, 0x1c, 0x59, 0xd7, 0xfe, 0x17,
-    0x57, 0xc3, 0xfb, 0xcb, 0x47, 0x5f, 0xb8, 0xd7, 0x76, 0x9a, 0x29, 0x1b,
-    0xff, 0xbb, 0xb1, 0xf9, 0xa7, 0xee, 0xa2, 0x73, 0xaf, 0xfe, 0x7d, 0xf5,
-    0xd6, 0x60, 0x1f, 0x3e, 0xac, 0xeb, 0xfe, 0x89, 0x47, 0x27, 0x8e, 0x4e,
-    0x75, 0xe7, 0x92, 0xb8, 0x8f, 0xc7, 0x33, 0x02, 0x30, 0xa5, 0x5f, 0xd2,
-    0xce, 0xf5, 0xe4, 0x75, 0xff, 0xfd, 0x81, 0xec, 0x7d, 0x57, 0xc2, 0xe0,
-    0xd6, 0xa0, 0x05, 0x59, 0x58, 0x54, 0x9a, 0xd3, 0xf5, 0xc6, 0x75, 0xe4,
-    0xcd, 0xb2, 0xcb, 0xe6, 0xbb, 0xb4, 0xd1, 0x28, 0x5f, 0xfa, 0x00, 0xb7,
-    0x97, 0x61, 0xf8, 0x75, 0x70, 0xfa, 0x44, 0xb6, 0xff, 0xf0, 0xbf, 0xb5,
-    0xf4, 0x7f, 0x90, 0xe2, 0xce, 0xbe, 0x55, 0xe4, 0xae, 0x1f, 0x5a, 0xc8,
-    0x6a, 0x76, 0xc3, 0x96, 0x53, 0xb9, 0x61, 0x87, 0xbb, 0x63, 0xea, 0x45,
-    0x36, 0x38, 0x78, 0x72, 0x1e, 0x6b, 0x42, 0xea, 0x88, 0x15, 0xd8, 0x2a,
-    0xfa, 0x87, 0x4f, 0xf2, 0x9c, 0x36, 0xa3, 0x2f, 0xbf, 0xfc, 0xaa, 0xde,
-    0x4a, 0xe7, 0x1a, 0xee, 0xd3, 0x44, 0xe7, 0x7f, 0xf9, 0x55, 0xbc, 0x95,
-    0xce, 0x35, 0xdd, 0xa6, 0x8a, 0x26, 0xff, 0xbf, 0x7e, 0x49, 0x8a, 0x6c,
-    0x02, 0x1d, 0x7f, 0x26, 0xa6, 0x92, 0x00, 0xeb, 0xfd, 0x13, 0xfd, 0xdb,
-    0x71, 0x01, 0xd7, 0xb9, 0x25, 0x42, 0x8a, 0x5e, 0xa0, 0xfd, 0x2d, 0xae,
-    0x27, 0x31, 0xa5, 0x7f, 0xe1, 0xf9, 0x7e, 0xe3, 0x5d, 0xda, 0x68, 0x87,
-    0x2f, 0xef, 0xdb, 0xc4, 0x81, 0x3a, 0xca, 0xe1, 0xef, 0xf4, 0xce, 0xff,
-    0xa3, 0x98, 0xde, 0xc6, 0xf2, 0x3a, 0xf9, 0xae, 0xed, 0x34, 0x45, 0xf7,
-    0xec, 0x9a, 0x4f, 0xa3, 0xab, 0x87, 0xa9, 0xf4, 0xb6, 0xff, 0x6b, 0x03,
-    0xdc, 0x03, 0x9d, 0x70, 0xce, 0x75, 0xff, 0x78, 0x61, 0x7f, 0x43, 0xd8,
-    0x3a, 0xa0, 0xf3, 0xd0, 0x5a, 0xed, 0x6e, 0x75, 0xf7, 0xa5, 0x0a, 0x15,
-    0x4b, 0x37, 0x2e, 0x2f, 0x7e, 0x79, 0xfd, 0x9d, 0x3a, 0xca, 0xce, 0x9e,
-    0x86, 0x42, 0x32, 0x62, 0x4e, 0xc2, 0x00, 0x56, 0x76, 0xc8, 0x2f, 0xff,
-    0xff, 0x85, 0xd5, 0xcf, 0xd8, 0x28, 0xa2, 0x7b, 0xb8, 0x92, 0xd7, 0xcc,
-    0x52, 0x24, 0x75, 0xff, 0x9e, 0x4a, 0xe7, 0x1a, 0xee, 0xd3, 0x44, 0xc9,
-    0x65, 0x5a, 0x8c, 0xd5, 0xc2, 0x0e, 0xf7, 0xb1, 0x67, 0x5d, 0xd5, 0x9d,
-    0x7e, 0xe3, 0x5d, 0xda, 0x68, 0xb7, 0xac, 0xac, 0x1f, 0x20, 0x46, 0xf0,
-    0x5a, 0xff, 0xf2, 0xab, 0x79, 0x2b, 0x9c, 0x6b, 0xbb, 0x4d, 0x14, 0x9d,
-    0xcc, 0x4b, 0x00, 0xeb, 0xfb, 0x3c, 0x31, 0x0b, 0x3a, 0xfe, 0xdc, 0x1f,
-    0x78, 0xe0, 0x3a, 0xee, 0xaa, 0xc5, 0x9f, 0xcf, 0x47, 0xdc, 0xaa, 0xa1,
-    0x74, 0x22, 0x51, 0xfc, 0x64, 0x67, 0x3a, 0x84, 0x9e, 0xc3, 0x4f, 0xb0,
-    0xd0, 0xbf, 0xca, 0xe7, 0x1a, 0xee, 0xd3, 0x44, 0x3b, 0x7e, 0xe3, 0x5d,
-    0xda, 0x68, 0x96, 0x2f, 0xb0, 0x0b, 0x43, 0xaf, 0xca, 0xad, 0xe4, 0xae,
-    0x1e, 0x9e, 0xd9, 0x9d, 0xfe, 0x57, 0x38, 0xd7, 0x76, 0x9a, 0x23, 0x0b,
-    0xe5, 0x65, 0x9a, 0x3a, 0xff, 0xff, 0xa5, 0xa5, 0x5b, 0xd7, 0x99, 0xbd,
-    0xce, 0x31, 0x1d, 0x99, 0x7a, 0x3a, 0xfd, 0x9e, 0x04, 0x34, 0xeb, 0xff,
-    0xd1, 0xe4, 0x04, 0x48, 0x3d, 0x81, 0x69, 0xd7, 0xee, 0x35, 0xdd, 0xa6,
-    0x88, 0xf6, 0xfb, 0x4f, 0xbe, 0xc3, 0xae, 0x92, 0xb8, 0x7a, 0xfe, 0x33,
-    0xbf, 0xff, 0x9d, 0x51, 0xff, 0x3b, 0x82, 0x0c, 0x1f, 0x77, 0x0e, 0xb2,
-    0xbb, 0xa7, 0x75, 0x33, 0x87, 0x09, 0x9e, 0x13, 0xc2, 0x5d, 0x7e, 0xe3,
-    0x5d, 0xda, 0x68, 0xb0, 0xef, 0xf4, 0x86, 0x33, 0x58, 0x27, 0x59, 0x5c,
-    0x3e, 0x2d, 0xcc, 0xef, 0xff, 0xff, 0x47, 0x06, 0x23, 0x4a, 0xf8, 0x28,
-    0xbd, 0xe5, 0xad, 0xe5, 0x9c, 0x9c, 0xeb, 0xfc, 0xae, 0x71, 0xae, 0xed,
-    0x34, 0x5c, 0xf7, 0xff, 0xff, 0xff, 0x43, 0x0f, 0x94, 0xed, 0xef, 0xcf,
-    0x9d, 0xdb, 0x56, 0x7f, 0xd4, 0x61, 0xd0, 0xc5, 0xef, 0x3c, 0xed, 0x5f,
-    0xcf, 0x9d, 0xdb, 0x3a, 0xa1, 0x75, 0x5a, 0x78, 0x49, 0x49, 0x0d, 0xa7,
-    0xe9, 0x1e, 0xe2, 0xe1, 0x73, 0xd2, 0x9f, 0x3d, 0x6d, 0x1f, 0xdf, 0xe5,
-    0x73, 0x8d, 0x77, 0x69, 0xa2, 0x1e, 0xbe, 0x6b, 0xbb, 0x4d, 0x11, 0x35,
-    0xfd, 0x9b, 0x5f, 0xaf, 0x02, 0x75, 0xfe, 0xf7, 0xef, 0xbf, 0x63, 0x61,
-    0xd5, 0xc4, 0x49, 0x89, 0x6f, 0x8c, 0x2f, 0xe4, 0x06, 0xbe, 0x60, 0x4e,
-    0xbf, 0xff, 0x47, 0x01, 0xd8, 0xd9, 0x34, 0x42, 0xf5, 0x81, 0x3a, 0xff,
-    0xbb, 0xd8, 0xd9, 0x2c, 0xe4, 0x1d, 0x6f, 0x75, 0x11, 0xee, 0xad, 0x7f,
-    0xc9, 0xe4, 0xf6, 0x02, 0x38, 0x75, 0x61, 0xef, 0x39, 0x45, 0xff, 0xfd,
-    0xee, 0xc7, 0x01, 0xac, 0x0f, 0xbf, 0x76, 0xe7, 0x0e, 0xbb, 0xcb, 0x3a,
-    0xff, 0xf6, 0x77, 0xec, 0xfa, 0x84, 0xdf, 0xd0, 0xb3, 0xaf, 0xfd, 0x3c,
-    0x4b, 0xee, 0x73, 0x58, 0xc9, 0xd5, 0x88, 0xfe, 0xdd, 0x6f, 0xa2, 0xdf,
-    0xa6, 0x5f, 0x7b, 0xf7, 0xfa, 0x68, 0x85, 0xef, 0xdd, 0xc9, 0xff, 0x13,
-    0xaf, 0x9f, 0x91, 0xb0, 0xea, 0x09, 0xe5, 0x00, 0xa2, 0xca, 0xe2, 0xb4,
-    0x3e, 0x17, 0xf6, 0x31, 0xbd, 0x46, 0x3d, 0xf9, 0xf6, 0xc7, 0xbb, 0xff,
-    0x73, 0xf9, 0xf3, 0xb3, 0x0c, 0x04, 0xeb, 0xba, 0xe7, 0x5b, 0xf3, 0xab,
-    0x0d, 0x36, 0x85, 0x6f, 0x03, 0x4a, 0xc2, 0x21, 0xbc, 0xcd, 0x7f, 0xfd,
-    0x89, 0x2d, 0x2b, 0x9b, 0xc9, 0xe7, 0xfa, 0xd3, 0xaa, 0x11, 0x11, 0xd3,
-    0x5b, 0xf3, 0x11, 0xa4, 0x9d, 0x8b, 0x3a, 0xfe, 0x62, 0x7e, 0xf7, 0xb9,
-    0x39, 0xd6, 0xe9, 0xd4, 0xc4, 0x9e, 0x2f, 0xe6, 0xb7, 0xc1, 0xc1, 0x98,
-    0xeb, 0x93, 0xc7, 0x5b, 0xc8, 0x6d, 0xba, 0x43, 0x7f, 0xb7, 0xf6, 0xf2,
-    0xfc, 0x54, 0x3a, 0xff, 0xd1, 0x30, 0xe6, 0xc7, 0x5a, 0xd0, 0xea, 0x73,
-    0xf5, 0xfc, 0xde, 0xff, 0xff, 0xee, 0xfe, 0x14, 0xce, 0x4c, 0x39, 0xb3,
-    0xb8, 0x18, 0xd6, 0xa1, 0x43, 0xaf, 0xff, 0x24, 0xd2, 0xcd, 0xe5, 0xf1,
-    0x6e, 0xe2, 0x75, 0xcf, 0xb4, 0x75, 0x98, 0xbc, 0x4e, 0x51, 0x48, 0x4d,
-    0xb4, 0x8b, 0xae, 0x8e, 0x97, 0x76, 0xda, 0x87, 0x5f, 0xba, 0xfe, 0x79,
-    0x1d, 0x7f, 0x27, 0x07, 0x33, 0x87, 0x5f, 0xe9, 0x6a, 0x34, 0xc5, 0x58,
-    0x96, 0x24, 0xeb, 0xff, 0x97, 0xf3, 0x43, 0x9b, 0xc8, 0x5e, 0x73, 0xaf,
-    0x69, 0x00, 0x75, 0x61, 0xf0, 0xa2, 0x35, 0xe6, 0x59, 0x64, 0xab, 0xf3,
-    0x8f, 0xbb, 0x85, 0x2a, 0x5f, 0xdf, 0x9f, 0xd3, 0x67, 0x8e, 0xa0, 0xa2,
-    0x6c, 0x07, 0xe2, 0x6b, 0x7e, 0xe8, 0xb1, 0x4d, 0xbd, 0xa3, 0xae, 0x77,
-    0x3a, 0xdd, 0x43, 0xc7, 0x73, 0x3b, 0xff, 0x80, 0x93, 0x7c, 0xec, 0x27,
-    0x3f, 0x63, 0x3a, 0xfe, 0x1f, 0xfc, 0x93, 0xc1, 0xd7, 0xfe, 0x45, 0x20,
-    0x63, 0x50, 0x8b, 0x3a, 0xfe, 0xcd, 0x9f, 0xcb, 0x34, 0x75, 0xf6, 0x07,
-    0x27, 0x3a, 0xf9, 0x8f, 0xe4, 0x31, 0x07, 0x5d, 0xc8, 0x3a, 0xb1, 0x5b,
-    0x6b, 0x49, 0xb7, 0x2a, 0x48, 0xcf, 0xd8, 0xdd, 0xa6, 0x26, 0x5a, 0x57,
-    0x4b, 0x44, 0xef, 0xc5, 0xfb, 0x08, 0x76, 0x8a, 0xef, 0xcc, 0xc6, 0x05,
-    0x0e, 0xbd, 0xff, 0xb4, 0x75, 0xff, 0xff, 0xff, 0x6b, 0xe7, 0x72, 0x78,
-    0x67, 0x79, 0x6b, 0xe7, 0xed, 0xe7, 0x23, 0xe4, 0xca, 0x6f, 0xf3, 0xe7,
-    0x76, 0xce, 0xac, 0x47, 0x73, 0x49, 0xbc, 0x3b, 0x77, 0xe0, 0x3a, 0xed,
-    0xb6, 0x24, 0xeb, 0xdf, 0x24, 0xd3, 0xaa, 0x0f, 0x4d, 0x41, 0x75, 0x8f,
-    0x5f, 0xff, 0xdc, 0xf8, 0x39, 0xb3, 0x39, 0x2f, 0x90, 0x17, 0x9b, 0x47,
-    0x5f, 0xff, 0xfc, 0x3b, 0xc2, 0x83, 0x81, 0xea, 0x4d, 0xf3, 0x59, 0xbc,
-    0xb9, 0x8c, 0x9d, 0x58, 0x8d, 0x61, 0x60, 0xbe, 0xf7, 0xf1, 0x39, 0xd7,
-    0xfa, 0x59, 0xdc, 0x5c, 0x34, 0xea, 0x43, 0xd4, 0xf1, 0x1d, 0xff, 0xfd,
-    0xbc, 0xb4, 0xbc, 0x1f, 0x9b, 0x49, 0xd9, 0xd3, 0x38, 0x75, 0x98, 0xce,
-    0xac, 0x3f, 0x36, 0xb0, 0x5f, 0xff, 0xf9, 0x9f, 0x83, 0x8d, 0xea, 0x0e,
-    0x7f, 0xbf, 0xbe, 0x3b, 0x38, 0xa1, 0xd7, 0xf9, 0x40, 0xff, 0x1d, 0x18,
-    0x3a, 0xff, 0x6f, 0x2d, 0x29, 0xfc, 0x6e, 0x75, 0xfe, 0x76, 0x7f, 0x9a,
-    0x3c, 0xe7, 0x54, 0x26, 0x21, 0x8e, 0x48, 0x66, 0x26, 0xf7, 0xfe, 0x8d,
-    0x0e, 0x6c, 0xf9, 0x25, 0xc8, 0xeb, 0xe0, 0x79, 0x27, 0x3a, 0xff, 0x7b,
-    0xa8, 0x20, 0xfa, 0xb3, 0xaf, 0xf4, 0xf0, 0xb1, 0x8d, 0xc0, 0x75, 0xa2,
-    0x47, 0xce, 0xe6, 0x97, 0xff, 0x3f, 0x25, 0xf3, 0xc3, 0x12, 0xcf, 0x1d,
-    0x50, 0xae, 0xa3, 0x1d, 0x52, 0x12, 0x9c, 0x8c, 0xc7, 0xa7, 0x4e, 0x82,
-    0x30, 0x89, 0xfc, 0x9a, 0xff, 0xfb, 0x89, 0xfb, 0x06, 0x3e, 0x6b, 0xf0,
-    0x2f, 0x3c, 0x75, 0xdf, 0xc8, 0xeb, 0xf4, 0x03, 0x53, 0xf8, 0xeb, 0xcf,
-    0xed, 0x1d, 0x77, 0xf3, 0x9d, 0x78, 0x7d, 0x34, 0x8d, 0x9f, 0x06, 0xef,
-    0xef, 0xdb, 0xf0, 0x3b, 0xb2, 0x75, 0x41, 0xf3, 0x21, 0x9d, 0xfe, 0xe4,
-    0x06, 0x3b, 0x12, 0x3a, 0xff, 0xfa, 0x3d, 0xf0, 0x7f, 0xda, 0xf9, 0x9e,
-    0xdb, 0xcf, 0x1d, 0x48, 0x88, 0xaf, 0xcc, 0x6f, 0xfe, 0xec, 0x29, 0xf3,
-    0xc2, 0xfe, 0x8f, 0x1d, 0x7f, 0xbe, 0x6f, 0x24, 0xef, 0xeb, 0x3a, 0x80,
-    0x7f, 0x82, 0x8b, 0x7f, 0xf6, 0x6c, 0xc0, 0xfc, 0xf2, 0x88, 0xce, 0x8e,
-    0xbf, 0xf7, 0x26, 0xf9, 0xa8, 0x49, 0xdf, 0xc7, 0x54, 0x22, 0xac, 0x24,
-    0x3f, 0xa4, 0xdc, 0xe0, 0x3a, 0xff, 0xfb, 0xe0, 0xc6, 0xa2, 0x71, 0xc0,
-    0xf5, 0x26, 0x3a, 0xff, 0xff, 0xed, 0x70, 0x62, 0x6f, 0x9f, 0x7c, 0x92,
-    0xcd, 0xfd, 0x9b, 0x07, 0x34, 0x75, 0x71, 0x18, 0xe2, 0xa1, 0x5e, 0x47,
-    0xf7, 0xf0, 0xdc, 0xa3, 0xae, 0x9a, 0x47, 0x54, 0x1a, 0x1e, 0x05, 0x5f,
-    0xfc, 0x3e, 0xd6, 0xc4, 0xf4, 0x60, 0xcc, 0x75, 0xfb, 0x89, 0xa8, 0xdc,
-    0xea, 0xc3, 0xeb, 0x74, 0x4b, 0xfd, 0x3b, 0x17, 0x34, 0x93, 0xda, 0x3a,
-    0xfc, 0x3e, 0xee, 0x6d, 0x1d, 0x7e, 0x9b, 0x4f, 0xc5, 0x0e, 0xbc, 0xec,
-    0xf2, 0x0f, 0x4b, 0x0a, 0x6a, 0x48, 0xde, 0x42, 0x0e, 0x42, 0x32, 0xff,
-    0xba, 0x9c, 0x9b, 0xaf, 0x9c, 0x3a, 0xff, 0xff, 0xfe, 0x06, 0x87, 0x1f,
-    0x7f, 0x81, 0xef, 0xff, 0x07, 0x37, 0x96, 0x7f, 0x38, 0xe3, 0xee, 0x75,
-    0x35, 0x18, 0xe8, 0x71, 0x79, 0xdd, 0xa6, 0x8a, 0x62, 0xb0, 0xf2, 0x5a,
-    0x45, 0x7f, 0xec, 0x1d, 0xe5, 0xaf, 0x47, 0x26, 0x3a, 0xf6, 0x20, 0x0e,
-    0xb6, 0x1d, 0x7b, 0x71, 0xc0, 0x1a, 0x9d, 0x83, 0x54, 0x88, 0x9c, 0x76,
-    0x8b, 0xa7, 0x98, 0xeb, 0x83, 0x31, 0xd7, 0xdc, 0xeb, 0xfc, 0x83, 0x5e,
-    0xb1, 0x8b, 0xfd, 0xf3, 0x79, 0x0c, 0x66, 0x8e, 0xa4, 0x3e, 0xd7, 0x39,
-    0xbf, 0xff, 0x01, 0x35, 0xf3, 0xaf, 0xaf, 0x44, 0xda, 0xee, 0x1d, 0x7f,
-    0x27, 0x5d, 0x27, 0x83, 0xaf, 0x4a, 0x37, 0x3a, 0xff, 0x2c, 0x3d, 0x89,
-    0xf1, 0x93, 0xab, 0x0f, 0xef, 0x72, 0xb7, 0x1c, 0xbf, 0xff, 0xc3, 0x8d,
-    0xf7, 0xa3, 0xda, 0x98, 0x71, 0x9f, 0x90, 0xc4, 0x1d, 0x7f, 0xe6, 0xc2,
-    0xfb, 0x9a, 0xc4, 0x13, 0xaa, 0x11, 0x45, 0xd6, 0x7b, 0xf7, 0x23, 0x64,
-    0x70, 0xeb, 0xf9, 0xc7, 0xe0, 0x60, 0x4e, 0xac, 0x3f, 0x64, 0x22, 0xfc,
-    0xa2, 0xa1, 0x96, 0x51, 0x3a, 0xbc, 0x85, 0xc3, 0x0c, 0x15, 0x21, 0x54,
-    0xd8, 0xd2, 0xb7, 0x8c, 0xb9, 0x12, 0xa6, 0x8d, 0xa7, 0x91, 0xa2, 0x2e,
-    0x17, 0xbd, 0x85, 0xe8, 0x08, 0x06, 0x1a, 0x5e, 0x8d, 0x1a, 0xff, 0xb8,
-    0xec, 0xfc, 0x70, 0xbc, 0xe7, 0x5f, 0xce, 0xcc, 0xc2, 0x81, 0x3a, 0xff,
-    0xff, 0x07, 0x27, 0x71, 0xf6, 0xa1, 0xbf, 0x16, 0xb4, 0x16, 0x9d, 0x7f,
-    0x07, 0x4f, 0x1b, 0xc8, 0xea, 0x84, 0x47, 0x3b, 0x0d, 0xff, 0x44, 0xdd,
-    0x48, 0x5b, 0x84, 0xea, 0x51, 0x34, 0xee, 0x1d, 0x8c, 0x2e, 0xff, 0x21,
-    0xbe, 0xc1, 0x51, 0x8c, 0xeb, 0xff, 0xff, 0xf7, 0x53, 0xdd, 0xce, 0x46,
-    0xcf, 0x8b, 0xff, 0x6b, 0xe6, 0x6f, 0x2c, 0xfc, 0x41, 0xa3, 0xad, 0xe4,
-    0x45, 0x96, 0x89, 0x2f, 0xfd, 0x0d, 0xf8, 0x2f, 0xa5, 0xc0, 0x9d, 0x7f,
-    0xfe, 0xcc, 0xea, 0x37, 0xb9, 0xf3, 0x5f, 0xf6, 0x18, 0xce, 0xbf, 0xfe,
-    0xf7, 0x70, 0x1f, 0x17, 0x19, 0xe0, 0xe0, 0x9d, 0x7f, 0x38, 0x79, 0xcf,
-    0xe7, 0x3a, 0xfd, 0x18, 0x3e, 0xdb, 0x3a, 0x9a, 0x7a, 0xeb, 0x2f, 0xbe,
-    0xf2, 0x73, 0x0e, 0xb6, 0xff, 0x0f, 0x0b, 0x08, 0xad, 0xac, 0x4c, 0x49,
-    0xe1, 0xd1, 0x4b, 0x4f, 0x54, 0x4f, 0x7d, 0x1b, 0x5d, 0xff, 0xff, 0xf8,
-    0x73, 0x79, 0x26, 0x87, 0x36, 0x77, 0x26, 0xec, 0x0c, 0xdf, 0x1d, 0xa9,
-    0xb0, 0xea, 0x44, 0x5e, 0xfe, 0x6d, 0x7f, 0xf9, 0x03, 0xf1, 0x69, 0xf2,
-    0x02, 0xf3, 0x68, 0xeb, 0xa5, 0x23, 0xad, 0xc8, 0x3e, 0x39, 0xd3, 0x6f,
-    0xd2, 0x8d, 0xe5, 0xa3, 0xaf, 0xff, 0xff, 0xfd, 0x82, 0xa7, 0xc4, 0xef,
-    0xea, 0xcc, 0x9e, 0x85, 0x8b, 0xa9, 0xd4, 0x57, 0x3b, 0xb8, 0x20, 0x25,
-    0x5f, 0xff, 0xfc, 0xd4, 0x64, 0x3f, 0xf3, 0xe7, 0xf1, 0x3e, 0x9b, 0xdf,
-    0xfb, 0xbb, 0xb2, 0x75, 0xdf, 0xcf, 0xba, 0x68, 0x68, 0x51, 0xa8, 0x4f,
-    0xd4, 0x2e, 0x77, 0xf6, 0x55, 0xd3, 0xc2, 0x18, 0x63, 0x6b, 0xbf, 0xcf,
-    0x2c, 0x5b, 0x88, 0x0e, 0xbe, 0xce, 0xc4, 0xc7, 0x5e, 0x5b, 0x7e, 0x74,
-    0xf4, 0x5c, 0xc2, 0xff, 0xff, 0xf7, 0x1a, 0x39, 0xb3, 0xe6, 0x93, 0x04,
-    0x1f, 0x07, 0x36, 0x0e, 0x6b, 0x61, 0xd7, 0xfc, 0xdc, 0x75, 0xfc, 0xdb,
-    0x85, 0x9d, 0x58, 0x8b, 0x9e, 0x3e, 0xdf, 0xff, 0x90, 0x7d, 0xdc, 0xda,
-    0xf4, 0xd8, 0xc6, 0xe2, 0x03, 0xaf, 0xd0, 0xcf, 0xcd, 0x4c, 0x75, 0xff,
-    0x86, 0x71, 0xcd, 0x9a, 0xfe, 0x37, 0x3a, 0xff, 0xc1, 0xec, 0x6f, 0xf1,
-    0x8a, 0x6c, 0x02, 0x1d, 0x50, 0x88, 0xa9, 0xd0, 0x69, 0x13, 0x53, 0xd1,
-    0x17, 0x96, 0x7f, 0x85, 0xad, 0xff, 0x86, 0x4d, 0xea, 0x74, 0x7f, 0x9c,
-    0xeb, 0xde, 0xc6, 0x09, 0xd5, 0x07, 0xbd, 0x87, 0xf7, 0xb6, 0xf3, 0xa7,
-    0x5d, 0x81, 0x3a, 0xa7, 0x56, 0x6b, 0x29, 0x48, 0x3a, 0x85, 0x0f, 0x88,
-    0x36, 0x0f, 0x5f, 0x93, 0xda, 0xc0, 0x1d, 0x7e, 0xee, 0x6c, 0x4d, 0x87,
-    0x5e, 0x4c, 0x01, 0xd7, 0xf0, 0x60, 0x7a, 0xf2, 0x3a, 0xf4, 0x06, 0x0e,
-    0xbf, 0x67, 0xb4, 0xf3, 0x7c, 0x3c, 0x55, 0x95, 0xdf, 0x30, 0x18, 0xab,
-    0x09, 0x80, 0x75, 0xf2, 0x38, 0x84, 0xeb, 0x33, 0xf0, 0xf4, 0xc2, 0x69,
-    0x52, 0x45, 0xfa, 0x42, 0x52, 0xff, 0xfd, 0xcf, 0xf9, 0xc8, 0x1c, 0x51,
-    0x3b, 0xdc, 0xfa, 0x75, 0xf7, 0xef, 0xbf, 0x8e, 0xa9, 0x2a, 0x0f, 0x09,
-    0x32, 0x85, 0x53, 0x46, 0x3d, 0xc2, 0x7e, 0xab, 0xd1, 0xd7, 0xf6, 0x9a,
-    0xd7, 0x15, 0x0e, 0xa6, 0x18, 0xdb, 0xf8, 0x2a, 0xff, 0x0f, 0xcd, 0x9b,
-    0xcb, 0x53, 0x1d, 0x74, 0xfb, 0x9d, 0x7e, 0xeb, 0xb1, 0xc0, 0x0e, 0xa0,
-    0x9f, 0xd3, 0x9c, 0xed, 0x0c, 0x5f, 0xee, 0x4c, 0x39, 0xd7, 0xf1, 0xd5,
-    0x09, 0x81, 0xe4, 0x28, 0x10, 0xc6, 0xfc, 0x9c, 0x0e, 0x09, 0xd7, 0xe0,
-    0x67, 0xbe, 0xce, 0x75, 0xfe, 0x67, 0xd9, 0xdf, 0x9b, 0xe8, 0xea, 0x83,
-    0xe1, 0x72, 0xaa, 0x92, 0x36, 0x7a, 0x66, 0x30, 0x86, 0xbf, 0xef, 0x77,
-    0x24, 0xe3, 0x9b, 0x9d, 0x7f, 0xff, 0xc2, 0xe0, 0xd4, 0xf8, 0x83, 0xe1,
-    0xcd, 0x9f, 0x34, 0xc8, 0x9d, 0x42, 0x89, 0xff, 0x1b, 0xdf, 0xf9, 0x32,
-    0x6f, 0x9a, 0x8e, 0xbb, 0x19, 0xd7, 0xfd, 0xbe, 0x46, 0xf3, 0x0c, 0x2c,
-    0xeb, 0xfb, 0x7d, 0x77, 0x1f, 0x87, 0x5f, 0xff, 0xf9, 0x17, 0xc4, 0xcd,
-    0xc7, 0xff, 0x47, 0x7e, 0x6c, 0x4f, 0x4d, 0x07, 0x53, 0xa2, 0x77, 0xc5,
-    0xb4, 0x14, 0xce, 0xba, 0x85, 0xe8, 0x6b, 0x5f, 0xf6, 0x72, 0x78, 0x4e,
-    0x60, 0x9d, 0x65, 0x9d, 0xf0, 0xdb, 0x5e, 0x1c, 0x09, 0xd5, 0x06, 0xf3,
-    0x72, 0x2b, 0xfb, 0x7d, 0x66, 0x0a, 0x87, 0x5f, 0x2f, 0xec, 0x00, 0xeb,
-    0xff, 0xd3, 0x87, 0x8e, 0xd1, 0xcd, 0x9c, 0x4d, 0x1d, 0x58, 0x89, 0xb4,
-    0x2d, 0xfc, 0x8e, 0xff, 0x3f, 0xba, 0xf3, 0x7d, 0x59, 0xd7, 0xbf, 0xdc,
-    0x07, 0x54, 0x2b, 0x42, 0xc8, 0xd7, 0x12, 0x15, 0x1c, 0x85, 0xe3, 0x97,
-    0x89, 0xad, 0xfd, 0xe7, 0xef, 0xc0, 0xc1, 0xd7, 0xff, 0xbd, 0xaf, 0xba,
-    0xf9, 0xe1, 0x89, 0x67, 0x8e, 0xbf, 0xde, 0x49, 0xf3, 0xbf, 0xf8, 0xeb,
-    0xef, 0x6a, 0x14, 0x3a, 0xd3, 0x1d, 0x7f, 0x67, 0xf9, 0xd6, 0xce, 0x75,
-    0xb7, 0x83, 0x7f, 0xa1, 0x1a, 0x84, 0x44, 0x63, 0x0d, 0xfd, 0xd7, 0x92,
-    0xf8, 0x87, 0x5f, 0xfc, 0xa2, 0x8f, 0xed, 0x78, 0x63, 0x79, 0x1d, 0x7f,
-    0x78, 0x62, 0x59, 0xe3, 0xaa, 0x0f, 0xc6, 0x48, 0xd7, 0x26, 0x8e, 0xb2,
-    0xce, 0xbd, 0xcc, 0xdc, 0xea, 0x09, 0xe0, 0xf4, 0x54, 0x02, 0x17, 0xff,
-    0x9d, 0x4f, 0x29, 0x03, 0x2c, 0xea, 0x2c, 0xeb, 0xf2, 0x6b, 0x50, 0xb3,
-    0xa9, 0x11, 0x3c, 0x25, 0xfb, 0x12, 0x6a, 0x15, 0x92, 0xe1, 0x72, 0x89,
-    0xa9, 0x0b, 0xc0, 0x10, 0x8c, 0x27, 0x7f, 0x8c, 0x02, 0xfc, 0x14, 0x17,
-    0x09, 0xd7, 0xff, 0xe9, 0x77, 0x26, 0xec, 0x0a, 0x83, 0x9e, 0xef, 0xe7,
-    0x52, 0x1f, 0xdf, 0x09, 0x6f, 0xff, 0xf2, 0x66, 0xf2, 0xd7, 0xbb, 0x0b,
-    0x84, 0x0f, 0xc8, 0x62, 0x0e, 0xbf, 0xce, 0x3f, 0x1b, 0xa0, 0x04, 0xeb,
-    0xff, 0x7f, 0xaf, 0x8b, 0xfb, 0xd7, 0xec, 0x1d, 0x7e, 0xcf, 0x7f, 0x9b,
-    0x9d, 0x79, 0x4c, 0xdc, 0xeb, 0xa2, 0x6f, 0x87, 0x8b, 0xe2, 0x8a, 0x14,
-    0x5c, 0x7f, 0x08, 0x8b, 0xff, 0xff, 0xf7, 0xe3, 0xf1, 0x97, 0xde, 0x5c,
-    0x70, 0x7c, 0xd7, 0xf1, 0xbf, 0x71, 0x07, 0x14, 0x3a, 0xff, 0xfd, 0xff,
-    0x39, 0x9e, 0xd7, 0x53, 0x3e, 0x74, 0x10, 0x75, 0x62, 0x38, 0x7b, 0x08,
-    0xab, 0xf6, 0x0b, 0x7e, 0xac, 0xeb, 0xff, 0xbb, 0x90, 0x33, 0x0e, 0x7b,
-    0x4e, 0x75, 0xa5, 0xe3, 0xe9, 0xda, 0x28, 0xbf, 0xff, 0x07, 0x17, 0xf3,
-    0x6b, 0xd1, 0xa9, 0xa4, 0xfc, 0x9c, 0xeb, 0xff, 0xfb, 0xc9, 0x3e, 0x07,
-    0xe2, 0xde, 0x5c, 0x49, 0xdd, 0x67, 0x5f, 0xe9, 0xdd, 0x63, 0x1c, 0x98,
-    0xeb, 0xfe, 0xdf, 0x14, 0x02, 0xf3, 0xe7, 0x31, 0x12, 0x08, 0xbb, 0x7f,
-    0xd8, 0x33, 0xfc, 0x03, 0xbc, 0xc7, 0x5f, 0xf7, 0x27, 0x89, 0xe7, 0xff,
-    0x93, 0x9d, 0x7f, 0xef, 0x93, 0x77, 0xf5, 0x13, 0x05, 0x43, 0xaf, 0xf0,
-    0xfc, 0xd7, 0xfb, 0x7f, 0xf0, 0xea, 0xc3, 0xfd, 0xfd, 0x0e, 0xa1, 0x1b,
-    0xba, 0x85, 0xdd, 0xff, 0xe9, 0xfe, 0x6b, 0xbf, 0xfc, 0xf6, 0xb5, 0x1c,
-    0x3a, 0xff, 0xfb, 0xb1, 0x3f, 0xc1, 0xcd, 0x8f, 0xde, 0xc6, 0xe7, 0x5f,
-    0xff, 0xf6, 0xfa, 0x4c, 0x67, 0xe7, 0x73, 0xda, 0xc9, 0xfe, 0x62, 0x04,
-    0xea, 0x0a, 0x2f, 0xb1, 0x4e, 0xfe, 0x9f, 0xd3, 0x0c, 0x2c, 0xeb, 0xff,
-    0xfb, 0x27, 0xc4, 0x08, 0xff, 0xdf, 0x90, 0x17, 0x9b, 0x47, 0x56, 0x27,
-    0x78, 0x91, 0x87, 0xb9, 0x16, 0x8b, 0xaa, 0x75, 0xf9, 0x00, 0xb3, 0x29,
-    0x0e, 0xc6, 0xc6, 0x13, 0xbc, 0x24, 0x10, 0xaf, 0x90, 0xec, 0x5a, 0x9e,
-    0xa3, 0x17, 0xf4, 0x7c, 0x77, 0xfb, 0xc3, 0x9e, 0xee, 0x4e, 0x75, 0xff,
-    0x9f, 0x9d, 0xcf, 0x40, 0xa0, 0x0e, 0xbf, 0xfe, 0x1c, 0x9f, 0xe0, 0x3f,
-    0xf6, 0x62, 0xc0, 0xc9, 0xd7, 0xd2, 0xf2, 0x4e, 0x75, 0xff, 0x63, 0x3b,
-    0xcb, 0x5f, 0x3c, 0x87, 0x5f, 0xfa, 0x51, 0x80, 0xee, 0x60, 0xb4, 0xeb,
-    0xff, 0xdd, 0x41, 0x0f, 0xcf, 0xad, 0x1c, 0xee, 0x1d, 0x58, 0x88, 0x69,
-    0x8e, 0xef, 0xfb, 0xa8, 0xb8, 0xc1, 0xf6, 0x8e, 0xbf, 0xff, 0xdf, 0xfb,
-    0x9f, 0xcd, 0xf3, 0xd3, 0x77, 0xf0, 0x79, 0x33, 0x68, 0xeb, 0xe8, 0x6c,
-    0x2f, 0xe2, 0x31, 0x5a, 0x46, 0x26, 0xd5, 0x0a, 0xac, 0x1a, 0x65, 0xc3,
-    0xb7, 0x53, 0x12, 0x2d, 0xa8, 0xe1, 0xef, 0xff, 0xee, 0x63, 0xaf, 0xe2,
-    0x8f, 0xbf, 0x73, 0xbd, 0x8f, 0x1d, 0x7f, 0xa1, 0x79, 0x9c, 0x9a, 0x47,
-    0x5f, 0x27, 0x92, 0x0e, 0xbf, 0xff, 0xfc, 0x28, 0xa7, 0x5e, 0x6f, 0x83,
-    0xfe, 0xd7, 0xcc, 0xde, 0x59, 0xf8, 0x83, 0x47, 0x5f, 0xba, 0x90, 0x33,
-    0x9d, 0x77, 0xa1, 0x68, 0xa7, 0xd9, 0x08, 0x1a, 0x92, 0x3e, 0xd2, 0x18,
-    0xd5, 0x0c, 0xd2, 0x2c, 0x9f, 0xb1, 0x49, 0x6c, 0x3c, 0x5f, 0xea, 0xeb,
-    0xc6, 0x5b, 0x7e, 0x81, 0xf2, 0x6c, 0x3a, 0xfb, 0xda, 0x70, 0x1d, 0x7f,
-    0xf7, 0x53, 0xe2, 0x73, 0xf9, 0xdf, 0x8d, 0x3a, 0xf9, 0x3a, 0xf3, 0x9d,
-    0x7d, 0xb2, 0x3d, 0x07, 0x5f, 0xb5, 0x9e, 0x4d, 0x1d, 0x7e, 0xfd, 0x82,
-    0x2f, 0xe3, 0xaf, 0xee, 0xbc, 0xff, 0x25, 0xe3, 0xaf, 0xcf, 0xc1, 0xdd,
-    0x0e, 0xa8, 0x44, 0x0a, 0x15, 0xf8, 0xc2, 0x82, 0x9d, 0x3e, 0x13, 0xa8,
-    0x42, 0xd4, 0x74, 0x21, 0x98, 0x8b, 0xd0, 0xa7, 0xbe, 0x1f, 0x42, 0xce,
-    0xbf, 0xdd, 0x84, 0x17, 0xe2, 0x87, 0x5f, 0xd0, 0x82, 0xfc, 0x50, 0xeb,
-    0xf9, 0xc1, 0xce, 0x27, 0x3e, 0x1e, 0xe7, 0x4c, 0x69, 0x11, 0x84, 0x07,
-    0xcb, 0x00, 0xeb, 0xfa, 0x39, 0x3c, 0x72, 0x73, 0xaf, 0x7e, 0xfa, 0x3a,
-    0xa4, 0x79, 0x5f, 0x4b, 0xaf, 0xff, 0xe4, 0xe7, 0xcc, 0x4c, 0x15, 0x3a,
-    0x98, 0xbc, 0x69, 0xd7, 0xff, 0xfc, 0x93, 0xf2, 0x17, 0xaf, 0xe3, 0xe4,
-    0x72, 0x03, 0xd8, 0x59, 0xd5, 0x88, 0xc1, 0xe2, 0xcd, 0xf8, 0x1a, 0x4d,
-    0xd9, 0x3a, 0xff, 0xdc, 0xcd, 0xfb, 0xbc, 0x2e, 0x78, 0x3a, 0xff, 0xff,
-    0xf7, 0x38, 0x93, 0xfc, 0xee, 0x78, 0x62, 0x6e, 0xe4, 0xf1, 0xbf, 0xbf,
-    0x69, 0xd7, 0xff, 0xff, 0x42, 0x9d, 0x8f, 0x83, 0x9f, 0xa9, 0xf3, 0x79,
-    0x69, 0x07, 0xec, 0x4e, 0x75, 0xfb, 0x7d, 0x26, 0x09, 0xd5, 0x88, 0xa0,
-    0xfd, 0xea, 0x91, 0x34, 0x0e, 0xc6, 0x3b, 0x7f, 0xf7, 0x07, 0x7c, 0xd7,
-    0xf3, 0x0c, 0x2c, 0xeb, 0xfe, 0x45, 0x3b, 0x09, 0x3c, 0x28, 0x75, 0xa4,
-    0x87, 0xfd, 0xa4, 0x5b, 0xfe, 0x1f, 0xe6, 0x1c, 0xeb, 0xf8, 0xeb, 0xfd,
-    0xd8, 0x64, 0x3d, 0x75, 0x9d, 0x7f, 0xcb, 0xcd, 0x7c, 0x98, 0x61, 0x67,
-    0x50, 0x4f, 0xb5, 0x66, 0x77, 0xff, 0xfc, 0xfc, 0xee, 0x79, 0x30, 0x67,
-    0xd4, 0x60, 0x87, 0xb0, 0x75, 0xf7, 0xbe, 0x4f, 0xc3, 0xab, 0x74, 0x43,
-    0xbb, 0x15, 0xff, 0xff, 0xb7, 0xc9, 0xff, 0xda, 0xf9, 0xbc, 0xbd, 0x0c,
-    0xfc, 0xce, 0x00, 0x10, 0x75, 0xff, 0xe6, 0x5c, 0x67, 0x5f, 0xe8, 0x14,
-    0x14, 0x3a, 0xfe, 0x9b, 0x79, 0x7f, 0x1e, 0x3a, 0xfe, 0xc9, 0x78, 0x72,
-    0x47, 0x5f, 0xf7, 0x5d, 0x63, 0x9d, 0x7f, 0x1d, 0x7d, 0x9c, 0x03, 0x27,
-    0x54, 0x22, 0xcf, 0xa6, 0x1a, 0x2b, 0xf1, 0xb5, 0xfd, 0x9e, 0xe7, 0x32,
-    0x47, 0x5f, 0xc3, 0x9d, 0x1c, 0x69, 0xd7, 0xc3, 0x9a, 0xf9, 0x31, 0xeb,
-    0x78, 0xb2, 0xff, 0xb1, 0x7d, 0x84, 0xe7, 0xec, 0x67, 0x50, 0x57, 0xa1,
-    0xb0, 0x89, 0x42, 0x96, 0xc7, 0x01, 0xbc, 0x29, 0xd0, 0x9f, 0x90, 0xa5,
-    0xec, 0x2a, 0x5c, 0x8f, 0x4f, 0x1e, 0x87, 0xe6, 0xc8, 0x49, 0x7d, 0x3b,
-    0xbf, 0xf6, 0x32, 0x39, 0xfe, 0x29, 0x20, 0x1d, 0x7f, 0xe1, 0xcf, 0x9c,
-    0xce, 0x8e, 0x4c, 0x75, 0xff, 0xfe, 0xeb, 0x83, 0x5f, 0x07, 0x36, 0x0e,
-    0x6b, 0x17, 0x0d, 0x3a, 0x85, 0x13, 0xfa, 0x3e, 0xa6, 0x19, 0x93, 0x39,
-    0x0b, 0x59, 0x3e, 0xd7, 0xbc, 0x35, 0xde, 0x1b, 0xd7, 0xf6, 0x77, 0xe8,
-    0xee, 0x03, 0xaf, 0xee, 0xe0, 0xf8, 0x1f, 0x9d, 0x7f, 0xe9, 0x46, 0xb5,
-    0x09, 0x3b, 0xf8, 0xeb, 0xf0, 0xc2, 0xdc, 0x27, 0x5f, 0xec, 0x9b, 0xb9,
-    0xe8, 0x09, 0xd7, 0xf0, 0xf9, 0xd6, 0x9e, 0x3a, 0xd2, 0x3a, 0xa0, 0xdd,
-    0xf8, 0xae, 0xf0, 0xb6, 0x0e, 0xbf, 0xff, 0xfe, 0xee, 0x7b, 0x4f, 0x37,
-    0xc1, 0xcd, 0xe5, 0x9f, 0xce, 0x38, 0x1e, 0xa4, 0xc7, 0x5d, 0xfa, 0x87,
-    0x52, 0x22, 0xcf, 0x83, 0x5e, 0x84, 0x0d, 0xfd, 0x93, 0x8e, 0x6f, 0xa3,
-    0xaf, 0xfe, 0x10, 0x6d, 0xe7, 0x52, 0x16, 0xe1, 0x3a, 0xff, 0xff, 0xfd,
-    0x2d, 0x6b, 0xf8, 0xf2, 0x07, 0x06, 0x6f, 0x83, 0x9c, 0x81, 0xf7, 0x73,
-    0x68, 0xeb, 0xff, 0xb7, 0x96, 0xb1, 0x7b, 0xc7, 0x7b, 0x07, 0x56, 0xe8,
-    0xcb, 0xe4, 0x21, 0xad, 0xa3, 0xab, 0x13, 0x48, 0xfe, 0x30, 0xff, 0xa5,
-    0x37, 0xf6, 0x6f, 0x28, 0x04, 0x1d, 0x7e, 0x1c, 0xeb, 0xf8, 0xeb, 0x46,
-    0xe7, 0xa2, 0xb2, 0xcb, 0xef, 0x8d, 0x9d, 0x93, 0xaf, 0xd3, 0xfc, 0xfe,
-    0x26, 0x3a, 0xff, 0xff, 0x86, 0x01, 0xbc, 0xb5, 0xfc, 0x78, 0x70, 0x29,
-    0x9c, 0x98, 0xea, 0x74, 0x49, 0x78, 0xb2, 0xa1, 0x74, 0xcc, 0x25, 0xfb,
-    0x96, 0xa1, 0xec, 0xc4, 0xbd, 0x6d, 0x78, 0x69, 0x89, 0xa6, 0xa3, 0x75,
-    0xfe, 0x11, 0x5b, 0x0a, 0x3e, 0xc2, 0xe2, 0xfd, 0x24, 0xe6, 0x6e, 0x75,
-    0xed, 0x77, 0x0e, 0xbf, 0x66, 0xa7, 0xc6, 0x4e, 0xad, 0xcf, 0xaa, 0x62,
-    0x7e, 0x8d, 0xdf, 0xff, 0x4f, 0x8d, 0x0f, 0x53, 0x14, 0xf8, 0xa7, 0xf0,
-    0x75, 0xff, 0xd2, 0x4f, 0x77, 0x39, 0xcc, 0xf6, 0x8e, 0xbf, 0xef, 0x9f,
-    0x7c, 0x9b, 0x20, 0x5a, 0x75, 0x22, 0x35, 0x26, 0x54, 0xea, 0x1d, 0xff,
-    0xe8, 0xde, 0x5a, 0xf3, 0xcf, 0xb4, 0x39, 0xb9, 0xd7, 0xfd, 0xd9, 0xd3,
-    0x07, 0x79, 0x68, 0xeb, 0xfe, 0xdf, 0xb8, 0xd1, 0xcf, 0xd8, 0xce, 0xbf,
-    0xfe, 0x67, 0x1b, 0xac, 0xf4, 0xd8, 0xa0, 0xe0, 0x0e, 0xb4, 0xa1, 0x18,
-    0xb8, 0x72, 0x87, 0x97, 0xf2, 0x6e, 0x0e, 0x38, 0x4e, 0xbf, 0x62, 0x67,
-    0x00, 0x75, 0x74, 0xf4, 0x84, 0xb6, 0xfb, 0x6b, 0xd9, 0xd3, 0xae, 0x45,
-    0x9d, 0x7f, 0xff, 0xed, 0xe4, 0xfb, 0xfc, 0x1f, 0xf6, 0xbe, 0x66, 0xf2,
-    0xcf, 0xc4, 0x1a, 0x3a, 0x96, 0x88, 0xcd, 0xa1, 0x5b, 0xdb, 0x68, 0xc1,
-    0x3a, 0xbe, 0x26, 0x33, 0x39, 0x0e, 0x42, 0xc3, 0x6c, 0x9a, 0xff, 0xff,
-    0xfd, 0x1b, 0xeb, 0xf8, 0xdf, 0xe7, 0x70, 0x3f, 0x07, 0x3f, 0x53, 0xe6,
-    0x80, 0x04, 0xf1, 0xd7, 0xe8, 0x1d, 0xde, 0x73, 0xaf, 0xff, 0xff, 0xfd,
-    0x8d, 0x8e, 0xc2, 0xfd, 0x9a, 0xd4, 0x73, 0x90, 0x39, 0x3e, 0x7f, 0xaf,
-    0xe6, 0x18, 0x59, 0xd7, 0xbf, 0xe2, 0x87, 0x52, 0xd1, 0x6f, 0xb7, 0x09,
-    0x9b, 0xf3, 0x83, 0xeb, 0xce, 0x75, 0x61, 0xea, 0x21, 0x5d, 0xe4, 0x04,
-    0x1d, 0x7f, 0x04, 0x73, 0xaf, 0xe3, 0xaf, 0xde, 0xde, 0x49, 0xc3, 0xab,
-    0x0f, 0x4f, 0x45, 0x75, 0x3a, 0x23, 0x80, 0xdb, 0x7f, 0xa7, 0xfe, 0x3c,
-    0xb4, 0xf1, 0xd7, 0xfe, 0x85, 0x36, 0xbf, 0xc1, 0x9b, 0xea, 0xce, 0xac,
-    0x3f, 0x9d, 0xcd, 0x2f, 0xfd, 0x98, 0x0d, 0x7c, 0xe6, 0x83, 0xa3, 0xaf,
-    0xf7, 0x31, 0xbd, 0x4e, 0x4c, 0x75, 0xd9, 0xe0, 0x9f, 0x9e, 0x20, 0x5f,
-    0x4e, 0x83, 0xe3, 0xaf, 0xd9, 0xde, 0xbc, 0x8e, 0xbf, 0xbc, 0x9c, 0x9f,
-    0x1a, 0x75, 0x43, 0x21, 0xb7, 0x23, 0x05, 0x50, 0xc3, 0x78, 0xc4, 0xd2,
-    0x39, 0xee, 0x24, 0x2e, 0x11, 0xbd, 0x8c, 0xc9, 0xe1, 0x5c, 0x30, 0x9d,
-    0xd4, 0x25, 0x7f, 0x2c, 0xdb, 0x21, 0xda, 0x26, 0xbc, 0xed, 0xc3, 0xaf,
-    0xfd, 0x37, 0xcf, 0x0e, 0x33, 0x89, 0xa3, 0xa9, 0x84, 0x7b, 0x50, 0x35,
-    0x47, 0x5f, 0xd8, 0xb8, 0xeb, 0xf4, 0xeb, 0xbe, 0x4c, 0x75, 0x7c, 0x3c,
-    0x40, 0x95, 0xdf, 0xff, 0x6f, 0x21, 0x8f, 0x8b, 0x18, 0x53, 0xc9, 0x39,
-    0xd5, 0x08, 0xc4, 0xc4, 0xe4, 0x24, 0xbf, 0x73, 0xe0, 0xec, 0x64, 0xeb,
-    0xee, 0xb8, 0x20, 0xeb, 0xdd, 0xce, 0x1d, 0x50, 0x7c, 0xee, 0x59, 0xb4,
-    0x41, 0x7f, 0x4f, 0x34, 0x98, 0x5c, 0x9c, 0xeb, 0xf2, 0xd0, 0x38, 0x13,
-    0xad, 0x31, 0xd7, 0x42, 0xce, 0xb7, 0x8e, 0xae, 0x1a, 0x57, 0x15, 0xa0,
-    0x9e, 0xb7, 0x4d, 0xaf, 0x72, 0x26, 0x3a, 0xf6, 0x9f, 0x73, 0xa9, 0xcd,
-    0xc7, 0x87, 0x2e, 0x99, 0xce, 0xbf, 0x9d, 0x98, 0xf6, 0x4e, 0x75, 0xfc,
-    0x9c, 0xde, 0x43, 0x07, 0x5f, 0xe0, 0xf6, 0x37, 0x96, 0x78, 0xea, 0xe9,
-    0xef, 0xf8, 0xb2, 0x98, 0x94, 0xfb, 0xe0, 0xd7, 0x1f, 0x11, 0x69, 0x64,
-    0x02, 0x2d, 0xfc, 0x23, 0x2f, 0xf3, 0x39, 0x21, 0xfd, 0xf4, 0x75, 0xfb,
-    0x76, 0x5c, 0x40, 0x75, 0xc2, 0xa1, 0xd6, 0xd2, 0x1b, 0xef, 0xca, 0x2f,
-    0xff, 0xe8, 0x58, 0xe3, 0x77, 0xf0, 0xbf, 0x57, 0x19, 0xe3, 0xaf, 0xff,
-    0xd1, 0xc8, 0x6e, 0x2e, 0x1b, 0x24, 0xd7, 0xeb, 0x3a, 0xa1, 0x34, 0x49,
-    0x9c, 0x7a, 0x4f, 0xb6, 0xb1, 0x7f, 0x73, 0x21, 0x48, 0x13, 0xaf, 0x0b,
-    0xac, 0xeb, 0x81, 0x07, 0x54, 0x8f, 0x69, 0x0a, 0xc4, 0x6a, 0x98, 0x97,
-    0xe2, 0xea, 0x60, 0x3b, 0xb0, 0xa3, 0xf2, 0x61, 0xeb, 0x51, 0x2e, 0x1e,
-    0x78, 0xe8, 0xa5, 0x08, 0x20, 0xce, 0x56, 0xe5, 0x2e, 0x9d, 0x49, 0x4a,
-    0xcd, 0x9d, 0xe5, 0xde, 0x5e, 0xaa, 0x4a, 0x6a, 0x9a, 0x53, 0xa7, 0x27,
-    0x05, 0x57, 0x2e, 0x27, 0xb4, 0xe1, 0x17, 0x94, 0x26, 0x08, 0xcb, 0x06,
-    0x93, 0x7d, 0xa9, 0xd9, 0x6f, 0x52, 0x65, 0xff, 0x8d, 0x37, 0x64, 0x3a,
-    0x59, 0x84, 0xa6, 0xdc, 0xa1, 0xff, 0xb1, 0xd8, 0x6d, 0x42, 0x6e, 0xff,
-    0xfe, 0xfd, 0xaa, 0xef, 0xee, 0x46, 0x6e, 0xc2, 0x0b, 0xba, 0x87, 0x52,
-    0xaa, 0xaa, 0xd2, 0x52, 0x45, 0xfe, 0x63, 0x74, 0xf6, 0x90, 0x4e, 0xbf,
-    0x71, 0xae, 0xed, 0x34, 0x53, 0xb7, 0x66, 0xe7, 0x5f, 0xfe, 0xff, 0xf1,
-    0x41, 0x8e, 0xa2, 0xf3, 0x47, 0x59, 0x58, 0x46, 0x26, 0x19, 0xee, 0x66,
-    0xb1, 0x6b, 0xff, 0x93, 0x8a, 0xed, 0xbc, 0xfe, 0xd3, 0x80, 0xeb, 0xf7,
-    0x1a, 0xee, 0xd3, 0x45, 0x47, 0x7f, 0xe7, 0x92, 0xb9, 0xc6, 0xbb, 0xb4,
-    0xd1, 0x34, 0x5f, 0x0c, 0x66, 0xe7, 0x56, 0x22, 0x75, 0x66, 0x7e, 0x4a,
-    0xbf, 0xdf, 0x5f, 0x62, 0xbe, 0x49, 0xce, 0xa5, 0x4f, 0x9e, 0x0b, 0xef,
-    0xdc, 0x6b, 0xbb, 0x4d, 0x15, 0x7d, 0xfd, 0x9b, 0x20, 0x7b, 0xf9, 0xd7,
-    0xf2, 0x04, 0x31, 0xc8, 0x3a, 0xca, 0xe2, 0x23, 0x38, 0x67, 0xd2, 0xeb,
-    0xf7, 0x1a, 0xee, 0xd3, 0x45, 0x6d, 0x7f, 0xd2, 0x57, 0x38, 0xd7, 0x76,
-    0x9a, 0x24, 0x1b, 0x2b, 0x87, 0xf0, 0xe6, 0x77, 0xff, 0x2a, 0xf2, 0x57,
-    0x38, 0xd7, 0x76, 0x9a, 0x24, 0x3b, 0xff, 0x69, 0x5c, 0xf2, 0x07, 0x06,
-    0x63, 0xaf, 0x3b, 0xb4, 0xf1, 0x81, 0xd4, 0x1f, 0x2b, 0x4f, 0xae, 0xeb,
-    0x19, 0xd7, 0xfe, 0x97, 0x63, 0xda, 0x62, 0x34, 0xc0, 0x13, 0xaf, 0xff,
-    0x30, 0xe6, 0x1c, 0xc4, 0x76, 0x16, 0x2f, 0xd4, 0xe1, 0xd6, 0xdc, 0xeb,
-    0x90, 0x4e, 0xbf, 0xa0, 0x31, 0xe7, 0x09, 0xd4, 0x13, 0xd0, 0x98, 0x47,
-    0xc2, 0x97, 0xde, 0xd2, 0x6c, 0x3a, 0xff, 0xe4, 0x19, 0xe1, 0x4f, 0xa0,
-    0x04, 0x6e, 0x75, 0xf6, 0x08, 0x34, 0x75, 0xf4, 0xfa, 0xdd, 0x0e, 0xac,
-    0x3c, 0x3d, 0x10, 0x5f, 0x9c, 0x3f, 0x60, 0x4e, 0xbf, 0xf7, 0x3d, 0xf4,
-    0x5d, 0xb8, 0x2d, 0x3a, 0xf9, 0xae, 0xed, 0x34, 0x58, 0x97, 0xbf, 0x19,
-    0x1d, 0x7f, 0x9b, 0x19, 0xc0, 0x03, 0xc7, 0x54, 0xe8, 0xe0, 0xc2, 0x7e,
-    0x1f, 0x78, 0xb7, 0xf1, 0xcb, 0xf6, 0x72, 0x05, 0x43, 0xaf, 0xdf, 0x76,
-    0xf3, 0x90, 0x75, 0xed, 0x40, 0x9d, 0x6e, 0xc1, 0xe2, 0xa1, 0x5d, 0xff,
-    0xd1, 0x9a, 0xc1, 0x0a, 0x02, 0x04, 0xeb, 0xc3, 0x13, 0x9d, 0x42, 0x7b,
-    0x5f, 0x9f, 0xdf, 0x47, 0x21, 0x67, 0x54, 0x8f, 0x0b, 0x44, 0x57, 0x96,
-    0xfe, 0x3a, 0xe4, 0x01, 0xd5, 0xc3, 0x61, 0xb6, 0x37, 0x7e, 0x4d, 0x9f,
-    0xbe, 0x8e, 0xbf, 0xe0, 0xf7, 0x17, 0x8f, 0xc9, 0xce, 0xbf, 0x7b, 0xcf,
-    0x2d, 0x1d, 0x7f, 0xef, 0xf3, 0x70, 0xec, 0xee, 0x3c, 0xc7, 0x56, 0xe7,
-    0xd3, 0xb0, 0x9e, 0xd2, 0x3a, 0xfb, 0x31, 0x9d, 0x1d, 0x50, 0x6c, 0x7c,
-    0x21, 0x77, 0xe2, 0x75, 0x42, 0x65, 0xb9, 0x0a, 0x1e, 0x2b, 0x68, 0x82,
-    0xff, 0xa3, 0x5f, 0x73, 0x99, 0x93, 0x1d, 0x7f, 0x72, 0x40, 0xcc, 0x98,
-    0xeb, 0xe7, 0x84, 0xdb, 0x3a, 0xb0, 0xf3, 0xf8, 0x5b, 0x7d, 0x2f, 0xbd,
-    0x83, 0xaf, 0x72, 0x24, 0x75, 0x39, 0xbe, 0xd8, 0x47, 0x7f, 0x42, 0xf1,
-    0x39, 0x31, 0xd7, 0xdf, 0x63, 0x6b, 0x47, 0x5f, 0xb0, 0x3d, 0x8e, 0x9d,
-    0x7d, 0xc4, 0x65, 0x8c, 0xea, 0x13, 0xcb, 0xd1, 0x35, 0x05, 0x12, 0x5a,
-    0x71, 0xa8, 0x4d, 0x89, 0x17, 0xfa, 0x44, 0xf0, 0xbe, 0xbf, 0x90, 0x5d,
-    0x71, 0xd3, 0xaf, 0xff, 0x42, 0xe2, 0x41, 0x18, 0xeb, 0xe7, 0x0e, 0xa3,
-    0xaa, 0x47, 0xa1, 0xb6, 0x8d, 0x7b, 0xd8, 0x03, 0xaf, 0xe5, 0xa6, 0xb4,
-    0x81, 0x3a, 0xf3, 0xf1, 0x43, 0xab, 0xf3, 0xc8, 0x64, 0xb2, 0xff, 0x34,
-    0x73, 0x60, 0xe6, 0x8e, 0xbf, 0xed, 0xe4, 0xf8, 0x39, 0xed, 0x1d, 0x7f,
-    0xec, 0xde, 0x5d, 0x8d, 0x29, 0xd8, 0x3a, 0xa4, 0x9e, 0x76, 0xef, 0x53,
-    0x12, 0xf1, 0x8f, 0xa4, 0x82, 0x65, 0xb4, 0x6f, 0x6d, 0xb3, 0xae, 0x96,
-    0x8e, 0xb3, 0xc8, 0xd4, 0xee, 0x27, 0x7d, 0xe4, 0x16, 0x4a, 0xb7, 0xe7,
-    0x5a, 0x30, 0xd9, 0x74, 0x86, 0xff, 0x9c, 0x7d, 0xad, 0xf4, 0xec, 0x67,
-    0x53, 0xa2, 0xe4, 0x0b, 0x3f, 0x92, 0xdf, 0xdd, 0x4d, 0x73, 0x98, 0x75,
-    0xff, 0xa1, 0x9f, 0xb3, 0xeb, 0x17, 0x0c, 0x67, 0x5c, 0xec, 0x9d, 0x6c,
-    0x6a, 0x21, 0xbc, 0x59, 0xb1, 0x12, 0xff, 0xee, 0xba, 0x7a, 0x58, 0xa0,
-    0xe0, 0x0e, 0xbf, 0x0c, 0xd1, 0xd8, 0x3a, 0xfc, 0x07, 0xd9, 0x81, 0x3a,
-    0xfd, 0x9d, 0xdd, 0xd8, 0xce, 0xbe, 0x06, 0xa0, 0x4e, 0xbf, 0xdc, 0xeb,
-    0xa6, 0x93, 0x61, 0xd5, 0x07, 0xa7, 0x84, 0x14, 0x89, 0x96, 0xba, 0x10,
-    0x09, 0x84, 0xa3, 0x4f, 0xb7, 0xf3, 0x31, 0xce, 0x3c, 0xc7, 0x5f, 0xf0,
-    0x61, 0xbf, 0x40, 0x08, 0xdc, 0xeb, 0xfe, 0x7e, 0x62, 0xd3, 0x6e, 0x16,
-    0x75, 0x34, 0xfd, 0x3f, 0x3b, 0xbe, 0xf4, 0x6f, 0x23, 0xaf, 0xe4, 0x06,
-    0xd8, 0xa0, 0x0e, 0xa9, 0xcf, 0x43, 0x84, 0x55, 0x09, 0x9c, 0x64, 0x28,
-    0x9d, 0xce, 0xfe, 0xd9, 0xc7, 0x84, 0xdb, 0x3a, 0xd8, 0x75, 0x2c, 0xdf,
-    0x89, 0x85, 0xf9, 0xe7, 0xf6, 0x34, 0xeb, 0xff, 0x77, 0x02, 0x14, 0xdf,
-    0x37, 0xf1, 0xd7, 0xf7, 0xc0, 0xfd, 0x7e, 0x70, 0xea, 0x9c, 0xfc, 0x02,
-    0x7f, 0x7c, 0xf0, 0x9b, 0x67, 0x5f, 0xfb, 0x03, 0xf3, 0x35, 0x19, 0xc0,
-    0x1d, 0x7f, 0xd0, 0x81, 0xf0, 0xbe, 0xfa, 0x3a, 0xa1, 0x17, 0x41, 0x23,
-    0xe9, 0x10, 0x9f, 0x53, 0x10, 0xd8, 0xb3, 0xb0, 0x06, 0x58, 0xaa, 0x3c,
-    0x42, 0xa6, 0x73, 0x09, 0x11, 0x86, 0x11, 0x59, 0x18, 0x0a, 0x89, 0x6d,
-    0x6b, 0xde, 0x18, 0x48, 0xa5, 0x31, 0x27, 0x23, 0x56, 0x5a, 0x0f, 0x63,
-    0xea, 0x79, 0x41, 0xc0, 0x8d, 0x2c, 0x61, 0x6d, 0xa8, 0xd9, 0x3d, 0x1c,
-    0x07, 0xee, 0x5b, 0x64, 0x1f, 0x63, 0x51, 0xbf, 0x6d, 0x3b, 0x63, 0x87,
-    0x5f, 0xfd, 0xd4, 0x8f, 0x75, 0xd4, 0xc1, 0x01, 0xd7, 0xf6, 0x7a, 0x11,
-    0x7a, 0x3a, 0xff, 0x06, 0x25, 0x9c, 0xcd, 0x1d, 0x7b, 0x5f, 0x74, 0x75,
-    0xff, 0xf6, 0x6f, 0x2f, 0x7f, 0x3a, 0xbd, 0x75, 0xa6, 0x8e, 0xbf, 0xef,
-    0xdf, 0x02, 0x9b, 0x8b, 0x9d, 0x7b, 0xc3, 0x07, 0x5d, 0xd5, 0x61, 0x38,
-    0x9c, 0x29, 0x99, 0x09, 0x65, 0x6e, 0x62, 0x23, 0xda, 0x53, 0xfa, 0x6f,
-    0x4a, 0xab, 0xa6, 0x89, 0x65, 0x17, 0xf6, 0x71, 0xae, 0xed, 0x34, 0x59,
-    0xb7, 0xfe, 0x8e, 0x03, 0xda, 0xee, 0x20, 0x4e, 0xbe, 0x41, 0x79, 0xce,
-    0xae, 0x9e, 0xee, 0x8f, 0x6f, 0x95, 0xec, 0x74, 0xea, 0x54, 0xf1, 0x36,
-    0x88, 0xa9, 0x54, 0x7f, 0xbc, 0x36, 0x6f, 0x91, 0x7f, 0x78, 0x75, 0xf2,
-    0x0f, 0x3f, 0x3a, 0xe5, 0xab, 0x07, 0x89, 0x31, 0x1d, 0xd8, 0x13, 0xaf,
-    0xfc, 0xf2, 0x57, 0x38, 0xd7, 0x76, 0x9a, 0x28, 0x0b, 0xfc, 0x8b, 0x86,
-    0x3e, 0xe4, 0xe7, 0x59, 0x5c, 0x44, 0xa2, 0xc5, 0x7a, 0x95, 0x7c, 0xfc,
-    0xde, 0x47, 0x5f, 0xbd, 0xa9, 0x20, 0x0e, 0xac, 0x3c, 0x97, 0x22, 0xbf,
-    0xa4, 0xae, 0x4d, 0x12, 0x3a, 0x95, 0x3c, 0xe8, 0x20, 0xbb, 0xfe, 0x9d,
-    0x7f, 0x6a, 0x16, 0x31, 0x31, 0xd6, 0xe9, 0xd7, 0xbe, 0x8c, 0xc7, 0x5d,
-    0x9e, 0xc3, 0x5c, 0x01, 0x0a, 0x02, 0x21, 0x45, 0x6a, 0xef, 0x9a, 0x3a,
-    0xf7, 0xe1, 0xc3, 0xaf, 0xf6, 0x73, 0xc3, 0x0b, 0xd1, 0xd6, 0xdb, 0x3a,
-    0x90, 0xf8, 0x3a, 0x38, 0x03, 0x1b, 0xe6, 0xbb, 0xb4, 0xd1, 0x6f, 0xde,
-    0xdb, 0x7f, 0x1d, 0x7f, 0x7d, 0xf3, 0xb5, 0xf8, 0x75, 0x70, 0xfe, 0x56,
-    0x5a, 0x01, 0xeb, 0xec, 0x14, 0x98, 0xeb, 0xdd, 0x8e, 0x1d, 0x7e, 0xea,
-    0x73, 0xae, 0x75, 0xff, 0xee, 0xc4, 0xfe, 0xce, 0x8e, 0x7b, 0xa8, 0x75,
-    0xe5, 0xe0, 0x4e, 0xb2, 0xce, 0xbf, 0xee, 0xc4, 0xe1, 0xc6, 0x74, 0xac,
-    0x22, 0xd3, 0x06, 0xe6, 0x26, 0x74, 0x8f, 0xa3, 0x77, 0xef, 0x4b, 0x5f,
-    0x74, 0x75, 0xed, 0x74, 0x27, 0x5f, 0xbe, 0xf8, 0x60, 0x07, 0x52, 0xcf,
-    0x13, 0x60, 0xe5, 0xff, 0xde, 0xd2, 0x6a, 0x07, 0x3d, 0xd4, 0x3a, 0xf0,
-    0xe7, 0x4e, 0xa5, 0x9e, 0xde, 0xc4, 0x1b, 0xf0, 0x61, 0x8f, 0xf5, 0x9d,
-    0x7f, 0xcf, 0xa8, 0xc1, 0x0f, 0x60, 0xeb, 0xff, 0xb1, 0x7c, 0xcd, 0xfa,
-    0x2e, 0xc7, 0x39, 0xd7, 0x6b, 0x5c, 0x3f, 0xc1, 0x35, 0xa8, 0x4d, 0xdf,
-    0x1f, 0xd0, 0x91, 0xe1, 0x4f, 0x7c, 0xe8, 0x3e, 0x3a, 0xf7, 0x23, 0xc7,
-    0x5f, 0xd3, 0x38, 0x7a, 0x8b, 0x3a, 0xfe, 0xf2, 0x60, 0x61, 0x67, 0x57,
-    0x8f, 0x61, 0x92, 0xdb, 0xb4, 0x27, 0x5f, 0xdb, 0xea, 0x1b, 0x8b, 0x3a,
-    0xb8, 0x8d, 0x87, 0x73, 0xd1, 0x1f, 0xe2, 0xb7, 0xdd, 0x50, 0x2b, 0x3a,
-    0xec, 0x91, 0xd5, 0x86, 0xe0, 0x48, 0xe9, 0x80, 0xbe, 0x15, 0x10, 0x9c,
-    0x91, 0x10, 0x5e, 0x32, 0x14, 0xe8, 0x5f, 0x34, 0x35, 0x38, 0xf7, 0xd8,
-    0xf9, 0x40, 0x7e, 0x30, 0xf7, 0xf3, 0xad, 0xfc, 0xfb, 0xaa, 0xb7, 0xf1,
-    0xd4, 0xaa, 0x3c, 0x46, 0x18, 0x77, 0xf0, 0x55, 0xd7, 0xb5, 0xb9, 0xd7,
-    0x31, 0x2c, 0x03, 0xaf, 0x2d, 0xf7, 0x3a, 0xed, 0x88, 0x75, 0xf7, 0x39,
-    0x9f, 0x4e, 0xbf, 0x6a, 0x7c, 0x65, 0x56, 0x20, 0xfd, 0x60, 0x7e, 0x61,
-    0xc7, 0x17, 0xa8, 0x4c, 0x15, 0x21, 0x4b, 0x7f, 0xff, 0xf9, 0x1a, 0xfc,
-    0x7e, 0xcb, 0x3d, 0x81, 0xd3, 0xaf, 0x39, 0x3c, 0x6e, 0x75, 0xfb, 0x8d,
-    0x77, 0x69, 0xa2, 0x94, 0xbf, 0xfe, 0x7f, 0x0e, 0x4f, 0xc8, 0xea, 0x77,
-    0x38, 0x75, 0xe7, 0x92, 0xb0, 0x8f, 0x6c, 0x76, 0x01, 0x9d, 0xff, 0x49,
-    0x5c, 0xe3, 0x5d, 0xda, 0x68, 0x93, 0xac, 0xaa, 0xd1, 0x0a, 0xe8, 0x15,
-    0x10, 0x93, 0x6a, 0x9e, 0x70, 0x56, 0x51, 0xbe, 0x06, 0xf9, 0x6d, 0xf2,
-    0x1e, 0x0a, 0x21, 0xb6, 0x34, 0xc4, 0x85, 0x73, 0x1c, 0x2b, 0xa6, 0x27,
-    0xe4, 0x2d, 0x97, 0x5a, 0x97, 0x76, 0x32, 0xb7, 0x6c, 0x04, 0x30, 0xc6,
-    0x19, 0xba, 0xa4, 0x0e, 0xfa, 0x32, 0xdd, 0x91, 0xd1, 0x5f, 0xb8, 0xd7,
-    0x76, 0x9a, 0x21, 0xfb, 0xff, 0x3c, 0x95, 0xce, 0x35, 0xdd, 0xa6, 0x89,
-    0x4e, 0xca, 0xe1, 0xfe, 0xac, 0xce, 0xff, 0x2b, 0x9c, 0x6b, 0xbb, 0x4d,
-    0x11, 0x3d, 0xfd, 0x32, 0x7b, 0x5f, 0xac, 0xeb, 0xff, 0xcc, 0x32, 0x8c,
-    0xb1, 0xce, 0x16, 0x17, 0xcf, 0x9d, 0xdb, 0x3a, 0xfd, 0xc6, 0xbb, 0xb4,
-    0xd1, 0x18, 0xdf, 0xff, 0x81, 0x29, 0xd8, 0x68, 0x60, 0x4e, 0xde, 0x7c,
-    0xf9, 0xdd, 0xb3, 0xaf, 0x93, 0x79, 0x30, 0x0e, 0xb2, 0xb0, 0x9a, 0x9c,
-    0x8b, 0xf1, 0x8b, 0xa6, 0x7e, 0x69, 0xbf, 0xfc, 0xaa, 0xde, 0x4a, 0xe7,
-    0x1a, 0xee, 0xd3, 0x44, 0xf3, 0x7f, 0x2a, 0x08, 0x19, 0x68, 0xea, 0x85,
-    0x51, 0xd3, 0x94, 0x4a, 0x39, 0x2e, 0xa8, 0x79, 0x5e, 0xfd, 0xc6, 0xbb,
-    0xb4, 0xd1, 0x10, 0x5f, 0xf9, 0xe4, 0xae, 0x71, 0xae, 0xed, 0x34, 0x4a,
-    0x96, 0x57, 0x0f, 0xf5, 0x66, 0x77, 0xf9, 0x5c, 0xe3, 0x5d, 0xda, 0x68,
-    0x8a, 0x2f, 0xf2, 0xb9, 0xc6, 0xbb, 0xb4, 0xd1, 0x19, 0x5f, 0xb8, 0xd7,
-    0x76, 0x9a, 0x26, 0x5b, 0xf4, 0xb3, 0xce, 0xd3, 0xaf, 0xca, 0xad, 0xe4,
-    0xae, 0x1e, 0xce, 0xe6, 0x77, 0xee, 0x35, 0xdd, 0xa6, 0x8a, 0x92, 0xc2,
-    0x75, 0xbe, 0x9d, 0x65, 0x70, 0xf5, 0x18, 0xcc, 0xff, 0x0f, 0xbf, 0xca,
-    0xe7, 0x1a, 0xee, 0xd3, 0x45, 0x75, 0x7f, 0x95, 0xce, 0x35, 0xdd, 0xa6,
-    0x8b, 0x16, 0xff, 0xe5, 0xbc, 0x95, 0xce, 0x35, 0xdd, 0xa6, 0x89, 0xea,
-    0xff, 0x99, 0x55, 0xe1, 0x36, 0xd3, 0x68, 0xeb, 0xff, 0xf4, 0xc3, 0x0b,
-    0x57, 0x34, 0x8c, 0x85, 0xdd, 0x43, 0xae, 0xd7, 0x8e, 0xbf, 0x0b, 0xac,
-    0x60, 0xeb, 0xfb, 0xfd, 0x75, 0xe4, 0xab, 0x00, 0xdd, 0x7d, 0x16, 0xbf,
-    0x67, 0xb4, 0x8b, 0x3a, 0xff, 0xf4, 0x6f, 0xec, 0x99, 0x39, 0xed, 0x7e,
-    0xc6, 0x75, 0xe7, 0xdd, 0x51, 0x3f, 0x5f, 0x13, 0x5b, 0xd8, 0x9c, 0x2f,
-    0x21, 0x21, 0xa8, 0x60, 0xd2, 0xaa, 0x94, 0xe1, 0x41, 0x23, 0xc3, 0xbf,
-    0x27, 0x45, 0xe6, 0x3a, 0xfd, 0x2c, 0x0f, 0xcc, 0x3a, 0x98, 0xb3, 0xce,
-    0x82, 0x6b, 0xf6, 0x79, 0x3f, 0xd1, 0xd7, 0x31, 0x0c, 0x54, 0xea, 0x62,
-    0xa7, 0x90, 0xc3, 0x13, 0xdf, 0x98, 0x73, 0x11, 0xae, 0x78, 0xeb, 0xfd,
-    0xf4, 0x73, 0x9c, 0x86, 0x9d, 0x4c, 0x41, 0xf3, 0x30, 0x8c, 0xef, 0xb8,
-    0xbf, 0x6e, 0x75, 0xfc, 0xc4, 0x31, 0x2c, 0x5c, 0x49, 0x67, 0x5e, 0x6e,
-    0x74, 0xab, 0xcb, 0x8d, 0x1d, 0x78, 0x1c, 0x83, 0xaf, 0xec, 0x02, 0x4c,
-    0x8c, 0x9d, 0x7f, 0xe7, 0xd7, 0xcd, 0x6b, 0x25, 0x28, 0x3a, 0xff, 0xfc,
-    0x2e, 0xa2, 0x72, 0x25, 0x2c, 0xd0, 0x01, 0x07, 0x50, 0x51, 0x7e, 0xa1,
-    0x6f, 0x4f, 0xef, 0xff, 0xee, 0x26, 0xd3, 0xad, 0x58, 0xe7, 0x13, 0x69,
-    0xbf, 0xce, 0x75, 0xf2, 0x77, 0xea, 0xce, 0xbf, 0xfc, 0x8a, 0x7c, 0xc1,
-    0x7d, 0xf4, 0xa2, 0x8e, 0x75, 0x34, 0xfc, 0x04, 0x8e, 0xff, 0xf3, 0xe8,
-    0x70, 0x0a, 0xf5, 0x1a, 0xfc, 0x3a, 0xfe, 0x0e, 0x29, 0xec, 0x69, 0xd7,
-    0xdd, 0x85, 0xb4, 0xea, 0x73, 0xce, 0xf1, 0x6d, 0xf8, 0x29, 0x32, 0x32,
-    0x75, 0xff, 0xdf, 0x22, 0x06, 0x17, 0xf3, 0xe7, 0x76, 0xce, 0xa8, 0x3f,
-    0x31, 0x28, 0xbf, 0xf7, 0x72, 0x6e, 0xa7, 0x63, 0x90, 0x75, 0xcf, 0xb9,
-    0xd7, 0xf9, 0xf4, 0xfd, 0xfc, 0x67, 0x3a, 0x84, 0xf2, 0x7f, 0x16, 0xa9,
-    0xd7, 0x03, 0x24, 0x36, 0x90, 0xda, 0xe1, 0x8a, 0xe1, 0xa7, 0xd2, 0x11,
-    0x84, 0xb7, 0xa1, 0x29, 0xf4, 0x83, 0x6a, 0x10, 0xd7, 0x85, 0xfc, 0x75,
-    0xe1, 0x4d, 0x1d, 0x66, 0x58, 0xb3, 0x69, 0x03, 0x57, 0x47, 0x4e, 0xbe,
-    0xe6, 0xc7, 0x59, 0xd7, 0xe5, 0x8b, 0xfb, 0x47, 0x5e, 0x8c, 0xe1, 0xd7,
-    0xff, 0x9a, 0xfc, 0x7f, 0x26, 0xa0, 0x60, 0x07, 0x5a, 0x5d, 0x3e, 0x0f,
-    0xa3, 0x55, 0xba, 0x2c, 0x39, 0x08, 0x6a, 0xc4, 0xcf, 0x5a, 0x58, 0x82,
-    0xbf, 0xc3, 0x4e, 0xf6, 0xb6, 0xb6, 0x8e, 0xbf, 0xee, 0xbf, 0xa2, 0x6d,
-    0x22, 0xce, 0xbf, 0xd1, 0x21, 0xcd, 0xfd, 0x87, 0x5e, 0xef, 0xeb, 0x3a,
-    0xb1, 0x15, 0x08, 0x45, 0xc3, 0x8f, 0xcc, 0x6f, 0xef, 0x6a, 0x68, 0x19,
-    0xce, 0xbf, 0x0a, 0x89, 0x9a, 0x3a, 0xfc, 0xcb, 0xf9, 0xda, 0x75, 0xff,
-    0xd8, 0xcb, 0x83, 0x1b, 0xd7, 0x06, 0x8e, 0xbf, 0xf6, 0x9f, 0x78, 0x17,
-    0x0e, 0x28, 0x75, 0x22, 0x33, 0x7a, 0x4c, 0x24, 0xfe, 0x43, 0xba, 0x3a,
-    0x75, 0x82, 0x75, 0x2c, 0xd2, 0x88, 0xad, 0xf0, 0x87, 0xe2, 0x87, 0x5f,
-    0xd9, 0xa6, 0x5c, 0x67, 0x3a, 0xb0, 0xfc, 0x5c, 0x80, 0x49, 0x2f, 0xdf,
-    0xa9, 0xa0, 0xc1, 0xd7, 0x96, 0x9a, 0x3a, 0xff, 0xb0, 0x5e, 0x5a, 0x93,
-    0x33, 0x9d, 0x7d, 0x2d, 0x20, 0x9d, 0x68, 0x91, 0xec, 0xee, 0x73, 0x7f,
-    0x9f, 0x92, 0x86, 0xa3, 0x4e, 0xa8, 0x55, 0xdd, 0x90, 0xfb, 0x48, 0x68,
-    0xf4, 0xb1, 0xca, 0x45, 0xd3, 0xf2, 0x8b, 0xff, 0xca, 0x3e, 0x6f, 0xef,
-    0x46, 0x6c, 0x46, 0x9d, 0x7f, 0x87, 0x35, 0xe7, 0x71, 0x3a, 0x94, 0x3f,
-    0xad, 0x89, 0x77, 0xff, 0xfe, 0x4e, 0x72, 0x3e, 0xf9, 0x07, 0xf9, 0x66,
-    0x83, 0xfb, 0xf2, 0x47, 0x5f, 0xff, 0xc3, 0x8a, 0x60, 0xfc, 0xd7, 0xbb,
-    0x8b, 0xfb, 0x00, 0x3a, 0xa1, 0x19, 0x78, 0xdd, 0x7f, 0xbf, 0x7d, 0x24,
-    0xc8, 0xc9, 0xd4, 0x89, 0xa2, 0xf6, 0x1e, 0x02, 0x43, 0x7b, 0xb0, 0x27,
-    0x5e, 0xdf, 0xcb, 0x3a, 0x9a, 0x6d, 0xdc, 0x6a, 0xfd, 0x38, 0x78, 0x8c,
-    0x9d, 0x7f, 0xbe, 0xbe, 0xc4, 0x99, 0x19, 0x3a, 0xff, 0xe4, 0x1c, 0xff,
-    0x93, 0xae, 0x33, 0xc7, 0x54, 0x1f, 0xd0, 0x4d, 0xef, 0xe0, 0xbf, 0x01,
-    0xb7, 0x87, 0x5e, 0xef, 0xdd, 0x87, 0x5f, 0xf4, 0x2c, 0x71, 0xbc, 0x40,
-    0x1d, 0x52, 0x3d, 0x6d, 0x10, 0x5f, 0xf4, 0x4b, 0x13, 0x5a, 0xfe, 0x0e,
-    0xbf, 0xf7, 0xa1, 0x7b, 0xb5, 0x37, 0xce, 0x1d, 0x7e, 0xee, 0x71, 0x34,
-    0x75, 0xe1, 0x49, 0x6e, 0x7c, 0xbe, 0x3f, 0xbf, 0xf3, 0xe0, 0x20, 0x5c,
-    0x38, 0xa1, 0xd5, 0x3a, 0x61, 0x52, 0x84, 0xe0, 0x0c, 0xef, 0xf3, 0xef,
-    0xaf, 0x7b, 0x18, 0xce, 0xbf, 0xfc, 0x9c, 0xeb, 0xe3, 0x43, 0x9c, 0x02,
-    0x1d, 0x7f, 0xd1, 0x2d, 0x0c, 0x01, 0xd6, 0x75, 0xfc, 0xa7, 0xa3, 0x05,
-    0xa7, 0x5f, 0xfe, 0x8c, 0xdf, 0xdd, 0x8f, 0x0c, 0x03, 0x47, 0x5d, 0x00,
-    0x3a, 0xee, 0xac, 0xea, 0x69, 0xab, 0xd0, 0xad, 0x22, 0x30, 0x3c, 0x59,
-    0xfb, 0x9d, 0xe9, 0xd3, 0x87, 0x5f, 0xdf, 0xeb, 0xda, 0xcf, 0x1d, 0x7f,
-    0x7e, 0xc1, 0x49, 0x91, 0x93, 0xae, 0xce, 0x9d, 0x79, 0x96, 0x59, 0x2a,
-    0xff, 0xf7, 0x93, 0xda, 0xea, 0x6d, 0xfd, 0xe4, 0x48, 0xa5, 0x4b, 0xfa,
-    0x51, 0x30, 0xf4, 0x1c, 0x72, 0xef, 0x19, 0xfe, 0x69, 0x7f, 0xff, 0xc9,
-    0xe9, 0x40, 0xe7, 0xba, 0x99, 0xe8, 0x5a, 0x72, 0x47, 0x54, 0x97, 0xa5,
-    0x82, 0xd7, 0x84, 0x0d, 0x85, 0x1a, 0x10, 0xcd, 0x08, 0x5e, 0x46, 0x58,
-    0xb3, 0x7e, 0x9b, 0x01, 0x1c, 0x61, 0xed, 0xe8, 0xcf, 0xf6, 0x25, 0xdf,
-    0xf6, 0xf2, 0xd6, 0xb0, 0x2f, 0xe3, 0xad, 0x87, 0x5f, 0x70, 0x5f, 0x61,
-    0xd5, 0x07, 0xd4, 0xa1, 0xca, 0x07, 0xde, 0x06, 0xb0, 0xeb, 0x39, 0xd7,
-    0xa3, 0xba, 0x3a, 0xb7, 0x35, 0x48, 0x1f, 0x7f, 0xff, 0x3f, 0x93, 0xae,
-    0xbf, 0x99, 0xa8, 0xce, 0x60, 0x9d, 0x7f, 0xf6, 0x9f, 0x7d, 0x6b, 0x04,
-    0x1b, 0x78, 0x75, 0xff, 0xe4, 0x6e, 0xa3, 0x6f, 0x3d, 0x29, 0x66, 0x8e,
-    0xae, 0x26, 0x14, 0x24, 0x3e, 0x58, 0xd8, 0x8d, 0x7d, 0xce, 0xe0, 0x9d,
-    0x48, 0x7b, 0xee, 0x7f, 0x7d, 0xe8, 0xdd, 0x93, 0xa9, 0xa9, 0xf8, 0xf6,
-    0x3a, 0xe6, 0x48, 0x2e, 0x67, 0xa7, 0x5f, 0xfe, 0x81, 0x6f, 0xde, 0x38,
-    0x13, 0xdd, 0x83, 0xaf, 0xf2, 0x33, 0xac, 0xc1, 0x9c, 0xeb, 0xe8, 0xd4,
-    0x6c, 0x3a, 0xff, 0xe8, 0x17, 0xf4, 0xa1, 0x47, 0x67, 0xc7, 0x57, 0x4f,
-    0x97, 0xf2, 0x2b, 0xdf, 0x1d, 0xa7, 0x53, 0x53, 0x37, 0x00, 0xbe, 0x92,
-    0x7d, 0x09, 0x7d, 0xa2, 0x3b, 0xe5, 0xfd, 0x81, 0x3a, 0xf9, 0x03, 0x8b,
-    0x3a, 0xf9, 0xdc, 0x40, 0x75, 0x99, 0x83, 0x7e, 0xa1, 0x05, 0xdf, 0xac,
-    0xeb, 0xfc, 0xcb, 0xcd, 0x92, 0x86, 0x33, 0xa9, 0x0f, 0xd7, 0xa5, 0x1a,
-    0x17, 0xbf, 0xd0, 0xfc, 0xeb, 0x2e, 0x12, 0xae, 0x65, 0x92, 0xa8, 0x27,
-    0x94, 0xc9, 0x95, 0xef, 0x23, 0x19, 0x4a, 0x9a, 0x3b, 0xfb, 0x76, 0xa6,
-    0xba, 0x87, 0x5f, 0x7f, 0x2f, 0xfc, 0x75, 0x22, 0x7e, 0x33, 0x43, 0x5b,
-    0x50, 0x9b, 0xf1, 0x7e, 0xd9, 0x6d, 0xf7, 0x31, 0xd8, 0xce, 0xb9, 0x9d,
-    0x1d, 0x6c, 0x3a, 0xdb, 0xe1, 0xa6, 0xf0, 0xbd, 0xf6, 0xf2, 0x62, 0xf7,
-    0x3a, 0xff, 0xed, 0x68, 0x23, 0x01, 0xec, 0x7b, 0x47, 0x54, 0x22, 0x4f,
-    0x09, 0xff, 0x29, 0xbf, 0xf7, 0x93, 0x8e, 0x0d, 0xaf, 0x67, 0x4e, 0xbf,
-    0xe4, 0x64, 0x73, 0xc9, 0xf8, 0x0e, 0xbf, 0xcf, 0xcf, 0x68, 0x51, 0x43,
-    0xaf, 0xff, 0x6b, 0x14, 0xcf, 0xf8, 0xe1, 0x8e, 0xc1, 0xd5, 0x24, 0xc8,
-    0x90, 0xbd, 0x8d, 0x01, 0xce, 0x34, 0x65, 0x7f, 0xff, 0xf7, 0x5d, 0x3d,
-    0x1d, 0x1c, 0xf7, 0x53, 0xec, 0xa3, 0x62, 0x08, 0x0e, 0xbd, 0x89, 0xc3,
-    0xaf, 0xf4, 0x91, 0x7d, 0xdd, 0xd8, 0xce, 0xbe, 0x7e, 0x44, 0x8e, 0xbf,
-    0xe7, 0xdf, 0xe6, 0xfa, 0xc1, 0x50, 0xea, 0x9d, 0x15, 0x9b, 0x8d, 0x2c,
-    0xdb, 0xc4, 0x17, 0xdd, 0x63, 0x45, 0x9d, 0x78, 0x60, 0x07, 0x5e, 0x85,
-    0xe7, 0xc3, 0x7d, 0xa2, 0x4b, 0xff, 0x46, 0xfd, 0x85, 0xb7, 0xa9, 0x31,
-    0xd5, 0x0a, 0x83, 0x32, 0x31, 0xd4, 0x7d, 0xe1, 0x9d, 0xf9, 0xaf, 0x3e,
-    0x32, 0x75, 0xfa, 0x38, 0x1c, 0x13, 0xa8, 0x4f, 0x37, 0xc5, 0x17, 0xff,
-    0x40, 0x23, 0xab, 0x17, 0x53, 0xa8, 0x75, 0x98, 0x47, 0x5f, 0xdd, 0x81,
-    0x65, 0xf7, 0x3a, 0xff, 0xc3, 0x34, 0x60, 0xcf, 0x9b, 0xf8, 0xea, 0x09,
-    0xf5, 0xb9, 0x6d, 0xe5, 0x3e, 0xac, 0xeb, 0xff, 0x90, 0x3d, 0x86, 0xc0,
-    0x1c, 0x40, 0x75, 0xff, 0xff, 0x2d, 0xc7, 0x79, 0x2a, 0xce, 0x26, 0xcc,
-    0x1c, 0x0b, 0xc8, 0xf1, 0x7a, 0xdf, 0x94, 0xf3, 0xb8, 0x9d, 0x78, 0x7f,
-    0x9c, 0xea, 0x73, 0xc3, 0xf1, 0x35, 0x22, 0x36, 0x06, 0x16, 0xf5, 0x0a,
-    0x98, 0x78, 0x42, 0xb4, 0x27, 0x7f, 0x12, 0x1d, 0x0f, 0xff, 0x18, 0xcd,
-    0xcc, 0x43, 0x00, 0xeb, 0xc9, 0x1c, 0x3a, 0x98, 0x46, 0xe7, 0xa3, 0xf7,
-    0xff, 0x71, 0x17, 0x0c, 0x63, 0x8b, 0xde, 0x0e, 0xa9, 0x1f, 0x54, 0xc4,
-    0xb7, 0xc8, 0x2e, 0x13, 0xaf, 0x4e, 0xb4, 0x3a, 0x82, 0x6e, 0xc4, 0x7e,
-    0xfd, 0x2c, 0xd9, 0x12, 0x3a, 0xf6, 0x72, 0x0e, 0xad, 0xd1, 0x80, 0x8b,
-    0xdc, 0x20, 0xe9, 0x45, 0xff, 0xf6, 0x7b, 0x59, 0x37, 0x63, 0x66, 0x77,
-    0xb0, 0x75, 0xff, 0xff, 0xf9, 0x33, 0x7d, 0x26, 0x33, 0xf3, 0x37, 0x96,
-    0x93, 0xda, 0x4d, 0xc2, 0x1f, 0xe7, 0x3a, 0xff, 0xfc, 0x82, 0x1f, 0x9f,
-    0x7c, 0x9a, 0x74, 0x1f, 0xe4, 0x75, 0x0a, 0x66, 0x1e, 0x50, 0xd9, 0x08,
-    0x9b, 0xdf, 0xf2, 0x47, 0x5f, 0xcf, 0xe0, 0x7d, 0x19, 0x1d, 0x5f, 0x0f,
-    0x2e, 0x71, 0xdb, 0xfd, 0x12, 0x45, 0x59, 0x65, 0x92, 0xaf, 0x29, 0x81,
-    0x3a, 0xfe, 0xeb, 0xf1, 0xb1, 0xe3, 0xae, 0x70, 0x9d, 0x7f, 0x71, 0xf5,
-    0xd7, 0x91, 0xd6, 0xdc, 0xeb, 0x91, 0x93, 0xae, 0xfa, 0x03, 0xaa, 0x63,
-    0x5c, 0x01, 0x6b, 0xd2, 0x70, 0x9d, 0x73, 0x2c, 0x9d, 0x52, 0x46, 0xae,
-    0x0a, 0xb4, 0xb1, 0x0f, 0xf4, 0x44, 0xc8, 0xdd, 0xef, 0x7d, 0x01, 0x4a,
-    0x9e, 0xb5, 0xff, 0x77, 0x16, 0x81, 0x9f, 0xfd, 0x1d, 0x7f, 0xc8, 0x1c,
-    0x5a, 0x4c, 0x8c, 0x9d, 0x7f, 0xf9, 0xc3, 0x98, 0x2a, 0x6b, 0x58, 0x20,
-    0x3a, 0xfb, 0xbf, 0xba, 0x90, 0x7f, 0xeb, 0x38, 0xbf, 0xff, 0xa4, 0xfa,
-    0xd4, 0x64, 0xff, 0xc8, 0x3c, 0x17, 0x64, 0xeb, 0x40, 0x51, 0x2c, 0x87,
-    0x55, 0xa4, 0xdd, 0xbd, 0x1a, 0x7d, 0xfb, 0x4f, 0x3e, 0xba, 0x75, 0x49,
-    0x5b, 0x58, 0x47, 0x37, 0x8d, 0x5d, 0x23, 0xa6, 0xf1, 0x55, 0xfb, 0x67,
-    0xde, 0xa7, 0x8e, 0xbf, 0xec, 0xf7, 0x63, 0x9e, 0xc6, 0x9d, 0x7a, 0x39,
-    0x31, 0xd5, 0x0b, 0xd1, 0x79, 0x1b, 0x6a, 0x42, 0x0b, 0xa4, 0xaf, 0x2e,
-    0x84, 0x0b, 0x02, 0x57, 0xb6, 0x6f, 0x7b, 0x4f, 0x31, 0xd7, 0xff, 0x20,
-    0x5f, 0xc9, 0xac, 0x96, 0x74, 0xeb, 0x9f, 0x68, 0xeb, 0x67, 0x4f, 0x67,
-    0xc8, 0x35, 0xba, 0x27, 0x05, 0xd6, 0xfb, 0x37, 0x9f, 0x61, 0xd7, 0xfc,
-    0x21, 0xc1, 0xfe, 0x59, 0xa3, 0xaf, 0xf7, 0xdf, 0x0e, 0x4e, 0x9c, 0x3a,
-    0xfb, 0xc9, 0xa4, 0x3a, 0xb8, 0x8b, 0x07, 0x25, 0x13, 0x7f, 0xcd, 0x2f,
-    0xfb, 0xa8, 0x14, 0x60, 0xc0, 0xa1, 0xd7, 0xf9, 0xe5, 0x81, 0xe6, 0xb4,
-    0x75, 0xf4, 0x67, 0xd0, 0x9d, 0x7f, 0x94, 0x4f, 0x3f, 0x59, 0x63, 0x3a,
-    0xff, 0x64, 0xdd, 0xcd, 0x38, 0x9d, 0x7f, 0xe0, 0xe6, 0xf2, 0xd7, 0xb4,
-    0xe0, 0x3a, 0xb8, 0x7e, 0x1f, 0x98, 0xdf, 0xf7, 0x72, 0x59, 0xfb, 0x05,
-    0xc4, 0xeb, 0xff, 0xfc, 0x83, 0x9b, 0xf9, 0x47, 0xf7, 0x63, 0xb9, 0xb1,
-    0xe4, 0x75, 0x05, 0x3b, 0xa6, 0x99, 0x21, 0x17, 0x21, 0x4f, 0xe2, 0x3d,
-    0x87, 0x77, 0xfc, 0x14, 0xe4, 0x6c, 0x06, 0xa4, 0x75, 0xd0, 0xb3, 0xad,
-    0xe8, 0x3c, 0xfe, 0x9d, 0x5f, 0xfa, 0x34, 0xfd, 0x40, 0xb5, 0x27, 0x3a,
-    0xa1, 0x58, 0x26, 0x47, 0xe6, 0xf0, 0xad, 0xfc, 0x9e, 0xf4, 0x0f, 0x8e,
-    0xbf, 0xc9, 0xd4, 0xe4, 0xa6, 0x83, 0xaf, 0xff, 0xc9, 0xfb, 0x7e, 0xee,
-    0x07, 0xd3, 0xf1, 0x37, 0x01, 0xd7, 0xcf, 0xc8, 0x91, 0xd7, 0xff, 0xf2,
-    0x0b, 0xa0, 0x83, 0x91, 0xd7, 0x4f, 0x47, 0x4e, 0xa1, 0x3f, 0x5f, 0x10,
-    0x5f, 0x93, 0xda, 0xfe, 0x73, 0xaf, 0xff, 0x0a, 0x03, 0xdb, 0xb5, 0x39,
-    0xf6, 0x02, 0x75, 0xff, 0x77, 0xe8, 0x7f, 0xf6, 0x81, 0x07, 0x54, 0x22,
-    0x1d, 0xd2, 0xe8, 0x29, 0xe0, 0x24, 0x33, 0x96, 0x43, 0xe8, 0x58, 0x5f,
-    0xb9, 0xfb, 0x7b, 0x07, 0x5f, 0xdc, 0x9a, 0x49, 0xed, 0x1d, 0x61, 0x83,
-    0xd6, 0xc2, 0x8b, 0xfd, 0x33, 0xcc, 0xfb, 0xcb, 0x47, 0x5f, 0xcf, 0x3a,
-    0x4c, 0x8c, 0x9d, 0x58, 0x7c, 0x6e, 0x6b, 0x7f, 0x4f, 0x83, 0x3e, 0x32,
-    0x75, 0xff, 0x44, 0xff, 0x65, 0xdf, 0xde, 0x73, 0xab, 0x0f, 0xaf, 0x85,
-    0xd6, 0x61, 0x1d, 0x7e, 0x8e, 0x73, 0x3a, 0x75, 0xfc, 0x2e, 0xa4, 0x2e,
-    0x0e, 0xa6, 0x2c, 0xf9, 0x64, 0x29, 0xf9, 0x35, 0xf4, 0x4e, 0xa2, 0x87,
-    0x5f, 0xff, 0x91, 0xb0, 0xbd, 0x3f, 0x31, 0x7f, 0xb5, 0xe4, 0x75, 0xc9,
-    0xb0, 0xeb, 0x74, 0xea, 0x91, 0xfd, 0xb1, 0xaa, 0x7e, 0x2f, 0x78, 0x30,
-    0xb3, 0xaf, 0xf6, 0x03, 0x26, 0x8d, 0xf4, 0x75, 0x41, 0xe7, 0x60, 0xdd,
-    0xfd, 0xd7, 0x94, 0x6a, 0x47, 0x5f, 0xf6, 0x75, 0x37, 0xd7, 0x7f, 0xd1,
-    0xd7, 0x60, 0xb4, 0xf9, 0x80, 0x59, 0x7f, 0x0b, 0x80, 0x38, 0x27, 0x5f,
-    0x93, 0x6f, 0x38, 0xa1, 0xd7, 0x29, 0x23, 0xaf, 0xdd, 0x4d, 0x88, 0xd3,
-    0xae, 0xce, 0xc8, 0xdf, 0xb4, 0x5e, 0x96, 0x89, 0x5d, 0xb6, 0x9b, 0xcc,
-    0xb2, 0xc9, 0x57, 0xfe, 0xe0, 0xfe, 0xff, 0x72, 0x68, 0x59, 0xca, 0x97,
-    0xf7, 0xee, 0xa4, 0xc8, 0xc9, 0xd5, 0x07, 0xf1, 0x8a, 0x17, 0xfa, 0x03,
-    0x92, 0x81, 0x69, 0xd5, 0x0c, 0x81, 0x59, 0x0d, 0x64, 0x7e, 0x4c, 0x70,
-    0x9d, 0x9a, 0x11, 0x1c, 0x84, 0x5a, 0xe1, 0x0d, 0xd3, 0x57, 0x84, 0xf8,
-    0xc2, 0x07, 0x50, 0x86, 0xf1, 0x67, 0xf0, 0xbf, 0x66, 0x17, 0xbf, 0x48,
-    0x2f, 0xb9, 0xcc, 0xe9, 0xd7, 0xf7, 0x53, 0x6b, 0x6b, 0xf5, 0x0e, 0xa8,
-    0x3d, 0x66, 0x90, 0xd9, 0x82, 0x75, 0x90, 0xeb, 0xfe, 0xf4, 0x73, 0x5d,
-    0x81, 0xf1, 0xd6, 0x60, 0x9d, 0x7f, 0xde, 0x8e, 0x6b, 0xb0, 0x3e, 0x3a,
-    0xed, 0x41, 0xd7, 0x96, 0x18, 0x3a, 0xff, 0x0f, 0x9e, 0x6d, 0x47, 0x8e,
-    0xa4, 0x3c, 0xd7, 0x1b, 0xbe, 0x47, 0xc6, 0x9d, 0x7f, 0xec, 0xd8, 0x39,
-    0xa9, 0x86, 0x02, 0x75, 0xf3, 0x43, 0x13, 0x9d, 0x70, 0x20, 0xeb, 0xda,
-    0x4e, 0x1d, 0x58, 0x7a, 0x40, 0x22, 0xf0, 0xad, 0xfe, 0x96, 0x0a, 0x07,
-    0x04, 0xeb, 0xde, 0xd2, 0xb0, 0x9e, 0xce, 0x0a, 0x4c, 0x6f, 0xd6, 0x20,
-    0x10, 0x08, 0xfe, 0xa1, 0x21, 0xe2, 0xeb, 0xb5, 0x07, 0x5e, 0x58, 0x60,
-    0xeb, 0xfc, 0x3e, 0x79, 0xb5, 0x1e, 0x3a, 0x90, 0xf3, 0x5c, 0x6e, 0xf9,
-    0x1f, 0x1a, 0x75, 0xff, 0xb3, 0x60, 0xe6, 0xa6, 0x18, 0x09, 0xd7, 0xcd,
-    0x0c, 0x4e, 0x75, 0xfd, 0x30, 0x11, 0x8d, 0xe6, 0x3a, 0xe0, 0x41, 0xd7,
-    0xb4, 0x9c, 0x3a, 0xb1, 0x10, 0x6d, 0x22, 0x01, 0x8f, 0x85, 0x6f, 0xf4,
-    0xb0, 0x50, 0x38, 0x27, 0x5f, 0xc2, 0xe1, 0xc5, 0x15, 0x85, 0xc8, 0x80,
-    0x8a, 0x60, 0x7b, 0x65, 0x08, 0x4d, 0x08, 0x8e, 0xb1, 0x00, 0x80, 0x47,
-    0xf5, 0x0c, 0x1f, 0x1e, 0x5f, 0xfd, 0xc8, 0xdf, 0x43, 0x0b, 0xcd, 0xfc,
-    0x75, 0xff, 0xf9, 0xc3, 0x98, 0x2a, 0x7d, 0x18, 0x19, 0xd3, 0x87, 0x5e,
-    0x7e, 0x4e, 0x79, 0x04, 0xaf, 0xa5, 0x9b, 0xc8, 0xf2, 0x09, 0x5e, 0xd2,
-    0x04, 0xf2, 0x09, 0x5c, 0xcb, 0x27, 0x90, 0x4a, 0x9a, 0x8a, 0x59, 0x8a,
-    0x7c, 0x5e, 0xc9, 0x45, 0xcf, 0xe2, 0xc8, 0x24, 0x54, 0xdf, 0xdf, 0xd9,
-    0xdc, 0xc1, 0x50, 0xeb, 0xce, 0x20, 0xf8, 0xbe, 0x89, 0x13, 0x95, 0x3c,
-    0x86, 0x02, 0xd1, 0x06, 0x33, 0x8f, 0x1a, 0x5f, 0x6d, 0xe3, 0xf4, 0xeb,
-    0x63, 0x1a, 0x28, 0x00, 0xfb, 0x69, 0x1d, 0x7f, 0xa6, 0x97, 0xf3, 0xf9,
-    0x27, 0x2a, 0xff, 0xa0, 0x64, 0x30, 0x07, 0x59, 0xd6, 0x83, 0xaf, 0xf2,
-    0x4b, 0xf7, 0xd7, 0x50, 0xeb, 0xfb, 0x36, 0x3a, 0xf3, 0xa7, 0x5a, 0x45,
-    0x5e, 0x7e, 0x4e, 0x55, 0x15, 0x50, 0x6d, 0x9a, 0x20, 0xb1, 0xcb, 0xd0,
-    0x06, 0x94, 0xa9, 0xad, 0xa5, 0xa2, 0xf0, 0x61, 0x21, 0x50, 0x98, 0xae,
-    0x43, 0xba, 0xff, 0xfb, 0xe8, 0xcb, 0x5d, 0x0e, 0x70, 0x0b, 0x4d, 0x1d,
-    0x7d, 0xfb, 0xf2, 0x47, 0x59, 0x67, 0x5d, 0x92, 0x09, 0xb2, 0x98, 0x8a,
-    0xff, 0xec, 0xdf, 0xda, 0x41, 0x80, 0x3a, 0xce, 0xbe, 0xc9, 0x91, 0x67,
-    0x54, 0xe7, 0xc6, 0xca, 0x15, 0xfc, 0xd8, 0x9a, 0x50, 0x02, 0xac, 0x87,
-    0x5f, 0xf4, 0xff, 0xc8, 0x3d, 0xfd, 0xc4, 0xeb, 0xf9, 0x21, 0x73, 0xe3,
-    0x27, 0x5f, 0xb2, 0x75, 0xe2, 0xce, 0xbd, 0xa4, 0xe1, 0xd4, 0x27, 0x85,
-    0xe2, 0x7b, 0xf8, 0x5c, 0x00, 0xff, 0x47, 0x5f, 0xc8, 0xa7, 0xd8, 0x5a,
-    0xa1, 0x4c, 0x1f, 0x03, 0xf8, 0x77, 0xa6, 0xff, 0x10, 0xd6, 0x27, 0x90,
-    0x84, 0x83, 0x19, 0xa5, 0xf0, 0xe4, 0xff, 0x9d, 0x7f, 0xd9, 0xef, 0x83,
-    0x80, 0xfb, 0xb9, 0xd5, 0x25, 0xd5, 0xf0, 0x95, 0xe0, 0x82, 0x86, 0xfc,
-    0x35, 0xec, 0x64, 0x80, 0x27, 0x18, 0x41, 0xea, 0x52, 0xc7, 0x8d, 0x36,
-    0xc8, 0xaf, 0xff, 0xd3, 0xf3, 0x98, 0x17, 0x5f, 0x5f, 0xc3, 0x13, 0x1d,
-    0x7f, 0xff, 0xfb, 0xfe, 0x7f, 0x30, 0xb8, 0x35, 0xac, 0x53, 0x3f, 0xe3,
-    0x86, 0x3b, 0x07, 0x5f, 0x6d, 0x77, 0xff, 0xa7, 0x5e, 0x65, 0x96, 0x4a,
-    0xba, 0x50, 0x52, 0xa5, 0xfd, 0x42, 0x67, 0x73, 0xaa, 0xee, 0xf5, 0xc4,
-    0x7b, 0xf9, 0x48, 0xe7, 0x33, 0xa7, 0x5f, 0xd3, 0xcd, 0x26, 0x17, 0x27,
-    0x3a, 0xfb, 0xd3, 0xb8, 0x9d, 0x7f, 0xe5, 0x3f, 0xd4, 0x93, 0x93, 0xfe,
-    0x03, 0xaf, 0x3e, 0xec, 0x9d, 0x4a, 0x1f, 0x07, 0x50, 0xef, 0xd3, 0xf1,
-    0x21, 0x67, 0x5f, 0xff, 0x47, 0xdf, 0x0c, 0x01, 0xfc, 0x0f, 0xa3, 0x23,
-    0xa9, 0x89, 0x4d, 0x47, 0x0d, 0x52, 0x10, 0x2e, 0x47, 0xe2, 0x7b, 0xff,
-    0x3f, 0xb4, 0xce, 0x74, 0x0f, 0xe3, 0xaf, 0xff, 0xfd, 0x9e, 0x86, 0x8e,
-    0x60, 0xc4, 0xbd, 0xd7, 0x58, 0xe6, 0xc3, 0xa8, 0x28, 0xa6, 0x64, 0xfa,
-    0xf7, 0xd0, 0xcc, 0x75, 0xe9, 0x20, 0x9d, 0x7d, 0x3f, 0xdd, 0xa6, 0x4e,
-    0xbf, 0xe8, 0xeb, 0xa7, 0xa6, 0x46, 0x4e, 0xbf, 0xfc, 0xa4, 0x6b, 0x91,
-    0xd1, 0xcf, 0x42, 0xce, 0xbf, 0xed, 0x0e, 0x6c, 0x49, 0x91, 0x93, 0xaf,
-    0xff, 0xef, 0xde, 0x76, 0xff, 0x3f, 0xb3, 0xa3, 0x9e, 0xea, 0x1d, 0x7e,
-    0x89, 0x87, 0xfd, 0x1d, 0x58, 0x98, 0x3a, 0x24, 0x74, 0xeb, 0xcb, 0xb7,
-    0x20, 0x9d, 0x7f, 0x38, 0x83, 0x3c, 0xa1, 0xd5, 0x0a, 0x90, 0x67, 0x24,
-    0x90, 0xfb, 0x8d, 0x09, 0x4f, 0xa3, 0x3f, 0xd8, 0x79, 0xb6, 0x29, 0x7d,
-    0xdf, 0xd7, 0x07, 0x5c, 0xfa, 0x3a, 0xef, 0xd8, 0x27, 0x53, 0x9e, 0x90,
-    0x91, 0x7e, 0x2b, 0x73, 0xaa, 0xc5, 0xbe, 0x7d, 0x8b, 0x01, 0xb9, 0x85,
-    0x09, 0x36, 0x1e, 0x56, 0xc5, 0x48, 0xd8, 0x71, 0xe4, 0x4e, 0x13, 0xcf,
-    0x28, 0x72, 0x50, 0xea, 0x0c, 0xb2, 0xac, 0xa4, 0x60, 0xa9, 0x19, 0xd3,
-    0x65, 0x0f, 0xef, 0x1b, 0x7a, 0x4a, 0x44, 0x63, 0x58, 0x9a, 0x3f, 0xee,
-    0x4a, 0x58, 0x5c, 0xaf, 0x0e, 0xd2, 0x16, 0x1e, 0x32, 0x00, 0x43, 0x4c,
-    0x65, 0xa0, 0x6a, 0x90, 0xbb, 0xea, 0x75, 0x07, 0xf1, 0xf5, 0x32, 0x7f,
-    0xb7, 0x1b, 0xf7, 0xd9, 0x67, 0x3b, 0x50, 0xce, 0xbf, 0x2f, 0x11, 0xc0,
-    0x75, 0xf3, 0x5d, 0xda, 0x68, 0xa2, 0xaf, 0xff, 0xce, 0x08, 0x6f, 0x53,
-    0x5d, 0x4f, 0x77, 0x04, 0xea, 0xe1, 0xff, 0x89, 0x6d, 0xf9, 0x55, 0xbc,
-    0x95, 0x84, 0x62, 0xe4, 0x29, 0x2f, 0xf2, 0xb9, 0xc6, 0xbb, 0xb4, 0xd1,
-    0x74, 0x5f, 0xfc, 0xab, 0xc9, 0x5c, 0xe3, 0x5d, 0xda, 0x68, 0x92, 0xef,
-    0xdc, 0x6b, 0xbb, 0x4d, 0x17, 0x95, 0xcf, 0xb0, 0xeb, 0x2b, 0x87, 0x95,
-    0xb6, 0x67, 0x50, 0xfb, 0x29, 0x93, 0x94, 0x48, 0xff, 0x21, 0x30, 0xd8,
-    0x4a, 0xcc, 0x72, 0xb3, 0xfe, 0xca, 0x92, 0x1b, 0xd0, 0x36, 0xd4, 0xb2,
-    0xef, 0x22, 0xfe, 0x7f, 0xb2, 0x13, 0x77, 0xff, 0x95, 0x5b, 0xc9, 0x5c,
-    0xe3, 0x5d, 0xda, 0x68, 0x96, 0x6e, 0xff, 0xa7, 0x5f, 0xe4, 0x0f, 0x71,
-    0x05, 0x43, 0xaf, 0xba, 0xfe, 0xfc, 0xeb, 0xee, 0xc3, 0x1a, 0xce, 0xbd,
-    0xfb, 0x5c, 0xea, 0x92, 0x24, 0xd0, 0xc5, 0x8c, 0x8b, 0xe9, 0x25, 0xfc,
-    0x1f, 0x7e, 0xf2, 0xd1, 0xd7, 0xbc, 0xeb, 0x3a, 0xff, 0xdd, 0x8e, 0xa2,
-    0x9e, 0xd3, 0x80, 0xeb, 0xf8, 0x7d, 0xc8, 0x76, 0x9d, 0x7c, 0xd7, 0x76,
-    0x9a, 0x23, 0x3b, 0xf9, 0x21, 0x73, 0xe3, 0x27, 0x5c, 0x32, 0x3a, 0xcb,
-    0x3a, 0xfc, 0x9c, 0xeb, 0xab, 0xc3, 0xd2, 0x59, 0x6f, 0xd1, 0x5b, 0xf9,
-    0xe4, 0x9c, 0x7e, 0x1d, 0x7f, 0xf6, 0x93, 0xfd, 0x60, 0xff, 0x2c, 0xd1,
-    0xd7, 0xb5, 0x1b, 0x9d, 0x52, 0x4f, 0x07, 0x0f, 0xb8, 0x56, 0xb7, 0xf1,
-    0x4e, 0xd1, 0x5f, 0x91, 0x2f, 0xfb, 0x8e, 0xcf, 0x52, 0x39, 0x07, 0x5f,
-    0xf4, 0xb5, 0x91, 0xf2, 0x34, 0xb3, 0xaf, 0xb7, 0xec, 0x68, 0xeb, 0xed,
-    0x47, 0xb4, 0x75, 0x61, 0xe1, 0xe8, 0x8a, 0xff, 0xef, 0x27, 0x1c, 0x1f,
-    0x37, 0x94, 0x2c, 0xeb, 0xf0, 0xc4, 0xb4, 0xe7, 0x52, 0x1f, 0x5e, 0xc4,
-    0x6b, 0xff, 0xff, 0xec, 0xf7, 0x91, 0x7c, 0x4c, 0xdc, 0x7f, 0xf4, 0x77,
-    0xe6, 0xc4, 0xf4, 0xd0, 0x75, 0xfe, 0x79, 0x6b, 0x4e, 0x32, 0x3a, 0xfc,
-    0xa7, 0xbd, 0x0b, 0x3a, 0xff, 0xf7, 0xa1, 0xa9, 0xe4, 0x5c, 0xda, 0x41,
-    0x3a, 0xd2, 0x3a, 0x90, 0xf6, 0x3e, 0xa4, 0x5f, 0x81, 0x1e, 0x80, 0x9d,
-    0x48, 0x8c, 0x97, 0x84, 0x07, 0xe4, 0x77, 0xff, 0xdf, 0xfb, 0x5b, 0xca,
-    0x04, 0x1a, 0xf9, 0xf8, 0x9d, 0x7a, 0x3d, 0x07, 0x50, 0x4f, 0xbb, 0x62,
-    0xa5, 0xee, 0xe0, 0x9d, 0x48, 0x6f, 0xbf, 0x24, 0xbb, 0xb3, 0x1d, 0x7f,
-    0xb7, 0xd0, 0xe7, 0x03, 0x07, 0x52, 0x1e, 0x4b, 0x8b, 0xdf, 0x7b, 0xbf,
-    0xed, 0x9d, 0x7f, 0xb2, 0x38, 0xf2, 0x4e, 0x9d, 0x7f, 0x91, 0x9d, 0x47,
-    0x5d, 0x8c, 0xea, 0xe1, 0xf2, 0xf8, 0xc2, 0x91, 0x15, 0xab, 0x84, 0x5d,
-    0xff, 0xe4, 0xef, 0xec, 0x61, 0xef, 0xfa, 0xde, 0x4e, 0x75, 0x61, 0xfb,
-    0xb9, 0x3d, 0xef, 0xb8, 0xc2, 0x3a, 0xff, 0xf7, 0xe0, 0x5a, 0x0e, 0x00,
-    0x71, 0xe6, 0x3a, 0xff, 0xa1, 0x3a, 0x90, 0x33, 0x7e, 0x75, 0xff, 0xbf,
-    0x0f, 0x33, 0xfe, 0xc2, 0xf0, 0xea, 0xc4, 0x6f, 0xf0, 0x87, 0xa9, 0x1a,
-    0x37, 0xbf, 0xfe, 0xde, 0x49, 0xc0, 0xf7, 0xfe, 0x63, 0x7b, 0x87, 0x5c,
-    0x8c, 0x9d, 0x76, 0xd6, 0x1d, 0x5a, 0x35, 0xde, 0x16, 0xbf, 0xb5, 0x1e,
-    0xd7, 0x50, 0xeb, 0xf0, 0xe2, 0xf9, 0x87, 0x5f, 0x73, 0x66, 0x04, 0xea,
-    0xc3, 0xf4, 0x59, 0x67, 0xe4, 0xb7, 0xc0, 0x4d, 0xe4, 0x75, 0xfe, 0x81,
-    0xf2, 0x4e, 0x30, 0x75, 0xff, 0xe4, 0xe2, 0x4f, 0x03, 0x9d, 0xe7, 0xfb,
-    0x0e, 0xa0, 0x22, 0x74, 0x48, 0xbc, 0x61, 0x4c, 0x06, 0x60, 0x6c, 0x42,
-    0xaa, 0x74, 0x10, 0x97, 0x64, 0x7b, 0x8a, 0x31, 0xee, 0x6e, 0x8f, 0x93,
-    0x42, 0x33, 0x84, 0x6b, 0x84, 0x0f, 0x61, 0xf4, 0xf0, 0xe0, 0x03, 0x50,
-    0xc6, 0x89, 0xa8, 0x7f, 0xf8, 0xf3, 0x63, 0xfe, 0xdc, 0x25, 0x7e, 0xc3,
-    0x32, 0xff, 0xff, 0xef, 0xf7, 0x92, 0xae, 0x3e, 0xc5, 0xe8, 0x3d, 0x8e,
-    0x05, 0xdd, 0x93, 0xa9, 0x54, 0xf0, 0xc6, 0x34, 0xfb, 0xff, 0xca, 0xad,
-    0xe4, 0xae, 0x71, 0xae, 0xed, 0x34, 0x4d, 0x37, 0xff, 0x95, 0x5b, 0xc9,
-    0x5c, 0xe3, 0x5d, 0xda, 0x68, 0x9c, 0x6f, 0xfc, 0xf2, 0x57, 0x38, 0xd7,
-    0x76, 0x9a, 0x28, 0x1b, 0xed, 0x0e, 0xf2, 0x3a, 0xca, 0xac, 0xfb, 0x3c,
-    0x95, 0x7e, 0xe3, 0x5d, 0xda, 0x68, 0xb8, 0x2f, 0xe1, 0xcf, 0x35, 0x34,
-    0x75, 0xd0, 0x87, 0x5f, 0xe1, 0x94, 0x20, 0x71, 0x67, 0x56, 0x22, 0x89,
-    0x66, 0x7d, 0x2b, 0xfc, 0x52, 0xfd, 0x25, 0x54, 0x62, 0xd4, 0x3a, 0x95,
-    0x3e, 0xd8, 0x3d, 0xb9, 0xc0, 0x75, 0xfa, 0x69, 0x40, 0xc8, 0xea, 0x3a,
-    0xb0, 0xd8, 0x89, 0x3d, 0xf4, 0x03, 0x19, 0x3a, 0xe4, 0x57, 0x88, 0x86,
-    0x14, 0x6f, 0xa3, 0xf7, 0xfd, 0x25, 0x73, 0x8d, 0x77, 0x69, 0xa2, 0x49,
-    0xb2, 0xbd, 0x44, 0x13, 0x9e, 0xdc, 0xc8, 0x0e, 0xbf, 0xcf, 0xe1, 0xc9,
-    0xdc, 0x4e, 0xbf, 0xb0, 0x5f, 0x79, 0x68, 0xeb, 0xfa, 0x17, 0xcc, 0x0f,
-    0x8e, 0xb9, 0xd5, 0x0a, 0x27, 0xd4, 0x17, 0xe1, 0x86, 0x8b, 0x2a, 0x76,
-    0xcb, 0x7e, 0x54, 0xe2, 0x76, 0x95, 0x4c, 0xae, 0x08, 0x61, 0xea, 0x33,
-    0x8f, 0x46, 0x55, 0xb2, 0x19, 0x17, 0xfe, 0x51, 0xd5, 0xce, 0x35, 0xdd,
-    0xa6, 0x8b, 0x52, 0xff, 0xcf, 0x25, 0x73, 0x8d, 0x77, 0x69, 0xa2, 0x55,
-    0xb9, 0x19, 0x3a, 0x8e, 0xb2, 0xaa, 0x22, 0xd5, 0x69, 0x7e, 0x4a, 0xda,
-    0x16, 0xbf, 0xb3, 0x8d, 0x77, 0x69, 0xa2, 0x29, 0xbf, 0xf9, 0x6a, 0xf8,
-    0x5c, 0x1a, 0xf6, 0x34, 0xea, 0x54, 0xff, 0x1c, 0xe2, 0xff, 0x2b, 0x9c,
-    0x6b, 0xbb, 0x4d, 0x11, 0xa5, 0xdf, 0xf4, 0xeb, 0xff, 0x07, 0x16, 0x9c,
-    0xcd, 0x4d, 0x07, 0x5f, 0xff, 0xf3, 0xff, 0xae, 0xe0, 0x7e, 0xfd, 0xd2,
-    0x7d, 0xf2, 0x6a, 0x6f, 0xa7, 0x5e, 0x47, 0x64, 0xea, 0x44, 0x64, 0x31,
-    0x9e, 0xad, 0xc2, 0xf9, 0xae, 0xed, 0x34, 0x53, 0xf7, 0x7a, 0x0e, 0xae,
-    0x1e, 0x17, 0x8b, 0x6f, 0xfd, 0xe9, 0xa3, 0xdd, 0x79, 0xbe, 0x61, 0xd7,
-    0xff, 0x91, 0x63, 0xff, 0x53, 0x99, 0xa9, 0xa0, 0xeb, 0xff, 0xbf, 0xf7,
-    0x3f, 0x9b, 0x4d, 0x79, 0xb4, 0x75, 0xff, 0xd9, 0x37, 0xe3, 0x3e, 0x9a,
-    0xf3, 0x68, 0xeb, 0x2a, 0xc0, 0x55, 0x1f, 0x10, 0xdf, 0xc7, 0x44, 0x22,
-    0x74, 0x11, 0x49, 0xf2, 0x4d, 0xff, 0xe5, 0x56, 0xf2, 0x57, 0x38, 0xd7,
-    0x76, 0x9a, 0x26, 0xab, 0xfc, 0xae, 0x71, 0xae, 0xed, 0x34, 0x57, 0x77,
-    0xcd, 0x77, 0x69, 0xa2, 0xbe, 0xbc, 0xcb, 0x2c, 0x95, 0x61, 0x29, 0x52,
-    0xfe, 0xb8, 0x7d, 0x6b, 0x4c, 0xbd, 0x28, 0xdc, 0xeb, 0xd3, 0x67, 0x4e,
-    0xbf, 0xf6, 0x75, 0x97, 0xf6, 0xa3, 0x27, 0x3a, 0xde, 0x3a, 0xff, 0x93,
-    0x99, 0x3a, 0x4b, 0x02, 0x75, 0x70, 0xf1, 0xdc, 0x42, 0xfd, 0xbe, 0xd7,
-    0x7f, 0xfa, 0x75, 0xb8, 0x75, 0x1d, 0x6e, 0xa1, 0x75, 0xc1, 0x0b, 0x2b,
-    0x89, 0xb7, 0x4c, 0x44, 0xe3, 0x82, 0x39, 0xa8, 0x42, 0xfe, 0x43, 0xb6,
-    0x93, 0x7f, 0xf9, 0x55, 0xbc, 0x95, 0xce, 0x35, 0xdd, 0xa6, 0x89, 0xee,
-    0xfd, 0xd8, 0xda, 0x7d, 0xce, 0xbf, 0x71, 0xae, 0xed, 0x34, 0x5c, 0x36,
-    0x56, 0x0f, 0x77, 0x0a, 0xaf, 0xfe, 0x55, 0xe4, 0xae, 0x71, 0xae, 0xed,
-    0x34, 0x49, 0xf5, 0x0c, 0x83, 0x39, 0xe1, 0x89, 0x22, 0x25, 0x25, 0x67,
-    0x35, 0xc6, 0x65, 0x7e, 0x4a, 0x18, 0xeb, 0x9e, 0xa1, 0x69, 0xb0, 0x9e,
-    0xff, 0x2b, 0x9c, 0x6b, 0xbb, 0x4d, 0x11, 0x55, 0xfb, 0x8d, 0x77, 0x69,
-    0xa2, 0x99, 0xbf, 0x93, 0xb8, 0xfb, 0x80, 0xeb, 0x2b, 0x87, 0xbf, 0xb6,
-    0x67, 0x7f, 0xf9, 0x55, 0xbc, 0x95, 0xce, 0x35, 0xdd, 0xa6, 0x89, 0x9e,
-    0xff, 0xf2, 0xab, 0x79, 0x2b, 0x9c, 0x6b, 0xbb, 0x4d, 0x14, 0x6d, 0x4e,
-    0x9b, 0xb8, 0x61, 0x3c, 0xa1, 0x5f, 0x95, 0xef, 0xfc, 0xf2, 0x57, 0x38,
-    0xd7, 0x76, 0x9a, 0x23, 0xab, 0xff, 0xb9, 0x3a, 0xba, 0x1c, 0xf6, 0xa1,
-    0x67, 0x52, 0xa8, 0x8f, 0x84, 0xab, 0xbf, 0xe9, 0xd7, 0xcd, 0x6f, 0xed,
-    0x3a, 0xfd, 0x82, 0x1c, 0x9c, 0xeb, 0xfd, 0x10, 0xdc, 0xe7, 0x30, 0xea,
-    0x43, 0xd6, 0x12, 0x6b, 0xf6, 0x71, 0xbf, 0xa8, 0x75, 0xff, 0x87, 0x14,
-    0x79, 0xb5, 0xd8, 0x09, 0xd7, 0xa6, 0x7f, 0x1d, 0x7c, 0xd7, 0x76, 0x9a,
-    0x29, 0xab, 0xf6, 0x6e, 0xcb, 0xf4, 0xeb, 0xff, 0xb5, 0x82, 0x18, 0xf8,
-    0xc5, 0x36, 0x01, 0x0e, 0xa0, 0xa6, 0x48, 0x85, 0x33, 0x1f, 0x70, 0x70,
-    0x4b, 0x74, 0x51, 0x7f, 0xff, 0xd8, 0x3e, 0xd2, 0x37, 0x07, 0x4d, 0xea,
-    0x75, 0xbf, 0x67, 0x3a, 0xff, 0xb4, 0xfb, 0xe4, 0xd1, 0xdd, 0x1d, 0x77,
-    0x50, 0x51, 0x41, 0xe6, 0x7b, 0xff, 0xa5, 0xd4, 0x19, 0xf5, 0xfc, 0x72,
-    0x63, 0xaf, 0xfb, 0x5a, 0x6a, 0x73, 0x89, 0x39, 0xd7, 0xfe, 0xc6, 0x5c,
-    0x0f, 0xef, 0x67, 0x4e, 0xbf, 0xdd, 0x84, 0x03, 0xfb, 0xf3, 0xaf, 0xfc,
-    0x3f, 0xfb, 0xb9, 0x34, 0xa3, 0x73, 0xad, 0x31, 0xd7, 0xec, 0xeb, 0x88,
-    0x4e, 0xa9, 0xcd, 0xb0, 0x04, 0x6e, 0x85, 0x0e, 0xbf, 0x9c, 0x1a, 0x61,
-    0x98, 0x66, 0x18, 0xeb, 0xf9, 0x21, 0x73, 0xe3, 0x27, 0x5f, 0xff, 0x67,
-    0xbb, 0x92, 0xe3, 0x8f, 0xba, 0xf2, 0x3a, 0xe8, 0x01, 0xd7, 0xf9, 0xf7,
-    0x86, 0xa3, 0x55, 0xe2, 0x23, 0xc4, 0xb7, 0xea, 0x6d, 0x62, 0x7a, 0x68,
-    0xed, 0xd2, 0x21, 0x16, 0xd4, 0x32, 0xef, 0xde, 0xeb, 0x2f, 0x39, 0xd6,
-    0x55, 0x80, 0xbc, 0x5f, 0x02, 0xe1, 0x79, 0xc8, 0xd1, 0x1b, 0x0f, 0x7d,
-    0xcb, 0x78, 0x8c, 0x27, 0x3a, 0x3d, 0xf4, 0xa0, 0x5f, 0xa9, 0xb7, 0xee,
-    0x35, 0xdd, 0xa6, 0x8a, 0xaa, 0xff, 0xcf, 0x25, 0x73, 0x8d, 0x77, 0x69,
-    0xa2, 0x6d, 0xb2, 0xb8, 0x7f, 0xab, 0x33, 0xbf, 0xca, 0xe7, 0x1a, 0xee,
-    0xd3, 0x45, 0x7f, 0x7e, 0xe3, 0x5d, 0xda, 0x68, 0xb1, 0xae, 0xda, 0x91,
-    0xd6, 0x57, 0x0f, 0x32, 0x63, 0x3b, 0xf6, 0x9b, 0xd8, 0x50, 0xeb, 0xfc,
-    0x3f, 0xcb, 0x34, 0xfe, 0x3a, 0xfe, 0x62, 0x42, 0xc0, 0x60, 0x0a, 0x87,
-    0x5f, 0xf0, 0xff, 0x3c, 0xd2, 0x8e, 0x4e, 0x75, 0xdc, 0xf1, 0xd7, 0xcf,
-    0x2c, 0x09, 0xd7, 0xf7, 0xb3, 0x81, 0xc1, 0x3a, 0xd8, 0x13, 0xcb, 0xf1,
-    0x05, 0xe5, 0x25, 0x87, 0x59, 0x5c, 0x4d, 0x35, 0x66, 0x5d, 0x3b, 0x73,
-    0xc1, 0x61, 0xd1, 0x3d, 0x91, 0x54, 0xf4, 0x79, 0x1b, 0xad, 0xfb, 0x8d,
-    0x77, 0x69, 0xa2, 0xd5, 0xbf, 0xf3, 0xc9, 0x5c, 0xe3, 0x5d, 0xda, 0x68,
-    0xa0, 0xaf, 0xd0, 0xce, 0xde, 0x70, 0xeb, 0x2b, 0x88, 0xa7, 0x59, 0x9f,
-    0xd4, 0xab, 0xfd, 0x02, 0x08, 0x63, 0x75, 0x9d, 0x77, 0x20, 0xea, 0x91,
-    0xe4, 0x6d, 0x19, 0xdf, 0x35, 0xdd, 0xa6, 0x8b, 0x8a, 0xfe, 0xfd, 0xf7,
-    0x0e, 0x70, 0xea, 0xe1, 0xed, 0xe8, 0xb6, 0xf7, 0x21, 0x67, 0x5f, 0x3e,
-    0xd2, 0x4e, 0x75, 0xfb, 0xbf, 0xa9, 0x82, 0x75, 0xf8, 0x38, 0xc7, 0x1d,
-    0x3a, 0xf6, 0xd2, 0x34, 0xea, 0x09, 0xf7, 0xf0, 0xa3, 0x68, 0xa6, 0xff,
-    0x2d, 0xe5, 0xa4, 0x0e, 0x1d, 0x7f, 0xa1, 0x6f, 0xb2, 0x39, 0xb4, 0x75,
-    0xfd, 0x9c, 0x7f, 0x7f, 0x07, 0x5f, 0xff, 0x38, 0xc2, 0x6d, 0x69, 0x35,
-    0x9d, 0xcd, 0xb3, 0xa8, 0x27, 0xfb, 0xb0, 0xb2, 0xff, 0xe4, 0x1f, 0xe5,
-    0x9a, 0xd2, 0x07, 0x0e, 0xa9, 0x8f, 0x9b, 0xc4, 0x96, 0x56, 0x15, 0x77,
-    0xe4, 0x20, 0x38, 0x45, 0xd1, 0xb7, 0x84, 0x98, 0x0c, 0xbc, 0x63, 0xf6,
-    0x31, 0x9b, 0xf3, 0x09, 0x87, 0x81, 0x48, 0x3a, 0xff, 0xc9, 0xbb, 0x0d,
-    0xae, 0x7c, 0xf9, 0xdd, 0xb3, 0xaf, 0xbb, 0x1e, 0x69, 0xd4, 0xc5, 0x4f,
-    0xb4, 0x29, 0x97, 0xff, 0x98, 0x65, 0x19, 0x63, 0x9c, 0x2c, 0x2f, 0x9f,
-    0x3b, 0xb6, 0x75, 0xfb, 0x8d, 0x77, 0x69, 0xa2, 0xe9, 0xbf, 0x40, 0xb8,
-    0x60, 0xeb, 0xd1, 0xed, 0xa3, 0xaf, 0xb0, 0x38, 0x13, 0xaf, 0xf9, 0xf6,
-    0x47, 0xb5, 0xfb, 0x58, 0x27, 0x59, 0x56, 0x19, 0x3f, 0xd8, 0x84, 0xfc,
-    0x8a, 0x31, 0x89, 0x0c, 0xfa, 0x48, 0xe3, 0xc2, 0x41, 0x7f, 0xfd, 0x83,
-    0xe4, 0x5f, 0x61, 0x05, 0xf8, 0xa1, 0xd7, 0xf6, 0x66, 0x9b, 0xe8, 0x3a,
-    0xfe, 0x9e, 0x3c, 0xea, 0x7e, 0x75, 0x1d, 0x7f, 0xf4, 0x70, 0x1f, 0x35,
-    0xd8, 0x5b, 0x89, 0xd7, 0xfa, 0x39, 0xf7, 0xbd, 0xc0, 0x1d, 0x52, 0x3f,
-    0x8e, 0xa2, 0x5f, 0xd2, 0x79, 0x38, 0xb4, 0xeb, 0xff, 0xd9, 0xe8, 0x67,
-    0xec, 0xfa, 0xc5, 0xc3, 0x19, 0xd6, 0x55, 0x89, 0x4c, 0x7b, 0x21, 0x05,
-    0x31, 0x10, 0x95, 0xd7, 0x13, 0x9b, 0x5c, 0x69, 0xb7, 0xd8, 0xcb, 0x12,
-    0xb3, 0xaf, 0xf9, 0x38, 0x31, 0xba, 0xdf, 0xc7, 0x5f, 0xff, 0xf7, 0xfc,
-    0x96, 0xba, 0xe9, 0xce, 0x73, 0xfd, 0xd3, 0x8f, 0xa3, 0xaf, 0xfc, 0x2e,
-    0xcf, 0xb3, 0xaf, 0x33, 0x9d, 0x7f, 0xff, 0x74, 0x7f, 0x76, 0x3c, 0x97,
-    0x71, 0x4c, 0x0c, 0xdf, 0x9d, 0x73, 0x70, 0xea, 0x83, 0xf5, 0x51, 0x82,
-    0xf2, 0x9a, 0x91, 0xd7, 0xfe, 0x96, 0x73, 0x8f, 0x29, 0xf1, 0x93, 0xaf,
-    0xfe, 0xc0, 0xc4, 0xa3, 0x91, 0xf5, 0xc4, 0xeb, 0xff, 0x6c, 0xc9, 0x2c,
-    0x29, 0xb2, 0x02, 0x75, 0x2d, 0x10, 0x6e, 0x85, 0x73, 0xab, 0x3a, 0xa3,
-    0xe9, 0x9a, 0x79, 0x0b, 0x2d, 0x11, 0x78, 0x77, 0xec, 0x30, 0xab, 0xaa,
-    0xba, 0x06, 0x53, 0xad, 0xff, 0xbc, 0x8d, 0x40, 0xb8, 0xa9, 0x07, 0x5f,
-    0xf4, 0x6f, 0xd7, 0xd7, 0xa1, 0x93, 0xaa, 0x0f, 0xd7, 0x87, 0x97, 0x7f,
-    0xd3, 0xaf, 0xc3, 0x9d, 0x7f, 0x1d, 0x7f, 0x49, 0xf3, 0x64, 0x04, 0xea,
-    0x62, 0xcf, 0x49, 0x8a, 0x12, 0xdf, 0x27, 0xf2, 0x83, 0xaf, 0xcf, 0x34,
-    0x93, 0xc7, 0x5f, 0xfa, 0x03, 0xc8, 0x92, 0x6f, 0xec, 0x3a, 0xa4, 0x88,
-    0x50, 0x10, 0xf8, 0x9e, 0xff, 0xd1, 0xcd, 0x75, 0x1a, 0xdf, 0xe7, 0x3a,
-    0xff, 0xff, 0xa0, 0x3d, 0xcd, 0xfc, 0x2f, 0xd0, 0x3e, 0xb4, 0xfc, 0x69,
-    0xd7, 0xfb, 0x33, 0x14, 0x51, 0xe4, 0x75, 0x28, 0x89, 0x7f, 0x32, 0xdf,
-    0xb3, 0x4d, 0xf4, 0x1d, 0x7f, 0xf9, 0x19, 0xd3, 0x7a, 0x9b, 0xfb, 0x9c,
-    0x83, 0xab, 0x0f, 0xc7, 0x84, 0xd7, 0xed, 0x89, 0xcc, 0x09, 0xd7, 0xff,
-    0xda, 0xea, 0x6b, 0xdd, 0xc0, 0xa6, 0xb0, 0x4e, 0xbd, 0xd8, 0x1c, 0x3f,
-    0x5f, 0xca, 0x2f, 0xf4, 0x2f, 0x11, 0x70, 0xc6, 0x75, 0xfe, 0x92, 0xf4,
-    0x83, 0xbc, 0x8e, 0xa6, 0x9f, 0x34, 0xc6, 0x77, 0x9d, 0xda, 0x68, 0x93,
-    0x2f, 0x6d, 0x26, 0x8e, 0xa6, 0x9e, 0x2e, 0xd1, 0x3d, 0xf9, 0xac, 0x33,
-    0x09, 0x89, 0x62, 0xce, 0xbf, 0xd9, 0xbf, 0xbc, 0xf2, 0xd1, 0xd5, 0x07,
-    0xdd, 0xc3, 0xbb, 0xfc, 0x2f, 0xed, 0x37, 0xf1, 0x3a, 0xff, 0xfe, 0xe6,
-    0x01, 0x00, 0xce, 0x26, 0xc1, 0xcf, 0x75, 0x0e, 0xac, 0x44, 0x62, 0x19,
-    0x54, 0x95, 0x30, 0xe4, 0x26, 0x38, 0xd0, 0xb8, 0x49, 0xf6, 0x15, 0xb7,
-    0xf0, 0x40, 0xc5, 0xe8, 0x1b, 0x67, 0x5e, 0xd2, 0x04, 0xeb, 0xf8, 0x63,
-    0x75, 0xbf, 0x8e, 0xbf, 0xe8, 0x6f, 0xbf, 0xef, 0x21, 0x93, 0xaf, 0xf3,
-    0x53, 0x9a, 0x9a, 0x1c, 0xeb, 0xff, 0xbf, 0xd7, 0x5e, 0x5d, 0x79, 0x40,
-    0x9d, 0x5b, 0x9f, 0xaf, 0x0c, 0xae, 0xea, 0x4c, 0x98, 0xcf, 0x06, 0xd6,
-    0x59, 0xe8, 0x57, 0xdf, 0x79, 0x16, 0xe7, 0x5f, 0xe4, 0xee, 0xa3, 0xd0,
-    0x13, 0xab, 0x0f, 0x47, 0xc4, 0x17, 0xfd, 0x1d, 0xf2, 0x4e, 0xb8, 0x69,
-    0xd7, 0xff, 0xe7, 0x6f, 0x23, 0xa3, 0x9e, 0xc5, 0x59, 0x65, 0x92, 0xaa,
-    0x48, 0xb0, 0xd1, 0x0f, 0x8e, 0x2f, 0xe6, 0xb7, 0xf6, 0x8c, 0x1d, 0x7f,
-    0xfb, 0x37, 0x90, 0xc4, 0xb9, 0x1e, 0x7f, 0x1d, 0x7f, 0xe7, 0xf4, 0x73,
-    0x5d, 0x81, 0xf1, 0xd7, 0xec, 0x92, 0x3e, 0xc3, 0xa8, 0x4f, 0x8f, 0x47,
-    0x95, 0x24, 0x66, 0x7f, 0x0a, 0xbb, 0xff, 0xc3, 0x12, 0xe7, 0x3f, 0xdd,
-    0x38, 0xfa, 0x3a, 0xff, 0xfb, 0x58, 0xa0, 0xe7, 0xb5, 0x92, 0x17, 0x64,
-    0xeb, 0xb6, 0x27, 0x51, 0x31, 0xe4, 0xab, 0xed, 0xa8, 0xee, 0x8e, 0xa8,
-    0x3d, 0x4c, 0x30, 0xbf, 0xbc, 0x3f, 0xcf, 0xbb, 0x19, 0xd7, 0xff, 0xa2,
-    0x71, 0xcc, 0x9f, 0xca, 0x40, 0xc8, 0xeb, 0xff, 0x38, 0xcf, 0xd7, 0x5a,
-    0x69, 0x0e, 0xa7, 0x45, 0xc0, 0x99, 0xb2, 0x93, 0x79, 0x96, 0x59, 0x2a,
-    0xfa, 0x75, 0xa6, 0x8a, 0x54, 0xbf, 0xba, 0x02, 0x75, 0xb8, 0xe7, 0x8e,
-    0x26, 0x57, 0xff, 0xff, 0x7e, 0xe2, 0xde, 0x66, 0xc8, 0x1f, 0x2e, 0x30,
-    0x43, 0x9b, 0xf8, 0xeb, 0xfd, 0x28, 0xe4, 0xf1, 0xc9, 0xce, 0xbf, 0xb5,
-    0xa4, 0xc1, 0x01, 0xd7, 0xb9, 0x8c, 0x67, 0x5f, 0xfa, 0x19, 0xfb, 0x3e,
-    0xb1, 0x70, 0xc6, 0x75, 0x71, 0x11, 0xab, 0x2b, 0xf0, 0xf5, 0x42, 0x3c,
-    0x72, 0x18, 0x37, 0xe4, 0xf4, 0xf8, 0xc9, 0xd7, 0xfd, 0x0d, 0xe8, 0xff,
-    0xe8, 0xd1, 0xd7, 0xff, 0x26, 0xd4, 0x36, 0x17, 0x81, 0x75, 0x9d, 0x7f,
-    0xfe, 0xf7, 0x72, 0x5f, 0x1b, 0xd4, 0xf6, 0xed, 0x4e, 0x1d, 0x5c, 0x47,
-    0xe2, 0xca, 0x3a, 0x70, 0x28, 0x97, 0xfc, 0xb8, 0xe6, 0xcc, 0xe4, 0x4c,
-    0x75, 0xff, 0xb8, 0xd5, 0xc6, 0xfa, 0xcd, 0x98, 0x75, 0xfe, 0x10, 0x6d,
-    0xe0, 0x71, 0x67, 0x5f, 0xc3, 0xf3, 0x6f, 0x39, 0x07, 0x54, 0x22, 0x93,
-    0x10, 0x1c, 0xd2, 0xff, 0xb1, 0xc1, 0xf3, 0x02, 0xf2, 0x3a, 0xff, 0xf3,
-    0xcf, 0xd4, 0x81, 0xc9, 0x93, 0x88, 0x75, 0x62, 0x78, 0xc0, 0x3c, 0xd4,
-    0x37, 0xbc, 0x5a, 0xc9, 0xc5, 0xf8, 0x73, 0xaf, 0xe3, 0xaf, 0xfd, 0x28,
-    0x19, 0xfe, 0xf0, 0x7f, 0x91, 0xd4, 0xc6, 0x7c, 0xd3, 0x12, 0xdf, 0x7a,
-    0x7c, 0x09, 0xd7, 0xfc, 0x8a, 0x7d, 0xe0, 0x16, 0x9a, 0x3a, 0xa6, 0x3d,
-    0xdd, 0xb2, 0x2b, 0xcc, 0xb2, 0xc9, 0xd7, 0xff, 0xec, 0x5f, 0x86, 0x01,
-    0x81, 0xd6, 0x2e, 0x1a, 0x52, 0xa5, 0xfd, 0xff, 0xb3, 0x7f, 0x83, 0x9b,
-    0x38, 0x9a, 0x3a, 0xfe, 0x6f, 0x52, 0x05, 0xa7, 0x54, 0x1f, 0x66, 0x20,
-    0xdf, 0xee, 0x47, 0x91, 0xa8, 0x13, 0xaf, 0xd2, 0x9b, 0x31, 0xa7, 0x5b,
-    0x87, 0x53, 0x10, 0x7d, 0x10, 0x63, 0xf4, 0x9e, 0xb1, 0x52, 0x9a, 0x42,
-    0x0f, 0xa8, 0xa3, 0x0c, 0xed, 0x42, 0x22, 0xf7, 0xa5, 0xd3, 0xac, 0x87,
-    0x5f, 0xdd, 0x8f, 0x8d, 0x49, 0xce, 0xbf, 0xb8, 0xfc, 0x18, 0x91, 0xd7,
-    0xff, 0xd0, 0xa6, 0xba, 0xe9, 0xe8, 0x58, 0xba, 0x87, 0x5f, 0xfb, 0x36,
-    0x75, 0x3e, 0x6b, 0x48, 0xb3, 0xae, 0x7f, 0x49, 0x11, 0xfd, 0x4e, 0xbf,
-    0xf2, 0x49, 0x39, 0xbc, 0x0c, 0x68, 0xea, 0x61, 0xe9, 0xb1, 0x04, 0x3f,
-    0x85, 0xe3, 0x0b, 0xaf, 0x17, 0x5d, 0x25, 0x58, 0x0d, 0xaf, 0xb3, 0x09,
-    0xa6, 0x21, 0x65, 0x39, 0x84, 0xa1, 0xae, 0x18, 0x4a, 0xe4, 0xaf, 0x75,
-    0x16, 0x9b, 0x1a, 0x7e, 0xf1, 0xa8, 0x21, 0x84, 0xd0, 0xf9, 0xe4, 0x62,
-    0xbd, 0x86, 0xc3, 0xc2, 0x54, 0x04, 0xc3, 0x1b, 0x16, 0xa5, 0x74, 0x7a,
-    0x58, 0x4e, 0xda, 0xc7, 0xd8, 0xdf, 0xaf, 0xff, 0x73, 0x19, 0x0f, 0x72,
-    0x61, 0xce, 0x48, 0xeb, 0xdc, 0xc6, 0x33, 0xaf, 0xfd, 0x0c, 0xfd, 0x9f,
-    0x58, 0xb8, 0x63, 0x3a, 0xb8, 0x8a, 0xc5, 0xa5, 0x78, 0x7a, 0xff, 0xf9,
-    0xd7, 0x1c, 0x6f, 0x3f, 0x53, 0x9f, 0xbe, 0x8e, 0xac, 0x44, 0x17, 0xe6,
-    0x17, 0xfb, 0x8d, 0xfd, 0xc2, 0xb8, 0x3a, 0xff, 0xe8, 0xe7, 0xdf, 0x27,
-    0xbb, 0x81, 0x43, 0xaf, 0xfd, 0xd1, 0x89, 0xfe, 0xf7, 0xae, 0xc6, 0x75,
-    0x42, 0x2e, 0xa7, 0x33, 0xc4, 0x4b, 0xcf, 0xc9, 0xce, 0xb9, 0x96, 0x4e,
-    0xbc, 0xed, 0x55, 0xa6, 0xd1, 0x91, 0xcb, 0xfa, 0x38, 0xf2, 0x4e, 0x9d,
-    0x7e, 0xc5, 0xf5, 0xc2, 0x75, 0x95, 0x87, 0x40, 0xfc, 0x14, 0xcc, 0x8f,
-    0x19, 0x42, 0xa6, 0xcb, 0x0f, 0xe4, 0x28, 0x1e, 0xb6, 0x17, 0x19, 0x56,
-    0xfa, 0x86, 0xee, 0xc6, 0x36, 0x4d, 0x36, 0x8a, 0xea, 0x4e, 0xcb, 0x64,
-    0x33, 0xca, 0x5b, 0xc6, 0x6b, 0xc2, 0x85, 0xc2, 0x2f, 0xb1, 0xfd, 0x02,
-    0x1a, 0xfa, 0x96, 0xdf, 0xe9, 0x50, 0xdf, 0xda, 0x0f, 0xcb, 0xfb, 0x51,
-    0x34, 0x92, 0x63, 0xaf, 0xff, 0x44, 0xf9, 0xe8, 0x14, 0x06, 0x6f, 0xe3,
-    0xac, 0xae, 0x8f, 0xdb, 0xe9, 0x75, 0xfb, 0x8d, 0x77, 0x69, 0xa2, 0x35,
-    0xbc, 0xa6, 0xfa, 0x3a, 0xca, 0xe1, 0xe8, 0xf8, 0xce, 0xfd, 0xc6, 0xbb,
-    0xb4, 0xd1, 0x52, 0xdc, 0xed, 0x34, 0x43, 0x56, 0x57, 0x0f, 0x55, 0xcc,
-    0xef, 0xdc, 0x6b, 0xbb, 0x4d, 0x11, 0xf5, 0xff, 0xf0, 0xbf, 0xa5, 0x0a,
-    0x7c, 0x8f, 0x6a, 0x00, 0x75, 0xe7, 0x92, 0xb8, 0x88, 0x3f, 0xa6, 0x77,
-    0xfe, 0x79, 0xe3, 0xa9, 0xc4, 0x85, 0x9d, 0x7f, 0xa3, 0x98, 0x3e, 0xce,
-    0x9d, 0x79, 0x78, 0xae, 0xd9, 0xf6, 0x7d, 0x3c, 0xa5, 0x51, 0xb7, 0x10,
-    0xa2, 0xbf, 0xff, 0xe9, 0x7f, 0xc5, 0x1f, 0x58, 0x18, 0xdf, 0x5f, 0x7c,
-    0xa2, 0x28, 0x75, 0xfd, 0xfe, 0xfb, 0xcb, 0x3c, 0x75, 0xff, 0xe6, 0x19,
-    0x46, 0x58, 0xe7, 0x0b, 0x0b, 0xe7, 0xce, 0xed, 0x9d, 0x7e, 0xe3, 0x5d,
-    0xda, 0x68, 0xb1, 0xee, 0x7d, 0x1d, 0x7f, 0x4f, 0xf7, 0x9c, 0xce, 0x1d,
-    0x52, 0x3c, 0x57, 0x15, 0xbf, 0xe1, 0x75, 0x3a, 0x90, 0x33, 0x9d, 0x7f,
-    0xfe, 0x04, 0xa7, 0x61, 0xa1, 0x81, 0x3b, 0x79, 0xf3, 0xe7, 0x76, 0xce,
-    0xbf, 0x27, 0xbc, 0x9e, 0x3a, 0xfb, 0x9c, 0xcd, 0xb3, 0xab, 0x0f, 0x29,
-    0xc9, 0xaf, 0xd9, 0xcc, 0xc9, 0x8e, 0xb2, 0xb0, 0xab, 0x22, 0x76, 0xd9,
-    0x18, 0x63, 0x12, 0x3c, 0x4c, 0x43, 0xd3, 0x7d, 0x42, 0xcf, 0xe9, 0x05,
-    0xe6, 0x19, 0x6a, 0x1d, 0x7f, 0x31, 0x63, 0x9d, 0x7f, 0x1d, 0x7f, 0x9c,
-    0x1a, 0x7f, 0x79, 0xce, 0xb9, 0x6d, 0x3a, 0x84, 0xf1, 0xfc, 0x63, 0x7f,
-    0xec, 0x67, 0x98, 0x2f, 0xbc, 0xb4, 0x75, 0xfb, 0x35, 0xd4, 0x64, 0xeb,
-    0xe0, 0x2d, 0x38, 0x75, 0xff, 0xff, 0x47, 0x07, 0x03, 0x9d, 0xea, 0x37,
-    0xa9, 0xed, 0x3e, 0xe7, 0x52, 0x22, 0x17, 0xa4, 0x37, 0xf4, 0x70, 0x1b,
-    0x7f, 0xf8, 0xeb, 0xfe, 0x81, 0xf3, 0x09, 0xfd, 0xfc, 0x1d, 0x7f, 0xfa,
-    0x3b, 0x0b, 0x6f, 0x53, 0xd9, 0x8b, 0x3a, 0xf8, 0x00, 0x4f, 0xa7, 0x5e,
-    0x77, 0x69, 0xa2, 0xd0, 0xbf, 0xf3, 0xb3, 0xb4, 0xd7, 0xe4, 0xf8, 0xc9,
-    0xd7, 0xf0, 0x20, 0x63, 0xda, 0x3a, 0x9a, 0x89, 0x5e, 0x13, 0x81, 0x0e,
-    0xff, 0xff, 0xf9, 0x39, 0xd7, 0x14, 0x8f, 0x27, 0x63, 0x5d, 0xcd, 0x73,
-    0x1b, 0x9e, 0x3a, 0xa4, 0xa8, 0x4c, 0x26, 0x2d, 0x3b, 0x44, 0x7e, 0x42,
-    0xe3, 0xa6, 0x17, 0x62, 0xce, 0xbf, 0xf9, 0xf7, 0xd9, 0xd6, 0x34, 0xf0,
-    0xc2, 0xce, 0xae, 0x1e, 0xeb, 0x8a, 0xdf, 0xff, 0x93, 0xda, 0x7d, 0xf5,
-    0xac, 0xea, 0x6b, 0xf9, 0xce, 0xbf, 0xfe, 0xfe, 0x7e, 0x27, 0xa7, 0xff,
-    0x92, 0xd3, 0x1a, 0x1d, 0x5d, 0x45, 0x70, 0xab, 0xdf, 0xda, 0x7f, 0xb9,
-    0xbf, 0x8e, 0xbf, 0xc8, 0x1c, 0x5f, 0xcc, 0x09, 0xd7, 0xff, 0xdf, 0xf3,
-    0x90, 0x38, 0xa2, 0x77, 0xb9, 0xf4, 0xeb, 0x30, 0x4e, 0xae, 0x1f, 0x2f,
-    0xea, 0x37, 0xf9, 0x7f, 0x8f, 0xb5, 0xff, 0x0e, 0xa9, 0x23, 0xc3, 0x90,
-    0x98, 0xdb, 0x23, 0xbf, 0xb6, 0x4d, 0xdc, 0x03, 0x9d, 0x7e, 0x16, 0xbe,
-    0x90, 0xeb, 0xff, 0xfb, 0x83, 0x11, 0xbf, 0xcd, 0x78, 0x60, 0x3d, 0x8f,
-    0x1d, 0x72, 0x74, 0xeb, 0xe9, 0x0b, 0xfd, 0x3a, 0xff, 0x05, 0xc1, 0xce,
-    0x38, 0x0e, 0xbf, 0x67, 0x1a, 0xc6, 0xc9, 0xd4, 0x87, 0xba, 0x26, 0x55,
-    0x09, 0x9a, 0x61, 0x2b, 0x1a, 0xdb, 0x8a, 0xfe, 0xff, 0x79, 0xd8, 0xd0,
-    0xeb, 0xff, 0x7d, 0xf2, 0x88, 0xa4, 0x60, 0xc1, 0xd7, 0xef, 0xbe, 0x18,
-    0x01, 0xd5, 0xba, 0x21, 0x38, 0x3b, 0xb0, 0xfe, 0xfd, 0x1e, 0xce, 0xc1,
-    0xd7, 0xff, 0xff, 0xba, 0x81, 0xc4, 0x9f, 0xb1, 0x1f, 0x33, 0x79, 0x69,
-    0x3c, 0xe3, 0x87, 0x5f, 0xfb, 0x37, 0x96, 0xa6, 0xe3, 0xfb, 0x47, 0x5f,
-    0xff, 0x67, 0xb5, 0x93, 0x76, 0x36, 0x67, 0x7b, 0x07, 0x5f, 0xf0, 0xc4,
-    0x4d, 0x9b, 0x13, 0x87, 0x54, 0xe9, 0xb1, 0xb4, 0x94, 0x0e, 0xc2, 0x81,
-    0xe5, 0x0b, 0xf7, 0xc9, 0xa4, 0x93, 0x1d, 0x50, 0xa8, 0x33, 0x23, 0x96,
-    0x44, 0xbb, 0xff, 0xba, 0x9f, 0x30, 0x71, 0x38, 0xfb, 0x0e, 0xbd, 0xf6,
-    0x38, 0x75, 0xff, 0xfe, 0xec, 0x0e, 0x03, 0x58, 0x1e, 0xc4, 0xeb, 0xfc,
-    0x42, 0x75, 0x28, 0x8c, 0x1e, 0x22, 0x78, 0x76, 0xff, 0xfe, 0x89, 0xb0,
-    0x3d, 0x8d, 0x9d, 0xcf, 0x0c, 0x42, 0xce, 0xbf, 0xb7, 0xd7, 0xd9, 0xff,
-    0x13, 0xaf, 0xfa, 0x1b, 0xd4, 0x99, 0xde, 0x73, 0xa9, 0x68, 0xc4, 0x75,
-    0xa0, 0x19, 0x5f, 0xe9, 0x47, 0x27, 0x8e, 0x4e, 0x75, 0xff, 0x27, 0xe3,
-    0x2e, 0x46, 0x04, 0xeb, 0xff, 0xfe, 0xee, 0x49, 0xbd, 0x4e, 0xc6, 0x72,
-    0x5e, 0x18, 0x5e, 0x8e, 0xad, 0x22, 0x6f, 0xc6, 0xf7, 0xdb, 0x51, 0xc9,
-    0xce, 0xa8, 0x4c, 0x5f, 0x21, 0x9e, 0xe4, 0x77, 0xfb, 0x8d, 0x9b, 0x13,
-    0xbf, 0x9d, 0x7f, 0x97, 0x0d, 0x17, 0xdf, 0xc7, 0x5f, 0xdc, 0x8f, 0x4f,
-    0x8c, 0x9d, 0x7f, 0xff, 0xfc, 0x9f, 0xf3, 0xb9, 0x34, 0xcf, 0xc9, 0xbd,
-    0xdf, 0xc1, 0xac, 0x4d, 0x81, 0x83, 0xaf, 0xde, 0xeb, 0x8a, 0x87, 0x5f,
-    0xf0, 0xff, 0x38, 0x7b, 0x83, 0x07, 0x5b, 0x02, 0x8e, 0x2c, 0x84, 0x1b,
-    0x49, 0xef, 0xff, 0x70, 0x0d, 0x00, 0xe7, 0xb4, 0xee, 0x27, 0x54, 0x27,
-    0xed, 0x86, 0x88, 0x64, 0x31, 0x88, 0x7e, 0x73, 0x7f, 0xb3, 0xb3, 0x27,
-    0x51, 0x67, 0x5f, 0xe9, 0x67, 0x34, 0x31, 0x39, 0xd7, 0xb6, 0xf2, 0x73,
-    0xaf, 0x67, 0x5c, 0xeb, 0xf4, 0xc1, 0xff, 0xf1, 0x3a, 0x82, 0x78, 0x8e,
-    0x35, 0x7f, 0xb1, 0x9c, 0x6b, 0x71, 0x93, 0xaf, 0xfb, 0x75, 0xe6, 0x0f,
-    0xb6, 0xf0, 0xeb, 0xca, 0x4b, 0xf3, 0xaf, 0xdd, 0x8e, 0x4e, 0xb3, 0xaf,
-    0xf7, 0xee, 0x3d, 0xc7, 0x98, 0xeb, 0x6f, 0x31, 0xed, 0x32, 0x51, 0x48,
-    0x8a, 0x37, 0x78, 0xac, 0x4c, 0xc5, 0xcc, 0xc6, 0x1b, 0xb5, 0x8a, 0x93,
-    0x37, 0x32, 0x43, 0x27, 0x63, 0xd4, 0x6a, 0x57, 0x87, 0x00, 0x75, 0xa0,
-    0xea, 0x01, 0xa9, 0xf0, 0xd5, 0xcf, 0xe3, 0xab, 0x86, 0xdb, 0xa4, 0x37,
-    0xcb, 0x8e, 0x68, 0xeb, 0xfe, 0xe6, 0x77, 0x27, 0xf8, 0x9a, 0x3a, 0xb0,
-    0xff, 0x10, 0x87, 0xf2, 0x1b, 0xf9, 0x07, 0xf9, 0x66, 0x8e, 0xbf, 0xf6,
-    0x7a, 0x37, 0x03, 0xf7, 0xa8, 0x75, 0x96, 0x75, 0xfc, 0x83, 0xfc, 0xb3,
-    0x5f, 0x0f, 0x37, 0x61, 0xed, 0x28, 0x8c, 0x1f, 0x3c, 0xd9, 0x56, 0x03,
-    0x6a, 0x98, 0xc2, 0x22, 0x87, 0x79, 0xc8, 0x64, 0x7c, 0x18, 0x56, 0x64,
-    0xa3, 0x55, 0x21, 0x74, 0xd8, 0x67, 0xee, 0x44, 0x91, 0x8f, 0xcc, 0x70,
-    0xb8, 0xd8, 0xfb, 0x2b, 0x71, 0xe1, 0xec, 0x08, 0x7a, 0x8c, 0x68, 0xda,
-    0x94, 0x53, 0xe9, 0x53, 0x5b, 0x71, 0x95, 0xfd, 0x87, 0x7d, 0xfd, 0xb4,
-    0x81, 0x18, 0x98, 0xeb, 0xd0, 0xe2, 0x75, 0xf6, 0x75, 0xfc, 0x75, 0x98,
-    0xbc, 0x3e, 0x8e, 0x97, 0x88, 0xcd, 0xff, 0xff, 0xee, 0xb8, 0xfb, 0x50,
-    0x92, 0xcd, 0xa1, 0xf4, 0x76, 0x14, 0xfe, 0x36, 0x8e, 0xbe, 0xcd, 0x01,
-    0x0e, 0xbf, 0x71, 0xae, 0xed, 0x34, 0x5a, 0xd7, 0xf9, 0x68, 0xb7, 0x9b,
-    0x3a, 0x75, 0xfd, 0x9b, 0x5a, 0x71, 0x69, 0xd7, 0xb9, 0x0b, 0x3a, 0xfe,
-    0xee, 0x6a, 0x27, 0xda, 0x3a, 0xff, 0xa4, 0xae, 0x71, 0xae, 0xed, 0x34,
-    0x50, 0x75, 0x87, 0xea, 0xe6, 0x17, 0xd9, 0x34, 0x78, 0xeb, 0xfe, 0x89,
-    0x47, 0x27, 0x8e, 0x4e, 0x75, 0xff, 0xfb, 0xda, 0x49, 0xdf, 0x4e, 0x2f,
-    0xee, 0xc4, 0xc7, 0x59, 0x56, 0x12, 0xac, 0x48, 0x38, 0x93, 0xde, 0x10,
-    0x21, 0x9c, 0xc6, 0x5c, 0x2e, 0x5c, 0x24, 0x3a, 0x40, 0x24, 0x3f, 0x4e,
-    0x6f, 0xff, 0x2a, 0xb7, 0x92, 0xb9, 0xc6, 0xbb, 0xb4, 0xd1, 0x45, 0xdf,
-    0xe5, 0x73, 0x8d, 0x77, 0x69, 0xa2, 0xea, 0xa8, 0x74, 0x26, 0xd2, 0x7c,
-    0x6b, 0xea, 0x47, 0x0a, 0xb9, 0x5e, 0x1d, 0xad, 0x76, 0x41, 0x39, 0x61,
-    0xa8, 0x54, 0xf9, 0x5e, 0xfd, 0xc6, 0xbb, 0xb4, 0xd1, 0x10, 0xdd, 0x81,
-    0x3a, 0xcd, 0x3a, 0xba, 0x69, 0x44, 0x56, 0xfb, 0x36, 0x27, 0x0e, 0xb2,
-    0xb8, 0x89, 0xad, 0xd6, 0x18, 0xc8, 0x2d, 0xb6, 0x75, 0xf4, 0x76, 0x16,
-    0x75, 0xf3, 0x5d, 0xda, 0x68, 0x8d, 0xa9, 0xa7, 0x9b, 0xc2, 0x0b, 0x2a,
-    0x14, 0x41, 0x63, 0x05, 0xfe, 0x57, 0x38, 0xd7, 0x76, 0x9a, 0x29, 0xbb,
-    0xf7, 0x1a, 0xee, 0xd3, 0x45, 0x41, 0x7b, 0x37, 0x64, 0xeb, 0x2b, 0x87,
-    0xa1, 0xd3, 0x3b, 0xfc, 0xae, 0x71, 0xae, 0xed, 0x34, 0x54, 0xd7, 0xee,
-    0x35, 0xdd, 0xa6, 0x8a, 0xc2, 0xfc, 0x8c, 0x87, 0xfe, 0x1d, 0x72, 0xf4,
-    0x75, 0xfc, 0x9b, 0x6f, 0x09, 0xb6, 0x75, 0xfe, 0x57, 0x38, 0xd7, 0x76,
-    0x9a, 0x23, 0xfa, 0x83, 0xef, 0x91, 0x85, 0xec, 0x89, 0xce, 0xbf, 0xd9,
-    0xbc, 0x9e, 0x48, 0x27, 0x5c, 0xfe, 0x3a, 0xca, 0xe2, 0x6c, 0x6d, 0x33,
-    0x59, 0x4b, 0xc2, 0x14, 0x48, 0x7c, 0x37, 0xb6, 0x63, 0x7f, 0xf9, 0x55,
-    0xbc, 0x95, 0xce, 0x35, 0xdd, 0xa6, 0x89, 0xbe, 0xff, 0xe5, 0xbc, 0x95,
-    0xce, 0x35, 0xdd, 0xa6, 0x89, 0xfa, 0xfe, 0x7e, 0xe7, 0xa0, 0x27, 0x5c,
-    0x2d, 0x3a, 0xfb, 0x53, 0x2f, 0x47, 0x5c, 0xd6, 0x9d, 0x7f, 0x9b, 0xd4,
-    0xf6, 0x62, 0xce, 0xbb, 0x63, 0x4f, 0x18, 0x15, 0x42, 0x29, 0x10, 0x54,
-    0x04, 0x7a, 0x16, 0xf1, 0x8d, 0xfe, 0x61, 0xcc, 0x40, 0xe4, 0xf1, 0xb9,
-    0xd7, 0xe6, 0x25, 0x8b, 0xdb, 0xcd, 0xce, 0xbf, 0x98, 0x87, 0x9f, 0xa8,
-    0xc6, 0x75, 0xf9, 0x80, 0xa2, 0x98, 0xc6, 0x75, 0xdb, 0x1a, 0x78, 0xc0,
-    0x6d, 0xd3, 0xa9, 0x89, 0x4c, 0x35, 0x88, 0x3e, 0x62, 0xcd, 0x58, 0x71,
-    0xaf, 0x8c, 0x3f, 0x25, 0xbe, 0x60, 0x71, 0xf0, 0xeb, 0xe6, 0x14, 0xeb,
-    0xd1, 0xd7, 0xff, 0xf3, 0x00, 0x5f, 0xd0, 0x2d, 0x45, 0x87, 0xf7, 0xe4,
-    0x8e, 0xbf, 0xe7, 0xea, 0x6c, 0x55, 0x96, 0x59, 0x2a, 0xff, 0x75, 0xfd,
-    0xe7, 0x76, 0x4e, 0xa6, 0x12, 0x3d, 0x18, 0xa1, 0x3b, 0x15, 0x5d, 0x61,
-    0xc7, 0xd7, 0xff, 0xf9, 0x89, 0x62, 0xf5, 0xc8, 0x4f, 0x77, 0x02, 0x9a,
-    0xc1, 0x01, 0xd7, 0xf3, 0x1c, 0x71, 0xde, 0x47, 0x5f, 0xba, 0x8e, 0x06,
-    0x1c, 0x75, 0x31, 0x08, 0xc2, 0x61, 0x9a, 0x3c, 0x5d, 0x67, 0x3a, 0xfc,
-    0xc2, 0x61, 0xe0, 0x52, 0x0e, 0xbf, 0xf4, 0x44, 0x44, 0x44, 0x6f, 0xa3,
-    0xaf, 0x4d, 0x1e, 0x3a, 0xe8, 0x88, 0x3d, 0x69, 0x8e, 0xaf, 0x26, 0xf8,
-    0x75, 0xfb, 0x89, 0x3b, 0xac, 0xab, 0x99, 0x64, 0xaa, 0xc3, 0x7e, 0xc9,
-    0x3d, 0xbf, 0x29, 0x53, 0x43, 0x50, 0x8c, 0x90, 0x16, 0x69, 0xee, 0xfc,
-    0xee, 0x31, 0xb4, 0x75, 0xff, 0xe4, 0x1c, 0x5c, 0x6b, 0x59, 0x2d, 0xbc,
-    0x3a, 0xff, 0xe8, 0x93, 0xe0, 0x53, 0x66, 0x80, 0xd3, 0xaf, 0xef, 0x6b,
-    0x32, 0x78, 0x3a, 0xba, 0x7e, 0x02, 0x89, 0x7f, 0xb9, 0xf8, 0xff, 0xef,
-    0xfc, 0x75, 0xee, 0xc0, 0x9d, 0x68, 0x43, 0xd0, 0xf1, 0xb5, 0x42, 0x25,
-    0xfa, 0xe3, 0x78, 0x52, 0x0e, 0xbf, 0x47, 0xd5, 0xf5, 0x0e, 0xae, 0x1e,
-    0x08, 0x8c, 0xdf, 0xd2, 0xd7, 0xb0, 0x54, 0x3a, 0xf3, 0x2e, 0xc9, 0xd7,
-    0xff, 0xbd, 0xc7, 0x9c, 0x3d, 0x8d, 0x7b, 0xfe, 0x9d, 0x76, 0x2f, 0xa7,
-    0xd3, 0xa1, 0xdb, 0xf3, 0xb7, 0xa9, 0xc3, 0xaf, 0xff, 0xff, 0x0b, 0xa8,
-    0x9c, 0x89, 0x7c, 0xea, 0x2c, 0x31, 0xf3, 0x6f, 0xfe, 0xa7, 0x0e, 0xbe,
-    0x79, 0x26, 0xe7, 0x5f, 0xfb, 0xa9, 0xec, 0xe7, 0x3f, 0x9f, 0x61, 0xd7,
-    0xfc, 0x9e, 0xce, 0x73, 0xf9, 0xf6, 0x1d, 0x7b, 0x5f, 0x8f, 0xc3, 0xfe,
-    0xea, 0x15, 0x05, 0x3a, 0x6e, 0x16, 0xf4, 0x98, 0x5f, 0xb5, 0x09, 0xfb,
-    0xfd, 0xd4, 0xef, 0x38, 0x93, 0x9d, 0x68, 0x3a, 0xff, 0xfa, 0x37, 0x93,
-    0x88, 0x3e, 0x01, 0x38, 0x8a, 0x1d, 0x5b, 0x67, 0xc1, 0xb4, 0x1f, 0x7d,
-    0x3a, 0xd2, 0x47, 0x5f, 0x40, 0x3e, 0xac, 0xeb, 0xe1, 0xfd, 0xe4, 0x75,
-    0x34, 0xf1, 0x34, 0x47, 0x7f, 0xbb, 0x0b, 0x54, 0x00, 0x83, 0xaa, 0x11,
-    0x77, 0x8c, 0xc8, 0x45, 0x7f, 0x4c, 0x9d, 0xf6, 0x34, 0xea, 0xe1, 0xed,
-    0x39, 0x6d, 0xff, 0x6e, 0x1f, 0xb0, 0xc7, 0xdf, 0xf4, 0x75, 0xe5, 0x23,
-    0xc7, 0x5f, 0xff, 0x83, 0xd8, 0xe2, 0x02, 0x3e, 0xc4, 0xc3, 0x0b, 0x3a,
-    0xff, 0x29, 0x03, 0xed, 0x3f, 0x4e, 0xa4, 0x44, 0x3b, 0xaa, 0xd4, 0x26,
-    0x08, 0xe8, 0x03, 0x0a, 0x3b, 0xfd, 0xd8, 0x9f, 0x91, 0x81, 0x3a, 0xff,
-    0xf8, 0x73, 0x63, 0x5f, 0x93, 0xbf, 0x9f, 0x70, 0x1d, 0x50, 0x88, 0x37,
-    0x32, 0xbf, 0xc2, 0xf3, 0xef, 0x28, 0xda, 0x3a, 0xff, 0x6b, 0xaf, 0xf7,
-    0xb1, 0x23, 0xaa, 0x73, 0xea, 0xdc, 0xda, 0xf6, 0x64, 0xc7, 0x5f, 0xff,
-    0xa6, 0xec, 0x2d, 0x38, 0x9b, 0x51, 0xf6, 0x7c, 0x64, 0xeb, 0xfe, 0x89,
-    0x0b, 0xfa, 0x49, 0xb0, 0xeb, 0xdf, 0x60, 0x07, 0x57, 0x4f, 0x57, 0x47,
-    0x16, 0x63, 0x3a, 0xf7, 0xa5, 0x87, 0x5d, 0xac, 0x3a, 0xff, 0xed, 0x47,
-    0x1b, 0xe1, 0xc9, 0xdc, 0x4e, 0xa8, 0x4d, 0x5f, 0x21, 0x60, 0x84, 0x4e,
-    0x26, 0x01, 0xbf, 0x0a, 0xdf, 0xdf, 0xcd, 0xff, 0xa3, 0xa7, 0x5f, 0xfc,
-    0x18, 0xf3, 0xeb, 0x3b, 0xd4, 0x59, 0xd7, 0xfa, 0x70, 0xc3, 0xf0, 0x1f,
-    0x9d, 0x7b, 0xc9, 0x31, 0xd5, 0x08, 0x92, 0xc4, 0x2d, 0x1a, 0x5f, 0xa1,
-    0x8d, 0x19, 0x69, 0xd5, 0x0c, 0xbf, 0x49, 0xcb, 0xe4, 0x4e, 0x18, 0xd4,
-    0x31, 0x8f, 0x72, 0x14, 0x94, 0x78, 0xc6, 0x9f, 0x34, 0x24, 0xf9, 0x19,
-    0xea, 0xe3, 0x25, 0xec, 0x2d, 0x9e, 0x11, 0x60, 0x24, 0x18, 0xdc, 0xb4,
-    0xb3, 0xe8, 0x61, 0x7d, 0x2e, 0xbf, 0xff, 0xe6, 0x28, 0xc2, 0x8c, 0x62,
-    0xbc, 0x61, 0x30, 0xdb, 0x18, 0xd8, 0x77, 0xff, 0x3e, 0x77, 0x6c, 0xeb,
-    0xd3, 0x7d, 0x59, 0xd7, 0xfd, 0x9e, 0xd6, 0x7b, 0xb8, 0x03, 0xa9, 0xcf,
-    0x58, 0x47, 0xee, 0x71, 0x3a, 0xb8, 0x6d, 0x16, 0x41, 0x7d, 0x1e, 0xc5,
-    0x9d, 0x7e, 0xf4, 0x0a, 0x00, 0xeb, 0xfb, 0x19, 0x70, 0x2f, 0x0e, 0xaf,
-    0x87, 0xe3, 0x84, 0x02, 0x4b, 0x7e, 0xe4, 0xf1, 0xed, 0x1d, 0x7c, 0xfc,
-    0x79, 0x1d, 0x6e, 0x61, 0xe4, 0x09, 0x45, 0xe6, 0x59, 0x64, 0xeb, 0xe9,
-    0xc5, 0x20, 0xa5, 0x4b, 0xfb, 0xfe, 0x63, 0xeb, 0x8c, 0x83, 0x13, 0x9d,
-    0x76, 0xf2, 0x3a, 0xff, 0x29, 0x1e, 0xd7, 0x5f, 0xf3, 0xaf, 0xc9, 0x3e,
-    0x6f, 0xe3, 0xae, 0x46, 0x9d, 0x50, 0x88, 0x85, 0x05, 0xd6, 0x69, 0xe2,
-    0x8b, 0xf2, 0x8f, 0xad, 0x92, 0x3a, 0xb7, 0x3e, 0x7f, 0x1e, 0xd3, 0x0c,
-    0xaf, 0xa6, 0x23, 0x1e, 0x0c, 0x24, 0x91, 0xdf, 0xa8, 0xae, 0x61, 0xfc,
-    0x65, 0x57, 0xff, 0x6c, 0x67, 0x34, 0x29, 0x1c, 0xc9, 0xce, 0xbf, 0xff,
-    0xff, 0xf3, 0x1f, 0xce, 0xe6, 0xf2, 0xea, 0xfe, 0x37, 0xbf, 0xfb, 0xd8,
-    0x3d, 0xcf, 0x40, 0x7e, 0x7c, 0xee, 0xd9, 0xd7, 0xfc, 0x1c, 0xfd, 0x82,
-    0x9d, 0x75, 0x9d, 0x7e, 0x85, 0x8e, 0x4c, 0x76, 0x1b, 0xcb, 0xdb, 0x30,
-    0x27, 0x5f, 0xe5, 0x3a, 0x90, 0x3f, 0xc1, 0xd5, 0xd3, 0xcf, 0x71, 0xda,
-    0x0a, 0x29, 0x75, 0x08, 0x4b, 0xfa, 0x25, 0xd8, 0xd8, 0x87, 0x5f, 0x97,
-    0xf8, 0xc2, 0xce, 0xbe, 0xe7, 0xef, 0xa3, 0xaa, 0x0f, 0x25, 0xc9, 0xee,
-    0x97, 0x8e, 0xbe, 0x9a, 0x3c, 0xe7, 0x5f, 0x7e, 0x0c, 0x16, 0x9b, 0x7f,
-    0xc5, 0xad, 0x23, 0xaa, 0x73, 0xc9, 0xe9, 0xcd, 0xff, 0xd1, 0xdf, 0xa1,
-    0xf2, 0x64, 0xd0, 0xb3, 0xaf, 0xfb, 0xdd, 0xc9, 0x6f, 0x2c, 0xf1, 0xd7,
-    0xd1, 0xef, 0xd6, 0x75, 0x1a, 0x20, 0xeb, 0xf9, 0xe7, 0x03, 0x88, 0x49,
-    0x58, 0x36, 0xda, 0x69, 0xe8, 0xed, 0x8b, 0xd2, 0xd1, 0x3d, 0xe7, 0x3b,
-    0xff, 0xf2, 0xf4, 0xf2, 0xea, 0x67, 0xb5, 0xcc, 0x0e, 0x1d, 0x7f, 0xd1,
-    0xe1, 0xcd, 0x83, 0x9a, 0x3a, 0xa1, 0x15, 0xb8, 0x47, 0xa5, 0x3b, 0xf9,
-    0xfb, 0x0c, 0x7f, 0xc8, 0xea, 0x92, 0xb6, 0x06, 0xbb, 0x72, 0x14, 0x0b,
-    0x23, 0x14, 0x5f, 0x47, 0x09, 0xb0, 0xba, 0xfe, 0x90, 0xe6, 0xfe, 0xc3,
-    0xaf, 0xff, 0xdf, 0x40, 0x08, 0xdf, 0x27, 0x0b, 0xbb, 0x5c, 0x27, 0x54,
-    0x22, 0x0f, 0x85, 0x97, 0xf9, 0xc7, 0xd2, 0xce, 0x61, 0xd7, 0xff, 0x3a,
-    0x7a, 0x05, 0xb9, 0xee, 0xa1, 0xd7, 0xf0, 0xa0, 0x35, 0xd4, 0x3a, 0xee,
-    0x04, 0xeb, 0x99, 0x64, 0xea, 0x91, 0xae, 0x64, 0x5a, 0xf4, 0x26, 0xc2,
-    0x95, 0x34, 0x55, 0xd4, 0x74, 0x3a, 0x06, 0x9e, 0xee, 0x06, 0x8e, 0xbf,
-    0x93, 0xa8, 0xa2, 0x90, 0x75, 0xda, 0xfa, 0x13, 0xc3, 0xf0, 0xb5, 0x22,
-    0x28, 0xbe, 0xb9, 0x5e, 0x65, 0x96, 0x4a, 0xa2, 0x95, 0x2f, 0xef, 0x91,
-    0x94, 0x98, 0xaa, 0x69, 0xbc, 0x41, 0xab, 0xf6, 0x72, 0x36, 0x61, 0xd5,
-    0x0c, 0x8f, 0x09, 0xd1, 0x72, 0x38, 0xc4, 0x97, 0x11, 0xc8, 0x7a, 0xac,
-    0x8b, 0xb1, 0xdd, 0x0b, 0xfe, 0x88, 0x2f, 0xb9, 0x2f, 0xf0, 0xeb, 0xfc,
-    0x3b, 0xfb, 0xef, 0x5c, 0x07, 0x5e, 0x14, 0xd1, 0xd7, 0xc1, 0x71, 0x01,
-    0xd7, 0xff, 0x40, 0x80, 0x63, 0x79, 0xa0, 0x40, 0x75, 0x62, 0x2c, 0x50,
-    0xd4, 0x03, 0x5a, 0x20, 0xb2, 0x1d, 0x7f, 0xce, 0xa3, 0x7a, 0x81, 0x79,
-    0x1d, 0x7d, 0x3c, 0xef, 0xb9, 0xd7, 0x03, 0x48, 0x7d, 0x62, 0x1f, 0xf4,
-    0xe2, 0xfd, 0x19, 0xce, 0xa1, 0xd7, 0xff, 0x99, 0x07, 0x73, 0x27, 0x4c,
-    0xd9, 0x1b, 0x9d, 0x7f, 0xf8, 0x10, 0xbe, 0x72, 0x27, 0xf3, 0xba, 0x87,
-    0x5f, 0xe9, 0x67, 0x71, 0x70, 0xd3, 0xaf, 0x62, 0xd8, 0xce, 0xbf, 0xd9,
-    0xa1, 0xcf, 0x75, 0x0e, 0xa0, 0x9e, 0x70, 0x8f, 0x56, 0x27, 0x2d, 0x31,
-    0xdf, 0x49, 0x40, 0x99, 0xe4, 0xad, 0x8f, 0xf7, 0xf7, 0xb2, 0x61, 0x85,
-    0x9e, 0x20, 0x2b, 0xf3, 0x88, 0x7b, 0x06, 0x88, 0x09, 0x53, 0x73, 0x7f,
-    0xf2, 0x6f, 0xa0, 0xe0, 0xc0, 0xff, 0x07, 0x5f, 0xfd, 0xfb, 0x54, 0xe6,
-    0x6f, 0xa0, 0x3f, 0x8e, 0xbf, 0x44, 0x9f, 0x76, 0x4e, 0xbf, 0xf3, 0x7e,
-    0x73, 0x99, 0xdd, 0xe5, 0xa3, 0xab, 0x11, 0xe6, 0x88, 0x5c, 0x47, 0x72,
-    0x8b, 0x4e, 0x75, 0xfb, 0xe6, 0x4c, 0x8b, 0x3a, 0xff, 0xf7, 0xf1, 0xf3,
-    0x6b, 0xc9, 0xae, 0xee, 0xec, 0x9d, 0x53, 0x9f, 0xd6, 0x8a, 0x6f, 0xfd,
-    0x81, 0xeb, 0xab, 0x1d, 0x8d, 0xce, 0xa6, 0x2d, 0x1d, 0x9c, 0x84, 0x5a,
-    0xc8, 0xef, 0xf8, 0x54, 0xe0, 0xa3, 0x7f, 0x13, 0xaf, 0xde, 0x8c, 0x18,
-    0x3a, 0x90, 0xf7, 0x04, 0xe2, 0xfa, 0x7f, 0xa3, 0xe3, 0xaf, 0xff, 0xcf,
-    0xbe, 0xfa, 0x81, 0xf7, 0xd9, 0xba, 0x9e, 0xd1, 0xd5, 0x09, 0x99, 0xe4,
-    0x25, 0x90, 0x83, 0xf2, 0x4b, 0xe5, 0xc6, 0x2c, 0xeb, 0xff, 0x62, 0xe1,
-    0xa9, 0xee, 0x7e, 0xb3, 0xaf, 0x26, 0xfa, 0x3a, 0xd1, 0x23, 0xda, 0x01,
-    0xf5, 0xfe, 0xe4, 0xda, 0x41, 0xf2, 0x1d, 0x7f, 0xba, 0x9b, 0x83, 0x8e,
-    0x13, 0xaf, 0xb7, 0x07, 0x20, 0xab, 0x99, 0x64, 0xaa, 0x83, 0x74, 0xc9,
-    0x15, 0xc2, 0x85, 0x2a, 0x68, 0x6f, 0xff, 0xfe, 0x15, 0x73, 0x36, 0xa2,
-    0x64, 0x5c, 0x4d, 0xf0, 0x77, 0x97, 0x7f, 0x01, 0xd7, 0x9f, 0x92, 0xf8,
-    0x99, 0x64, 0xa1, 0x1d, 0xb9, 0x2d, 0x30, 0x19, 0x37, 0x71, 0x0d, 0x3c,
-    0x94, 0x78, 0x90, 0x93, 0xe4, 0x66, 0xdd, 0x94, 0xb2, 0xe8, 0x22, 0xf5,
-    0xe2, 0x7f, 0xe3, 0x5e, 0xbd, 0xe4, 0x64, 0xeb, 0xd3, 0xba, 0xce, 0xbd,
-    0xe4, 0x64, 0xf1, 0x84, 0x5f, 0x7b, 0xf7, 0xfa, 0x68, 0x81, 0xf7, 0x35,
-    0x34, 0xe8, 0x87, 0xfd, 0x16, 0xf3, 0x1a, 0x00, 0xeb, 0xa3, 0xf3, 0xaf,
-    0xdf, 0x88, 0x3e, 0xc8, 0xeb, 0xff, 0xe1, 0xcd, 0x7c, 0xfb, 0xd8, 0x02,
-    0xde, 0x5f, 0x30, 0xf0, 0x34, 0x2d, 0x5f, 0xa3, 0x27, 0x62, 0xf5, 0xff,
-    0xbb, 0xfc, 0xf1, 0xf2, 0x3d, 0x01, 0x3a, 0xf3, 0xf2, 0x73, 0xae, 0x65,
-    0x93, 0xaf, 0xf7, 0x13, 0x36, 0x7d, 0x92, 0xad, 0x36, 0x8c, 0x8e, 0x5f,
-    0xf9, 0x14, 0xf9, 0xaf, 0xc0, 0xb8, 0x91, 0xd7, 0xfb, 0x59, 0xe7, 0x5e,
-    0x09, 0xd4, 0x14, 0xcd, 0xb8, 0xeb, 0xd4, 0xff, 0x21, 0x5f, 0xfb, 0x58,
-    0x39, 0xdc, 0x6e, 0x09, 0xd7, 0xfe, 0xc5, 0x3a, 0xf2, 0xfa, 0xfb, 0xc1,
-    0xd5, 0x23, 0xfa, 0x13, 0xaa, 0x84, 0x6c, 0xe4, 0x2e, 0x2f, 0xfe, 0x5a,
-    0xde, 0x59, 0xc6, 0xbb, 0xb4, 0xd1, 0x0c, 0x5f, 0xff, 0xfe, 0x7d, 0x60,
-    0xe3, 0x7b, 0x1b, 0xcb, 0x6f, 0x3a, 0xd4, 0xc1, 0x75, 0x0e, 0xac, 0x46,
-    0x37, 0xe9, 0xf4, 0x8a, 0xd1, 0x3b, 0x28, 0xd4, 0x61, 0xd9, 0x7f, 0x97,
-    0xd7, 0x9c, 0x62, 0x45, 0x5d, 0xaf, 0xce, 0xbf, 0xa5, 0xd7, 0x71, 0x83,
-    0xad, 0x0d, 0x3c, 0x1d, 0xc5, 0xef, 0xdc, 0x6b, 0xbb, 0x4d, 0x10, 0x55,
-    0xee, 0xc2, 0xce, 0xbf, 0xf4, 0x4e, 0xfe, 0xe6, 0x4b, 0x6f, 0x0e, 0xac,
-    0x44, 0x72, 0x19, 0x88, 0xdd, 0xfb, 0xb0, 0xbf, 0xf7, 0x3a, 0xfb, 0xda,
-    0x80, 0x15, 0x79, 0xf9, 0x39, 0x57, 0xdf, 0x8b, 0xa8, 0x55, 0xfe, 0x49,
-    0xf3, 0xda, 0x80, 0x15, 0x45, 0x5f, 0xd8, 0xd8, 0xec, 0x2c, 0xab, 0x99,
-    0x64, 0xab, 0xf8, 0x60, 0x67, 0x4e, 0x15, 0x58, 0x98, 0x4b, 0x48, 0x56,
-    0x39, 0xd2, 0x20, 0x19, 0x08, 0x53, 0x25, 0x7f, 0x46, 0x2e, 0x4e, 0x14,
-    0xa9, 0xf9, 0xd4, 0x93, 0xf9, 0x98, 0xb7, 0xb1, 0xd2, 0xd4, 0x2b, 0x5a,
-    0xeb, 0x9b, 0xca, 0xaf, 0xbf, 0xb0, 0x74, 0x83, 0x87, 0x5e, 0xef, 0xeb,
-    0x3a, 0xba, 0x78, 0xdb, 0x45, 0x37, 0xf9, 0xc7, 0x35, 0xc8, 0xd1, 0xd7,
-    0xf0, 0x70, 0x5f, 0xda, 0x3a, 0xd1, 0x23, 0xdb, 0xd1, 0x85, 0xfb, 0x9b,
-    0xcb, 0x3c, 0x75, 0xfb, 0xc9, 0x9b, 0xf8, 0xeb, 0xff, 0xfe, 0xea, 0x73,
-    0x02, 0xeb, 0xc1, 0xf0, 0xc3, 0x39, 0xed, 0x1d, 0x68, 0x3a, 0xfa, 0x36,
-    0x06, 0x1a, 0x7e, 0x40, 0x63, 0xbf, 0xf3, 0xcb, 0xaf, 0xed, 0x60, 0xc8,
-    0xea, 0xe9, 0xfb, 0x78, 0xea, 0xb8, 0x9a, 0xce, 0x8a, 0x3d, 0x18, 0x7d,
-    0xfe, 0xde, 0x5b, 0x70, 0xdc, 0x59, 0xd7, 0xff, 0xfe, 0xe7, 0x23, 0x79,
-    0x6f, 0xa4, 0xe3, 0x7b, 0x9f, 0x78, 0x90, 0x13, 0xaf, 0xf9, 0xf9, 0x9b,
-    0xca, 0x01, 0x07, 0x54, 0x23, 0x73, 0x0d, 0xbf, 0x6f, 0xbf, 0xff, 0x35,
-    0x47, 0xd6, 0x72, 0x49, 0xd7, 0x1d, 0xe4, 0x75, 0xff, 0x9b, 0x1e, 0xd6,
-    0x79, 0x37, 0x64, 0xeb, 0x3e, 0x22, 0x51, 0x45, 0x5a, 0x84, 0xff, 0xbb,
-    0x18, 0x98, 0xc3, 0x0e, 0xf7, 0x9c, 0x07, 0x5f, 0xff, 0x9d, 0xe4, 0xfd,
-    0xf9, 0x93, 0xff, 0xef, 0xdf, 0xe9, 0xa2, 0xfb, 0xbc, 0x08, 0x09, 0xd7,
-    0xfe, 0xd2, 0x0e, 0xf2, 0xe7, 0xf1, 0xa3, 0xaa, 0x64, 0x60, 0xf1, 0x9f,
-    0xc3, 0x77, 0xfa, 0x27, 0xee, 0x4d, 0x0c, 0x67, 0x59, 0xa7, 0x5f, 0xff,
-    0xe0, 0x27, 0x14, 0xec, 0x2e, 0x69, 0x20, 0xf6, 0x39, 0x07, 0x5b, 0xd8,
-    0x7e, 0x1a, 0x10, 0xbe, 0xf0, 0xe4, 0x8e, 0xa8, 0x3c, 0x74, 0x27, 0xbf,
-    0xf0, 0xa4, 0xbd, 0xdc, 0xe2, 0x68, 0xeb, 0xfa, 0x24, 0x39, 0x93, 0x9d,
-    0x7f, 0x9c, 0x30, 0x08, 0x67, 0x47, 0x57, 0x4f, 0x75, 0xca, 0xef, 0xed,
-    0xb6, 0x2b, 0xf3, 0xe7, 0x76, 0xcf, 0x10, 0x0d, 0xfe, 0xf0, 0x3e, 0x8c,
-    0xbb, 0x87, 0x88, 0x06, 0xf3, 0xf2, 0x47, 0x88, 0x06, 0xb0, 0xfa, 0x7f,
-    0x41, 0xb9, 0xe4, 0x78, 0x80, 0x6f, 0x9c, 0x77, 0x91, 0xe2, 0x01, 0xbf,
-    0xc8, 0xde, 0xe0, 0x01, 0x07, 0x88, 0x06, 0xf2, 0x08, 0x4f, 0x10, 0x0d,
-    0x05, 0x16, 0xab, 0x22, 0xe9, 0x76, 0xc3, 0xeb, 0x28, 0x78, 0x80, 0x6f,
-    0x72, 0x3c, 0x78, 0x80, 0x68, 0xf1, 0x00, 0xde, 0xdb, 0x40, 0x1e, 0x20,
-    0x1b, 0xa1, 0x67, 0x88, 0x06, 0x82, 0x7c, 0x98, 0x2e, 0x85, 0x77, 0xc8,
-    0xb0, 0xc1, 0xe2, 0x01, 0xbd, 0xe7, 0x69, 0xe2, 0x01, 0xbf, 0xf0, 0xbc,
-    0x95, 0xea, 0x35, 0xf8, 0x78, 0x80, 0x6f, 0xfe, 0x7f, 0x7f, 0x3a, 0x0f,
-    0xba, 0xf2, 0x3c, 0x40, 0x37, 0x38, 0x4f, 0x10, 0x0d, 0xfe, 0x17, 0x67,
-    0x5a, 0x80, 0x1e, 0x20, 0x1b, 0xf2, 0x28, 0xe2, 0x03, 0xc4, 0x03, 0x72,
-    0x68, 0xf1, 0x00, 0xd7, 0x0f, 0x57, 0xc6, 0x77, 0xff, 0xba, 0x9e, 0xf6,
-    0x6b, 0xe7, 0x12, 0x16, 0x78, 0x80, 0x6f, 0xde, 0x18, 0xde, 0x46, 0x88,
-    0x06, 0xe0, 0x41, 0xe2, 0x01, 0x54, 0xda, 0x5f, 0x92, 0x16, 0xe1, 0x3c,
-    0x40, 0x37, 0xdf, 0xb8, 0xb4, 0xf1, 0x00, 0xde, 0x8e, 0x34, 0xf1, 0x00,
-    0xdf, 0xfb, 0x37, 0xd0, 0x63, 0x04, 0x1a, 0x3c, 0x40, 0x37, 0xef, 0xde,
-    0x52, 0x83, 0xc4, 0x03, 0x7e, 0x76, 0xf6, 0x37, 0x3c, 0x40, 0x35, 0x88,
-    0xb2, 0xea, 0x57, 0xe6, 0x97, 0x70, 0x07, 0x88, 0x06, 0xa4, 0xac, 0x8c,
-    0x24, 0x59, 0x09, 0x46, 0x91, 0x24, 0x22, 0xfa, 0x66, 0x03, 0x2d, 0x17,
-    0x7a, 0x1b, 0x5f, 0x98, 0x5f, 0xb3, 0xda, 0x7d, 0xcf, 0x10, 0x0d, 0xfe,
-    0x0c, 0x36, 0x6e, 0x47, 0x8f, 0x10, 0x08, 0x4d, 0xa5, 0xee, 0x43, 0x27,
-    0x88, 0x06, 0x9a, 0x7f, 0x3c, 0x50, 0xbf, 0xdf, 0xbc, 0xa5, 0x1f, 0x56,
-    0x78, 0x80, 0x6f, 0x90, 0x65, 0xa3, 0xc4, 0x03, 0x7f, 0x3c, 0xd2, 0xcd,
-    0xe4, 0x78, 0x80, 0x6b, 0x11, 0x99, 0xd2, 0x20, 0x21, 0x7e, 0x5b, 0x7f,
-    0xdd, 0x8d, 0x2b, 0xaf, 0xf8, 0x03, 0xc4, 0x03, 0x64, 0x3c, 0x40, 0x37,
-    0x3c, 0xe1, 0x3e, 0x4e, 0xa4, 0x5d, 0xc0, 0x1e, 0x20, 0x1b, 0xf3, 0xfb,
-    0x49, 0xb9, 0xe2, 0x01, 0xbf, 0x90, 0x7f, 0x96, 0x68, 0xf1, 0x00, 0xd4,
-    0x22, 0x40, 0x48, 0xfc, 0x69, 0x50, 0xca, 0x55, 0x0c, 0x2d, 0x32, 0x1a,
-    0xe8, 0x7f, 0x30, 0xf7, 0x21, 0x19, 0xd2, 0xd7, 0x2d, 0x01, 0x40, 0xa5,
-    0x6a, 0x5b, 0xa7, 0xa5, 0x0a, 0x6d, 0xc2, 0x87, 0xec, 0x2f, 0xaf, 0x79,
-    0x19, 0x3c, 0x61, 0x37, 0x9d, 0xda, 0x68, 0x80, 0x55, 0x4c, 0x53, 0x78,
-    0x75, 0xdf, 0x28, 0xc3, 0xc2, 0xb3, 0xae, 0xd9, 0x39, 0xd7, 0xed, 0x83,
-    0x01, 0xe9, 0xd5, 0x07, 0x82, 0x83, 0x37, 0xff, 0x48, 0x71, 0xbd, 0x40,
-    0x03, 0xf9, 0x8e, 0xbf, 0x7b, 0x02, 0xfd, 0x3a, 0xe0, 0x41, 0x56, 0x50,
-    0xab, 0xdd, 0x89, 0xce, 0xb9, 0x96, 0x4a, 0xa4, 0x3d, 0xa6, 0x31, 0x59,
-    0x84, 0x59, 0x1c, 0xb6, 0x8a, 0x54, 0xf0, 0x2c, 0xbc, 0x47, 0x12, 0x43,
-    0x02, 0xf2, 0x7f, 0xe3, 0xaf, 0xff, 0x7b, 0x58, 0xa2, 0x73, 0xe8, 0x01,
-    0x1b, 0x9d, 0x53, 0xb3, 0xb5, 0xe4, 0x40, 0x18, 0x4c, 0xb6, 0x97, 0x14,
-    0x89, 0xdc, 0x6a, 0x72, 0x00, 0x46, 0x4f, 0xe2, 0xcf, 0xa3, 0x97, 0xfe,
-    0x6e, 0x49, 0x02, 0xed, 0xd4, 0x8e, 0xbf, 0xfc, 0x3e, 0xdb, 0xc9, 0xa4,
-    0xfc, 0x9c, 0x30, 0x75, 0xfd, 0xef, 0xbb, 0x36, 0x46, 0x8e, 0xbf, 0xd9,
-    0xbf, 0xbc, 0xf2, 0xd1, 0xd7, 0x87, 0x79, 0x1e, 0x30, 0x0a, 0x84, 0xc6,
-    0x70, 0xf5, 0x13, 0x78, 0x66, 0xe6, 0x77, 0xe9, 0xa5, 0x1c, 0x9c, 0xeb,
-    0xe8, 0x52, 0x16, 0x75, 0x70, 0xf2, 0x96, 0x53, 0x7f, 0xe9, 0x6b, 0xe0,
-    0xe2, 0xe3, 0x8a, 0x1d, 0x7f, 0x4a, 0x38, 0x0f, 0xab, 0x3a, 0xff, 0xed,
-    0x83, 0x9a, 0xf6, 0x0c, 0xb3, 0x47, 0x5f, 0x2e, 0x3f, 0xf1, 0xd5, 0x87,
-    0xca, 0xe8, 0x77, 0x75, 0xf1, 0x16, 0x83, 0x09, 0x4b, 0xfe, 0x86, 0xc2,
-    0xd1, 0x60, 0x43, 0xab, 0x87, 0xcf, 0xb4, 0x63, 0x7f, 0x7d, 0x67, 0x89,
-    0x9d, 0x2a, 0xfd, 0xae, 0xc6, 0x4e, 0x75, 0xff, 0xc0, 0x14, 0xcd, 0xfd,
-    0x34, 0x9f, 0x87, 0x5f, 0x4d, 0xd7, 0x98, 0xeb, 0xe6, 0xbf, 0x27, 0x3a,
-    0xfd, 0x93, 0x4a, 0x37, 0x3a, 0xf7, 0x52, 0x63, 0xaf, 0x0c, 0x48, 0xab,
-    0xff, 0x08, 0x13, 0x6b, 0x6b, 0xf9, 0x43, 0x19, 0xd5, 0x87, 0xc2, 0xe3,
-    0x55, 0xf1, 0x37, 0x5d, 0xc9, 0xf8, 0x89, 0xd2, 0x31, 0x22, 0xf1, 0x46,
-    0xd3, 0xed, 0x42, 0xbb, 0x0c, 0x22, 0x48, 0xd6, 0xfa, 0x4a, 0xf1, 0xd2,
-    0x5f, 0xdb, 0xeb, 0x9c, 0x8f, 0x1d, 0x7f, 0x4b, 0x4a, 0x71, 0xda, 0x75,
-    0xe1, 0xf6, 0x8e, 0xbf, 0x6b, 0xf1, 0xfd, 0xa7, 0x5f, 0xde, 0x9a, 0x59,
-    0xbc, 0x8e, 0xa8, 0x45, 0x0a, 0x17, 0x7e, 0x37, 0xf4, 0xa6, 0xff, 0xee,
-    0xb3, 0x1c, 0xd6, 0x32, 0xfc, 0x50, 0xeb, 0xf6, 0x04, 0x38, 0xb3, 0xaf,
-    0xff, 0x7b, 0x76, 0xa7, 0x76, 0xe3, 0xdd, 0xfb, 0xa3, 0xae, 0x60, 0xe8,
-    0xeb, 0x9a, 0x87, 0x5f, 0x0a, 0x6f, 0x23, 0xaf, 0xf9, 0x37, 0xee, 0x07,
-    0x8e, 0xd3, 0xaa, 0x0f, 0x67, 0x84, 0x37, 0xfd, 0xd8, 0xe4, 0x35, 0x05,
-    0xa7, 0x5f, 0x79, 0x47, 0xd3, 0x51, 0x8b, 0xc6, 0xed, 0xa2, 0x1a, 0x92,
-    0x7c, 0xdc, 0x46, 0x59, 0x37, 0xea, 0x0c, 0xc3, 0x7e, 0xfd, 0xb5, 0xfa,
-    0xf0, 0x27, 0x5f, 0xfb, 0xb9, 0xb4, 0xe2, 0xa6, 0x6f, 0xe3, 0xaf, 0xfb,
-    0x1b, 0xd4, 0x0f, 0x7f, 0x50, 0xeb, 0xde, 0xc6, 0x9d, 0x4b, 0x3d, 0x5d,
-    0x1d, 0x5e, 0x92, 0xc0, 0x75, 0x28, 0x8d, 0x40, 0x42, 0x5b, 0xc4, 0x57,
-    0xfc, 0xa3, 0xfc, 0x85, 0x8a, 0x28, 0x75, 0xff, 0x9f, 0x4b, 0x84, 0xe7,
-    0x11, 0x93, 0xad, 0xa5, 0x0f, 0xdf, 0xa7, 0x57, 0xfd, 0x9e, 0xf2, 0x29,
-    0xec, 0x69, 0xd7, 0xf8, 0x31, 0xbe, 0xb3, 0x7f, 0x1d, 0x7f, 0xd1, 0xe4,
-    0x6a, 0x06, 0x3c, 0x75, 0xb4, 0x14, 0x51, 0x61, 0xc7, 0x0d, 0x2b, 0x74,
-    0xc0, 0x3d, 0x0c, 0xbb, 0xfe, 0xf2, 0x4f, 0x1b, 0x83, 0x90, 0x75, 0xed,
-    0x7b, 0x0e, 0xbb, 0x35, 0xf0, 0xf5, 0x3e, 0x9c, 0xdf, 0xfd, 0x9e, 0x4d,
-    0xe4, 0x30, 0xc2, 0x62, 0x9b, 0x67, 0x5f, 0xb3, 0xc0, 0x7f, 0x1d, 0x52,
-    0x3f, 0x6d, 0xb5, 0x0b, 0xff, 0xf4, 0x75, 0xf0, 0x63, 0x8a, 0x07, 0xf7,
-    0xe4, 0x8e, 0xa9, 0x26, 0x41, 0xe8, 0x53, 0xed, 0x12, 0xd4, 0x2e, 0x6a,
-    0xe2, 0x92, 0x43, 0xfd, 0xe3, 0xad, 0xfe, 0x39, 0xeb, 0xee, 0xa3, 0xc8,
-    0xeb, 0xfd, 0x83, 0x2c, 0xd7, 0xd5, 0x9d, 0x7e, 0x5e, 0x80, 0xee, 0x75,
-    0x78, 0xf6, 0x7e, 0x99, 0xdf, 0xf7, 0x30, 0x7e, 0x77, 0x37, 0x64, 0xeb,
-    0xfe, 0x90, 0xfe, 0x0f, 0x8d, 0x58, 0x0e, 0xa9, 0xd3, 0x14, 0x93, 0xce,
-    0x12, 0x6e, 0x77, 0x7f, 0xc3, 0x19, 0xbf, 0xb3, 0x90, 0x75, 0x41, 0xfa,
-    0xb9, 0xfd, 0xf9, 0xf6, 0x04, 0x30, 0x75, 0xda, 0xd1, 0xd7, 0x99, 0x65,
-    0x93, 0xae, 0x03, 0x94, 0xa9, 0x7f, 0x5c, 0x3d, 0xad, 0x1a, 0xdf, 0xfb,
-    0x34, 0x2e, 0xa4, 0xc2, 0x93, 0x1d, 0x7f, 0x02, 0x25, 0xdf, 0xba, 0x3a,
-    0xfe, 0x41, 0x03, 0x5a, 0x87, 0x5e, 0x70, 0x61, 0x55, 0x24, 0xd5, 0x97,
-    0x08, 0x2e, 0x91, 0x00, 0xfb, 0x61, 0x7e, 0xd9, 0x5d, 0xf4, 0x05, 0x02,
-    0x75, 0xf8, 0x3c, 0x4f, 0xe7, 0x3a, 0xff, 0x33, 0x83, 0x9b, 0x13, 0x87,
-    0x5f, 0xc3, 0x9b, 0x83, 0xec, 0x8e, 0xa9, 0x91, 0x16, 0x25, 0x3e, 0x33,
-    0xb9, 0xd6, 0x75, 0xfe, 0xcd, 0x98, 0xab, 0x2c, 0xb2, 0x55, 0xfa, 0x68,
-    0xce, 0xe8, 0xea, 0x13, 0xdf, 0xfa, 0x71, 0x7f, 0x98, 0x31, 0xfb, 0x7a,
-    0x9c, 0x3a, 0xf2, 0xdf, 0xc7, 0x54, 0xc8, 0xe9, 0xeb, 0xa7, 0xe4, 0x7b,
-    0x0d, 0xef, 0xe1, 0xd8, 0xeb, 0x45, 0x9d, 0x7e, 0xc9, 0xa5, 0x12, 0x3a,
-    0xfe, 0x9c, 0x31, 0x82, 0x13, 0xaa, 0x15, 0x73, 0xc9, 0x89, 0x21, 0x56,
-    0xf1, 0x8c, 0xe9, 0x07, 0xc5, 0xbf, 0x49, 0xef, 0x38, 0x10, 0xeb, 0xfe,
-    0x08, 0xff, 0xac, 0x9f, 0x27, 0x3a, 0xf4, 0x70, 0x4e, 0xbf, 0xd8, 0x11,
-    0x7d, 0x20, 0x4e, 0xb7, 0x4e, 0xbd, 0xfb, 0xce, 0x27, 0x81, 0xa3, 0x0b,
-    0x27, 0x11, 0x1d, 0xe5, 0xaa, 0x5a, 0x61, 0x4e, 0x34, 0xc1, 0x86, 0x45,
-    0xff, 0xec, 0x0b, 0xaf, 0x37, 0x96, 0x03, 0x02, 0x75, 0xdd, 0x73, 0xae,
-    0x9b, 0x47, 0x5f, 0xb3, 0x62, 0x08, 0x70, 0xd6, 0x7d, 0x15, 0xbf, 0x77,
-    0x37, 0xf4, 0x1d, 0x7e, 0xda, 0x79, 0xfe, 0xc8, 0xea, 0xf8, 0x98, 0x3a,
-    0xae, 0x98, 0x7f, 0xf9, 0x3d, 0xf0, 0x73, 0xae, 0x75, 0xff, 0xd1, 0x83,
-    0x2e, 0xe0, 0x8c, 0x32, 0x75, 0x71, 0x14, 0x22, 0x83, 0xe2, 0x0b, 0xfd,
-    0xcd, 0x77, 0x05, 0x34, 0x75, 0x21, 0xf0, 0x39, 0x7d, 0xff, 0x60, 0x70,
-    0x60, 0x7f, 0x83, 0xae, 0x86, 0x4e, 0xa8, 0x76, 0xce, 0x13, 0xc2, 0x8e,
-    0x53, 0x86, 0x01, 0x97, 0x2d, 0x8f, 0xaa, 0x42, 0x01, 0xb2, 0xdf, 0xb7,
-    0x3a, 0x48, 0x6e, 0x4c, 0x63, 0xca, 0x7e, 0x22, 0xe3, 0xbd, 0xec, 0xe2,
-    0x0b, 0xaa, 0x02, 0x19, 0xe3, 0x3d, 0xf3, 0xa8, 0xf9, 0x3d, 0x38, 0xbb,
-    0xfc, 0x6f, 0x5b, 0x25, 0x20, 0xfd, 0x20, 0xda, 0x35, 0xbf, 0xec, 0xe0,
-    0xc7, 0xa5, 0x9d, 0x3a, 0xfe, 0x10, 0x60, 0x5e, 0x47, 0x5f, 0xff, 0xbf,
-    0xf6, 0x9b, 0xd4, 0x18, 0xdf, 0x48, 0xb8, 0x3a, 0xff, 0x34, 0x72, 0x52,
-    0x7d, 0x1d, 0x7f, 0x3b, 0x38, 0x0f, 0xbe, 0x3a, 0xfc, 0xf2, 0xf8, 0x14,
-    0x3a, 0xf4, 0xa0, 0x07, 0x5f, 0xbe, 0xcd, 0x28, 0x63, 0x2a, 0xa1, 0x38,
-    0x6c, 0x36, 0x50, 0xad, 0x15, 0x78, 0x63, 0xd2, 0xff, 0x14, 0x7d, 0x1b,
-    0xb3, 0x4e, 0xbf, 0xf9, 0x41, 0xfd, 0xfe, 0xe6, 0x92, 0x04, 0xeb, 0xdb,
-    0x68, 0x13, 0xab, 0x87, 0xc4, 0xb4, 0x4b, 0xff, 0xb7, 0xf7, 0xeb, 0xec,
-    0x20, 0xb8, 0x4e, 0xbe, 0x53, 0x8e, 0xc9, 0xd6, 0xfa, 0x68, 0x81, 0x6d,
-    0xe3, 0x50, 0x29, 0x5e, 0x37, 0x8c, 0x8f, 0xd6, 0x22, 0x05, 0x17, 0xef,
-    0xfc, 0x9b, 0x7d, 0x4f, 0xaa, 0x80, 0x10, 0x55, 0xff, 0x0f, 0xb5, 0xfe,
-    0xfe, 0x46, 0x4e, 0xbf, 0xdf, 0xbe, 0xb3, 0x05, 0x43, 0xaa, 0x0f, 0xb7,
-    0xa7, 0x77, 0xff, 0x91, 0x4f, 0x82, 0xea, 0x7c, 0xd0, 0x01, 0x07, 0x5f,
-    0xe7, 0xee, 0xfa, 0x81, 0xf1, 0xd5, 0xa4, 0x40, 0x79, 0x3a, 0xff, 0x75,
-    0x26, 0x94, 0x0c, 0x8e, 0xbf, 0xf4, 0x33, 0xa6, 0x2d, 0xdb, 0x9b, 0xf8,
-    0xea, 0x69, 0xfb, 0x78, 0xca, 0xfa, 0x5d, 0xc9, 0xce, 0xbf, 0xe8, 0xdd,
-    0x6f, 0xec, 0xdf, 0xc7, 0x56, 0xe7, 0xb6, 0x24, 0x57, 0xfd, 0x0d, 0xf7,
-    0xfd, 0xe4, 0x32, 0x75, 0xdc, 0x73, 0xaf, 0xfe, 0xd8, 0x9a, 0xd6, 0x0b,
-    0x5c, 0x40, 0x75, 0xfe, 0xea, 0x04, 0x38, 0xcc, 0xc7, 0x5e, 0x8e, 0x03,
-    0x0f, 0xdd, 0xa8, 0x75, 0xc4, 0x5f, 0x76, 0x11, 0x97, 0xfe, 0x7d, 0xf5,
-    0x9e, 0x45, 0xbc, 0x8e, 0xb7, 0x8e, 0xa0, 0x1e, 0x6f, 0xd3, 0xdb, 0xff,
-    0xff, 0xbf, 0xd7, 0x5e, 0x5a, 0x92, 0x7b, 0xef, 0x23, 0xb1, 0xed, 0x3e,
-    0xe7, 0x5f, 0xa3, 0x07, 0xdb, 0x67, 0x5f, 0xc9, 0xb8, 0x38, 0xe1, 0x3a,
-    0xcb, 0x3a, 0x96, 0x7c, 0xbd, 0x28, 0x12, 0xdb, 0xd2, 0xfc, 0x27, 0x5c,
-    0xfb, 0xfc, 0x3c, 0xb7, 0x2e, 0xae, 0x26, 0xa9, 0xa8, 0xc9, 0x6f, 0xff,
-    0xec, 0x19, 0xf5, 0xa8, 0x06, 0x75, 0x38, 0xec, 0xf8, 0xea, 0x0a, 0xea,
-    0x16, 0xf0, 0xa1, 0x9a, 0x13, 0x3c, 0x7d, 0x59, 0x17, 0x61, 0xf0, 0x07,
-    0x5f, 0x46, 0xf0, 0xc9, 0x55, 0x42, 0xf4, 0x5a, 0x4e, 0xf9, 0x5f, 0xff,
-    0x92, 0x67, 0x79, 0x6a, 0x16, 0x1e, 0xc0, 0xb4, 0xeb, 0xfe, 0xc9, 0xa5,
-    0x1b, 0xe6, 0xfe, 0x3a, 0xee, 0x4f, 0x88, 0x8d, 0x15, 0x3b, 0xe0, 0xf7,
-    0xf9, 0xce, 0xbf, 0xc1, 0x79, 0x64, 0xff, 0x89, 0xd6, 0x9e, 0x0f, 0x5f,
-    0x09, 0x2e, 0x60, 0xe1, 0xd5, 0x87, 0x80, 0xe4, 0xf7, 0xf7, 0xb6, 0xff,
-    0xee, 0x34, 0xeb, 0xfd, 0xc8, 0xf2, 0x02, 0x24, 0x75, 0xe9, 0xc6, 0x47,
-    0x53, 0x16, 0xca, 0x21, 0x87, 0x24, 0x22, 0x5c, 0x31, 0x7b, 0x3d, 0x58,
-    0xf0, 0xb9, 0x18, 0x62, 0xe8, 0x83, 0xc6, 0x3f, 0x98, 0xdf, 0xf9, 0x8b,
-    0xfb, 0x0b, 0x6f, 0x5f, 0x70, 0x1d, 0x7f, 0xa5, 0x36, 0x0b, 0xf7, 0x0e,
-    0xbf, 0xdb, 0x1e, 0x60, 0xc0, 0xce, 0x75, 0xf4, 0x7e, 0xc1, 0x43, 0xaf,
-    0x7b, 0xd0, 0x75, 0xfe, 0x4e, 0x44, 0xef, 0xc6, 0x9d, 0x6f, 0x70, 0xfc,
-    0x9c, 0x97, 0xc3, 0x77, 0xff, 0xb8, 0xd1, 0xcd, 0x83, 0x91, 0xc8, 0xd1,
-    0xd7, 0xf9, 0xe6, 0xee, 0x2f, 0x34, 0x75, 0x61, 0xfd, 0x6c, 0x48, 0xbf,
-    0x91, 0x4f, 0x66, 0x2c, 0xeb, 0xff, 0xd3, 0x0e, 0x28, 0xa3, 0xfb, 0x48,
-    0x33, 0x1d, 0x7e, 0xc0, 0xa7, 0x34, 0x75, 0xef, 0x7b, 0x73, 0xaf, 0xfe,
-    0xdd, 0xa9, 0xdf, 0x9b, 0x59, 0xd4, 0x59, 0xd4, 0x03, 0xe6, 0xf0, 0xed,
-    0xdf, 0xf0, 0xea, 0xd1, 0xb9, 0xdb, 0x22, 0xb4, 0x4e, 0x8e, 0x96, 0x61,
-    0x8b, 0x50, 0xac, 0x1f, 0x21, 0x4e, 0x90, 0xae, 0xe9, 0x1b, 0x96, 0x7a,
-    0x33, 0x4b, 0xff, 0x0a, 0x7d, 0xdf, 0x36, 0x6f, 0x1f, 0x4e, 0xbf, 0xfc,
-    0x99, 0xc0, 0xc3, 0x39, 0xd8, 0xdf, 0x47, 0x5f, 0x7d, 0x8e, 0x00, 0xeb,
-    0x9f, 0x87, 0x5f, 0xde, 0x49, 0xd7, 0x0d, 0x3a, 0x82, 0x78, 0x5d, 0x15,
-    0xbe, 0xe7, 0x92, 0x73, 0xae, 0xcd, 0xa3, 0xaf, 0x81, 0xf4, 0x64, 0x75,
-    0xc0, 0x71, 0x37, 0x7e, 0x18, 0xa8, 0x45, 0x52, 0x11, 0x7e, 0xbb, 0x76,
-    0xf3, 0x1d, 0x7e, 0xfb, 0xe0, 0x2f, 0x0e, 0xa5, 0x9e, 0x08, 0x06, 0x2f,
-    0x36, 0x34, 0x75, 0xff, 0x49, 0xf9, 0xe1, 0x85, 0xe8, 0xeb, 0xfd, 0x01,
-    0x8e, 0x7f, 0x00, 0x3a, 0xe5, 0xea, 0x63, 0xe9, 0x59, 0xbd, 0xff, 0xa1,
-    0xc7, 0x3d, 0xe4, 0x67, 0xc7, 0x54, 0x26, 0x23, 0x84, 0x49, 0x08, 0x4f,
-    0xcb, 0xe9, 0x84, 0xbe, 0x83, 0x08, 0xd2, 0x96, 0x71, 0x8c, 0xad, 0x44,
-    0x99, 0x27, 0x51, 0x87, 0xfa, 0x38, 0x1b, 0xfa, 0x3f, 0xdd, 0x37, 0xda,
-    0x3a, 0xfd, 0x8c, 0xe6, 0xfe, 0x3a, 0xdc, 0xf8, 0x7b, 0x48, 0x65, 0x7f,
-    0xfb, 0x58, 0x3f, 0xb7, 0xb8, 0xb9, 0x9d, 0xa7, 0x5f, 0xe1, 0x53, 0xb0,
-    0xb5, 0x89, 0xd7, 0xf3, 0x1a, 0x46, 0xd7, 0xfe, 0x3a, 0xfd, 0x13, 0x66,
-    0x34, 0xea, 0xc4, 0x45, 0xa1, 0x97, 0x4c, 0xef, 0xfd, 0xdc, 0x99, 0x26,
-    0xff, 0x6b, 0xfd, 0x1d, 0x79, 0x38, 0xa1, 0xd4, 0x87, 0xc2, 0x28, 0xb7,
-    0xe8, 0xda, 0xec, 0x4c, 0x75, 0x48, 0xf2, 0xb4, 0x41, 0x7f, 0xf7, 0xf3,
-    0x27, 0x63, 0x79, 0x44, 0xd0, 0x75, 0xf8, 0x2e, 0x31, 0xd3, 0xaf, 0xe9,
-    0x46, 0xfe, 0xce, 0x9d, 0x7f, 0xfb, 0xda, 0x40, 0x44, 0xb5, 0x99, 0xbf,
-    0x8e, 0xa9, 0x8f, 0xdb, 0x45, 0xb6, 0x4e, 0xa2, 0xf9, 0x98, 0x4d, 0xdf,
-    0xff, 0xb9, 0xff, 0x39, 0x03, 0x8a, 0x27, 0x7b, 0x9f, 0x4e, 0xbf, 0x85,
-    0xd0, 0x30, 0x27, 0x5f, 0x4f, 0x1b, 0x50, 0x75, 0xf7, 0x40, 0xfe, 0x3a,
-    0xdd, 0x3a, 0xdb, 0x1c, 0xd8, 0xfe, 0x43, 0x7f, 0xf2, 0x2d, 0x35, 0xd8,
-    0x4e, 0x7e, 0xc6, 0x75, 0x42, 0x31, 0x11, 0x55, 0xca, 0x6f, 0xe1, 0xd2,
-    0x6c, 0x80, 0x9d, 0x78, 0x51, 0x43, 0xaf, 0xef, 0x27, 0x13, 0xdf, 0x9d,
-    0x68, 0x59, 0xe4, 0x7d, 0x1b, 0xbf, 0xbf, 0xfb, 0xdc, 0xdf, 0x47, 0x5f,
-    0xff, 0xff, 0xb9, 0x1e, 0x17, 0x6a, 0x6a, 0x64, 0xe3, 0x63, 0x5e, 0x8d,
-    0xe3, 0xee, 0x68, 0xeb, 0xfd, 0xdc, 0xde, 0x38, 0x8b, 0x3a, 0xff, 0xff,
-    0xff, 0xda, 0xd6, 0x7b, 0xae, 0xbd, 0x73, 0x89, 0xbf, 0x9d, 0xd4, 0xcc,
-    0x9b, 0xff, 0x43, 0x3b, 0xc1, 0xd7, 0xbb, 0x9c, 0x3a, 0xfe, 0xf0, 0xb8,
-    0x30, 0x4e, 0xbf, 0x0b, 0x83, 0x04, 0xea, 0xf8, 0x79, 0xde, 0x2a, 0xa8,
-    0x4f, 0x7c, 0x30, 0x83, 0x73, 0x2f, 0x42, 0x77, 0xf6, 0x9b, 0xe0, 0x3e,
-    0xfa, 0x3a, 0xe6, 0x59, 0x3a, 0xb4, 0x6e, 0x99, 0x22, 0xbf, 0x27, 0x5f,
-    0x3a, 0x52, 0xa6, 0x8a, 0xff, 0xbf, 0xf4, 0x0b, 0x58, 0x00, 0x59, 0xd7,
-    0xbb, 0x00, 0x3a, 0x90, 0xf6, 0x1c, 0xf6, 0xff, 0x76, 0x3d, 0xfa, 0xff,
-    0xf1, 0xd5, 0x0c, 0x8d, 0xd9, 0x14, 0x86, 0x1a, 0xbb, 0xc3, 0x65, 0x8c,
-    0x8a, 0x68, 0xc1, 0x38, 0x5c, 0xb5, 0x7e, 0xc3, 0xb5, 0xcb, 0x40, 0xea,
-    0xc1, 0x29, 0x19, 0x42, 0x1a, 0x85, 0x87, 0xa1, 0x1d, 0xb4, 0x41, 0x7e,
-    0xea, 0x73, 0xec, 0xc7, 0x5f, 0xa6, 0x89, 0xbb, 0x07, 0x5d, 0xf6, 0x0e,
-    0xbc, 0xcb, 0x2c, 0x95, 0x7d, 0x2f, 0x63, 0x4a, 0x54, 0xbf, 0xbf, 0x60,
-    0x50, 0x1a, 0x3d, 0xdf, 0xd5, 0xc3, 0xe4, 0x13, 0x1a, 0x84, 0x71, 0xf0,
-    0xa1, 0xe1, 0x35, 0x77, 0xb4, 0x75, 0xff, 0x7c, 0xf7, 0x63, 0xda, 0xea,
-    0x1d, 0x6d, 0x1d, 0x7f, 0xbd, 0xbc, 0xbb, 0x03, 0x39, 0x57, 0xfe, 0xcd,
-    0xe4, 0x98, 0x23, 0x81, 0x3a, 0xfd, 0x3a, 0xff, 0xdf, 0xc7, 0x54, 0x23,
-    0xeb, 0x71, 0x6e, 0x1d, 0x08, 0x86, 0x8d, 0x3c, 0x77, 0x7f, 0xc3, 0x0c,
-    0xe9, 0x07, 0x79, 0x1d, 0x74, 0x34, 0xea, 0x13, 0xcd, 0xd8, 0x71, 0x7d,
-    0x3f, 0xd8, 0x63, 0x3a, 0xff, 0x68, 0x23, 0x0c, 0xe0, 0x9d, 0x5c, 0x3d,
-    0x8f, 0x13, 0xd4, 0x26, 0x80, 0x90, 0xa3, 0x77, 0xbb, 0xf8, 0x77, 0xd4,
-    0xd9, 0xe3, 0xaf, 0xe4, 0xf0, 0xb8, 0x34, 0x75, 0xff, 0xef, 0x4d, 0x9c,
-    0xc7, 0x5c, 0x75, 0x02, 0x75, 0xfd, 0xfa, 0xf3, 0xbb, 0xb9, 0xd4, 0xa2,
-    0x28, 0x44, 0xaf, 0x49, 0x17, 0xff, 0x90, 0x22, 0xfb, 0x8e, 0x7b, 0x10,
-    0x07, 0x5f, 0xd1, 0xee, 0xcb, 0x5f, 0x9d, 0x7e, 0xeb, 0xf3, 0x38, 0x75,
-    0xdf, 0xb9, 0xd4, 0xd3, 0x78, 0x24, 0xd7, 0xf7, 0x21, 0x24, 0xfa, 0x3a,
-    0xd1, 0x39, 0xe5, 0x89, 0x05, 0xfa, 0x76, 0x34, 0xcd, 0xce, 0xbf, 0x26,
-    0xa2, 0x75, 0x9e, 0xcf, 0xdb, 0xf4, 0x3f, 0x01, 0xf9, 0xec, 0xfd, 0xb9,
-    0xe4, 0x7b, 0x3f, 0x6f, 0xbf, 0x96, 0x68, 0xf6, 0x7e, 0xd0, 0x4f, 0x44,
-    0x48, 0xaf, 0xd1, 0x9a, 0xc1, 0x3d, 0x9f, 0xb4, 0x7b, 0x3f, 0x6e, 0x7f,
-    0x1e, 0xcf, 0xd5, 0x96, 0xf6, 0x90, 0x9f, 0xcf, 0xe9, 0x17, 0xd9, 0xb6,
-    0x80, 0x3d, 0x9f, 0xb4, 0x7b, 0x3f, 0x6e, 0x04, 0x1e, 0xcf, 0xdb, 0xfe,
-    0xc0, 0x3f, 0x33, 0x66, 0x04, 0xf6, 0x7e, 0xdf, 0xd9, 0xd4, 0xd7, 0xf3,
-    0x9e, 0xcf, 0xda, 0x02, 0x28, 0x84, 0x8b, 0x48, 0xb7, 0xdc, 0x9e, 0x3c,
-    0x7b, 0x3f, 0x68, 0xf6, 0x7e, 0xe1, 0xaf, 0xb9, 0x96, 0x4f, 0x67, 0xed,
-    0x49, 0x58, 0x68, 0x4d, 0x32, 0x10, 0xbb, 0xc2, 0x6b, 0x85, 0x0b, 0x30,
-    0xd4, 0x2e, 0x7c, 0xbc, 0xc9, 0x35, 0xe9, 0x42, 0x85, 0xb3, 0xf4, 0xaa,
-    0x24, 0x2f, 0xf6, 0xb2, 0x52, 0x8f, 0x6e, 0x75, 0x61, 0xf8, 0x68, 0xf6,
-    0xff, 0xd8, 0xd0, 0xe7, 0x19, 0x7e, 0xcc, 0x75, 0xd2, 0x9c, 0xab, 0xe9,
-    0x9d, 0xf8, 0x75, 0x4e, 0x89, 0x8d, 0xc8, 0x44, 0xff, 0x68, 0x5e, 0xb8,
-    0xba, 0x22, 0xf3, 0x9a, 0x17, 0xf9, 0x7a, 0x1c, 0xf6, 0x00, 0xeb, 0xfe,
-    0x6c, 0x00, 0x3f, 0xbf, 0x24, 0x75, 0xff, 0x9d, 0xe7, 0xc5, 0xb8, 0xef,
-    0x23, 0xaf, 0xcc, 0x8b, 0xa9, 0xac, 0x3f, 0x69, 0x8e, 0x6a, 0x11, 0xce,
-    0xf0, 0xa7, 0xbf, 0x0f, 0xbb, 0x93, 0x9d, 0x70, 0x59, 0x3a, 0xa0, 0xdf,
-    0x61, 0x3d, 0xff, 0xfa, 0x5c, 0x8d, 0x8f, 0x34, 0x07, 0xb0, 0xb7, 0x98,
-    0xeb, 0xfd, 0xb4, 0xfa, 0x4d, 0x4d, 0x87, 0x56, 0xe8, 0x8c, 0xe2, 0xbd,
-    0x43, 0x30, 0x66, 0x52, 0x9b, 0x70, 0xcd, 0x21, 0x9e, 0xc6, 0x61, 0xc4,
-    0x6e, 0xc2, 0xd5, 0xe7, 0x4e, 0x06, 0x31, 0x4d, 0x32, 0x7f, 0x0a, 0xbb,
-    0xff, 0xfe, 0x4e, 0xbf, 0x62, 0x4a, 0xe0, 0x22, 0x5a, 0x0f, 0x63, 0x87,
-    0x5f, 0xf9, 0x48, 0xdc, 0x63, 0xbd, 0xfd, 0xa7, 0x5f, 0xfe, 0x0f, 0x23,
-    0x07, 0x24, 0x9d, 0xcd, 0x87, 0x5f, 0xc2, 0xea, 0x75, 0xe4, 0x75, 0xe6,
-    0x59, 0x64, 0xab, 0xdf, 0x60, 0x05, 0x2a, 0x5f, 0xdf, 0xf3, 0xcb, 0xef,
-    0x33, 0x63, 0xf0, 0xeb, 0xff, 0xf7, 0x72, 0x5f, 0x44, 0x72, 0x79, 0xa5,
-    0x1c, 0x9c, 0xea, 0x14, 0x49, 0xf8, 0xee, 0xff, 0xbc, 0xe3, 0x9a, 0xe4,
-    0x68, 0xeb, 0xe9, 0x40, 0x37, 0x3a, 0xfe, 0x04, 0x0e, 0x6f, 0xe3, 0xae,
-    0x70, 0x7c, 0x3c, 0xef, 0xa4, 0x54, 0xe8, 0xb5, 0x18, 0x42, 0x5e, 0xd9,
-    0x1c, 0x3a, 0xa4, 0xac, 0x48, 0x2c, 0xb8, 0x80, 0xb4, 0x80, 0x25, 0x8c,
-    0x30, 0x3d, 0x0d, 0x7d, 0x84, 0xd7, 0x24, 0xe7, 0x5f, 0xe1, 0x68, 0x53,
-    0x64, 0x04, 0xea, 0x09, 0xe4, 0xfe, 0x2d, 0x60, 0x1d, 0x7f, 0xd9, 0x0c,
-    0x7f, 0x3a, 0xf9, 0xc3, 0xaf, 0xf0, 0x36, 0xd1, 0x61, 0x0e, 0x1d, 0x7f,
-    0xde, 0xee, 0x6b, 0xe7, 0x92, 0x73, 0xaa, 0x0f, 0xc1, 0x0d, 0x6f, 0xf8,
-    0x53, 0xf6, 0x0e, 0xb6, 0xe3, 0xc7, 0x54, 0x93, 0x1a, 0x98, 0x43, 0xb0,
-    0xab, 0x12, 0x0b, 0xcc, 0xb2, 0xc9, 0x62, 0x10, 0x5f, 0x35, 0xdd, 0xa5,
-    0x88, 0x40, 0xa9, 0xad, 0xbe, 0x7e, 0x63, 0x27, 0x57, 0x0f, 0x83, 0x61,
-    0xfd, 0xe6, 0x59, 0x64, 0xb1, 0x07, 0xa8, 0xb1, 0x07, 0x95, 0x35, 0xb7,
-    0x99, 0x65, 0x93, 0xaf, 0x6a, 0x14, 0x29, 0x52, 0xfe, 0xcb, 0xc4, 0x62,
-    0xb5, 0x47, 0xc9, 0x17, 0xff, 0x76, 0x24, 0x9e, 0xce, 0xb6, 0x16, 0x75,
-    0x41, 0xfb, 0xec, 0x35, 0xbf, 0xfd, 0x9d, 0x4e, 0x75, 0xf3, 0x48, 0xf3,
-    0x9d, 0x7d, 0x1e, 0x85, 0x9d, 0x4b, 0x3e, 0x7f, 0x23, 0xdf, 0xcc, 0xb8,
-    0x7f, 0x7f, 0xa7, 0x5f, 0x0a, 0x42, 0x87, 0x5e, 0xfb, 0x00, 0x3a, 0xa7,
-    0x37, 0xab, 0x20, 0xbf, 0x36, 0x3b, 0x0b, 0x2a, 0xfc, 0x2e, 0x23, 0x85,
-    0x5d, 0x8d, 0x2a, 0xe6, 0x59, 0x2a, 0xb0, 0xfd, 0xb4, 0x4d, 0xe2, 0x36,
-    0x45, 0x6f, 0xf0, 0xfd, 0x80, 0x77, 0x36, 0x8a, 0x54, 0xde, 0x5f, 0xfe,
-    0x9c, 0x3c, 0x76, 0x8e, 0x6c, 0xe2, 0x68, 0xea, 0x84, 0xfd, 0x70, 0x89,
-    0x1b, 0x5e, 0x1a, 0x9f, 0xa3, 0xdf, 0xfd, 0x00, 0xd6, 0x60, 0x5c, 0x5d,
-    0x43, 0xaf, 0xff, 0xa5, 0xa6, 0x63, 0x9d, 0x84, 0xec, 0x0a, 0x1d, 0x7f,
-    0xfd, 0xa1, 0xcd, 0xc0, 0xfa, 0x7e, 0x26, 0xe0, 0x3a, 0xb7, 0x44, 0xe3,
-    0x29, 0xb5, 0xd4, 0xc0, 0x9e, 0x1b, 0xb7, 0xf6, 0xbe, 0x87, 0xf1, 0x91,
-    0xd7, 0xf2, 0x34, 0x38, 0xe0, 0x3a, 0xff, 0xfd, 0xed, 0x6f, 0xf0, 0x38,
-    0x18, 0x7e, 0x60, 0x80, 0xeb, 0xff, 0xda, 0xcf, 0x7c, 0x6f, 0x53, 0xbd,
-    0x40, 0x1a, 0x10, 0xbb, 0xd1, 0x3a, 0xba, 0x45, 0x77, 0x95, 0xaf, 0xcb,
-    0xd3, 0x2f, 0xb9, 0xd6, 0xd0, 0x4f, 0x7f, 0xe9, 0xb5, 0xfd, 0x93, 0x49,
-    0x39, 0xa3, 0xaa, 0x19, 0x38, 0x81, 0x86, 0x36, 0x46, 0x7a, 0x92, 0x83,
-    0x39, 0x29, 0xfd, 0xe3, 0x4f, 0x60, 0x94, 0x09, 0x86, 0xa3, 0x38, 0xf1,
-    0x55, 0xe6, 0x59, 0x64, 0xab, 0xe0, 0x38, 0x84, 0xa5, 0x4b, 0xfb, 0xee,
-    0xa3, 0xc8, 0xeb, 0xee, 0x71, 0x16, 0x75, 0xed, 0x47, 0x8e, 0xbc, 0x3e,
-    0xd2, 0x1b, 0xc9, 0x88, 0x6f, 0x7c, 0x53, 0x6c, 0xeb, 0xde, 0x70, 0x9d,
-    0x5c, 0x37, 0xba, 0x22, 0xbf, 0x9b, 0x00, 0x4e, 0x28, 0x75, 0xfd, 0xf7,
-    0x39, 0x99, 0x31, 0xd7, 0xe7, 0xef, 0xc0, 0xc1, 0xd5, 0x24, 0xe7, 0xc2,
-    0x61, 0x8b, 0x88, 0xde, 0x24, 0x3a, 0x2d, 0xf1, 0x75, 0xf9, 0xf9, 0xcc,
-    0xdc, 0xeb, 0xff, 0xde, 0xea, 0x38, 0x33, 0x81, 0x81, 0x91, 0xd7, 0xff,
-    0xb7, 0xf9, 0xb8, 0x20, 0x5a, 0xf3, 0x8b, 0x9d, 0x50, 0x8b, 0xac, 0x27,
-    0x14, 0x7b, 0xf4, 0x6b, 0xe8, 0xc8, 0xeb, 0xff, 0xff, 0x9d, 0x3c, 0x9d,
-    0x6a, 0x7c, 0x92, 0x75, 0xc7, 0xd2, 0xce, 0x61, 0xd7, 0xbb, 0x9b, 0x47,
-    0x5f, 0xbd, 0xaf, 0xba, 0xf9, 0xd4, 0x46, 0xbb, 0x7d, 0xfc, 0xce, 0xba,
-    0xed, 0x83, 0xaf, 0xff, 0xfe, 0x45, 0x37, 0x97, 0xb0, 0x7d, 0xaf, 0x9a,
-    0xd6, 0x73, 0x05, 0xe4, 0x75, 0xff, 0xca, 0x84, 0x63, 0xf6, 0xe2, 0x89,
-    0xc3, 0xae, 0xc6, 0x4e, 0xb6, 0x41, 0xed, 0xe9, 0x16, 0xff, 0x07, 0xb1,
-    0x33, 0xbe, 0xe7, 0x5e, 0xe8, 0x36, 0x1d, 0x5c, 0x3d, 0x1d, 0xa3, 0x3a,
-    0x92, 0x27, 0x1d, 0xde, 0xff, 0xec, 0xe0, 0x16, 0x9a, 0xfb, 0xa8, 0xc3,
-    0xaf, 0xff, 0xfd, 0xe8, 0xe0, 0x1b, 0xd4, 0x92, 0x71, 0xc1, 0xe1, 0x85,
-    0xe8, 0xeb, 0x98, 0xf4, 0x75, 0x28, 0x88, 0x37, 0x6a, 0xa9, 0x23, 0xa9,
-    0xe1, 0x8f, 0x78, 0x38, 0xb3, 0xaf, 0x81, 0xec, 0x01, 0xd4, 0x86, 0xf3,
-    0x83, 0x77, 0xfc, 0xde, 0x8c, 0x6e, 0x91, 0xd3, 0xaa, 0x17, 0x67, 0xe5,
-    0x18, 0xe0, 0x4b, 0x72, 0x16, 0xa8, 0x89, 0xc2, 0xd7, 0x8d, 0xa8, 0x63,
-    0x0c, 0xfd, 0x8f, 0xe9, 0x05, 0xff, 0x9d, 0x03, 0xff, 0xb5, 0x3e, 0x32,
-    0x75, 0xfb, 0x58, 0xa4, 0x68, 0xeb, 0xf9, 0x8f, 0x48, 0x3b, 0xc8, 0xeb,
-    0xff, 0x3f, 0x36, 0xd3, 0xb8, 0xfb, 0x80, 0xeb, 0xff, 0xf2, 0x7a, 0x17,
-    0x9b, 0xfa, 0x17, 0xf7, 0x8e, 0x03, 0xaf, 0x90, 0x5c, 0x27, 0x5f, 0xf6,
-    0xa3, 0x9e, 0x85, 0x42, 0x87, 0x54, 0x91, 0x5a, 0x15, 0x6d, 0x0f, 0xdf,
-    0xfe, 0xd2, 0x72, 0x25, 0xd8, 0x98, 0x7f, 0x50, 0xeb, 0x9b, 0xb6, 0x75,
-    0xfc, 0xa7, 0xa3, 0xb1, 0xa3, 0xaf, 0xee, 0xa6, 0xfa, 0x7d, 0xce, 0xa9,
-    0x1f, 0xa2, 0x0c, 0x80, 0xb6, 0xff, 0xc2, 0xf3, 0x75, 0xf9, 0xc4, 0x09,
-    0xd7, 0xa1, 0x8a, 0x39, 0xd7, 0x82, 0x82, 0x75, 0xfd, 0x1e, 0x62, 0xde,
-    0x37, 0x3a, 0xbe, 0x1e, 0x5a, 0x0d, 0x5f, 0x40, 0x30, 0x4e, 0xa9, 0x2b,
-    0x4b, 0xc2, 0x76, 0x98, 0x24, 0x3b, 0x66, 0x30, 0xe4, 0x2f, 0xd6, 0x5d,
-    0xa3, 0xd6, 0x5a, 0xf6, 0xc8, 0xef, 0xc8, 0xb6, 0x19, 0x8a, 0x30, 0x0e,
-    0xbe, 0xfb, 0x0c, 0xe8, 0xeb, 0x81, 0xe3, 0xaf, 0xb9, 0xcc, 0xd1, 0xd7,
-    0x64, 0xc7, 0x5a, 0x5f, 0x0f, 0xc6, 0x72, 0x47, 0x16, 0xfa, 0x43, 0x7e,
-    0x4f, 0x38, 0xe1, 0xd7, 0xee, 0x07, 0x30, 0x4e, 0xbf, 0xf9, 0x8d, 0x33,
-    0xb1, 0xb3, 0x5d, 0x8d, 0xce, 0xbf, 0xb7, 0xe7, 0xfb, 0xfa, 0x47, 0x53,
-    0xa2, 0x7b, 0x44, 0xbf, 0xa4, 0x5f, 0xf6, 0x0f, 0x33, 0x58, 0x9d, 0x3a,
-    0xff, 0xfa, 0x5e, 0x1c, 0x7f, 0x0e, 0x7b, 0xd8, 0xc9, 0xd7, 0xa7, 0xcd,
-    0x87, 0x5f, 0xfe, 0xf6, 0xb2, 0x6e, 0xc6, 0xcc, 0xef, 0x60, 0xeb, 0xfb,
-    0xa1, 0x4d, 0x90, 0x13, 0xab, 0x0f, 0xe5, 0xd2, 0xef, 0xb3, 0xc9, 0xa3,
-    0xaf, 0xe6, 0x22, 0x61, 0x60, 0x4f, 0xf9, 0xd5, 0xa3, 0xd9, 0xf1, 0x05,
-    0x49, 0x55, 0x30, 0x61, 0x84, 0xd3, 0x0d, 0xcd, 0x78, 0x9a, 0x30, 0x97,
-    0xf3, 0xcd, 0xe6, 0x73, 0xa7, 0x5f, 0xed, 0x22, 0x9d, 0x71, 0x43, 0xaf,
-    0x93, 0x58, 0x17, 0x3c, 0xdf, 0x0e, 0x5f, 0xf9, 0xd8, 0xc1, 0xfe, 0x90,
-    0x77, 0x91, 0xd7, 0xff, 0xf7, 0xb3, 0xa9, 0x1e, 0x40, 0x44, 0x95, 0x65,
-    0x96, 0x4a, 0xbf, 0xdd, 0xfd, 0xd6, 0x17, 0x59, 0xd4, 0x28, 0x90, 0xf2,
-    0xed, 0xf0, 0x73, 0x14, 0x2a, 0xf9, 0xc0, 0xfe, 0x3a, 0xff, 0xb8, 0xed,
-    0xf9, 0xd8, 0xfa, 0x27, 0x5e, 0xfe, 0x38, 0x75, 0xde, 0xd0, 0x4f, 0x5e,
-    0x63, 0xbb, 0xd2, 0x1f, 0xcd, 0x10, 0xcd, 0xee, 0xc4, 0xe7, 0x5e, 0x65,
-    0x96, 0x4a, 0xbd, 0x82, 0xd2, 0x95, 0x2f, 0xef, 0xfd, 0x93, 0xe0, 0x5e,
-    0x43, 0x13, 0x9d, 0x40, 0x3e, 0x71, 0x2a, 0xbe, 0x71, 0x62, 0xac, 0x23,
-    0xae, 0x62, 0xac, 0x54, 0xeb, 0xf6, 0x7b, 0xdf, 0xce, 0x75, 0xa4, 0xc5,
-    0x4f, 0x2c, 0x48, 0xaf, 0x3b, 0x1c, 0x1d, 0x7e, 0xc0, 0xf5, 0xd8, 0xce,
-    0xbf, 0x0e, 0x06, 0x16, 0x75, 0x42, 0xae, 0x29, 0xc8, 0x82, 0x43, 0x8e,
-    0xfb, 0x97, 0xcc, 0x53, 0xc8, 0x51, 0x74, 0x85, 0xdd, 0x7f, 0x2d, 0xd8,
-    0x3a, 0xc9, 0x4d, 0xfe, 0x85, 0xe2, 0x72, 0x69, 0x1d, 0x7b, 0xc9, 0x07,
-    0x5d, 0x82, 0x75, 0x21, 0xae, 0xfc, 0x6a, 0xff, 0xfd, 0xd7, 0xe6, 0xb1,
-    0x05, 0xfd, 0xa6, 0x60, 0x4e, 0xbf, 0x05, 0x39, 0x1e, 0x3a, 0xfd, 0x12,
-    0xee, 0x6e, 0x75, 0xdb, 0x80, 0xeb, 0xf9, 0x71, 0xa0, 0x23, 0x4e, 0xbd,
-    0xa8, 0x50, 0x07, 0x87, 0xa1, 0x7b, 0xfd, 0xfe, 0x70, 0x00, 0x41, 0x3a,
-    0xff, 0xd8, 0xb4, 0x0f, 0x30, 0x2e, 0xb3, 0xaf, 0xb1, 0x7f, 0x42, 0x75,
-    0x74, 0xf7, 0xc4, 0xf2, 0xff, 0xf2, 0x07, 0xbf, 0x75, 0x9c, 0x6b, 0xbb,
-    0x4d, 0x10, 0x65, 0xf7, 0xfd, 0xc6, 0x9d, 0x52, 0x3f, 0x9d, 0xb5, 0x7b,
-    0xfd, 0xdf, 0xd4, 0x1c, 0x9f, 0xf3, 0xaf, 0x77, 0xf6, 0x33, 0xaf, 0xff,
-    0x71, 0xf6, 0x60, 0xb7, 0xa8, 0x0f, 0xbe, 0x3a, 0xa1, 0x18, 0xf2, 0x25,
-    0x60, 0x9b, 0x7e, 0x41, 0x5b, 0xaa, 0x67, 0xe9, 0xa6, 0xa1, 0x23, 0xe8,
-    0xd8, 0x6f, 0x3e, 0xcc, 0x3a, 0xff, 0x01, 0x3b, 0xdc, 0x03, 0x9d, 0x7f,
-    0xff, 0xcb, 0xcf, 0x79, 0xf8, 0x31, 0xbc, 0xbe, 0xf0, 0x0b, 0x4d, 0x1d,
-    0x7f, 0xcb, 0x46, 0x70, 0x43, 0xd8, 0x3a, 0xee, 0xfe, 0x75, 0xff, 0xfa,
-    0x48, 0x21, 0xee, 0x6f, 0xf5, 0xc7, 0xc2, 0x13, 0xaf, 0x23, 0x2c, 0x67,
-    0x5f, 0xec, 0xd9, 0xaf, 0x7a, 0x16, 0x75, 0x70, 0xf4, 0xfa, 0x3f, 0x50,
-    0x9c, 0x06, 0x34, 0x21, 0xbc, 0xc2, 0xfa, 0x85, 0x45, 0xfe, 0xdb, 0xcd,
-    0x6d, 0xe7, 0x20, 0xea, 0x92, 0xf0, 0x38, 0x48, 0x71, 0x49, 0xa4, 0xc9,
-    0x2b, 0x45, 0x69, 0x60, 0x1c, 0xd4, 0x76, 0x3e, 0x4e, 0xbf, 0xda, 0xd6,
-    0x08, 0x36, 0xf0, 0xeb, 0xe1, 0x4d, 0xa8, 0x3a, 0xd3, 0x1d, 0x7f, 0x6b,
-    0x04, 0x1b, 0x78, 0x75, 0xb6, 0x7c, 0x44, 0xae, 0x1a, 0x00, 0x8b, 0x42,
-    0x37, 0xfd, 0xff, 0x81, 0xfa, 0xe3, 0x3c, 0x75, 0xff, 0xe1, 0x9f, 0xe4,
-    0xc8, 0x38, 0x1c, 0x15, 0x0e, 0xbf, 0x93, 0x7d, 0xae, 0xc7, 0x8e, 0xbd,
-    0xf7, 0x20, 0xea, 0x84, 0x4b, 0xb1, 0xa5, 0xb9, 0x85, 0xff, 0xff, 0x9c,
-    0x38, 0x2f, 0xed, 0x67, 0x00, 0x08, 0xcd, 0xfd, 0xa4, 0x3a, 0xf4, 0x72,
-    0x63, 0xab, 0xe3, 0x6c, 0xcb, 0x12, 0xe2, 0xe7, 0x84, 0xd0, 0x61, 0x4f,
-    0x92, 0xbb, 0x1b, 0x0b, 0xdd, 0xcd, 0xd2, 0x5d, 0xa7, 0x61, 0x60, 0xf3,
-    0xcc, 0xe0, 0x8c, 0x84, 0x51, 0xbf, 0x86, 0x8b, 0x26, 0x3b, 0x6d, 0x37,
-    0xb7, 0x9f, 0x61, 0xd7, 0xf7, 0xc6, 0xf6, 0x37, 0xda, 0x3a, 0xf7, 0xc0,
-    0x32, 0x75, 0x6e, 0x7a, 0x5e, 0x33, 0xbf, 0xb1, 0x9c, 0xc1, 0x50, 0xeb,
-    0xe5, 0xbe, 0x68, 0xea, 0x43, 0xcc, 0x72, 0xcb, 0xff, 0xe6, 0xc6, 0xb5,
-    0x0b, 0xcf, 0x26, 0xba, 0xe7, 0x5f, 0xe1, 0x18, 0x92, 0xe1, 0x0e, 0xbf,
-    0xde, 0x4d, 0x89, 0xe9, 0x41, 0x56, 0x59, 0xd7, 0xf6, 0x0a, 0x9c, 0x85,
-    0x50, 0xf0, 0xfe, 0x99, 0xd6, 0x26, 0x0a, 0x89, 0xba, 0x72, 0xbe, 0xe7,
-    0xfb, 0xc8, 0xeb, 0xfc, 0x32, 0x1c, 0x5c, 0x34, 0xeb, 0xcb, 0x0e, 0x1d,
-    0x50, 0x7d, 0xf8, 0x48, 0xe6, 0x17, 0xb6, 0xff, 0xf1, 0xd7, 0xcf, 0xc7,
-    0xfa, 0x75, 0xff, 0xef, 0x42, 0xd0, 0x38, 0x2a, 0x76, 0x16, 0x75, 0x35,
-    0x11, 0x5a, 0x20, 0xf1, 0x15, 0xff, 0xf2, 0x7b, 0xb1, 0xa8, 0xec, 0x24,
-    0xf0, 0xa1, 0xd7, 0xfb, 0xc8, 0xcc, 0xc2, 0xec, 0x9d, 0x7e, 0xf7, 0xb4,
-    0xe0, 0x3a, 0xfd, 0x0b, 0xf6, 0x34, 0xeb, 0x92, 0x73, 0xaa, 0x11, 0xcb,
-    0xba, 0x72, 0x1a, 0x74, 0x9f, 0xc4, 0xd7, 0xe6, 0x50, 0x3b, 0x48, 0x75,
-    0xff, 0x76, 0x24, 0x83, 0x8b, 0x83, 0xaf, 0xfb, 0x3d, 0xdc, 0x58, 0xbf,
-    0x8e, 0xbf, 0xb6, 0x27, 0x37, 0x86, 0x33, 0xac, 0x21, 0x3e, 0x8c, 0x36,
-    0xbf, 0x2e, 0x1b, 0x38, 0x4e, 0xbe, 0x94, 0x2d, 0xce, 0xbf, 0x70, 0x0b,
-    0x4d, 0x1d, 0x77, 0xb5, 0x87, 0xde, 0xe5, 0x1f, 0x48, 0x2a, 0x11, 0xa1,
-    0xfc, 0x25, 0x6d, 0xa3, 0xaf, 0xe8, 0x9f, 0x05, 0x14, 0x3a, 0xb8, 0x6f,
-    0x34, 0x21, 0x7f, 0xf4, 0x0b, 0xf6, 0x00, 0xaf, 0x35, 0xa2, 0xaa, 0x75,
-    0x46, 0xa1, 0x8d, 0xb7, 0x19, 0x16, 0x43, 0x7f, 0x9c, 0x3a, 0xd4, 0x72,
-    0x47, 0x5d, 0xfc, 0xe7, 0x5f, 0xed, 0xe5, 0xbe, 0x93, 0xd0, 0x75, 0xe4,
-    0xdf, 0x47, 0x56, 0x1e, 0x82, 0x1a, 0x52, 0x22, 0x23, 0xad, 0x17, 0x63,
-    0x4e, 0xbd, 0xcc, 0xd1, 0xde, 0x2d, 0x6f, 0xff, 0x83, 0xf1, 0xd3, 0x35,
-    0x13, 0xe0, 0xa2, 0x87, 0x5f, 0xee, 0x2e, 0x37, 0xf3, 0xb4, 0xea, 0xc4,
-    0x41, 0x22, 0x7d, 0xf2, 0x2e, 0x26, 0x3a, 0xfb, 0x27, 0xfe, 0x47, 0x54,
-    0xc7, 0x88, 0xc9, 0x0d, 0xf7, 0xe1, 0x0c, 0x1d, 0x50, 0x78, 0xce, 0x49,
-    0x76, 0x32, 0x75, 0x15, 0x7f, 0x6b, 0xec, 0x72, 0x16, 0x55, 0x15, 0x45,
-    0x51, 0x54, 0x55, 0x48, 0xf8, 0x10, 0x28, 0x05, 0xdf, 0x85, 0x6d, 0x85,
-    0x6d, 0x05, 0x5d, 0xdc, 0x2a, 0xfe, 0x77, 0xf4, 0xd0, 0xb2, 0xbe, 0x16,
-    0xb6, 0x60, 0x95, 0x45, 0x51, 0x55, 0x22, 0xd1, 0x02, 0xa8, 0xaa, 0x2a,
-    0x8a, 0xa2, 0xa8, 0xaa, 0x2a, 0xa7, 0x37, 0x81, 0x0a, 0x40, 0xa0, 0x05,
-    0x68, 0x2b, 0x60, 0x55, 0x15, 0x45, 0x54, 0x8b, 0x4d, 0x05, 0x51, 0x54,
-    0x55, 0x15, 0x45, 0x54, 0x8d, 0x40, 0x02, 0xbc, 0x15, 0xb4, 0x15, 0x45,
-    0x51, 0x54, 0x55, 0x15, 0x53, 0x9a, 0x85, 0x02, 0xb8, 0x15, 0xd0, 0xab,
-    0x28, 0x55, 0x15, 0x45, 0x51, 0x54, 0x55, 0x04, 0xd4, 0x6e, 0x14, 0x00,
-    0xaf, 0xc2, 0xa8, 0xaa, 0x2a, 0x8a, 0xbf, 0x76, 0x01, 0xac, 0x2a, 0x8a,
-    0xa9, 0x1e, 0x73, 0x42, 0xba, 0x14, 0xe1, 0x40, 0x26, 0xb3, 0x4a, 0xa2,
-    0xa8, 0xaa, 0x2a, 0x8a, 0xa9, 0x1a, 0x8d, 0xc2, 0x90, 0x2b, 0x60, 0x55,
-    0x15, 0x45, 0x51, 0x54, 0x55, 0x48, 0xd4, 0x04, 0x2b, 0xa1, 0x42, 0x15,
-    0x6e, 0x95, 0x45, 0x51, 0x56, 0x91, 0x54, 0x56, 0xe5, 0x85, 0x15, 0x45,
-    0x51, 0x54, 0x55, 0x4e, 0x7c, 0xd2, 0x0a, 0x50, 0x69, 0xa3, 0x53, 0x05,
-    0x00, 0x2b, 0xc1, 0x56, 0xc2, 0xa8, 0xaa, 0x2a, 0xd2, 0x2a, 0x8a, 0xdc,
-    0xb0, 0xa2, 0xa8, 0xaa, 0x83, 0xd2, 0x90, 0x52, 0x0d, 0x70, 0x69, 0x61,
-    0x54, 0x55, 0x15, 0x45, 0x51, 0x54, 0x55, 0x41, 0xb2, 0xdc, 0x2b, 0x81,
-    0x4b, 0x0a, 0x10, 0xaa, 0x2a, 0x8a, 0xa2, 0xab, 0x85, 0xf6, 0x82, 0xbc,
-    0x15, 0x45, 0x51, 0x54, 0x55, 0x2c, 0xbe, 0x10, 0xaf, 0x05, 0x59, 0x65,
-    0x51, 0x54, 0x55, 0x00, 0xb4, 0xfc, 0x2a, 0x8a, 0xa2, 0xa8, 0xaa, 0x2a,
-    0xa0, 0xd4, 0x4c, 0x15, 0xd0, 0xaf, 0xc2, 0xaa, 0x17, 0xe9, 0x67, 0x71,
-    0x91, 0xe8, 0x4a, 0x31, 0x6d, 0xad, 0x7b, 0xa4, 0x23, 0x33, 0x19, 0xec,
-    0xc7, 0x3c, 0x84, 0x5a, 0xd2, 0x3a, 0x70, 0xec, 0xa0, 0x3a, 0x17, 0x6d,
-    0x33, 0x79, 0x87, 0xf7, 0x9d, 0x8c, 0xac, 0xa5, 0xed, 0x96, 0x7d, 0x24,
-    0xda, 0x49, 0xbf, 0x48, 0x63, 0x34, 0x52, 0xa9, 0xab, 0x5e, 0x48, 0x59,
-    0x57, 0xc8, 0xd7, 0xe1, 0xd7, 0x90, 0x38, 0x75, 0x95, 0xdd, 0x11, 0xbc,
-    0x39, 0xe8, 0xd7, 0x88, 0x2d, 0x1b, 0x19, 0x48, 0x7f, 0x69, 0x3f, 0xd7,
-    0xfb, 0xa8, 0xc8, 0x79, 0x13, 0x9d, 0x79, 0x36, 0x30, 0x4e, 0xad, 0xd1,
-    0x1d, 0x31, 0xcf, 0x8d, 0x2f, 0xd9, 0x93, 0x3f, 0xd3, 0xae, 0x04, 0x1d,
-    0x7f, 0x71, 0xc7, 0xec, 0x00, 0xeb, 0x9f, 0x87, 0x59, 0x0e, 0x69, 0x6b,
-    0x66, 0x9d, 0x65, 0x9d, 0x76, 0xda, 0xa8, 0x89, 0x5e, 0x0a, 0xf5, 0x09,
-    0xc7, 0xbe, 0x88, 0x5f, 0xf7, 0x61, 0x79, 0x34, 0x0c, 0xe7, 0x5f, 0xfd,
-    0xf1, 0xda, 0x1e, 0xc0, 0x30, 0x40, 0x75, 0xc0, 0x83, 0xab, 0x0f, 0x64,
-    0x08, 0x95, 0x89, 0x86, 0x01, 0x6b, 0xf8, 0x48, 0xdf, 0xfc, 0x23, 0x13,
-    0x8e, 0x26, 0xc8, 0xdb, 0x3a, 0xf4, 0x6f, 0xa3, 0xa9, 0xcf, 0x87, 0x48,
-    0xb7, 0x9f, 0x90, 0x75, 0xf9, 0x36, 0xdc, 0x40, 0x75, 0x48, 0xf0, 0x96,
-    0x35, 0x7f, 0xdf, 0x5c, 0x3a, 0xc5, 0xc3, 0x19, 0xd7, 0xb3, 0x76, 0x4e,
-    0xbd, 0xb8, 0x33, 0x87, 0xb2, 0x27, 0x97, 0xdb, 0x33, 0x92, 0x3a, 0xf0,
-    0x5c, 0x4e, 0xa4, 0x37, 0xae, 0x47, 0x7f, 0xfd, 0x1f, 0x1f, 0x9c, 0x70,
-    0x42, 0xac, 0xb2, 0xc9, 0xd5, 0x09, 0xaf, 0x3b, 0xde, 0x9c, 0x3f, 0x1f,
-    0xa6, 0x2d, 0xb9, 0x25, 0x87, 0x29, 0xdb, 0xe5, 0x19, 0x28, 0x61, 0x3d,
-    0x90, 0xb6, 0x6c, 0x62, 0xbb, 0xa4, 0xa4, 0xa5, 0xf6, 0x34, 0x59, 0xa1,
-    0x75, 0xc3, 0x75, 0xc2, 0xb3, 0xb0, 0xab, 0x7a, 0x57, 0x88, 0x0c, 0x86,
-    0x3c, 0x9d, 0x42, 0x5f, 0xd1, 0xe0, 0xdf, 0x20, 0xb6, 0x0e, 0xbf, 0x99,
-    0x7e, 0x71, 0xf7, 0x3a, 0xff, 0xfd, 0xae, 0x71, 0x26, 0xd7, 0x23, 0xc8,
-    0xd4, 0x09, 0xd4, 0xb4, 0x51, 0x08, 0xfb, 0x25, 0xd7, 0xcb, 0xf4, 0x68,
-    0xeb, 0xfd, 0xe8, 0xfd, 0xbd, 0x4e, 0x1d, 0x7f, 0x63, 0x7b, 0x1b, 0xc8,
-    0xeb, 0xf9, 0x7a, 0x45, 0x3c, 0xc9, 0xd7, 0xe8, 0xdf, 0xb1, 0x23, 0xa8,
-    0x51, 0x6d, 0xe3, 0x3f, 0xa5, 0xbb, 0x45, 0xf7, 0x6f, 0xe3, 0xaf, 0xde,
-    0x71, 0xff, 0x0e, 0xbf, 0xda, 0xc5, 0xa7, 0xba, 0xe7, 0x5a, 0x30, 0xfb,
-    0x84, 0x5f, 0xc4, 0xd7, 0xd2, 0xf8, 0xb4, 0x3a, 0xf6, 0xd7, 0x20, 0xeb,
-    0xfd, 0xc4, 0x98, 0x73, 0x63, 0x9d, 0x76, 0xfa, 0xf8, 0x7e, 0x90, 0x47,
-    0xc1, 0xeb, 0xfe, 0x18, 0x79, 0xfb, 0x1c, 0x01, 0xd7, 0xf9, 0x38, 0x3e,
-    0xf6, 0x4e, 0x75, 0xcf, 0xb0, 0xeb, 0xfa, 0x42, 0x92, 0xee, 0x1d, 0x7e,
-    0x9d, 0x39, 0x12, 0x3a, 0x94, 0x44, 0xdc, 0xc6, 0x5c, 0x17, 0x12, 0xbb,
-    0xec, 0x0a, 0x28, 0x75, 0xff, 0xe7, 0x4f, 0x47, 0xb5, 0xd7, 0x4e, 0xfe,
-    0x75, 0xf0, 0x8f, 0xf2, 0x3a, 0xff, 0xdd, 0x8e, 0x00, 0x71, 0x97, 0x01,
-    0xd7, 0xb3, 0x26, 0x3a, 0xd9, 0xd3, 0xd8, 0x01, 0xed, 0xfd, 0xff, 0x3f,
-    0x5b, 0x89, 0xd7, 0xcb, 0x8c, 0x9c, 0xeb, 0xf6, 0x6c, 0x18, 0xdc, 0xea,
-    0x43, 0xc9, 0xd1, 0x0d, 0xf4, 0x0f, 0x9a, 0x75, 0x05, 0x56, 0x8e, 0x43,
-    0x4b, 0x87, 0xdd, 0x21, 0x74, 0x81, 0x79, 0xd1, 0x3f, 0x9d, 0xf6, 0xc8,
-    0x6f, 0xf0, 0x3e, 0xe0, 0x87, 0xb0, 0x75, 0x42, 0x2e, 0x1e, 0x10, 0xb7,
-    0xf6, 0xb1, 0x69, 0xd8, 0x3a, 0xf6, 0xf2, 0xd1, 0xd5, 0xb9, 0xe4, 0x70,
-    0xae, 0xf6, 0x80, 0xc9, 0xd5, 0x07, 0x81, 0x84, 0x77, 0xdf, 0xbf, 0x24,
-    0x75, 0xf4, 0x7e, 0xc1, 0xd1, 0x57, 0xe9, 0x2a, 0xcb, 0x2c, 0x9d, 0x42,
-    0x7a, 0x5f, 0x93, 0x5f, 0x3f, 0x97, 0xe3, 0xa8, 0x28, 0xb7, 0xc7, 0x40,
-    0x11, 0x5f, 0xef, 0xa2, 0x2e, 0xcb, 0xf4, 0xea, 0x86, 0x40, 0x4e, 0x18,
-    0x24, 0x35, 0xd7, 0x0a, 0xf7, 0x85, 0x30, 0x25, 0xe3, 0x0c, 0x2b, 0xbf,
-    0x86, 0xbb, 0x25, 0xf7, 0x98, 0x96, 0x28, 0xc5, 0x9d, 0x7a, 0x42, 0xe7,
-    0x5b, 0x76, 0x24, 0xf1, 0xa0, 0xb2, 0xf7, 0x9c, 0x07, 0x5f, 0xd1, 0xc9,
-    0xe3, 0x93, 0x9d, 0x7f, 0xe8, 0x1f, 0x77, 0xf7, 0x94, 0xa0, 0xeb, 0xf7,
-    0xe0, 0xc1, 0x69, 0xd7, 0xb9, 0x13, 0x1d, 0x7c, 0x82, 0xf3, 0x1d, 0x7c,
-    0x9a, 0xe6, 0x1d, 0x7f, 0xbd, 0x9f, 0x62, 0x64, 0xd1, 0xd5, 0x3a, 0x67,
-    0xb2, 0x1b, 0x09, 0x77, 0x0f, 0x56, 0x4f, 0xd1, 0xcf, 0x10, 0x6c, 0x20,
-    0xbf, 0xe8, 0x4e, 0xc2, 0xe7, 0xc6, 0x4e, 0xbf, 0xa3, 0xa9, 0x3b, 0x89,
-    0xd7, 0xfd, 0x38, 0xe4, 0xbb, 0x80, 0xd1, 0xd7, 0xfe, 0xc1, 0xde, 0x5a,
-    0xe7, 0xf0, 0x03, 0xaf, 0xd9, 0xed, 0x62, 0x87, 0x52, 0x1f, 0x32, 0xcf,
-    0xef, 0xe1, 0xf7, 0xce, 0xe6, 0xd1, 0xd7, 0x83, 0x1b, 0x0e, 0xbf, 0xfe,
-    0xc1, 0x18, 0x64, 0x23, 0x1b, 0xc9, 0x04, 0xeb, 0xff, 0xcf, 0xf2, 0x69,
-    0x47, 0x27, 0xf8, 0xce, 0x74, 0xea, 0x84, 0x75, 0x04, 0xc7, 0xa3, 0xa2,
-    0x99, 0x7f, 0xcb, 0xee, 0x7b, 0x3f, 0xe4, 0xe7, 0x5f, 0xf4, 0x7b, 0x38,
-    0xd7, 0x76, 0x9a, 0x2f, 0x8b, 0xf6, 0x72, 0x37, 0x91, 0xd7, 0xbb, 0x0b,
-    0x69, 0xf5, 0x79, 0x0e, 0xff, 0xfc, 0x2d, 0xf9, 0xd8, 0x4e, 0x22, 0xd3,
-    0x6e, 0x16, 0x75, 0xe7, 0xe4, 0xe6, 0x8b, 0xfe, 0xa1, 0x16, 0x78, 0x66,
-    0xd5, 0x7b, 0xff, 0xfd, 0xd7, 0xd2, 0x46, 0xbe, 0x7b, 0xb8, 0xbc, 0x6b,
-    0xf0, 0xeb, 0xa3, 0x68, 0xeb, 0xed, 0x69, 0xd6, 0x75, 0x75, 0x13, 0x20,
-    0x60, 0xf0, 0xc5, 0xff, 0xfd, 0x27, 0x0b, 0x7a, 0x83, 0x9b, 0x1e, 0x5a,
-    0x40, 0x9d, 0x7f, 0xd0, 0xbf, 0x81, 0xcc, 0x06, 0x8e, 0xbf, 0xe4, 0xc1,
-    0x0a, 0x89, 0x9c, 0x3a, 0x90, 0xfb, 0xf6, 0x8e, 0x6f, 0x7b, 0x37, 0x3a,
-    0xfe, 0x7e, 0x6f, 0x2c, 0xf1, 0xd7, 0xfe, 0xf6, 0x93, 0x9e, 0x1f, 0xde,
-    0x47, 0x5f, 0xfe, 0x5c, 0x6d, 0xe7, 0xe3, 0x99, 0xb2, 0x37, 0x3a, 0xff,
-    0xd1, 0x9c, 0xce, 0x01, 0x69, 0xa3, 0xaf, 0x3e, 0xfb, 0x47, 0x5f, 0xcf,
-    0xed, 0x46, 0x4e, 0x75, 0x42, 0x67, 0xf8, 0x5a, 0x87, 0xc2, 0x9b, 0xb0,
-    0xf1, 0x91, 0xfb, 0xfe, 0xfe, 0x17, 0xac, 0x5c, 0x31, 0x9d, 0x7f, 0xf6,
-    0xb0, 0x7d, 0xaf, 0xbb, 0x23, 0x37, 0x3a, 0xff, 0xfa, 0x51, 0xc9, 0xfc,
-    0x8a, 0x6b, 0x4e, 0x32, 0x3a, 0xfe, 0x9f, 0x58, 0xb8, 0x63, 0x3a, 0xcc,
-    0xcc, 0x88, 0x0f, 0xaa, 0x17, 0x93, 0xa8, 0x75, 0xf4, 0xb8, 0x19, 0x1d,
-    0x7c, 0xbf, 0x24, 0xe7, 0x56, 0x1e, 0x22, 0x11, 0x5f, 0xfd, 0xb3, 0xca,
-    0x40, 0xcb, 0x3a, 0x8b, 0x3a, 0xe9, 0xfc, 0x75, 0xfe, 0xd9, 0xd7, 0x94,
-    0x60, 0x9d, 0x50, 0x79, 0x38, 0x2f, 0x7f, 0xfe, 0x97, 0x63, 0x8f, 0xef,
-    0xfc, 0x9e, 0xd7, 0x50, 0xeb, 0xfb, 0x19, 0xfb, 0xd7, 0xf1, 0xd7, 0xff,
-    0xef, 0x7d, 0x94, 0x6c, 0x41, 0x07, 0x12, 0x17, 0x85, 0x5f, 0x77, 0xee,
-    0xfe, 0x3a, 0xfd, 0x8b, 0xc4, 0xd8, 0x75, 0xe9, 0xe6, 0x63, 0x3a, 0xa1,
-    0x34, 0x79, 0xd5, 0x70, 0xbd, 0xaa, 0xc8, 0x4b, 0xf9, 0x3d, 0xde, 0xc3,
-    0xaf, 0xdc, 0x49, 0xdd, 0x66, 0x98, 0x4e, 0xfb, 0xdf, 0xc3, 0x9a, 0x61,
-    0x3b, 0x81, 0x06, 0xa0, 0x4e, 0xff, 0x0b, 0xa9, 0xe8, 0xe0, 0x0d, 0x40,
-    0x9d, 0xfe, 0xd6, 0x75, 0x35, 0xfc, 0xe6, 0x98, 0x4e, 0xec, 0x09, 0xa6,
-    0x13, 0xb9, 0x96, 0x4f, 0x30, 0x9d, 0x62, 0x69, 0x7b, 0x9a, 0x21, 0x72,
-    0xc8, 0xb4, 0x7f, 0xb1, 0x05, 0x92, 0x2b, 0x78, 0xb3, 0x09, 0x95, 0x3e,
-    0x7b, 0x26, 0xe9, 0xfb, 0xb3, 0x1e, 0x3d, 0x42, 0xe8, 0xfa, 0x16, 0xf5,
-    0x79, 0xc8, 0x06, 0x11, 0xda, 0x8d, 0x9f, 0xd2, 0x93, 0xaf, 0x08, 0x16,
-    0x75, 0xff, 0x47, 0xfe, 0x14, 0xd9, 0xf5, 0x67, 0x5e, 0x1c, 0xd6, 0x1e,
-    0xbf, 0x06, 0xef, 0x04, 0x13, 0x1d, 0x50, 0xce, 0x0c, 0x9e, 0x13, 0xc1,
-    0x8c, 0x2f, 0x0e, 0xdb, 0x1a, 0xba, 0x43, 0x1e, 0x63, 0x0e, 0x43, 0x25,
-    0x64, 0x9d, 0x8d, 0x6c, 0x55, 0xf4, 0x77, 0xe9, 0xde, 0x6d, 0x90, 0xcc,
-    0xfa, 0x63, 0x7e, 0x0e, 0x71, 0x14, 0x3a, 0xfe, 0xec, 0x7d, 0x1d, 0xc0,
-    0x75, 0xfb, 0xd9, 0x32, 0x2c, 0xeb, 0xf4, 0x6e, 0x00, 0x41, 0xd5, 0x07,
-    0x9c, 0x24, 0xf7, 0xe8, 0xd9, 0x03, 0xe3, 0xaf, 0xc9, 0xb3, 0xc9, 0x39,
-    0xd7, 0xe7, 0x97, 0xb1, 0xa7, 0x5f, 0x87, 0x3e, 0xe4, 0xc7, 0x5f, 0xff,
-    0x0b, 0x51, 0x61, 0xfd, 0xf9, 0x2c, 0xdf, 0xc7, 0x5f, 0xfe, 0xc0, 0x6b,
-    0xa9, 0xf3, 0x79, 0x46, 0x4e, 0x75, 0xff, 0x75, 0xd7, 0xd4, 0x8d, 0xe4,
-    0x75, 0xfd, 0xf4, 0x65, 0xb6, 0xf3, 0x9d, 0x50, 0x98, 0x34, 0x94, 0x11,
-    0x30, 0x07, 0x15, 0x3a, 0xa0, 0x00, 0x90, 0x34, 0x9f, 0x85, 0x22, 0x4d,
-    0xe8, 0xcb, 0xaf, 0xfd, 0x8f, 0xd9, 0x90, 0x7b, 0x9b, 0x9d, 0x7f, 0x02,
-    0x69, 0x47, 0xb4, 0x75, 0xff, 0xff, 0xfb, 0x3b, 0x82, 0x0c, 0x1f, 0x77,
-    0x3b, 0x19, 0x32, 0x72, 0x6e, 0xa6, 0xfe, 0x3a, 0xf8, 0x63, 0x19, 0x3a,
-    0xfa, 0x37, 0xd3, 0x9d, 0x50, 0xda, 0x0a, 0x4e, 0xea, 0x13, 0x8c, 0xa7,
-    0x1b, 0xa4, 0x60, 0x0c, 0x64, 0xef, 0x29, 0xf4, 0x57, 0xfc, 0x7b, 0xf9,
-    0x76, 0xc8, 0x40, 0xfd, 0x20, 0xbf, 0xfe, 0x41, 0xc5, 0xc7, 0xd1, 0xfe,
-    0x43, 0x8b, 0x3a, 0xff, 0x82, 0x98, 0x3f, 0xcb, 0x34, 0x75, 0xff, 0x75,
-    0x25, 0xd7, 0x92, 0x2c, 0xeb, 0xff, 0x69, 0x07, 0x79, 0x79, 0x34, 0x87,
-    0x56, 0x1f, 0xa7, 0x8d, 0xef, 0xda, 0x5c, 0x06, 0x0e, 0xa9, 0x26, 0x81,
-    0x89, 0xcb, 0x85, 0x5f, 0x88, 0x6f, 0x86, 0x39, 0x23, 0xaf, 0xfb, 0xb1,
-    0x24, 0x11, 0xff, 0x73, 0xaf, 0xfa, 0x33, 0xdf, 0x40, 0x08, 0xdc, 0xeb,
-    0x72, 0x11, 0x25, 0x84, 0x0b, 0x38, 0xbf, 0xff, 0xfd, 0xd7, 0x4f, 0x4b,
-    0xf1, 0xf6, 0xba, 0xf2, 0xfa, 0x30, 0xde, 0x44, 0x8e, 0xbf, 0xf6, 0xbe,
-    0xf9, 0x07, 0xf9, 0x66, 0x8e, 0xa6, 0x34, 0x5c, 0x75, 0xe2, 0xff, 0xfe,
-    0xcd, 0xf3, 0x4e, 0x3d, 0x48, 0xf7, 0x7f, 0x75, 0x9d, 0x50, 0x9b, 0x5b,
-    0xc3, 0xb0, 0x49, 0xaf, 0xe1, 0xfd, 0x69, 0xd8, 0x3a, 0xff, 0xfc, 0xe3,
-    0xe7, 0x7e, 0x8c, 0x7b, 0x4c, 0xe7, 0x4e, 0xbf, 0xf4, 0xee, 0x3a, 0xf7,
-    0x52, 0x34, 0x75, 0xff, 0x40, 0x34, 0x1f, 0xdf, 0x92, 0x3a, 0xf7, 0x35,
-    0xa3, 0xc4, 0x07, 0x7c, 0xd7, 0x76, 0x9a, 0x20, 0x35, 0x4d, 0x4d, 0xfd,
-    0xc8, 0xec, 0x7c, 0xc9, 0x22, 0x83, 0x8c, 0x54, 0xe9, 0x91, 0xfd, 0x86,
-    0xed, 0x01, 0x39, 0xff, 0x46, 0xeb, 0x7b, 0x64, 0x74, 0xea, 0xc5, 0x42,
-    0x49, 0x1e, 0x5f, 0xd2, 0xab, 0xdd, 0x76, 0x33, 0xaf, 0xa0, 0x1b, 0x78,
-    0x75, 0x00, 0xf0, 0x7c, 0x3d, 0x7c, 0x3e, 0x07, 0xe7, 0x5f, 0x96, 0xc4,
-    0xb1, 0x2c, 0x4b, 0x10, 0x75, 0xff, 0xfd, 0x2c, 0xd2, 0x73, 0x88, 0xbf,
-    0xbe, 0xee, 0x33, 0xe3, 0xab, 0x11, 0x76, 0x84, 0x4e, 0x79, 0x7f, 0xf9,
-    0x9c, 0x1f, 0x60, 0xcb, 0x35, 0xf5, 0x67, 0x5f, 0xfe, 0x96, 0x6f, 0x2f,
-    0xb0, 0x05, 0x59, 0x65, 0x92, 0xaf, 0xcb, 0x67, 0x13, 0x61, 0xd7, 0xa5,
-    0x83, 0x31, 0xfd, 0x7d, 0x51, 0xa8, 0x47, 0xcb, 0xc3, 0x12, 0xa1, 0x51,
-    0x4f, 0x61, 0xba, 0x31, 0x93, 0x5f, 0xf2, 0x0c, 0xb4, 0xc5, 0x58, 0x86,
-    0x25, 0x88, 0x3a, 0xfa, 0x6d, 0x64, 0xc7, 0x5f, 0x81, 0x1e, 0xc6, 0x33,
-    0xaf, 0xf4, 0x67, 0x1a, 0xee, 0xd3, 0x44, 0x13, 0x7f, 0xd1, 0xec, 0xe3,
-    0x5d, 0xda, 0x68, 0xbe, 0x6f, 0x0e, 0x68, 0x28, 0x80, 0x69, 0xed, 0x0a,
-    0x37, 0x36, 0x42, 0xa6, 0xff, 0xe8, 0xea, 0x29, 0x9c, 0x9d, 0x7f, 0xee,
-    0x75, 0x62, 0x6d, 0xe9, 0x0f, 0xfe, 0x94, 0xdf, 0xef, 0xfb, 0xb7, 0xd4,
-    0x6f, 0x4e, 0xbf, 0xf4, 0xef, 0xbe, 0xde, 0x78, 0x5f, 0x61, 0xd7, 0xff,
-    0xd9, 0xe8, 0x1f, 0x6b, 0x31, 0x45, 0x1e, 0x47, 0x5f, 0xfb, 0x03, 0x12,
-    0x8e, 0xe0, 0x1c, 0xeb, 0xf9, 0xe5, 0xfc, 0x9c, 0x27, 0x5e, 0x65, 0x96,
-    0x4a, 0xbf, 0x77, 0x1a, 0xfc, 0x29, 0x52, 0xfe, 0xff, 0xff, 0x4d, 0xc8,
-    0xd9, 0xf1, 0x47, 0xf9, 0xf6, 0x6d, 0x7c, 0xcd, 0xfc, 0x75, 0x79, 0x14,
-    0xbf, 0x4d, 0xaf, 0xff, 0x27, 0x13, 0xdf, 0xe7, 0x9d, 0x78, 0x27, 0x54,
-    0xea, 0x8a, 0x5a, 0x86, 0xb4, 0xe0, 0x1d, 0x8c, 0x3c, 0x7c, 0x4b, 0x7f,
-    0xe5, 0xc6, 0xfa, 0x1c, 0x9f, 0xec, 0x8e, 0xbf, 0xff, 0xc9, 0xd7, 0x1d,
-    0xe5, 0xf6, 0x50, 0x32, 0x75, 0xe0, 0x4e, 0xbf, 0xfd, 0x99, 0xd0, 0xf6,
-    0x35, 0x9d, 0x40, 0x1d, 0x7f, 0x94, 0xf9, 0x34, 0xa3, 0x9a, 0x3a, 0xa7,
-    0x4c, 0x7e, 0x48, 0x21, 0x60, 0x44, 0x7b, 0xf9, 0x8f, 0x25, 0xd8, 0xe1,
-    0xd7, 0xfb, 0xd0, 0x9d, 0x52, 0x37, 0x3a, 0xff, 0xf6, 0xe3, 0xf1, 0xbd,
-    0x40, 0x02, 0x39, 0x23, 0xaa, 0x11, 0x5c, 0x85, 0xff, 0x4c, 0xef, 0x98,
-    0xf5, 0x2d, 0x87, 0x5f, 0xfe, 0x89, 0xfe, 0xf6, 0x37, 0xf6, 0x4e, 0x21,
-    0x3a, 0x9c, 0xfd, 0x04, 0x9e, 0xff, 0x46, 0x0f, 0x98, 0xb6, 0x5a, 0x75,
-    0xfe, 0xee, 0x6c, 0xf9, 0xa9, 0x34, 0xeb, 0x7f, 0xa3, 0xee, 0xf1, 0xbd,
-    0xfe, 0x71, 0xf9, 0xf7, 0x9d, 0x73, 0xaf, 0xd9, 0xc7, 0xdd, 0x93, 0xaf,
-    0xff, 0xf4, 0xf8, 0xc8, 0xe0, 0x78, 0x9f, 0xce, 0x1e, 0xc0, 0xce, 0x75,
-    0x4e, 0x88, 0xbd, 0x14, 0x5e, 0x65, 0x96, 0x4a, 0xbf, 0xdf, 0x41, 0x03,
-    0x9b, 0xf8, 0xa5, 0x4b, 0xfb, 0xff, 0xf9, 0x83, 0xf1, 0xbd, 0x40, 0x87,
-    0x19, 0xf9, 0xed, 0x64, 0xe7, 0x57, 0x51, 0x53, 0xfa, 0x25, 0x22, 0x62,
-    0x0f, 0x0e, 0xca, 0x9d, 0x94, 0x17, 0x28, 0xef, 0x02, 0x68, 0x92, 0x98,
-    0x39, 0x1b, 0xea, 0xe1, 0xd9, 0xd8, 0x52, 0x0c, 0x23, 0xb4, 0x53, 0xe8,
-    0xf4, 0x2f, 0xfd, 0x88, 0x33, 0xb8, 0xfb, 0x16, 0x75, 0xff, 0xba, 0x8c,
-    0x87, 0xb9, 0xed, 0xbc, 0x3a, 0xf6, 0x08, 0x0e, 0xbe, 0xcf, 0x4d, 0x23,
-    0xaf, 0xfe, 0xda, 0x18, 0xda, 0xd3, 0x8f, 0xd0, 0x68, 0xea, 0xe9, 0xf6,
-    0x39, 0x15, 0xff, 0xb3, 0xd1, 0xcd, 0x76, 0x07, 0xc7, 0x88, 0x22, 0xfe,
-    0xce, 0x35, 0xdd, 0xa6, 0x88, 0x21, 0x53, 0xc9, 0xbd, 0x01, 0x43, 0xaa,
-    0x0f, 0x93, 0x49, 0x57, 0xf3, 0xf7, 0x9c, 0x46, 0x4e, 0xbf, 0x98, 0xc2,
-    0xcb, 0x8c, 0x8e, 0xa1, 0x3d, 0xdf, 0xcb, 0x6f, 0xff, 0xd0, 0x19, 0xa4,
-    0x83, 0xe8, 0x04, 0xc2, 0x93, 0x1d, 0x4a, 0x2a, 0x49, 0xec, 0x21, 0x81,
-    0x0c, 0xe1, 0x7e, 0xd8, 0x45, 0x7f, 0x77, 0x3d, 0xe4, 0x59, 0xd7, 0xf7,
-    0xbe, 0xe7, 0x5f, 0x73, 0xab, 0x73, 0xdb, 0x12, 0xcb, 0xff, 0xda, 0xd0,
-    0xbf, 0x9d, 0x7f, 0x62, 0x7c, 0x3a, 0xa0, 0xfb, 0x3f, 0x22, 0xbf, 0xb1,
-    0xbf, 0x76, 0x77, 0x0e, 0xba, 0x14, 0x3a, 0xf0, 0x50, 0x4e, 0xbc, 0x3f,
-    0xce, 0x75, 0xfb, 0xaf, 0x2c, 0x13, 0xaf, 0xe4, 0xf0, 0xe7, 0x50, 0xeb,
-    0xb3, 0xbf, 0x0f, 0x3e, 0x09, 0x6e, 0x76, 0x7e, 0x23, 0x2b, 0x05, 0xba,
-    0x35, 0xe6, 0xca, 0x92, 0x6c, 0xd8, 0x44, 0x30, 0xfa, 0xbf, 0xb4, 0x81,
-    0x0e, 0x09, 0xd7, 0xff, 0xf7, 0xbb, 0x9a, 0xd6, 0x67, 0xfc, 0x9f, 0x3f,
-    0x1f, 0x1d, 0x7f, 0xdd, 0x8e, 0x78, 0x63, 0x37, 0x3a, 0xff, 0xff, 0x92,
-    0x78, 0x96, 0xb9, 0xc4, 0xde, 0x69, 0x3f, 0x17, 0x9b, 0x9d, 0x7f, 0xa1,
-    0xe7, 0x7e, 0x3f, 0xd3, 0xaf, 0x77, 0x04, 0x28, 0xd3, 0xe9, 0xbf, 0x9a,
-    0x6b, 0x13, 0x9a, 0x42, 0xbf, 0x46, 0x5f, 0x7f, 0xe6, 0xf6, 0x33, 0x92,
-    0xd7, 0xeb, 0x3a, 0xe4, 0xd1, 0xd7, 0xfd, 0x93, 0xbf, 0x81, 0xf4, 0x64,
-    0x75, 0xfd, 0xf5, 0x7a, 0x65, 0xf7, 0x3a, 0xa1, 0x1e, 0x98, 0x6a, 0xa1,
-    0xff, 0x05, 0x7c, 0x75, 0x7b, 0x99, 0xd3, 0xaf, 0x69, 0x16, 0x75, 0xa3,
-    0x86, 0xdb, 0xc3, 0x77, 0xc9, 0x32, 0x32, 0x75, 0xff, 0xcb, 0x7d, 0xfe,
-    0xf9, 0x39, 0x1f, 0xb0, 0x4e, 0xbf, 0xff, 0x7f, 0x38, 0xc6, 0x75, 0x58,
-    0xf6, 0x77, 0xfe, 0x1d, 0x7d, 0xed, 0x7d, 0xd0, 0x51, 0x89, 0x84, 0x5f,
-    0x52, 0xef, 0xda, 0x5e, 0x7b, 0x47, 0x5f, 0xfc, 0x8a, 0x67, 0x93, 0xb9,
-    0xe8, 0xe1, 0xd7, 0xe7, 0x90, 0xa4, 0x1d, 0x7f, 0x43, 0x8f, 0xb0, 0x4e,
-    0xa9, 0x27, 0xd7, 0x90, 0xea, 0x44, 0xbe, 0x13, 0xad, 0x08, 0x49, 0x2f,
-    0xe6, 0xf5, 0x36, 0xd1, 0x43, 0xaf, 0xff, 0x20, 0x23, 0x4b, 0x84, 0xe7,
-    0x11, 0x93, 0xaf, 0x98, 0xfb, 0x93, 0x9d, 0x7f, 0xa0, 0x39, 0xe4, 0xef,
-    0xe7, 0x59, 0x70, 0x7a, 0xe1, 0x25, 0xbf, 0xff, 0xf2, 0xdc, 0x41, 0x24,
-    0xd7, 0xeb, 0xea, 0x47, 0xbb, 0xfb, 0xac, 0xeb, 0xff, 0xe1, 0xff, 0xd2,
-    0x40, 0x75, 0xd3, 0xce, 0xb3, 0xae, 0xf8, 0xc6, 0x75, 0xff, 0xf9, 0xd3,
-    0xc8, 0x1c, 0x0e, 0x79, 0x16, 0x9c, 0x3a, 0xf7, 0x1f, 0x58, 0x8b, 0xae,
-    0x27, 0x74, 0x6e, 0xe4, 0xf3, 0xa6, 0xcd, 0xfc, 0x64, 0xd7, 0x4a, 0x0e,
-    0xbf, 0xfd, 0x38, 0x7b, 0x1d, 0xcd, 0xc1, 0x9e, 0xd1, 0xd4, 0xe7, 0xc1,
-    0xf8, 0xad, 0x05, 0x58, 0x9e, 0x18, 0x24, 0x27, 0xde, 0x38, 0xd1, 0x84,
-    0xad, 0xfd, 0xc8, 0x9d, 0x07, 0xc7, 0x5e, 0x0f, 0xd5, 0x9d, 0x7e, 0x18,
-    0x0e, 0x4c, 0x75, 0xf6, 0xbf, 0xe2, 0x87, 0x5f, 0xa3, 0xbe, 0x89, 0x1d,
-    0x7c, 0x1f, 0xfd, 0xa8, 0x3f, 0x0d, 0xc9, 0x80, 0x49, 0x7e, 0x06, 0x2e,
-    0x3a, 0x75, 0xfd, 0xfc, 0x7c, 0xe0, 0xc8, 0xeb, 0xcc, 0x1e, 0xe1, 0xd4,
-    0x14, 0xdd, 0xb0, 0xb1, 0x21, 0x1c, 0x29, 0x1e, 0x26, 0xfc, 0xbe, 0xf7,
-    0x3e, 0xe8, 0xeb, 0xa1, 0x87, 0x9d, 0x7f, 0xe7, 0x16, 0xe7, 0x1a, 0xee,
-    0xd3, 0x44, 0x23, 0x74, 0xa7, 0x3a, 0xa1, 0x13, 0x00, 0x1e, 0xfc, 0x6f,
-    0x62, 0x45, 0xff, 0xff, 0xee, 0xe7, 0xfc, 0x53, 0xa9, 0xbc, 0x7b, 0xfe,
-    0x8e, 0x6f, 0xef, 0xdf, 0x47, 0x5f, 0xfd, 0x9b, 0xfd, 0xf2, 0x0f, 0xf2,
-    0xcd, 0x1d, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xc1, 0x9c, 0x5c, 0x30,
-    0x33, 0xc7, 0x03, 0x83, 0x9e, 0xd2, 0x37, 0x07, 0xec, 0xf9, 0xc8, 0xd0,
-    0xba, 0x9a, 0xc4, 0x00, 0x3f, 0x00, 0xb8, 0x60, 0x67, 0x8e, 0x1d, 0x50,
-    0x9a, 0x76, 0x23, 0x5f, 0xfd, 0xe7, 0x19, 0xf7, 0x90, 0xc6, 0x68, 0xeb,
-    0xff, 0x7d, 0xce, 0xba, 0xd5, 0x65, 0x96, 0x4e, 0xbf, 0xff, 0x63, 0x7b,
-    0x02, 0x11, 0x49, 0xf0, 0x51, 0x43, 0xae, 0x77, 0x9d, 0x12, 0xd2, 0x44,
-    0xbf, 0xff, 0xa6, 0x18, 0x06, 0x9b, 0xd4, 0xe4, 0xc3, 0x00, 0xd1, 0xd7,
-    0xff, 0x7b, 0xa9, 0xb3, 0xaf, 0x2e, 0x42, 0x87, 0x5f, 0xdf, 0xf9, 0x3f,
-    0x15, 0x0e, 0xbf, 0xb1, 0x9c, 0x1f, 0xc0, 0x75, 0xfa, 0x59, 0xe8, 0x01,
-    0xd7, 0x42, 0xe7, 0x3d, 0x3d, 0xcb, 0x6f, 0xff, 0xfe, 0x02, 0xde, 0x5d,
-    0x74, 0xf2, 0x07, 0x03, 0x9e, 0x45, 0xa7, 0x0e, 0xad, 0x22, 0x77, 0xf2,
-    0xfb, 0xf4, 0xeb, 0x80, 0xc1, 0xd5, 0x25, 0xcf, 0xe0, 0xc7, 0x95, 0xb9,
-    0x14, 0xd0, 0xd9, 0xe1, 0x77, 0x56, 0xf4, 0x8d, 0xe8, 0xc7, 0xfe, 0x92,
-    0x5f, 0xe8, 0xd6, 0xa2, 0x7c, 0x64, 0xeb, 0xfd, 0xdc, 0x5e, 0x77, 0xf1,
-    0x3a, 0x82, 0x7c, 0xbe, 0x33, 0xbe, 0xce, 0x28, 0x87, 0x56, 0x26, 0x7c,
-    0xf0, 0xfb, 0xfc, 0x8a, 0xf3, 0x2c, 0xb2, 0x55, 0xff, 0x60, 0x1f, 0x99,
-    0xb3, 0x02, 0x52, 0xa5, 0xfd, 0xcc, 0xb2, 0x55, 0xe6, 0x59, 0x64, 0xab,
-    0xf9, 0xe7, 0x0f, 0x63, 0x45, 0x2a, 0x5f, 0xd0, 0xa2, 0xf1, 0x94, 0x8d,
-    0xb3, 0x7b, 0xf3, 0x50, 0x3f, 0x56, 0x52, 0xa6, 0xce, 0xf3, 0x2c, 0xb2,
-    0x55, 0xed, 0x47, 0x0a, 0x54, 0xbf, 0xbe, 0x71, 0xdf, 0xc7, 0x58, 0x08,
-    0x8a, 0x5f, 0x2c, 0xb2, 0x57, 0x7f, 0x04, 0x62, 0x4e, 0xd3, 0xaf, 0xda,
-    0xfe, 0x7d, 0xb1, 0x3a, 0xfc, 0x14, 0xd9, 0x01, 0x3a, 0xfb, 0x07, 0x18,
-    0xce, 0xae, 0x1e, 0x52, 0xca, 0x29, 0x11, 0x31, 0xf5, 0xda, 0xff, 0xee,
-    0xbc, 0x85, 0xd4, 0x98, 0x52, 0x63, 0xaf, 0xfe, 0xce, 0x4f, 0x1b, 0xe9,
-    0x07, 0x00, 0x75, 0xfd, 0xdc, 0xd9, 0x9e, 0xd1, 0xd4, 0xd4, 0x5a, 0x81,
-    0x13, 0xc8, 0x75, 0xc4, 0xf3, 0x3b, 0x0c, 0x31, 0x86, 0xcd, 0xd3, 0xf8,
-    0xea, 0x85, 0x4a, 0x79, 0x28, 0x08, 0x4e, 0xaf, 0x6e, 0xc5, 0x58, 0x83,
-    0xaf, 0xff, 0x63, 0x1b, 0x88, 0x31, 0xb1, 0xd8, 0x59, 0xd7, 0xda, 0xea,
-    0x4c, 0x55, 0xff, 0x3e, 0xfe, 0xc9, 0xbf, 0xe2, 0x87, 0x59, 0xa8, 0x7b,
-    0xdf, 0x91, 0x5f, 0xe1, 0xcd, 0xe5, 0xa4, 0x50, 0xeb, 0xe7, 0x7e, 0x28,
-    0x75, 0x7c, 0x3d, 0x49, 0xcc, 0xef, 0xfb, 0x31, 0xa0, 0x8c, 0xde, 0x47,
-    0x5f, 0x43, 0xaf, 0x61, 0x57, 0xff, 0x75, 0x1c, 0x00, 0x80, 0x47, 0x74,
-    0x75, 0xfd, 0xdc, 0x5a, 0xde, 0x47, 0x5e, 0x65, 0x96, 0x4a, 0xbf, 0xc3,
-    0xee, 0xa4, 0x0c, 0xe5, 0x2a, 0x5f, 0xde, 0x80, 0x64, 0x91, 0x19, 0x89,
-    0x75, 0xe4, 0xc0, 0x3e, 0xc3, 0x3a, 0xd8, 0xd4, 0xd3, 0x57, 0x19, 0x15,
-    0xfe, 0x8f, 0xbc, 0xe2, 0x7b, 0x47, 0x54, 0x2b, 0x57, 0x91, 0x46, 0xf0,
-    0xa7, 0x47, 0xc9, 0x89, 0x7b, 0x1c, 0x20, 0x97, 0xdf, 0x81, 0x89, 0xd5,
-    0x0e, 0xbf, 0xfe, 0xc6, 0xc0, 0xbf, 0xb4, 0x1f, 0xdf, 0x92, 0x3a, 0xb7,
-    0x3f, 0x55, 0x93, 0xdf, 0xff, 0xfc, 0x2e, 0xb8, 0xe3, 0x43, 0xd8, 0xd7,
-    0xee, 0x92, 0xd7, 0x5e, 0x47, 0x5e, 0x6c, 0x68, 0xeb, 0xff, 0xbe, 0xcb,
-    0x3a, 0xfd, 0x4e, 0x72, 0x0e, 0xac, 0x3d, 0xf0, 0x0d, 0xdf, 0xa3, 0xda,
-    0xd9, 0x87, 0x5f, 0xbf, 0xe2, 0x9d, 0x43, 0xaa, 0x13, 0x64, 0x72, 0x31,
-    0x86, 0x7f, 0x88, 0x76, 0xca, 0x2f, 0xf0, 0xbb, 0x38, 0x2e, 0xa1, 0xd7,
-    0xff, 0x67, 0xb5, 0xf7, 0x4b, 0x18, 0xe4, 0x1d, 0x7c, 0x9b, 0x30, 0x42,
-    0x7e, 0xab, 0x31, 0xbf, 0xff, 0xe0, 0xf5, 0x19, 0xcd, 0xa4, 0x5b, 0xfb,
-    0x5f, 0xcb, 0x37, 0xf1, 0xd5, 0x88, 0xa4, 0x73, 0x9b, 0xfe, 0x99, 0xbd,
-    0x45, 0xc7, 0x14, 0x3a, 0xfd, 0x3f, 0xcf, 0xe2, 0x63, 0xad, 0x23, 0xaf,
-    0x7d, 0x19, 0x8e, 0xa9, 0x1a, 0xe0, 0x08, 0x56, 0x22, 0xd5, 0xce, 0xb4,
-    0xb5, 0x50, 0xed, 0x6f, 0xe7, 0x94, 0x7f, 0x29, 0x48, 0xa1, 0x95, 0x45,
-    0x94, 0xa4, 0x65, 0x21, 0x6c, 0xd3, 0xb4, 0x95, 0x15, 0x34, 0xa8, 0x5e,
-    0x4a, 0xc2, 0x5c, 0xa6, 0xae, 0xcb, 0x6d, 0x78, 0xf3, 0x81, 0x0f, 0x31,
-    0x9e, 0x7b, 0xd4, 0xe1, 0xdf, 0xa5, 0xc6, 0xff, 0x29, 0x25, 0x98, 0xda,
-    0x7e, 0xc3, 0x5a, 0xf6, 0xc8, 0x13, 0xaf, 0xff, 0xb0, 0x55, 0xf2, 0x89,
-    0xbe, 0xbb, 0x80, 0x73, 0xaa, 0x47, 0xd8, 0x11, 0xcb, 0xfc, 0xe2, 0xdc,
-    0xf7, 0x50, 0xeb, 0xff, 0xff, 0xf9, 0x39, 0x34, 0x77, 0x99, 0xd7, 0xfb,
-    0xac, 0x51, 0xc4, 0x10, 0x31, 0x37, 0x60, 0xea, 0xdd, 0x1b, 0x4b, 0x22,
-    0xfa, 0x61, 0x66, 0x1e, 0x75, 0xff, 0x9c, 0x41, 0xf0, 0x3f, 0xbf, 0x24,
-    0x75, 0xf2, 0x0c, 0xf0, 0x75, 0xff, 0xe4, 0x0c, 0xc3, 0x0b, 0x41, 0xc5,
-    0xc1, 0xd4, 0xc6, 0x8a, 0x6e, 0x20, 0x09, 0x05, 0x31, 0x44, 0x77, 0x64,
-    0x2f, 0x2f, 0x40, 0xce, 0x75, 0xf2, 0x75, 0x16, 0x75, 0xba, 0x86, 0xee,
-    0x61, 0xbb, 0xfa, 0x1b, 0x1a, 0xf2, 0x1d, 0x7f, 0xd1, 0xee, 0xb8, 0x1f,
-    0x7d, 0x1d, 0x41, 0x3e, 0x31, 0x2b, 0xbf, 0xf7, 0x01, 0xf3, 0xa8, 0xdf,
-    0xf8, 0x03, 0xaf, 0x4d, 0xff, 0x0e, 0xbf, 0xf3, 0xa7, 0x33, 0x75, 0x59,
-    0x65, 0x93, 0xaa, 0x11, 0x44, 0xe8, 0x5a, 0x1e, 0xbf, 0xfe, 0x18, 0x97,
-    0xcf, 0xbe, 0x41, 0xfe, 0x59, 0xa3, 0xab, 0x13, 0xcd, 0x6c, 0x22, 0xbb,
-    0x0c, 0x30, 0x17, 0x5e, 0x03, 0xac, 0xeb, 0xb0, 0x07, 0x5e, 0x19, 0x0c,
-    0x1b, 0x0c, 0x1b, 0xbe, 0xd3, 0x5a, 0x87, 0x54, 0x1e, 0x83, 0x97, 0xdf,
-    0xb9, 0xa1, 0x89, 0xce, 0xbf, 0xfe, 0x67, 0x1b, 0xac, 0xf4, 0xd8, 0xa0,
-    0xe0, 0x0e, 0xac, 0x3f, 0x74, 0x27, 0xbf, 0x9f, 0xdd, 0x71, 0x01, 0xd7,
-    0xfe, 0x7f, 0x64, 0xcf, 0x03, 0x13, 0x1d, 0x7f, 0xee, 0xa6, 0x7d, 0xc9,
-    0x99, 0x8d, 0xce, 0xb2, 0x71, 0x15, 0x1d, 0x2b, 0xd1, 0xe5, 0xcd, 0x69,
-    0xa3, 0x04, 0xa9, 0x26, 0x40, 0xd8, 0x64, 0x00, 0xd6, 0xec, 0x13, 0xaf,
-    0xff, 0x7a, 0x05, 0xb9, 0xee, 0xa7, 0x00, 0xd3, 0xa8, 0x27, 0xb9, 0x82,
-    0x97, 0xfa, 0x17, 0xad, 0x38, 0xce, 0x75, 0xff, 0x03, 0x52, 0x4e, 0xba,
-    0x4e, 0x75, 0xf6, 0xb0, 0x7c, 0x75, 0xed, 0xa8, 0xe1, 0xd4, 0x87, 0xec,
-    0xe7, 0x1f, 0x90, 0x5e, 0xf3, 0xb1, 0x9d, 0x7f, 0xbd, 0xd4, 0x54, 0x0e,
-    0x87, 0x50, 0x53, 0x47, 0xe9, 0x08, 0xc2, 0xa3, 0xc5, 0xdf, 0x8f, 0x5f,
-    0x75, 0x1e, 0x47, 0x5e, 0x0b, 0xc8, 0xeb, 0xbf, 0x04, 0x1b, 0xbc, 0x20,
-    0xbf, 0xe6, 0xe7, 0xa3, 0x62, 0x08, 0x0e, 0xbf, 0xff, 0xbf, 0x8f, 0x6b,
-    0x07, 0xe7, 0x21, 0x02, 0x2f, 0x23, 0xaf, 0xcd, 0xee, 0xee, 0xc6, 0x75,
-    0xff, 0xc8, 0x11, 0xff, 0xda, 0x81, 0x8d, 0x1d, 0x48, 0x8f, 0xf1, 0x38,
-    0xfd, 0x6b, 0x61, 0x5d, 0xff, 0xc0, 0x7e, 0x66, 0xcc, 0x0f, 0x05, 0x93,
-    0xaf, 0xff, 0xe1, 0xcd, 0x7f, 0xf3, 0x3a, 0xe3, 0x93, 0x4a, 0x37, 0x3a,
-    0xfd, 0xc6, 0xbb, 0xb4, 0xd1, 0x03, 0x5f, 0xcf, 0x38, 0x1c, 0x42, 0x4a,
-    0xc1, 0xf7, 0xb3, 0x5f, 0xe1, 0xf6, 0xed, 0x99, 0xde, 0xeb, 0xcb, 0xe2,
-    0x3f, 0xc6, 0x19, 0x37, 0xfd, 0xd4, 0xc1, 0xc6, 0x87, 0x0e, 0xa5, 0xa7,
-    0x67, 0xe8, 0xd1, 0x36, 0x1d, 0x5e, 0xf7, 0xf0, 0x75, 0xfe, 0x07, 0x92,
-    0x75, 0xc3, 0x4e, 0xad, 0xcf, 0x3c, 0x47, 0x2f, 0xc1, 0x60, 0x38, 0x58,
-    0x07, 0x54, 0x2a, 0xca, 0xc8, 0xfc, 0x52, 0x11, 0x0e, 0x45, 0x7f, 0xb3,
-    0x7f, 0x07, 0x31, 0x43, 0xaf, 0xec, 0xf4, 0x0a, 0x00, 0xeb, 0xfe, 0x0f,
-    0x05, 0xd9, 0xfb, 0xbb, 0x27, 0x5e, 0x7e, 0x4e, 0x68, 0xc1, 0x6f, 0xfc,
-    0xfc, 0xc1, 0x06, 0xbd, 0xad, 0xce, 0xbf, 0xff, 0xff, 0xb3, 0xdd, 0x71,
-    0x53, 0xe6, 0xb8, 0xef, 0xed, 0x98, 0x1f, 0x98, 0xb7, 0x1d, 0xe4, 0x78,
-    0x82, 0xef, 0xfc, 0xee, 0xa3, 0x5c, 0x3f, 0x14, 0x64, 0xf1, 0x05, 0xdf,
-    0xfd, 0xd4, 0xea, 0x40, 0xfb, 0xe2, 0x8c, 0x9e, 0x20, 0xbb, 0xfd, 0x08,
-    0x3e, 0xf8, 0xa3, 0x27, 0x88, 0x2e, 0xfe, 0x5e, 0x07, 0xe2, 0x8c, 0x9e,
-    0x20, 0xbb, 0xff, 0xfe, 0x71, 0x14, 0x5f, 0xcd, 0x37, 0xa9, 0xc4, 0x52,
-    0x7c, 0x64, 0xf1, 0x05, 0xdd, 0xbf, 0xc0, 0xa7, 0x2e, 0xd4, 0xfe, 0x29,
-    0xba, 0x10, 0x9f, 0x54, 0x2a, 0xc7, 0xe9, 0xf0, 0xca, 0x31, 0xbf, 0xc9,
-    0x0a, 0x6b, 0xda, 0xdc, 0xeb, 0xe7, 0xe0, 0x1c, 0xeb, 0xff, 0xba, 0x9d,
-    0x48, 0x1f, 0x7c, 0x51, 0x93, 0xc4, 0x17, 0x7f, 0xd3, 0x69, 0xa9, 0x3f,
-    0xc5, 0x19, 0x3c, 0x41, 0x77, 0xef, 0x6a, 0x17, 0xf1, 0xa8, 0x9f, 0xfa,
-    0xa7, 0x7f, 0xfb, 0xe3, 0x7a, 0x8d, 0x8f, 0x6b, 0xe2, 0x8c, 0x9e, 0x20,
-    0xbb, 0xff, 0xff, 0x84, 0x51, 0x7f, 0x3f, 0xcf, 0x9a, 0x6f, 0x53, 0x88,
-    0xa4, 0xf8, 0xc9, 0xe2, 0x0b, 0xac, 0x4c, 0x97, 0x74, 0x47, 0x5d, 0xbf,
-    0xee, 0xa7, 0x11, 0x49, 0xf1, 0x93, 0xc4, 0x17, 0x7f, 0xfc, 0xef, 0xbc,
-    0xb5, 0xd4, 0x08, 0x63, 0x90, 0x55, 0xff, 0xb2, 0x52, 0xff, 0x5c, 0x19,
-    0xf6, 0xcf, 0x10, 0x5d, 0x35, 0x1c, 0xbc, 0x47, 0xd2, 0x75, 0xff, 0x9a,
-    0x9c, 0xf3, 0x83, 0x5f, 0x19, 0x3c, 0x41, 0x77, 0xf7, 0x53, 0xbd, 0x40,
-    0x1a, 0x00, 0xbb, 0xf6, 0x03, 0xe2, 0x8c, 0x9e, 0x20, 0xbb, 0xb3, 0xcd,
-    0x3f, 0x1e, 0x9c, 0xd6, 0xe8, 0xec, 0xd4, 0x2f, 0xef, 0xe5, 0xe0, 0x7e,
-    0x28, 0xc9, 0xe2, 0x0b, 0xbf, 0xf3, 0x7a, 0x9c, 0x45, 0x27, 0xc6, 0x4f,
-    0x10, 0x5d, 0xd9, 0xf1, 0xd1, 0x17, 0xa3, 0xeb, 0xfd, 0xfa, 0x2d, 0xc7,
-    0x79, 0x1e, 0x20, 0xbb, 0xff, 0x62, 0x6c, 0xc1, 0xc0, 0xbc, 0x8f, 0x10,
-    0x5a, 0xcf, 0x02, 0x82, 0xbb, 0xfb, 0xc3, 0x70, 0x1a, 0x0c, 0x7c, 0x9a,
-    0x8c, 0x57, 0xd1, 0x8e, 0x7f, 0x0b, 0x46, 0x5b, 0xee, 0x04, 0x1a, 0x20,
-    0xb5, 0x51, 0x19, 0x73, 0xb4, 0xeb, 0x69, 0xac, 0x9c, 0x30, 0x52, 0x5e,
-    0x7c, 0x6b, 0x74, 0xb6, 0x8e, 0xbd, 0x12, 0xda, 0x3a, 0xa0, 0xdb, 0x88,
-    0xcd, 0x4e, 0xca, 0xf6, 0x09, 0x9e, 0xe5, 0x40, 0xa5, 0x00, 0x0b, 0xd5,
-    0xff, 0xd9, 0x21, 0xcf, 0x75, 0x33, 0x7f, 0x1d, 0x7e, 0x8f, 0x6b, 0xa8,
-    0x75, 0xff, 0xb5, 0x34, 0xbf, 0x0c, 0xd2, 0xfc, 0x27, 0x54, 0x8f, 0xab,
-    0xc4, 0xd7, 0xff, 0x46, 0xf2, 0xfa, 0xbd, 0x7a, 0x37, 0x64, 0xeb, 0xf4,
-    0xb6, 0xb6, 0xbf, 0x9c, 0xeb, 0x75, 0x0f, 0xe5, 0xd2, 0x6f, 0xdc, 0x8d,
-    0xe5, 0xa3, 0xaa, 0x47, 0x9d, 0xc2, 0x6b, 0xff, 0x81, 0xfe, 0xb6, 0xf3,
-    0x80, 0x5a, 0x68, 0xeb, 0xfc, 0x0f, 0xfc, 0x31, 0xed, 0x1d, 0x40, 0x3f,
-    0xbd, 0x24, 0x54, 0x27, 0x51, 0x90, 0xe9, 0x78, 0x4e, 0xdf, 0xcf, 0x28,
-    0xd8, 0xfd, 0x3a, 0xff, 0xf4, 0xf9, 0xbf, 0xb4, 0x83, 0x00, 0x75, 0x9d,
-    0x7d, 0xbe, 0xa3, 0x73, 0xaf, 0x2e, 0x24, 0x75, 0xfb, 0x03, 0xdf, 0xd9,
-    0x3a, 0xbe, 0x1f, 0x3b, 0x91, 0x88, 0xdd, 0xe0, 0xbf, 0x8e, 0xae, 0x1e,
-    0x53, 0x97, 0xde, 0x4d, 0xbc, 0x3a, 0xf3, 0xf0, 0x07, 0x5b, 0x78, 0x37,
-    0x1e, 0x1d, 0xbe, 0x67, 0x3a, 0xe7, 0x5f, 0x29, 0xc4, 0x64, 0xeb, 0xf4,
-    0xef, 0xd8, 0x63, 0x3a, 0x98, 0x83, 0xcd, 0xc2, 0x3a, 0x85, 0x47, 0x78,
-    0x5a, 0x90, 0xfa, 0x75, 0x90, 0x13, 0x8b, 0x75, 0xff, 0xe1, 0x18, 0x9d,
-    0x7d, 0x4e, 0x71, 0xe4, 0x75, 0xfe, 0x9e, 0x78, 0x1d, 0xf3, 0xc7, 0x56,
-    0x1f, 0xe2, 0x24, 0x5f, 0xfd, 0xc1, 0xff, 0x7f, 0x0e, 0x4e, 0xe2, 0x75,
-    0xe7, 0xe4, 0xe7, 0x5c, 0x08, 0x3a, 0xf9, 0x21, 0x78, 0x75, 0x1d, 0x7f,
-    0x3a, 0x9e, 0x8e, 0x00, 0xea, 0x09, 0xb7, 0x10, 0xab, 0xff, 0xfd, 0x08,
-    0x11, 0x8f, 0xdb, 0xec, 0x68, 0x61, 0xbf, 0x56, 0x75, 0xc0, 0x83, 0xae,
-    0x85, 0x0e, 0xbf, 0xec, 0xf6, 0xa1, 0x7f, 0x72, 0x63, 0xaf, 0xf6, 0xb3,
-    0xa9, 0xaf, 0xe7, 0x3a, 0xe6, 0x59, 0x2a, 0xff, 0x87, 0x36, 0x3c, 0xb4,
-    0x81, 0x3a, 0x9a, 0x9f, 0x8a, 0x0e, 0x70, 0x55, 0x6a, 0xdd, 0x20, 0x03,
-    0x0b, 0x04, 0x54, 0x45, 0xb4, 0x74, 0xc9, 0xa7, 0xd1, 0x8b, 0xcc, 0xb2,
-    0xc9, 0x56, 0x59, 0x4a, 0x97, 0xf7, 0xd3, 0x3b, 0xf0, 0xa5, 0x51, 0xbb,
-    0xf6, 0x17, 0xb5, 0x3a, 0xb5, 0xa7, 0x96, 0x25, 0x7f, 0x7a, 0x33, 0xb9,
-    0x39, 0xd7, 0x62, 0xce, 0xad, 0xcf, 0x07, 0x45, 0x95, 0x0e, 0x85, 0x9e,
-    0x51, 0x90, 0xe4, 0xa3, 0x55, 0x21, 0x8f, 0xbc, 0x76, 0xe9, 0x1e, 0xcf,
-    0x21, 0x17, 0xd9, 0x7e, 0xaf, 0x4b, 0x3c, 0x02, 0xc0, 0xca, 0x54, 0xd4,
-    0xa7, 0x3f, 0x43, 0x57, 0xf9, 0x6f, 0x5b, 0x1b, 0x6f, 0xec, 0x00, 0x13,
-    0x92, 0x3a, 0xe6, 0xe1, 0xd4, 0x13, 0xc1, 0x72, 0xcb, 0xb1, 0x93, 0xae,
-    0x8f, 0x1d, 0x53, 0x9a, 0xb6, 0x8b, 0x59, 0x67, 0x56, 0x1b, 0x2f, 0x11,
-    0x5f, 0xe9, 0x20, 0xe2, 0xff, 0xe9, 0xd7, 0xfe, 0xcf, 0x6b, 0xa8, 0xb7,
-    0xce, 0x1d, 0x50, 0x7d, 0xc2, 0x65, 0x7d, 0xf3, 0xd1, 0xb0, 0xeb, 0xec,
-    0x5e, 0x78, 0xeb, 0xde, 0x75, 0x0e, 0xbf, 0xff, 0xf9, 0xaf, 0x37, 0xf2,
-    0xfd, 0xbf, 0x3a, 0x9e, 0xf4, 0x6f, 0x13, 0xc6, 0x8e, 0xbf, 0xff, 0xe6,
-    0x31, 0x77, 0xd9, 0x12, 0xec, 0x72, 0x78, 0xf6, 0x9e, 0x47, 0x5e, 0x4d,
-    0xe6, 0x3a, 0xfd, 0x99, 0x3f, 0xfa, 0x3a, 0xfb, 0x82, 0x80, 0x3a, 0xf9,
-    0x1a, 0xfc, 0x3a, 0xe8, 0x01, 0xd7, 0xdf, 0xcf, 0xfa, 0xbd, 0x36, 0xbf,
-    0x48, 0x29, 0x11, 0x29, 0xd5, 0x5b, 0xfe, 0xeb, 0xeb, 0xa9, 0x3b, 0x89,
-    0xd7, 0xcf, 0x3f, 0xd9, 0x1d, 0x4c, 0x25, 0x78, 0x90, 0xfd, 0x28, 0x47,
-    0x61, 0x06, 0xe4, 0xa8, 0x41, 0xc1, 0xc7, 0x78, 0x03, 0x4e, 0x87, 0x7d,
-    0x0b, 0xcf, 0xa4, 0x5b, 0x46, 0xf7, 0xf0, 0xfe, 0x15, 0xbc, 0x8e, 0xbc,
-    0x93, 0xfe, 0x75, 0xfa, 0x00, 0x9b, 0xe1, 0xd7, 0x2f, 0x61, 0xd6, 0x0c,
-    0x1b, 0xe1, 0x26, 0xbf, 0xfd, 0x21, 0x8f, 0x8b, 0x18, 0x53, 0xc9, 0x39,
-    0xd7, 0xe7, 0x5e, 0x75, 0x67, 0x56, 0xe7, 0xe3, 0xe4, 0xbb, 0xde, 0xe4,
-    0x1d, 0x7f, 0xb5, 0xed, 0x98, 0x38, 0x13, 0xaf, 0xb3, 0xb1, 0xb0, 0xea,
-    0x84, 0xec, 0x64, 0x5b, 0x8b, 0x69, 0x09, 0x65, 0x91, 0xb8, 0xdf, 0x8c,
-    0xef, 0x3f, 0xcf, 0xa7, 0x5f, 0x2d, 0x70, 0xb3, 0xaf, 0xff, 0x86, 0x5f,
-    0x30, 0x29, 0xad, 0xfd, 0xfb, 0xe8, 0xeb, 0xf7, 0x7f, 0x18, 0xd8, 0x75,
-    0xfc, 0x2f, 0xe9, 0x42, 0x87, 0x54, 0x1e, 0xaf, 0xd2, 0x9b, 0xec, 0xcd,
-    0xe4, 0x75, 0xed, 0x24, 0xc7, 0x59, 0x41, 0x37, 0xba, 0x21, 0xbf, 0xf9,
-    0xe7, 0x18, 0xdd, 0x02, 0x31, 0x39, 0xd5, 0xc3, 0xea, 0x12, 0x7b, 0xf7,
-    0xce, 0xc7, 0x24, 0x75, 0x7c, 0x4f, 0xee, 0x07, 0xf0, 0x85, 0xb0, 0xa7,
-    0x78, 0x65, 0x32, 0x43, 0x79, 0x7a, 0x83, 0xaf, 0xe9, 0xe6, 0x93, 0x0b,
-    0x93, 0x9d, 0x7c, 0xbc, 0x7e, 0x9d, 0x74, 0xa7, 0x3a, 0xf7, 0x42, 0x87,
-    0x5f, 0xbb, 0x89, 0x2d, 0x1d, 0x7f, 0xfd, 0xd8, 0xfa, 0xaf, 0x85, 0xc1,
-    0xad, 0x40, 0x0a, 0xbf, 0x71, 0xae, 0xed, 0x3c, 0x40, 0x97, 0xb5, 0x1b,
-    0x9d, 0x60, 0x61, 0xe7, 0xee, 0x67, 0x7b, 0xc9, 0x39, 0xd7, 0xa7, 0x71,
-    0x3a, 0xa4, 0x99, 0x28, 0x49, 0xb9, 0x0a, 0x05, 0x94, 0x78, 0x72, 0xfe,
-    0x16, 0xba, 0x9d, 0x43, 0xae, 0xda, 0x91, 0xd7, 0xde, 0x9d, 0xc4, 0xeb,
-    0xc2, 0xea, 0x1d, 0x79, 0x44, 0xf1, 0xd7, 0xb4, 0xfe, 0x3a, 0x94, 0x36,
-    0xfb, 0x8e, 0x5d, 0xf3, 0xa7, 0x5f, 0xcb, 0xf2, 0x07, 0xf8, 0x3a, 0xf2,
-    0xfc, 0xd3, 0xad, 0xe8, 0x3c, 0x9c, 0x2d, 0xa9, 0xd3, 0x36, 0xc1, 0x96,
-    0x90, 0xf5, 0x48, 0x04, 0x62, 0xc3, 0x77, 0x3f, 0x3a, 0xff, 0x0b, 0xb3,
-    0xad, 0x40, 0x0e, 0xbd, 0xb6, 0xea, 0x1d, 0x7f, 0xd0, 0xb9, 0x64, 0xf9,
-    0xfb, 0x04, 0xeb, 0xe7, 0xf3, 0x06, 0x73, 0xab, 0x11, 0x04, 0x83, 0xee,
-    0x7b, 0x79, 0x96, 0x59, 0x3d, 0x5f, 0x57, 0x9c, 0x42, 0x5a, 0xbe, 0xaa,
-    0x9a, 0xcb, 0xe9, 0x7f, 0x0a, 0x1d, 0x60, 0x1d, 0x58, 0x6c, 0xdc, 0x8e,
-    0xa1, 0x3a, 0xf0, 0x8b, 0xf2, 0x16, 0x80, 0x59, 0xf3, 0x65, 0xff, 0xfb,
-    0x05, 0x14, 0x57, 0x5e, 0xef, 0xef, 0x29, 0x41, 0xd5, 0x3a, 0x29, 0x54,
-    0x4f, 0xbe, 0xc0, 0xbc, 0x8e, 0xbf, 0x38, 0x8a, 0x2c, 0xeb, 0xfe, 0xea,
-    0x73, 0x11, 0x70, 0xc6, 0x75, 0xf9, 0x16, 0xe3, 0x87, 0x57, 0xc5, 0xee,
-    0xa6, 0x24, 0x6e, 0x0d, 0x64, 0x40, 0x11, 0x7c, 0x8d, 0x01, 0x45, 0x04,
-    0x8d, 0x89, 0xe5, 0x55, 0x80, 0x94, 0x48, 0x3f, 0x24, 0xdb, 0x39, 0xbf,
-    0x27, 0xa3, 0xda, 0x2a, 0xf9, 0xb1, 0xed, 0x15, 0x73, 0x2c, 0x95, 0x52,
-    0x3d, 0xfc, 0x26, 0x64, 0x86, 0xec, 0x64, 0xa5, 0x4d, 0x7d, 0xff, 0xf7,
-    0xa1, 0xb9, 0x83, 0xee, 0xa4, 0x0c, 0xe7, 0x51, 0xd5, 0x87, 0xad, 0xa4,
-    0xca, 0x02, 0x27, 0x99, 0x7d, 0xbf, 0xf7, 0xb5, 0x8d, 0xeb, 0x8f, 0xb4,
-    0x75, 0xfa, 0x36, 0x20, 0x80, 0xef, 0x86, 0xf6, 0xfd, 0x2e, 0xff, 0x1c,
-    0x3a, 0xff, 0xe7, 0x5f, 0x23, 0x62, 0x6c, 0x1f, 0xf4, 0x75, 0x6e, 0x7d,
-    0xfd, 0x28, 0xbf, 0x67, 0xeb, 0x8d, 0x1d, 0x47, 0x5d, 0x93, 0x70, 0xd8,
-    0xe8, 0x9e, 0xff, 0x93, 0xf6, 0x0f, 0x63, 0xe8, 0xce, 0x75, 0xff, 0x44,
-    0xf1, 0xbf, 0x87, 0x27, 0x3a, 0xb1, 0x14, 0xad, 0x2d, 0x43, 0xfb, 0xf3,
-    0xac, 0x63, 0x73, 0xaa, 0x64, 0xd3, 0x79, 0x0f, 0x9e, 0x97, 0x5f, 0x67,
-    0x72, 0x73, 0xaf, 0x49, 0xf8, 0x75, 0xfa, 0x59, 0xec, 0x09, 0x57, 0xd0,
-    0x23, 0x07, 0x54, 0xc7, 0xbf, 0xe1, 0xbf, 0xa4, 0xd7, 0xc0, 0xd2, 0xf8,
-    0x75, 0x28, 0x8d, 0x44, 0x84, 0x07, 0x8c, 0xaf, 0xf8, 0x73, 0xb9, 0xf3,
-    0xb9, 0x39, 0xd7, 0xff, 0xff, 0x02, 0x05, 0xaf, 0xe7, 0xdc, 0x1b, 0xf9,
-    0x17, 0xae, 0xc7, 0xd1, 0x3a, 0xfe, 0xfd, 0x82, 0x9c, 0xe6, 0x1d, 0x7d,
-    0xe5, 0x33, 0xa7, 0x5b, 0x47, 0x5c, 0x80, 0x3a, 0xee, 0xa1, 0xd7, 0x7f,
-    0xaf, 0x86, 0xaa, 0x61, 0x5a, 0x73, 0xeb, 0x01, 0xd5, 0xc0, 0x83, 0xae,
-    0x04, 0x1d, 0x7e, 0xfe, 0x58, 0x2a, 0xa1, 0xaa, 0x00, 0xad, 0x42, 0x62,
-    0xc0, 0x84, 0x68, 0xa5, 0xdf, 0xff, 0x60, 0xbe, 0xfa, 0x51, 0x47, 0xf8,
-    0xd5, 0x80, 0xeb, 0xff, 0xbd, 0xdc, 0x5f, 0xd8, 0x06, 0x6f, 0xe3, 0xaf,
-    0xf6, 0xed, 0x4e, 0x7d, 0x80, 0x9d, 0x7c, 0x05, 0xbc, 0xbe, 0x23, 0x3b,
-    0x4a, 0x7e, 0x46, 0xbf, 0x80, 0xbf, 0xba, 0xfb, 0x39, 0xd7, 0x66, 0xe7,
-    0x56, 0xe7, 0x93, 0xb6, 0x67, 0x7c, 0x0e, 0x27, 0x0e, 0xa8, 0x46, 0xcb,
-    0xc2, 0x49, 0x92, 0x6b, 0xed, 0x7f, 0xbf, 0x8e, 0xbb, 0x19, 0x3a, 0xff,
-    0xa3, 0x7c, 0x04, 0x6c, 0xc9, 0xce, 0xae, 0x1e, 0x80, 0x05, 0xaf, 0xfd,
-    0x34, 0x4f, 0xae, 0x63, 0x62, 0x73, 0xaf, 0xec, 0x5e, 0x05, 0x19, 0x3a,
-    0xe5, 0xc1, 0xd4, 0xb3, 0xc1, 0x72, 0xcb, 0xf8, 0x72, 0x6e, 0xa7, 0x8e,
-    0xbe, 0xcc, 0xee, 0x8e, 0xac, 0x47, 0x73, 0xc2, 0x07, 0xc4, 0x3b, 0x45,
-    0x97, 0x99, 0x65, 0x92, 0xaf, 0xd8, 0xa0, 0xff, 0xa2, 0x95, 0x2f, 0xef,
-    0x95, 0x65, 0x96, 0x4e, 0xbb, 0x00, 0x75, 0x61, 0xbb, 0xf1, 0x35, 0x42,
-    0x24, 0xfc, 0xe7, 0x7c, 0x9c, 0x06, 0x8e, 0xbf, 0xed, 0x72, 0x3f, 0xf0,
-    0xa6, 0xc3, 0xaf, 0xfc, 0x39, 0xa6, 0xf5, 0x1b, 0x02, 0x75, 0xff, 0xfe,
-    0x51, 0x97, 0xe2, 0x8a, 0xeb, 0x24, 0x3f, 0xbe, 0xb0, 0x4e, 0xa8, 0x46,
-    0xc6, 0x1d, 0x21, 0xdd, 0xf3, 0x2e, 0x32, 0x3a, 0xff, 0xbd, 0x1b, 0x81,
-    0xfb, 0xd4, 0x3a, 0xdd, 0x3a, 0xb0, 0xf2, 0x1a, 0x71, 0x79, 0x96, 0x59,
-    0x2a, 0xfe, 0x47, 0x53, 0xa9, 0xe2, 0x95, 0x2f, 0xef, 0x79, 0x19, 0x3a,
-    0xf6, 0x9f, 0x87, 0x56, 0xe6, 0xdf, 0xc3, 0x97, 0xbb, 0x01, 0x3a, 0x90,
-    0xde, 0xb9, 0x15, 0xfb, 0x01, 0x99, 0x31, 0xd6, 0xd7, 0xc4, 0xcd, 0x78,
-    0x81, 0xd8, 0x58, 0x08, 0xfd, 0xdf, 0xc8, 0x29, 0xf4, 0x64, 0x73, 0xd7,
-    0xe6, 0x0f, 0x62, 0x7f, 0xce, 0xa9, 0x95, 0xb8, 0xf6, 0x1f, 0x23, 0x28,
-    0x57, 0xf3, 0x6b, 0xd1, 0xb2, 0x0e, 0xa4, 0x3e, 0x81, 0x4c, 0xbc, 0x31,
-    0xb0, 0xeb, 0x98, 0x28, 0x75, 0xc9, 0xd3, 0xac, 0xf3, 0x9a, 0xee, 0x0c,
-    0xdf, 0x7b, 0x5f, 0xb1, 0x9d, 0x7f, 0xa0, 0x64, 0x29, 0x1b, 0x9d, 0x50,
-    0xce, 0xf3, 0x93, 0x0e, 0x47, 0xea, 0xa4, 0x61, 0x6d, 0x35, 0xdc, 0xe5,
-    0x1c, 0xf9, 0x1a, 0x3f, 0x63, 0xdb, 0x73, 0x40, 0x3a, 0x0c, 0x62, 0x1a,
-    0x87, 0xaf, 0xa5, 0xfd, 0xec, 0x20, 0xdb, 0x4a, 0xfa, 0x4f, 0xb4, 0x4d,
-    0x73, 0x10, 0x87, 0x5f, 0xf4, 0xde, 0xda, 0xd4, 0x4d, 0xff, 0x0e, 0xbf,
-    0xc1, 0x81, 0x5c, 0x06, 0x0e, 0xa8, 0x3e, 0xf7, 0x3f, 0xbf, 0xfb, 0x13,
-    0xb0, 0x1e, 0xff, 0x1b, 0xe8, 0xeb, 0xc1, 0x50, 0x07, 0x5f, 0x97, 0xce,
-    0x3f, 0x8e, 0xaf, 0x87, 0x89, 0x03, 0xb7, 0xff, 0x9b, 0x33, 0xb7, 0xb1,
-    0x2f, 0x0e, 0x2c, 0xeb, 0xff, 0xe4, 0x5e, 0xf2, 0xd7, 0xcc, 0x11, 0xc4,
-    0x01, 0xd7, 0x93, 0xbf, 0x9d, 0x4c, 0x4a, 0xa0, 0x89, 0x42, 0x27, 0x84,
-    0x1d, 0x84, 0x43, 0x91, 0xf9, 0x27, 0x62, 0x7d, 0x95, 0x62, 0x23, 0x78,
-    0xef, 0x62, 0xe1, 0x9e, 0xc0, 0x8d, 0x55, 0x84, 0xdc, 0xc3, 0xe3, 0x18,
-    0x62, 0x91, 0x8a, 0xb1, 0x53, 0xa6, 0x18, 0x3e, 0x29, 0xa8, 0xb3, 0xce,
-    0x8b, 0x4a, 0x92, 0xd4, 0x1a, 0x52, 0x96, 0x5b, 0x72, 0x35, 0x25, 0x8f,
-    0x36, 0x95, 0x27, 0xbc, 0xff, 0x4a, 0x52, 0x70, 0x58, 0xe3, 0x0c, 0x9a,
-    0x9a, 0x4d, 0xca, 0x6c, 0xaa, 0xe9, 0x02, 0x1d, 0xad, 0xc2, 0x1e, 0xba,
-    0x36, 0x05, 0x27, 0xf1, 0x83, 0x0e, 0x51, 0xad, 0x5f, 0xb5, 0x6d, 0xf2,
-    0x3d, 0x69, 0x0f, 0x3f, 0x9d, 0x24, 0xd9, 0x29, 0xd5, 0x99, 0x4c, 0x3b,
-    0x73, 0xe9, 0x9f, 0x6b, 0x0e, 0xed, 0xa9, 0x66, 0x14, 0xac, 0x6f, 0x88,
-    0xb2, 0xcd, 0xe4, 0xfe, 0xfc, 0xa8, 0x17, 0x9e, 0x3a, 0xff, 0x2b, 0x9c,
-    0x6b, 0xbb, 0x4d, 0x17, 0x1d, 0xfe, 0x57, 0x38, 0xd7, 0x76, 0x9a, 0x2e,
-    0xbb, 0xff, 0x95, 0x79, 0x2b, 0x9c, 0x6b, 0xbb, 0x4d, 0x12, 0x8d, 0x44,
-    0x70, 0x2f, 0xb2, 0x85, 0xe0, 0x4a, 0x54, 0x84, 0x7b, 0x4a, 0x12, 0x3a,
-    0x26, 0x37, 0x17, 0xcd, 0xf2, 0x70, 0x07, 0x7a, 0x28, 0xf1, 0xfe, 0xd1,
-    0xfd, 0xff, 0xe5, 0x56, 0xf2, 0x57, 0x38, 0xd7, 0x76, 0x9a, 0x25, 0xab,
-    0xfe, 0x61, 0xdd, 0x46, 0x37, 0x8d, 0xf6, 0x8e, 0xbf, 0x71, 0xae, 0xed,
-    0x34, 0x46, 0xf7, 0xfe, 0x79, 0x2b, 0x9c, 0x6b, 0xbb, 0x4d, 0x12, 0xfd,
-    0xfd, 0x1e, 0xfb, 0xd7, 0xf1, 0xd7, 0xfb, 0x3e, 0xf1, 0x4e, 0xff, 0xa3,
-    0xaf, 0x4d, 0xae, 0x1d, 0x65, 0x58, 0xaa, 0x68, 0x78, 0x88, 0xb3, 0x3e,
-    0xa5, 0x09, 0x77, 0xd3, 0x7b, 0xfc, 0xae, 0x71, 0xae, 0xed, 0x34, 0x55,
-    0x77, 0x26, 0xd1, 0xd7, 0xc8, 0xb7, 0xd8, 0x75, 0x28, 0x6e, 0xbc, 0x31,
-    0x78, 0x76, 0x99, 0x3a, 0xfe, 0x7e, 0xcc, 0x30, 0x13, 0xaf, 0xfe, 0xf7,
-    0x63, 0x42, 0xff, 0xb0, 0x53, 0x87, 0x5e, 0x89, 0x61, 0xd4, 0x14, 0x46,
-    0xee, 0x59, 0x32, 0x3d, 0xff, 0x29, 0x83, 0x9b, 0xf9, 0xd6, 0x75, 0xc1,
-    0x43, 0xaf, 0xec, 0xe3, 0x5d, 0xda, 0x68, 0x90, 0x2b, 0xe1, 0xe6, 0xaa,
-    0x2b, 0x7e, 0xd3, 0x8b, 0xee, 0x75, 0xdf, 0xc1, 0xd5, 0x23, 0xe1, 0xdc,
-    0x97, 0x84, 0xd7, 0xfa, 0x51, 0xc9, 0xe3, 0x93, 0x9d, 0x7f, 0xb9, 0x3a,
-    0xe0, 0x65, 0xa3, 0xaa, 0x0f, 0x9f, 0x0d, 0x2f, 0xb2, 0x77, 0x09, 0xd7,
-    0xff, 0xb2, 0x6e, 0xba, 0xfd, 0xd8, 0xf7, 0xeb, 0x3a, 0xa7, 0x56, 0x12,
-    0x12, 0x2c, 0x85, 0x62, 0x86, 0x4f, 0x0e, 0x61, 0x84, 0xbf, 0x88, 0x3e,
-    0x90, 0xdf, 0xfc, 0x39, 0x3a, 0xbb, 0x70, 0x23, 0x9e, 0x3a, 0x95, 0x46,
-    0x47, 0x21, 0x07, 0x7f, 0x95, 0xce, 0x35, 0xdd, 0xa6, 0x8b, 0x22, 0xff,
-    0x2b, 0x9c, 0x6b, 0xbb, 0x4d, 0x16, 0xbd, 0xff, 0xec, 0xfb, 0x13, 0xab,
-    0x93, 0x78, 0x30, 0x27, 0x5f, 0xe5, 0x73, 0x8d, 0x77, 0x69, 0xa2, 0xe4,
-    0xbf, 0x71, 0xae, 0xed, 0x34, 0x5d, 0x97, 0xfe, 0x79, 0x2b, 0x9c, 0x6b,
-    0xbb, 0x4d, 0x14, 0x75, 0x95, 0xc3, 0xfd, 0x59, 0x9d, 0xf0, 0xc4, 0x96,
-    0x75, 0xa4, 0x75, 0xfb, 0x8d, 0x77, 0x69, 0xa2, 0x95, 0xbf, 0xe6, 0xf5,
-    0x26, 0xec, 0x4f, 0x87, 0x5f, 0xfe, 0xec, 0x4f, 0x1d, 0x4d, 0x8e, 0x1e,
-    0xa1, 0xca, 0x9b, 0x9b, 0xa4, 0xae, 0x23, 0x1e, 0x66, 0xca, 0xdd, 0x30,
-    0x77, 0x86, 0xbd, 0xff, 0x9d, 0x3d, 0x2f, 0xc2, 0xe2, 0x03, 0xac, 0xa8,
-    0x53, 0x8d, 0x5c, 0x64, 0xfd, 0x29, 0xa9, 0xd9, 0x3d, 0x72, 0x8e, 0x6b,
-    0x76, 0x54, 0x9c, 0x4a, 0x59, 0x48, 0x0f, 0xc4, 0xff, 0x49, 0x9e, 0x85,
-    0xe6, 0xc8, 0xed, 0x6f, 0xfa, 0x4a, 0xe7, 0x1a, 0xee, 0xd3, 0x44, 0x71,
-    0x7f, 0xc8, 0xae, 0x71, 0xae, 0xed, 0x34, 0x56, 0xb6, 0x55, 0xd1, 0x13,
-    0xe4, 0x5b, 0xff, 0xca, 0xad, 0xe4, 0xae, 0x71, 0xae, 0xed, 0x34, 0x4b,
-    0x77, 0xbf, 0xe0, 0x0e, 0xbb, 0x37, 0x3a, 0xff, 0x07, 0x16, 0xb8, 0x4d,
-    0x1d, 0x7b, 0x67, 0xf2, 0x3a, 0x9a, 0x88, 0x3d, 0xc7, 0x50, 0x5b, 0x61,
-    0x8d, 0xee, 0x86, 0x47, 0x5f, 0xf6, 0x6e, 0x38, 0x00, 0x3c, 0x8e, 0xb9,
-    0x6d, 0x3a, 0xa0, 0xf3, 0x64, 0x6f, 0x7c, 0x31, 0xbc, 0x8e, 0xbf, 0xff,
-    0x3e, 0xe0, 0x0f, 0x5e, 0x59, 0xa1, 0xfd, 0xfe, 0x9d, 0x4d, 0x3f, 0x8e,
-    0x90, 0xd9, 0x43, 0xaf, 0xe4, 0xe0, 0xa7, 0xb4, 0x75, 0xfb, 0x8e, 0x39,
-    0x07, 0x51, 0xa2, 0x1b, 0x43, 0xe0, 0xe8, 0x8b, 0x95, 0xdd, 0x02, 0x75,
-    0xfc, 0x82, 0x1c, 0x40, 0x9d, 0x50, 0x6f, 0xa4, 0x29, 0x7d, 0x93, 0x4b,
-    0x0e, 0xbf, 0xf3, 0xc9, 0x5c, 0xe3, 0x5d, 0xda, 0x68, 0x98, 0x2f, 0xc0,
-    0xd3, 0x88, 0x0e, 0xbf, 0xdf, 0xef, 0xc4, 0x85, 0xe1, 0xd7, 0xfd, 0x13,
-    0xf8, 0x63, 0xff, 0x68, 0xeb, 0x7b, 0xa7, 0xd9, 0xb6, 0x67, 0x7d, 0xbb,
-    0x51, 0x43, 0xab, 0x0f, 0x3b, 0xc5, 0x77, 0xfb, 0x49, 0xd4, 0x5e, 0x28,
-    0x75, 0xff, 0xe7, 0x9f, 0xa9, 0x03, 0x93, 0x27, 0x10, 0xea, 0xf1, 0xfc,
-    0xb2, 0x65, 0x73, 0x70, 0xeb, 0xbf, 0x01, 0x54, 0x86, 0xb3, 0x82, 0xb7,
-    0xfb, 0x02, 0x39, 0xee, 0xe1, 0xd7, 0x30, 0x9a, 0x78, 0xc2, 0xaf, 0xe9,
-    0xfe, 0xed, 0xb8, 0x80, 0xeb, 0xfb, 0x3d, 0xe8, 0xe6, 0x8e, 0xbf, 0x9c,
-    0x41, 0x38, 0x3c, 0x75, 0x42, 0x22, 0xc4, 0xcb, 0x6c, 0xb2, 0xca, 0xc2,
-    0xee, 0x44, 0xe7, 0xe1, 0x69, 0xc8, 0x4c, 0xb6, 0x10, 0x5b, 0xbf, 0x70,
-    0x81, 0x64, 0x2e, 0x94, 0x30, 0xe0, 0xd4, 0x26, 0xbc, 0x9f, 0xb0, 0x81,
-    0x93, 0x0f, 0xb0, 0xb2, 0xbc, 0xbf, 0xf8, 0x55, 0xff, 0x9e, 0x4a, 0xe7,
-    0x1a, 0xee, 0xd3, 0x44, 0xc7, 0x7d, 0x1c, 0x8d, 0xa3, 0xac, 0xaa, 0x22,
-    0x29, 0x63, 0xbd, 0x4a, 0xbe, 0x89, 0xe3, 0x87, 0x5f, 0xb2, 0x26, 0x45,
-    0x9d, 0x48, 0x78, 0xfc, 0x21, 0xbf, 0xdd, 0x8e, 0x4f, 0xf7, 0xf0, 0x1d,
-    0x73, 0xe8, 0xeb, 0xef, 0x9e, 0xce, 0x9d, 0x68, 0xe9, 0xb8, 0xd0, 0xad,
-    0xe8, 0x19, 0xce, 0xbf, 0xff, 0xfe, 0x96, 0xbb, 0x9f, 0xb3, 0xae, 0xe3,
-    0x73, 0x5f, 0x33, 0x79, 0x69, 0x05, 0x0e, 0xbc, 0xee, 0xd3, 0x45, 0x63,
-    0x7c, 0xff, 0x61, 0x43, 0xa9, 0xa7, 0x95, 0xc2, 0x7b, 0xff, 0x6d, 0xe7,
-    0x87, 0x3f, 0x81, 0xf1, 0xd4, 0xa2, 0x6d, 0x8d, 0x26, 0xdc, 0x6f, 0x90,
-    0xca, 0xf1, 0x15, 0xff, 0xc3, 0xe5, 0x3f, 0x81, 0xc6, 0xc7, 0x0e, 0xbf,
-    0xdc, 0x9f, 0xda, 0x7d, 0xda, 0x75, 0x41, 0xfc, 0x3a, 0x1d, 0xfd, 0x1b,
-    0x5e, 0xcd, 0xe6, 0x3a, 0xfe, 0xff, 0x6d, 0xbd, 0x46, 0x09, 0xd7, 0xf6,
-    0x6b, 0x79, 0x47, 0x4e, 0xba, 0x36, 0x1d, 0x60, 0xf4, 0xf1, 0x04, 0xb6,
-    0xff, 0xa3, 0x79, 0x4d, 0x27, 0xe4, 0xe7, 0x54, 0x23, 0x6f, 0x1e, 0x50,
-    0x9e, 0xf4, 0x4b, 0xc7, 0x5f, 0xfb, 0x03, 0xc4, 0xfe, 0x70, 0x6a, 0x47,
-    0x5f, 0x2d, 0xf7, 0xf1, 0xd7, 0xff, 0x4f, 0x1e, 0xf9, 0xf5, 0xbf, 0x76,
-    0xbe, 0xe8, 0xeb, 0xfe, 0xe4, 0x69, 0xf8, 0x31, 0x23, 0xab, 0x88, 0x87,
-    0xd8, 0xa3, 0x7a, 0x4f, 0x39, 0xd7, 0xbe, 0x4e, 0xb3, 0xae, 0x0f, 0x8e,
-    0xa6, 0x12, 0x63, 0xf9, 0x0a, 0x9d, 0xc9, 0x50, 0x70, 0x47, 0xef, 0xfc,
-    0x2e, 0x1e, 0xc6, 0xce, 0xb8, 0x9d, 0x7f, 0xff, 0xef, 0xe7, 0xc6, 0xfc,
-    0x1f, 0xf6, 0xbe, 0x66, 0xf2, 0xcf, 0xc4, 0x1a, 0x3a, 0xff, 0xf4, 0xf9,
-    0xbf, 0xb4, 0x83, 0x00, 0x75, 0x9d, 0x7f, 0xb7, 0x1c, 0x0f, 0x5d, 0x93,
-    0xab, 0x0f, 0xf1, 0xd2, 0x68, 0x29, 0xa8, 0x09, 0xee, 0xa1, 0xe7, 0x7f,
-    0x4f, 0x34, 0x98, 0x5c, 0x9c, 0xeb, 0xe1, 0x1c, 0xf1, 0xd7, 0xe4, 0x63,
-    0xe7, 0x10, 0xea, 0x62, 0x4f, 0xf6, 0x0d, 0x7a, 0x3f, 0x7f, 0x4f, 0xf7,
-    0x6d, 0xc4, 0x07, 0x5f, 0x31, 0xc6, 0x84, 0xeb, 0xff, 0x75, 0xd7, 0xee,
-    0xc7, 0xbf, 0x59, 0xd5, 0x87, 0xc5, 0x31, 0x1d, 0xff, 0x24, 0x93, 0xbf,
-    0xad, 0x68, 0x75, 0x42, 0x3b, 0xb2, 0x12, 0x9e, 0x22, 0xbd, 0xd4, 0x56,
-    0x19, 0x28, 0x32, 0x21, 0xc8, 0xf6, 0xdb, 0x0c, 0xae, 0x10, 0x76, 0x30,
-    0xc7, 0x2d, 0x11, 0xbd, 0x46, 0xbf, 0xe8, 0xe8, 0xb6, 0xe1, 0x65, 0xf6,
-    0x32, 0x1b, 0xa4, 0x27, 0x5f, 0xdc, 0xe4, 0x07, 0x16, 0x75, 0xdf, 0x40,
-    0x75, 0xee, 0xa2, 0xce, 0xb4, 0xc7, 0x53, 0x9a, 0xcf, 0xc6, 0xef, 0xce,
-    0x33, 0xff, 0xa3, 0xaf, 0xfa, 0x03, 0xdc, 0x0f, 0x1d, 0xa7, 0x52, 0x23,
-    0xc0, 0x05, 0x82, 0x89, 0xa2, 0x1f, 0x14, 0x5e, 0xd7, 0xdd, 0x1d, 0x7d,
-    0xbc, 0xf0, 0xa1, 0xd4, 0x13, 0xc2, 0xfc, 0x7a, 0xef, 0x41, 0xd7, 0xe5,
-    0xe0, 0xc4, 0x8e, 0xbf, 0xd8, 0x0d, 0x67, 0x93, 0x87, 0x5f, 0x7f, 0xec,
-    0xd1, 0xd7, 0xd1, 0xc7, 0x13, 0xaf, 0xf3, 0xf2, 0x40, 0x4d, 0xf4, 0x75,
-    0xf6, 0xb5, 0x00, 0x3a, 0xa1, 0x1d, 0x78, 0x4a, 0x86, 0x3d, 0x22, 0xfc,
-    0x7d, 0x93, 0x3b, 0xe9, 0x03, 0xf9, 0x1d, 0x7d, 0xcf, 0xb0, 0x03, 0xaa,
-    0x0f, 0x19, 0x08, 0xef, 0xf2, 0x4e, 0xeb, 0x00, 0x20, 0xeb, 0xfe, 0x46,
-    0xf7, 0x26, 0x18, 0x09, 0xd7, 0xd2, 0xf6, 0x7d, 0x3a, 0xf3, 0x60, 0x07,
-    0x5e, 0xe4, 0x2c, 0xea, 0x73, 0xd9, 0xfc, 0x8d, 0x91, 0xbb, 0xf4, 0x4f,
-    0xf7, 0x26, 0x3a, 0xf4, 0x0c, 0x8e, 0xa9, 0x93, 0x56, 0xe1, 0x07, 0x4c,
-    0x86, 0x12, 0x1a, 0x30, 0xf1, 0x55, 0xff, 0xa3, 0x35, 0xf2, 0x10, 0x3f,
-    0x64, 0x75, 0xfc, 0x8c, 0xea, 0x7c, 0x64, 0xea, 0x13, 0xef, 0xf2, 0x05,
-    0xfa, 0x03, 0xec, 0x69, 0xd7, 0xdd, 0x81, 0x69, 0xd5, 0x23, 0xe7, 0xd1,
-    0x0f, 0x89, 0xaf, 0x9c, 0x5e, 0x63, 0xaf, 0xc9, 0xe1, 0xc9, 0x1d, 0x7d,
-    0x0c, 0xc4, 0xc7, 0x5d, 0xf5, 0x67, 0x5f, 0xde, 0x17, 0x06, 0x09, 0xd7,
-    0xe1, 0x70, 0x60, 0x9d, 0x6f, 0xfe, 0x1e, 0x77, 0x8a, 0xaa, 0x74, 0x7c,
-    0x28, 0x40, 0x84, 0xbd, 0x22, 0x16, 0x6b, 0xfd, 0x0c, 0x87, 0xf7, 0xe4,
-    0x8e, 0xbf, 0x93, 0x9b, 0xea, 0x24, 0x75, 0xb6, 0x1d, 0x5c, 0x3f, 0x3e,
-    0x9a, 0x6d, 0x16, 0xde, 0x14, 0x50, 0xeb, 0xec, 0x0a, 0x6c, 0x3a, 0xe8,
-    0x5e, 0x1b, 0xd7, 0x1b, 0xbf, 0xec, 0x65, 0xf7, 0xec, 0x7d, 0x13, 0xad,
-    0xa3, 0xa9, 0x0f, 0xd3, 0x85, 0x4e, 0x75, 0x70, 0x20, 0xab, 0x99, 0x64,
-    0xaa, 0x43, 0x5a, 0xc8, 0xad, 0xfe, 0x79, 0x0e, 0x7b, 0xa8, 0x52, 0xa6,
-    0x86, 0xf3, 0xef, 0xa3, 0xaf, 0xbe, 0xf5, 0xfc, 0x75, 0x04, 0xdf, 0xf8,
-    0x72, 0xf4, 0x0c, 0xc7, 0x5c, 0x30, 0x75, 0xa6, 0x3a, 0xa6, 0x3c, 0x0e,
-    0x0d, 0xb8, 0xa5, 0xff, 0xca, 0x20, 0xb7, 0x50, 0xb7, 0xdf, 0xc7, 0x5e,
-    0x06, 0x6d, 0x1d, 0x4a, 0x1f, 0x17, 0x11, 0x2f, 0x97, 0xaf, 0xd6, 0x75,
-    0x94, 0x3a, 0xdb, 0x67, 0x5d, 0xc5, 0x0e, 0xa8, 0x3d, 0xe4, 0x23, 0xfc,
-    0x47, 0xe8, 0x9d, 0xff, 0xf7, 0x72, 0x5a, 0x8f, 0x4b, 0x18, 0xdc, 0x40,
-    0x75, 0xff, 0xa4, 0x9e, 0xee, 0x6f, 0xef, 0xe0, 0xeb, 0xb3, 0x47, 0x54,
-    0x1e, 0xa4, 0x8f, 0xeb, 0x48, 0xc5, 0xf4, 0x29, 0x2f, 0xc9, 0x0b, 0x85,
-    0x9d, 0x6c, 0x3a, 0x90, 0xf7, 0x34, 0x51, 0xb6, 0x4b, 0x50, 0xac, 0x0b,
-    0x18, 0x52, 0x12, 0x3d, 0x84, 0x0b, 0xc6, 0xbd, 0x7b, 0x51, 0x31, 0xd4,
-    0x75, 0x96, 0x75, 0x78, 0xba, 0xd8, 0x15, 0x7e, 0x02, 0x71, 0x14, 0x3a,
-    0xe7, 0x50, 0xea, 0x99, 0x12, 0xbd, 0x36, 0x01, 0x10, 0x93, 0xdd, 0xe8,
-    0x3a, 0xfd, 0x1d, 0xcd, 0x8e, 0x75, 0x39, 0xbc, 0x00, 0xad, 0xfc, 0x9e,
-    0xce, 0xba, 0x87, 0x5f, 0xdd, 0xfd, 0xe7, 0xea, 0x1d, 0x79, 0x96, 0x59,
-    0x2a, 0xff, 0x83, 0x13, 0xfd, 0xce, 0xbe, 0xe5, 0x2a, 0x5f, 0xdd, 0x93,
-    0x9d, 0x41, 0x45, 0x73, 0x53, 0x51, 0x2e, 0xf4, 0x2d, 0x0e, 0xac, 0x3c,
-    0x96, 0x97, 0xdf, 0x27, 0x36, 0x82, 0x75, 0xfb, 0xb1, 0xbb, 0xb1, 0x9d,
-    0x7f, 0xfd, 0x1e, 0xd0, 0x73, 0xc9, 0xdf, 0xf3, 0x7f, 0x1d, 0x5d, 0x3f,
-    0xaf, 0x15, 0x5b, 0x87, 0x5f, 0xec, 0xc6, 0xfd, 0xd9, 0xdc, 0x3a, 0xef,
-    0xf4, 0x75, 0xff, 0xfb, 0x03, 0x19, 0xbf, 0xdf, 0x20, 0xff, 0x2c, 0xd1,
-    0xd7, 0x2c, 0x07, 0x5c, 0xe2, 0x75, 0x74, 0xd5, 0x38, 0xb5, 0xf9, 0x69,
-    0xe0, 0x39, 0xd5, 0x3a, 0x7c, 0x59, 0x09, 0xe6, 0x32, 0x29, 0x84, 0x1c,
-    0xd4, 0x45, 0xfd, 0x08, 0x0f, 0xc8, 0x2f, 0xbb, 0xe4, 0x9c, 0xeb, 0xfc,
-    0xd4, 0xd0, 0xe6, 0xc7, 0x3a, 0xfa, 0x27, 0x79, 0x1d, 0x76, 0x78, 0xeb,
-    0xf6, 0x4e, 0x39, 0xb9, 0xd5, 0x88, 0xb1, 0xdc, 0x8b, 0x86, 0x5d, 0x21,
-    0x11, 0x5b, 0xdd, 0x80, 0x9d, 0x77, 0x34, 0x75, 0x1c, 0x85, 0xb5, 0xfe,
-    0x81, 0x93, 0xaf, 0x02, 0x75, 0xf7, 0x96, 0xbe, 0x1d, 0x7f, 0xf0, 0x20,
-    0x5a, 0xfe, 0x07, 0xd1, 0x91, 0xd7, 0xa4, 0x9d, 0x3a, 0xfb, 0xc3, 0x92,
-    0x3a, 0xfd, 0x9f, 0xb0, 0x74, 0xe7, 0x5f, 0xfe, 0x4d, 0x77, 0x02, 0x39,
-    0xb0, 0x73, 0x47, 0x54, 0x93, 0x44, 0x50, 0xc3, 0x72, 0x29, 0x91, 0x38,
-    0x36, 0x24, 0x1e, 0x2b, 0xa6, 0x13, 0x69, 0x69, 0x11, 0x82, 0xcf, 0x08,
-    0xa9, 0x11, 0x86, 0x30, 0x0c, 0x8f, 0xcb, 0x78, 0xcc, 0xd2, 0x32, 0x79,
-    0xa1, 0x7b, 0xc8, 0x71, 0xad, 0xef, 0xb2, 0xe0, 0x9e, 0x1d, 0xa0, 0x79,
-    0x60, 0x90, 0x0c, 0x64, 0x7a, 0x94, 0x07, 0xe8, 0xcc, 0x19, 0x49, 0xdb,
-    0x31, 0xfb, 0x1a, 0xe5, 0xff, 0x2b, 0xe4, 0xcd, 0xad, 0x7f, 0x07, 0x5f,
-    0xff, 0xf7, 0xf0, 0xaf, 0xb4, 0x9d, 0x74, 0xf6, 0x70, 0x0b, 0x79, 0x1d,
-    0x4a, 0xaa, 0x1f, 0x9e, 0x37, 0xd0, 0x9e, 0x5f, 0xb8, 0xd7, 0x76, 0x9a,
-    0x2b, 0x7b, 0xff, 0x3c, 0x95, 0xce, 0x35, 0xdd, 0xa6, 0x89, 0xc2, 0xca,
-    0xe1, 0xfe, 0xac, 0xce, 0xe6, 0x10, 0x4e, 0xb7, 0x4e, 0xb6, 0x8e, 0xaf,
-    0xcd, 0x06, 0xd8, 0x85, 0xf3, 0x5d, 0xda, 0x68, 0xb4, 0x6f, 0xff, 0x60,
-    0x7a, 0xea, 0x4d, 0x32, 0x6b, 0xf5, 0x9d, 0x5c, 0x3f, 0xae, 0x96, 0xdf,
-    0x35, 0xc4, 0x07, 0x5f, 0xf4, 0xd8, 0xc7, 0xae, 0x71, 0xfc, 0x75, 0xfd,
-    0x0e, 0x3f, 0x87, 0x0e, 0xb9, 0x14, 0x3a, 0xff, 0xfd, 0x3c, 0x7a, 0x03,
-    0xc8, 0xeb, 0xe8, 0x70, 0x07, 0x5f, 0xfa, 0x37, 0x76, 0x3e, 0x8b, 0xb1,
-    0xce, 0x75, 0xff, 0xa3, 0x80, 0xc4, 0xce, 0x7b, 0xf3, 0xaa, 0x11, 0xa9,
-    0xd5, 0x3d, 0x22, 0x5b, 0x26, 0x4c, 0x67, 0x50, 0xea, 0xbf, 0xdd, 0xef,
-    0xea, 0x2e, 0x34, 0x75, 0xff, 0xf9, 0x34, 0x39, 0xb1, 0xfc, 0x39, 0xae,
-    0xbc, 0xc7, 0x56, 0x22, 0x26, 0x63, 0x5b, 0xec, 0x03, 0xf4, 0xeb, 0xbb,
-    0xa3, 0xac, 0xab, 0x16, 0xae, 0xb1, 0x80, 0x75, 0x90, 0x9f, 0x69, 0x14,
-    0xc4, 0x0b, 0x3c, 0xec, 0x68, 0x9e, 0x85, 0xc6, 0xd9, 0x1f, 0xd2, 0x0b,
-    0xe6, 0xbb, 0xb4, 0xd1, 0x6d, 0x5f, 0xff, 0xd0, 0xfe, 0x8e, 0xc6, 0x91,
-    0x24, 0x9c, 0xc0, 0x9d, 0x7f, 0x76, 0x17, 0x08, 0x13, 0xab, 0x88, 0xae,
-    0xd1, 0x6f, 0x95, 0xaf, 0xfd, 0xd4, 0x0b, 0xc8, 0x3d, 0x45, 0x9d, 0x7d,
-    0x1b, 0x31, 0x0e, 0xbf, 0xe8, 0x94, 0x72, 0x78, 0xe4, 0xe7, 0x5f, 0xf4,
-    0x73, 0xe6, 0xa3, 0xae, 0x87, 0x5f, 0xee, 0xa3, 0xcb, 0xc9, 0x39, 0xd5,
-    0x89, 0x98, 0xb4, 0xc3, 0x87, 0xa2, 0x42, 0xc9, 0xce, 0xd9, 0xc5, 0xfc,
-    0xa3, 0xf0, 0x3f, 0x89, 0xd7, 0xf0, 0xed, 0xa7, 0x31, 0x43, 0xaf, 0xc9,
-    0x3a, 0xe1, 0xa7, 0x5f, 0x9f, 0x79, 0x7d, 0xd1, 0xd7, 0xfe, 0x49, 0xb5,
-    0xb1, 0xc6, 0x7f, 0xc2, 0x75, 0x95, 0x51, 0x1e, 0x02, 0x5d, 0xe2, 0xfd,
-    0x84, 0xff, 0x4a, 0xa9, 0x54, 0xe7, 0xc1, 0x1a, 0x55, 0xcb, 0xe9, 0xd7,
-    0xee, 0x35, 0xdd, 0xa6, 0x8b, 0x96, 0xca, 0x84, 0xf2, 0x70, 0x5a, 0xfd,
-    0xc6, 0xbb, 0xb4, 0xd1, 0x76, 0xdf, 0xf2, 0x4a, 0x48, 0x20, 0x89, 0x1d,
-    0x65, 0x70, 0xfa, 0x5c, 0xce, 0xa1, 0xd9, 0xd1, 0xce, 0x53, 0x29, 0xea,
-    0x20, 0xc6, 0xf8, 0xa5, 0x26, 0xf9, 0x2b, 0x7b, 0x76, 0x38, 0x5b, 0xf6,
-    0x5e, 0xa0, 0xce, 0x18, 0x69, 0xd3, 0xd0, 0x91, 0xbf, 0xca, 0xe7, 0x1a,
-    0xee, 0xd3, 0x45, 0x4f, 0x7e, 0x15, 0x79, 0xad, 0x1d, 0x74, 0xeb, 0x3a,
-    0xfd, 0xba, 0xdd, 0xc4, 0xea, 0x09, 0xbd, 0xfc, 0x5e, 0xde, 0x3a, 0xff,
-    0xa1, 0xe7, 0xf9, 0xbe, 0xa0, 0x27, 0x52, 0x1e, 0x58, 0x88, 0x5f, 0x35,
-    0xdd, 0xa6, 0x8a, 0xe6, 0xff, 0x2b, 0x9c, 0x6b, 0xbb, 0x4d, 0x16, 0x75,
-    0xe7, 0x79, 0x1d, 0x7f, 0x26, 0xb0, 0x5d, 0x93, 0xab, 0x88, 0xb1, 0xe9,
-    0x68, 0x9f, 0xf8, 0x6a, 0xff, 0xf7, 0xa3, 0x5f, 0x3f, 0xd7, 0xa2, 0x69,
-    0x90, 0xeb, 0xf9, 0x17, 0x3f, 0xfc, 0x91, 0xd7, 0xfa, 0x3b, 0xf1, 0x6c,
-    0x06, 0x2f, 0xc7, 0x56, 0x22, 0xef, 0xa9, 0xdb, 0x0b, 0xef, 0xdc, 0xcf,
-    0x22, 0xce, 0xbe, 0x71, 0x80, 0x9d, 0x7e, 0x9a, 0x17, 0x1f, 0x4e, 0xba,
-    0x4b, 0x3a, 0xb0, 0xdf, 0x89, 0x4d, 0xfb, 0x8d, 0x77, 0x69, 0xa2, 0x42,
-    0xbf, 0xf6, 0x2f, 0x1f, 0x93, 0xfc, 0xdd, 0x67, 0x5f, 0xf2, 0x6f, 0xaf,
-    0x0c, 0x2f, 0x47, 0x5d, 0x25, 0x71, 0x15, 0x9d, 0x33, 0x02, 0x0d, 0xff,
-    0xdd, 0x45, 0xe6, 0xbe, 0x6f, 0x2c, 0xf1, 0xd7, 0xd2, 0xef, 0xdd, 0x1d,
-    0x50, 0x7d, 0x58, 0x8d, 0x7c, 0xc0, 0xec, 0x2c, 0xeb, 0xfb, 0xba, 0xd6,
-    0x72, 0x73, 0xae, 0x86, 0x4e, 0xac, 0x3c, 0x44, 0x2e, 0xbc, 0xbd, 0x92,
-    0x3a, 0xff, 0xf7, 0x60, 0x0b, 0x79, 0x6b, 0xd9, 0x8b, 0x3a, 0xca, 0xce,
-    0xba, 0xd4, 0x16, 0xdc, 0x86, 0x8a, 0x43, 0xdf, 0x86, 0x2b, 0x26, 0xea,
-    0xf3, 0xc3, 0x2c, 0x61, 0x4d, 0xa2, 0x0f, 0x34, 0xfe, 0x41, 0xf4, 0x7a,
-    0xff, 0xe5, 0x7a, 0xfa, 0x1c, 0xf7, 0xa0, 0x07, 0x5f, 0xfe, 0x55, 0x6f,
-    0x25, 0x73, 0x8d, 0x77, 0x69, 0xa2, 0x7c, 0xa6, 0xaf, 0xbc, 0x21, 0xfb,
-    0x1c, 0xee, 0x7a, 0xe1, 0xa1, 0xd4, 0x3b, 0x93, 0x73, 0xaf, 0xff, 0xa5,
-    0x3b, 0x0d, 0x0c, 0x09, 0xdb, 0xcf, 0x9f, 0x3b, 0xb6, 0x75, 0x48, 0xfe,
-    0x40, 0x2d, 0x7e, 0xce, 0x66, 0x4c, 0x75, 0x95, 0xe9, 0xe4, 0x7d, 0x22,
-    0xbf, 0x71, 0xae, 0xed, 0x34, 0x56, 0x57, 0xfe, 0x79, 0x2b, 0x9c, 0x6b,
-    0xbb, 0x4d, 0x13, 0x75, 0x95, 0xc3, 0xfd, 0x59, 0x9d, 0x35, 0x1a, 0x09,
-    0x0a, 0x8b, 0xf7, 0x1a, 0xee, 0xd3, 0x44, 0xad, 0x7e, 0x18, 0x0b, 0xf4,
-    0xeb, 0xf2, 0xab, 0x79, 0x2b, 0x87, 0xb0, 0x86, 0x77, 0xfe, 0xf6, 0x2b,
-    0x9c, 0x49, 0xdd, 0x67, 0x5f, 0xfe, 0x62, 0x18, 0x96, 0x2f, 0x58, 0xf2,
-    0x4c, 0xe6, 0x1d, 0x7f, 0xe4, 0xd7, 0xeb, 0x14, 0xd9, 0xfb, 0x9d, 0x7f,
-    0x40, 0xbb, 0x5d, 0x8c, 0xea, 0x91, 0xf6, 0xad, 0x02, 0xe0, 0xf0, 0xeb,
-    0xf7, 0x1a, 0xee, 0xd3, 0x44, 0xb9, 0x7f, 0xc8, 0xf2, 0xf0, 0xc2, 0xf4,
-    0x75, 0xfa, 0x5b, 0x69, 0xd7, 0x3a, 0xf4, 0x6d, 0xc1, 0xd7, 0x90, 0x60,
-    0xea, 0x91, 0xef, 0x84, 0xa7, 0x60, 0xed, 0xff, 0xf9, 0xfc, 0x9f, 0xc8,
-    0x52, 0x51, 0xe1, 0xfe, 0x47, 0x5f, 0xd2, 0xee, 0x0e, 0x34, 0xeb, 0xd2,
-    0xef, 0x8e, 0xbb, 0xb0, 0x87, 0x8f, 0xd2, 0xbb, 0xff, 0x85, 0x01, 0xae,
-    0x42, 0x49, 0xf4, 0x75, 0x61, 0xf6, 0xa1, 0x65, 0xe7, 0x92, 0xac, 0x51,
-    0x58, 0xe4, 0x43, 0x0e, 0x44, 0x58, 0x2d, 0xd3, 0x37, 0x84, 0xae, 0x8c,
-    0x7d, 0x18, 0x45, 0x95, 0x45, 0x7e, 0x4b, 0x96, 0xb5, 0x7f, 0xf2, 0xaf,
-    0x25, 0x73, 0x8d, 0x77, 0x69, 0xa2, 0x3b, 0xbf, 0xef, 0x77, 0x24, 0xab,
-    0x8e, 0x8e, 0xbf, 0x98, 0x43, 0x0d, 0xc1, 0x3a, 0xef, 0xfa, 0x75, 0xfc,
-    0xc5, 0x8e, 0x75, 0xfc, 0x75, 0xff, 0xfd, 0xe9, 0x20, 0x7a, 0x9b, 0x3e,
-    0x60, 0x78, 0x9f, 0xb4, 0xeb, 0xfd, 0x8c, 0xea, 0x07, 0xda, 0x3a, 0xfe,
-    0x00, 0xe6, 0xfe, 0xc3, 0xaf, 0xe1, 0x03, 0xf1, 0xfe, 0x9d, 0x50, 0x7b,
-    0x2e, 0x59, 0x7f, 0xe4, 0xe7, 0xcd, 0x0e, 0x2e, 0x1a, 0x75, 0xff, 0xa0,
-    0x7f, 0xf2, 0x3e, 0xc7, 0x91, 0xd7, 0xfe, 0x1f, 0xe5, 0xf3, 0x10, 0x61,
-    0x67, 0x5f, 0x35, 0xdd, 0xa6, 0x8a, 0x86, 0xff, 0xb3, 0xb8, 0x2f, 0xce,
-    0x21, 0xd4, 0xa2, 0x63, 0x8d, 0x3e, 0x43, 0xee, 0x1f, 0x68, 0xb6, 0xf3,
-    0x1b, 0xc1, 0xd7, 0x4b, 0x0e, 0xbf, 0xe9, 0x79, 0x38, 0xed, 0x41, 0x3a,
-    0xff, 0xf3, 0xaf, 0x38, 0x38, 0x9b, 0x13, 0x8e, 0x75, 0xff, 0xdd, 0x1c,
-    0x9b, 0xdd, 0xce, 0x26, 0x8e, 0xbf, 0x6e, 0x28, 0xb4, 0x3a, 0xa1, 0x16,
-    0x18, 0x8e, 0x88, 0x77, 0xfa, 0x3c, 0xfd, 0xf8, 0x18, 0x3a, 0xff, 0xd9,
-    0xed, 0x73, 0x26, 0xea, 0x28, 0x75, 0xff, 0x7c, 0x71, 0xcd, 0xaf, 0x9d,
-    0xfc, 0xea, 0x43, 0xfe, 0xfc, 0xfe, 0xff, 0x4a, 0x39, 0x3c, 0x72, 0x73,
-    0xaf, 0xfe, 0xd6, 0xb0, 0x7d, 0xac, 0x92, 0x74, 0xeb, 0xff, 0xe8, 0x06,
-    0x0f, 0xc7, 0xf7, 0xce, 0xe0, 0x1c, 0xeb, 0x86, 0x73, 0xaa, 0x11, 0xb9,
-    0x86, 0x88, 0x84, 0x2a, 0x17, 0xf6, 0xc7, 0x5f, 0x59, 0x73, 0xaf, 0xff,
-    0xf2, 0x47, 0x9f, 0xaa, 0xeb, 0xb8, 0x3e, 0xf8, 0x09, 0x68, 0xeb, 0x62,
-    0x22, 0x44, 0x4b, 0xef, 0xbb, 0xec, 0x9c, 0xeb, 0xf6, 0x4e, 0xe3, 0xb0,
-    0xeb, 0xff, 0xff, 0xfd, 0x12, 0xf9, 0xee, 0xa4, 0x6b, 0xe6, 0x7e, 0xd8,
-    0xd9, 0xf3, 0x39, 0xcc, 0xd9, 0xfb, 0xf4, 0xeb, 0xee, 0x8b, 0xed, 0x1d,
-    0x58, 0x98, 0x28, 0x91, 0x68, 0xa3, 0xd0, 0x98, 0xbf, 0xff, 0xef, 0xdd,
-    0x8d, 0x27, 0xeb, 0xa7, 0xa3, 0xa9, 0xed, 0x60, 0x4e, 0xb2, 0xac, 0x5b,
-    0x21, 0xe1, 0x80, 0x5c, 0xc2, 0x17, 0x83, 0x09, 0xd7, 0xc3, 0x08, 0xbc,
-    0x8c, 0xf1, 0x44, 0xb6, 0x8e, 0xee, 0x2b, 0xc8, 0x73, 0x2c, 0xb7, 0xb0,
-    0xb1, 0x18, 0x7f, 0x6a, 0x19, 0x5e, 0x8c, 0xaf, 0x6d, 0x06, 0xf9, 0xae,
-    0xed, 0x34, 0x55, 0x17, 0xfb, 0x91, 0xb3, 0x79, 0x67, 0x8e, 0xae, 0x1f,
-    0x17, 0xe5, 0xb7, 0xfe, 0x79, 0x2b, 0x9c, 0x6b, 0xbb, 0x4d, 0x13, 0x5d,
-    0xe5, 0xbf, 0x8e, 0xb2, 0xb8, 0x88, 0x85, 0x91, 0xba, 0x55, 0xfb, 0x8d,
-    0x77, 0x69, 0xa2, 0xac, 0xbf, 0xe8, 0x94, 0x72, 0x78, 0xe4, 0xe7, 0x59,
-    0x5c, 0x3e, 0xc1, 0x33, 0xbf, 0xf2, 0xbd, 0x8d, 0xfd, 0x1d, 0x76, 0x33,
-    0xaf, 0xfe, 0x55, 0xe4, 0xae, 0x71, 0xae, 0xed, 0x34, 0x48, 0x97, 0xee,
-    0x35, 0xdd, 0xa6, 0x8b, 0x4a, 0xff, 0xcf, 0x25, 0x73, 0x8d, 0x77, 0x69,
-    0xa2, 0x7d, 0xb2, 0xb8, 0x7f, 0xab, 0x33, 0xbf, 0xfc, 0xaa, 0xde, 0x4a,
-    0xe7, 0x1a, 0xee, 0xd3, 0x45, 0x09, 0x7e, 0xea, 0x4f, 0x1c, 0x3a, 0xfd,
-    0xc6, 0xbb, 0xb4, 0xd1, 0x47, 0xdf, 0xf4, 0x4a, 0x39, 0x3c, 0x72, 0x73,
-    0xaf, 0xfc, 0x31, 0x34, 0x0c, 0x4d, 0xd8, 0x3a, 0xff, 0xfe, 0xc0, 0xf6,
-    0x3e, 0xab, 0xe1, 0x70, 0x6b, 0x50, 0x02, 0xaf, 0xca, 0xad, 0xe4, 0xac,
-    0x26, 0x57, 0x84, 0xe2, 0x67, 0xe3, 0x9d, 0xb3, 0xca, 0x86, 0xcd, 0x82,
-    0x79, 0xc3, 0x19, 0x19, 0x62, 0x8a, 0x94, 0x8b, 0x06, 0xca, 0x10, 0xde,
-    0x14, 0x28, 0x4f, 0x32, 0x17, 0x61, 0x9c, 0x02, 0x8f, 0x47, 0x05, 0x7f,
-    0x95, 0xce, 0x35, 0xdd, 0xa6, 0x88, 0x8a, 0xfe, 0xce, 0x35, 0xdd, 0xa6,
-    0x88, 0xae, 0xff, 0x98, 0xd5, 0xce, 0x35, 0xdd, 0xa6, 0x8a, 0xe2, 0x95,
-    0x44, 0x03, 0x9c, 0x5f, 0xfe, 0x04, 0x0b, 0x55, 0x7f, 0x03, 0xe8, 0xc8,
-    0xeb, 0xe5, 0x67, 0x99, 0x8c, 0xeb, 0x26, 0xe7, 0xe6, 0x04, 0xbb, 0xec,
-    0xeb, 0xf8, 0xeb, 0xfd, 0x89, 0xc0, 0x03, 0xfd, 0x1d, 0x66, 0x2c, 0x4f,
-    0x4f, 0x44, 0x17, 0xff, 0xf7, 0xb4, 0x9d, 0x74, 0x92, 0x0f, 0xbf, 0xef,
-    0x30, 0xeb, 0xf7, 0x1a, 0xee, 0xd3, 0x45, 0x3d, 0x7f, 0x96, 0x81, 0xfd,
-    0xf9, 0x23, 0xae, 0x5a, 0x1d, 0x50, 0x79, 0x0d, 0x33, 0xbf, 0xff, 0xd2,
-    0x8f, 0x6b, 0xf5, 0xb5, 0x01, 0x19, 0xd4, 0xfd, 0xa7, 0x5f, 0xff, 0xdc,
-    0xe7, 0xfc, 0xe4, 0x0e, 0x28, 0x9d, 0xee, 0x7d, 0x3a, 0xff, 0xe4, 0x96,
-    0x08, 0x21, 0x69, 0xc9, 0x1d, 0x7f, 0xa5, 0x1c, 0x9e, 0x39, 0x39, 0xd7,
-    0xdf, 0x05, 0xe4, 0x75, 0xf9, 0xf3, 0xa8, 0xb3, 0xab, 0x47, 0x8f, 0xb0,
-    0x8a, 0xa1, 0x13, 0xf8, 0xf7, 0x7f, 0xd0, 0x2d, 0xcd, 0x99, 0xed, 0x1d,
-    0x7e, 0x79, 0xe3, 0x9f, 0x9d, 0x4c, 0x25, 0x68, 0x10, 0x59, 0x8b, 0x2d,
-    0x7b, 0xdc, 0x85, 0x18, 0x5d, 0x74, 0x61, 0xc1, 0xb0, 0x87, 0x6c, 0xe2,
-    0xff, 0xf3, 0xc9, 0x50, 0x8b, 0xb3, 0xad, 0x40, 0x0e, 0xbf, 0xfc, 0x00,
-    0x7f, 0xa5, 0x7e, 0x8b, 0xac, 0x60, 0xeb, 0xff, 0x87, 0x00, 0xe2, 0x05,
-    0x56, 0x8b, 0x3a, 0xb8, 0x88, 0xef, 0x26, 0x52, 0xa9, 0xc9, 0x06, 0x12,
-    0xe9, 0x0d, 0x8b, 0x61, 0xd7, 0xe1, 0x8f, 0xd8, 0x3a, 0x3a, 0x82, 0x6e,
-    0xb0, 0x3e, 0xff, 0xe4, 0x0f, 0x1f, 0x75, 0x79, 0xc8, 0x9c, 0xea, 0x54,
-    0xf9, 0xba, 0x41, 0x70, 0x60, 0xeb, 0xff, 0xf7, 0x63, 0x99, 0x24, 0x7f,
-    0x60, 0x53, 0xf6, 0x95, 0x7e, 0x89, 0x03, 0xf9, 0x1d, 0x7c, 0xd7, 0x76,
-    0x9a, 0x2b, 0x3a, 0x98, 0xf5, 0x78, 0x51, 0x7d, 0xe4, 0x5e, 0x8e, 0xbf,
-    0xa7, 0x5c, 0x0c, 0xb4, 0x75, 0xfb, 0x3d, 0xaf, 0xba, 0x3a, 0xf4, 0x4e,
-    0x87, 0x5f, 0xbc, 0x0f, 0xa3, 0x23, 0xaf, 0x7e, 0xfa, 0x3a, 0xff, 0xb2,
-    0x49, 0xfb, 0x1b, 0x00, 0x0b, 0x3a, 0xfd, 0x93, 0x4f, 0xf8, 0x0e, 0xb2,
-    0xb0, 0xa8, 0x84, 0x22, 0xb9, 0x0a, 0x8d, 0xc8, 0xf8, 0x42, 0xb2, 0xde,
-    0x94, 0xb8, 0xd8, 0x94, 0xe8, 0x73, 0xea, 0x05, 0xff, 0xba, 0x9e, 0x7e,
-    0x4f, 0x08, 0x13, 0xaf, 0xde, 0x41, 0xc5, 0x9d, 0x7d, 0x27, 0x15, 0x70,
-    0xf8, 0xb6, 0x8f, 0x6f, 0xfc, 0xf2, 0x57, 0x38, 0xd7, 0x76, 0x9a, 0x24,
-    0x5b, 0xff, 0x3f, 0x95, 0x84, 0xe2, 0x7b, 0xf3, 0xa9, 0x54, 0x44, 0x3a,
-    0x55, 0xfd, 0x9c, 0x6b, 0xbb, 0x4d, 0x16, 0x4d, 0xff, 0xef, 0x6b, 0xee,
-    0x95, 0xc9, 0xd0, 0x65, 0xa3, 0xa9, 0x54, 0x42, 0xe1, 0xc5, 0xff, 0xfe,
-    0x74, 0xf7, 0xfc, 0x7d, 0x2a, 0xde, 0xa7, 0x22, 0x5a, 0x3a, 0xfe, 0xce,
-    0x35, 0xdd, 0xa6, 0x8b, 0x62, 0xff, 0xfe, 0x62, 0xfb, 0xf0, 0x73, 0x9e,
-    0xd7, 0x66, 0xf9, 0xf3, 0xbb, 0x67, 0x5e, 0xe7, 0xfd, 0x3a, 0xef, 0x2b,
-    0x08, 0x88, 0xe3, 0x5d, 0x2a, 0x8e, 0xf4, 0x86, 0x05, 0xec, 0xd6, 0x1d,
-    0x7c, 0xd7, 0x76, 0x9a, 0x2d, 0xbb, 0xed, 0x4e, 0xfc, 0x3a, 0xb8, 0x79,
-    0xfe, 0x2d, 0xbf, 0x93, 0xbe, 0x40, 0x7e, 0x75, 0xff, 0x44, 0xa3, 0x93,
-    0xc7, 0x27, 0x3a, 0xca, 0xc9, 0x1e, 0x38, 0xd3, 0x31, 0x10, 0x96, 0xdf,
-    0xfe, 0xc1, 0x02, 0xab, 0x70, 0xe6, 0x0a, 0x87, 0x5e, 0x61, 0x74, 0x27,
-    0x5e, 0x9f, 0xa8, 0x75, 0xff, 0x98, 0x4c, 0x26, 0x1f, 0xee, 0xe0, 0xc0,
-    0x0e, 0xbf, 0xa0, 0x64, 0x1f, 0xd6, 0x75, 0xf3, 0x5d, 0xda, 0x68, 0xbc,
-    0x2f, 0xfc, 0xfe, 0x8d, 0x9c, 0xe6, 0x6f, 0xa3, 0xab, 0x87, 0xda, 0x25,
-    0xb7, 0xde, 0xdb, 0xce, 0x9d, 0x7e, 0x5c, 0x0c, 0x9c, 0xeb, 0xfd, 0x28,
-    0x1f, 0x6c, 0x76, 0x9d, 0x7f, 0xa3, 0xcf, 0xdf, 0x81, 0x83, 0xaf, 0xfd,
-    0xf5, 0x7b, 0xcb, 0xd8, 0x3e, 0xd1, 0xd7, 0x62, 0x87, 0x54, 0x1e, 0xbe,
-    0x20, 0xdf, 0x24, 0xf8, 0xb3, 0xaf, 0xd8, 0x20, 0xda, 0x83, 0xaf, 0xd1,
-    0xf7, 0xf7, 0xd1, 0xd7, 0xff, 0x2e, 0x1b, 0xf3, 0x07, 0xf9, 0x66, 0x8e,
-    0xbf, 0xff, 0xf3, 0xa7, 0x9d, 0x6e, 0x20, 0x6f, 0x53, 0x92, 0xfb, 0x2c,
-    0x13, 0xab, 0x11, 0x5f, 0xd4, 0x5b, 0xff, 0xb3, 0xbd, 0x79, 0x2d, 0x23,
-    0x92, 0x3a, 0xe8, 0x01, 0xd5, 0x23, 0xd7, 0xf2, 0x15, 0x31, 0x6b, 0x84,
-    0x8c, 0x22, 0x06, 0x28, 0x39, 0x3a, 0x5e, 0x42, 0x6b, 0x72, 0x14, 0x24,
-    0x98, 0x95, 0x66, 0x7d, 0x84, 0x53, 0x90, 0x00, 0x84, 0x4a, 0x35, 0x0d,
-    0x8f, 0x3c, 0xdf, 0xed, 0xd5, 0xc0, 0x3f, 0x34, 0x75, 0xfe, 0x02, 0xb3,
-    0x4a, 0x07, 0xc7, 0x52, 0xa9, 0xaa, 0x44, 0x3b, 0x38, 0x69, 0x79, 0x33,
-    0x73, 0xaf, 0x9a, 0xee, 0xd3, 0x45, 0xe9, 0x7f, 0xe4, 0xf7, 0x45, 0xe4,
-    0x07, 0x01, 0xd5, 0xc3, 0xe9, 0x59, 0x6d, 0xe5, 0xa7, 0x8e, 0xbf, 0xe7,
-    0xf4, 0xa1, 0x4f, 0x24, 0xe7, 0x52, 0xcf, 0x50, 0x46, 0xef, 0xd8, 0xbe,
-    0xb8, 0x4e, 0xa0, 0xa6, 0x83, 0x90, 0x84, 0xfa, 0xed, 0xb4, 0x43, 0x7f,
-    0xff, 0xc9, 0xb3, 0x05, 0x50, 0xe0, 0x7b, 0x8b, 0x5b, 0xcb, 0x04, 0xea,
-    0x55, 0x15, 0x98, 0x8f, 0x50, 0xdb, 0x84, 0x4f, 0x0b, 0xf9, 0x42, 0x5b,
-    0x27, 0x53, 0x5b, 0x0d, 0xb4, 0x94, 0x89, 0x34, 0x60, 0xfc, 0x86, 0x1a,
-    0xe1, 0x51, 0xd2, 0x30, 0x46, 0xa0, 0x31, 0x8c, 0xe9, 0x0f, 0xf9, 0xdc,
-    0x06, 0x65, 0x11, 0xdd, 0xff, 0x4e, 0xbf, 0xfb, 0xf8, 0x98, 0x73, 0x63,
-    0xad, 0x68, 0x75, 0xf6, 0x75, 0xfc, 0x75, 0xfe, 0xc4, 0xe0, 0x01, 0xfe,
-    0x8e, 0xb3, 0x16, 0xa2, 0x26, 0x05, 0x17, 0x44, 0x17, 0xde, 0x8d, 0xe7,
-    0x3a, 0xff, 0xbd, 0xac, 0xde, 0x5d, 0xfd, 0x43, 0xa9, 0x0f, 0x7c, 0x48,
-    0xef, 0xa3, 0x64, 0x48, 0xeb, 0xf7, 0x1a, 0xee, 0xd3, 0x44, 0x47, 0x7f,
-    0xfd, 0xdf, 0xf5, 0xac, 0x58, 0xe6, 0xcf, 0x90, 0xc4, 0x1d, 0x7f, 0xd1,
-    0x3f, 0x33, 0xde, 0x4f, 0x1d, 0x78, 0x63, 0x73, 0xaa, 0x47, 0xa6, 0x13,
-    0x8b, 0xfe, 0xce, 0x66, 0xb1, 0xc6, 0x73, 0xaf, 0x60, 0x56, 0x75, 0xff,
-    0xfe, 0xeb, 0xa7, 0xa3, 0xa3, 0x9e, 0xea, 0x77, 0x11, 0x93, 0xaf, 0xff,
-    0xff, 0x7b, 0xc8, 0xbe, 0x26, 0x6e, 0x3f, 0xfa, 0x3b, 0xf3, 0x62, 0x7a,
-    0x68, 0x3a, 0xa1, 0x1b, 0x38, 0xbb, 0x7f, 0x9d, 0x79, 0xc9, 0x42, 0xce,
-    0xba, 0x75, 0x95, 0x73, 0x2c, 0x95, 0x7f, 0xe5, 0x5b, 0xd4, 0x9b, 0xb1,
-    0x3a, 0xa0, 0x35, 0xec, 0x8b, 0xdf, 0x6c, 0x8f, 0x41, 0xd5, 0x23, 0xfc,
-    0x45, 0xab, 0xfb, 0x1d, 0x79, 0xbf, 0x8e, 0xbf, 0xce, 0xae, 0x93, 0x8e,
-    0x03, 0xac, 0xc6, 0x75, 0xff, 0x46, 0x6f, 0x0f, 0x27, 0x91, 0xd4, 0xc4,
-    0x9e, 0x48, 0x44, 0xef, 0xe6, 0x31, 0xce, 0xbf, 0x8e, 0xbf, 0xa1, 0x4c,
-    0x14, 0x50, 0xeb, 0xfb, 0x3d, 0xb5, 0xec, 0xe9, 0xd5, 0x88, 0x89, 0x12,
-    0xed, 0x16, 0x5f, 0xff, 0xcd, 0x57, 0x8e, 0x29, 0xe5, 0x79, 0x1e, 0x17,
-    0x01, 0xd4, 0xc0, 0x5e, 0xb2, 0x61, 0x42, 0xbe, 0x21, 0x35, 0x22, 0x0c,
-    0x22, 0x69, 0x9e, 0xf0, 0xab, 0x42, 0x29, 0x8d, 0xb9, 0x0f, 0x4e, 0x90,
-    0xbc, 0x37, 0x00, 0x42, 0x25, 0x9a, 0x7b, 0xf4, 0x2c, 0x36, 0x17, 0x5d,
-    0xb5, 0xd3, 0xaf, 0xdc, 0x6b, 0xbb, 0x4d, 0x11, 0x75, 0xfb, 0xc0, 0xfa,
-    0x32, 0x2a, 0xfd, 0xaf, 0x76, 0x00, 0x75, 0xf9, 0xe7, 0x8e, 0x7e, 0x75,
-    0x95, 0x9d, 0x18, 0x98, 0x32, 0xe6, 0x7f, 0x94, 0xed, 0x93, 0xd2, 0xaa,
-    0x89, 0xa5, 0x1e, 0x95, 0xff, 0xcb, 0x79, 0x2b, 0x9c, 0x6b, 0xbb, 0x4d,
-    0x13, 0x35, 0xfc, 0xc3, 0x30, 0xf6, 0x2f, 0x51, 0xe3, 0xaf, 0x6f, 0x1a,
-    0x3a, 0xf3, 0x51, 0x67, 0x5f, 0x30, 0xbc, 0xe2, 0x75, 0xdb, 0x6c, 0x49,
-    0xd7, 0x67, 0xe7, 0x5f, 0xfe, 0xec, 0x2d, 0xfd, 0x9b, 0x81, 0x7f, 0x7a,
-    0x75, 0xf2, 0x4f, 0xf8, 0x9d, 0x7e, 0xc9, 0xf0, 0x13, 0x1d, 0x5f, 0x0f,
-    0x2b, 0xc4, 0x57, 0xfb, 0xe6, 0x0b, 0xf0, 0x1b, 0x67, 0x5f, 0xff, 0x96,
-    0xfd, 0xcd, 0xc1, 0xd6, 0x5f, 0xb3, 0x77, 0xf3, 0xa8, 0x28, 0x8f, 0xc3,
-    0x6b, 0xb5, 0x87, 0x5d, 0xb5, 0xe3, 0xac, 0xc1, 0x3a, 0xc0, 0x83, 0x5b,
-    0xf8, 0xcd, 0xff, 0xff, 0x90, 0x61, 0xa3, 0x0b, 0xf9, 0x1c, 0xe2, 0x6c,
-    0xe3, 0xb8, 0x0e, 0xa6, 0x25, 0x53, 0x9b, 0x47, 0x90, 0x5a, 0x68, 0x4b,
-    0x76, 0x16, 0x6e, 0x44, 0x04, 0x2f, 0x13, 0xdf, 0xcc, 0xc0, 0x8e, 0x78,
-    0xeb, 0xe7, 0xea, 0x4c, 0x75, 0xf7, 0x66, 0x80, 0x9d, 0x58, 0x7d, 0xcd,
-    0x2b, 0x72, 0x1b, 0xfc, 0xd4, 0xc1, 0x0f, 0x60, 0xea, 0x3a, 0xfd, 0xd7,
-    0xf4, 0x80, 0x75, 0xff, 0xef, 0x9d, 0x74, 0xf0, 0x3f, 0x11, 0x79, 0x1d,
-    0x58, 0x8a, 0xb6, 0x98, 0x20, 0x52, 0xc9, 0xef, 0xff, 0xff, 0xff, 0xff,
-    0x31, 0x46, 0x2f, 0x18, 0xa3, 0x09, 0x87, 0xb0, 0xf6, 0xb0, 0x61, 0x87,
-    0x30, 0xb9, 0x3e, 0xd6, 0x7e, 0x16, 0x2b, 0x1b, 0x7b, 0xfd, 0xeb, 0x0a,
-    0x21, 0x84, 0xc6, 0xc3, 0x7b, 0xe7, 0xce, 0xed, 0x9d, 0x7f, 0xfe, 0x06,
-    0xf2, 0xef, 0xf1, 0xc5, 0x7a, 0x8d, 0x7e, 0x1d, 0x7f, 0xf6, 0xec, 0xc7,
-    0x82, 0x8c, 0x7a, 0x85, 0x9d, 0x7f, 0xff, 0xe4, 0x5a, 0x73, 0xbf, 0xea,
-    0x51, 0xb3, 0x90, 0x3e, 0xee, 0x48, 0xeb, 0xff, 0x27, 0x91, 0xa8, 0x1f,
-    0x63, 0x4e, 0xac, 0x47, 0x8f, 0x92, 0x36, 0x9b, 0x6f, 0xbd, 0xb7, 0x9d,
-    0x3a, 0xff, 0xff, 0x38, 0xb4, 0x70, 0x3d, 0xff, 0xe7, 0x62, 0x5c, 0x89,
-    0xce, 0xac, 0x44, 0x37, 0xe4, 0x97, 0xff, 0xf9, 0xd4, 0x1c, 0x07, 0xfa,
-    0xf9, 0x24, 0xec, 0x34, 0x5c, 0xeb, 0xef, 0x27, 0x50, 0xeb, 0xfe, 0x7e,
-    0x4b, 0xe6, 0x34, 0x38, 0x75, 0x30, 0x97, 0x02, 0xe2, 0x32, 0xdc, 0x8d,
-    0x27, 0xb0, 0xb8, 0x72, 0x31, 0x61, 0xfc, 0x82, 0xdc, 0x3a, 0xfe, 0xf6,
-    0x2f, 0x7c, 0x59, 0xd6, 0xee, 0x1b, 0xd4, 0x10, 0xbf, 0xdf, 0x85, 0xe5,
-    0xa4, 0x91, 0xd7, 0xff, 0xe0, 0xa0, 0xcf, 0x9a, 0x47, 0xea, 0xac, 0xb2,
-    0xc9, 0x57, 0xf7, 0xbb, 0x13, 0xf7, 0xf3, 0xaf, 0xed, 0xe5, 0xa0, 0x7f,
-    0x31, 0xd7, 0xfd, 0x3e, 0x00, 0x3f, 0xbf, 0x24, 0x75, 0xe7, 0x76, 0x9a,
-    0x2c, 0xfb, 0xf8, 0x0e, 0x32, 0x45, 0x9d, 0x53, 0xa2, 0x31, 0xa7, 0x40,
-    0x27, 0xbf, 0xf2, 0x76, 0x24, 0x9e, 0x8f, 0x68, 0xeb, 0xff, 0xdc, 0xeb,
-    0xfc, 0xcd, 0x83, 0x9a, 0xc1, 0x3a, 0xff, 0xa1, 0x03, 0x8b, 0x67, 0x3a,
-    0x75, 0xff, 0xda, 0xf2, 0x4c, 0xcb, 0x86, 0x37, 0xd1, 0xd4, 0x88, 0xc7,
-    0x74, 0xaf, 0xcd, 0xef, 0x32, 0xcb, 0x25, 0x5f, 0xf9, 0xe5, 0xa1, 0xc6,
-    0x87, 0x38, 0x52, 0xa5, 0xfd, 0xfb, 0x6b, 0xf5, 0xe0, 0x4e, 0xbf, 0xde,
-    0xee, 0x6c, 0xf9, 0x25, 0x9d, 0x58, 0x7c, 0x5f, 0x95, 0xdf, 0xfb, 0x79,
-    0x0f, 0xe0, 0xf8, 0xd5, 0x80, 0xeb, 0xa1, 0x43, 0xaf, 0xf8, 0x30, 0x30,
-    0x09, 0x75, 0x0e, 0xa8, 0x44, 0x7c, 0xe8, 0x68, 0x2d, 0x7f, 0xba, 0x81,
-    0x17, 0x79, 0x8e, 0xbf, 0xc1, 0xef, 0xee, 0x0d, 0xbc, 0x3a, 0xa0, 0xf9,
-    0xd0, 0xc6, 0xff, 0x90, 0x43, 0xf4, 0x3f, 0xfb, 0x47, 0x5e, 0x81, 0x50,
-    0xea, 0x92, 0xec, 0x48, 0x49, 0x5a, 0x67, 0xba, 0xc4, 0xc5, 0xfc, 0x85,
-    0xea, 0xcc, 0x7b, 0x18, 0x18, 0x13, 0x86, 0x15, 0xda, 0x85, 0x8f, 0xa1,
-    0x2d, 0xb0, 0x83, 0xe9, 0xdd, 0xff, 0x7f, 0xed, 0x0e, 0x4d, 0x0b, 0x3a,
-    0xff, 0x3b, 0x3d, 0x48, 0xe4, 0x1d, 0x4a, 0x1f, 0x57, 0x0e, 0x6f, 0xfd,
-    0xc4, 0xd4, 0xbe, 0xf6, 0x06, 0x0e, 0xbe, 0xe2, 0x42, 0xce, 0xbf, 0xff,
-    0x79, 0x4f, 0xe3, 0x03, 0xdc, 0xd6, 0xf2, 0x8e, 0x9d, 0x5c, 0x45, 0xaa,
-    0xcf, 0x84, 0x82, 0xe7, 0x91, 0xd7, 0xff, 0xff, 0xf0, 0xbb, 0x3e, 0xce,
-    0x8e, 0x7b, 0xf0, 0x2d, 0xe4, 0xe1, 0x81, 0x7e, 0x3c, 0x8e, 0xbf, 0xd9,
-    0xde, 0xff, 0xe7, 0x13, 0xaf, 0x96, 0x93, 0x68, 0xeb, 0x20, 0x51, 0xdd,
-    0x30, 0xaf, 0x21, 0x0a, 0xb3, 0x2b, 0xf7, 0x26, 0xd9, 0x81, 0x3a, 0xff,
-    0xd8, 0xce, 0xd7, 0x33, 0x68, 0x7f, 0x64, 0xea, 0x84, 0xf5, 0x7b, 0x18,
-    0xeb, 0xa4, 0x09, 0x55, 0xff, 0xff, 0xf0, 0x35, 0x98, 0x2a, 0x7d, 0xe0,
-    0xc6, 0x75, 0x5d, 0x0e, 0x4e, 0xbc, 0x59, 0xd7, 0xef, 0xb0, 0x3f, 0x56,
-    0x75, 0x62, 0x2a, 0x3c, 0xfd, 0x7e, 0xd8, 0xfd, 0x8f, 0xa7, 0x5f, 0xff,
-    0x7f, 0xbc, 0xb4, 0x1e, 0xc7, 0x02, 0xee, 0xc9, 0xd5, 0x88, 0x9e, 0x42,
-    0x21, 0x2a, 0xbd, 0xa8, 0x9c, 0xeb, 0xfe, 0x8c, 0x6f, 0x53, 0x63, 0xf0,
-    0xeb, 0xb3, 0xa7, 0x50, 0x9e, 0x6e, 0xd9, 0xc5, 0x49, 0x17, 0x5a, 0x2d,
-    0xf3, 0x4d, 0xee, 0xfe, 0xc9, 0xd7, 0x81, 0xfb, 0x4e, 0xbd, 0xec, 0xfa,
-    0x75, 0xfd, 0x1b, 0xeb, 0xe7, 0x20, 0xeb, 0xc1, 0xfd, 0xa7, 0x5f, 0x04,
-    0x62, 0x47, 0x52, 0x1b, 0xd7, 0x1d, 0xa0, 0xa3, 0x8f, 0x71, 0xe4, 0x1d,
-    0x58, 0xef, 0x5b, 0x2e, 0xc6, 0x9d, 0x7f, 0x71, 0x36, 0x60, 0xe8, 0xeb,
-    0xfb, 0x7f, 0x67, 0x7f, 0x63, 0x3a, 0xfe, 0xe6, 0x77, 0xbf, 0xf8, 0xeb,
-    0xf7, 0x46, 0x33, 0x86, 0x5f, 0xd9, 0xc9, 0xff, 0x70, 0x9a, 0x20, 0xd5,
-    0x4d, 0x2d, 0xb9, 0x3a, 0x27, 0xe4, 0xa7, 0x50, 0x8f, 0xb4, 0x86, 0x8d,
-    0xf9, 0xda, 0x8b, 0x83, 0xaf, 0xe9, 0x74, 0x5f, 0x7f, 0x1d, 0x6c, 0x69,
-    0xe9, 0x09, 0x2d, 0xfa, 0x3d, 0xf1, 0x6c, 0x9d, 0x7f, 0xa4, 0x8b, 0x8e,
-    0xfd, 0x09, 0xd7, 0xff, 0xa3, 0x07, 0x7f, 0x67, 0x12, 0x77, 0x59, 0xd7,
-    0xe7, 0x67, 0xd9, 0xdd, 0x1f, 0xe7, 0x8d, 0x29, 0x80, 0xab, 0x02, 0x05,
-    0x65, 0x19, 0x46, 0x3c, 0x70, 0x98, 0x61, 0x4d, 0x7b, 0x59, 0x23, 0xaf,
-    0xc9, 0xbc, 0x90, 0x4e, 0xbc, 0x9d, 0xc3, 0xae, 0x85, 0xe1, 0xe0, 0x34,
-    0x9a, 0xf8, 0x3a, 0xec, 0x1d, 0x7e, 0x1e, 0x32, 0xf3, 0x9d, 0x58, 0x79,
-    0x2e, 0x43, 0x77, 0xe2, 0x75, 0x42, 0x60, 0xc8, 0xb7, 0xc7, 0x5d, 0x10,
-    0x5e, 0xee, 0x09, 0xd7, 0xfa, 0x68, 0x9d, 0x6f, 0x34, 0x1d, 0x7f, 0xfc,
-    0xea, 0x7a, 0x38, 0x0e, 0x47, 0x85, 0xc0, 0x75, 0xff, 0xfc, 0x2e, 0xa7,
-    0xcf, 0xa2, 0xfe, 0xd2, 0x6f, 0xd4, 0x64, 0xea, 0xc4, 0x7d, 0xb8, 0xd0,
-    0x9a, 0x7e, 0x9d, 0x76, 0xb6, 0x1d, 0x7c, 0x82, 0xe1, 0x3a, 0xff, 0xcb,
-    0xcf, 0x6b, 0xee, 0x9e, 0x58, 0x75, 0xfb, 0x51, 0xcf, 0x41, 0xca, 0x9b,
-    0xfa, 0x0a, 0x25, 0x74, 0xbd, 0x7e, 0xfb, 0x33, 0xbf, 0x0e, 0xbe, 0xee,
-    0x26, 0xc3, 0xaf, 0xed, 0x27, 0x33, 0xfe, 0x1d, 0x7f, 0xff, 0xa2, 0x6f,
-    0x88, 0xdf, 0xf9, 0xaf, 0xfe, 0x2d, 0x3d, 0xd4, 0x3a, 0xb1, 0x3a, 0xf4,
-    0x85, 0x6a, 0xc8, 0xfa, 0x53, 0xe2, 0x2d, 0xa2, 0xdb, 0x96, 0xc5, 0x9a,
-    0x2f, 0xcb, 0xed, 0x73, 0x30, 0xeb, 0xff, 0xa5, 0xef, 0xe5, 0x25, 0xfb,
-    0xd0, 0xb3, 0xaf, 0xf7, 0xb5, 0x13, 0xe6, 0x82, 0x75, 0xdd, 0xc3, 0xaf,
-    0xff, 0xbb, 0x01, 0xc6, 0xfc, 0xc1, 0xc0, 0xf6, 0x0e, 0xbf, 0xf9, 0x30,
-    0x73, 0x35, 0xf2, 0x5a, 0x59, 0xd7, 0xfe, 0x78, 0xde, 0x5f, 0x35, 0xb8,
-    0x60, 0xea, 0x0a, 0x70, 0x1b, 0x90, 0x22, 0x33, 0x19, 0x9c, 0xc2, 0xba,
-    0x4e, 0xf2, 0x1d, 0xe5, 0x23, 0x87, 0x5f, 0xc1, 0x80, 0x73, 0x37, 0x3a,
-    0x95, 0x3c, 0x95, 0x8e, 0x5f, 0xe8, 0x5e, 0x27, 0x26, 0x91, 0xd7, 0x24,
-    0xc7, 0x5f, 0xfe, 0xf4, 0x74, 0x5e, 0x78, 0xe7, 0x1e, 0x47, 0x5e, 0xf2,
-    0x4e, 0x75, 0xf8, 0x0f, 0xbc, 0x4c, 0x75, 0xe1, 0x86, 0x9d, 0x7f, 0xf0,
-    0x52, 0x6e, 0xc7, 0x37, 0x94, 0x70, 0xeb, 0xff, 0xc8, 0x2f, 0xbe, 0xb5,
-    0x9c, 0x0f, 0x70, 0xea, 0xf8, 0x9a, 0x4a, 0x0b, 0x2d, 0x21, 0xc7, 0x04,
-    0xa3, 0x43, 0x5b, 0x48, 0xb6, 0x83, 0xaf, 0x75, 0x3c, 0x75, 0xb6, 0x61,
-    0xaa, 0xfa, 0x1f, 0x50, 0xba, 0x22, 0x15, 0xec, 0x8e, 0xa1, 0x21, 0x65,
-    0xd2, 0x37, 0x8d, 0xec, 0x10, 0x91, 0xbf, 0xec, 0x19, 0x0e, 0x2e, 0x1a,
-    0x75, 0xfb, 0xa9, 0xb3, 0x02, 0x75, 0xff, 0x83, 0x03, 0x83, 0xfc, 0xb3,
-    0x47, 0x5f, 0x9d, 0x69, 0xb5, 0x87, 0x5e, 0xf4, 0x6e, 0x75, 0x61, 0xe2,
-    0x39, 0x45, 0xe8, 0x49, 0x8e, 0xbc, 0x2c, 0x4e, 0xd1, 0xd7, 0xec, 0x9d,
-    0x71, 0xa3, 0xaf, 0xff, 0xfd, 0x1d, 0x45, 0xab, 0x34, 0x9f, 0x9f, 0x7a,
-    0x9b, 0xe9, 0xa9, 0x39, 0xd4, 0x14, 0xf4, 0xd4, 0x35, 0x42, 0x89, 0xa1,
-    0x01, 0xd2, 0x01, 0x1b, 0xd1, 0x1e, 0xd1, 0x3d, 0xfc, 0xfc, 0x8e, 0xfd,
-    0x09, 0xd7, 0xd0, 0x93, 0xc1, 0xd7, 0xcc, 0xbe, 0x68, 0xeb, 0xfe, 0x92,
-    0xde, 0x5e, 0xd4, 0x28, 0x75, 0x41, 0xed, 0x39, 0x0d, 0xed, 0x20, 0x9d,
-    0x7e, 0x16, 0xfc, 0xd6, 0xe7, 0x56, 0x1e, 0x23, 0x8d, 0x53, 0xa6, 0x58,
-    0x02, 0xe1, 0x7a, 0xfd, 0x92, 0xe9, 0xe4, 0x75, 0xe4, 0xea, 0x1d, 0x5b,
-    0x9b, 0x1f, 0x0b, 0xdf, 0x7d, 0xfd, 0xf4, 0x75, 0xfe, 0x97, 0xe3, 0x3e,
-    0x93, 0x73, 0xaf, 0x80, 0x0c, 0xdc, 0xeb, 0xfb, 0x6b, 0xd8, 0xe2, 0xd3,
-    0xaf, 0xfb, 0xf7, 0x90, 0x73, 0x01, 0xa3, 0xaf, 0xf0, 0x13, 0x7d, 0xe5,
-    0x9e, 0x3a, 0xba, 0x7d, 0x9a, 0x38, 0xbf, 0x6f, 0xa5, 0xa3, 0x19, 0xd7,
-    0xff, 0xec, 0xd7, 0xce, 0xba, 0x78, 0x1f, 0x88, 0xbc, 0x8e, 0xa8, 0x44,
-    0x00, 0x95, 0xdf, 0xcf, 0x38, 0x1c, 0x42, 0x75, 0x4c, 0x9f, 0x07, 0x0d,
-    0x7a, 0x45, 0xe8, 0x4d, 0x6c, 0x85, 0x16, 0xd9, 0x0d, 0xfe, 0xfb, 0x0d,
-    0xdb, 0xce, 0x41, 0xd7, 0xf4, 0x75, 0x39, 0x0b, 0x3a, 0xba, 0x7c, 0x3e,
-    0x36, 0xa8, 0x55, 0xdf, 0x92, 0x81, 0x1e, 0x19, 0x37, 0x4d, 0xf9, 0xd6,
-    0x59, 0xd5, 0xb9, 0xa8, 0x60, 0x8c, 0x5f, 0xfd, 0x1c, 0xcd, 0x8f, 0x20,
-    0x66, 0x04, 0xeb, 0xf9, 0xf7, 0x90, 0xc0, 0x4e, 0xbf, 0xe8, 0xde, 0x48,
-    0x2b, 0x7f, 0x1d, 0x4e, 0x7c, 0x62, 0x59, 0x7e, 0x79, 0x64, 0xf0, 0x75,
-    0xff, 0xd1, 0xad, 0x62, 0xfc, 0x30, 0xbd, 0x1d, 0x7f, 0xf2, 0x46, 0x85,
-    0xe5, 0xf3, 0x59, 0xc3, 0xaf, 0xff, 0xf2, 0x6a, 0x7c, 0x67, 0x07, 0xfd,
-    0xa8, 0x57, 0x05, 0xf8, 0x75, 0xfe, 0xde, 0x5a, 0x9a, 0x51, 0x39, 0xd4,
-    0x14, 0xd1, 0x1a, 0x4c, 0x28, 0x5e, 0x43, 0xfd, 0x8e, 0xff, 0xff, 0xdd,
-    0x4d, 0xfd, 0x9b, 0xfb, 0x9c, 0x8f, 0x03, 0xe8, 0xcb, 0xb8, 0x75, 0xf0,
-    0x42, 0xe2, 0x75, 0xff, 0xa5, 0x03, 0xee, 0x26, 0xcc, 0x09, 0xd7, 0xfe,
-    0x7e, 0xb5, 0x1f, 0xe6, 0x9f, 0xa7, 0x5f, 0xdd, 0x71, 0xde, 0x48, 0x75,
-    0xff, 0xfb, 0x43, 0xf3, 0xae, 0x9e, 0x07, 0xe2, 0x2f, 0x23, 0xaf, 0xf7,
-    0x51, 0x4d, 0xbf, 0xf8, 0xa1, 0xd7, 0xfd, 0x0c, 0xaf, 0xb0, 0x83, 0x39,
-    0xd7, 0xff, 0xc3, 0x9a, 0xc5, 0xc3, 0x73, 0xc9, 0xcc, 0x3a, 0xd8, 0xd4,
-    0x5e, 0x78, 0xe7, 0x61, 0xc5, 0xfd, 0x3e, 0x71, 0x1b, 0x07, 0x5f, 0x08,
-    0x61, 0x67, 0x5f, 0xff, 0x7e, 0x3e, 0xd7, 0x52, 0x61, 0x85, 0xbc, 0x8e,
-    0xbe, 0xc1, 0xfd, 0xce, 0xa5, 0x9f, 0x7e, 0xc4, 0xfb, 0xf9, 0xc1, 0x81,
-    0x79, 0x1d, 0x50, 0x8d, 0xec, 0x84, 0x7a, 0x12, 0x52, 0x26, 0x79, 0xd8,
-    0xc2, 0xaa, 0x17, 0x97, 0xe7, 0x26, 0x0c, 0x29, 0xb2, 0x36, 0x46, 0xa5,
-    0xa3, 0x7c, 0xc4, 0x1d, 0x3e, 0x73, 0xe0, 0x16, 0x0c, 0x62, 0x3e, 0x8d,
-    0xce, 0xff, 0xec, 0x10, 0x66, 0x73, 0x5e, 0x8c, 0x3a, 0xff, 0xb7, 0xf6,
-    0x71, 0x27, 0x75, 0x9d, 0x6c, 0x01, 0xfc, 0x8a, 0x05, 0xe6, 0x0c, 0x90,
-    0xeb, 0xe8, 0x17, 0x91, 0xd7, 0xec, 0x63, 0x71, 0x07, 0xc3, 0x7d, 0xc1,
-    0xfb, 0xfb, 0x67, 0x52, 0x39, 0xa3, 0xaf, 0xfd, 0xd4, 0x58, 0x72, 0x68,
-    0xce, 0x1d, 0x7d, 0x00, 0x75, 0x9d, 0x7a, 0x06, 0x58, 0x7b, 0xa2, 0x7b,
-    0x7c, 0xde, 0xa4, 0xc7, 0x5f, 0xff, 0x87, 0x14, 0x51, 0x03, 0xd4, 0x9b,
-    0xa9, 0xbf, 0x8e, 0xa8, 0x3f, 0x9c, 0x22, 0xbc, 0xd7, 0xe1, 0xd7, 0xed,
-    0x36, 0x38, 0xa1, 0xd5, 0xd3, 0xc3, 0x00, 0xdd, 0xfe, 0xc9, 0x62, 0x07,
-    0xa8, 0x75, 0xff, 0xd9, 0xbf, 0xb4, 0x83, 0x00, 0x75, 0x9d, 0x7a, 0x4b,
-    0xe9, 0xd5, 0x39, 0xef, 0x79, 0x0a, 0xf9, 0x14, 0x46, 0x4e, 0xac, 0x3c,
-    0x51, 0x23, 0xbb, 0xe6, 0x1d, 0x7d, 0xa1, 0x85, 0x9d, 0x50, 0x6d, 0xf7,
-    0x17, 0xbe, 0xce, 0xc9, 0x67, 0x54, 0x2b, 0xca, 0x93, 0x26, 0x20, 0xa9,
-    0x08, 0xbe, 0xc2, 0xa5, 0xd8, 0xc4, 0x8b, 0x50, 0xd3, 0xfd, 0x5f, 0x6c,
-    0x86, 0xf0, 0x56, 0xd3, 0xad, 0xd3, 0xae, 0xd4, 0x8e, 0xa0, 0x1a, 0x6f,
-    0xc4, 0x2f, 0xe9, 0xe6, 0x93, 0x0b, 0x93, 0x9d, 0x79, 0xf3, 0x87, 0x5e,
-    0x1c, 0xf1, 0xd5, 0xd3, 0x68, 0x23, 0x57, 0x78, 0x4e, 0xbd, 0x1b, 0xe8,
-    0xeb, 0xe4, 0x19, 0x61, 0xd7, 0xa7, 0x71, 0x3a, 0x82, 0x7a, 0xcb, 0x1c,
-    0xf0, 0xfd, 0xfb, 0x3d, 0xd4, 0xf1, 0xd7, 0xe7, 0xdf, 0x37, 0xf1, 0xd6,
-    0x53, 0xa7, 0x9d, 0xe2, 0x6b, 0x93, 0x87, 0x5f, 0xd3, 0xfc, 0x9d, 0xdf,
-    0xa7, 0x53, 0x12, 0x9e, 0xfc, 0x34, 0xc8, 0x83, 0x1a, 0xd1, 0xf7, 0xa5,
-    0x2e, 0x2b, 0x7f, 0xd8, 0x10, 0xa6, 0xf9, 0xbf, 0x8e, 0xbe, 0x68, 0xc4,
-    0x8e, 0xae, 0x9e, 0xcb, 0x9c, 0xdf, 0xe8, 0xcf, 0x47, 0x5c, 0x27, 0x54,
-    0xe7, 0xa2, 0x12, 0x1b, 0xff, 0x83, 0x01, 0xe4, 0x79, 0x1a, 0x81, 0x3a,
-    0xfa, 0x68, 0xda, 0x91, 0xd7, 0xf7, 0x9a, 0x10, 0xaf, 0x87, 0x5f, 0xf4,
-    0xda, 0xd8, 0xe3, 0x3f, 0xe1, 0x3a, 0xfb, 0x3d, 0x8b, 0x3a, 0xe1, 0x50,
-    0xeb, 0x69, 0xcd, 0xb7, 0xe4, 0x17, 0xf7, 0x7f, 0x9e, 0x6e, 0xa1, 0xd7,
-    0xc2, 0x39, 0xe3, 0xaa, 0x13, 0xa1, 0x09, 0x1e, 0x21, 0x28, 0x4a, 0x85,
-    0xd3, 0x39, 0xf4, 0x9f, 0xc6, 0x17, 0xf7, 0xc9, 0xa3, 0xc3, 0xb0, 0xeb,
-    0xff, 0xc3, 0x1b, 0x39, 0x1c, 0xc4, 0xec, 0x04, 0xeb, 0xc2, 0xeb, 0x3a,
-    0xa4, 0x89, 0x3c, 0x31, 0x44, 0x8b, 0x2a, 0xc4, 0xbb, 0xd3, 0xf6, 0x01,
-    0xeb, 0x0f, 0x1c, 0x62, 0xa3, 0x71, 0x2a, 0x5e, 0x78, 0x77, 0xca, 0x1b,
-    0x01, 0x9c, 0x46, 0xc9, 0xe3, 0xf5, 0x23, 0x4b, 0x6c, 0xaa, 0xdd, 0xe5,
-    0x20, 0xa4, 0x62, 0x73, 0x4b, 0x0a, 0xe4, 0x6d, 0x6b, 0x8c, 0xdf, 0xb3,
-    0xdf, 0x6f, 0x29, 0x30, 0x11, 0xd3, 0x30, 0x5b, 0x86, 0x58, 0x8e, 0xa7,
-    0xb0, 0xbd, 0x39, 0xff, 0xfc, 0x27, 0x59, 0x42, 0xdb, 0x94, 0x03, 0xf6,
-    0x55, 0x8e, 0xd4, 0x60, 0x94, 0xab, 0xbf, 0xc6, 0xed, 0xbd, 0x8f, 0xbf,
-    0xfc, 0xaa, 0xde, 0x4a, 0xe7, 0x1a, 0xee, 0xd3, 0x44, 0xd9, 0x7f, 0x95,
-    0xce, 0x35, 0xdd, 0xa6, 0x8a, 0xb6, 0xff, 0x4a, 0x5f, 0xf8, 0x62, 0x47,
-    0x5f, 0x67, 0x5f, 0xc7, 0x59, 0x8b, 0xc3, 0xd3, 0x13, 0x3b, 0xfe, 0xc1,
-    0xc5, 0xc4, 0xbf, 0xe1, 0xd7, 0xfb, 0x98, 0xd8, 0x07, 0xd5, 0x9d, 0x7f,
-    0xd1, 0xd8, 0x9f, 0x91, 0x81, 0x3a, 0x9a, 0x8a, 0x2e, 0x1b, 0xf4, 0xd2,
-    0xfd, 0x1c, 0x5f, 0x42, 0x75, 0xe0, 0xe0, 0x9d, 0x79, 0xdd, 0xa6, 0x8a,
-    0xd2, 0xfc, 0xa6, 0xfa, 0xff, 0x73, 0xa9, 0xa7, 0xa6, 0x84, 0xf7, 0xff,
-    0x93, 0xd2, 0x86, 0xf5, 0x3d, 0xa7, 0xdc, 0xea, 0xe1, 0xf5, 0x6c, 0x21,
-    0xbf, 0xfd, 0xd4, 0x5c, 0x37, 0x17, 0x83, 0xed, 0xb3, 0xaf, 0xff, 0x9b,
-    0x1c, 0xc0, 0x3a, 0xde, 0x50, 0x8d, 0x3a, 0xff, 0xfa, 0x5a, 0xc1, 0x85,
-    0xbe, 0x7b, 0xd0, 0xb3, 0xae, 0xf7, 0xa1, 0x13, 0x0e, 0x99, 0x7f, 0xff,
-    0xfa, 0x36, 0x27, 0xb5, 0x8a, 0x37, 0xa9, 0xec, 0x98, 0x61, 0x73, 0xe3,
-    0x27, 0x5f, 0xe8, 0xf3, 0xf7, 0xe0, 0x60, 0xeb, 0xe9, 0x79, 0x27, 0x3a,
-    0xfd, 0xf7, 0xc3, 0x00, 0x3a, 0xb7, 0x3c, 0xad, 0x84, 0x57, 0xf9, 0xe5,
-    0xe4, 0x9f, 0xa8, 0x75, 0x41, 0xeb, 0xa1, 0x2d, 0xfb, 0x3a, 0x98, 0xb3,
-    0xaf, 0xfe, 0x17, 0x46, 0xf5, 0xff, 0x9f, 0x88, 0x75, 0x4e, 0x7d, 0x1d,
-    0x25, 0xbf, 0xd2, 0x8e, 0x4f, 0x1c, 0x9c, 0xeb, 0xd9, 0xc0, 0x1d, 0x7e,
-    0x9b, 0x02, 0xb6, 0x33, 0xaf, 0xe1, 0x86, 0x77, 0x96, 0x8e, 0xa4, 0x3f,
-    0x49, 0x86, 0xf6, 0x8a, 0xea, 0x11, 0xb5, 0x90, 0xa8, 0xbf, 0xff, 0xff,
-    0xb1, 0x1b, 0x9e, 0x81, 0xf6, 0xbe, 0x42, 0x07, 0x17, 0xf3, 0x90, 0x92,
-    0x7d, 0x1d, 0x7f, 0x67, 0x9c, 0x41, 0xf9, 0xd7, 0xf7, 0x7e, 0x24, 0xee,
-    0x27, 0x5f, 0xe8, 0x5e, 0x82, 0x2e, 0xc9, 0xd5, 0x24, 0x46, 0x61, 0x60,
-    0x97, 0x59, 0x56, 0x12, 0xfb, 0x44, 0x43, 0x36, 0x73, 0x00, 0x93, 0xe4,
-    0x35, 0xda, 0x48, 0x90, 0xe2, 0xe1, 0x6a, 0xde, 0xbb, 0x0d, 0x47, 0x84,
-    0x40, 0xc3, 0xf7, 0x44, 0xde, 0x8c, 0x4e, 0xfd, 0xc6, 0xbb, 0xb4, 0xd1,
-    0x60, 0x5f, 0x9d, 0xbf, 0x7b, 0x31, 0xd6, 0x57, 0x0f, 0x77, 0x46, 0x77,
-    0xee, 0x35, 0xdd, 0xa6, 0x89, 0xd6, 0xff, 0xff, 0x76, 0x27, 0x0e, 0x2d,
-    0x5d, 0x6b, 0x3a, 0x9a, 0xfe, 0x73, 0xaf, 0xca, 0xad, 0xe4, 0xae, 0x22,
-    0x5e, 0x63, 0x3b, 0xca, 0x42, 0xce, 0xbe, 0x76, 0xfd, 0x59, 0xd7, 0xa5,
-    0xa5, 0x54, 0x37, 0xfb, 0x07, 0x2f, 0xdc, 0x6b, 0xbb, 0x4d, 0x16, 0xcd,
-    0xff, 0xfe, 0x79, 0x2b, 0xa8, 0x4c, 0x0a, 0x66, 0xb3, 0xc3, 0x07, 0x5f,
-    0xf8, 0x11, 0xa5, 0x7a, 0x8d, 0x7e, 0x1d, 0x7f, 0xd1, 0x28, 0xe4, 0xf1,
-    0xc9, 0xce, 0xb2, 0xb8, 0x98, 0x32, 0xcc, 0xdd, 0x70, 0x4f, 0xaf, 0xff,
-    0xce, 0x00, 0x7f, 0xa5, 0x73, 0x8f, 0xae, 0xbc, 0x8e, 0xbe, 0x6b, 0xbb,
-    0x4d, 0x17, 0x35, 0x96, 0x75, 0x70, 0xde, 0xb2, 0x5b, 0x7f, 0xb8, 0x39,
-    0xb8, 0x12, 0x47, 0x5d, 0x32, 0xce, 0xa3, 0xac, 0xae, 0x1f, 0xaa, 0x11,
-    0x32, 0x65, 0xb6, 0x2f, 0x7e, 0xe3, 0x5d, 0xda, 0x68, 0xbb, 0xef, 0xf4,
-    0x95, 0xd7, 0x38, 0x8c, 0x9d, 0x65, 0x70, 0xfa, 0x1c, 0xce, 0xf9, 0x55,
-    0x02, 0x03, 0xaa, 0x1f, 0x3a, 0x07, 0x2d, 0xff, 0x93, 0x4d, 0x77, 0x57,
-    0x49, 0xff, 0xae, 0x46, 0x94, 0xb8, 0x5f, 0xbc, 0x20, 0x41, 0x19, 0xe8,
-    0xa1, 0x6a, 0x30, 0x8f, 0x42, 0xb7, 0xe9, 0x3d, 0xff, 0x99, 0x71, 0x9f,
-    0x48, 0x3b, 0xc8, 0xeb, 0xff, 0xb2, 0x7c, 0x67, 0xb9, 0xac, 0x41, 0x3a,
-    0xe4, 0x57, 0xa8, 0x81, 0x13, 0xfb, 0xf6, 0xb4, 0xb7, 0x91, 0xd7, 0xff,
-    0xff, 0xfe, 0xea, 0x75, 0x20, 0x7c, 0x2e, 0xa6, 0x7b, 0xff, 0x27, 0xb5,
-    0xd4, 0xe4, 0x4e, 0xfc, 0x69, 0xd7, 0x6a, 0x0e, 0xbf, 0xfb, 0x76, 0xfe,
-    0xfb, 0xfb, 0x30, 0x54, 0x3a, 0xf0, 0xba, 0xb0, 0x98, 0xd3, 0x49, 0xf5,
-    0x09, 0x8f, 0x0a, 0xde, 0xfd, 0xd6, 0x75, 0xfb, 0x36, 0xbd, 0x0a, 0x1d,
-    0x6d, 0xa3, 0xaa, 0x73, 0x7b, 0x85, 0x55, 0xc3, 0xfa, 0x15, 0x9b, 0xff,
-    0x69, 0xd4, 0xea, 0x40, 0xff, 0x07, 0x5f, 0xfb, 0xaf, 0xe7, 0xee, 0xf2,
-    0xcf, 0x1d, 0x58, 0x7f, 0x68, 0x7b, 0x73, 0x80, 0xeb, 0xff, 0xff, 0xc2,
-    0xec, 0x8e, 0x7b, 0xd9, 0x3c, 0x0b, 0xa9, 0xa5, 0xc6, 0x08, 0x4e, 0xbd,
-    0x9f, 0x74, 0x75, 0x62, 0x29, 0xb8, 0x2b, 0xb4, 0xe9, 0x7f, 0xbb, 0x81,
-    0x4d, 0x9c, 0xc3, 0xaf, 0x3b, 0xb4, 0xd1, 0x2b, 0xdf, 0xe5, 0x1c, 0x41,
-    0xec, 0xe9, 0xd4, 0xd3, 0xd9, 0x42, 0x7b, 0xff, 0xde, 0xee, 0x49, 0xbd,
-    0x40, 0xc0, 0xf8, 0xea, 0x92, 0x3d, 0x79, 0x08, 0xc1, 0x21, 0xba, 0x53,
-    0x9d, 0x7f, 0x7f, 0xbf, 0xbb, 0x00, 0x3a, 0xff, 0xc2, 0xec, 0x87, 0xb1,
-    0x3e, 0x32, 0x75, 0xff, 0xfb, 0x10, 0x18, 0xb4, 0xf6, 0xa1, 0x6f, 0xbf,
-    0x8e, 0xbf, 0xe8, 0x5f, 0xb2, 0x69, 0x27, 0x8e, 0xa9, 0x22, 0x2f, 0xca,
-    0x77, 0xdf, 0xbf, 0x24, 0x75, 0xff, 0x43, 0x46, 0x27, 0x03, 0xf8, 0xeb,
-    0xff, 0xfc, 0x9e, 0x75, 0xb8, 0x83, 0xac, 0xb8, 0xce, 0xd4, 0x9c, 0xea,
-    0x0a, 0x2e, 0x50, 0x89, 0xcd, 0xef, 0xfb, 0xf0, 0x2d, 0xe5, 0xae, 0x04,
-    0xeb, 0xff, 0xfd, 0x88, 0x3e, 0xc1, 0xf8, 0x2e, 0x18, 0x19, 0xe3, 0x87,
-    0x5b, 0x3c, 0x89, 0x7d, 0x87, 0x57, 0xfd, 0xb8, 0x33, 0x99, 0x9e, 0xd1,
-    0xd4, 0x15, 0x59, 0xb9, 0x0c, 0xae, 0xc3, 0x70, 0x61, 0x8b, 0xf4, 0xaa,
-    0xff, 0xde, 0x79, 0x6b, 0xb1, 0xcf, 0xa1, 0x3a, 0xff, 0xef, 0x26, 0xc4,
-    0xf4, 0xd2, 0x81, 0xf1, 0xd7, 0xff, 0x9f, 0x25, 0xdc, 0x41, 0xc0, 0x6d,
-    0xe1, 0xd7, 0x9e, 0x4a, 0xc2, 0xf7, 0xc4, 0xa1, 0x38, 0x18, 0x63, 0x64,
-    0x64, 0xeb, 0x34, 0x11, 0x7d, 0x4a, 0xfc, 0xf2, 0xdf, 0xd4, 0x0d, 0xa4,
-    0x5b, 0xff, 0xd9, 0xd5, 0x47, 0x02, 0x83, 0xec, 0xe9, 0xd7, 0xbd, 0x01,
-    0x2a, 0xff, 0xf7, 0x5d, 0x3d, 0x12, 0x4e, 0x4f, 0xf8, 0x0a, 0xbf, 0xce,
-    0xd5, 0x43, 0xc6, 0x0a, 0xb0, 0x7c, 0xba, 0x1b, 0xb2, 0xa1, 0x65, 0x61,
-    0x36, 0x34, 0x85, 0xcf, 0xe2, 0xfa, 0x17, 0x3b, 0x21, 0x59, 0x7f, 0xf9,
-    0x55, 0xbc, 0x95, 0xce, 0x35, 0xdd, 0xa6, 0x89, 0x86, 0xff, 0xfe, 0xcd,
-    0x8e, 0x1e, 0xc2, 0xbe, 0xee, 0x07, 0xff, 0x68, 0xeb, 0xff, 0xdc, 0x70,
-    0x2a, 0xa7, 0xa4, 0xcc, 0x6a, 0x47, 0x5d, 0x8a, 0x8a, 0x2a, 0xfe, 0xaf,
-    0x5f, 0xfc, 0xc5, 0xe6, 0xf2, 0xfd, 0xfc, 0x31, 0x23, 0xaf, 0xd8, 0xbf,
-    0x9b, 0xb1, 0x9d, 0x7f, 0x42, 0xf0, 0x11, 0xb0, 0xea, 0x09, 0xed, 0x74,
-    0xb6, 0xff, 0x73, 0x1b, 0x00, 0xfa, 0xb3, 0xaf, 0xdd, 0x80, 0xa2, 0x87,
-    0x52, 0x1f, 0xef, 0x08, 0xb6, 0x8d, 0x2f, 0xf4, 0x3c, 0xfe, 0x51, 0xf8,
-    0x75, 0xf9, 0xf9, 0x27, 0x59, 0xd4, 0x27, 0xb3, 0xf9, 0x9d, 0xfe, 0xd4,
-    0x60, 0x87, 0xb0, 0x75, 0xfd, 0x18, 0x21, 0xec, 0x1d, 0x7b, 0xfe, 0x4d,
-    0xf0, 0xf6, 0xb4, 0x61, 0x7f, 0xfb, 0x89, 0xfe, 0x29, 0x9e, 0xfe, 0x37,
-    0x09, 0xd7, 0xff, 0xe4, 0xe7, 0x5f, 0xe0, 0x72, 0x5d, 0x8d, 0x81, 0x83,
-    0xaf, 0xf9, 0x9f, 0xbd, 0x86, 0xf5, 0x26, 0x3a, 0xfb, 0xf5, 0xe0, 0x4e,
-    0xb6, 0x6e, 0x7b, 0xdb, 0x47, 0x94, 0xd4, 0xd9, 0x38, 0x71, 0xd4, 0xc1,
-    0x85, 0xad, 0xfc, 0xb8, 0xc1, 0xf6, 0xd9, 0xd6, 0xd1, 0xd7, 0xe8, 0xc1,
-    0xf6, 0xd9, 0xd7, 0xf7, 0x53, 0xda, 0x7d, 0xfe, 0x1f, 0x34, 0xc5, 0xcb,
-    0x10, 0xbf, 0xd2, 0xf4, 0x2f, 0x60, 0x24, 0x75, 0xff, 0xfe, 0x67, 0x6b,
-    0xd9, 0xdf, 0x83, 0x93, 0xa6, 0x0e, 0xf2, 0xd1, 0xd7, 0xe6, 0x7d, 0x9d,
-    0x69, 0xd6, 0x1c, 0x44, 0x73, 0xb3, 0x5f, 0xfe, 0xf0, 0xb8, 0x3b, 0x88,
-    0x1f, 0xfd, 0xa3, 0xaf, 0xfa, 0x27, 0xfb, 0x2e, 0xfe, 0xf3, 0x9d, 0x50,
-    0x88, 0x6e, 0x24, 0xdf, 0xfd, 0x9b, 0xcb, 0xe7, 0x5d, 0xb0, 0x21, 0x3a,
-    0xfe, 0xd9, 0xf7, 0xc3, 0x00, 0x3a, 0xff, 0xf4, 0x78, 0x11, 0x2c, 0xdf,
-    0xd3, 0xfe, 0xc9, 0xd5, 0x07, 0xfa, 0x86, 0x17, 0xf3, 0x83, 0x9c, 0x4e,
-    0x1d, 0x7b, 0xdf, 0x30, 0xea, 0x01, 0xe4, 0xfd, 0x2c, 0xbf, 0xb4, 0x8a,
-    0x2d, 0xfc, 0x75, 0xff, 0xff, 0xb9, 0x9b, 0x20, 0x7d, 0xf3, 0xe8, 0xc7,
-    0x5d, 0x3d, 0x1e, 0xd1, 0xd7, 0xf0, 0xe6, 0xbe, 0x35, 0x84, 0x75, 0x6e,
-    0x8c, 0xde, 0x16, 0xec, 0x6e, 0xbe, 0xf9, 0xb3, 0x6a, 0x73, 0xab, 0x0f,
-    0x75, 0x43, 0x3b, 0x31, 0x9d, 0x77, 0xb0, 0xeb, 0xff, 0xcc, 0x11, 0x85,
-    0xba, 0x75, 0xfd, 0xd8, 0x3a, 0xa0, 0xf7, 0xff, 0x15, 0xbf, 0xdd, 0x49,
-    0x9d, 0xba, 0x91, 0xd7, 0xfa, 0x07, 0xce, 0xb4, 0xf1, 0xd7, 0xfd, 0x89,
-    0x8b, 0x1c, 0x9d, 0xce, 0xbf, 0x47, 0xb4, 0x0f, 0xce, 0xa6, 0x25, 0x35,
-    0x4c, 0x72, 0x69, 0x17, 0x4c, 0xc4, 0xc3, 0xc6, 0xb7, 0xff, 0xee, 0x8e,
-    0x7b, 0xa9, 0x9b, 0xfb, 0x36, 0x46, 0x8e, 0xbf, 0xf9, 0xc7, 0xb0, 0x81,
-    0x4d, 0x64, 0x8e, 0xbd, 0x00, 0xfa, 0x75, 0xfd, 0x9b, 0x3a, 0x80, 0x98,
-    0xea, 0xc4, 0x70, 0xba, 0xa8, 0xa0, 0x68, 0x76, 0xf7, 0xd0, 0xe1, 0xd7,
-    0x98, 0x3a, 0x61, 0x1d, 0x4e, 0x78, 0x3a, 0x1d, 0xbf, 0xc2, 0xec, 0xc7,
-    0xb2, 0x73, 0xac, 0xab, 0x09, 0x98, 0x23, 0x11, 0x90, 0x06, 0x11, 0x59,
-    0x1f, 0x03, 0x61, 0x51, 0xba, 0xac, 0xd0, 0xc3, 0xe4, 0x2b, 0x16, 0x45,
-    0xd8, 0x61, 0x01, 0xa4, 0x63, 0x4e, 0xd4, 0x6e, 0xde, 0x8c, 0xf3, 0xf7,
-    0xbd, 0xb2, 0x1b, 0xff, 0xee, 0x26, 0xf2, 0xd2, 0x7b, 0xb1, 0xcf, 0x41,
-    0xd7, 0xee, 0x35, 0xdd, 0xa6, 0x8a, 0xba, 0xf7, 0x21, 0x67, 0x5f, 0xf4,
-    0x95, 0xce, 0x35, 0xdd, 0xa6, 0x88, 0xf2, 0xff, 0xa2, 0x51, 0xc9, 0xe3,
-    0x93, 0x9d, 0x7f, 0xe8, 0xf2, 0x7e, 0xc1, 0xc9, 0x4f, 0x31, 0xd6, 0x54,
-    0x29, 0xaf, 0xe2, 0x7f, 0x0c, 0xdc, 0x6c, 0x51, 0x74, 0x73, 0x7e, 0xe3,
-    0x5d, 0xda, 0x68, 0xb0, 0x6f, 0x29, 0x13, 0x9d, 0x7f, 0xff, 0x0f, 0xef,
-    0x3a, 0xf3, 0x6f, 0xfe, 0x67, 0x25, 0xf6, 0x47, 0x5f, 0xb0, 0x73, 0xda,
-    0x3a, 0xff, 0x71, 0xd7, 0xf7, 0x8f, 0xb9, 0xd6, 0x57, 0x13, 0x0c, 0x50,
-    0xcd, 0xa3, 0xae, 0xc5, 0xf4, 0x96, 0xff, 0x2b, 0x9c, 0x6b, 0xbb, 0x4d,
-    0x16, 0x55, 0xfb, 0x8d, 0x77, 0x69, 0xa2, 0xd3, 0xbf, 0xe7, 0x0f, 0x5e,
-    0x6e, 0xa2, 0xce, 0xb2, 0xb8, 0x7d, 0x6b, 0x33, 0xbf, 0x30, 0xf6, 0x28,
-    0xc4, 0xb1, 0x2c, 0x03, 0xaf, 0xf9, 0x85, 0xd4, 0x64, 0x2e, 0xed, 0x3a,
-    0xfc, 0xc3, 0xd8, 0xbd, 0x64, 0x1d, 0x7f, 0xbe, 0xaf, 0x3d, 0xa4, 0xd1,
-    0xd6, 0x43, 0xa9, 0x84, 0x78, 0x7b, 0x66, 0x97, 0xff, 0xf2, 0x75, 0xc7,
-    0xd2, 0xce, 0x64, 0x08, 0xe7, 0x8e, 0xbf, 0x6c, 0x70, 0xe2, 0xce, 0xbe,
-    0x5c, 0x6f, 0xa3, 0xaa, 0x48, 0x9f, 0xc5, 0x59, 0x8a, 0x2f, 0xdf, 0x39,
-    0xcf, 0xfa, 0x75, 0xf9, 0x14, 0x81, 0x69, 0xd6, 0xcd, 0x1e, 0x8f, 0x8a,
-    0xef, 0xff, 0x85, 0xbd, 0x4e, 0xa7, 0x22, 0x66, 0x73, 0xa7, 0x5f, 0xf9,
-    0x6b, 0x79, 0x6d, 0xff, 0xd4, 0xe1, 0xd7, 0xe7, 0xd7, 0xa0, 0x27, 0x54,
-    0x1f, 0x47, 0xe8, 0x55, 0x08, 0xd9, 0xec, 0x2d, 0xef, 0xa3, 0xec, 0x74,
-    0xeb, 0xe6, 0xbb, 0xb4, 0xd1, 0x6e, 0x5f, 0x4d, 0x01, 0xc3, 0xaf, 0xfd,
-    0x9c, 0xc1, 0xf9, 0xdc, 0xdd, 0x93, 0xaf, 0xc2, 0x07, 0xdf, 0x47, 0x54,
-    0x1f, 0x3b, 0xa0, 0x56, 0xe8, 0xf7, 0xe1, 0x13, 0x96, 0xea, 0x11, 0x17,
-    0xf9, 0xc4, 0x13, 0x0c, 0x2c, 0xeb, 0xcb, 0x14, 0x3a, 0xc2, 0x75, 0xff,
-    0x77, 0xf7, 0xd6, 0x60, 0xa8, 0x75, 0xfb, 0x4f, 0xbb, 0x84, 0xeb, 0x20,
-    0x4f, 0x7f, 0xc7, 0x15, 0x08, 0xaf, 0xc1, 0xae, 0xb7, 0x5f, 0xf4, 0x38,
-    0xf7, 0x30, 0x5a, 0x75, 0xfe, 0xf7, 0x92, 0x75, 0xc0, 0x9d, 0x52, 0x3e,
-    0x6c, 0x34, 0xbf, 0xe8, 0x1f, 0xd7, 0x1a, 0xf2, 0x1d, 0x7c, 0x18, 0xce,
-    0x1d, 0x7e, 0xf9, 0xbe, 0x91, 0x43, 0xac, 0xf3, 0x9e, 0x5e, 0xe4, 0x17,
-    0xff, 0x4b, 0x3a, 0x9c, 0x0f, 0x60, 0x5a, 0x75, 0xfe, 0xde, 0x50, 0x3e,
-    0xc0, 0x1d, 0x7d, 0xa0, 0x27, 0x8e, 0xa7, 0x45, 0xf6, 0x8a, 0x7f, 0x42,
-    0xfa, 0x65, 0x7f, 0xf7, 0x90, 0x11, 0x20, 0xf6, 0x05, 0xa7, 0x5f, 0xde,
-    0x96, 0x73, 0x34, 0x75, 0x1d, 0x7b, 0xf7, 0xf1, 0xd7, 0x7f, 0x07, 0x54,
-    0x8d, 0x97, 0x87, 0x28, 0xeb, 0xed, 0xda, 0x9c, 0x3a, 0xf4, 0x2d, 0x5c,
-    0x44, 0x4e, 0xe7, 0x8b, 0x21, 0xf0, 0x55, 0x42, 0x68, 0xd8, 0x84, 0x90,
-    0xb5, 0xbc, 0x3e, 0xdb, 0x3a, 0xf7, 0xc6, 0x03, 0x00, 0xeb, 0xfe, 0x92,
-    0xb9, 0xc6, 0xbb, 0xb4, 0xd1, 0x43, 0xd2, 0x22, 0x26, 0x61, 0xe7, 0x26,
-    0xbf, 0x02, 0x1b, 0x8b, 0x3a, 0xfa, 0x26, 0xc0, 0x9d, 0x5c, 0x3c, 0x7d,
-    0x13, 0x5f, 0xf6, 0x40, 0x7b, 0x1b, 0x51, 0x31, 0xd7, 0xf8, 0x09, 0xde,
-    0xe0, 0x1c, 0xea, 0x59, 0xf5, 0x80, 0xea, 0xa1, 0x15, 0xef, 0x08, 0xdb,
-    0xff, 0x38, 0x60, 0x3d, 0x41, 0x45, 0x9d, 0x7f, 0xed, 0x8f, 0xcd, 0x3f,
-    0x75, 0x13, 0x9d, 0x7f, 0xb5, 0xfb, 0x73, 0xc3, 0x07, 0x52, 0xd1, 0x5b,
-    0xd3, 0xbf, 0x20, 0x5f, 0xfd, 0xfc, 0xba, 0xfc, 0xdf, 0xd0, 0x93, 0x9d,
-    0x7f, 0xa5, 0x1c, 0x9e, 0x39, 0x39, 0xd7, 0xe7, 0xd6, 0xcc, 0xd1, 0xd5,
-    0x07, 0xb8, 0x03, 0x4b, 0xf2, 0x7b, 0x4e, 0x87, 0x5f, 0xf7, 0x01, 0xc7,
-    0x1f, 0x60, 0x0e, 0xa0, 0x1e, 0xe7, 0xe4, 0xb7, 0xbe, 0xf2, 0x47, 0x5f,
-    0xdf, 0x7d, 0xfc, 0x64, 0xe7, 0x54, 0x8f, 0x3a, 0x61, 0xeb, 0xff, 0x9a,
-    0x31, 0xe1, 0xcd, 0x99, 0xc9, 0x1d, 0x7f, 0xdf, 0x8a, 0x9f, 0x7b, 0xdf,
-    0xf4, 0x75, 0xfe, 0x11, 0x7f, 0x7d, 0x86, 0x9d, 0x7c, 0x20, 0x9c, 0x07,
-    0x56, 0x1e, 0xa2, 0x19, 0x5f, 0xed, 0x7c, 0xf7, 0xc0, 0xe0, 0x9d, 0x60,
-    0x1d, 0x64, 0xdc, 0xf1, 0xb8, 0x6d, 0x7e, 0x7d, 0xf5, 0xe4, 0x3a, 0xa1,
-    0x3a, 0xdc, 0x23, 0x44, 0x3e, 0xc2, 0x48, 0x59, 0xb4, 0x51, 0x7e, 0x7f,
-    0xd4, 0x8f, 0xa7, 0x5f, 0x98, 0x59, 0xc8, 0xd1, 0xd5, 0x31, 0xea, 0x09,
-    0x55, 0xff, 0x3e, 0xa2, 0x6d, 0xe5, 0x9b, 0x0e, 0xbf, 0xff, 0x07, 0xb1,
-    0xf5, 0x5f, 0x0b, 0x83, 0x5a, 0x80, 0x15, 0x70, 0x70, 0xeb, 0xf4, 0xf1,
-    0x3b, 0xe8, 0xea, 0xc4, 0x4a, 0x22, 0xbb, 0x8a, 0xdc, 0x0f, 0xce, 0xbf,
-    0x9c, 0x13, 0x0c, 0x04, 0xeb, 0xfe, 0x1c, 0x9c, 0x3d, 0xc1, 0xf1, 0xd5,
-    0x07, 0xf5, 0xd1, 0x71, 0x2c, 0xb2, 0xac, 0x43, 0x63, 0x10, 0xc0, 0x42,
-    0x62, 0x87, 0x8c, 0x33, 0xa4, 0x43, 0x22, 0x50, 0x81, 0x0c, 0x60, 0x19,
-    0x18, 0xf2, 0x88, 0x4d, 0x87, 0x06, 0xf0, 0x94, 0x42, 0x19, 0xa3, 0x40,
-    0xe4, 0x70, 0xab, 0x85, 0xe7, 0x63, 0x25, 0x78, 0x69, 0x80, 0xc0, 0x61,
-    0x45, 0xa7, 0xdf, 0x4a, 0x1e, 0xfe, 0x15, 0xbb, 0x08, 0xb6, 0xe1, 0x9f,
-    0xf6, 0x14, 0xf7, 0xd1, 0xc9, 0x2c, 0xeb, 0xcf, 0xc5, 0x0e, 0xb2, 0xb3,
-    0x9b, 0xd6, 0x48, 0x6f, 0xf2, 0xb9, 0xc6, 0xbb, 0xb4, 0xd1, 0x79, 0xd4,
-    0x3a, 0x6b, 0x99, 0x37, 0x86, 0x30, 0x2c, 0xa6, 0x20, 0xef, 0x2a, 0x07,
-    0x91, 0xb4, 0x2d, 0x4f, 0xb0, 0xaa, 0x1a, 0xc6, 0xc3, 0x52, 0x82, 0x36,
-    0x15, 0x5f, 0xe5, 0x73, 0x8d, 0x77, 0x69, 0xa2, 0x96, 0xbf, 0x71, 0xae,
-    0xed, 0x34, 0x58, 0x57, 0xff, 0xe8, 0xc1, 0x0c, 0x76, 0x37, 0xf6, 0x0b,
-    0xac, 0xeb, 0xfb, 0xfe, 0x24, 0xee, 0xb3, 0xac, 0xae, 0x22, 0xc9, 0x66,
-    0x7b, 0x6a, 0x37, 0xf9, 0x5c, 0xe3, 0x5d, 0xda, 0x68, 0xb2, 0xee, 0xe2,
-    0x87, 0x5f, 0x2a, 0xa3, 0x0c, 0xc4, 0x1d, 0x45, 0x5e, 0x57, 0xea, 0xce,
-    0xa6, 0x9e, 0xbe, 0x8b, 0xbf, 0x0a, 0xa1, 0x44, 0xf6, 0x9b, 0xae, 0x8e,
-    0x9d, 0x60, 0x1d, 0x72, 0x93, 0x9d, 0x6e, 0x48, 0xd4, 0x60, 0x85, 0x34,
-    0xf8, 0xdc, 0xf6, 0xff, 0x9f, 0x71, 0xcd, 0xfd, 0x0a, 0x1d, 0x7f, 0xa7,
-    0xdf, 0x50, 0x1f, 0x21, 0xd7, 0xe8, 0xcd, 0x91, 0xa3, 0xad, 0x0e, 0x7b,
-    0x6c, 0x9a, 0x53, 0xa2, 0xec, 0x61, 0x29, 0x7c, 0xf2, 0x90, 0x4e, 0xbf,
-    0x9f, 0x91, 0xe7, 0xe9, 0xd7, 0x99, 0x65, 0x92, 0xaf, 0xfa, 0x25, 0xbf,
-    0xb9, 0x19, 0xb9, 0x4a, 0x97, 0xf7, 0xfd, 0xfb, 0xef, 0x9e, 0x4d, 0xd9,
-    0x3a, 0xe8, 0xd1, 0xd4, 0x14, 0xc1, 0x3a, 0x42, 0x29, 0x5a, 0x49, 0xd8,
-    0x77, 0x7f, 0x23, 0xe8, 0x1a, 0xfc, 0xeb, 0xff, 0x92, 0x4f, 0xa7, 0x1f,
+    0x3a, 0xff, 0xf4, 0xa3, 0x07, 0xdf, 0xb8, 0x75, 0x0a, 0x1d, 0x7f, 0x04,
+    0x61, 0xab, 0xfc, 0xeb, 0xfa, 0x37, 0x0f, 0x1e, 0x47, 0x5f, 0xf3, 0x22,
+    0x9a, 0x41, 0xde, 0x47, 0x5e, 0x0a, 0x4e, 0x75, 0x21, 0xea, 0x39, 0xc5,
+    0xff, 0xcd, 0xe4, 0x29, 0x03, 0xe6, 0x19, 0x86, 0x62, 0x4e, 0xbf, 0xc9,
+    0xd1, 0xfd, 0xd4, 0x69, 0xd5, 0x08, 0x86, 0xc5, 0x3b, 0xff, 0x84, 0x63,
+    0x7f, 0xb9, 0xcd, 0x63, 0x27, 0x5f, 0xe6, 0xa6, 0xb9, 0xc8, 0x91, 0xd4,
+    0x87, 0xef, 0xd4, 0x5b, 0xb3, 0x72, 0xad, 0x05, 0x58, 0x1c, 0x34, 0xa0,
+    0x16, 0xbf, 0xde, 0xce, 0x01, 0x69, 0xa2, 0x95, 0x34, 0xf7, 0xf4, 0xba,
+    0x9b, 0x32, 0x63, 0xaa, 0x0f, 0xc9, 0xd0, 0xef, 0xee, 0xa3, 0x61, 0x68,
+    0x75, 0xfe, 0x80, 0x4e, 0xf2, 0x86, 0x33, 0xac, 0x30, 0x7c, 0x02, 0x57,
+    0x65, 0x58, 0x95, 0xe2, 0x36, 0x1c, 0x2f, 0x10, 0x98, 0x9c, 0xbb, 0x21,
+    0xf8, 0xa1, 0x13, 0x55, 0x77, 0x1a, 0x44, 0x99, 0x8b, 0x7b, 0x08, 0x11,
+    0x85, 0x36, 0xa1, 0x31, 0xb7, 0x0d, 0xff, 0xb0, 0x80, 0xbf, 0xff, 0xf9,
+    0xd6, 0xaa, 0x73, 0x9f, 0xf3, 0x90, 0x38, 0xa2, 0x77, 0xb9, 0xf4, 0xeb,
+    0xff, 0xcc, 0x32, 0x8c, 0xb1, 0xce, 0x16, 0x17, 0xcf, 0x9d, 0xdb, 0x3a,
+    0xfd, 0xc6, 0xbb, 0xb4, 0xd1, 0x51, 0x5f, 0xa3, 0xb9, 0xcc, 0x3a, 0xff,
+    0xfc, 0x09, 0x4e, 0xc3, 0x43, 0x17, 0x3b, 0x79, 0xf3, 0xe7, 0x76, 0xce,
+    0xbf, 0xff, 0x3c, 0x86, 0x35, 0x9b, 0xb4, 0x5f, 0x37, 0x69, 0xd6, 0x56,
+    0x49, 0xbb, 0xe3, 0x13, 0x4c, 0xfa, 0x4b, 0xb1, 0xaa, 0xff, 0xc1, 0xc5,
+    0xab, 0xb7, 0x82, 0x9e, 0x3a, 0xf6, 0x33, 0x87, 0x5f, 0xec, 0xc9, 0xc3,
+    0x18, 0x13, 0xaf, 0x76, 0x02, 0x75, 0xfe, 0x88, 0x41, 0x1f, 0xd8, 0xce,
+    0xb9, 0xff, 0x3a, 0xfb, 0xa9, 0xd5, 0x58, 0x08, 0xb0, 0x50, 0x6e, 0x63,
+    0x1e, 0x8d, 0xb2, 0x67, 0x7e, 0xe3, 0x5d, 0xda, 0x68, 0xaf, 0x6f, 0xc9,
+    0xb4, 0xdf, 0xe7, 0x3a, 0xe8, 0x91, 0xd7, 0x40, 0x0e, 0xb2, 0xb8, 0x88,
+    0x9e, 0x19, 0xb9, 0x60, 0x05, 0x6f, 0xfe, 0x55, 0xe4, 0xae, 0x71, 0xae,
+    0xed, 0x34, 0x48, 0xd7, 0xff, 0x95, 0x5b, 0xc9, 0x5c, 0xe3, 0x5d, 0xda,
+    0x68, 0x9e, 0x2f, 0xff, 0x2a, 0xb7, 0x92, 0xb9, 0xc6, 0xbb, 0xb4, 0xd1,
+    0x3f, 0xdf, 0xfe, 0x55, 0x6f, 0x25, 0x73, 0x8d, 0x77, 0x69, 0xa2, 0x86,
+    0xbf, 0xf9, 0x6f, 0x25, 0x73, 0x8d, 0x77, 0x69, 0xa2, 0x88, 0xbf, 0xf4,
+    0x95, 0xff, 0x5f, 0x23, 0x51, 0x23, 0xa9, 0x54, 0x49, 0x42, 0x85, 0xff,
+    0xa6, 0x4e, 0xef, 0x9e, 0x0e, 0x2c, 0xeb, 0xff, 0x0b, 0xab, 0xe1, 0xfd,
+    0xe5, 0xa3, 0xaf, 0xdc, 0x6b, 0xbb, 0x4d, 0x14, 0x8d, 0xff, 0xdd, 0xd8,
+    0xfc, 0xd3, 0xf7, 0x51, 0x39, 0xd7, 0xff, 0x3e, 0xfa, 0xeb, 0x30, 0x0f,
+    0x9f, 0x56, 0x75, 0xff, 0x44, 0xa3, 0x93, 0xc7, 0x27, 0x3a, 0xf3, 0xc9,
+    0x5c, 0x47, 0xe3, 0x99, 0x81, 0x18, 0x52, 0xaf, 0xe9, 0x67, 0x7a, 0xf2,
+    0x3a, 0xff, 0xfe, 0xc0, 0xf6, 0x3e, 0xab, 0xe1, 0x70, 0x6b, 0x50, 0x02,
+    0xac, 0xac, 0x2a, 0x4d, 0x69, 0xfa, 0xe3, 0x3a, 0xf2, 0x66, 0xd9, 0x65,
+    0xf3, 0x5d, 0xda, 0x68, 0x94, 0x2f, 0xfd, 0x00, 0x5b, 0xcb, 0xb0, 0xfc,
+    0x3a, 0xb8, 0x7d, 0x22, 0x5b, 0x7f, 0xf8, 0x5f, 0xda, 0xfa, 0x3f, 0xc8,
+    0x71, 0x67, 0x5f, 0x2a, 0xf2, 0x57, 0x0f, 0xad, 0x64, 0x35, 0x3b, 0x63,
+    0x1d, 0x29, 0xe6, 0x20, 0xc6, 0x12, 0xd8, 0xfa, 0xd1, 0x4d, 0x8e, 0x1e,
+    0x1c, 0x87, 0x92, 0xd0, 0xba, 0xa2, 0x05, 0x76, 0x0a, 0xbe, 0xa1, 0xd3,
+    0xfc, 0xa7, 0x0d, 0xa8, 0xcb, 0xef, 0xff, 0x2a, 0xb7, 0x92, 0xb9, 0xc6,
+    0xbb, 0xb4, 0xd1, 0x39, 0xdf, 0xfe, 0x55, 0x6f, 0x25, 0x73, 0x8d, 0x77,
+    0x69, 0xa2, 0x89, 0xbf, 0xef, 0xdf, 0x92, 0x62, 0x9b, 0x00, 0x87, 0x5f,
+    0xc9, 0xa9, 0xa4, 0x80, 0x3a, 0xff, 0x44, 0xff, 0x76, 0xdc, 0x40, 0x75,
+    0xee, 0x49, 0x50, 0xa2, 0x97, 0xa8, 0x3f, 0x4b, 0x6b, 0x89, 0xcc, 0x69,
+    0x5f, 0xf8, 0x7e, 0x5f, 0xb8, 0xd7, 0x76, 0x9a, 0x21, 0xcb, 0xfb, 0xf6,
+    0xf1, 0x20, 0x4e, 0xb2, 0xb8, 0x7b, 0xfd, 0x33, 0xbf, 0xe8, 0xe6, 0x37,
+    0xb1, 0xbc, 0x8e, 0xbe, 0x6b, 0xbb, 0x4d, 0x11, 0x7d, 0xf8, 0x5c, 0x0f,
+    0xa3, 0xaf, 0xd9, 0x34, 0x9f, 0x47, 0x57, 0x0f, 0xe7, 0xc5, 0xbf, 0x49,
+    0x6f, 0xf6, 0xb0, 0x3d, 0xc0, 0x39, 0xd7, 0x0c, 0xe7, 0x5f, 0xf7, 0x86,
+    0x17, 0xf4, 0x3d, 0x83, 0xaa, 0x0f, 0x3d, 0x05, 0xae, 0xd6, 0xe7, 0x5f,
+    0x7a, 0x50, 0xa1, 0x54, 0xb3, 0x72, 0xe2, 0xf7, 0xe7, 0x9f, 0xd9, 0xd3,
+    0xac, 0xac, 0xea, 0x80, 0xb2, 0x16, 0x33, 0x18, 0xf6, 0x10, 0x02, 0xb3,
+    0xb6, 0x41, 0x7f, 0xff, 0xfc, 0x2e, 0xae, 0x7e, 0xc1, 0x45, 0x13, 0xdd,
+    0xc4, 0x96, 0xbe, 0x62, 0x91, 0x23, 0xaf, 0xd9, 0xa5, 0x86, 0x0e, 0xbf,
+    0xf3, 0xc9, 0x5c, 0xe3, 0x5d, 0xda, 0x68, 0x99, 0x2c, 0xab, 0x51, 0xe7,
+    0xc8, 0x41, 0xac, 0x9a, 0xf7, 0xb1, 0x67, 0x5d, 0xd5, 0x9d, 0x7e, 0xe3,
+    0x5d, 0xda, 0x68, 0xb7, 0xac, 0xac, 0x1f, 0x20, 0x46, 0xf0, 0x5a, 0xff,
+    0xf2, 0xab, 0x79, 0x2b, 0x9c, 0x6b, 0xbb, 0x4d, 0x14, 0x9d, 0xcc, 0x43,
+    0x16, 0x75, 0xfd, 0x9e, 0x18, 0x85, 0x9d, 0x7f, 0x6e, 0x0f, 0xbc, 0x70,
+    0x1d, 0x77, 0x55, 0x60, 0x1f, 0xd7, 0x48, 0x1c, 0xaa, 0xa1, 0x75, 0xba,
+    0x52, 0x8a, 0xb2, 0x36, 0x0d, 0x42, 0x83, 0x61, 0xa7, 0xd8, 0x68, 0xdf,
+    0xe5, 0x73, 0x8d, 0x77, 0x69, 0xa2, 0x1d, 0xbf, 0x71, 0xae, 0xed, 0x34,
+    0x4b, 0x17, 0xd8, 0x05, 0xa1, 0xd7, 0xe5, 0x56, 0xf2, 0x57, 0x0f, 0x4f,
+    0x6c, 0xce, 0xff, 0x2b, 0x9c, 0x6b, 0xbb, 0x4d, 0x11, 0x85, 0xf2, 0xb2,
+    0xcd, 0x1d, 0x7f, 0xff, 0xd2, 0xd2, 0xad, 0xeb, 0xcc, 0xde, 0xe7, 0x18,
+    0x9e, 0xcc, 0xbd, 0x1d, 0x7e, 0xcf, 0x02, 0x1a, 0x75, 0xff, 0xe8, 0xf2,
+    0x02, 0x24, 0x1e, 0xc0, 0xb4, 0xeb, 0xf7, 0x1a, 0xee, 0xd3, 0x44, 0x7b,
+    0x7d, 0xa7, 0xdf, 0x61, 0xd7, 0x49, 0x5c, 0x3d, 0x7f, 0x19, 0xdf, 0xff,
+    0xce, 0xa8, 0xff, 0x9d, 0xc1, 0x06, 0x0f, 0xbb, 0x87, 0x59, 0x5d, 0xd3,
+    0xba, 0x99, 0xc3, 0x84, 0xcf, 0x09, 0xe1, 0x2e, 0xbf, 0x71, 0xae, 0xed,
+    0x34, 0x58, 0x77, 0xfa, 0x43, 0x19, 0xac, 0x13, 0xac, 0xae, 0x1f, 0x16,
+    0xe6, 0x77, 0xff, 0xff, 0xa3, 0x83, 0x11, 0xa5, 0x7c, 0x14, 0x5e, 0xf2,
+    0xd6, 0xf2, 0xce, 0x4e, 0x75, 0xfe, 0x57, 0x38, 0xd7, 0x76, 0x9a, 0x2e,
+    0x7b, 0xff, 0xff, 0xff, 0xa1, 0x87, 0xca, 0x76, 0xf7, 0xe7, 0xce, 0xed,
+    0xab, 0x3f, 0xea, 0x30, 0xe8, 0x60, 0x6f, 0x3c, 0xed, 0x5f, 0xcf, 0x9d,
+    0xdb, 0x3a, 0xa1, 0x75, 0x56, 0x78, 0x49, 0x49, 0x0d, 0xa7, 0xe9, 0x1e,
+    0xe2, 0xe1, 0x73, 0xd2, 0x9f, 0x3d, 0x6d, 0x1f, 0xdf, 0xe5, 0x73, 0x8d,
+    0x77, 0x69, 0xa2, 0x1e, 0xbe, 0x6b, 0xbb, 0x4d, 0x11, 0x35, 0xfd, 0x9b,
+    0x5f, 0xaf, 0x02, 0x75, 0xfe, 0xf7, 0xef, 0xbf, 0x63, 0x61, 0xd5, 0xc4,
+    0x49, 0x89, 0x6f, 0x8c, 0x2f, 0xc0, 0xd7, 0xcc, 0x09, 0xd7, 0xf9, 0x19,
+    0xc1, 0xcd, 0xfc, 0x75, 0x21, 0xed, 0xf0, 0xa6, 0xff, 0xfd, 0x1c, 0x07,
+    0x63, 0x64, 0xd1, 0x0b, 0xd6, 0x04, 0xeb, 0xfe, 0xef, 0x63, 0x64, 0xb3,
+    0x90, 0x75, 0xbd, 0xd4, 0x47, 0xba, 0xb5, 0xff, 0x27, 0x93, 0xd8, 0x08,
+    0xe1, 0xd5, 0x87, 0xbc, 0xe5, 0x17, 0xb0, 0x3d, 0x3a, 0xff, 0xfe, 0xf7,
+    0x63, 0x80, 0xd6, 0x07, 0xdf, 0xbb, 0x73, 0x87, 0x5d, 0xe5, 0x9d, 0x7f,
+    0xfb, 0x3b, 0xf6, 0x7d, 0x42, 0x6f, 0xe8, 0x59, 0xd7, 0xfe, 0x9e, 0x25,
+    0xf7, 0x39, 0xac, 0x64, 0xea, 0xc4, 0x7f, 0x6e, 0xb7, 0xd1, 0x6f, 0xd3,
+    0x2f, 0xbd, 0xfb, 0xfd, 0x34, 0x42, 0xf7, 0xee, 0xe4, 0xff, 0x89, 0xd7,
+    0xcf, 0xc8, 0xd8, 0x75, 0x04, 0xf2, 0x80, 0x51, 0x65, 0x71, 0x5d, 0x67,
+    0x21, 0x15, 0xd8, 0xc3, 0x84, 0x83, 0x51, 0x8c, 0xfe, 0x7d, 0xb1, 0xee,
+    0xff, 0xdc, 0xfe, 0x7c, 0xec, 0xc3, 0x01, 0x3a, 0xee, 0xb9, 0xd6, 0xfc,
+    0xea, 0xc3, 0x4d, 0xa1, 0x5b, 0xc0, 0xd2, 0xb0, 0x88, 0x6f, 0x33, 0x5f,
+    0xff, 0x62, 0x4b, 0x4a, 0xe6, 0xf2, 0x79, 0xfe, 0xb4, 0xea, 0x84, 0x44,
+    0x74, 0xd6, 0xfc, 0xc4, 0xe9, 0x27, 0x60, 0x1d, 0x7f, 0x31, 0x1f, 0x7b,
+    0xdc, 0x9c, 0xeb, 0x74, 0xea, 0x62, 0x0f, 0x17, 0xf3, 0x5b, 0xe0, 0xe0,
+    0xcc, 0x75, 0xc9, 0xe3, 0xad, 0xe4, 0x36, 0xdd, 0x21, 0xbf, 0xdb, 0xfb,
+    0x79, 0x7e, 0x2a, 0x1d, 0x7f, 0xe8, 0x98, 0x73, 0x63, 0xad, 0x68, 0x75,
+    0x39, 0xfa, 0xfe, 0x6f, 0x7f, 0xff, 0xf7, 0x7f, 0x0a, 0x67, 0x26, 0x1c,
+    0xd9, 0xdc, 0x0c, 0x6b, 0x50, 0xa1, 0xd7, 0xff, 0x92, 0x69, 0x66, 0xf2,
+    0xf8, 0xb7, 0x71, 0x3a, 0xe7, 0xda, 0x3a, 0xcc, 0x0c, 0x4e, 0x51, 0x48,
+    0x4d, 0xb4, 0x8b, 0xae, 0x8e, 0x97, 0x76, 0xda, 0x87, 0x5f, 0xba, 0xfe,
+    0x79, 0x1d, 0x7f, 0x27, 0x07, 0x33, 0x87, 0x5f, 0xe9, 0x6a, 0x34, 0xc5,
+    0x58, 0x86, 0x20, 0xeb, 0xff, 0x97, 0xf3, 0x43, 0x9b, 0xc8, 0x5e, 0x73,
+    0xaf, 0x69, 0x00, 0x75, 0x61, 0xf0, 0xa2, 0x35, 0xe6, 0x59, 0x64, 0xab,
+    0xf3, 0x8f, 0xbb, 0x85, 0x2a, 0x5f, 0xdf, 0x9f, 0xd3, 0x67, 0x8e, 0xa0,
+    0xa2, 0x6c, 0x07, 0xe2, 0x6b, 0x7e, 0xe8, 0xb1, 0x4d, 0xbd, 0xa3, 0xae,
+    0x77, 0x3a, 0xdd, 0x43, 0xc7, 0x73, 0x3b, 0xff, 0x80, 0x93, 0x7c, 0xec,
+    0x27, 0x3f, 0x63, 0x3a, 0xfe, 0xe2, 0x6d, 0x73, 0x5a, 0x3a, 0xfe, 0x1f,
+    0xfc, 0x93, 0xc1, 0xd7, 0xfe, 0x45, 0x20, 0x63, 0x50, 0x8b, 0x3a, 0xfe,
+    0xcd, 0x9f, 0xcb, 0x34, 0x75, 0xf6, 0x07, 0x27, 0x3a, 0xf9, 0x8f, 0xe4,
+    0x31, 0x27, 0x5d, 0xc8, 0x3a, 0xb1, 0x5c, 0xeb, 0x49, 0xb7, 0x2a, 0x48,
+    0xcf, 0xd8, 0xdd, 0xa6, 0x26, 0xe2, 0x52, 0xcc, 0x3a, 0x5a, 0x27, 0x7e,
+    0x2f, 0xd8, 0x43, 0xb4, 0x57, 0x7e, 0x66, 0x30, 0x28, 0x75, 0xef, 0xfd,
+    0xa3, 0xaf, 0xff, 0xff, 0xfb, 0x5f, 0x3b, 0x93, 0xc3, 0x3b, 0xcb, 0x5f,
+    0x3f, 0x6f, 0x39, 0x1f, 0x26, 0x53, 0x7f, 0x9f, 0x3b, 0xb6, 0x75, 0x62,
+    0x3b, 0x9a, 0x4d, 0xe1, 0xdb, 0xbf, 0x01, 0xd7, 0x6d, 0xb1, 0x07, 0x5e,
+    0xf9, 0x26, 0x9d, 0x50, 0x7a, 0x6a, 0x0b, 0xac, 0x7a, 0xff, 0xfe, 0xe7,
+    0xc1, 0xcd, 0x99, 0xc9, 0x7c, 0x80, 0xbc, 0xda, 0x3a, 0xff, 0xff, 0xe1,
+    0xde, 0x14, 0x1c, 0x0f, 0x52, 0x6f, 0x9a, 0xcd, 0xe5, 0xcc, 0x64, 0xea,
+    0xc4, 0x6b, 0x0b, 0x05, 0xf7, 0xbf, 0x89, 0xce, 0xbf, 0xd2, 0xce, 0xe2,
+    0xe1, 0xa7, 0x52, 0x1e, 0xa7, 0x88, 0xef, 0xff, 0xed, 0xe5, 0xa5, 0xe0,
+    0xfc, 0xda, 0x4e, 0xce, 0x99, 0xc3, 0xac, 0xc6, 0x75, 0x61, 0xf9, 0xb5,
+    0x82, 0xff, 0xff, 0xcc, 0xfc, 0x1c, 0x6f, 0x50, 0x73, 0xfd, 0xfd, 0xf1,
+    0xd9, 0xc5, 0x0e, 0xbf, 0xca, 0x07, 0xf8, 0xe8, 0xc1, 0xd7, 0xfb, 0x79,
+    0x69, 0x4f, 0xe3, 0x73, 0xaf, 0xf3, 0xb3, 0xfc, 0xd1, 0xe7, 0x3a, 0xa1,
+    0x31, 0x0c, 0x72, 0x43, 0x31, 0x37, 0xbf, 0xf4, 0x68, 0x73, 0x67, 0xc9,
+    0x2e, 0x47, 0x5f, 0x03, 0xc9, 0x39, 0xd7, 0xfb, 0xdd, 0x41, 0x07, 0xd5,
+    0x9d, 0x7f, 0xa7, 0x85, 0x8c, 0x6e, 0x03, 0xad, 0x12, 0x3e, 0x77, 0x34,
+    0xbf, 0xf9, 0xf9, 0x2f, 0x9e, 0x18, 0x96, 0x78, 0xea, 0x85, 0x75, 0x18,
+    0xea, 0x90, 0x94, 0xe4, 0x66, 0x3d, 0x3a, 0x74, 0x11, 0x84, 0x4f, 0xe4,
+    0xd6, 0x63, 0x3a, 0xff, 0xfb, 0x89, 0xfb, 0x06, 0x3e, 0x6b, 0xf0, 0x2f,
+    0x3c, 0x75, 0xdf, 0xc8, 0xeb, 0xf4, 0x03, 0x53, 0xf8, 0xeb, 0xcf, 0xed,
+    0x1d, 0x77, 0xf3, 0x9d, 0x52, 0x36, 0x7c, 0x1b, 0xbf, 0x64, 0xba, 0xf2,
+    0x3a, 0xe1, 0xf4, 0xc7, 0x8f, 0xd2, 0x1b, 0xfc, 0xe3, 0xf7, 0xbd, 0x80,
+    0x9d, 0x7f, 0x7e, 0xdf, 0x81, 0xdd, 0x93, 0xaa, 0x11, 0x29, 0xb9, 0x72,
+    0x19, 0xdf, 0xee, 0x40, 0x63, 0xb1, 0x23, 0xaf, 0xff, 0xa3, 0xdf, 0x07,
+    0xfd, 0xaf, 0x99, 0xed, 0xbc, 0xf1, 0xd4, 0x88, 0x8a, 0xfc, 0xc6, 0xff,
+    0xee, 0xc2, 0x9f, 0x3c, 0x2f, 0xe8, 0xf1, 0xd7, 0xfb, 0xe6, 0xf2, 0x4e,
+    0xfe, 0xb3, 0xa8, 0x07, 0xf8, 0x28, 0xb7, 0xff, 0x66, 0xcc, 0x0f, 0xcf,
+    0x28, 0x8c, 0xe8, 0xeb, 0xff, 0x72, 0x6f, 0x9a, 0x84, 0x9d, 0xfc, 0x75,
+    0x42, 0x2a, 0xc2, 0x43, 0xfa, 0x4d, 0xce, 0x03, 0xaf, 0xff, 0xbe, 0x0c,
+    0x6a, 0x27, 0x1c, 0x0f, 0x52, 0x63, 0xaf, 0xff, 0xfe, 0xd7, 0x06, 0x26,
+    0xf9, 0xf7, 0xc9, 0x2c, 0xdf, 0xd9, 0xb0, 0x73, 0x47, 0x57, 0x11, 0x8e,
+    0x2a, 0x15, 0xe4, 0x7f, 0x7f, 0x0d, 0xca, 0x3a, 0xe9, 0xa4, 0x75, 0x41,
+    0xa1, 0xe0, 0x55, 0xff, 0xc3, 0xed, 0x6c, 0x4f, 0x46, 0x0c, 0xc7, 0x5f,
+    0xb8, 0x9a, 0x8d, 0xce, 0xac, 0x3e, 0xb7, 0x44, 0xbf, 0xd3, 0xb0, 0x26,
+    0x92, 0x7b, 0x47, 0x5f, 0x87, 0xdd, 0xcd, 0xa3, 0xaf, 0xd3, 0x69, 0xf8,
+    0xa1, 0xd7, 0x9d, 0x9e, 0x41, 0xe9, 0x61, 0x4d, 0x49, 0x1b, 0xa8, 0x41,
+    0xc8, 0x45, 0xdf, 0xf7, 0x53, 0x93, 0x75, 0xf3, 0x87, 0x5f, 0xff, 0xff,
+    0xc0, 0xd0, 0xe3, 0xef, 0xf0, 0x3d, 0xff, 0xe0, 0xe6, 0xf2, 0xcf, 0xe7,
+    0x1c, 0x7d, 0xce, 0xa6, 0xa3, 0x1d, 0x0e, 0x2f, 0x3b, 0xb4, 0xd1, 0x4c,
+    0x56, 0x1e, 0x4b, 0x48, 0xaf, 0xfd, 0x83, 0xbc, 0xb5, 0xe8, 0xe4, 0xc7,
+    0x5e, 0xc4, 0x01, 0xd6, 0xc3, 0xaf, 0x6e, 0x38, 0x03, 0x53, 0xb0, 0x6a,
+    0x91, 0x13, 0x8e, 0xd1, 0x74, 0xf3, 0x1d, 0x70, 0x66, 0x3a, 0xfb, 0x9d,
+    0x7f, 0x90, 0x6b, 0xd6, 0x31, 0x7f, 0xbe, 0x6f, 0x21, 0x8c, 0xd1, 0xd4,
+    0x87, 0xda, 0xe7, 0x37, 0xff, 0xe0, 0x26, 0xbe, 0x75, 0xf5, 0xe8, 0x9b,
+    0x5d, 0xc3, 0xaf, 0xe4, 0xeb, 0xa4, 0xf0, 0x75, 0xe9, 0x46, 0xe7, 0x5f,
+    0xe5, 0x87, 0xb1, 0x3e, 0x32, 0x75, 0x61, 0xfd, 0xee, 0x56, 0xe3, 0x97,
+    0x6b, 0x47, 0x5b, 0x0e, 0xbf, 0xf4, 0xc8, 0xa2, 0x78, 0x73, 0x6b, 0xe7,
+    0x0d, 0x2e, 0xc1, 0x6b, 0xff, 0xfc, 0x38, 0xdf, 0x7a, 0x3d, 0xa9, 0x87,
+    0x19, 0xf9, 0x0c, 0x49, 0xd7, 0xfe, 0x6c, 0x2f, 0xb9, 0xac, 0x41, 0x3a,
+    0xa1, 0x14, 0x5d, 0x67, 0xbf, 0x72, 0x36, 0x47, 0x0e, 0xbf, 0x9c, 0x7e,
+    0x06, 0x04, 0xea, 0x84, 0xdd, 0x32, 0x1f, 0xc8, 0x45, 0xf9, 0x45, 0x31,
+    0x6c, 0xc5, 0x28, 0x13, 0x9d, 0x5e, 0x42, 0xe1, 0x8c, 0xd9, 0x48, 0x5c,
+    0xb6, 0x34, 0xad, 0xe3, 0x2e, 0x44, 0xa9, 0xa3, 0x68, 0xe4, 0x68, 0x8b,
+    0x85, 0xef, 0x61, 0x7a, 0x02, 0x01, 0x86, 0x97, 0xa3, 0xc7, 0xbf, 0xee,
+    0x3b, 0x3f, 0x1c, 0x2f, 0x39, 0xd7, 0xf3, 0xb3, 0x30, 0xa0, 0x4e, 0xbf,
+    0xff, 0xc1, 0xc9, 0xdc, 0x7d, 0xa8, 0x6f, 0xc5, 0xad, 0x05, 0xa7, 0x5f,
+    0xc1, 0xd3, 0xc6, 0xf2, 0x3a, 0xa1, 0x11, 0xce, 0xc3, 0x7f, 0xd1, 0x37,
+    0x52, 0x16, 0xe1, 0x3a, 0x94, 0x4d, 0x3b, 0x87, 0x63, 0x0b, 0xbf, 0xc8,
+    0x6f, 0xb0, 0x54, 0x63, 0x3a, 0xff, 0xff, 0xfd, 0xd4, 0xf7, 0x73, 0x91,
+    0xb3, 0xe2, 0xff, 0xda, 0xf9, 0x9b, 0xcb, 0x3f, 0x10, 0x68, 0xeb, 0x79,
+    0x11, 0x65, 0xa2, 0x4b, 0xff, 0x43, 0x7e, 0x0b, 0xe9, 0x70, 0x27, 0x5f,
+    0xff, 0xb3, 0x3a, 0x8d, 0xee, 0x7c, 0xd7, 0xfd, 0x86, 0x33, 0xaf, 0xff,
+    0xbd, 0xdc, 0x07, 0xc5, 0xc6, 0x78, 0x38, 0x27, 0x5f, 0xce, 0x1e, 0x73,
+    0xf9, 0xce, 0xbf, 0x46, 0x0f, 0xb6, 0xce, 0xa6, 0x9e, 0xba, 0xcb, 0xef,
+    0xbc, 0x9c, 0xc3, 0xad, 0xbf, 0xc3, 0xc2, 0xc2, 0x2b, 0x6b, 0x13, 0x12,
+    0x78, 0x74, 0x52, 0xd3, 0xd5, 0x13, 0xdf, 0x46, 0xd7, 0x7f, 0xff, 0xfe,
+    0x1c, 0xde, 0x49, 0xa1, 0xcd, 0x9d, 0xc9, 0xbb, 0x03, 0x37, 0xc7, 0x6a,
+    0x6c, 0x3a, 0x91, 0x17, 0xbf, 0x9b, 0x5f, 0xfe, 0x40, 0xfc, 0x5a, 0x7c,
+    0x80, 0xbc, 0xda, 0x3a, 0xe9, 0x48, 0xeb, 0x72, 0x0f, 0x8e, 0x74, 0xdb,
+    0xf4, 0xa3, 0x79, 0x68, 0xeb, 0xff, 0xff, 0xff, 0x60, 0xa9, 0xf1, 0x3b,
+    0xfa, 0xb3, 0x27, 0xa1, 0x62, 0xea, 0x75, 0x15, 0xce, 0xee, 0x08, 0x09,
+    0x57, 0xff, 0xff, 0x35, 0x19, 0x0f, 0xfc, 0xf9, 0xfc, 0x4f, 0xa6, 0xf7,
+    0xfe, 0xee, 0xec, 0x9d, 0x77, 0xf3, 0xee, 0x9a, 0x1a, 0x14, 0x6a, 0x13,
+    0xf5, 0x0b, 0x9d, 0xfd, 0x95, 0x74, 0xf0, 0x86, 0x18, 0xda, 0xef, 0xf3,
+    0xcb, 0x16, 0xe2, 0x03, 0xaf, 0xb3, 0xb1, 0x31, 0xd7, 0x96, 0xdf, 0x9d,
+    0x3d, 0x17, 0x30, 0xbf, 0xff, 0xfd, 0xc6, 0x8e, 0x6c, 0xf9, 0xa4, 0xc1,
+    0x07, 0xc1, 0xcd, 0x83, 0x9a, 0xd8, 0x75, 0xff, 0x37, 0x1d, 0x7f, 0x36,
+    0xe1, 0x67, 0x56, 0x22, 0xe7, 0x8f, 0xb7, 0xff, 0xe4, 0x1f, 0x77, 0x36,
+    0xbd, 0x36, 0x31, 0xb8, 0x80, 0xeb, 0xf4, 0x33, 0xf3, 0x53, 0x1d, 0x7f,
+    0xe1, 0x9c, 0x73, 0x66, 0xbf, 0x8d, 0xce, 0xbf, 0xf0, 0x7b, 0x1b, 0xfc,
+    0x62, 0x9b, 0x00, 0x87, 0x54, 0x22, 0x2a, 0x74, 0x1a, 0x44, 0xd4, 0xf4,
+    0x45, 0xe5, 0x9f, 0xe1, 0x6b, 0x7f, 0xf3, 0x39, 0xaf, 0xe1, 0x4d, 0x47,
+    0x26, 0x3a, 0xff, 0xc3, 0x26, 0xf5, 0x3a, 0x3f, 0xce, 0x75, 0xef, 0x63,
+    0x04, 0xea, 0x83, 0xde, 0xc3, 0xfb, 0xdb, 0x79, 0xd3, 0xae, 0xc0, 0x9d,
+    0x53, 0xab, 0x7c, 0x94, 0xa4, 0x1c, 0x43, 0xd4, 0x29, 0x7c, 0x41, 0xb0,
+    0x7a, 0xfc, 0x9e, 0xd6, 0x00, 0xeb, 0xf7, 0x73, 0x62, 0x6c, 0x3a, 0xf2,
+    0x60, 0x0e, 0xbf, 0x83, 0x03, 0xd7, 0x91, 0xd7, 0xa0, 0x30, 0x75, 0xfb,
+    0x3d, 0xa7, 0x9b, 0xe1, 0xe2, 0xac, 0xae, 0xf9, 0x8b, 0x62, 0xac, 0x26,
+    0x2c, 0xeb, 0xe4, 0x71, 0x09, 0xd6, 0x67, 0xe1, 0xea, 0x84, 0xda, 0xa4,
+    0x8c, 0x14, 0x84, 0xb5, 0xff, 0xfb, 0x9f, 0xf3, 0x90, 0x38, 0xa2, 0x77,
+    0xb9, 0xf4, 0xeb, 0xef, 0xdf, 0x7f, 0x1d, 0x52, 0x54, 0x22, 0x12, 0x65,
+    0x0a, 0xa6, 0x8c, 0x83, 0x84, 0xfd, 0x57, 0xa3, 0xaf, 0xed, 0x35, 0xae,
+    0x2a, 0x1d, 0x4c, 0x31, 0xb7, 0xf0, 0x55, 0xfe, 0x1f, 0x9b, 0x37, 0x96,
+    0xa6, 0x3a, 0xe9, 0xf7, 0x3a, 0xfd, 0xd7, 0x63, 0x80, 0x1d, 0x41, 0x3f,
+    0xa7, 0x39, 0xda, 0x18, 0xbf, 0xdc, 0x98, 0x73, 0xaf, 0xe3, 0xaa, 0x13,
+    0x03, 0xc8, 0x50, 0x21, 0x8d, 0xf9, 0x38, 0x1c, 0x13, 0xaf, 0xc0, 0xcf,
+    0x7d, 0x9c, 0xeb, 0xfc, 0xcf, 0xb3, 0xbf, 0x37, 0xd1, 0xd5, 0x07, 0xc2,
+    0xe5, 0x55, 0x24, 0x6c, 0xf4, 0xcc, 0x61, 0x0d, 0x7f, 0xde, 0xee, 0x49,
+    0xc7, 0x37, 0x3a, 0xff, 0xff, 0x85, 0xc1, 0xa9, 0xf1, 0x07, 0xc3, 0x9b,
+    0x3e, 0x69, 0x91, 0x3a, 0x85, 0x13, 0xfe, 0x37, 0xbf, 0xf2, 0x64, 0xdf,
+    0x35, 0x1d, 0x76, 0x33, 0xaf, 0xfb, 0x7c, 0x8d, 0xe6, 0x18, 0x59, 0xd7,
+    0xf6, 0xfa, 0xee, 0x3f, 0x0e, 0xbf, 0xff, 0xf2, 0x2f, 0x89, 0x9b, 0x8f,
+    0xfe, 0x8e, 0xfc, 0xd8, 0x9e, 0x9a, 0x0e, 0xa7, 0x44, 0xef, 0x8b, 0x68,
+    0x29, 0x9d, 0x75, 0x0b, 0xd0, 0xd6, 0xbf, 0xec, 0xe4, 0xf0, 0x9c, 0xc1,
+    0x3a, 0xcb, 0x3b, 0xe1, 0xb6, 0xbc, 0x38, 0x13, 0xaa, 0x0d, 0xe6, 0xe4,
+    0x57, 0xf6, 0xfa, 0xcc, 0x15, 0x0e, 0xbe, 0x5f, 0xd8, 0x01, 0xd7, 0xff,
+    0xa7, 0x0f, 0x1d, 0xa3, 0x9b, 0x38, 0x9a, 0x3a, 0xb1, 0x13, 0x68, 0x5b,
+    0xf9, 0x1d, 0xfe, 0x7f, 0x75, 0xe6, 0xfa, 0xb3, 0xaf, 0x7f, 0xb8, 0x0e,
+    0xbf, 0xb5, 0x1b, 0x83, 0x90, 0x75, 0x42, 0xb6, 0xfc, 0x8d, 0x71, 0x21,
+    0x51, 0xc8, 0x5e, 0x39, 0x78, 0x9a, 0xe8, 0x7a, 0xfe, 0xf3, 0xf7, 0xe0,
+    0x60, 0xeb, 0xff, 0xde, 0xd7, 0xdd, 0x7c, 0xf0, 0xc4, 0xb3, 0xc7, 0x5f,
+    0xef, 0x24, 0xf9, 0xdf, 0xfc, 0x75, 0xf7, 0xb5, 0x0a, 0x1d, 0x69, 0x8e,
+    0xbf, 0xb3, 0xfc, 0xeb, 0x67, 0x3a, 0xdb, 0xc1, 0xbf, 0xd0, 0x8d, 0x42,
+    0x22, 0x31, 0x86, 0xfe, 0xeb, 0xc9, 0x7c, 0x43, 0xaf, 0xfe, 0x51, 0x47,
+    0xf6, 0xbc, 0x31, 0xbc, 0x8e, 0xbf, 0xbc, 0x31, 0x2c, 0xf1, 0xd5, 0x07,
+    0xe3, 0x24, 0x6b, 0x93, 0x47, 0x59, 0x67, 0x5e, 0xe6, 0x6e, 0x75, 0x04,
+    0xf0, 0x7a, 0x2a, 0x01, 0x0b, 0xff, 0xce, 0xa7, 0x94, 0x81, 0x96, 0x75,
+    0x16, 0x75, 0xf9, 0x35, 0xa8, 0x59, 0xd4, 0x88, 0x9e, 0x12, 0xfd, 0x89,
+    0x35, 0x0a, 0xc9, 0x70, 0xb9, 0x44, 0xd4, 0x85, 0xe0, 0x08, 0x46, 0x13,
+    0xbf, 0xc6, 0x01, 0x7e, 0x0a, 0x0b, 0x84, 0xeb, 0xff, 0xf4, 0xbb, 0x93,
+    0x76, 0x05, 0x41, 0xcf, 0x77, 0xf3, 0xa9, 0x0f, 0xef, 0x84, 0xb7, 0xff,
+    0xf9, 0x33, 0x79, 0x6b, 0xdd, 0x85, 0xc2, 0x07, 0xe4, 0x31, 0x27, 0x5f,
+    0xe7, 0x1f, 0x8d, 0xd0, 0x02, 0x75, 0xff, 0xbf, 0xd7, 0xc5, 0xfd, 0xeb,
+    0xf6, 0x0e, 0xbf, 0x67, 0xbf, 0xcd, 0xce, 0xbc, 0xa6, 0x6e, 0x75, 0xd1,
+    0x37, 0xc3, 0xc5, 0xf1, 0x45, 0x0a, 0x2e, 0x3f, 0x84, 0x45, 0xff, 0xff,
+    0xfb, 0xf1, 0xf8, 0xcb, 0xef, 0x2e, 0x38, 0x3e, 0x6b, 0xf8, 0xdf, 0xb8,
+    0x83, 0x8a, 0x1d, 0x7f, 0xfe, 0xff, 0x9c, 0xcf, 0x6b, 0xa9, 0x9f, 0x3a,
+    0x08, 0x3a, 0xb1, 0x1c, 0x3d, 0x84, 0x55, 0xfb, 0x05, 0xbf, 0x56, 0x75,
+    0xff, 0xdd, 0xc8, 0x19, 0x87, 0x3d, 0xa7, 0x3a, 0xd2, 0xf1, 0xf4, 0xed,
+    0x14, 0x5f, 0xff, 0x83, 0x8b, 0xf9, 0xb5, 0xe8, 0xd4, 0xd2, 0x7e, 0x4e,
+    0x75, 0xff, 0xfd, 0xe4, 0x9f, 0x03, 0xf1, 0x6f, 0x2e, 0x24, 0xee, 0xb3,
+    0xaf, 0xf4, 0xee, 0xb1, 0x8e, 0x4c, 0x75, 0xff, 0x6f, 0x8a, 0x01, 0x79,
+    0xf3, 0x98, 0x89, 0x04, 0x5d, 0xbf, 0xec, 0x19, 0xfe, 0x01, 0xde, 0x63,
+    0xaf, 0xff, 0xb3, 0xfe, 0x7c, 0x9b, 0xbf, 0xa8, 0x98, 0x2a, 0x1d, 0x7f,
+    0xdc, 0x9e, 0x27, 0x9f, 0xfe, 0x4e, 0x75, 0xff, 0xbe, 0x4d, 0xdf, 0xd4,
+    0x4c, 0x15, 0x0e, 0xbf, 0xc3, 0xf3, 0x5f, 0xed, 0xff, 0xc3, 0xab, 0x0f,
+    0xf7, 0xf4, 0x3a, 0x84, 0x6e, 0xea, 0x17, 0x77, 0xff, 0xa7, 0xf9, 0xae,
+    0xff, 0xf3, 0xda, 0xd4, 0x70, 0xeb, 0xff, 0xee, 0xc4, 0xff, 0x07, 0x36,
+    0x3f, 0x7b, 0x1b, 0x9d, 0x7f, 0xff, 0xdb, 0xe9, 0x31, 0x9f, 0x9d, 0xcf,
+    0x6b, 0x27, 0xf9, 0x88, 0x13, 0xa8, 0x28, 0xbe, 0xc5, 0x3b, 0xfa, 0x7f,
+    0x4c, 0x30, 0xb3, 0xaf, 0xff, 0xec, 0x9f, 0x10, 0x23, 0xff, 0x7e, 0x40,
+    0x5e, 0x6d, 0x1d, 0x58, 0x9d, 0xe2, 0x46, 0x1e, 0xe4, 0x5a, 0x2e, 0xa9,
+    0xd7, 0xf9, 0x42, 0xcc, 0xa4, 0x3b, 0x1b, 0x18, 0x4e, 0xf0, 0x90, 0x42,
+    0xbe, 0x43, 0xb1, 0x6a, 0x7d, 0x3a, 0xd4, 0x66, 0x5e, 0x8f, 0x8e, 0xff,
+    0x78, 0x73, 0xdd, 0xc9, 0xce, 0xbf, 0xf3, 0xf3, 0xb9, 0xe8, 0x14, 0x01,
+    0xd7, 0xff, 0xc3, 0x93, 0xfc, 0x07, 0xfe, 0xcc, 0x58, 0x19, 0x3a, 0xfa,
+    0x5e, 0x49, 0xce, 0xbf, 0xec, 0x67, 0x79, 0x6b, 0xe7, 0x90, 0xeb, 0xff,
+    0x4a, 0x30, 0x1d, 0xcc, 0x16, 0x9d, 0x7f, 0xfb, 0xa8, 0x21, 0xf9, 0xf5,
+    0xa3, 0x9d, 0xc3, 0xab, 0x11, 0x0d, 0x31, 0xdd, 0xff, 0x75, 0x17, 0x18,
+    0x3e, 0xd1, 0xd7, 0xff, 0xfb, 0xff, 0x73, 0xf9, 0xbe, 0x7a, 0x6e, 0xfe,
+    0x0f, 0x26, 0x6d, 0x1d, 0x7d, 0x0d, 0x85, 0xfc, 0x46, 0x2b, 0x48, 0xc4,
+    0xda, 0xa1, 0x55, 0x83, 0x4c, 0xb8, 0x76, 0xea, 0x62, 0x45, 0xb5, 0x1c,
+    0x3d, 0xff, 0xfd, 0xcc, 0x75, 0xfc, 0x51, 0xf7, 0xee, 0x77, 0xb1, 0xe3,
+    0xaf, 0xf4, 0x2f, 0x33, 0x93, 0x48, 0xeb, 0xe4, 0xf2, 0x41, 0xd7, 0xff,
+    0xff, 0x85, 0x14, 0xeb, 0xcd, 0xf0, 0x7f, 0xda, 0xf9, 0x9b, 0xcb, 0x3f,
+    0x10, 0x68, 0xeb, 0xf7, 0x52, 0x06, 0x73, 0xae, 0xf4, 0x2d, 0x14, 0xfb,
+    0x21, 0x03, 0x52, 0x47, 0xda, 0x43, 0x1a, 0xa1, 0x9b, 0x09, 0x94, 0x80,
+    0x64, 0x96, 0xdd, 0xc5, 0xfe, 0xae, 0xbc, 0x65, 0xb7, 0xe8, 0x1f, 0x26,
+    0xc3, 0xaf, 0xbd, 0xa7, 0x01, 0xd7, 0xff, 0x75, 0x3e, 0x27, 0x3f, 0x9d,
+    0xf8, 0xd3, 0xaf, 0x93, 0xaf, 0x39, 0xd7, 0xdb, 0x23, 0xd0, 0x75, 0xfb,
+    0x59, 0xe4, 0xd1, 0xd7, 0xff, 0x27, 0xba, 0x99, 0x81, 0x1c, 0x64, 0xeb,
+    0xff, 0xfe, 0xcf, 0xe7, 0x1f, 0xf1, 0x3b, 0x8d, 0xea, 0x7c, 0x65, 0x6d,
+    0x3a, 0xfd, 0xfb, 0x04, 0x5f, 0xc7, 0x5f, 0xdd, 0x79, 0xfe, 0x4b, 0xc7,
+    0x5f, 0x9f, 0x83, 0xba, 0x1d, 0x50, 0x88, 0x14, 0x2b, 0xf1, 0x85, 0x05,
+    0x52, 0x96, 0x13, 0xa8, 0x42, 0xd4, 0x74, 0x21, 0x98, 0x89, 0x64, 0xc2,
+    0x83, 0xe8, 0x75, 0xdf, 0x0f, 0xa1, 0x67, 0x5f, 0xee, 0xc2, 0x0b, 0xf1,
+    0x43, 0xaf, 0xe8, 0x41, 0x7e, 0x28, 0x75, 0xfc, 0xe0, 0xe7, 0x13, 0x9f,
+    0x0f, 0x73, 0xa6, 0x37, 0xf9, 0xc5, 0xbf, 0x19, 0xd0, 0x0e, 0xa4, 0x47,
+    0xb8, 0x1f, 0x3f, 0x46, 0xbd, 0xaf, 0x21, 0xd7, 0xa6, 0x06, 0xe7, 0x5e,
+    0x85, 0x3e, 0x34, 0xdc, 0x80, 0x6e, 0xc0, 0x3a, 0xfe, 0x8e, 0x4f, 0x1c,
+    0x9c, 0xeb, 0xdf, 0xbe, 0x8e, 0xa9, 0x1e, 0x57, 0xd2, 0xeb, 0xff, 0xf9,
+    0x39, 0xf3, 0x13, 0x05, 0x4e, 0xa6, 0x2f, 0x1a, 0x75, 0xff, 0xff, 0x24,
+    0xfc, 0x85, 0xeb, 0xf8, 0xf9, 0x1c, 0x80, 0xf6, 0x16, 0x75, 0x62, 0x30,
+    0x78, 0xb3, 0x7e, 0x06, 0x93, 0x76, 0x4e, 0xbf, 0xf7, 0x33, 0x7e, 0xef,
+    0x0b, 0x9e, 0x0e, 0xbf, 0xff, 0xfd, 0xce, 0x24, 0xff, 0x3b, 0x9e, 0x18,
+    0x9b, 0xb9, 0x3c, 0x6f, 0xef, 0xda, 0x75, 0xff, 0xff, 0xd0, 0xa7, 0x63,
+    0xe0, 0xe7, 0xea, 0x7c, 0xde, 0x5a, 0x41, 0xfb, 0x13, 0x9d, 0x7e, 0xdf,
+    0x49, 0x82, 0x75, 0x62, 0x28, 0x3f, 0x7a, 0xa4, 0x4d, 0x03, 0xb1, 0x8e,
+    0xdf, 0xfd, 0xc1, 0xdf, 0x35, 0xfc, 0xc3, 0x0b, 0x3a, 0xff, 0x91, 0x4e,
+    0xc2, 0x4f, 0x0a, 0x1d, 0x69, 0x21, 0xff, 0x69, 0x16, 0xff, 0x87, 0xf9,
+    0x87, 0x3a, 0xfe, 0x3a, 0xff, 0x76, 0x19, 0x0f, 0x5d, 0x67, 0x5f, 0xf2,
+    0xf3, 0x5f, 0x26, 0x18, 0x59, 0xd4, 0x13, 0xed, 0x59, 0x9d, 0xff, 0xff,
+    0x3f, 0x3b, 0x9e, 0x4c, 0x19, 0xf5, 0x18, 0x21, 0xec, 0x1d, 0x7d, 0xef,
+    0x93, 0xf0, 0xea, 0xdd, 0x10, 0xee, 0xc5, 0x7f, 0xff, 0xed, 0xf2, 0x7f,
+    0xf6, 0xbe, 0x6f, 0x2f, 0x43, 0x3f, 0x33, 0x80, 0x04, 0x1d, 0x7f, 0xf9,
+    0x97, 0x19, 0xd7, 0xfa, 0x05, 0x05, 0x0e, 0xbf, 0xa6, 0xde, 0x5f, 0xc7,
+    0x8e, 0xbf, 0xb2, 0x5e, 0x1c, 0x91, 0xd7, 0xfd, 0xd7, 0x58, 0xe7, 0x5f,
+    0xc7, 0x5f, 0x67, 0x00, 0xc9, 0xd5, 0x08, 0xb3, 0xe9, 0x86, 0x8a, 0xfc,
+    0x6d, 0x7f, 0x67, 0xb9, 0xcc, 0x91, 0xd7, 0xf0, 0xe7, 0x47, 0x1a, 0x75,
+    0xf0, 0xe6, 0xbe, 0x4c, 0x7a, 0xde, 0x2c, 0xbf, 0xec, 0x5f, 0x61, 0x39,
+    0xfb, 0x19, 0xd4, 0x15, 0xe8, 0x6c, 0x22, 0x50, 0xa5, 0xb1, 0xc0, 0x6f,
+    0x0a, 0x74, 0x27, 0xe4, 0x29, 0x7b, 0x0a, 0x97, 0x23, 0xd3, 0xc7, 0xa1,
+    0xf9, 0xb2, 0x12, 0x5f, 0x4e, 0xef, 0xfd, 0x8c, 0x8e, 0x7f, 0x8a, 0x48,
+    0x07, 0x5f, 0xf8, 0x73, 0xe7, 0x33, 0xa3, 0x93, 0x1d, 0x7f, 0xff, 0xba,
+    0xe0, 0xd7, 0xc1, 0xcd, 0x83, 0x9a, 0xc5, 0xc3, 0x4e, 0xa1, 0x44, 0xfe,
+    0x8f, 0xa9, 0x86, 0x64, 0xce, 0x42, 0xd6, 0x4f, 0xb5, 0xef, 0x0d, 0x77,
+    0x86, 0xf5, 0xfd, 0x9d, 0xfa, 0x3b, 0x80, 0xeb, 0xfb, 0xb8, 0x3e, 0x07,
+    0xe7, 0x5f, 0xfa, 0x51, 0xad, 0x42, 0x4e, 0xfe, 0x3a, 0xfc, 0x30, 0xb7,
+    0x09, 0xd7, 0xfb, 0x26, 0xee, 0x7a, 0x02, 0x75, 0xfc, 0x3e, 0x75, 0xa7,
+    0x8e, 0xb4, 0x8e, 0xa8, 0x37, 0x7e, 0x2b, 0xbc, 0x2d, 0x83, 0xaf, 0xff,
+    0xff, 0xbb, 0x9e, 0xd3, 0xcd, 0xf0, 0x73, 0x79, 0x67, 0xf3, 0x8e, 0x07,
+    0xa9, 0x31, 0xd7, 0x7e, 0xa1, 0xd4, 0x88, 0xb3, 0xe0, 0xd7, 0xa1, 0x03,
+    0x7f, 0x64, 0xe3, 0x9b, 0xe8, 0xeb, 0xff, 0x84, 0x1b, 0x79, 0xd4, 0x85,
+    0xb8, 0x4e, 0xbf, 0xff, 0xff, 0x4b, 0x5a, 0xfe, 0x3c, 0x81, 0xc1, 0x9b,
+    0xe0, 0xe7, 0x20, 0x7d, 0xdc, 0xda, 0x3a, 0xff, 0xed, 0xe5, 0xac, 0x5e,
+    0xf1, 0xde, 0xc1, 0xd5, 0xba, 0x32, 0xf9, 0x08, 0x6b, 0x68, 0xea, 0xc4,
+    0xd2, 0x3f, 0x8c, 0x3f, 0xe9, 0x4d, 0xfd, 0x9b, 0xca, 0x01, 0x07, 0x5f,
+    0x87, 0x3a, 0xfe, 0x3a, 0xd1, 0xb9, 0xe8, 0xac, 0xb2, 0xfb, 0xe3, 0x67,
+    0x64, 0xeb, 0xf4, 0xff, 0x3f, 0x89, 0x8e, 0xbf, 0xff, 0xe1, 0x80, 0x6f,
+    0x2d, 0x7f, 0x1e, 0x1c, 0x0a, 0x67, 0x26, 0x3a, 0x9d, 0x12, 0x5e, 0x2c,
+    0xa8, 0x5d, 0x33, 0x09, 0x7e, 0xe5, 0xa8, 0x7b, 0x31, 0x2f, 0x5b, 0x5e,
+    0x1a, 0x62, 0x69, 0xa8, 0xdd, 0x7f, 0x84, 0x56, 0xc2, 0x8f, 0xb0, 0xb8,
+    0xbf, 0x49, 0x39, 0x9b, 0x9d, 0x7b, 0x5d, 0xc3, 0xaf, 0xd9, 0xa9, 0xf1,
+    0x93, 0xab, 0x73, 0xea, 0x98, 0x9f, 0xa3, 0x77, 0xff, 0xd3, 0xe3, 0x43,
+    0xd4, 0xc5, 0x3e, 0x29, 0xfc, 0x1d, 0x7f, 0xf4, 0x93, 0xdd, 0xce, 0x73,
+    0x3d, 0xa3, 0xaf, 0xfb, 0xe7, 0xdf, 0x26, 0xc8, 0x16, 0x9d, 0x48, 0x8d,
+    0x49, 0x95, 0x3a, 0x87, 0x7f, 0xfa, 0x37, 0x96, 0xbc, 0xf3, 0xed, 0x0e,
+    0x6e, 0x75, 0xff, 0x76, 0x74, 0xc1, 0xde, 0x5a, 0x3a, 0xff, 0xb7, 0xee,
+    0x34, 0x73, 0xf6, 0x33, 0xaf, 0xff, 0x99, 0xc6, 0xeb, 0x3d, 0x36, 0x28,
+    0x38, 0x03, 0xad, 0x28, 0x46, 0x2e, 0x1c, 0xa1, 0xe5, 0xfc, 0x9b, 0x83,
+    0x8e, 0x13, 0xaf, 0xd8, 0x99, 0xc0, 0x1d, 0x5d, 0x3d, 0x21, 0x2d, 0xbe,
+    0xda, 0xf6, 0x74, 0xeb, 0x91, 0x67, 0x5f, 0xff, 0xfb, 0x79, 0x3e, 0xff,
+    0x07, 0xfd, 0xaf, 0x99, 0xbc, 0xb3, 0xf1, 0x06, 0x8e, 0xa5, 0xa2, 0x33,
+    0x68, 0x56, 0xf6, 0xda, 0x30, 0x4e, 0xaf, 0x89, 0x8c, 0xce, 0x43, 0x90,
+    0xb0, 0xdb, 0x26, 0xbf, 0xff, 0xff, 0x46, 0xfa, 0xfe, 0x37, 0xf9, 0xdc,
+    0x0f, 0xc1, 0xcf, 0xd4, 0xf9, 0xa0, 0x01, 0x3c, 0x75, 0xfa, 0x07, 0x77,
+    0x9c, 0xeb, 0xff, 0xff, 0xff, 0x63, 0x63, 0xb0, 0xbf, 0x66, 0xb5, 0x1c,
+    0xe4, 0x0e, 0x4f, 0x9f, 0xeb, 0xf9, 0x86, 0x16, 0x75, 0xef, 0xf8, 0xa1,
+    0xd4, 0xb4, 0x5b, 0xed, 0xc2, 0x66, 0xfc, 0xe0, 0xfa, 0xf3, 0x9d, 0x58,
+    0x7a, 0x88, 0x57, 0x79, 0x01, 0x07, 0x5f, 0xc1, 0x1c, 0xeb, 0xf8, 0xeb,
+    0xf7, 0xb7, 0x92, 0x70, 0xea, 0xc3, 0xd3, 0xd1, 0x5d, 0x4e, 0x88, 0xe0,
+    0x36, 0xdf, 0xe9, 0xff, 0x8f, 0x2d, 0x3c, 0x75, 0xff, 0xa1, 0x4d, 0xaf,
+    0xf0, 0x66, 0xfa, 0xb3, 0xab, 0x0f, 0xe7, 0x73, 0x4b, 0xff, 0x66, 0x03,
+    0x5f, 0x39, 0xa0, 0xe8, 0xeb, 0xfd, 0xcc, 0x6f, 0x53, 0x93, 0x1d, 0x76,
+    0x78, 0x27, 0xe7, 0x88, 0x17, 0xd3, 0xa0, 0xf8, 0xeb, 0xf6, 0x77, 0xaf,
+    0x23, 0xaf, 0xef, 0x27, 0x27, 0xc6, 0x9d, 0x50, 0xc8, 0x6d, 0xc8, 0xc1,
+    0x54, 0x30, 0xde, 0x31, 0x34, 0x8e, 0x7b, 0x89, 0x0b, 0x84, 0x6f, 0x63,
+    0x32, 0x78, 0x57, 0x0c, 0x27, 0x75, 0x09, 0x5f, 0xcb, 0x36, 0xc8, 0x76,
+    0x89, 0xaf, 0x3b, 0x70, 0xeb, 0xff, 0x4d, 0xf3, 0xc3, 0x8c, 0xe2, 0x68,
+    0xea, 0x61, 0x1e, 0xd4, 0x0d, 0x51, 0xd7, 0xf6, 0x2e, 0x3a, 0xfd, 0x3a,
+    0xef, 0x93, 0x1d, 0x5f, 0x0f, 0x10, 0x25, 0x77, 0xff, 0xdb, 0xc8, 0x63,
+    0xe2, 0xc6, 0x14, 0xf2, 0x4e, 0x75, 0x42, 0x31, 0x31, 0x39, 0x09, 0x2f,
+    0xdc, 0xf8, 0x3b, 0x19, 0x3a, 0xfb, 0xae, 0x08, 0x3a, 0xf7, 0x73, 0x87,
+    0x54, 0x1f, 0x3b, 0x96, 0x6d, 0x10, 0x5f, 0xd3, 0xcd, 0x26, 0x17, 0x27,
+    0x3a, 0xfc, 0xb4, 0x0e, 0x04, 0xeb, 0x4c, 0x75, 0xd0, 0xb3, 0xad, 0xe3,
+    0xab, 0x86, 0x95, 0xc5, 0x68, 0x27, 0xad, 0xd3, 0x6b, 0xdc, 0x89, 0x8e,
+    0xbd, 0xa7, 0xdc, 0xea, 0x73, 0x71, 0xe1, 0xcb, 0xa6, 0x73, 0xaf, 0xe7,
+    0x66, 0x3d, 0x93, 0x9d, 0x7f, 0x27, 0x37, 0x90, 0xc1, 0xd7, 0xf8, 0x3d,
+    0x8d, 0xe5, 0x9e, 0x3a, 0xba, 0x7b, 0xfe, 0x2c, 0xa6, 0x21, 0x3e, 0xf8,
+    0x35, 0xc7, 0xc4, 0x5a, 0x59, 0x00, 0x8b, 0x7f, 0x08, 0xcb, 0xfc, 0xce,
+    0x48, 0x7f, 0x7d, 0x1d, 0x7e, 0xdd, 0x97, 0x10, 0x1d, 0x70, 0xa8, 0x75,
+    0xb4, 0x86, 0xfb, 0xf2, 0x8b, 0xff, 0xfa, 0x16, 0x38, 0xdd, 0xfc, 0x2f,
+    0xd5, 0xc6, 0x78, 0xeb, 0xff, 0xf4, 0x72, 0x1b, 0x8b, 0x86, 0xc9, 0x35,
+    0xfa, 0xce, 0xa8, 0x4d, 0x12, 0x67, 0x1e, 0x93, 0xed, 0xac, 0x5f, 0xdc,
+    0xc8, 0x52, 0x04, 0xeb, 0xc2, 0xeb, 0x3a, 0xe0, 0x41, 0xd7, 0x87, 0xec,
+    0xe7, 0x54, 0x8f, 0xe1, 0x0a, 0xc4, 0x6b, 0xc2, 0xb4, 0xc4, 0x3f, 0x37,
+    0xab, 0x16, 0xec, 0xc2, 0x8f, 0xc9, 0x87, 0xac, 0xc4, 0xbb, 0x79, 0xe3,
+    0xaf, 0x94, 0x20, 0x83, 0x39, 0x5b, 0x94, 0xcd, 0x15, 0x25, 0x34, 0xb6,
+    0x77, 0x97, 0x79, 0xc1, 0xc4, 0x94, 0xf1, 0x34, 0xa7, 0x4e, 0x4e, 0x21,
+    0x2e, 0x5c, 0xb7, 0x69, 0xce, 0x6f, 0x2a, 0xfc, 0x11, 0xbd, 0xb0, 0x5a,
+    0x46, 0x93, 0xa3, 0xa9, 0xd9, 0x6f, 0x52, 0x65, 0xff, 0x8d, 0x37, 0x64,
+    0x3a, 0x59, 0x84, 0xa6, 0xdc, 0xa1, 0xff, 0xb1, 0xd8, 0x6d, 0x42, 0xe6,
+    0xff, 0xfe, 0xfd, 0xaa, 0xef, 0xee, 0x46, 0x6e, 0xc2, 0x0b, 0xba, 0x87,
+    0x52, 0xaa, 0xaf, 0x92, 0x52, 0xdd, 0xfc, 0xe9, 0xed, 0x20, 0x9d, 0x79,
+    0x39, 0x87, 0x53, 0x19, 0xe2, 0x68, 0xaa, 0xfd, 0xc6, 0xbb, 0xb4, 0xd1,
+    0x4e, 0xdd, 0x9b, 0x9d, 0x7f, 0xfb, 0xff, 0xc5, 0x06, 0x3a, 0x8b, 0xcd,
+    0x1d, 0x65, 0x61, 0x16, 0xd8, 0x4b, 0xb9, 0x9a, 0xc5, 0xaf, 0xfe, 0x4e,
+    0x2b, 0xb6, 0xf3, 0xfb, 0x4e, 0x03, 0xaf, 0xdc, 0x6b, 0xbb, 0x4d, 0x15,
+    0x1d, 0xff, 0x9e, 0x4a, 0xe7, 0x1a, 0xee, 0xd3, 0x44, 0xd1, 0x7c, 0x31,
+    0x9b, 0x9d, 0x58, 0x89, 0xd5, 0x99, 0xf9, 0x2a, 0xff, 0x7d, 0x7d, 0x8a,
+    0xf9, 0x27, 0x3a, 0x95, 0x3e, 0x78, 0x2f, 0xbf, 0x71, 0xae, 0xed, 0x34,
+    0x55, 0xf7, 0xf6, 0x6c, 0x81, 0xef, 0xe7, 0x5f, 0xc8, 0x10, 0xc7, 0x20,
+    0xeb, 0xff, 0xfb, 0x70, 0x0f, 0xeb, 0xfa, 0x10, 0xc0, 0x17, 0x19, 0xe3,
+    0xac, 0xae, 0x23, 0xab, 0x86, 0x7d, 0x2e, 0xfa, 0x57, 0x7e, 0xe3, 0x5d,
+    0xda, 0x68, 0xad, 0xaf, 0xfa, 0x4a, 0xe7, 0x1a, 0xee, 0xd3, 0x44, 0x83,
+    0x65, 0x70, 0xfe, 0x1c, 0xce, 0xff, 0xe5, 0x5e, 0x4a, 0xe7, 0x1a, 0xee,
+    0xd3, 0x44, 0x87, 0x7f, 0xed, 0x2b, 0x9e, 0x40, 0xe0, 0xcc, 0x75, 0xe7,
+    0x76, 0x9e, 0x30, 0x3a, 0x83, 0xe5, 0x69, 0xf5, 0xdd, 0x63, 0x3a, 0xff,
+    0xd2, 0xec, 0x7b, 0x4c, 0x4e, 0x98, 0xb1, 0x3a, 0xff, 0xf3, 0x0e, 0x61,
+    0xcc, 0x4f, 0x61, 0x62, 0xfd, 0x4e, 0x1d, 0x6d, 0xce, 0xb9, 0x04, 0xeb,
+    0xfa, 0x03, 0x1e, 0x70, 0x9d, 0x41, 0x3d, 0x09, 0x84, 0x7c, 0x29, 0x7d,
+    0xed, 0x26, 0xc3, 0xaf, 0xfe, 0x41, 0x9e, 0x14, 0xfa, 0x00, 0x46, 0xe7,
+    0x5f, 0x60, 0x83, 0x47, 0x5f, 0x4f, 0xad, 0xd0, 0xea, 0xc3, 0xc3, 0xd1,
+    0x05, 0xf9, 0xc3, 0xf6, 0x04, 0xeb, 0xff, 0x73, 0xdf, 0x45, 0xdb, 0x82,
+    0xd3, 0xaf, 0x9a, 0xee, 0xd3, 0x45, 0x89, 0x7b, 0xf1, 0x91, 0xd7, 0xf9,
+    0xb1, 0x9c, 0x00, 0x3c, 0x75, 0x4e, 0x8e, 0x0c, 0x27, 0xe1, 0xf7, 0x8b,
+    0x7f, 0x1c, 0xbf, 0x67, 0x20, 0x54, 0x3a, 0xfd, 0xf7, 0x6f, 0x39, 0x07,
+    0x5e, 0xd4, 0x09, 0xd6, 0xec, 0x1e, 0x2a, 0x15, 0xdf, 0xfd, 0x19, 0xac,
+    0x10, 0xa0, 0x20, 0x4e, 0xbc, 0x31, 0x39, 0xd4, 0x27, 0xb5, 0xf9, 0xfd,
+    0xf4, 0x72, 0x16, 0x75, 0x48, 0xf0, 0xb4, 0x45, 0x79, 0x6f, 0xe3, 0xae,
+    0x40, 0x1d, 0x5c, 0x36, 0x1b, 0x63, 0x77, 0xe4, 0xd9, 0xfb, 0xe8, 0xeb,
+    0xfe, 0x0f, 0x71, 0x78, 0xfc, 0x9c, 0xeb, 0xf7, 0xbc, 0xf2, 0xd1, 0xd7,
+    0xfe, 0xff, 0x37, 0x0e, 0xce, 0xe3, 0xcc, 0x75, 0x6e, 0x7d, 0x3b, 0x09,
+    0xed, 0x23, 0xaf, 0xb3, 0x19, 0xd1, 0xd5, 0x06, 0xc7, 0xc2, 0x17, 0x7e,
+    0x27, 0x54, 0x26, 0x5b, 0x90, 0xa1, 0xe2, 0xb6, 0x88, 0x2f, 0xfa, 0x35,
+    0xf7, 0x39, 0x99, 0x31, 0xd7, 0xf7, 0x24, 0x0c, 0xc9, 0x8e, 0xbe, 0x78,
+    0x4d, 0xb3, 0xab, 0x0f, 0x3f, 0x85, 0xb7, 0xd2, 0xfb, 0xd8, 0x3a, 0xf7,
+    0x22, 0x47, 0x53, 0x9b, 0xed, 0x84, 0x77, 0xf4, 0x2f, 0x13, 0x93, 0x1d,
+    0x7d, 0xf6, 0x36, 0xb4, 0x75, 0xfb, 0x03, 0xd8, 0xe9, 0xd7, 0xdc, 0x46,
+    0x58, 0xce, 0xa1, 0x3c, 0xbd, 0x13, 0x50, 0x51, 0x25, 0xa7, 0x1a, 0x84,
+    0xd8, 0x91, 0x7f, 0xa4, 0x4f, 0x0b, 0xeb, 0xf9, 0x05, 0xd7, 0x1d, 0x3a,
+    0xff, 0xf4, 0x2e, 0x24, 0x11, 0x8e, 0xbe, 0x70, 0xea, 0x3a, 0xa4, 0x7a,
+    0x1b, 0x68, 0xd7, 0xbd, 0x80, 0x3a, 0xfe, 0x5a, 0x6b, 0x48, 0x13, 0xaf,
+    0x3f, 0x14, 0x3a, 0xbf, 0x3c, 0x86, 0x4b, 0x2f, 0xf3, 0x47, 0x36, 0x0e,
+    0x68, 0xeb, 0xfe, 0xde, 0x4f, 0x83, 0x9e, 0xd1, 0xd7, 0xfe, 0xcd, 0xe5,
+    0xd8, 0xd2, 0x9d, 0x83, 0xaa, 0x49, 0xe7, 0x6e, 0xf5, 0x31, 0x2f, 0x18,
+    0xfa, 0x48, 0x26, 0x5b, 0x46, 0xf6, 0xdb, 0x3a, 0xe9, 0x68, 0xeb, 0x3c,
+    0x8d, 0x4e, 0xe2, 0x77, 0xde, 0x41, 0x64, 0xab, 0x7e, 0x75, 0xa3, 0x0d,
+    0x97, 0x48, 0x6f, 0xf9, 0xc7, 0xda, 0xdf, 0x4e, 0xc6, 0x75, 0x3a, 0x2e,
+    0x40, 0xb3, 0xf9, 0x2d, 0xfd, 0xd4, 0xd7, 0x39, 0x87, 0x5f, 0xf9, 0x33,
+    0xda, 0xe6, 0x6a, 0x37, 0x3a, 0xff, 0xd0, 0xcf, 0xd9, 0xf5, 0x8b, 0x86,
+    0x33, 0xae, 0x76, 0x4e, 0xb6, 0x35, 0x18, 0x7d, 0x2c, 0xf1, 0xee, 0xc4,
+    0x4b, 0xff, 0xba, 0xe9, 0xe9, 0x62, 0x83, 0x80, 0x3a, 0xfc, 0x33, 0x47,
+    0x60, 0xeb, 0xf0, 0x1f, 0x66, 0x04, 0xeb, 0xf6, 0x77, 0x77, 0x63, 0x3a,
+    0xf8, 0x1a, 0x81, 0x3a, 0xff, 0x73, 0xae, 0x9a, 0x4d, 0x87, 0x54, 0x1e,
+    0x9e, 0x10, 0x5f, 0xfd, 0xdc, 0x11, 0x7f, 0x7c, 0x94, 0x2c, 0xea, 0x44,
+    0xdc, 0x1d, 0x08, 0x04, 0xc2, 0x51, 0xa7, 0xdf, 0x10, 0x5f, 0xcc, 0xc7,
+    0x38, 0xf3, 0x1d, 0x7f, 0xc1, 0x86, 0xfd, 0x00, 0x23, 0x73, 0xaf, 0xf9,
+    0xf9, 0x8b, 0x4d, 0xb8, 0x59, 0xd4, 0xd3, 0xf4, 0xfc, 0xee, 0xfb, 0xd1,
+    0xbc, 0x8e, 0xbf, 0x90, 0x1b, 0x62, 0x80, 0x3a, 0xa7, 0x3d, 0x0e, 0x11,
+    0x54, 0x26, 0x71, 0x90, 0xa2, 0x77, 0x3b, 0xfb, 0x67, 0x1e, 0x13, 0x6c,
+    0xeb, 0x61, 0xd4, 0xb3, 0x7e, 0x26, 0x17, 0xe7, 0x9f, 0xd8, 0xd3, 0xaf,
+    0xfd, 0xdc, 0x08, 0x53, 0x7c, 0xdf, 0xc7, 0x5f, 0xdf, 0x03, 0xf5, 0xf9,
+    0xc3, 0xaa, 0x73, 0xf0, 0x09, 0xfd, 0xf3, 0xc2, 0x6d, 0x9d, 0x7f, 0xec,
+    0x0f, 0xcc, 0xd4, 0x67, 0x00, 0x75, 0xff, 0x42, 0x07, 0xc2, 0xfb, 0xe8,
+    0xea, 0x84, 0x5d, 0x04, 0x8f, 0xa4, 0x42, 0x7d, 0x4c, 0x4b, 0x64, 0x04,
+    0xc5, 0x8c, 0xb1, 0x54, 0x88, 0x85, 0x4c, 0xe6, 0x12, 0x23, 0x0c, 0x22,
+    0xb2, 0x30, 0x15, 0x12, 0xda, 0xd7, 0xbc, 0x30, 0x91, 0x4a, 0x62, 0x4e,
+    0x46, 0xac, 0xb4, 0x1e, 0xc7, 0xd4, 0xf2, 0x83, 0x81, 0x1a, 0x58, 0xc3,
+    0xcf, 0x51, 0xda, 0x7a, 0x38, 0xdf, 0xdc, 0xb6, 0xc8, 0x3e, 0xc6, 0xa3,
+    0x7e, 0xda, 0x76, 0xc7, 0x0e, 0xbf, 0xf2, 0x47, 0xba, 0xea, 0x60, 0x80,
+    0xeb, 0xff, 0xcf, 0xcf, 0x8f, 0xef, 0x9e, 0xdd, 0xa8, 0x27, 0x57, 0x51,
+    0x13, 0xb0, 0xf2, 0xfe, 0xcf, 0x42, 0x2f, 0x47, 0x5f, 0xe0, 0xc4, 0xb3,
+    0x99, 0xa3, 0xaf, 0x6b, 0xee, 0x8e, 0xbf, 0xfe, 0xcd, 0xe5, 0xef, 0xe7,
+    0x57, 0xae, 0xb4, 0xd1, 0xd7, 0xfd, 0xfb, 0xe0, 0x53, 0x71, 0x73, 0xaf,
+    0x78, 0x60, 0xeb, 0xba, 0xac, 0x27, 0xeb, 0x90, 0xb2, 0x98, 0x95, 0x65,
+    0x6e, 0x62, 0x23, 0xda, 0x53, 0xfa, 0x6f, 0x4a, 0xae, 0x0c, 0x44, 0xb9,
+    0x5b, 0xfb, 0x38, 0xd7, 0x76, 0x9a, 0x2c, 0xdb, 0xff, 0x47, 0x01, 0xed,
+    0x77, 0x10, 0x27, 0x5f, 0x20, 0xbc, 0xe7, 0x57, 0x4f, 0x77, 0x47, 0xb7,
+    0xca, 0xf6, 0x3a, 0x75, 0x2a, 0x78, 0x9b, 0x44, 0x54, 0xaa, 0x3f, 0xde,
+    0x1b, 0x37, 0xc8, 0xbf, 0xbc, 0x3a, 0xf9, 0x07, 0x9f, 0x9d, 0x72, 0xd5,
+    0x83, 0xc4, 0x98, 0x8e, 0xec, 0x09, 0xd7, 0xfe, 0x79, 0x2b, 0x9c, 0x6b,
+    0xbb, 0x4d, 0x14, 0x05, 0xfe, 0x45, 0xc3, 0x1f, 0x72, 0x73, 0xac, 0xae,
+    0x22, 0x51, 0x62, 0xbd, 0x4a, 0xbe, 0x7e, 0x6f, 0x23, 0xaf, 0xde, 0xd4,
+    0x90, 0x07, 0x56, 0x1e, 0x4b, 0x91, 0x5f, 0xd2, 0x57, 0x26, 0x89, 0x1d,
+    0x4a, 0x9e, 0x74, 0x10, 0x5d, 0xff, 0x4e, 0xbf, 0xb5, 0x0b, 0x18, 0x98,
+    0xeb, 0x74, 0xeb, 0xdf, 0x46, 0x63, 0xae, 0xcf, 0x61, 0xae, 0x00, 0x85,
+    0x01, 0x10, 0xa2, 0xb5, 0x77, 0xcd, 0x1d, 0x7b, 0xf0, 0xe1, 0xd7, 0xfb,
+    0x39, 0xe1, 0x85, 0xe8, 0xeb, 0x6d, 0x9d, 0x48, 0x7c, 0x1d, 0x1c, 0x01,
+    0x8d, 0xf3, 0x5d, 0xda, 0x68, 0xb7, 0xef, 0x6d, 0xbf, 0x8e, 0xbf, 0xbe,
+    0xf9, 0xda, 0xfc, 0x3a, 0xb8, 0x7f, 0x2b, 0x2d, 0x00, 0xf5, 0xf6, 0x0a,
+    0x4c, 0x75, 0xee, 0xc7, 0x0e, 0xbf, 0x75, 0x39, 0xd7, 0x3a, 0xff, 0xf7,
+    0x62, 0x7f, 0x67, 0x47, 0x3d, 0xd4, 0x3a, 0xf2, 0xf0, 0x27, 0x59, 0x67,
+    0x5f, 0xf7, 0x62, 0x70, 0xe3, 0x3a, 0x56, 0x11, 0x69, 0x83, 0x73, 0x13,
+    0x3a, 0x47, 0xd1, 0xbb, 0xf7, 0xa5, 0xaf, 0xba, 0x3a, 0xf6, 0xba, 0x13,
+    0xaf, 0xdf, 0x7c, 0x30, 0x03, 0xa9, 0x67, 0x89, 0xb0, 0x72, 0xff, 0xef,
+    0x69, 0x35, 0x03, 0x9e, 0xea, 0x1d, 0x78, 0x73, 0xa7, 0x52, 0xcf, 0x6f,
+    0x62, 0x0d, 0xf8, 0x30, 0xc7, 0xfa, 0xce, 0xbf, 0xe7, 0xd4, 0x60, 0x87,
+    0xb0, 0x75, 0xff, 0xd8, 0xbe, 0x66, 0xfd, 0x17, 0x63, 0x9c, 0xeb, 0xb5,
+    0xae, 0x1f, 0xe0, 0x9a, 0xd4, 0x26, 0xef, 0x8f, 0xe8, 0x48, 0xf0, 0xa7,
+    0xbe, 0x74, 0x1f, 0x1d, 0x7b, 0x91, 0xe3, 0xaf, 0xe9, 0x9c, 0x3d, 0x45,
+    0x9d, 0x7f, 0x79, 0x30, 0x30, 0xb3, 0xab, 0xc7, 0xb0, 0xc9, 0x6d, 0xda,
+    0x13, 0xaf, 0xed, 0xf5, 0x0d, 0xc5, 0x9d, 0x5c, 0x46, 0xc3, 0xb9, 0xe8,
+    0x8f, 0xf1, 0x5b, 0xee, 0xa8, 0x15, 0x9d, 0x76, 0x48, 0xea, 0xc3, 0x70,
+    0x24, 0x74, 0xc5, 0xaf, 0x85, 0x44, 0x27, 0x24, 0x44, 0x17, 0x8c, 0x85,
+    0x3a, 0x17, 0xcd, 0x0d, 0x4e, 0x3d, 0xf6, 0x3e, 0x50, 0x1f, 0x8c, 0x3d,
+    0xfc, 0xeb, 0x7f, 0x3e, 0xea, 0xad, 0xfc, 0x75, 0x2a, 0x8f, 0x21, 0x86,
+    0x25, 0xfc, 0x15, 0x75, 0xed, 0x6e, 0x75, 0xcc, 0x43, 0x16, 0x75, 0xe5,
+    0xbe, 0xe7, 0x5d, 0xb1, 0x0e, 0xbe, 0xe7, 0x33, 0xe9, 0xd7, 0xed, 0x4f,
+    0x8c, 0xaa, 0xc4, 0x9f, 0xb4, 0x10, 0x4c, 0x38, 0xe2, 0xf5, 0x09, 0x83,
+    0x24, 0x29, 0xaf, 0xff, 0xf9, 0x82, 0x9e, 0xfd, 0xe7, 0x57, 0x25, 0xd8,
+    0xe6, 0x60, 0xa8, 0x75, 0xff, 0xff, 0xe4, 0x6b, 0xf1, 0xfb, 0x2c, 0xf6,
+    0x07, 0x4e, 0xbc, 0xe4, 0xf1, 0xb9, 0xd7, 0xee, 0x35, 0xdd, 0xa6, 0x8a,
+    0x52, 0xff, 0xf9, 0xfc, 0x39, 0x3f, 0x23, 0xa9, 0xdc, 0xe1, 0xd7, 0x9e,
+    0x4a, 0xc2, 0x3d, 0xb1, 0xd8, 0x06, 0x77, 0xfd, 0x25, 0x73, 0x8d, 0x77,
+    0x69, 0xa2, 0x4e, 0xb2, 0xab, 0x44, 0x2b, 0xa0, 0x54, 0x42, 0x68, 0x82,
+    0x79, 0xc7, 0xe9, 0x47, 0x1a, 0x1b, 0xe9, 0xd5, 0xc8, 0xc9, 0x94, 0x43,
+    0x6c, 0x69, 0x89, 0x18, 0x63, 0x1c, 0x2f, 0x66, 0x27, 0xe4, 0x2d, 0x97,
+    0x5b, 0x1d, 0xf6, 0x32, 0xc7, 0x6c, 0x04, 0x30, 0xc6, 0x19, 0xba, 0xa4,
+    0x0f, 0x7a, 0x32, 0xef, 0xc9, 0xf6, 0x47, 0xcd, 0x7e, 0xe3, 0x5d, 0xda,
+    0x68, 0x87, 0xef, 0xfc, 0xf2, 0x57, 0x38, 0xd7, 0x76, 0x9a, 0x25, 0x3b,
+    0x2b, 0x87, 0xfa, 0xb3, 0x3b, 0xfc, 0xae, 0x71, 0xae, 0xed, 0x34, 0x44,
+    0xf7, 0xf4, 0xc9, 0xed, 0x7e, 0xb3, 0xaf, 0xff, 0x30, 0xca, 0x32, 0xc7,
+    0x38, 0x58, 0x5f, 0x3e, 0x77, 0x6c, 0xeb, 0xf7, 0x1a, 0xee, 0xd3, 0x44,
+    0x63, 0x7d, 0x0b, 0x68, 0x0e, 0xbf, 0xfe, 0x94, 0xec, 0x34, 0x31, 0x73,
+    0xb7, 0x9f, 0x3e, 0x77, 0x6c, 0xea, 0xea, 0x21, 0x40, 0x43, 0x7c, 0x9b,
+    0xc9, 0x8b, 0x3a, 0xca, 0xc2, 0x72, 0x72, 0x2f, 0xc6, 0x2e, 0xc2, 0xe3,
+    0xc4, 0x77, 0xff, 0x95, 0x5b, 0xc9, 0x5c, 0xe3, 0x5d, 0xda, 0x68, 0x9e,
+    0x6f, 0xe5, 0x41, 0x03, 0x2d, 0x1d, 0x50, 0xab, 0x4e, 0x72, 0x89, 0x47,
+    0xa5, 0xd5, 0x5f, 0x2b, 0xdf, 0xb8, 0xd7, 0x76, 0x9a, 0x22, 0x0b, 0xff,
+    0x3c, 0x95, 0xce, 0x35, 0xdd, 0xa6, 0x89, 0x52, 0xfe, 0xe7, 0xfd, 0x81,
+    0x69, 0xd7, 0xf3, 0x53, 0x36, 0xbb, 0x07, 0x54, 0x1e, 0xde, 0x16, 0xd9,
+    0x5c, 0x47, 0xc2, 0xcc, 0xc6, 0x14, 0xb7, 0xee, 0x35, 0xdd, 0xa6, 0x88,
+    0xa2, 0xf4, 0x03, 0x0e, 0xb2, 0xb8, 0x79, 0xbf, 0x4c, 0xef, 0xf2, 0xb9,
+    0xc6, 0xbb, 0xb4, 0xd1, 0x19, 0x5f, 0xb8, 0xd7, 0x76, 0x9a, 0x26, 0x5b,
+    0xf4, 0xb3, 0xce, 0xd3, 0xaf, 0xca, 0xad, 0xe4, 0xae, 0x1e, 0xce, 0xe6,
+    0x77, 0xee, 0x35, 0xdd, 0xa6, 0x8a, 0x92, 0xc2, 0x75, 0xbe, 0x9d, 0x65,
+    0x70, 0xf5, 0x18, 0xcc, 0xff, 0x0f, 0xbf, 0xca, 0xe7, 0x1a, 0xee, 0xd3,
+    0x45, 0x75, 0x7f, 0x95, 0xce, 0x35, 0xdd, 0xa6, 0x8b, 0x16, 0xff, 0xe5,
+    0xbc, 0x95, 0xce, 0x35, 0xdd, 0xa6, 0x89, 0xea, 0xff, 0x99, 0x55, 0xe1,
+    0x36, 0xd3, 0x68, 0xeb, 0xff, 0xff, 0xc1, 0xc6, 0x55, 0x1c, 0x51, 0x47,
+    0xf6, 0x90, 0x66, 0x86, 0xf3, 0x37, 0x3a, 0xff, 0xfd, 0x30, 0xc2, 0xd5,
+    0xcd, 0x23, 0x21, 0x77, 0x50, 0xeb, 0xb5, 0xe3, 0xae, 0xd0, 0x0e, 0xbf,
+    0x0b, 0xac, 0x60, 0xeb, 0xfb, 0xfd, 0x75, 0xe4, 0xab, 0x16, 0x7a, 0x0c,
+    0x8b, 0x7d, 0x16, 0xbf, 0x67, 0xb4, 0x8b, 0x3a, 0xff, 0xf4, 0x6f, 0xec,
+    0x99, 0x39, 0xed, 0x7e, 0xc6, 0x75, 0xe7, 0xdd, 0x51, 0x3f, 0x5f, 0x13,
+    0x56, 0x27, 0x57, 0xc8, 0x53, 0x6a, 0x1a, 0x34, 0x15, 0x4b, 0xfe, 0x94,
+    0x4b, 0x4a, 0xab, 0x19, 0x85, 0x04, 0x95, 0x3b, 0x7e, 0x4e, 0x8b, 0xcc,
+    0x75, 0xfa, 0x58, 0x1f, 0x98, 0x75, 0x30, 0x0f, 0x3a, 0x09, 0xaf, 0xd9,
+    0xe4, 0xff, 0x47, 0x5c, 0xc4, 0xb1, 0x53, 0xa9, 0x8a, 0x9e, 0x43, 0x0c,
+    0x4f, 0x7e, 0x61, 0xcc, 0x4e, 0xb9, 0xe3, 0xaf, 0xf7, 0xd1, 0xce, 0x72,
+    0x1a, 0x75, 0x31, 0x27, 0xcc, 0xc2, 0x33, 0xbe, 0xe2, 0xfd, 0xb9, 0xd7,
+    0xf3, 0x12, 0xc4, 0x30, 0x22, 0x4b, 0x3a, 0xf3, 0x73, 0xa5, 0x5e, 0x5c,
+    0x68, 0xeb, 0xc0, 0xe4, 0x1d, 0x7f, 0x60, 0x12, 0x64, 0x64, 0xeb, 0xff,
+    0x3e, 0xbe, 0x6b, 0x59, 0x29, 0x41, 0xd7, 0xff, 0xe1, 0x75, 0x13, 0x91,
+    0x29, 0x66, 0x80, 0x08, 0x3a, 0x82, 0x8b, 0xf5, 0x0b, 0x7a, 0x7f, 0x7f,
+    0xff, 0x71, 0x36, 0x9d, 0x6a, 0xc7, 0x38, 0x9b, 0x4d, 0xfe, 0x73, 0xaf,
+    0x93, 0xbf, 0x56, 0x75, 0xff, 0xe4, 0x53, 0xe6, 0x0b, 0xef, 0xa5, 0x14,
+    0x73, 0xa9, 0xa7, 0xe0, 0x24, 0x77, 0xff, 0x9f, 0x43, 0x80, 0x57, 0xa8,
+    0xd7, 0xe1, 0xd7, 0x0b, 0x27, 0x5f, 0xc1, 0xc5, 0x3d, 0x8d, 0x3a, 0xfb,
+    0xb0, 0xb6, 0x9d, 0x50, 0x7c, 0x8e, 0x2d, 0xe2, 0xdb, 0xf0, 0x52, 0x64,
+    0x64, 0xeb, 0xff, 0xbe, 0x44, 0x0c, 0x2f, 0xe7, 0xce, 0xed, 0x9d, 0x50,
+    0x7e, 0x62, 0x51, 0x7f, 0xee, 0xe4, 0xdd, 0x4e, 0xc7, 0x20, 0xeb, 0x9f,
+    0x73, 0xaf, 0xf3, 0xe9, 0xfb, 0xf8, 0xce, 0x75, 0x09, 0xe4, 0xfe, 0x2d,
+    0x53, 0xae, 0x17, 0x48, 0x6d, 0x21, 0xb5, 0xc3, 0x15, 0xc3, 0x4f, 0xa4,
+    0x23, 0x0a, 0xcf, 0x42, 0x83, 0xe9, 0x06, 0xd4, 0x21, 0xaf, 0x0b, 0xf8,
+    0xeb, 0xc2, 0x9a, 0x3a, 0xcc, 0xb0, 0x0d, 0xa4, 0x0d, 0x5d, 0x1d, 0x3a,
+    0xfb, 0x9b, 0x1d, 0x67, 0x5f, 0x96, 0x2f, 0xed, 0x1d, 0x7a, 0x33, 0x87,
+    0x5f, 0xfe, 0x6b, 0xf1, 0xfc, 0x9a, 0x81, 0x80, 0x1d, 0x69, 0x74, 0xf8,
+    0x3e, 0x8d, 0x56, 0xe8, 0xb0, 0xe4, 0x21, 0xab, 0x13, 0x3c, 0x69, 0x5a,
+    0x0a, 0xff, 0x0d, 0x3b, 0xda, 0xda, 0xda, 0x3a, 0xff, 0xba, 0xfe, 0x89,
+    0xb4, 0x8b, 0x3a, 0xff, 0x44, 0x87, 0x37, 0xf6, 0x1d, 0x7f, 0xfd, 0xed,
+    0x07, 0x98, 0x8a, 0x75, 0x97, 0x19, 0xce, 0xbd, 0xdf, 0xd6, 0x75, 0x62,
+    0x3e, 0x50, 0x8b, 0x87, 0x1a, 0x31, 0xfd, 0x46, 0xfe, 0xf6, 0xa6, 0x81,
+    0x9c, 0xeb, 0xf0, 0xa8, 0x99, 0xa3, 0xaf, 0xcc, 0xbf, 0x9d, 0xa7, 0x5f,
+    0xfd, 0x8c, 0xb8, 0x31, 0xbd, 0x70, 0x68, 0xeb, 0xff, 0x69, 0xf7, 0x81,
+    0x70, 0xe2, 0x87, 0x52, 0x23, 0x37, 0xa4, 0xc2, 0x4f, 0xe4, 0x3b, 0xa3,
+    0xa7, 0x58, 0x27, 0x52, 0xcd, 0x28, 0x8a, 0xdf, 0x08, 0x7e, 0x28, 0x75,
+    0xfd, 0x9a, 0x65, 0xc6, 0x73, 0xab, 0x0f, 0xc5, 0xc8, 0x04, 0x92, 0xfd,
+    0xfa, 0x9a, 0x0c, 0x1d, 0x79, 0x69, 0xa3, 0xaf, 0xfb, 0x05, 0xe5, 0xa9,
+    0x33, 0x39, 0xd7, 0xd2, 0xd2, 0x09, 0xd6, 0x89, 0x1e, 0xce, 0xe7, 0x37,
+    0xf9, 0xf9, 0x28, 0x6a, 0x34, 0xea, 0x85, 0x5d, 0xd9, 0x0f, 0xb4, 0x86,
+    0x8f, 0x4b, 0x1c, 0xa4, 0x5d, 0x3f, 0x28, 0xbf, 0xfc, 0xa3, 0xe6, 0xfe,
+    0xf4, 0x66, 0xc4, 0x69, 0xd7, 0xf8, 0x73, 0x5e, 0x77, 0x13, 0xa9, 0x43,
+    0xfa, 0xd8, 0x97, 0x7f, 0xff, 0xe4, 0xe7, 0x23, 0xef, 0x90, 0x7f, 0x96,
+    0x68, 0x3f, 0xbf, 0x24, 0x75, 0xff, 0xfc, 0x38, 0xa6, 0x0f, 0xcd, 0x7b,
+    0xb8, 0xbf, 0xb0, 0x03, 0xaa, 0x11, 0x97, 0x8d, 0xd7, 0xfb, 0xf7, 0xd2,
+    0x4c, 0x8c, 0x9d, 0x48, 0x9a, 0x2f, 0x61, 0xe0, 0x24, 0x37, 0xbb, 0x02,
+    0x75, 0xed, 0xfc, 0xb3, 0xa9, 0xa6, 0xdd, 0xc6, 0xaf, 0xd3, 0x87, 0x88,
+    0xc9, 0xd7, 0xfb, 0xeb, 0xec, 0x49, 0x91, 0x93, 0xaf, 0xfe, 0x41, 0xcf,
+    0xf9, 0x3a, 0xe3, 0x3c, 0x75, 0x41, 0xfd, 0x04, 0xde, 0xfe, 0x0b, 0xf0,
+    0x1b, 0x78, 0x75, 0xee, 0xfd, 0xd8, 0x75, 0xff, 0x42, 0xc7, 0x1b, 0xc4,
+    0x01, 0xd5, 0x23, 0xd6, 0xd1, 0x05, 0xff, 0x44, 0xb1, 0x35, 0xaf, 0xe0,
+    0xeb, 0xff, 0x7a, 0x17, 0xbb, 0x53, 0x7c, 0xe1, 0xd7, 0xee, 0xe7, 0x13,
+    0x47, 0x5e, 0x14, 0x96, 0xe7, 0xcb, 0xe3, 0xfb, 0xff, 0x3e, 0x02, 0x05,
+    0xc3, 0x8a, 0x1d, 0x53, 0xa6, 0x15, 0x28, 0x4e, 0x00, 0xce, 0xff, 0x3e,
+    0xfa, 0xf7, 0xb1, 0x8c, 0xeb, 0xff, 0xc9, 0xce, 0xbe, 0x34, 0x39, 0xc0,
+    0x21, 0xd7, 0xfd, 0x12, 0xd0, 0xc0, 0x1d, 0x67, 0x5f, 0xca, 0x7a, 0x30,
+    0x5a, 0x75, 0xff, 0x4b, 0xef, 0x93, 0xa8, 0x3e, 0x3a, 0xff, 0xf4, 0x66,
+    0xfe, 0xec, 0x78, 0x60, 0x1a, 0x3a, 0xe8, 0x01, 0xd7, 0x75, 0x67, 0x53,
+    0x4d, 0x5e, 0x85, 0x69, 0x11, 0xf2, 0xe5, 0x9e, 0x39, 0xfd, 0xce, 0xf4,
+    0xe9, 0xc3, 0xaf, 0xef, 0xf5, 0xed, 0x67, 0x8e, 0xbf, 0xbf, 0x60, 0xa4,
+    0xc8, 0xc9, 0xd7, 0x67, 0x4e, 0xbc, 0xcb, 0x2c, 0x95, 0x7f, 0xfb, 0xc9,
+    0xed, 0x75, 0x36, 0xfe, 0xf2, 0x24, 0x52, 0xa5, 0xfd, 0x28, 0x98, 0x7a,
+    0x0e, 0x39, 0x77, 0x8c, 0xff, 0x34, 0xbf, 0xff, 0xe4, 0xf4, 0xa0, 0x73,
+    0xdd, 0x4c, 0xf4, 0x2d, 0x39, 0x23, 0xaa, 0x4b, 0xdb, 0x61, 0x6b, 0xc2,
+    0x06, 0xc2, 0x8d, 0x08, 0x66, 0x84, 0x2f, 0x23, 0x2c, 0x59, 0xbf, 0x4d,
+    0x80, 0x8e, 0x31, 0x97, 0xfa, 0x34, 0xbd, 0x89, 0x77, 0xfd, 0xbc, 0xb5,
+    0xac, 0x0b, 0xf8, 0xeb, 0x61, 0xd7, 0xdc, 0x17, 0xd8, 0x75, 0x41, 0xf5,
+    0x28, 0x72, 0x81, 0xf7, 0x81, 0xac, 0x3a, 0xce, 0x75, 0xe8, 0xee, 0x8e,
+    0xad, 0xcd, 0x52, 0x07, 0xdf, 0xff, 0xcf, 0xe4, 0xeb, 0xaf, 0xe6, 0x6a,
+    0x33, 0x98, 0x27, 0x5f, 0xfd, 0xa7, 0xdf, 0x5a, 0xc1, 0x06, 0xde, 0x1d,
+    0x7f, 0xf9, 0x1b, 0xa8, 0xdb, 0xcf, 0x4a, 0x59, 0xa3, 0xab, 0x89, 0x85,
+    0x09, 0x0f, 0x96, 0x36, 0x23, 0x5f, 0x73, 0xb8, 0x27, 0x52, 0x1e, 0xfb,
+    0x9f, 0xdf, 0x7a, 0x37, 0x64, 0xea, 0x6a, 0x7e, 0x3d, 0x8e, 0xb9, 0x92,
+    0x0b, 0x99, 0xe9, 0xd7, 0xff, 0xa0, 0x5b, 0xf7, 0x8e, 0x04, 0xf7, 0x60,
+    0xeb, 0xfc, 0x8c, 0xeb, 0x30, 0x67, 0x3a, 0xfa, 0x35, 0x1b, 0x0e, 0xbf,
+    0xfa, 0x05, 0xfd, 0x28, 0x51, 0xd9, 0xf1, 0xd5, 0xd3, 0xe5, 0xfc, 0x8a,
+    0xf7, 0xc7, 0x69, 0xd4, 0xd4, 0xcd, 0xc0, 0x2f, 0xa4, 0x9f, 0x42, 0x5f,
+    0x68, 0x8e, 0xf9, 0x7f, 0x60, 0x4e, 0xbe, 0x40, 0xe2, 0xce, 0xbe, 0x77,
+    0x10, 0x1d, 0x66, 0x60, 0xdf, 0xa8, 0x41, 0x77, 0xeb, 0x3a, 0xff, 0x32,
+    0xf3, 0x64, 0xa1, 0x8c, 0xea, 0x43, 0xf5, 0xe9, 0x46, 0x85, 0xef, 0xf4,
+    0x3f, 0x3a, 0xcb, 0x84, 0xab, 0x99, 0x64, 0xaa, 0x09, 0xe5, 0x32, 0x65,
+    0x7b, 0xc8, 0xc6, 0x52, 0xa6, 0x8e, 0xfe, 0xdd, 0xa9, 0xae, 0xa1, 0xd7,
+    0xdf, 0xcb, 0xff, 0x1d, 0x48, 0x9f, 0x8c, 0xd0, 0xd6, 0xd4, 0x26, 0xfc,
+    0x5f, 0xb6, 0x5b, 0x7d, 0xcc, 0x76, 0x33, 0xae, 0x67, 0x47, 0x5b, 0x0e,
+    0xb6, 0xf8, 0x69, 0xbc, 0x2f, 0x7d, 0xbc, 0x98, 0x1b, 0x9d, 0x7f, 0xf6,
+    0xb4, 0x11, 0x80, 0xf6, 0x3d, 0xa3, 0xaa, 0x11, 0x25, 0x84, 0xff, 0x94,
+    0x5f, 0xfb, 0xc9, 0xc7, 0x06, 0xd7, 0xb3, 0xa7, 0x5f, 0xf2, 0x32, 0x39,
+    0xe4, 0xfc, 0x07, 0x5f, 0xe7, 0xe7, 0xb4, 0x28, 0xa1, 0xd7, 0xff, 0xb5,
+    0x8a, 0x67, 0xfc, 0x70, 0xc7, 0x60, 0xea, 0x92, 0x64, 0x48, 0x5e, 0xc6,
+    0x80, 0xe7, 0x1a, 0x32, 0xbf, 0xff, 0xfb, 0xae, 0x9e, 0x8e, 0x8e, 0x7b,
+    0xa9, 0xf6, 0x51, 0xb1, 0x04, 0x07, 0x5e, 0xc4, 0xe1, 0xd7, 0xfa, 0x48,
+    0xbe, 0xee, 0xec, 0x67, 0x5f, 0x3f, 0x22, 0x47, 0x5f, 0xf3, 0xef, 0xf3,
+    0x7d, 0x60, 0xa8, 0x75, 0x4e, 0x8a, 0xcd, 0xc6, 0x96, 0x6d, 0xe2, 0x0b,
+    0xee, 0xb1, 0xa2, 0xce, 0xbc, 0x30, 0x03, 0xaf, 0x42, 0xf3, 0xe1, 0xbe,
+    0xd1, 0x25, 0xff, 0xa3, 0x7e, 0xc2, 0xdb, 0xd4, 0x98, 0xea, 0x85, 0x41,
+    0x99, 0x18, 0xea, 0x3e, 0xf0, 0xce, 0xfe, 0x10, 0xeb, 0x48, 0xb3, 0xaf,
+    0xcd, 0x79, 0xf1, 0x93, 0xaf, 0xd1, 0xc0, 0xe0, 0x9d, 0x58, 0x7f, 0x22,
+    0x59, 0xe2, 0x8b, 0xff, 0xa0, 0x11, 0xd5, 0x8b, 0xa9, 0xd4, 0x3a, 0xcc,
+    0x23, 0xaf, 0xee, 0xc0, 0xb2, 0xfb, 0x9d, 0x7f, 0xe1, 0x9a, 0x30, 0x67,
+    0xcd, 0xfc, 0x75, 0x04, 0xfa, 0xdc, 0xb6, 0xf2, 0x9f, 0x56, 0x75, 0xff,
+    0xc8, 0x1e, 0xc3, 0x60, 0x0e, 0x20, 0x3a, 0xff, 0xff, 0x96, 0xe3, 0xbc,
+    0x95, 0x67, 0x13, 0x66, 0x0e, 0x05, 0xe4, 0x78, 0xbd, 0x6f, 0xca, 0x79,
+    0xdc, 0x4e, 0xbc, 0x3f, 0xce, 0x75, 0x39, 0xe1, 0xf8, 0x9a, 0x91, 0x1b,
+    0x03, 0x0b, 0x7a, 0x85, 0x4d, 0xbc, 0x2d, 0x5a, 0x13, 0xbf, 0x89, 0x0e,
+    0x87, 0xff, 0x8c, 0x66, 0xe6, 0x25, 0x8b, 0x3a, 0xf2, 0x47, 0x0e, 0xa6,
+    0x11, 0xba, 0xe9, 0x05, 0xff, 0xdc, 0x45, 0xc3, 0x18, 0xe2, 0xf7, 0x83,
+    0xaa, 0x47, 0xd5, 0x31, 0x2d, 0xf2, 0x0b, 0x84, 0xeb, 0xd3, 0xad, 0x0e,
+    0xa0, 0x9b, 0xb1, 0x1f, 0xbf, 0x4b, 0x36, 0x44, 0x8e, 0xbd, 0x9c, 0x83,
+    0xab, 0x74, 0x60, 0x22, 0xf7, 0x08, 0x3a, 0x51, 0x7f, 0xfd, 0x9e, 0xd6,
+    0x4d, 0xd8, 0xd9, 0x9d, 0xec, 0x1d, 0x7f, 0xff, 0xfe, 0x4c, 0xdf, 0x49,
+    0x8c, 0xfc, 0xcd, 0xe5, 0xa4, 0xf6, 0x93, 0x70, 0x87, 0xf9, 0xce, 0xbf,
+    0xff, 0x20, 0x87, 0xe7, 0xdf, 0x26, 0x9d, 0x07, 0xf9, 0x1d, 0x42, 0x99,
+    0x87, 0x94, 0x36, 0x42, 0x26, 0xf7, 0xfc, 0x91, 0xd7, 0xf3, 0xf8, 0x1f,
+    0x46, 0x47, 0x5f, 0xe9, 0x7d, 0x81, 0x1f, 0xd6, 0x75, 0x7c, 0x3f, 0xf9,
+    0xc7, 0x5c, 0xba, 0xff, 0x44, 0x91, 0x56, 0x59, 0x64, 0xab, 0xca, 0x60,
+    0x4e, 0xbf, 0xba, 0xfc, 0x6c, 0x78, 0xeb, 0x9c, 0x27, 0x5f, 0xdc, 0x7d,
+    0x75, 0xe4, 0x75, 0xb7, 0x3a, 0xe4, 0x64, 0xeb, 0xbe, 0x80, 0xea, 0x98,
+    0xd7, 0x00, 0x5a, 0xf4, 0x9c, 0x27, 0x5c, 0xcb, 0x27, 0x54, 0x91, 0xab,
+    0x82, 0xad, 0x2c, 0x43, 0xfd, 0x11, 0x32, 0x37, 0x7b, 0xdf, 0x40, 0x52,
+    0xa7, 0xad, 0x7f, 0xdd, 0xc5, 0xa0, 0x67, 0xff, 0x47, 0x5f, 0xf2, 0x07,
+    0x16, 0x93, 0x23, 0x27, 0x5f, 0xfe, 0x70, 0xe6, 0x0a, 0x9a, 0xd6, 0x08,
+    0x0e, 0xbe, 0xef, 0xee, 0xa4, 0x1f, 0xfa, 0xce, 0x2f, 0xff, 0xe9, 0x3e,
+    0xb5, 0x19, 0x3f, 0xf2, 0x0f, 0x05, 0xd9, 0x3a, 0xd0, 0x14, 0x4b, 0x21,
+    0xd5, 0x69, 0x37, 0x6f, 0x46, 0x9f, 0x7e, 0xd3, 0xcf, 0xae, 0x9d, 0x52,
+    0x56, 0xd6, 0x11, 0xcd, 0xe3, 0x57, 0x48, 0xe9, 0xbc, 0x55, 0x7e, 0xd9,
+    0xf7, 0xa9, 0xe3, 0xaf, 0xfb, 0x3d, 0xd8, 0xe7, 0xb1, 0xa7, 0x5e, 0x8e,
+    0x4c, 0x75, 0x42, 0xf6, 0x5e, 0x46, 0xda, 0x90, 0xb6, 0xe9, 0x8b, 0xcb,
+    0xa1, 0x02, 0xc0, 0x95, 0xed, 0x9b, 0xde, 0xd3, 0xcc, 0x75, 0xff, 0xc8,
+    0x17, 0xf2, 0x6b, 0x25, 0x9d, 0x3a, 0xe7, 0xda, 0x3a, 0xd9, 0xd3, 0xd9,
+    0xf2, 0x0d, 0x6e, 0x89, 0xc1, 0x75, 0xbc, 0x2d, 0xda, 0x3a, 0xfb, 0x37,
+    0x9f, 0x61, 0xd7, 0xfc, 0x21, 0xc1, 0xfe, 0x59, 0xa3, 0xaf, 0xf7, 0xdf,
+    0x0e, 0x4e, 0x9c, 0x3a, 0xfb, 0xc9, 0xa4, 0x3a, 0xb1, 0x19, 0xdc, 0x1e,
+    0x72, 0x51, 0x37, 0xfc, 0xd2, 0xff, 0xba, 0x81, 0x46, 0x0c, 0x0a, 0x1d,
+    0x7f, 0x9e, 0x58, 0x1e, 0x6b, 0x47, 0x5f, 0x46, 0x7d, 0x09, 0xd7, 0xf9,
+    0x44, 0xf3, 0xf5, 0x96, 0x33, 0xaf, 0xf6, 0x4d, 0xdc, 0xd3, 0x89, 0xd7,
+    0xfe, 0x0e, 0x6f, 0x2d, 0x7b, 0x4e, 0x03, 0xab, 0x87, 0xe1, 0xf9, 0x8d,
+    0xff, 0xc8, 0xbf, 0x8d, 0xea, 0x75, 0xa9, 0xa3, 0xaf, 0xf6, 0x4b, 0x3f,
+    0x60, 0xb8, 0x9d, 0x5c, 0x3f, 0xae, 0xa2, 0xdf, 0xff, 0xe4, 0x1c, 0xdf,
+    0xca, 0x3f, 0xbb, 0x1d, 0xcd, 0x8f, 0x23, 0xa8, 0x2a, 0x86, 0xda, 0x64,
+    0x84, 0x5c, 0x85, 0x3f, 0xa1, 0x3b, 0xb0, 0x8a, 0xff, 0x82, 0x9c, 0x8d,
+    0x80, 0xd4, 0x8e, 0xba, 0x16, 0x75, 0xbd, 0x07, 0x9f, 0xd3, 0xab, 0xff,
+    0x46, 0x9f, 0xa8, 0x16, 0xa4, 0xe7, 0x54, 0x2b, 0x6b, 0xc9, 0x4a, 0x8f,
+    0x0b, 0x3f, 0xc9, 0xef, 0x40, 0xf8, 0xeb, 0xfc, 0x9d, 0x4e, 0x4a, 0x68,
+    0x3a, 0xff, 0xfc, 0x9f, 0xb7, 0xee, 0xe0, 0x7d, 0x3f, 0x13, 0x70, 0x1d,
+    0x7c, 0xfc, 0x89, 0x1d, 0x7f, 0xff, 0x20, 0xba, 0x08, 0x39, 0x1d, 0x74,
+    0xf4, 0x74, 0xea, 0x13, 0xf5, 0xf1, 0x05, 0xf9, 0x3d, 0xaf, 0xe7, 0x3a,
+    0xff, 0xf0, 0xa0, 0x3d, 0xbb, 0x53, 0x9f, 0x60, 0x27, 0x5f, 0xf7, 0x7e,
+    0x87, 0xff, 0x68, 0x10, 0x75, 0x42, 0x21, 0xdd, 0x2e, 0x82, 0x9e, 0x02,
+    0x43, 0x39, 0x64, 0x3e, 0x85, 0x85, 0xfb, 0x9f, 0xb7, 0xb0, 0x75, 0xfd,
+    0xc9, 0xa4, 0x9e, 0xd1, 0xd6, 0x18, 0x3d, 0x6c, 0x28, 0xbf, 0xd3, 0x3c,
+    0xcf, 0xbc, 0xb4, 0x75, 0xfc, 0xf3, 0xa4, 0xc8, 0xc9, 0xd5, 0x87, 0xc6,
+    0xe6, 0xb7, 0xf4, 0xf8, 0x33, 0xe3, 0x27, 0x5f, 0xf4, 0x4f, 0xf6, 0x5d,
+    0xfd, 0xe7, 0x3a, 0xb0, 0xfa, 0xf8, 0x5d, 0x66, 0x11, 0xd7, 0xe8, 0xe7,
+    0x33, 0xa7, 0x5f, 0xc2, 0xea, 0x42, 0xe0, 0xea, 0x60, 0x1f, 0x2c, 0x85,
+    0x3f, 0x26, 0xbe, 0x89, 0xd4, 0x50, 0xeb, 0xff, 0xf2, 0x36, 0x17, 0xa7,
+    0xe6, 0x2f, 0xf6, 0xbc, 0x8e, 0xb9, 0x36, 0x1d, 0x6e, 0x9d, 0x52, 0x3f,
+    0xb6, 0x35, 0x4f, 0xc5, 0xef, 0x06, 0x16, 0x75, 0xfe, 0xc0, 0x64, 0xd1,
+    0xbe, 0x8e, 0xa8, 0x3c, 0xec, 0x1b, 0xbf, 0xba, 0xf2, 0x8d, 0x48, 0xeb,
+    0xfe, 0xce, 0xa6, 0xfa, 0xef, 0xfa, 0x3a, 0xec, 0x16, 0x9f, 0x30, 0x0b,
+    0x2f, 0xe1, 0x70, 0x07, 0x04, 0xeb, 0xf2, 0x6d, 0xe7, 0x14, 0x3a, 0xe5,
+    0x24, 0x75, 0xfb, 0xa9, 0xb1, 0x1a, 0x75, 0xd9, 0xd9, 0x1b, 0xf6, 0x8b,
+    0xd2, 0xd1, 0x2b, 0xb6, 0xd3, 0x79, 0x96, 0x59, 0x2a, 0xff, 0xdc, 0x1f,
+    0xdf, 0xee, 0x4d, 0x0b, 0x39, 0x52, 0xfe, 0xfd, 0xd4, 0x99, 0x19, 0x3a,
+    0xcd, 0x3a, 0xa1, 0x11, 0x18, 0xa1, 0xc2, 0x8b, 0xfd, 0x01, 0xc9, 0x40,
+    0xb4, 0xea, 0x86, 0x41, 0x94, 0x86, 0xb2, 0x3f, 0x26, 0x38, 0x4e, 0xcd,
+    0x08, 0x8e, 0x42, 0x2d, 0x70, 0x86, 0xe9, 0xa3, 0xc2, 0x7c, 0x61, 0x03,
+    0xa8, 0x43, 0x78, 0xb3, 0xf8, 0x5f, 0xb3, 0x0c, 0xdf, 0xa5, 0xd7, 0xdc,
+    0xe6, 0x74, 0xeb, 0xfb, 0xa9, 0xb5, 0xb5, 0xfa, 0x87, 0x54, 0x1e, 0xb3,
+    0x48, 0x6c, 0xc1, 0x3a, 0xc8, 0x75, 0xff, 0x7a, 0x39, 0xae, 0xc0, 0xf8,
+    0xeb, 0x30, 0x4e, 0xbf, 0xef, 0x47, 0x35, 0xd8, 0x1f, 0x1d, 0x76, 0xa0,
+    0xeb, 0xcb, 0x0c, 0x1d, 0x7f, 0x87, 0xcf, 0x36, 0xa3, 0xc7, 0x52, 0x1e,
+    0x6b, 0x8d, 0xdf, 0x23, 0xe3, 0x4e, 0xbf, 0xf6, 0x6c, 0x1c, 0xd4, 0xc3,
+    0x01, 0x3a, 0xf9, 0xa1, 0x89, 0xce, 0xb8, 0x10, 0x75, 0xed, 0x27, 0x0e,
+    0xac, 0x3d, 0x20, 0x11, 0x78, 0x56, 0xff, 0x4b, 0x05, 0x03, 0x82, 0x75,
+    0xef, 0x69, 0x58, 0x4f, 0x67, 0x05, 0x26, 0x37, 0xeb, 0x10, 0x08, 0x04,
+    0x7f, 0x50, 0x90, 0xf1, 0x75, 0xda, 0x83, 0xaf, 0x2c, 0x30, 0x75, 0xfe,
+    0x1f, 0x3c, 0xda, 0x8f, 0x1d, 0x48, 0x79, 0xae, 0x37, 0x7c, 0x8f, 0x8d,
+    0x3a, 0xff, 0xd9, 0xb0, 0x73, 0x53, 0x0c, 0x04, 0xeb, 0xe6, 0x86, 0x27,
+    0x3a, 0xfe, 0x98, 0x08, 0xc6, 0xf3, 0x1d, 0x70, 0x20, 0xeb, 0xda, 0x4e,
+    0x1d, 0x58, 0x88, 0x36, 0x91, 0x00, 0xc7, 0xc2, 0xb7, 0xfa, 0x58, 0x28,
+    0x1c, 0x13, 0xaf, 0xe1, 0x70, 0xe2, 0x8a, 0xc2, 0xe4, 0x40, 0x45, 0x30,
+    0x3d, 0xb2, 0x84, 0x26, 0x84, 0x47, 0x58, 0x80, 0x40, 0x23, 0xfa, 0x86,
+    0x0f, 0x8f, 0x2f, 0xfe, 0xe4, 0x6f, 0xa1, 0x85, 0xe6, 0xfe, 0x3a, 0xff,
+    0xfc, 0xe1, 0xcc, 0x15, 0x3e, 0x8c, 0x0c, 0xe9, 0xc3, 0xaf, 0x3f, 0x27,
+    0x3c, 0x82, 0x57, 0xd2, 0xcd, 0xe4, 0x79, 0x04, 0xaf, 0x69, 0x02, 0x79,
+    0x04, 0xae, 0x65, 0x93, 0xc8, 0x25, 0x4d, 0x45, 0x2c, 0xc5, 0x3e, 0x2f,
+    0x64, 0xa2, 0xe7, 0xf1, 0x64, 0x12, 0x2a, 0x6f, 0xef, 0xec, 0xee, 0x60,
+    0xa8, 0x75, 0xe7, 0x10, 0x7c, 0x5f, 0x44, 0x89, 0xca, 0x9e, 0x43, 0x01,
+    0x68, 0x83, 0x19, 0xc7, 0x8d, 0x2f, 0xb6, 0xf1, 0xfa, 0x75, 0xb1, 0x8d,
+    0x14, 0x00, 0x7d, 0xb4, 0x8e, 0xbf, 0xd3, 0x4b, 0xf9, 0xfc, 0x93, 0x95,
+    0x7f, 0xd0, 0x32, 0x18, 0x03, 0xac, 0xeb, 0x41, 0xd7, 0xf9, 0x25, 0xfb,
+    0xeb, 0xa8, 0x75, 0xfd, 0x9b, 0x1d, 0x79, 0xd3, 0xad, 0x22, 0xaf, 0x3f,
+    0x27, 0x2a, 0x8a, 0xa8, 0x36, 0xcd, 0x10, 0x58, 0xe5, 0xe8, 0x03, 0x4a,
+    0x54, 0xd6, 0xd2, 0xd1, 0x78, 0x30, 0x90, 0xa8, 0x4c, 0x57, 0x21, 0xdd,
+    0x7f, 0xfd, 0xf4, 0x65, 0xae, 0x87, 0x38, 0x05, 0xa6, 0x8e, 0xbe, 0xfd,
+    0xf9, 0x23, 0xac, 0xb3, 0xae, 0xc9, 0x04, 0xd9, 0x4c, 0x45, 0x7f, 0xf6,
+    0x6f, 0xed, 0x20, 0xc0, 0x1d, 0x67, 0x5f, 0x64, 0xc8, 0xb3, 0xaa, 0x73,
+    0xe3, 0x65, 0x0a, 0xfe, 0x6c, 0x4d, 0x28, 0x01, 0x56, 0x43, 0xaf, 0xfa,
+    0x7f, 0xe4, 0x1e, 0xfe, 0xe2, 0x75, 0xfc, 0x90, 0xb9, 0xf1, 0x93, 0xaf,
+    0xd9, 0x3a, 0xf1, 0x67, 0x5e, 0xd2, 0x70, 0xea, 0x13, 0xc2, 0xf1, 0x3d,
+    0xfc, 0x2e, 0x00, 0x7f, 0xa3, 0xaf, 0xe4, 0x53, 0xec, 0x2d, 0x50, 0xa6,
+    0x0f, 0x81, 0xfc, 0x3b, 0xd3, 0x7f, 0x88, 0x6b, 0x13, 0xc8, 0x42, 0x41,
+    0x8c, 0xd2, 0xf8, 0x72, 0x7f, 0xce, 0xbf, 0xec, 0xf7, 0xc1, 0xc0, 0x7d,
+    0xdc, 0xea, 0x92, 0xea, 0xf8, 0x4a, 0xf0, 0x41, 0x43, 0x7e, 0x1a, 0xf6,
+    0x32, 0x40, 0x13, 0x8c, 0x20, 0xf5, 0x29, 0x63, 0xc6, 0x9b, 0x64, 0x57,
+    0xff, 0xe9, 0xf9, 0xcc, 0x0b, 0xaf, 0xaf, 0xe1, 0x89, 0x8e, 0xbf, 0xff,
+    0xfd, 0xff, 0x3f, 0x98, 0x5c, 0x1a, 0xd6, 0x29, 0x9f, 0xf1, 0xc3, 0x1d,
+    0x83, 0xaf, 0xf9, 0x55, 0xb8, 0x7b, 0x03, 0xf9, 0xd7, 0xdb, 0x5d, 0xff,
+    0xe9, 0xd7, 0x99, 0x65, 0x92, 0xae, 0x94, 0x14, 0xa9, 0x7f, 0x50, 0x9b,
+    0xa4, 0xea, 0xb8, 0xf5, 0xb9, 0xcf, 0x11, 0xef, 0xe5, 0x23, 0x9c, 0xce,
+    0x9d, 0x7f, 0x4f, 0x34, 0x98, 0x5c, 0x9c, 0xeb, 0xe4, 0x81, 0xf1, 0xd7,
+    0xa7, 0x71, 0x3a, 0xba, 0x6e, 0xbc, 0x3f, 0x7f, 0xe5, 0x3f, 0xd4, 0x93,
+    0x93, 0xfe, 0x03, 0xaf, 0x3e, 0xec, 0x9d, 0x4a, 0x1f, 0x07, 0x50, 0xef,
+    0xd3, 0xf1, 0x21, 0x67, 0x5f, 0xff, 0x47, 0xdf, 0x0c, 0x01, 0xfc, 0x0f,
+    0xa3, 0x23, 0xa9, 0x88, 0x4e, 0x2f, 0x1b, 0xd2, 0x10, 0x2e, 0x47, 0xe2,
+    0x7b, 0xff, 0x3f, 0xb4, 0xce, 0x74, 0x0f, 0xe3, 0xaf, 0xff, 0xfd, 0x9e,
+    0x86, 0x8e, 0x60, 0xc4, 0xbd, 0xd7, 0x58, 0xe6, 0xc3, 0xa8, 0x28, 0xa6,
+    0x64, 0xfa, 0xf7, 0xd0, 0xcc, 0x75, 0xe9, 0x20, 0x9d, 0x7d, 0x3f, 0xdd,
+    0xa6, 0x4e, 0xbf, 0xe8, 0xeb, 0xa7, 0xa6, 0x46, 0x4e, 0xbf, 0xfc, 0xa4,
+    0x6b, 0x91, 0xd1, 0xcf, 0x42, 0xce, 0xbf, 0xed, 0x0e, 0x6c, 0x49, 0x91,
+    0x93, 0xaf, 0xff, 0xef, 0xde, 0x76, 0xff, 0x3f, 0xb3, 0xa3, 0x9e, 0xea,
+    0x1d, 0x7e, 0x89, 0x87, 0xfd, 0x1d, 0x58, 0x98, 0x3a, 0x24, 0x74, 0xeb,
+    0xcb, 0xb7, 0x20, 0x9d, 0x7f, 0x38, 0x83, 0x3c, 0xa1, 0xd5, 0x0a, 0x90,
+    0x67, 0x24, 0x90, 0xfb, 0x8d, 0x09, 0x4f, 0xa3, 0x3f, 0xd8, 0x79, 0xb6,
+    0x29, 0x7d, 0xdf, 0xd7, 0x07, 0x5c, 0xfa, 0x3a, 0xef, 0xd8, 0x27, 0x53,
+    0x9e, 0x90, 0x91, 0x7e, 0x2b, 0x73, 0xaa, 0xc0, 0x7d, 0x21, 0xa6, 0x2d,
+    0xb5, 0x85, 0x09, 0x36, 0x1e, 0x56, 0xc5, 0x48, 0xd8, 0x71, 0xdc, 0x4e,
+    0x24, 0xcf, 0x28, 0x6e, 0x51, 0x9d, 0x86, 0x59, 0xbe, 0x52, 0x41, 0x94,
+    0x8c, 0xed, 0xb2, 0x87, 0xf7, 0x8d, 0xbd, 0x25, 0x22, 0x31, 0xac, 0x4d,
+    0x1f, 0xef, 0x25, 0x2c, 0x2e, 0x59, 0x47, 0x69, 0x13, 0x2f, 0x19, 0x00,
+    0x21, 0xe2, 0x32, 0xec, 0xf5, 0x48, 0x7b, 0xf5, 0x3a, 0x83, 0xf9, 0x44,
+    0x6c, 0xa5, 0xed, 0xc7, 0x71, 0xf6, 0x59, 0xce, 0xd4, 0x33, 0xaf, 0xcb,
+    0xc4, 0x70, 0x1d, 0x7c, 0xd7, 0x76, 0x9a, 0x28, 0xab, 0xff, 0xf3, 0x82,
+    0x1b, 0xd4, 0xd7, 0x53, 0xdd, 0xc1, 0x3a, 0xb8, 0x7f, 0xe2, 0x5b, 0x7e,
+    0x55, 0x6f, 0x25, 0x61, 0x18, 0xb9, 0x0a, 0x4b, 0xfc, 0xae, 0x71, 0xae,
+    0xed, 0x34, 0x5d, 0x17, 0xff, 0x2a, 0xf2, 0x57, 0x38, 0xd7, 0x76, 0x9a,
+    0x24, 0xbb, 0xf7, 0x1a, 0xee, 0xd3, 0x45, 0xe5, 0x73, 0xec, 0x3a, 0xca,
+    0xe1, 0xe5, 0x6d, 0x99, 0xd4, 0x3e, 0xe6, 0x44, 0xf0, 0x87, 0x91, 0x56,
+    0x42, 0x61, 0xb0, 0x95, 0x98, 0xe5, 0x67, 0xfd, 0x96, 0xb0, 0x37, 0xa5,
+    0x41, 0xa9, 0x66, 0x1e, 0x45, 0xfc, 0xff, 0x64, 0x26, 0xef, 0xff, 0x2a,
+    0xb7, 0x92, 0xb9, 0xc6, 0xbb, 0xb4, 0xd1, 0x2c, 0xdd, 0xff, 0x4e, 0xbf,
+    0xc8, 0x1e, 0xe2, 0x0a, 0x87, 0x5f, 0x75, 0xfd, 0xf9, 0xd7, 0xdd, 0x86,
+    0x35, 0x9d, 0x7b, 0xf6, 0xb9, 0xd5, 0x24, 0x49, 0xa1, 0x8b, 0x19, 0x17,
+    0xd2, 0x4b, 0xf8, 0x3e, 0xfd, 0xe5, 0xa3, 0xaf, 0x79, 0xd6, 0x75, 0xff,
+    0xbb, 0x1d, 0x45, 0x3d, 0xa7, 0x01, 0xd7, 0xf0, 0xfb, 0x90, 0xed, 0x3a,
+    0xf9, 0xae, 0xed, 0x34, 0x46, 0x77, 0xf2, 0x42, 0xe7, 0xc6, 0x4e, 0xb8,
+    0x64, 0x75, 0x96, 0x75, 0xf9, 0x39, 0xd7, 0x57, 0x87, 0xa4, 0xb2, 0xdf,
+    0xa2, 0xb7, 0xf3, 0xc9, 0x38, 0xfc, 0x3a, 0xff, 0xed, 0x27, 0xfa, 0xc1,
+    0xfe, 0x59, 0xa3, 0xaf, 0x6a, 0x37, 0x3a, 0xa4, 0x9e, 0x0e, 0x1f, 0x70,
+    0xad, 0x6f, 0xe2, 0x9d, 0xa2, 0xbf, 0x22, 0x5f, 0xf7, 0x1d, 0x9e, 0xa4,
+    0x72, 0x0e, 0xbf, 0xe9, 0x6b, 0x23, 0xe4, 0x69, 0x67, 0x5f, 0x6f, 0xd8,
+    0xd1, 0xd7, 0xda, 0x8f, 0x68, 0xea, 0xc3, 0xc3, 0xd1, 0x15, 0xff, 0xde,
+    0x4e, 0x38, 0x3e, 0x6f, 0x28, 0x59, 0xd7, 0xe1, 0x89, 0x69, 0xce, 0xa4,
+    0x3e, 0xbd, 0x88, 0xd7, 0xff, 0xff, 0xd9, 0xef, 0x22, 0xf8, 0x99, 0xb8,
+    0xff, 0xe8, 0xef, 0xcd, 0x89, 0xe9, 0xa0, 0xeb, 0xfc, 0xf2, 0xd6, 0x9c,
+    0x64, 0x75, 0xf9, 0x4f, 0x7a, 0x16, 0x75, 0xff, 0xef, 0x43, 0x53, 0xc8,
+    0xb9, 0xb4, 0x82, 0x75, 0xa4, 0x75, 0x21, 0xec, 0x7d, 0x48, 0xbf, 0x02,
+    0x3d, 0x01, 0x3a, 0x91, 0x19, 0x2f, 0x08, 0x0f, 0xc8, 0xef, 0xff, 0xbf,
+    0xf6, 0xb7, 0x94, 0x08, 0x35, 0xf3, 0xf1, 0x3a, 0xf4, 0x7a, 0x0e, 0xa0,
+    0x9f, 0x76, 0xc5, 0x4b, 0xdd, 0xc1, 0x3a, 0x90, 0xdf, 0x7e, 0x49, 0x77,
+    0x66, 0x3a, 0xff, 0x6f, 0xa1, 0xce, 0x06, 0x0e, 0xa4, 0x3c, 0x97, 0x17,
+    0xbe, 0xf7, 0x7f, 0xdb, 0x3a, 0xff, 0x64, 0x71, 0xe4, 0x9d, 0x3a, 0xff,
+    0x23, 0x3a, 0x8e, 0xbb, 0x19, 0xd5, 0xc3, 0xe5, 0xf1, 0x85, 0x22, 0x2b,
+    0x57, 0x08, 0xbb, 0xff, 0xc9, 0xdf, 0xd8, 0xc3, 0xdf, 0xf5, 0xbc, 0x9c,
+    0xea, 0xc3, 0xf7, 0x72, 0x7b, 0xdf, 0x71, 0x84, 0x75, 0xff, 0xef, 0xc0,
+    0xb4, 0x1c, 0x00, 0xe3, 0xcc, 0x75, 0xfe, 0x4e, 0xa4, 0x0c, 0xdf, 0x9d,
+    0x7f, 0x93, 0x99, 0x83, 0xbf, 0x8e, 0xa8, 0x3e, 0x37, 0x32, 0xbf, 0xf7,
+    0xe1, 0xe6, 0x7f, 0xd8, 0x5e, 0x1d, 0x58, 0x99, 0x5f, 0x08, 0x7b, 0x0a,
+    0xbd, 0x10, 0x5f, 0xff, 0x6f, 0x24, 0xe0, 0x7b, 0xff, 0x31, 0xbd, 0xc3,
+    0xae, 0x46, 0x4e, 0xbb, 0x6b, 0x0e, 0xad, 0x1a, 0xef, 0x0b, 0x5f, 0xda,
+    0x8f, 0x6b, 0xa8, 0x75, 0xf8, 0x71, 0x7c, 0xc3, 0xaf, 0xb9, 0xb3, 0x02,
+    0x75, 0x61, 0xfa, 0x2c, 0xb3, 0xf2, 0x5b, 0xe0, 0x26, 0xf2, 0x3a, 0xff,
+    0x40, 0xf9, 0x27, 0x18, 0x3a, 0xff, 0xf2, 0x71, 0x27, 0x81, 0xce, 0xf3,
+    0xfd, 0x87, 0x50, 0x11, 0x3a, 0x24, 0x5e, 0x30, 0xa6, 0x2d, 0x98, 0xbf,
+    0x10, 0xaa, 0x9d, 0x04, 0x25, 0xd9, 0x1e, 0xe2, 0x8c, 0x7b, 0x9b, 0xa3,
+    0xe4, 0xd0, 0x8c, 0xe1, 0x1a, 0xe1, 0x03, 0xd8, 0x7d, 0x3c, 0x38, 0x00,
+    0xd4, 0x31, 0xa2, 0x6a, 0x34, 0xbf, 0x21, 0x6c, 0x7f, 0xdb, 0x84, 0xaf,
+    0xd8, 0x66, 0x5f, 0xff, 0xfd, 0xfe, 0xf2, 0x55, 0xc7, 0xd8, 0xbd, 0x07,
+    0xb1, 0xc0, 0xbb, 0xb2, 0x75, 0x2a, 0x9e, 0x28, 0xc6, 0xa3, 0x7f, 0xf9,
+    0x55, 0xbc, 0x95, 0xce, 0x35, 0xdd, 0xa6, 0x89, 0xa6, 0xff, 0xf2, 0xab,
+    0x79, 0x2b, 0x9c, 0x6b, 0xbb, 0x4d, 0x13, 0x8d, 0xff, 0x9e, 0x4a, 0xe7,
+    0x1a, 0xee, 0xd3, 0x45, 0x03, 0x7d, 0xa1, 0xde, 0x47, 0x59, 0x55, 0x9f,
+    0x67, 0x92, 0xaf, 0xdc, 0x6b, 0xbb, 0x4d, 0x17, 0x05, 0xfc, 0x39, 0xe6,
+    0xa6, 0x8e, 0xba, 0x10, 0xeb, 0xfc, 0x32, 0x84, 0x0e, 0x2c, 0xea, 0xc4,
+    0x51, 0x2c, 0xcf, 0xa5, 0x7f, 0x8a, 0x5f, 0xa4, 0xaa, 0x8c, 0x05, 0x0e,
+    0xa5, 0x4f, 0xb2, 0x0f, 0x6e, 0x70, 0x1d, 0x7e, 0x9a, 0x50, 0x32, 0x3a,
+    0x8e, 0xac, 0x36, 0x22, 0x4f, 0x7d, 0x00, 0xc6, 0x4e, 0xb9, 0x15, 0xe2,
+    0x21, 0x85, 0x1b, 0xe8, 0xfd, 0xff, 0x49, 0x5c, 0xe3, 0x5d, 0xda, 0x68,
+    0x92, 0x6c, 0xaf, 0x51, 0x04, 0xe7, 0xb7, 0x32, 0x03, 0xaf, 0xf3, 0xf8,
+    0x72, 0x77, 0x13, 0xaf, 0xe9, 0x3f, 0x27, 0x0c, 0x1d, 0x7f, 0x60, 0xbe,
+    0xf2, 0xd1, 0xd7, 0xf4, 0x2f, 0x98, 0x1f, 0x1d, 0x73, 0xaa, 0x14, 0x66,
+    0x28, 0x2f, 0x31, 0x87, 0x0b, 0x74, 0x59, 0x53, 0xb6, 0x6d, 0xb2, 0xa7,
+    0x3d, 0xb4, 0xaa, 0x65, 0x70, 0x43, 0x0f, 0x51, 0x9b, 0xfa, 0x32, 0xad,
+    0x90, 0xf5, 0xbf, 0xf2, 0x8e, 0xae, 0x71, 0xae, 0xed, 0x34, 0x5a, 0x97,
+    0xfe, 0x79, 0x2b, 0x9c, 0x6b, 0xbb, 0x4d, 0x12, 0xad, 0xc8, 0xc9, 0xd4,
+    0x75, 0x95, 0x51, 0x16, 0xab, 0x4b, 0xf2, 0x56, 0xd0, 0xb5, 0xfd, 0x9c,
+    0x6b, 0xbb, 0x4d, 0x11, 0x4d, 0xf2, 0x6a, 0x1c, 0xeb, 0xfc, 0x2e, 0x0d,
+    0x7b, 0x1a, 0x75, 0xcb, 0x57, 0x47, 0xa1, 0xe1, 0xfa, 0x55, 0x16, 0xef,
+    0x08, 0x8b, 0xfc, 0xae, 0x71, 0xae, 0xed, 0x34, 0x46, 0x97, 0x7f, 0xd3,
+    0xaf, 0xfc, 0x1c, 0x5a, 0x73, 0x35, 0x34, 0x1d, 0x7f, 0xff, 0xcf, 0xfe,
+    0xbb, 0x81, 0xfb, 0xf7, 0x49, 0xf7, 0xc9, 0xa9, 0xbe, 0x9d, 0x79, 0x1d,
+    0x93, 0xa9, 0x11, 0x90, 0xc6, 0x7a, 0xb7, 0x0b, 0xe6, 0xbb, 0xb4, 0xd1,
+    0x4f, 0xdd, 0xe8, 0x3a, 0xb8, 0x78, 0x5e, 0x2d, 0xbf, 0xf7, 0xa6, 0x8f,
+    0x75, 0xe6, 0xf9, 0x87, 0x5f, 0xfe, 0x45, 0x8f, 0xfd, 0x4e, 0x66, 0xa6,
+    0x83, 0xaf, 0xfe, 0xff, 0xdc, 0xfe, 0x6d, 0x35, 0xe6, 0xd1, 0xd7, 0xff,
+    0x64, 0xdf, 0x8c, 0xfa, 0x6b, 0xcd, 0xa3, 0xaf, 0xbf, 0xea, 0x70, 0xeb,
+    0x2a, 0xc5, 0xaa, 0xb1, 0x88, 0x6f, 0xe3, 0xa2, 0x11, 0x3a, 0x08, 0xa4,
+    0xf9, 0x27, 0x6d, 0x1e, 0xff, 0xf2, 0xab, 0x79, 0x2b, 0x9c, 0x6b, 0xbb,
+    0x4d, 0x13, 0x55, 0xfe, 0x57, 0x38, 0xd7, 0x76, 0x9a, 0x2b, 0xbb, 0xe6,
+    0xbb, 0xb4, 0xd1, 0x5f, 0x5e, 0x65, 0x96, 0x4a, 0xb0, 0x94, 0xa9, 0x7f,
+    0x5c, 0x3e, 0xb5, 0xa6, 0x5e, 0x94, 0x6e, 0x75, 0xe9, 0xb3, 0xa7, 0x5f,
+    0xfb, 0x3a, 0xcb, 0xfb, 0x51, 0x93, 0x9d, 0x6f, 0x1d, 0x7f, 0xc9, 0xcc,
+    0x9d, 0x25, 0x81, 0x3a, 0xb8, 0x78, 0xee, 0x21, 0x7e, 0xdf, 0x6b, 0xbf,
+    0xfd, 0x3a, 0xdc, 0x3a, 0x8e, 0xb7, 0x50, 0xba, 0xe0, 0x85, 0x95, 0xc4,
+    0xdb, 0xa6, 0x22, 0x71, 0xc1, 0x1c, 0xd4, 0x21, 0x7f, 0x21, 0xdb, 0x49,
+    0xbf, 0xfc, 0xaa, 0xde, 0x4a, 0xe7, 0x1a, 0xee, 0xd3, 0x44, 0xf7, 0x7e,
+    0xec, 0x6d, 0x3e, 0xe7, 0x5f, 0xb8, 0xd7, 0x76, 0x9a, 0x2e, 0x1b, 0x2b,
+    0x07, 0xbb, 0x85, 0x57, 0xff, 0x2a, 0xf2, 0x57, 0x38, 0xd7, 0x76, 0x9a,
+    0x24, 0xfa, 0x86, 0x45, 0x3c, 0xf0, 0xff, 0x91, 0x42, 0x92, 0xbc, 0x1b,
+    0x08, 0x29, 0x95, 0xf9, 0x28, 0x63, 0xae, 0x7a, 0x85, 0xa6, 0xc2, 0x7b,
+    0xfc, 0xae, 0x71, 0xae, 0xed, 0x34, 0x45, 0x57, 0xee, 0x35, 0xdd, 0xa6,
+    0x8a, 0x66, 0xfe, 0x4e, 0xe3, 0xee, 0x03, 0xac, 0xae, 0x1e, 0xfe, 0xd9,
+    0x9d, 0xff, 0xe5, 0x56, 0xf2, 0x57, 0x38, 0xd7, 0x76, 0x9a, 0x26, 0x7b,
+    0xff, 0xca, 0xad, 0xe4, 0xae, 0x71, 0xae, 0xed, 0x34, 0x51, 0xb5, 0x3a,
+    0x6e, 0xe1, 0x84, 0xf2, 0x85, 0x7e, 0x57, 0xbf, 0xf3, 0xc9, 0x5c, 0xe3,
+    0x5d, 0xda, 0x68, 0x8e, 0xaf, 0xfe, 0xe4, 0xea, 0xe8, 0x73, 0xda, 0x85,
+    0x9d, 0x4a, 0xa2, 0x3e, 0x12, 0xae, 0xff, 0xa7, 0x5f, 0x35, 0xbf, 0xb4,
+    0xeb, 0xf6, 0x08, 0x72, 0x73, 0xaf, 0xf4, 0x43, 0x73, 0x9c, 0xc3, 0xa9,
+    0x0f, 0x58, 0x49, 0xaf, 0xd9, 0xc6, 0xfe, 0xa1, 0xd7, 0xfe, 0x1c, 0x51,
+    0xe6, 0xd7, 0x60, 0x27, 0x5e, 0x99, 0xfc, 0x75, 0xf3, 0x5d, 0xda, 0x68,
+    0xa6, 0xaf, 0xd9, 0xbb, 0x2f, 0xd3, 0xaf, 0xfe, 0xd6, 0x08, 0x63, 0xe3,
+    0x14, 0xd8, 0x04, 0x3a, 0x82, 0x99, 0x22, 0x14, 0xcc, 0x7d, 0xc1, 0xc1,
+    0x2d, 0xd1, 0x45, 0xff, 0xff, 0x60, 0xfb, 0x48, 0xdc, 0x1d, 0x37, 0xa9,
+    0xd6, 0xfd, 0x9c, 0xeb, 0xfe, 0xd3, 0xef, 0x93, 0x47, 0x74, 0x75, 0xdd,
+    0x41, 0x45, 0x07, 0x99, 0xef, 0xfe, 0x97, 0x50, 0x67, 0xd7, 0xf1, 0xc9,
+    0x8e, 0xbf, 0xed, 0x69, 0xa9, 0xce, 0x24, 0xe7, 0x5f, 0xfb, 0x19, 0x70,
+    0x3f, 0xbd, 0x9d, 0x3a, 0xff, 0x76, 0x10, 0x0f, 0xef, 0xce, 0xbf, 0xf0,
+    0xff, 0xee, 0xe4, 0xd2, 0x8d, 0xce, 0xb4, 0xc7, 0x5f, 0xb3, 0xae, 0x21,
+    0x3a, 0xa7, 0x36, 0xc0, 0x11, 0xba, 0x14, 0x3a, 0xfe, 0x70, 0x69, 0x86,
+    0x61, 0x98, 0x63, 0xaf, 0xe4, 0x85, 0xcf, 0x8c, 0x9d, 0x7f, 0xfd, 0x9e,
+    0xee, 0x4b, 0x8e, 0x3e, 0xeb, 0xc8, 0xeb, 0xa0, 0x07, 0x5f, 0xe7, 0xde,
+    0x1a, 0x8d, 0x57, 0x88, 0x8f, 0x12, 0xdf, 0xa9, 0xb5, 0x89, 0xe9, 0xa3,
+    0xb7, 0x48, 0x84, 0x5b, 0x50, 0xcb, 0xbc, 0xcb, 0xce, 0x75, 0xff, 0x40,
+    0x1f, 0xc0, 0xfa, 0x32, 0x3a, 0xde, 0xe9, 0xeb, 0x08, 0xed, 0x95, 0x62,
+    0xd7, 0xa0, 0xe0, 0x5c, 0x2f, 0x39, 0x1a, 0x23, 0x61, 0xef, 0xb9, 0x6f,
+    0x11, 0x84, 0xe7, 0x47, 0xbe, 0x94, 0x0b, 0xf6, 0x14, 0x77, 0xee, 0x35,
+    0xdd, 0xa6, 0x8a, 0xaa, 0xff, 0xcf, 0x25, 0x73, 0x8d, 0x77, 0x69, 0xa2,
+    0x6d, 0xb2, 0xb8, 0x7f, 0xab, 0x33, 0xbf, 0xca, 0xe7, 0x1a, 0xee, 0xd3,
+    0x45, 0x7f, 0x7e, 0xe3, 0x5d, 0xda, 0x68, 0xb1, 0xae, 0xda, 0x91, 0xd6,
+    0x57, 0x0f, 0x32, 0x63, 0x3b, 0xf6, 0x9b, 0xd8, 0x50, 0xeb, 0xfc, 0x3f,
+    0xcb, 0x34, 0xfe, 0x3a, 0xfe, 0x62, 0x02, 0xc5, 0xb1, 0x62, 0xa1, 0xd7,
+    0xfc, 0x3f, 0xcf, 0x34, 0xa3, 0x93, 0x9d, 0x77, 0x3c, 0x75, 0xf3, 0xcb,
+    0x02, 0x75, 0xfd, 0xec, 0xe0, 0x70, 0x4e, 0xb6, 0x04, 0xf2, 0xfc, 0x41,
+    0x79, 0x49, 0x61, 0xd6, 0x57, 0x13, 0x4f, 0x59, 0x97, 0x4f, 0x5c, 0xf0,
+    0x58, 0x74, 0x4f, 0x64, 0x55, 0x3d, 0x3e, 0x46, 0xef, 0x7e, 0xe3, 0x5d,
+    0xda, 0x68, 0xb5, 0x6f, 0xfc, 0xf2, 0x57, 0x38, 0xd7, 0x76, 0x9a, 0x28,
+    0x2b, 0xf4, 0x33, 0xb7, 0x9c, 0x3a, 0xca, 0xe2, 0x29, 0xd6, 0x67, 0xf5,
+    0x2a, 0xff, 0x40, 0x82, 0x18, 0xdd, 0x67, 0x5d, 0xc8, 0x3a, 0xa4, 0x79,
+    0x1b, 0x46, 0x77, 0xcd, 0x77, 0x69, 0xa2, 0xe2, 0xbf, 0xbf, 0x7d, 0xc3,
+    0x9c, 0x3a, 0xb8, 0x7b, 0x7a, 0x2d, 0xbd, 0xc8, 0x59, 0xd7, 0xcf, 0xb4,
+    0x93, 0x9d, 0x7e, 0xef, 0xea, 0x60, 0x9d, 0x7e, 0x0e, 0x31, 0xc7, 0x4e,
+    0xbd, 0xb4, 0x8d, 0x3a, 0x82, 0x7d, 0xfc, 0x28, 0xda, 0x29, 0xbf, 0xcb,
+    0x79, 0x69, 0x03, 0x87, 0x5d, 0xad, 0xb3, 0xaf, 0xf4, 0x2d, 0xf6, 0x47,
+    0x36, 0x8e, 0xbf, 0xb3, 0x8f, 0xef, 0xe0, 0xeb, 0xff, 0xe7, 0x18, 0x4d,
+    0xad, 0x26, 0xb3, 0xb9, 0xb6, 0x75, 0x04, 0xff, 0x76, 0x16, 0x5f, 0xfc,
+    0x83, 0xfc, 0xb3, 0x5a, 0x40, 0xe1, 0xd5, 0x31, 0xf3, 0x78, 0x92, 0xca,
+    0xc2, 0xb0, 0x8c, 0x84, 0x07, 0x08, 0xba, 0x36, 0xf0, 0x93, 0x01, 0x96,
+    0x8c, 0x7c, 0x33, 0xf6, 0x31, 0x9b, 0xf3, 0x09, 0x87, 0x81, 0x48, 0x3a,
+    0xff, 0xc9, 0xbb, 0x0d, 0xae, 0x7c, 0xf9, 0xdd, 0xb3, 0xaf, 0xbb, 0x1e,
+    0x69, 0xd4, 0xc5, 0x4f, 0xb4, 0x29, 0x97, 0xff, 0x98, 0x65, 0x19, 0x63,
+    0x9c, 0x2c, 0x2f, 0x9f, 0x3b, 0xb6, 0x75, 0xfb, 0x8d, 0x77, 0x69, 0xa2,
+    0xe9, 0xbf, 0x40, 0xb8, 0x60, 0xeb, 0xd1, 0xed, 0xa3, 0xaf, 0xb0, 0x38,
+    0x13, 0xaf, 0xf9, 0xf6, 0x47, 0xb5, 0xfb, 0x58, 0x27, 0x59, 0x56, 0x19,
+    0x3f, 0xd8, 0x84, 0xfc, 0x8a, 0x31, 0x89, 0x0c, 0xfa, 0x48, 0xe3, 0xc2,
+    0x41, 0x7f, 0xfd, 0x83, 0xe4, 0x5f, 0x61, 0x05, 0xf8, 0xa1, 0xd7, 0xf6,
+    0x66, 0x9b, 0xe8, 0x3a, 0xfe, 0x9e, 0x3c, 0xea, 0x7e, 0x75, 0x1d, 0x7f,
+    0xf4, 0x70, 0x1f, 0x35, 0xd8, 0x5b, 0x89, 0xd7, 0xfa, 0x39, 0xf7, 0xbd,
+    0xc0, 0x1d, 0x52, 0x3f, 0x8e, 0xa2, 0x5f, 0xd2, 0x79, 0x38, 0xb4, 0xeb,
+    0xff, 0xd9, 0xe8, 0x67, 0xec, 0xfa, 0xc5, 0xc3, 0x19, 0xd6, 0x55, 0x88,
+    0x4c, 0x7b, 0x21, 0x05, 0x31, 0x10, 0x95, 0xd7, 0x13, 0x9b, 0x5c, 0x69,
+    0xb7, 0xd8, 0xcb, 0x10, 0xb3, 0xaf, 0xf9, 0x38, 0x31, 0xba, 0xdf, 0xc7,
+    0x5f, 0xff, 0xf7, 0xfc, 0x96, 0xba, 0xe9, 0xce, 0x73, 0xfd, 0xd3, 0x8f,
+    0xa3, 0xaf, 0xfc, 0x2e, 0xcf, 0xb3, 0xaf, 0x33, 0x9d, 0x7f, 0xff, 0x74,
+    0x7f, 0x76, 0x3c, 0x97, 0x71, 0x4c, 0x0c, 0xdf, 0x9d, 0x73, 0x70, 0xea,
+    0x83, 0xf5, 0x51, 0x82, 0xf2, 0x9a, 0x91, 0xd7, 0xfe, 0x96, 0x73, 0x8f,
+    0x29, 0xf1, 0x93, 0xaf, 0xfe, 0xc0, 0xc4, 0xa3, 0x91, 0xf5, 0xc4, 0xeb,
+    0xff, 0x6c, 0xc9, 0x2c, 0x29, 0xb2, 0x02, 0x75, 0x2d, 0x10, 0x6e, 0x85,
+    0x73, 0xab, 0x3a, 0xa3, 0xe9, 0x9a, 0x79, 0x0b, 0x2d, 0x11, 0x78, 0x77,
+    0xec, 0x30, 0xab, 0xaa, 0xba, 0x06, 0x53, 0xad, 0xff, 0xbc, 0x8d, 0x40,
+    0xb8, 0xa9, 0x07, 0x5f, 0xf4, 0x6f, 0xd7, 0xd7, 0xa1, 0x93, 0xaa, 0x0f,
+    0xd7, 0x87, 0x97, 0x7f, 0xd3, 0xaf, 0xc3, 0x9d, 0x7f, 0x1d, 0x7f, 0x49,
+    0xf3, 0x64, 0x04, 0xea, 0x60, 0x1e, 0x93, 0x14, 0x25, 0xbe, 0x4f, 0xe5,
+    0x07, 0x5f, 0x9e, 0x69, 0x27, 0x8e, 0xbf, 0xf4, 0x07, 0x91, 0x24, 0xdf,
+    0xd8, 0x75, 0x49, 0x10, 0xa0, 0x21, 0xf1, 0x3d, 0xff, 0xa3, 0x9a, 0xea,
+    0x35, 0xbf, 0xce, 0x75, 0xff, 0xff, 0x40, 0x7b, 0x9b, 0xf8, 0x5f, 0xa0,
+    0x7d, 0x69, 0xf8, 0xd3, 0xaf, 0xf6, 0x66, 0x28, 0xa3, 0xc8, 0xea, 0x51,
+    0x12, 0xfe, 0x65, 0xbf, 0x66, 0x9b, 0xe8, 0x3a, 0xff, 0xf2, 0x33, 0xa6,
+    0xf5, 0x37, 0xf7, 0x39, 0x07, 0x56, 0x1f, 0x8f, 0x09, 0xaf, 0xdb, 0x13,
+    0x98, 0x13, 0xaf, 0xff, 0xb5, 0xd4, 0xd7, 0xbb, 0x81, 0x4d, 0x60, 0x9d,
+    0x7b, 0xb0, 0x38, 0x7e, 0xbf, 0x94, 0x5f, 0xe8, 0x5e, 0x22, 0xe1, 0x8c,
+    0xeb, 0xfd, 0x25, 0xe9, 0x07, 0x79, 0x1d, 0x4d, 0x3e, 0x69, 0x8c, 0xef,
+    0x3b, 0xb4, 0xd1, 0x26, 0x5e, 0xda, 0x4d, 0x1d, 0x4d, 0x3c, 0x5d, 0xa2,
+    0x7b, 0xf3, 0x58, 0x66, 0x13, 0x10, 0xc0, 0x3a, 0xff, 0x66, 0xfe, 0xf3,
+    0xcb, 0x47, 0x54, 0x1f, 0x6f, 0x0e, 0xaf, 0xf0, 0xbf, 0xb4, 0xdf, 0xc4,
+    0xeb, 0xff, 0xfb, 0x98, 0x04, 0x03, 0x38, 0x9b, 0x07, 0x3d, 0xd4, 0x3a,
+    0xb1, 0x11, 0x88, 0x65, 0x52, 0x54, 0xc1, 0x90, 0x98, 0xe3, 0x42, 0xe1,
+    0x25, 0xd8, 0x56, 0xdf, 0xc1, 0x03, 0x03, 0x40, 0xdb, 0x3a, 0xf6, 0x90,
+    0x27, 0x5f, 0xc3, 0x1b, 0xad, 0xfc, 0x75, 0xff, 0x43, 0x7d, 0xff, 0x79,
+    0x0c, 0x9d, 0x7f, 0x9a, 0x9c, 0xd4, 0xd0, 0xe7, 0x5f, 0xfd, 0xfe, 0xba,
+    0xf2, 0xeb, 0xca, 0x04, 0xea, 0xdc, 0xfd, 0x78, 0x65, 0x77, 0x52, 0x64,
+    0xc6, 0x78, 0x36, 0xb2, 0xcf, 0x42, 0xbe, 0xfb, 0xc8, 0xb7, 0x3a, 0xca,
+    0x1d, 0x7f, 0x77, 0x51, 0xe8, 0x09, 0xd5, 0x86, 0xf5, 0x04, 0x6b, 0x0f,
+    0xf3, 0xcb, 0xb7, 0xfd, 0x1d, 0xf2, 0x4e, 0xb8, 0x69, 0xd7, 0xff, 0xe7,
+    0x6f, 0x23, 0xa3, 0x9e, 0xc5, 0x59, 0x65, 0x92, 0xaa, 0x48, 0xb0, 0xd1,
+    0x0f, 0x8e, 0x2f, 0xe6, 0xb7, 0xf6, 0x8c, 0x1d, 0x7f, 0xfb, 0x37, 0x90,
+    0xc4, 0xb9, 0x1e, 0x7f, 0x1d, 0x7f, 0xe7, 0xf4, 0x73, 0x5d, 0x81, 0xf1,
+    0xd7, 0xec, 0x92, 0x3e, 0xc3, 0xa8, 0x4f, 0x8f, 0x47, 0x95, 0x24, 0x66,
+    0x7f, 0x0a, 0xbb, 0xcb, 0x7e, 0x9d, 0x7f, 0xf8, 0x62, 0x5c, 0xe7, 0xfb,
+    0xa7, 0x1f, 0x47, 0x5f, 0xff, 0x6b, 0x14, 0x1c, 0xf6, 0xb2, 0x42, 0xec,
+    0x9d, 0x64, 0xea, 0x26, 0x3c, 0x95, 0x48, 0x8d, 0xbd, 0x90, 0xb3, 0xbe,
+    0xda, 0x8e, 0xe8, 0xea, 0x83, 0xcd, 0xc2, 0x9b, 0xfb, 0xc3, 0xfc, 0xfb,
+    0xb1, 0x9d, 0x7f, 0xfa, 0x27, 0x1c, 0xc9, 0xfc, 0xa4, 0x0c, 0x8e, 0xbf,
+    0xf3, 0x8c, 0xfd, 0x75, 0xa6, 0x90, 0xea, 0x74, 0x5c, 0x09, 0x9b, 0x29,
+    0x37, 0x99, 0x65, 0x92, 0xaf, 0xa7, 0x5a, 0x68, 0xa5, 0x4b, 0xfb, 0xa0,
+    0x27, 0x5b, 0x8e, 0x78, 0xe2, 0x65, 0x7e, 0x8c, 0x17, 0x59, 0xd7, 0xff,
+    0xfe, 0x71, 0x6f, 0x33, 0x64, 0x0f, 0x97, 0x18, 0x21, 0xcd, 0xfc, 0x75,
+    0x01, 0x11, 0xdf, 0x92, 0x5f, 0xe9, 0x47, 0x27, 0x8e, 0x4e, 0x75, 0xfd,
+    0xad, 0x26, 0x08, 0x0e, 0xbd, 0xcc, 0x63, 0x3a, 0xff, 0xd0, 0xcf, 0xd9,
+    0xf5, 0x8b, 0x86, 0x33, 0xab, 0x88, 0x8d, 0x59, 0x5f, 0x87, 0xaa, 0x11,
+    0xe3, 0x90, 0xc1, 0xbf, 0x27, 0xa7, 0xc6, 0x4e, 0xbf, 0xe8, 0x6f, 0x47,
+    0xff, 0x46, 0x8e, 0xbf, 0xf9, 0x36, 0xa1, 0xb0, 0xbc, 0x0b, 0xac, 0xeb,
+    0xff, 0xf7, 0xbb, 0x92, 0xf8, 0xde, 0xa7, 0xb7, 0x6a, 0x70, 0xea, 0xe2,
+    0x3f, 0x16, 0x51, 0xd3, 0x81, 0x44, 0xbf, 0xe5, 0xc7, 0x36, 0x67, 0x22,
+    0x63, 0xaf, 0xfd, 0xc6, 0xae, 0x37, 0xd6, 0x6c, 0xc3, 0xaf, 0xf0, 0x83,
+    0x6f, 0x03, 0x8b, 0x3a, 0xfe, 0x1f, 0x9b, 0x79, 0xc8, 0x3a, 0xa1, 0x14,
+    0x98, 0x80, 0xe6, 0x97, 0xfd, 0x8e, 0x0f, 0x98, 0x17, 0x91, 0xd7, 0xff,
+    0x9e, 0x7e, 0xa4, 0x0e, 0x4c, 0x9c, 0x43, 0xab, 0x13, 0xc6, 0x01, 0xe6,
+    0xa1, 0xbd, 0xe2, 0xd6, 0x4e, 0x2f, 0xc3, 0x9d, 0x7f, 0x1d, 0x7f, 0xe9,
+    0x40, 0xcf, 0xf7, 0x83, 0xfc, 0x8e, 0xa6, 0x33, 0xe6, 0x98, 0x96, 0xfb,
+    0xd3, 0xe0, 0x4e, 0xbf, 0xe4, 0x53, 0xef, 0x00, 0xb4, 0xd1, 0xd5, 0x31,
+    0xee, 0xed, 0x91, 0x5e, 0x65, 0x96, 0x4e, 0xbf, 0xff, 0x62, 0xfc, 0x30,
+    0x0c, 0x0e, 0xb1, 0x70, 0xd2, 0x95, 0x2f, 0xef, 0xfd, 0x9b, 0xfc, 0x1c,
+    0xd9, 0xc4, 0xd1, 0xd7, 0xf3, 0x7a, 0x90, 0x2d, 0x3a, 0xa0, 0xfb, 0x31,
+    0x06, 0xff, 0x72, 0x3c, 0x8d, 0x40, 0x9d, 0x7e, 0x94, 0xd9, 0x8d, 0x3a,
+    0xdc, 0x3a, 0x98, 0x93, 0xe8, 0x83, 0x1f, 0xa4, 0xf5, 0x8a, 0x94, 0xd2,
+    0x10, 0x7d, 0x45, 0x18, 0x67, 0x6a, 0x11, 0x17, 0xbd, 0x2e, 0x9d, 0x64,
+    0x3a, 0xfe, 0xec, 0x7c, 0x6a, 0x4e, 0x75, 0xfd, 0xc7, 0xe0, 0xc4, 0x8e,
+    0xbf, 0xfe, 0x85, 0x35, 0xd7, 0x4f, 0x42, 0xc5, 0xd4, 0x3a, 0xff, 0xd9,
+    0xb3, 0xa9, 0xf3, 0x5a, 0x45, 0x9d, 0x73, 0xfa, 0x48, 0x8f, 0xea, 0x75,
+    0xff, 0x92, 0x49, 0xcd, 0xe0, 0x63, 0x47, 0x53, 0x0f, 0x4d, 0x88, 0x21,
+    0xfc, 0x2f, 0x18, 0x5d, 0x78, 0xba, 0xe9, 0x2a, 0xc5, 0xb6, 0xd3, 0x6c,
+    0x26, 0x98, 0x85, 0x8c, 0xe6, 0x12, 0x86, 0xb8, 0x61, 0x2b, 0x92, 0xbd,
+    0x94, 0x5a, 0x6c, 0x69, 0xdb, 0xc6, 0xf6, 0x86, 0x13, 0x43, 0xe7, 0x91,
+    0xa8, 0xf6, 0x1b, 0x0f, 0x09, 0x50, 0x42, 0xd0, 0x63, 0x15, 0xd4, 0xae,
+    0x8f, 0x4b, 0x09, 0xdb, 0x58, 0xfb, 0x1b, 0xf5, 0xff, 0xee, 0x63, 0x21,
+    0xee, 0x4c, 0x39, 0xc9, 0x1d, 0x7b, 0x98, 0xc6, 0x75, 0xff, 0xa1, 0x9f,
+    0xb3, 0xeb, 0x17, 0x0c, 0x67, 0x57, 0x11, 0x58, 0xb4, 0xaf, 0x0f, 0x5f,
+    0xff, 0x3a, 0xe3, 0x8d, 0xe7, 0xea, 0x73, 0xf7, 0xd1, 0xd5, 0x88, 0x82,
+    0xfc, 0xc2, 0xff, 0x71, 0xbf, 0xb8, 0x57, 0x07, 0x5f, 0xfd, 0x1c, 0xfb,
+    0xe4, 0xf7, 0x70, 0x28, 0x75, 0xff, 0xba, 0x31, 0x3f, 0xde, 0xf5, 0xd8,
+    0xce, 0xa8, 0x45, 0xd4, 0xe6, 0x78, 0x89, 0x79, 0xf9, 0x39, 0xd7, 0x32,
+    0xc9, 0xd7, 0x9d, 0xaa, 0xb4, 0xda, 0x32, 0x39, 0x7f, 0x47, 0x1e, 0x49,
+    0xd3, 0xaf, 0xd8, 0xbe, 0xb8, 0x4e, 0xb2, 0xb0, 0xe8, 0x4a, 0x42, 0x99,
+    0x91, 0xe3, 0x28, 0x54, 0xd9, 0x61, 0xfc, 0x85, 0x03, 0xd6, 0xd7, 0x83,
+    0x2a, 0xf7, 0x50, 0xdd, 0xd8, 0xc6, 0xc9, 0xa6, 0xd1, 0x5d, 0x49, 0xda,
+    0x03, 0x06, 0x7a, 0x9b, 0x78, 0xce, 0xf8, 0x50, 0xb8, 0x45, 0xf6, 0x3f,
+    0xc0, 0x43, 0x5f, 0x52, 0xe2, 0x3d, 0x2a, 0x4f, 0xfb, 0x43, 0x4f, 0x7f,
+    0x6a, 0x26, 0x92, 0x4c, 0x75, 0xff, 0xe8, 0x9f, 0x3d, 0x02, 0x80, 0xcd,
+    0xfc, 0x75, 0x95, 0xd1, 0xfb, 0x7d, 0x2e, 0xbf, 0x71, 0xae, 0xed, 0x34,
+    0x46, 0xb7, 0x94, 0xdf, 0x47, 0x59, 0x5c, 0x3d, 0x1f, 0x19, 0xdf, 0xb8,
+    0xd7, 0x76, 0x9a, 0x2a, 0x5b, 0x9d, 0xa6, 0x88, 0x6a, 0xca, 0xe1, 0xea,
+    0xb9, 0x9d, 0xfb, 0x8d, 0x77, 0x69, 0xa2, 0x3e, 0xbf, 0xfe, 0x17, 0xf4,
+    0xa1, 0x4f, 0x91, 0xed, 0x40, 0x0e, 0xbc, 0xf2, 0x57, 0x11, 0x07, 0xf4,
+    0xce, 0xff, 0xcf, 0x3c, 0x75, 0x38, 0x90, 0xb3, 0xaf, 0xf4, 0x73, 0x07,
+    0xd9, 0xd3, 0xaf, 0x2f, 0x15, 0xdb, 0x3e, 0xcf, 0xa7, 0x94, 0xaa, 0x36,
+    0xe2, 0x14, 0x57, 0xff, 0xfd, 0x2f, 0xf8, 0xa3, 0xeb, 0x03, 0x1b, 0xeb,
+    0xef, 0x94, 0x45, 0x0e, 0xbf, 0xbf, 0xdf, 0x79, 0x67, 0x8e, 0xbf, 0xfc,
+    0xc3, 0x28, 0xcb, 0x1c, 0xe1, 0x61, 0x7c, 0xf9, 0xdd, 0xb3, 0xaf, 0xdc,
+    0x6b, 0xbb, 0x4d, 0x16, 0x3d, 0xcf, 0xa3, 0xaf, 0xe9, 0xfe, 0xf3, 0x99,
+    0xc3, 0xaa, 0x47, 0x8a, 0xe2, 0xb7, 0xfc, 0x2e, 0xa7, 0x52, 0x06, 0x73,
+    0xaf, 0xff, 0xc0, 0x94, 0xec, 0x34, 0x31, 0x73, 0xb7, 0x9f, 0x3e, 0x77,
+    0x6c, 0xeb, 0xf2, 0x7b, 0xc9, 0xe3, 0xaf, 0xb9, 0xcc, 0xdb, 0x3a, 0xb0,
+    0xf2, 0x9c, 0x9a, 0xfd, 0x9c, 0xcc, 0x98, 0xeb, 0x2b, 0x0a, 0xb2, 0x67,
+    0x6d, 0x91, 0x86, 0x31, 0x23, 0xc4, 0xc4, 0x3d, 0x37, 0xd4, 0x2d, 0x3e,
+    0x90, 0x5e, 0x61, 0x96, 0xa1, 0xd7, 0xf3, 0x00, 0x73, 0xaf, 0xe3, 0xaf,
+    0xf3, 0x83, 0x4f, 0xef, 0x39, 0xd7, 0x2d, 0xa7, 0x50, 0x9e, 0x3f, 0x8c,
+    0x6f, 0xfd, 0x8c, 0xf3, 0x05, 0xf7, 0x96, 0x8e, 0xbe, 0xd7, 0x51, 0x93,
+    0xaf, 0xd0, 0xcf, 0xb3, 0xa7, 0x56, 0x1e, 0x48, 0x91, 0x5f, 0x01, 0x69,
+    0xc3, 0xaf, 0xff, 0xfa, 0x38, 0x38, 0x1c, 0xef, 0x51, 0xbd, 0x4f, 0x69,
+    0xf7, 0x3a, 0x91, 0x10, 0xbd, 0x21, 0xbf, 0xa3, 0x80, 0xdb, 0xff, 0xc7,
+    0x5f, 0xf4, 0x0f, 0x98, 0x4f, 0xef, 0xe0, 0xeb, 0xff, 0xd1, 0xd8, 0x5b,
+    0x7a, 0x9e, 0xcc, 0x59, 0xd7, 0xc0, 0x02, 0x7d, 0x3a, 0xf3, 0xbb, 0x4d,
+    0x16, 0x85, 0xff, 0x9d, 0x9d, 0xa6, 0xbf, 0x27, 0xc6, 0x4e, 0xbf, 0x81,
+    0x03, 0x1e, 0xd1, 0xd4, 0xd4, 0x4a, 0xf0, 0x9c, 0x08, 0x77, 0xff, 0xff,
+    0xc9, 0xce, 0xb8, 0xa4, 0x79, 0x3b, 0x1a, 0xee, 0x6b, 0x98, 0xdc, 0xf1,
+    0xd5, 0x25, 0x42, 0x61, 0x31, 0x69, 0xda, 0x23, 0xf2, 0x17, 0x1d, 0x30,
+    0xbb, 0x16, 0x75, 0xff, 0xcf, 0xbe, 0xce, 0xb1, 0xa7, 0x86, 0x16, 0x75,
+    0x70, 0xf7, 0x5c, 0x56, 0xff, 0xfc, 0x9e, 0xd3, 0xef, 0xad, 0x67, 0x53,
+    0x5f, 0xce, 0x75, 0xff, 0xf7, 0xf3, 0xf1, 0x3d, 0x3f, 0xfc, 0x96, 0x98,
+    0xd0, 0xea, 0xea, 0x2b, 0x85, 0x5e, 0xfe, 0xd3, 0xfd, 0xcd, 0xfc, 0x75,
+    0xfe, 0x40, 0xe2, 0xfe, 0x60, 0x4e, 0xbf, 0xfe, 0xff, 0x9c, 0x81, 0xc5,
+    0x13, 0xbd, 0xcf, 0xa7, 0x59, 0x82, 0x75, 0x70, 0xf9, 0x7f, 0x51, 0xbf,
+    0xcb, 0xfc, 0x7d, 0xaf, 0xf8, 0x75, 0x49, 0x1e, 0x1c, 0x84, 0xc6, 0xd9,
+    0x1d, 0xfd, 0xb2, 0x6e, 0xe0, 0x1c, 0xeb, 0xff, 0xfd, 0x99, 0xed, 0x44,
+    0xdd, 0x8d, 0x83, 0x81, 0xec, 0x68, 0xeb, 0xf0, 0xb5, 0xf4, 0x87, 0x5f,
+    0xff, 0xdc, 0x18, 0x8d, 0xfe, 0x6b, 0xc3, 0x01, 0xec, 0x78, 0xeb, 0x93,
+    0xa7, 0x5f, 0x48, 0x5f, 0xe9, 0xd7, 0xf8, 0x2e, 0x0e, 0x71, 0xc0, 0x75,
+    0xf7, 0x1a, 0xc6, 0xc9, 0xd7, 0xca, 0x30, 0x1d, 0x93, 0xab, 0x0f, 0x35,
+    0xc9, 0xa9, 0x11, 0x3e, 0x2f, 0xf5, 0x09, 0xbb, 0xe1, 0x2b, 0x1a, 0xdb,
+    0x8a, 0xff, 0x0c, 0x1b, 0xce, 0xc6, 0x87, 0x5f, 0xfb, 0xef, 0x94, 0x45,
+    0x23, 0x06, 0x0e, 0xbf, 0x7d, 0xf0, 0xc0, 0x0e, 0xad, 0xd1, 0x09, 0xc1,
+    0xdd, 0x87, 0xf7, 0xe8, 0xf6, 0x76, 0x0e, 0xbf, 0xff, 0xfd, 0xd4, 0x0e,
+    0x24, 0xfd, 0x88, 0xf9, 0x9b, 0xcb, 0x49, 0xe7, 0x1c, 0x3a, 0xff, 0xd9,
+    0xbc, 0xb5, 0x37, 0x1f, 0xda, 0x3a, 0xff, 0xf7, 0xb5, 0x93, 0x76, 0x36,
+    0x67, 0x7b, 0x07, 0x5f, 0xe7, 0x06, 0x96, 0xfb, 0xf8, 0xea, 0xc3, 0xfe,
+    0x74, 0xbb, 0xfe, 0x18, 0x89, 0xb3, 0x62, 0x70, 0xea, 0x9d, 0x3b, 0x16,
+    0x92, 0x81, 0xd8, 0x61, 0x7d, 0xe2, 0x0b, 0xf7, 0xc9, 0xa4, 0x93, 0x1d,
+    0x50, 0xa9, 0x7f, 0x23, 0xe4, 0x45, 0x0b, 0xff, 0xba, 0x9f, 0x30, 0x71,
+    0x38, 0xfb, 0x0e, 0xbf, 0xf9, 0x05, 0xc2, 0x38, 0x1e, 0xc6, 0x8e, 0xbd,
+    0xf6, 0x38, 0x75, 0xff, 0xfe, 0xec, 0x0e, 0x03, 0x58, 0x1e, 0xc4, 0xeb,
+    0xfc, 0x42, 0x75, 0x28, 0x98, 0x0b, 0x51, 0x38, 0x81, 0xe1, 0xdb, 0xff,
+    0xfa, 0x26, 0xc0, 0xf6, 0x36, 0x77, 0x3c, 0x31, 0x0b, 0x3a, 0xfe, 0xdf,
+    0x5f, 0x67, 0xfc, 0x4e, 0xbf, 0xe8, 0x6f, 0x52, 0x67, 0x79, 0xce, 0xa5,
+    0xa3, 0x11, 0xd6, 0x80, 0x65, 0x7f, 0xa5, 0x1c, 0x9e, 0x39, 0x39, 0xd7,
+    0xfc, 0x9f, 0x8c, 0xb9, 0x18, 0x13, 0xaf, 0xff, 0xfb, 0xb9, 0x26, 0xf5,
+    0x3b, 0x19, 0xc9, 0x78, 0x61, 0x7a, 0x3a, 0xb4, 0x89, 0xbf, 0x1b, 0xdf,
+    0x6d, 0x47, 0x27, 0x3a, 0xa1, 0x31, 0x7c, 0x86, 0x7b, 0x91, 0xdf, 0xee,
+    0x36, 0x6c, 0x4e, 0xfe, 0x75, 0xfe, 0x5c, 0x34, 0x5f, 0x7f, 0x1d, 0x7f,
+    0x72, 0x3d, 0x3e, 0x32, 0x75, 0xe7, 0x10, 0x1d, 0x7f, 0xff, 0xfc, 0x9f,
+    0xf3, 0xb9, 0x34, 0xcf, 0xc9, 0xbd, 0xdf, 0xc1, 0xac, 0x4d, 0x81, 0x83,
+    0xaf, 0xde, 0xeb, 0x8a, 0x87, 0x5f, 0xf0, 0xff, 0x38, 0x7b, 0x83, 0x07,
+    0x5b, 0x02, 0x8e, 0x2c, 0x84, 0x1b, 0x49, 0xef, 0xff, 0x70, 0x0d, 0x00,
+    0xe7, 0xb4, 0xee, 0x27, 0x54, 0x2a, 0x10, 0xc3, 0x44, 0x32, 0x72, 0xe1,
+    0x87, 0xe7, 0xe7, 0x37, 0xfb, 0x3b, 0x32, 0x75, 0x16, 0x75, 0xfe, 0x96,
+    0x73, 0x43, 0x13, 0x9d, 0x7b, 0x6f, 0x27, 0x3a, 0xf6, 0x75, 0xce, 0xbf,
+    0x4c, 0x1f, 0xff, 0x13, 0xa8, 0x27, 0x88, 0xe3, 0x57, 0xfb, 0x19, 0xc6,
+    0xb7, 0x19, 0x3a, 0xff, 0xb7, 0x5e, 0x60, 0xfb, 0x6f, 0x0e, 0xbc, 0xa4,
+    0xbf, 0x3a, 0xfd, 0xd8, 0xe4, 0xeb, 0x3a, 0xff, 0x7e, 0xe3, 0xdc, 0x79,
+    0x8e, 0xb6, 0xf3, 0x1e, 0xd3, 0x25, 0x14, 0x88, 0xa3, 0x77, 0x8a, 0xc4,
+    0xcc, 0x5c, 0xcc, 0x61, 0xbb, 0x58, 0xa9, 0x33, 0x73, 0x24, 0x32, 0x76,
+    0x3d, 0x46, 0xa5, 0x78, 0x70, 0x07, 0x5a, 0x0e, 0xa0, 0x1a, 0x9f, 0x0d,
+    0x5c, 0xfe, 0x3a, 0xb8, 0x6d, 0xba, 0x43, 0x7c, 0xb8, 0xe6, 0x8e, 0xbf,
+    0xee, 0x67, 0x72, 0x7f, 0x89, 0xa3, 0xab, 0x0f, 0xf1, 0x08, 0x7f, 0x21,
+    0xbf, 0x90, 0x7f, 0x96, 0x68, 0xeb, 0xff, 0x67, 0xa3, 0x70, 0x3f, 0x7a,
+    0x87, 0x59, 0x67, 0x5f, 0xc8, 0x3f, 0xcb, 0x35, 0xf0, 0xf3, 0x76, 0x1e,
+    0xd2, 0x88, 0xc1, 0xf3, 0xcd, 0x95, 0x62, 0xdb, 0x6f, 0xc6, 0x11, 0x14,
+    0x3b, 0x4e, 0x43, 0x28, 0x43, 0x86, 0x14, 0xb9, 0x28, 0xd5, 0x48, 0x5d,
+    0x36, 0x19, 0xfb, 0x91, 0x24, 0x63, 0xf3, 0x1c, 0x70, 0xbd, 0x71, 0xeb,
+    0xf6, 0x59, 0xa3, 0xc6, 0x6c, 0x08, 0xc0, 0xc6, 0x34, 0x6d, 0x4a, 0x43,
+    0xf4, 0xaa, 0x6d, 0xb8, 0xca, 0xfe, 0xc3, 0xbe, 0xfe, 0xda, 0x40, 0x8c,
+    0x4c, 0x75, 0xe8, 0x71, 0x3a, 0xfb, 0x3a, 0xfe, 0x3a, 0xcc, 0x0c, 0x3e,
+    0x8e, 0x97, 0x88, 0xcd, 0xff, 0xff, 0xee, 0xb8, 0xfb, 0x50, 0x92, 0xcd,
+    0xa1, 0xf4, 0x76, 0x14, 0xfe, 0x36, 0x8e, 0xbe, 0xcd, 0x01, 0x0e, 0xbf,
+    0x71, 0xae, 0xed, 0x34, 0x5a, 0xd7, 0xf9, 0x68, 0xb7, 0x9b, 0x3a, 0x75,
+    0xfd, 0x9b, 0x5a, 0x71, 0x69, 0xd7, 0xb9, 0x0b, 0x3a, 0xfe, 0xee, 0x6a,
+    0x27, 0xda, 0x3a, 0xff, 0xa4, 0xae, 0x71, 0xae, 0xed, 0x34, 0x50, 0x75,
+    0x87, 0xea, 0xe6, 0x17, 0xd9, 0x34, 0x78, 0xeb, 0xfe, 0x89, 0x47, 0x27,
+    0x8e, 0x4e, 0x75, 0xff, 0xfb, 0xda, 0x49, 0xdf, 0x4e, 0x2f, 0xee, 0xc4,
+    0xc7, 0x59, 0x56, 0x12, 0xac, 0x38, 0x37, 0x93, 0xde, 0x10, 0x21, 0x9c,
+    0xc6, 0x5c, 0x2e, 0x5c, 0x24, 0x3a, 0x40, 0x24, 0x3f, 0x4e, 0x6f, 0xff,
+    0x2a, 0xb7, 0x92, 0xb9, 0xc6, 0xbb, 0xb4, 0xd1, 0x45, 0xdf, 0xe5, 0x73,
+    0x8d, 0x77, 0x69, 0xa2, 0xea, 0xa8, 0x74, 0x5f, 0x72, 0x7c, 0x6b, 0xea,
+    0x47, 0x0a, 0xb9, 0x5e, 0x3d, 0xad, 0xe2, 0x41, 0x39, 0x89, 0xa8, 0x54,
+    0xf9, 0x5e, 0xfd, 0xc6, 0xbb, 0xb4, 0xd1, 0x10, 0xdd, 0x81, 0x3a, 0xcd,
+    0x3a, 0xba, 0x69, 0x44, 0x56, 0xfb, 0x36, 0x27, 0x0e, 0xb2, 0xb8, 0x89,
+    0xad, 0xd6, 0x18, 0xc8, 0x2d, 0xb6, 0x75, 0xf4, 0x76, 0x16, 0x75, 0xf3,
+    0x5d, 0xda, 0x68, 0x8d, 0xa9, 0xa7, 0x9b, 0xc2, 0x0b, 0x2a, 0x14, 0x41,
+    0x63, 0x05, 0xfe, 0x57, 0x38, 0xd7, 0x76, 0x9a, 0x29, 0xbb, 0xf7, 0x1a,
+    0xee, 0xd3, 0x45, 0x41, 0x7b, 0x37, 0x64, 0xeb, 0x2b, 0x87, 0xa1, 0xd3,
+    0x3b, 0xfc, 0xae, 0x71, 0xae, 0xed, 0x34, 0x54, 0xd7, 0xee, 0x35, 0xdd,
+    0xa6, 0x8a, 0xc2, 0xfc, 0x8c, 0x87, 0xfe, 0x1d, 0x72, 0xf4, 0x75, 0xfc,
+    0x9b, 0x6f, 0x09, 0xb6, 0x75, 0xfe, 0x57, 0x38, 0xd7, 0x76, 0x9a, 0x23,
+    0xfa, 0x83, 0xef, 0x91, 0x85, 0xec, 0x89, 0xce, 0xbf, 0xd9, 0xbc, 0x9e,
+    0x48, 0x27, 0x5c, 0xfe, 0x3a, 0xca, 0xe2, 0x6c, 0x6d, 0x33, 0x59, 0x4b,
+    0xc2, 0x14, 0x48, 0x7c, 0x37, 0xb6, 0x63, 0x7f, 0xf9, 0x55, 0xbc, 0x95,
+    0xce, 0x35, 0xdd, 0xa6, 0x89, 0xbe, 0xff, 0xe5, 0xbc, 0x95, 0xce, 0x35,
+    0xdd, 0xa6, 0x89, 0xfa, 0xfe, 0x7e, 0xe7, 0xa0, 0x27, 0x5c, 0x2d, 0x3a,
+    0xfb, 0x53, 0x2f, 0x47, 0x5c, 0xd6, 0x9d, 0x7f, 0x9b, 0xd4, 0xf6, 0x62,
+    0xce, 0xbb, 0x63, 0x4f, 0x18, 0x15, 0x42, 0x29, 0x10, 0x54, 0x04, 0x7a,
+    0x16, 0xf1, 0x8d, 0xfe, 0x61, 0xcc, 0x48, 0xe4, 0xf1, 0xb9, 0xd7, 0xe6,
+    0x21, 0x81, 0xb7, 0x9b, 0x9d, 0x7f, 0x31, 0x2f, 0x3f, 0x51, 0x8c, 0xeb,
+    0xf3, 0x16, 0xa2, 0x98, 0xc6, 0x75, 0xdb, 0x1a, 0x78, 0xc0, 0x6d, 0xd3,
+    0xa9, 0x88, 0x4c, 0x35, 0x89, 0x3e, 0x60, 0x1a, 0x30, 0xe3, 0x5f, 0x18,
+    0xfe, 0x4b, 0x7c, 0xc5, 0xf1, 0xf0, 0xeb, 0xe6, 0x14, 0xeb, 0xd1, 0xd7,
+    0xff, 0xf3, 0x16, 0x2f, 0xe8, 0x16, 0xa2, 0xc3, 0xfb, 0xf2, 0x47, 0x5f,
+    0xf3, 0xf5, 0x36, 0x2a, 0xcb, 0x2c, 0x95, 0x7f, 0xba, 0xfe, 0xf3, 0xbb,
+    0x27, 0x53, 0x09, 0x1e, 0xac, 0x50, 0x9d, 0x8a, 0xaf, 0x30, 0xe3, 0xeb,
+    0xff, 0xfc, 0xc4, 0x30, 0x35, 0xc8, 0x4f, 0x77, 0x02, 0x9a, 0xc1, 0x01,
+    0xd7, 0xf3, 0x1c, 0x71, 0xde, 0x47, 0x5f, 0xba, 0x8e, 0x06, 0x1c, 0x75,
+    0x31, 0x28, 0xc1, 0x61, 0x99, 0xfc, 0x5d, 0x67, 0x3a, 0xf8, 0x71, 0x00,
+    0x75, 0xf3, 0x0f, 0x02, 0x90, 0x75, 0x30, 0x0f, 0x1d, 0x84, 0x3f, 0x7f,
+    0xe8, 0x88, 0x88, 0x88, 0xdf, 0x47, 0x5e, 0x9a, 0x3c, 0x75, 0xd1, 0x10,
+    0x7a, 0xd3, 0x1d, 0x5e, 0x4d, 0xf0, 0xeb, 0xf7, 0x12, 0x77, 0x59, 0x57,
+    0x32, 0xc9, 0x55, 0x86, 0xfd, 0x92, 0x7b, 0x7e, 0x52, 0xa6, 0x86, 0xa1,
+    0x19, 0x20, 0x2c, 0xd3, 0xdd, 0xf9, 0xdc, 0x63, 0x68, 0xeb, 0xff, 0xc8,
+    0x38, 0xb8, 0xd6, 0xb2, 0x5b, 0x78, 0x75, 0xff, 0xd1, 0x27, 0xc0, 0xa6,
+    0xcd, 0x01, 0xa7, 0x5f, 0xde, 0xd6, 0x64, 0xf0, 0x75, 0x74, 0xfc, 0x05,
+    0x12, 0xff, 0x73, 0xf1, 0xff, 0xdf, 0xf8, 0xeb, 0xdd, 0x81, 0x3a, 0xd0,
+    0x87, 0xa1, 0xe3, 0x6a, 0x84, 0x4b, 0xf5, 0xc6, 0xf0, 0xa4, 0x1d, 0x7e,
+    0x8f, 0xab, 0xea, 0x1d, 0x5c, 0x3c, 0x11, 0x19, 0xbf, 0xa5, 0xaf, 0x60,
+    0xa8, 0x75, 0xe6, 0x5d, 0x93, 0xaf, 0xff, 0x7b, 0x8f, 0x38, 0x7b, 0x1a,
+    0xf7, 0xfd, 0x3a, 0xec, 0x5f, 0x4f, 0xa7, 0x43, 0xb7, 0xe7, 0x6f, 0x53,
+    0x87, 0x5f, 0xff, 0xfe, 0x17, 0x51, 0x39, 0x12, 0xf9, 0xd4, 0x58, 0x63,
+    0xe6, 0xdf, 0xfd, 0x4e, 0x1d, 0x7c, 0xf2, 0x4d, 0xce, 0xbf, 0xf7, 0x53,
+    0xd9, 0xce, 0x7f, 0x3e, 0xc3, 0xaf, 0xf9, 0x3d, 0x9c, 0xe7, 0xf3, 0xec,
+    0x3a, 0xf6, 0xbf, 0x1f, 0x87, 0xfd, 0xd4, 0x2a, 0x0a, 0x74, 0xdc, 0x2d,
+    0xe9, 0x30, 0xbf, 0x6a, 0x13, 0xf7, 0xfb, 0xa9, 0xde, 0x71, 0x27, 0x3a,
+    0xe6, 0x7c, 0x75, 0xa0, 0xeb, 0xff, 0xe8, 0xde, 0x4e, 0x20, 0xf8, 0x04,
+    0xe2, 0x28, 0x75, 0x41, 0xfb, 0xed, 0x8b, 0xed, 0x07, 0xdf, 0x7b, 0x5d,
+    0x43, 0xaf, 0xa7, 0x5a, 0x48, 0xeb, 0xe8, 0x07, 0xd5, 0x9d, 0x7c, 0x3f,
+    0xbc, 0x8e, 0xa6, 0x9e, 0x26, 0x88, 0xef, 0xf7, 0x61, 0x6a, 0x80, 0x10,
+    0x75, 0x42, 0x2e, 0xf1, 0x99, 0x08, 0xaf, 0xe9, 0x93, 0xbe, 0xc6, 0x9d,
+    0x58, 0x99, 0xb7, 0x21, 0xb8, 0xe5, 0xb7, 0xfd, 0xb8, 0x7e, 0xc3, 0x1f,
+    0x7f, 0xd1, 0xd7, 0x94, 0x8f, 0x1d, 0x7f, 0xfe, 0x0f, 0x63, 0x88, 0x08,
+    0xfb, 0x13, 0x0c, 0x2c, 0xeb, 0xfc, 0xa4, 0x0f, 0xb4, 0xfd, 0x3a, 0x91,
+    0x10, 0xee, 0xab, 0x7e, 0x1c, 0x71, 0x9c, 0xea, 0x84, 0xca, 0x5d, 0x00,
+    0x61, 0x47, 0xa2, 0x1b, 0xfd, 0xd8, 0x9f, 0x91, 0x81, 0x3a, 0xff, 0xf8,
+    0x73, 0x63, 0x5f, 0x93, 0xbf, 0x9f, 0x70, 0x1d, 0x50, 0x88, 0x37, 0x32,
+    0xbf, 0xc2, 0xf3, 0xef, 0x28, 0xda, 0x3a, 0xff, 0x6b, 0xaf, 0xf7, 0xb1,
+    0x23, 0xaa, 0x73, 0xea, 0xdc, 0xda, 0xf6, 0x64, 0xc7, 0x5f, 0xff, 0xa6,
+    0xec, 0x2d, 0x38, 0x9b, 0x51, 0xf6, 0x7c, 0x64, 0xeb, 0xfe, 0x89, 0x0b,
+    0xfa, 0x49, 0xb0, 0xeb, 0xdf, 0x60, 0x07, 0x57, 0x4f, 0x57, 0x47, 0x16,
+    0x63, 0x3a, 0xf7, 0xa5, 0x87, 0x5d, 0xac, 0x3a, 0xff, 0xed, 0x47, 0x1b,
+    0xe1, 0xc9, 0xdc, 0x4e, 0xa8, 0x4d, 0x5f, 0x21, 0x60, 0x84, 0x4e, 0x26,
+    0x01, 0xbf, 0x0a, 0xdf, 0xdf, 0xcd, 0xff, 0xa3, 0xa7, 0x5f, 0xfc, 0x18,
+    0xf3, 0xeb, 0x3b, 0xd4, 0x59, 0xd7, 0xfa, 0x70, 0xc3, 0xf0, 0x1f, 0x9d,
+    0x7b, 0xc9, 0x31, 0xd5, 0x08, 0x92, 0xc4, 0x2d, 0x1a, 0x5f, 0xa1, 0x8d,
+    0x19, 0x69, 0xd5, 0x0c, 0xc7, 0xd9, 0xcb, 0xe4, 0x4e, 0x18, 0xd4, 0x31,
+    0x8f, 0x72, 0x14, 0x94, 0x78, 0xc6, 0x9f, 0x34, 0x2a, 0xb9, 0x1b, 0x52,
+    0xe3, 0x5d, 0xec, 0x30, 0xde, 0x11, 0x60, 0x24, 0x18, 0xdc, 0xb4, 0xb3,
+    0xe8, 0x61, 0x7d, 0x2e, 0xbf, 0xff, 0xe6, 0x28, 0xc2, 0x8c, 0x62, 0xbc,
+    0x61, 0x30, 0xdb, 0x18, 0xd8, 0x77, 0xff, 0x3e, 0x77, 0x6c, 0xeb, 0xd3,
+    0x7d, 0x59, 0xd7, 0xfd, 0x9e, 0xd6, 0x7b, 0xb8, 0x03, 0xa9, 0xcf, 0x58,
+    0x47, 0xee, 0x71, 0x3a, 0xb8, 0x6d, 0x16, 0x41, 0x7d, 0x1e, 0xc5, 0x9d,
+    0x7e, 0xf4, 0x0a, 0x00, 0xeb, 0xfb, 0x19, 0x70, 0x2f, 0x0e, 0xaf, 0x87,
+    0xe3, 0x84, 0x02, 0x4b, 0x7e, 0xe4, 0xf1, 0xed, 0x1d, 0x7c, 0xfc, 0x79,
+    0x1d, 0x6e, 0x61, 0xe4, 0x09, 0x45, 0xe6, 0x59, 0x64, 0xeb, 0xe9, 0xc5,
+    0x20, 0xa5, 0x4b, 0xfb, 0xfe, 0x63, 0xeb, 0x8c, 0x83, 0x13, 0x9d, 0x76,
+    0xf2, 0x3a, 0xff, 0x29, 0x1e, 0xd7, 0x5f, 0xf3, 0xaf, 0xc9, 0x3e, 0x6f,
+    0xe3, 0xae, 0x46, 0x9d, 0x50, 0x88, 0x85, 0x05, 0xd6, 0x69, 0xe2, 0x8b,
+    0xf2, 0x8f, 0xad, 0x92, 0x3a, 0xb7, 0x3e, 0x7f, 0x1e, 0xd3, 0x0c, 0xaf,
+    0xa6, 0x23, 0x1e, 0x0c, 0x24, 0x91, 0xdf, 0xa8, 0xae, 0x61, 0xfc, 0x65,
+    0x57, 0xff, 0x6c, 0x67, 0x34, 0x29, 0x1c, 0xc9, 0xce, 0xbf, 0xff, 0xff,
+    0xf3, 0x1f, 0xce, 0xe6, 0xf2, 0xea, 0xfe, 0x37, 0xbf, 0xfb, 0xd8, 0x3d,
+    0xcf, 0x40, 0x7e, 0x7c, 0xee, 0xd9, 0xd7, 0xfc, 0x1c, 0xfd, 0x82, 0x9d,
+    0x75, 0x9d, 0x7e, 0x85, 0x8e, 0x4c, 0x76, 0x1b, 0xcb, 0xdb, 0x30, 0x27,
+    0x5f, 0xdd, 0x48, 0x1f, 0xe0, 0xeb, 0xfd, 0x0c, 0x6a, 0x66, 0x9d, 0x8c,
+    0xea, 0x50, 0xf8, 0xfa, 0x57, 0x5d, 0x45, 0x1b, 0xc2, 0x02, 0x82, 0x8f,
+    0xfd, 0x43, 0x62, 0xfe, 0x89, 0x76, 0x36, 0x21, 0xd7, 0xe5, 0xfe, 0x30,
+    0xb3, 0xaf, 0xb9, 0xfb, 0xe8, 0xea, 0x83, 0xc9, 0x72, 0x7b, 0xa5, 0xe3,
+    0xaf, 0xa6, 0x8f, 0x39, 0xd7, 0xdf, 0x83, 0x05, 0xa6, 0xdf, 0xf1, 0x6b,
+    0x48, 0xea, 0x9c, 0xf2, 0x7a, 0x73, 0x7f, 0xf4, 0x77, 0xe8, 0x7c, 0x99,
+    0x34, 0x2c, 0xeb, 0xf3, 0xcb, 0x49, 0xb0, 0xeb, 0xfe, 0xf7, 0x72, 0x5b,
+    0xcb, 0x3c, 0x75, 0xf4, 0x7b, 0xf5, 0x9d, 0x46, 0x88, 0x3a, 0xfe, 0x79,
+    0xc0, 0xe2, 0x12, 0x56, 0x0d, 0xb6, 0x9a, 0x7a, 0x3b, 0x62, 0xf4, 0xb4,
+    0x4f, 0x79, 0xce, 0xff, 0xfc, 0xbd, 0x3c, 0xba, 0x99, 0xed, 0x73, 0x03,
+    0x87, 0x5f, 0xf4, 0x78, 0x73, 0x60, 0xe6, 0x8e, 0xa8, 0x45, 0x6e, 0x11,
+    0xe9, 0x4e, 0xfe, 0x7e, 0xc3, 0x1f, 0xf2, 0x3a, 0xa4, 0xae, 0x21, 0xae,
+    0xdc, 0x85, 0x02, 0xc8, 0xc0, 0x8a, 0x25, 0x1e, 0x8e, 0x13, 0x61, 0x75,
+    0xfd, 0x21, 0xcd, 0xfd, 0x87, 0x5f, 0xff, 0xbe, 0x80, 0x11, 0xbe, 0x4e,
+    0x17, 0x76, 0xb8, 0x4e, 0xa8, 0x44, 0x1f, 0x0b, 0x2f, 0xf3, 0x8f, 0xa5,
+    0x9c, 0xc3, 0xaf, 0xfe, 0x74, 0xf4, 0x0b, 0x73, 0xdd, 0x43, 0xaf, 0xe1,
+    0x40, 0x6b, 0xa8, 0x75, 0xdc, 0x09, 0xd7, 0x32, 0xc9, 0xd5, 0x23, 0x5c,
+    0xc8, 0xb5, 0xe8, 0x4d, 0x85, 0x2a, 0x68, 0xab, 0xa8, 0xe8, 0x74, 0x0d,
+    0x3d, 0xdc, 0x0d, 0x1d, 0x7f, 0x27, 0x51, 0x45, 0x20, 0xeb, 0xb5, 0xf4,
+    0x27, 0x87, 0xe1, 0x6a, 0x44, 0x51, 0x7d, 0x72, 0xbc, 0xcb, 0x2c, 0x95,
+    0x45, 0x2a, 0x5f, 0xdf, 0x23, 0x29, 0x31, 0x54, 0xd3, 0x78, 0x83, 0x57,
+    0xec, 0xe4, 0x6c, 0xc3, 0xaa, 0x19, 0x2f, 0xf3, 0xa2, 0xe4, 0x7c, 0xc9,
+    0x2e, 0xc3, 0x91, 0x81, 0x2c, 0x8b, 0xb1, 0xdd, 0x0b, 0xfe, 0x88, 0x2f,
+    0xb9, 0x2f, 0xf0, 0xeb, 0xfc, 0x3b, 0xfb, 0xef, 0x5c, 0x07, 0x5e, 0x14,
+    0xd1, 0xd7, 0xc1, 0x71, 0x01, 0xd7, 0xff, 0x40, 0x80, 0x63, 0x79, 0xa0,
+    0x40, 0x75, 0x62, 0x2c, 0x50, 0xd4, 0x03, 0x5a, 0x20, 0xbf, 0x4d, 0xb6,
+    0x0d, 0xbc, 0x3a, 0xc8, 0x75, 0xff, 0x3a, 0x8d, 0xea, 0x05, 0xe4, 0x75,
+    0xf4, 0xf3, 0xbe, 0xe7, 0x5c, 0x0d, 0x21, 0xf5, 0x88, 0x7f, 0xd3, 0x8b,
+    0xf4, 0x67, 0x3a, 0x87, 0x5f, 0xfe, 0x64, 0x1d, 0xcc, 0x9d, 0x33, 0x64,
+    0x6e, 0x75, 0xff, 0xe0, 0x42, 0xf9, 0xc8, 0x9f, 0xce, 0xea, 0x1d, 0x7f,
+    0xa5, 0x9d, 0xc5, 0xc3, 0x4e, 0xbd, 0x8b, 0x63, 0x3a, 0xff, 0x66, 0x87,
+    0x3d, 0xd4, 0x3a, 0x82, 0x79, 0xc2, 0x3d, 0x58, 0x9c, 0xb4, 0xc7, 0x7d,
+    0x25, 0x02, 0x67, 0x92, 0xb6, 0x3f, 0xdf, 0xde, 0xc9, 0x86, 0x16, 0x78,
+    0x80, 0xaf, 0xce, 0x21, 0xec, 0x1a, 0x20, 0x25, 0x4d, 0xcd, 0xff, 0xc9,
+    0xbe, 0x83, 0x83, 0x03, 0xfc, 0x1d, 0x7f, 0xf7, 0xed, 0x53, 0x99, 0xbe,
+    0x80, 0xfe, 0x3a, 0xfd, 0x12, 0x7d, 0xd9, 0x3a, 0xff, 0xcd, 0xf9, 0xce,
+    0x67, 0x77, 0x96, 0x8e, 0xac, 0x47, 0x9a, 0x21, 0x71, 0x1d, 0xca, 0x2d,
+    0x39, 0xd7, 0xef, 0x99, 0x32, 0x2c, 0xeb, 0xff, 0xdf, 0xc7, 0xcd, 0xaf,
+    0x26, 0xbb, 0xbb, 0xb2, 0x75, 0x4e, 0x7f, 0x5a, 0x29, 0xbf, 0xf6, 0x07,
+    0xae, 0xac, 0x76, 0x37, 0x3a, 0x98, 0x08, 0xec, 0xe4, 0x22, 0xd6, 0x47,
+    0x7f, 0xc2, 0xa7, 0x05, 0x1b, 0xf8, 0x9d, 0x7e, 0xf4, 0x60, 0xc1, 0xd4,
+    0x87, 0xb8, 0x27, 0x17, 0xd3, 0xfd, 0x1f, 0x1d, 0x7f, 0xfe, 0x7d, 0xf7,
+    0xd4, 0x0f, 0xbe, 0xcd, 0xd4, 0xf6, 0x8e, 0xa8, 0x4c, 0xcb, 0x21, 0x2a,
+    0x84, 0x1f, 0x92, 0x5f, 0x2e, 0x31, 0x67, 0x5f, 0xfb, 0x17, 0x0d, 0x4f,
+    0x73, 0xf5, 0x9d, 0x79, 0x37, 0xd1, 0xd5, 0x23, 0xda, 0x01, 0xf5, 0xfc,
+    0xce, 0xb5, 0x00, 0x62, 0x4e, 0xa8, 0x3d, 0x57, 0x22, 0xbf, 0xdc, 0x9b,
+    0x48, 0x3e, 0x43, 0xaf, 0xf7, 0x53, 0x70, 0x71, 0xc2, 0x75, 0xf6, 0xe0,
+    0xe4, 0x15, 0x73, 0x2c, 0x95, 0x50, 0x6e, 0x99, 0x22, 0xb8, 0x50, 0xa5,
+    0x4d, 0x0d, 0xff, 0xff, 0xc2, 0xae, 0x66, 0xd4, 0x4c, 0x8b, 0x89, 0xbe,
+    0x0e, 0xf2, 0xef, 0xe0, 0x3a, 0xf3, 0xf2, 0x5f, 0x13, 0x2c, 0x94, 0x23,
+    0xb7, 0x25, 0xa6, 0x2d, 0x94, 0x6d, 0x10, 0xd3, 0x91, 0xde, 0x4a, 0x2f,
+    0x48, 0x49, 0xf2, 0x33, 0x6e, 0xca, 0x58, 0x74, 0x11, 0x86, 0x7f, 0x88,
+    0x3f, 0x8d, 0x7a, 0xf7, 0x91, 0x93, 0xaf, 0x4e, 0xeb, 0x3a, 0xf7, 0x91,
+    0x93, 0xc6, 0x11, 0x7d, 0xef, 0xdf, 0xe9, 0xa2, 0x07, 0xdc, 0xd4, 0xd3,
+    0xa2, 0x1f, 0xf4, 0x5b, 0xfd, 0x8d, 0x89, 0xc6, 0x1a, 0x75, 0x80, 0x75,
+    0x98, 0xfe, 0x1e, 0x0a, 0x18, 0xdd, 0x1f, 0x9d, 0x7e, 0xfc, 0x41, 0xf6,
+    0x47, 0x5f, 0xff, 0x0e, 0x6b, 0xe7, 0xde, 0xc0, 0x16, 0xf2, 0xf9, 0x87,
+    0x81, 0xa1, 0x6a, 0xfd, 0x1a, 0xfb, 0x1b, 0x2f, 0xfd, 0xdf, 0xe7, 0x8f,
+    0x91, 0xe8, 0x09, 0xd7, 0x9f, 0x93, 0x9d, 0x73, 0x2c, 0x9d, 0x7f, 0xb8,
+    0x99, 0xb3, 0xec, 0x95, 0x69, 0xb4, 0x64, 0x72, 0xff, 0xc8, 0xa7, 0xcd,
+    0x7e, 0x05, 0xc4, 0x8e, 0xbf, 0xda, 0xcf, 0x3a, 0xf0, 0x4e, 0xa0, 0xa6,
+    0x6d, 0xc7, 0x5e, 0xa7, 0xf9, 0x0a, 0xff, 0xda, 0xc1, 0xce, 0xe3, 0x70,
+    0x4e, 0xbf, 0xf6, 0x29, 0xd7, 0x97, 0xd7, 0xde, 0x0e, 0xa9, 0x1f, 0xd0,
+    0x9d, 0x54, 0x23, 0x67, 0x21, 0x71, 0x7f, 0xf2, 0xd6, 0xf2, 0xce, 0x35,
+    0xdd, 0xa6, 0x88, 0x62, 0xff, 0xff, 0xf3, 0xeb, 0x07, 0x1b, 0xd8, 0xde,
+    0x5b, 0x79, 0xd6, 0xa6, 0x0b, 0xa8, 0x75, 0x62, 0x31, 0xbf, 0x4f, 0xa4,
+    0x56, 0x89, 0xd9, 0x46, 0xa3, 0x0e, 0xcb, 0xfc, 0xbe, 0xbc, 0xe3, 0x12,
+    0x2a, 0xed, 0x7e, 0x75, 0xfd, 0x2e, 0xbb, 0x8c, 0x1d, 0x68, 0x69, 0xe0,
+    0xee, 0x2f, 0x7e, 0xe3, 0x5d, 0xda, 0x68, 0x82, 0xaf, 0x76, 0x16, 0x75,
+    0xff, 0xa2, 0x77, 0xf7, 0x32, 0x5b, 0x78, 0x75, 0x62, 0x23, 0x90, 0xcc,
+    0x46, 0xef, 0xdd, 0x85, 0xff, 0xb9, 0xd7, 0xde, 0xd4, 0x00, 0xab, 0xcf,
+    0xc9, 0xca, 0xbe, 0xfc, 0x5d, 0x42, 0xaf, 0xf2, 0x4f, 0x9e, 0xd4, 0x00,
+    0xaa, 0x2a, 0xfe, 0xc6, 0xc7, 0x61, 0x65, 0x5c, 0xcb, 0x25, 0x5f, 0xc3,
+    0x03, 0x3a, 0x70, 0xaa, 0xc4, 0xc2, 0x5a, 0x42, 0xb1, 0xce, 0x91, 0x00,
+    0xc8, 0x42, 0x99, 0x2b, 0xfa, 0x31, 0x72, 0x70, 0xa5, 0x4f, 0xce, 0xa4,
+    0x9f, 0xcc, 0xc5, 0xbd, 0x8e, 0x96, 0xa1, 0x5a, 0xd7, 0x5c, 0xde, 0x55,
+    0x7d, 0xfd, 0x83, 0xa4, 0x1c, 0x3a, 0xf7, 0x7f, 0x59, 0xd5, 0xd3, 0xc6,
+    0xda, 0x29, 0xbf, 0xce, 0x39, 0xae, 0x46, 0x8e, 0xbf, 0x83, 0x82, 0xfe,
+    0xd1, 0xd6, 0x89, 0x1e, 0xde, 0x8c, 0x2f, 0xdc, 0xde, 0x59, 0xe3, 0xaf,
+    0xde, 0x4c, 0xdf, 0xc7, 0x5f, 0xff, 0xf7, 0x53, 0x98, 0x17, 0x5e, 0x0f,
+    0x86, 0x19, 0xcf, 0x68, 0xeb, 0x41, 0xd7, 0xd1, 0xb0, 0x30, 0xd3, 0xf2,
+    0x03, 0x1d, 0xff, 0x9e, 0x5d, 0x7f, 0x6b, 0x06, 0x47, 0x57, 0x4f, 0xdb,
+    0xc7, 0x55, 0xc4, 0xd6, 0x74, 0x51, 0xe8, 0xc3, 0xef, 0xf6, 0xf2, 0xdb,
+    0x86, 0xe2, 0xce, 0xbf, 0xff, 0xf7, 0x39, 0x1b, 0xcb, 0x7d, 0x27, 0x1b,
+    0xdc, 0xfb, 0xc4, 0x80, 0x9d, 0x7f, 0xcf, 0xcc, 0xde, 0x50, 0x08, 0x3a,
+    0xa1, 0x1b, 0x98, 0x6d, 0xfb, 0x7d, 0xff, 0xf9, 0xaa, 0x3e, 0xb3, 0x92,
+    0x4e, 0xb8, 0xef, 0x23, 0xaf, 0xfc, 0xd8, 0xf6, 0xb3, 0xc9, 0xbb, 0x27,
+    0x59, 0xf1, 0x12, 0x8a, 0x2a, 0xd4, 0x27, 0xfd, 0xd8, 0xc4, 0xc6, 0x18,
+    0x77, 0xcf, 0x3f, 0xd6, 0x9d, 0x73, 0x80, 0xea, 0x91, 0xb9, 0xf1, 0x25,
+    0xff, 0xf9, 0xde, 0x4f, 0xdf, 0x99, 0x3f, 0xfe, 0xfd, 0xfe, 0x9a, 0x2f,
+    0xbb, 0xc0, 0x80, 0x9d, 0x7f, 0xed, 0x20, 0xef, 0x2e, 0x7f, 0x1a, 0x3a,
+    0xa6, 0x46, 0x0f, 0x19, 0xfc, 0x37, 0x7e, 0xee, 0x4d, 0x0c, 0x67, 0x5f,
+    0x83, 0xce, 0x63, 0x27, 0x5a, 0x27, 0x3d, 0x21, 0x2a, 0xb3, 0x4e, 0xbf,
+    0xff, 0xc0, 0x4e, 0x29, 0xd8, 0x5c, 0xd2, 0x41, 0xec, 0x72, 0x0e, 0xb7,
+    0xb0, 0xfc, 0x34, 0x21, 0x7d, 0xe1, 0xc9, 0x1d, 0x50, 0x78, 0xe8, 0x4f,
+    0x7f, 0xe1, 0x49, 0x7b, 0xb9, 0xc4, 0xd1, 0xd7, 0xf4, 0x48, 0x73, 0x27,
+    0x3a, 0xff, 0x38, 0x60, 0x10, 0xce, 0x8e, 0xae, 0x9e, 0xeb, 0x95, 0xdf,
+    0xdb, 0x6c, 0x57, 0xe7, 0xce, 0xed, 0x9e, 0x20, 0x1b, 0xfd, 0xe0, 0x7d,
+    0x19, 0x77, 0x0f, 0x10, 0x0d, 0xe7, 0xe4, 0x8f, 0x10, 0x0d, 0x61, 0xf4,
+    0xfe, 0x83, 0x73, 0xc8, 0xf1, 0x00, 0xdf, 0x38, 0xef, 0x23, 0xc4, 0x03,
+    0x7f, 0x91, 0xbd, 0xc0, 0x02, 0x0f, 0x10, 0x0d, 0xe4, 0x10, 0x9e, 0x20,
+    0x1a, 0x0a, 0x2d, 0x56, 0x45, 0xd2, 0xed, 0x87, 0xd6, 0x50, 0xf1, 0x00,
+    0xde, 0xe4, 0x78, 0xf1, 0x00, 0xd1, 0xe2, 0x01, 0xbd, 0xb6, 0x80, 0x3c,
+    0x40, 0x37, 0x42, 0xcf, 0x10, 0x0d, 0x04, 0xf9, 0x30, 0x5d, 0x0a, 0xef,
+    0x91, 0x61, 0x83, 0xc4, 0x03, 0x7b, 0xce, 0xd3, 0xc4, 0x03, 0x7f, 0xe1,
+    0x79, 0x2b, 0xd4, 0x6b, 0xf0, 0xf1, 0x00, 0xdf, 0xfc, 0xfe, 0xfe, 0x74,
+    0x1f, 0x75, 0xe4, 0x78, 0x80, 0x6e, 0x70, 0x9e, 0x20, 0x1b, 0xfc, 0x2e,
+    0xce, 0xb5, 0x00, 0x3c, 0x40, 0x37, 0xe4, 0x51, 0xc4, 0x07, 0x88, 0x06,
+    0xe4, 0xd1, 0xe2, 0x01, 0xae, 0x1e, 0xaf, 0x8c, 0xef, 0xff, 0x75, 0x3d,
+    0xec, 0xd7, 0xce, 0x24, 0x2c, 0xf1, 0x00, 0xdf, 0xbc, 0x31, 0xbc, 0x8d,
+    0x10, 0x0d, 0xc0, 0x83, 0xc4, 0x02, 0xa9, 0xb4, 0xbf, 0x24, 0x2d, 0xc2,
+    0x78, 0x80, 0x6f, 0xbf, 0x71, 0x69, 0xe2, 0x01, 0xbd, 0x1c, 0x69, 0xe2,
+    0x01, 0xbf, 0xf6, 0x6f, 0xa0, 0xc6, 0x08, 0x34, 0x78, 0x80, 0x6f, 0xdf,
+    0xbc, 0xa5, 0x07, 0x88, 0x06, 0xfc, 0xed, 0xec, 0x6e, 0x78, 0x80, 0x6b,
+    0x11, 0x65, 0xd4, 0xaf, 0xcd, 0x2e, 0xe0, 0x0f, 0x10, 0x0d, 0x49, 0x59,
+    0x18, 0x48, 0xb2, 0x12, 0x8d, 0x22, 0x48, 0x45, 0xf4, 0xcc, 0x06, 0x5a,
+    0x2e, 0xf4, 0x36, 0xbf, 0x30, 0xbf, 0x67, 0xb4, 0xfb, 0x9e, 0x20, 0x1b,
+    0xfc, 0x18, 0x6c, 0xdc, 0x8f, 0x1e, 0x20, 0x10, 0x9b, 0x4b, 0xdc, 0x86,
+    0x4f, 0x10, 0x0d, 0x34, 0xfe, 0x78, 0xa1, 0x7f, 0xbf, 0x79, 0x4a, 0x3e,
+    0xac, 0xf1, 0x00, 0xdf, 0x20, 0xcb, 0x47, 0x88, 0x06, 0xfe, 0x79, 0xa5,
+    0x9b, 0xc8, 0xf1, 0x00, 0xd6, 0x23, 0x33, 0xa4, 0x40, 0x42, 0xfc, 0xb6,
+    0xff, 0xbb, 0x1a, 0x57, 0x5f, 0xf0, 0x07, 0x88, 0x06, 0xc8, 0x78, 0x80,
+    0x6e, 0x79, 0xc2, 0x7c, 0x9d, 0x48, 0xbb, 0x80, 0x3c, 0x40, 0x37, 0xe7,
+    0xf6, 0x93, 0x73, 0xc4, 0x03, 0x7f, 0x20, 0xff, 0x2c, 0xd1, 0xe2, 0x01,
+    0xa8, 0x44, 0x80, 0x91, 0xf8, 0xd2, 0xa1, 0x94, 0xaa, 0x18, 0x5a, 0x64,
+    0x35, 0xd0, 0xfe, 0x61, 0xee, 0x42, 0x33, 0xa5, 0xae, 0x5a, 0x02, 0x81,
+    0x4a, 0xd4, 0xb7, 0x4f, 0x4a, 0x14, 0xdb, 0x85, 0x0f, 0xd8, 0x5f, 0x5e,
+    0xf2, 0x32, 0x78, 0xc2, 0x6f, 0x3b, 0xb4, 0xd1, 0x00, 0xaa, 0x98, 0xa6,
+    0xf0, 0xeb, 0xbe, 0x51, 0x87, 0x85, 0x67, 0x5d, 0xb2, 0x73, 0xaf, 0xdb,
+    0x06, 0x03, 0xd3, 0xaa, 0x0f, 0x05, 0x06, 0x6f, 0xfe, 0x90, 0xe3, 0x7a,
+    0x80, 0x07, 0xf3, 0x1d, 0x7e, 0xf6, 0x05, 0xfa, 0x75, 0xc0, 0x82, 0xac,
+    0xa1, 0x57, 0xbb, 0x13, 0x9d, 0x73, 0x2c, 0x95, 0x48, 0x7b, 0x4c, 0x62,
+    0xb3, 0x08, 0xb2, 0x39, 0x6d, 0x14, 0xa9, 0xe0, 0x59, 0x78, 0x8e, 0x24,
+    0x86, 0x05, 0xe4, 0xff, 0xc7, 0x5f, 0xfe, 0xf6, 0xb1, 0x44, 0xe7, 0xd0,
+    0x02, 0x37, 0x3a, 0xa7, 0x67, 0x6b, 0xc8, 0x80, 0x30, 0x99, 0x6d, 0x2e,
+    0x29, 0x13, 0xb8, 0xd4, 0xe4, 0x00, 0x8c, 0x9f, 0xc5, 0x9f, 0x47, 0x2f,
+    0xfb, 0x24, 0x81, 0x76, 0xea, 0x47, 0x5f, 0xf2, 0xd0, 0x5a, 0x9c, 0x40,
+    0x1d, 0x4d, 0x3e, 0xde, 0x9b, 0xdf, 0xfe, 0x1f, 0x6d, 0xe4, 0xd2, 0x7e,
+    0x4e, 0x18, 0x3a, 0xfe, 0xf7, 0xdd, 0x9b, 0x23, 0x47, 0x5f, 0xec, 0xdf,
+    0xde, 0x79, 0x68, 0xeb, 0xc3, 0xbc, 0x8f, 0x18, 0x05, 0x42, 0x3f, 0xb0,
+    0x89, 0x13, 0x78, 0x66, 0xe6, 0x77, 0xff, 0xf2, 0x08, 0xff, 0xbe, 0x6f,
+    0xe0, 0xf1, 0xf7, 0xc9, 0xce, 0xbf, 0x4d, 0x28, 0xe4, 0xe7, 0x5f, 0x42,
+    0x90, 0xb3, 0xaa, 0x48, 0xa7, 0xe2, 0xea, 0xca, 0x6f, 0xfd, 0x2d, 0x7c,
+    0x1c, 0x5c, 0x71, 0x43, 0xaf, 0xe9, 0x47, 0x01, 0xf5, 0x67, 0x5f, 0xfd,
+    0xb0, 0x73, 0x5e, 0xc1, 0x96, 0x68, 0xeb, 0xe5, 0xc7, 0xfe, 0x3a, 0xb0,
+    0xf9, 0x5d, 0x0e, 0xee, 0xbe, 0x22, 0xd0, 0x61, 0x29, 0x7f, 0xd0, 0xc6,
+    0x1e, 0xc4, 0xee, 0x27, 0x5f, 0xf4, 0x36, 0x16, 0x8b, 0x02, 0x1d, 0x5c,
+    0x45, 0x0f, 0x4c, 0x76, 0x8e, 0xaf, 0xef, 0xac, 0xf1, 0x33, 0xa5, 0x5f,
+    0xb5, 0xd8, 0xc9, 0xce, 0xbf, 0xf8, 0x02, 0x99, 0xbf, 0xa6, 0x93, 0xf0,
+    0xeb, 0xe9, 0xba, 0xf3, 0x1d, 0x7c, 0xd7, 0xe4, 0xe7, 0x5f, 0xb2, 0x69,
+    0x46, 0xe7, 0x5e, 0xea, 0x4c, 0x75, 0xe1, 0x89, 0x15, 0x7f, 0xe1, 0x02,
+    0x6d, 0x6d, 0x7f, 0x28, 0x63, 0x3a, 0xb0, 0xf8, 0x5c, 0x6a, 0xbe, 0x26,
+    0xeb, 0xb9, 0x3f, 0x11, 0x3a, 0x46, 0x24, 0x5e, 0x28, 0xda, 0x7d, 0xa8,
+    0x5c, 0x06, 0xc3, 0x04, 0x8e, 0x57, 0xa6, 0x6f, 0x1d, 0x25, 0xfd, 0xbe,
+    0xb9, 0xc8, 0xf1, 0xd7, 0xf4, 0xb4, 0xa7, 0x1d, 0xa7, 0x5e, 0x1f, 0x68,
+    0xeb, 0xf6, 0xbf, 0x1f, 0xda, 0x75, 0xfd, 0xe9, 0xa5, 0x9b, 0xc8, 0xea,
+    0x84, 0x50, 0xa1, 0x77, 0xe3, 0x7f, 0x4a, 0x6f, 0xfe, 0xeb, 0x31, 0xcd,
+    0x63, 0x2f, 0xc5, 0x0e, 0xbf, 0x60, 0x43, 0x8b, 0x3a, 0xff, 0xf7, 0xb7,
+    0x6a, 0x77, 0x6e, 0x3d, 0xdf, 0xba, 0x3a, 0xe6, 0x0e, 0x8e, 0xb9, 0xa8,
+    0x75, 0xf0, 0xa6, 0xf2, 0x3a, 0xff, 0x93, 0x7e, 0xe0, 0x78, 0xed, 0x3a,
+    0xa0, 0xf6, 0x78, 0x43, 0x7f, 0xdd, 0x8e, 0x43, 0x50, 0x5a, 0x75, 0xf7,
+    0x94, 0x7d, 0x35, 0x18, 0xbc, 0x6e, 0xda, 0x21, 0xa9, 0x27, 0xcd, 0xc4,
+    0x65, 0x93, 0x7e, 0xa0, 0xcc, 0x37, 0xef, 0xdb, 0x5f, 0xaf, 0x02, 0x75,
+    0xff, 0xbb, 0x9b, 0x4e, 0x2a, 0x66, 0xfe, 0x3a, 0xff, 0xb1, 0xbd, 0x40,
+    0xf7, 0xf5, 0x0e, 0xbd, 0xec, 0x69, 0xd4, 0xb3, 0xd5, 0xd1, 0xd5, 0xe9,
+    0x2c, 0x07, 0x52, 0x88, 0xd4, 0x04, 0x25, 0xbc, 0x45, 0x7f, 0xca, 0x3f,
+    0xc8, 0x58, 0xa2, 0x87, 0x5f, 0xf9, 0xf4, 0xb8, 0x4e, 0x71, 0x19, 0x3a,
+    0xda, 0x50, 0xfd, 0xfa, 0x75, 0x7f, 0xd9, 0xef, 0x22, 0x9e, 0xc6, 0x9d,
+    0x7f, 0x46, 0xfa, 0xcd, 0xfc, 0x75, 0xdc, 0x83, 0xa8, 0x27, 0x87, 0xe2,
+    0xeb, 0xfe, 0x8f, 0x23, 0x50, 0x31, 0xe3, 0xad, 0xa0, 0xa3, 0x4f, 0x1e,
+    0xf8, 0x45, 0x5b, 0xa6, 0x63, 0xe8, 0x7e, 0x5f, 0xf7, 0x92, 0x78, 0xdc,
+    0x1c, 0x83, 0xaf, 0x6b, 0xd8, 0x75, 0xd9, 0xaf, 0x87, 0xa9, 0xf4, 0xe6,
+    0xff, 0xec, 0xf2, 0x6f, 0x21, 0x86, 0x13, 0x14, 0xdb, 0x3a, 0xff, 0xf7,
+    0xf2, 0xeb, 0xa7, 0x90, 0x7d, 0xff, 0x4e, 0xbf, 0x67, 0x80, 0xfe, 0x3a,
+    0xa4, 0x8c, 0x0e, 0x28, 0x6d, 0xa5, 0x5f, 0xff, 0xa3, 0xaf, 0x83, 0x1c,
+    0x50, 0x3f, 0xbf, 0x24, 0x75, 0x49, 0x37, 0x8f, 0x43, 0xc7, 0x68, 0xce,
+    0xa1, 0x75, 0x7b, 0x14, 0x92, 0x1f, 0xef, 0x1e, 0xf7, 0xf1, 0xfb, 0x5f,
+    0x75, 0x1e, 0x47, 0x5f, 0xec, 0x19, 0x66, 0xbe, 0xac, 0xeb, 0xf2, 0xf4,
+    0x07, 0x73, 0xab, 0xc7, 0xb3, 0xf4, 0xce, 0xff, 0xb9, 0x83, 0xf3, 0xb9,
+    0xbb, 0x27, 0x5f, 0xf4, 0x87, 0xf0, 0x7c, 0x6a, 0xc0, 0x75, 0x4e, 0x98,
+    0xa4, 0x9e, 0x70, 0x93, 0x73, 0xbb, 0xfe, 0x18, 0xcd, 0xfd, 0x9c, 0x83,
+    0xaf, 0xfd, 0x1d, 0xfb, 0xa1, 0xcf, 0x77, 0x0e, 0xa8, 0x45, 0x9b, 0x9f,
+    0x80, 0xda, 0xfc, 0xfb, 0x02, 0x18, 0x3a, 0xed, 0x68, 0xeb, 0xcc, 0xb2,
+    0xc9, 0xd7, 0x01, 0xca, 0x54, 0xbf, 0xae, 0x1e, 0xd6, 0x8d, 0x6f, 0xfd,
+    0x9a, 0x17, 0x52, 0x61, 0x49, 0x8e, 0xbf, 0x81, 0x12, 0xef, 0xdd, 0x1d,
+    0x7f, 0x20, 0x81, 0xad, 0x43, 0xaf, 0x38, 0x30, 0xaa, 0x92, 0x6a, 0xcb,
+    0x84, 0x17, 0x48, 0x80, 0x7d, 0xb0, 0xbf, 0x6c, 0xae, 0xfa, 0x02, 0x81,
+    0x3a, 0xfc, 0x1e, 0x27, 0xf3, 0x9d, 0x7f, 0x99, 0xc1, 0xcd, 0x89, 0xc3,
+    0xaf, 0xe1, 0xcd, 0xc1, 0xf6, 0x47, 0x54, 0xc8, 0x8b, 0x12, 0x9f, 0x19,
+    0xdc, 0xeb, 0x3a, 0xff, 0x66, 0xcc, 0x55, 0x96, 0x59, 0x2a, 0xfd, 0x34,
+    0x67, 0x74, 0x75, 0x09, 0xef, 0xfd, 0x38, 0xbf, 0xcc, 0x18, 0xfd, 0xbd,
+    0x4e, 0x1d, 0x79, 0x6f, 0xe3, 0xaa, 0x64, 0x74, 0xf5, 0xd3, 0xf2, 0x3d,
+    0x86, 0xf7, 0xf0, 0xec, 0x75, 0xa2, 0xce, 0xbf, 0x64, 0xd2, 0x89, 0x1d,
+    0x7f, 0x4e, 0x18, 0xc1, 0x09, 0xd5, 0x0a, 0xb9, 0xe4, 0xc4, 0x90, 0xab,
+    0x78, 0xc6, 0x74, 0x83, 0xe2, 0xdf, 0xa4, 0xf7, 0x9c, 0x08, 0x75, 0xff,
+    0x04, 0x7f, 0xd6, 0x4f, 0x93, 0x9d, 0x7a, 0x38, 0x27, 0x5f, 0xec, 0x08,
+    0xbe, 0x90, 0x27, 0x5b, 0xa7, 0x5e, 0xfd, 0xe7, 0x13, 0xc0, 0xd1, 0x85,
+    0x93, 0x88, 0x8e, 0xf2, 0xd5, 0x2d, 0x30, 0xa7, 0x1a, 0x60, 0xc3, 0x22,
+    0xff, 0xf6, 0x05, 0xd7, 0x9b, 0xcb, 0x01, 0x81, 0x3a, 0xee, 0xb9, 0xd7,
+    0x4d, 0xa3, 0xaf, 0xd9, 0xb1, 0x04, 0x38, 0x6b, 0x3e, 0x8a, 0xdf, 0xbb,
+    0x9b, 0xfa, 0x0e, 0xbf, 0x6d, 0x3c, 0xff, 0x64, 0x75, 0x7c, 0x4c, 0x1d,
+    0x57, 0x4c, 0x3f, 0xfc, 0x9e, 0xf8, 0x39, 0xd7, 0x3a, 0xff, 0xe8, 0xc1,
+    0x97, 0x70, 0x46, 0x19, 0x3a, 0xb8, 0x8a, 0x11, 0x41, 0xf1, 0x05, 0xfe,
+    0xe6, 0xbb, 0x82, 0x9a, 0x3a, 0x90, 0xf8, 0x1c, 0xbe, 0xff, 0xb0, 0x38,
+    0x30, 0x3f, 0xc1, 0xd7, 0x43, 0x27, 0x54, 0x3b, 0x91, 0xb9, 0xe1, 0x47,
+    0x29, 0xc7, 0xf0, 0xcb, 0x96, 0xc7, 0xd5, 0x21, 0x00, 0xd9, 0x6f, 0xdb,
+    0xb9, 0xa4, 0x38, 0xa6, 0x84, 0x1f, 0x29, 0xf6, 0xab, 0x94, 0x1f, 0xd9,
+    0xcf, 0x37, 0x55, 0x04, 0x33, 0xc6, 0x7e, 0x0b, 0x52, 0x88, 0xbd, 0x38,
+    0xd7, 0xfc, 0x6f, 0x5b, 0x25, 0x20, 0xfd, 0x20, 0xda, 0x35, 0xbf, 0xec,
+    0xe0, 0xc7, 0xa5, 0x9d, 0x3a, 0xfe, 0x10, 0x60, 0x5e, 0x47, 0x5f, 0xfb,
+    0xa8, 0x31, 0xbe, 0x91, 0x70, 0x75, 0xed, 0x47, 0x0e, 0xbd, 0xff, 0xb4,
+    0xd3, 0xd7, 0xdc, 0xf2, 0xff, 0x34, 0x72, 0x52, 0x7d, 0x1d, 0x7f, 0x3b,
+    0x38, 0x0f, 0xbe, 0x3a, 0xfc, 0xf2, 0xf8, 0x14, 0x3a, 0xf4, 0xa0, 0x07,
+    0x5f, 0xbe, 0xcd, 0x28, 0x63, 0x2a, 0xa1, 0x3b, 0xec, 0x36, 0x52, 0x10,
+    0x48, 0x6d, 0xc3, 0x1e, 0x97, 0xf8, 0xa3, 0xe8, 0xdd, 0x9a, 0x75, 0xff,
+    0xca, 0x0f, 0xef, 0xf7, 0x34, 0x90, 0x27, 0x5e, 0xdb, 0x40, 0x9d, 0x5c,
+    0x3e, 0x25, 0xa2, 0x5f, 0xfd, 0xbf, 0xbf, 0x5f, 0x61, 0x05, 0xc2, 0x75,
+    0xf2, 0x9c, 0x76, 0x4e, 0xb7, 0xd3, 0x44, 0x0b, 0x6f, 0x1a, 0x81, 0x4a,
+    0xf1, 0xbc, 0x64, 0x7e, 0xb1, 0x10, 0x28, 0xbf, 0x7f, 0xe4, 0xdb, 0xea,
+    0x7d, 0x54, 0x00, 0x82, 0xaf, 0xf8, 0x7d, 0xaf, 0xf7, 0xf2, 0x32, 0x75,
+    0xfe, 0xfd, 0xf5, 0x98, 0x2a, 0x1d, 0x50, 0x7d, 0xbd, 0x3b, 0xbf, 0xe8,
+    0xf6, 0xbe, 0x62, 0xd0, 0x27, 0x5f, 0xfb, 0xe0, 0xba, 0x9f, 0x34, 0x00,
+    0x41, 0xd7, 0xff, 0xa7, 0xfc, 0x1a, 0x92, 0x6b, 0x51, 0xc9, 0x1d, 0x64,
+    0x51, 0x11, 0xdc, 0x42, 0xbf, 0xcf, 0xdd, 0xf5, 0x03, 0xe3, 0xab, 0x47,
+    0xb7, 0xe2, 0x9b, 0xfd, 0xd4, 0x9a, 0x50, 0x32, 0x3a, 0xff, 0xd0, 0xce,
+    0x98, 0x0e, 0xdc, 0xdf, 0xc7, 0x53, 0x4f, 0xd7, 0xc6, 0x57, 0xd2, 0xee,
+    0x4e, 0x75, 0xff, 0x46, 0xeb, 0x7f, 0x66, 0xfe, 0x3a, 0xb7, 0x3d, 0xb1,
+    0x22, 0xbf, 0xe8, 0x6f, 0xbf, 0xef, 0x21, 0x93, 0xae, 0xe3, 0x9d, 0x7f,
+    0xf6, 0xc4, 0xd6, 0xb0, 0x5a, 0xe2, 0x03, 0xaf, 0xf7, 0x50, 0x21, 0xc6,
+    0x66, 0x3a, 0xf4, 0x70, 0x18, 0x7e, 0xed, 0x43, 0xae, 0x22, 0xfb, 0xb0,
+    0x8c, 0xbf, 0xf3, 0xef, 0xac, 0xf2, 0x2d, 0xe4, 0x75, 0xbc, 0x75, 0x00,
+    0xf3, 0x7e, 0x9e, 0xdf, 0xff, 0xfd, 0xfe, 0xba, 0xf2, 0xd4, 0x93, 0xdf,
+    0x79, 0x1d, 0x8f, 0x69, 0xf7, 0x3a, 0xfd, 0x18, 0x3e, 0xdb, 0x3a, 0xfe,
+    0x4d, 0xc1, 0xc7, 0x09, 0xd6, 0x59, 0xd4, 0xb3, 0xe5, 0xe9, 0x40, 0x96,
+    0xde, 0x97, 0xe1, 0x3a, 0xe7, 0xdf, 0xe1, 0xe5, 0xb9, 0x75, 0x71, 0x35,
+    0x4d, 0x46, 0x4b, 0x7f, 0xff, 0x60, 0xcf, 0xad, 0x40, 0x33, 0xa9, 0xc7,
+    0x67, 0xc7, 0x50, 0x57, 0x78, 0x9a, 0x43, 0xbc, 0x64, 0x53, 0x42, 0x5f,
+    0x8f, 0xab, 0x22, 0xec, 0x3e, 0x00, 0xeb, 0xe8, 0xde, 0x19, 0x2a, 0xa8,
+    0x5f, 0x39, 0x49, 0xe9, 0x2b, 0xff, 0xf2, 0x4c, 0xef, 0x2d, 0x42, 0xc3,
+    0xd8, 0x16, 0x9d, 0x7f, 0xd9, 0x34, 0xa3, 0x7c, 0xdf, 0xc7, 0x5d, 0xc9,
+    0xf1, 0x11, 0xa2, 0xa7, 0x7c, 0x1e, 0xff, 0x39, 0xd7, 0xf8, 0x2f, 0x2c,
+    0x9f, 0xf1, 0x3a, 0xff, 0xdc, 0xc6, 0x39, 0xba, 0xeb, 0x4d, 0x1d, 0x69,
+    0xe1, 0x13, 0x18, 0x49, 0xc3, 0x3b, 0x98, 0x38, 0x75, 0x61, 0xe7, 0x39,
+    0xad, 0xfd, 0xed, 0xbf, 0xfb, 0x8d, 0x3a, 0xff, 0x72, 0x3c, 0x80, 0x89,
+    0x1d, 0x7a, 0x71, 0x91, 0xd4, 0xc0, 0x65, 0x8f, 0x43, 0x92, 0x11, 0x2e,
+    0x18, 0xbd, 0x9f, 0x5a, 0x78, 0x5c, 0x8c, 0x62, 0x9a, 0x20, 0xf1, 0x8f,
+    0xe6, 0x37, 0xfe, 0x60, 0x7d, 0x85, 0xb7, 0xaf, 0xb8, 0x0e, 0xbf, 0xd2,
+    0x9b, 0x05, 0xfb, 0x87, 0x5f, 0xed, 0x8f, 0x30, 0x60, 0x67, 0x3a, 0xfc,
+    0xf1, 0x32, 0x74, 0xeb, 0xe8, 0xfd, 0x82, 0x87, 0x5e, 0xf7, 0xa0, 0xeb,
+    0xfc, 0x9c, 0x89, 0xdf, 0x8d, 0x3a, 0xde, 0xf8, 0x89, 0x8e, 0x13, 0x39,
+    0x2f, 0x86, 0xef, 0xff, 0x71, 0xa3, 0x9b, 0x07, 0x23, 0x91, 0xa3, 0xaf,
+    0xf3, 0xcd, 0xdc, 0x5e, 0x68, 0xea, 0xc3, 0xfa, 0xd8, 0x91, 0x7f, 0x85,
+    0x4f, 0x91, 0xb1, 0x36, 0x1d, 0x7e, 0x53, 0xd9, 0x8b, 0x3a, 0xb0, 0xf7,
+    0xd0, 0xe2, 0xff, 0xf4, 0xc3, 0x8a, 0x28, 0xfe, 0xd2, 0x0c, 0xc7, 0x5f,
+    0xb0, 0x29, 0xcd, 0x1d, 0x7b, 0xde, 0xdc, 0xeb, 0xff, 0xb7, 0x6a, 0x77,
+    0xe6, 0xd6, 0x75, 0x16, 0x75, 0x00, 0xf9, 0xbc, 0x3b, 0x77, 0xfc, 0x3a,
+    0xb4, 0x6e, 0x76, 0xc8, 0xad, 0x13, 0xa3, 0xa5, 0x98, 0x62, 0xd4, 0x2b,
+    0x90, 0xc8, 0x66, 0xa4, 0x2f, 0xbb, 0x08, 0x27, 0x20, 0xf4, 0x66, 0x97,
+    0xfe, 0x14, 0xfb, 0xbe, 0x6c, 0xde, 0x3e, 0x9d, 0x7f, 0xf9, 0x33, 0x81,
+    0x86, 0x73, 0xb1, 0xbe, 0x8e, 0xbe, 0xfb, 0x1c, 0x01, 0xd7, 0x3f, 0x0e,
+    0xbf, 0xbc, 0x93, 0xae, 0x1a, 0x75, 0x04, 0xf0, 0xba, 0x2b, 0x7d, 0xcf,
+    0x24, 0xe7, 0x5d, 0x9b, 0x47, 0x5f, 0x03, 0xe8, 0xc8, 0xeb, 0x80, 0xe2,
+    0x6e, 0xfc, 0x31, 0x50, 0x8a, 0xa4, 0x22, 0xfd, 0x76, 0xed, 0xe6, 0x3a,
+    0xfd, 0xf7, 0xc0, 0x5e, 0x1d, 0x4b, 0x3c, 0x10, 0x0c, 0x5e, 0x6c, 0x68,
+    0xeb, 0xfe, 0x93, 0xf3, 0xc3, 0x0b, 0xd1, 0xd7, 0xfa, 0x03, 0x1c, 0xfe,
+    0x00, 0x75, 0xcb, 0xd4, 0xc7, 0xd2, 0xb3, 0x7b, 0xff, 0x43, 0x8e, 0x7b,
+    0xc8, 0xcf, 0x8e, 0xa8, 0x4c, 0x47, 0x08, 0x92, 0x10, 0x9f, 0x97, 0xd3,
+    0x09, 0x7f, 0x3a, 0x11, 0x65, 0x2f, 0x07, 0x1a, 0x9a, 0x89, 0x32, 0x4e,
+    0xa3, 0x0f, 0xf4, 0x70, 0x37, 0xf4, 0x7f, 0xba, 0x6f, 0xb4, 0x75, 0xfb,
+    0x19, 0xcd, 0xfc, 0x75, 0xb9, 0xf0, 0xf6, 0x90, 0xca, 0xff, 0xf6, 0xb0,
+    0x7f, 0x6f, 0x71, 0x73, 0x3b, 0x4e, 0xbf, 0xc2, 0xa7, 0x61, 0x6b, 0x13,
+    0xaf, 0xe6, 0x34, 0x8d, 0xaf, 0xfc, 0x75, 0xfa, 0x26, 0xcc, 0x69, 0xd5,
+    0x88, 0x8b, 0x43, 0x2e, 0x99, 0xdf, 0xfb, 0xb9, 0x32, 0x4d, 0xfe, 0xd7,
+    0xfa, 0x3a, 0xf2, 0x71, 0x43, 0xa9, 0x0f, 0x84, 0x51, 0x6f, 0xd1, 0xb5,
+    0xd8, 0x98, 0xea, 0x91, 0xe5, 0x68, 0x82, 0xff, 0xef, 0xe6, 0x4e, 0xc6,
+    0xf2, 0x89, 0xa0, 0xeb, 0xf0, 0x5c, 0x63, 0xa7, 0x5f, 0xd2, 0x8d, 0xfd,
+    0x9d, 0x3a, 0xff, 0xf7, 0xb4, 0x80, 0x89, 0x6b, 0x33, 0x7f, 0x1d, 0x53,
+    0x1f, 0xb6, 0x8b, 0x6c, 0x9d, 0x45, 0xf3, 0x30, 0x9b, 0xbf, 0xff, 0x73,
+    0xfe, 0x72, 0x07, 0x14, 0x4e, 0xf7, 0x3e, 0x9d, 0x7f, 0x0b, 0xa0, 0x60,
+    0x4e, 0xbe, 0x9e, 0x36, 0xa0, 0xeb, 0xee, 0x81, 0xfc, 0x75, 0xba, 0x75,
+    0xb6, 0x39, 0xb1, 0xfc, 0x86, 0xff, 0xe4, 0x5a, 0x6b, 0xb0, 0x9c, 0xfd,
+    0x8c, 0xea, 0x84, 0x62, 0x22, 0xab, 0x94, 0xdf, 0xc3, 0xa4, 0xd9, 0x01,
+    0x3a, 0xf0, 0xa2, 0x87, 0x5f, 0xde, 0x4e, 0x27, 0xbf, 0x3a, 0xd0, 0xb3,
+    0xc8, 0xfa, 0x37, 0x7f, 0x7f, 0xf7, 0xb9, 0xbe, 0x8e, 0xbf, 0xff, 0xff,
+    0x72, 0x3c, 0x2e, 0xd4, 0xd4, 0xc9, 0xc6, 0xc6, 0xbd, 0x1b, 0xc7, 0xdc,
+    0xd1, 0xd7, 0xfb, 0xb9, 0xbc, 0x71, 0x16, 0x75, 0xff, 0xff, 0xff, 0xb5,
+    0xac, 0xf7, 0x5d, 0x7a, 0xe7, 0x13, 0x7f, 0x3b, 0xa9, 0x99, 0x37, 0xfe,
+    0x86, 0x77, 0x83, 0xaf, 0x77, 0x38, 0x75, 0xfd, 0xe1, 0x70, 0x60, 0x9d,
+    0x7e, 0x17, 0x06, 0x09, 0xd5, 0xf0, 0xf3, 0xbc, 0x55, 0x50, 0x9e, 0xf8,
+    0x61, 0x06, 0xe6, 0x5e, 0x84, 0xef, 0xed, 0x37, 0xc0, 0x7d, 0xf4, 0x75,
+    0xcc, 0xb2, 0x75, 0x68, 0xdd, 0x32, 0x45, 0x7e, 0x4e, 0xbe, 0x74, 0xa5,
+    0x4d, 0x15, 0xff, 0x7f, 0xe8, 0x16, 0xb1, 0x60, 0x59, 0xd7, 0xbb, 0x00,
+    0x3a, 0x90, 0xf6, 0x5c, 0xfa, 0xfe, 0x7e, 0xc0, 0xe4, 0xe7, 0x5f, 0xee,
+    0xc7, 0xbf, 0x5f, 0xfe, 0x3a, 0xa1, 0x92, 0x13, 0x22, 0x90, 0xc3, 0x57,
+    0x78, 0x6c, 0xb1, 0x91, 0x4d, 0x18, 0x27, 0x0b, 0x96, 0xaf, 0xd8, 0x76,
+    0xb9, 0x68, 0x1d, 0x58, 0x25, 0x23, 0x28, 0x43, 0x50, 0xb0, 0xf4, 0x23,
+    0xf6, 0x10, 0x6d, 0x15, 0xdf, 0x27, 0x3e, 0xcc, 0x75, 0xf3, 0x7a, 0x9f,
+    0x4e, 0xae, 0x9e, 0x3f, 0xd2, 0x4b, 0xf4, 0xd1, 0x37, 0x60, 0xeb, 0xbe,
+    0xc1, 0xd7, 0x99, 0x65, 0x92, 0xaf, 0xa5, 0xec, 0x69, 0x4a, 0x97, 0xf7,
+    0xec, 0x0a, 0x03, 0x47, 0xbb, 0xfa, 0xb8, 0x7c, 0x82, 0x63, 0x50, 0x8e,
+    0x3e, 0x14, 0x3c, 0x26, 0xae, 0xf6, 0x8e, 0xbf, 0xef, 0x9e, 0xec, 0x7b,
+    0x5d, 0x43, 0xad, 0xa3, 0xaf, 0xf7, 0xb7, 0x97, 0x60, 0x67, 0x2a, 0xff,
+    0xd9, 0xbc, 0x93, 0x04, 0x70, 0x27, 0x5f, 0xa7, 0x5f, 0xfb, 0xf8, 0xea,
+    0x84, 0x7d, 0x6e, 0x2d, 0xc3, 0xa1, 0x10, 0xd1, 0xa7, 0x8e, 0xef, 0xf8,
+    0x61, 0x9d, 0x20, 0xef, 0x23, 0xae, 0x86, 0x9d, 0x42, 0x79, 0xbb, 0x0e,
+    0x2f, 0xa7, 0xfb, 0x0c, 0x67, 0x5f, 0xed, 0x04, 0x61, 0x9c, 0x13, 0xab,
+    0x87, 0xb1, 0xe2, 0x7a, 0x84, 0xd0, 0x12, 0x14, 0x6e, 0xf7, 0x7f, 0x0e,
+    0xfa, 0x9b, 0x3c, 0x75, 0xfc, 0x9e, 0x17, 0x06, 0x8e, 0xbf, 0xfd, 0xe9,
+    0xb3, 0x98, 0xeb, 0x8e, 0xa0, 0x4e, 0xbf, 0xbf, 0x5e, 0x77, 0x77, 0x3a,
+    0x94, 0x45, 0x08, 0x95, 0xe9, 0x22, 0xff, 0xf2, 0x04, 0x5f, 0x71, 0xcf,
+    0x62, 0x00, 0xeb, 0xfa, 0x3d, 0xd9, 0x6b, 0xf3, 0xaf, 0xdd, 0x7e, 0x67,
+    0x0e, 0xbb, 0xf7, 0x3a, 0x9a, 0x6f, 0x04, 0x9a, 0xfe, 0xe4, 0x24, 0x9f,
+    0x47, 0x5a, 0x27, 0x3c, 0xb1, 0x20, 0xbf, 0x4e, 0xc6, 0x99, 0xb9, 0xd7,
+    0xe4, 0xd4, 0x4e, 0xb3, 0xd9, 0xfb, 0x7e, 0x87, 0xe0, 0x3f, 0x3d, 0x9f,
+    0xb7, 0x3c, 0x8f, 0x67, 0xed, 0xf7, 0xf2, 0xcd, 0x1e, 0xcf, 0xda, 0x09,
+    0xe8, 0x89, 0x15, 0xfa, 0x33, 0x58, 0x27, 0xb3, 0xf6, 0x8f, 0x67, 0xed,
+    0xcf, 0xe3, 0xd9, 0xfa, 0xb2, 0xde, 0xd2, 0x13, 0xf9, 0xfd, 0x22, 0xfb,
+    0x36, 0xd0, 0x07, 0xb3, 0xf6, 0x8f, 0x67, 0xed, 0xc0, 0x83, 0xd9, 0xfb,
+    0x7f, 0xd8, 0x07, 0xe6, 0x6c, 0xc0, 0x9e, 0xcf, 0xdb, 0xfb, 0x3a, 0x9a,
+    0xfe, 0x73, 0xd9, 0xfb, 0x40, 0x45, 0x10, 0x91, 0x69, 0x16, 0xfb, 0x93,
+    0xc7, 0x8f, 0x67, 0xed, 0x1e, 0xcf, 0xdc, 0x35, 0xf7, 0x32, 0xc9, 0xec,
+    0xfd, 0xa9, 0x2b, 0x0d, 0x09, 0xa6, 0x42, 0x17, 0x78, 0x4d, 0x70, 0xa1,
+    0x66, 0x1a, 0x85, 0xcf, 0x97, 0x99, 0x26, 0xbd, 0x28, 0x50, 0xb6, 0x7e,
+    0x95, 0x44, 0x85, 0xfe, 0xd6, 0x4a, 0x51, 0xed, 0xce, 0xac, 0x3f, 0x0d,
+    0x1e, 0xdf, 0xfb, 0x1a, 0x1c, 0xe3, 0x2f, 0xd9, 0x8e, 0xbf, 0xfb, 0x43,
+    0x93, 0x44, 0xe0, 0x7d, 0xf4, 0x75, 0xd2, 0x9c, 0xab, 0xe9, 0x9d, 0xf8,
+    0x75, 0x4e, 0x8d, 0xdd, 0xc8, 0x7a, 0x7e, 0x28, 0xbb, 0x42, 0xf5, 0xc5,
+    0xd6, 0x37, 0x9d, 0x15, 0xbf, 0xcb, 0xd0, 0xe7, 0xb0, 0x07, 0x5f, 0xf3,
+    0x60, 0x01, 0xfd, 0xf9, 0x23, 0xaf, 0xfc, 0xef, 0x3e, 0x2d, 0xc7, 0x79,
+    0x1d, 0x7e, 0x64, 0x5d, 0x4d, 0x61, 0xfb, 0x4c, 0x73, 0x50, 0x8e, 0x77,
+    0x85, 0x3d, 0xf8, 0x7d, 0xdc, 0x9c, 0xeb, 0x82, 0xc9, 0xd5, 0x06, 0xfb,
+    0x09, 0xef, 0xff, 0xd2, 0xe4, 0x6c, 0x79, 0xa0, 0x3d, 0x85, 0xbc, 0xc7,
+    0x5f, 0xed, 0xa7, 0xd2, 0x6a, 0x6c, 0x3a, 0xb7, 0x44, 0x67, 0x15, 0xea,
+    0x19, 0x8d, 0x72, 0x94, 0xdb, 0x86, 0x69, 0x0c, 0xf6, 0x33, 0x0e, 0x23,
+    0x76, 0x16, 0xaf, 0x3b, 0x14, 0x31, 0x8a, 0x69, 0x93, 0xf8, 0x55, 0xdf,
+    0xff, 0xf2, 0x75, 0xfb, 0x12, 0x57, 0x01, 0x12, 0xd0, 0x7b, 0x1c, 0x3a,
+    0xff, 0xca, 0x46, 0xe3, 0x1d, 0xef, 0xed, 0x3a, 0xff, 0xf0, 0x79, 0x18,
+    0x39, 0x24, 0xee, 0x6c, 0x3a, 0xfe, 0x17, 0x53, 0xaf, 0x23, 0xaf, 0x32,
+    0xcb, 0x25, 0x5e, 0xfb, 0x00, 0x29, 0x52, 0xfe, 0xff, 0x9e, 0x5f, 0x79,
+    0x9b, 0x1f, 0x87, 0x5f, 0xff, 0xbb, 0x92, 0xfa, 0x23, 0x93, 0xcd, 0x28,
+    0xe4, 0xe7, 0x50, 0xa2, 0x4f, 0xc7, 0x77, 0xfd, 0xe7, 0x1c, 0xd7, 0x23,
+    0x47, 0x5f, 0x4a, 0x01, 0xb9, 0xd7, 0xf0, 0x20, 0x73, 0x7f, 0x1d, 0x73,
+    0x83, 0xe1, 0xe7, 0x7d, 0x22, 0xa7, 0x45, 0xa8, 0xc2, 0x12, 0xf6, 0xc8,
+    0xe1, 0xd5, 0x25, 0x62, 0x41, 0x65, 0xc4, 0x05, 0xa4, 0x01, 0x2c, 0x61,
+    0x81, 0xe8, 0x6b, 0xec, 0x26, 0xb9, 0x27, 0x3a, 0xff, 0x0b, 0x42, 0x9b,
+    0x20, 0x27, 0x50, 0x4f, 0x27, 0xf1, 0x6b, 0x00, 0xeb, 0xfe, 0xc8, 0x63,
+    0xf9, 0xd7, 0xce, 0x1d, 0x7f, 0x81, 0xb6, 0x8b, 0x08, 0x70, 0xeb, 0xfe,
+    0xf7, 0x73, 0x5f, 0x3c, 0x93, 0x9d, 0x50, 0x7e, 0x08, 0x6b, 0x7f, 0xc2,
+    0x9f, 0xb0, 0x75, 0xb7, 0x1e, 0x3a, 0xa4, 0x98, 0xd4, 0xc2, 0x1d, 0x85,
+    0x58, 0x90, 0x5e, 0x65, 0x96, 0x4b, 0x10, 0x82, 0xf9, 0xae, 0xed, 0x2c,
+    0x42, 0x05, 0x4d, 0x6d, 0xf3, 0xf3, 0x19, 0x3a, 0xb8, 0x7c, 0x1b, 0x0f,
+    0xef, 0x32, 0xcb, 0x25, 0x88, 0x3d, 0x45, 0x88, 0x3c, 0xa9, 0xad, 0xbc,
+    0xcb, 0x2c, 0x9d, 0x7b, 0x50, 0xa1, 0x4a, 0x97, 0xf6, 0x5e, 0x23, 0x15,
+    0xaa, 0x3e, 0x48, 0xbf, 0xfb, 0xb1, 0x24, 0xf6, 0x75, 0xb0, 0xb3, 0xaa,
+    0x0f, 0xdf, 0x61, 0xad, 0xff, 0xec, 0xea, 0x73, 0xaf, 0x9a, 0x47, 0x9c,
+    0xeb, 0xe8, 0xf4, 0x2c, 0xea, 0x59, 0xf3, 0xf9, 0x1e, 0xfe, 0x65, 0xc3,
+    0xfb, 0xfd, 0x3a, 0xf8, 0x52, 0x14, 0x3a, 0xf7, 0xd8, 0x01, 0xd5, 0x39,
+    0xbd, 0x59, 0x05, 0xf9, 0xb1, 0xd8, 0x59, 0x57, 0xe1, 0x71, 0x1c, 0x2a,
+    0xec, 0x69, 0x57, 0x32, 0xc9, 0x55, 0x87, 0xed, 0xa2, 0x6f, 0x11, 0xb2,
+    0x2b, 0x7f, 0x87, 0xec, 0x03, 0xb9, 0xb4, 0x52, 0xa6, 0xf2, 0xff, 0xf4,
+    0xe1, 0xe3, 0xb4, 0x73, 0x67, 0x13, 0x47, 0x54, 0x27, 0xeb, 0x84, 0x48,
+    0xda, 0xf0, 0xd4, 0xfd, 0x1e, 0xff, 0xe8, 0x06, 0xb3, 0x02, 0xe2, 0xea,
+    0x1d, 0x7f, 0x0c, 0x67, 0x1c, 0x07, 0x5f, 0xfa, 0x39, 0xd8, 0x4e, 0xc0,
+    0xa1, 0xd7, 0x4b, 0x5e, 0x3e, 0x46, 0x4a, 0xaf, 0xf4, 0x0e, 0x2d, 0x37,
+    0x91, 0xd7, 0xff, 0xda, 0x1c, 0xdc, 0x0f, 0xa7, 0xe2, 0x6e, 0x03, 0xab,
+    0x74, 0x57, 0xf8, 0xbd, 0x93, 0x1a, 0xea, 0x70, 0xcf, 0x1a, 0xa5, 0xfd,
+    0xaf, 0xa1, 0xfc, 0x64, 0x75, 0xfc, 0x8d, 0x0e, 0x38, 0x0e, 0xbf, 0xff,
+    0x7b, 0x5b, 0xfc, 0x0e, 0x06, 0x1f, 0x98, 0x20, 0x3a, 0xff, 0xf6, 0xb3,
+    0xdf, 0x1b, 0xd4, 0xef, 0x50, 0x06, 0x84, 0x2e, 0xf4, 0x4e, 0xae, 0x91,
+    0x5d, 0xe5, 0x6b, 0xf2, 0xf4, 0xcb, 0xee, 0x75, 0xb4, 0x13, 0xdf, 0xfa,
+    0x6d, 0x7f, 0x64, 0xd2, 0x4e, 0x68, 0xea, 0x86, 0x52, 0x48, 0x61, 0x8d,
+    0x91, 0x9e, 0xa4, 0xa0, 0xce, 0x4a, 0x7f, 0x78, 0xf4, 0xd8, 0x25, 0x22,
+    0x61, 0xa8, 0xce, 0x3c, 0x55, 0x79, 0x96, 0x59, 0x2a, 0xf8, 0x0e, 0x21,
+    0x29, 0x52, 0xfe, 0xfb, 0xa8, 0xf2, 0x3a, 0xfb, 0x9c, 0x45, 0x9d, 0x7b,
+    0x51, 0xe3, 0xaf, 0x0f, 0xb4, 0x86, 0xf2, 0x62, 0x1b, 0xdf, 0x14, 0xdb,
+    0x3a, 0xf7, 0x9c, 0x27, 0x57, 0x0d, 0xee, 0x88, 0xaf, 0xe6, 0xc0, 0x13,
+    0x8a, 0x1d, 0x7f, 0x7d, 0xce, 0x66, 0x4c, 0x75, 0xf9, 0xfb, 0xf0, 0x30,
+    0x75, 0x49, 0x39, 0xf0, 0x98, 0x62, 0xe2, 0x37, 0x89, 0x0e, 0x8b, 0x7c,
+    0x5d, 0x7e, 0x7e, 0x73, 0x37, 0x3a, 0xff, 0xf7, 0xba, 0x8e, 0x0c, 0xe0,
+    0x60, 0x64, 0x75, 0xff, 0xed, 0xfe, 0x6e, 0x08, 0x16, 0xbc, 0xe2, 0xe7,
+    0x54, 0x22, 0xeb, 0x09, 0xc5, 0x1e, 0xfd, 0x1a, 0xfa, 0x32, 0x3a, 0xff,
+    0xff, 0xe7, 0x4f, 0x27, 0x5a, 0x9f, 0x24, 0x9d, 0x71, 0xf4, 0xb3, 0x98,
+    0x75, 0xee, 0xe6, 0xd1, 0xd7, 0xef, 0x6b, 0xee, 0xbe, 0x75, 0x11, 0xae,
+    0xdf, 0x7f, 0xff, 0xff, 0xd1, 0xa8, 0xf4, 0xf8, 0xcf, 0x33, 0xaf, 0xf7,
+    0x58, 0xa3, 0x88, 0x20, 0x62, 0x6e, 0xc1, 0xd7, 0xed, 0x75, 0xdb, 0x07,
+    0x50, 0xa2, 0xe9, 0x98, 0x4a, 0x5f, 0xff, 0xfc, 0x8a, 0x6f, 0x2f, 0x60,
+    0xfb, 0x5f, 0x35, 0xac, 0xe6, 0x0b, 0xc8, 0xeb, 0xff, 0x95, 0x08, 0xc7,
+    0xed, 0xc5, 0x13, 0x87, 0x5d, 0x8c, 0x9d, 0x6c, 0x83, 0xdb, 0xd2, 0x2d,
+    0xfe, 0x0f, 0x62, 0x67, 0x7d, 0xce, 0xbd, 0xd0, 0x6c, 0x3a, 0xb8, 0x7a,
+    0x3b, 0x46, 0x75, 0x24, 0x4e, 0x3b, 0xbd, 0xff, 0xd9, 0xc0, 0x2d, 0x35,
+    0xf7, 0x51, 0x87, 0x5f, 0x83, 0xc8, 0xdd, 0x8c, 0xeb, 0xff, 0xff, 0x7a,
+    0x38, 0x06, 0xf5, 0x24, 0x9c, 0x70, 0x78, 0x61, 0x7a, 0x3a, 0xe6, 0x3d,
+    0x1d, 0x4a, 0x22, 0x0d, 0xda, 0xaa, 0x49, 0x8a, 0xe2, 0x23, 0xc2, 0xba,
+    0xf0, 0x71, 0x67, 0x5f, 0x03, 0xd8, 0x03, 0xa9, 0x0d, 0xe7, 0x06, 0xef,
+    0xf9, 0xbd, 0x18, 0xdd, 0x23, 0xa7, 0x54, 0x2f, 0x46, 0x4a, 0x31, 0xc0,
+    0x96, 0xe4, 0x2d, 0x52, 0x1f, 0xdc, 0x28, 0x78, 0xda, 0x86, 0x33, 0x7f,
+    0xdc, 0x3e, 0x90, 0x5f, 0xf9, 0xd0, 0x3f, 0xfb, 0x53, 0xe3, 0x27, 0x5f,
+    0xb5, 0x8a, 0x46, 0x8e, 0xbf, 0x98, 0xf4, 0x83, 0xbc, 0x8e, 0xbf, 0xf3,
+    0xf3, 0x6d, 0x3b, 0x8f, 0xb8, 0x0e, 0xbf, 0xff, 0x27, 0xa1, 0x79, 0xbf,
+    0xa1, 0x7f, 0x78, 0xe0, 0x3a, 0xf9, 0x05, 0xc2, 0x75, 0xff, 0x6a, 0x39,
+    0xe8, 0x54, 0x28, 0x75, 0x49, 0x15, 0xa1, 0x56, 0xd0, 0xfd, 0xff, 0xed,
+    0x27, 0x22, 0x5d, 0x89, 0x87, 0xf5, 0x0e, 0xb9, 0xbb, 0x67, 0x5f, 0xca,
+    0x7a, 0x3b, 0x1a, 0x3a, 0xfe, 0xea, 0x6f, 0xa7, 0xdc, 0xea, 0x91, 0xfa,
+    0x20, 0xc8, 0x0b, 0x6f, 0xfc, 0x2f, 0x37, 0x5f, 0x9c, 0x40, 0x9d, 0x7a,
+    0x18, 0xa3, 0x9d, 0x78, 0x28, 0x27, 0x5f, 0xd1, 0xe6, 0x03, 0xc6, 0xe7,
+    0x57, 0xc3, 0xca, 0x41, 0xab, 0xe8, 0x06, 0x09, 0xd5, 0x25, 0x69, 0x58,
+    0x4e, 0xd3, 0x04, 0x87, 0x6c, 0xc6, 0x1c, 0x85, 0xfa, 0xcb, 0xb4, 0x7a,
+    0xcb, 0x56, 0xd9, 0x1d, 0xf9, 0x16, 0xc3, 0x31, 0x46, 0x2c, 0xeb, 0xef,
+    0xb0, 0xce, 0x8e, 0xb8, 0x1e, 0x3a, 0xe0, 0x74, 0xeb, 0xee, 0x73, 0x34,
+    0x75, 0xd9, 0x31, 0xd6, 0x97, 0xc4, 0x43, 0xce, 0x48, 0xb1, 0x67, 0x16,
+    0xfa, 0x43, 0x7e, 0x4f, 0x38, 0xe1, 0xd7, 0xee, 0x07, 0x30, 0x4e, 0xbf,
+    0xf9, 0x8d, 0x33, 0xb1, 0xb3, 0x5d, 0x8d, 0xce, 0xbf, 0xb7, 0xe7, 0xfb,
+    0xfa, 0x47, 0x53, 0xa2, 0x7b, 0x44, 0xbf, 0xa4, 0x5f, 0xf6, 0x0f, 0x33,
+    0x58, 0x9d, 0x3a, 0xff, 0xfa, 0x5e, 0x1c, 0x7f, 0x0e, 0x7b, 0xd8, 0xc9,
+    0xd7, 0x66, 0xc3, 0xaf, 0xf9, 0xbd, 0xc0, 0xad, 0x39, 0x87, 0x54, 0xe7,
+    0x9d, 0x82, 0xf7, 0xff, 0xbd, 0xac, 0x9b, 0xb1, 0xb3, 0x3b, 0xd8, 0x3a,
+    0xfe, 0xe8, 0x53, 0x64, 0x04, 0xea, 0xc3, 0xf9, 0x74, 0xbb, 0xec, 0xf2,
+    0x68, 0xeb, 0xf9, 0x89, 0x98, 0x58, 0xb9, 0xff, 0x3a, 0xb4, 0x7b, 0x5e,
+    0x20, 0xa9, 0x2a, 0xf9, 0x0c, 0x30, 0x9a, 0x61, 0xb9, 0xaf, 0x21, 0x36,
+    0x30, 0x9b, 0xf3, 0xd5, 0xe6, 0x73, 0xa7, 0x5f, 0xed, 0x22, 0x9d, 0x71,
+    0x43, 0xaf, 0x93, 0x58, 0x17, 0x3c, 0xdf, 0x0e, 0x5f, 0xf9, 0xd8, 0xc1,
+    0xfe, 0x90, 0x77, 0x91, 0xd7, 0xff, 0xf7, 0xb3, 0xa9, 0x1e, 0x40, 0x44,
+    0x95, 0x65, 0x96, 0x4a, 0xbf, 0xdd, 0xfd, 0xd6, 0x17, 0x59, 0xd4, 0x28,
+    0x90, 0xf2, 0xed, 0xf0, 0x73, 0x14, 0x2a, 0xf9, 0xc0, 0xfe, 0x3a, 0xff,
+    0xb8, 0xed, 0xf9, 0xd8, 0xfa, 0x27, 0x5e, 0xfe, 0x38, 0x75, 0xde, 0xd0,
+    0x4f, 0x5e, 0x63, 0xbb, 0xd2, 0x1f, 0xcd, 0x10, 0xcd, 0xee, 0xc4, 0xe7,
+    0x5e, 0x65, 0x96, 0x4a, 0xbd, 0x82, 0xd2, 0x95, 0x2f, 0xef, 0xfd, 0x93,
+    0xe0, 0x5e, 0x43, 0x13, 0x9d, 0x40, 0x3e, 0x71, 0x2a, 0xbe, 0x71, 0x62,
+    0xac, 0x23, 0xae, 0x62, 0xac, 0x54, 0xeb, 0xf6, 0x7b, 0xdf, 0xce, 0x75,
+    0xa4, 0xc5, 0x4f, 0x2c, 0x48, 0xaf, 0x3b, 0x1c, 0x1d, 0x7e, 0xc0, 0xf5,
+    0xd8, 0xce, 0xbf, 0x0e, 0x06, 0x16, 0x75, 0x42, 0xae, 0x29, 0xc8, 0x82,
+    0x43, 0x8e, 0xfb, 0x97, 0xcc, 0x53, 0xc8, 0x51, 0x74, 0x85, 0xdd, 0x7f,
+    0x2d, 0xd8, 0x3a, 0xc9, 0x4d, 0xfe, 0x85, 0xe2, 0x72, 0x69, 0x1d, 0x7b,
+    0xc9, 0x07, 0x5d, 0x82, 0x75, 0x21, 0xae, 0xfc, 0x6a, 0xff, 0xfd, 0xd7,
+    0xe6, 0xb1, 0x05, 0xfd, 0xa6, 0x60, 0x4e, 0xbf, 0x05, 0x39, 0x1e, 0x3a,
+    0xfd, 0x12, 0xee, 0x6e, 0x75, 0xdb, 0x80, 0xeb, 0xf9, 0x71, 0xa0, 0x23,
+    0x4e, 0xbd, 0xa8, 0x50, 0x07, 0x87, 0xa1, 0x7b, 0xfd, 0xfe, 0x70, 0x00,
+    0x41, 0x3a, 0xff, 0xd8, 0xb4, 0x0f, 0x30, 0x2e, 0xb3, 0xaf, 0xb1, 0x7f,
+    0x42, 0x75, 0x74, 0xf7, 0xc4, 0xf2, 0xff, 0xf2, 0x07, 0xbf, 0x75, 0x9c,
+    0x6b, 0xbb, 0x4d, 0x10, 0x65, 0xf7, 0xfd, 0xc6, 0x9d, 0x52, 0x3f, 0x9d,
+    0xb5, 0x7b, 0xfd, 0xdf, 0xd4, 0x1c, 0x9f, 0xf3, 0xaf, 0x77, 0xf6, 0x33,
+    0xaf, 0xff, 0x71, 0xf6, 0x60, 0xb7, 0xa8, 0x0f, 0xbe, 0x3a, 0xa1, 0x18,
+    0xf2, 0x25, 0x60, 0x9b, 0x7e, 0x41, 0x5b, 0xaa, 0x67, 0xe9, 0xa6, 0xa1,
+    0x23, 0xe8, 0xd8, 0x6f, 0x3e, 0xcc, 0x3a, 0xff, 0x01, 0x3b, 0xdc, 0x03,
+    0x9d, 0x7f, 0xff, 0xcb, 0xcf, 0x79, 0xf8, 0x31, 0xbc, 0xbe, 0xf0, 0x0b,
+    0x4d, 0x1d, 0x7f, 0xcb, 0x46, 0x70, 0x43, 0xd8, 0x3a, 0xee, 0xfe, 0x75,
+    0xff, 0xfa, 0x48, 0x21, 0xee, 0x6f, 0xf5, 0xc7, 0xc2, 0x13, 0xaf, 0x23,
+    0x2c, 0x67, 0x5f, 0xec, 0xd9, 0xaf, 0x7a, 0x16, 0x75, 0x70, 0xf4, 0xfa,
+    0x3f, 0x50, 0x9c, 0x06, 0x34, 0x21, 0xbc, 0xc2, 0xfa, 0x85, 0x45, 0xfe,
+    0xdb, 0xcd, 0x6d, 0xe7, 0x20, 0xea, 0x92, 0xf0, 0x38, 0x48, 0x71, 0x49,
+    0xa4, 0xc9, 0x2b, 0x45, 0x69, 0x60, 0x1c, 0xd4, 0x76, 0x3e, 0x4e, 0xbf,
+    0xda, 0xd6, 0x08, 0x36, 0xf0, 0xeb, 0xe1, 0x4d, 0xa8, 0x3a, 0xd3, 0x1d,
+    0x7f, 0x6b, 0x04, 0x1b, 0x78, 0x75, 0xb6, 0x7c, 0x44, 0xae, 0x1a, 0x00,
+    0x8b, 0x42, 0x37, 0xfd, 0xff, 0x81, 0xfa, 0xe3, 0x3c, 0x75, 0xff, 0xe1,
+    0x9f, 0xe4, 0xc8, 0x38, 0x1c, 0x15, 0x0e, 0xbf, 0x93, 0x7d, 0xae, 0xc7,
+    0x8e, 0xbd, 0xf7, 0x20, 0xea, 0x84, 0x4b, 0xb1, 0xa5, 0xb9, 0x85, 0xff,
+    0xfe, 0xc1, 0x7f, 0x6b, 0x38, 0x00, 0x46, 0x6f, 0xed, 0x21, 0xd7, 0x66,
+    0xd9, 0xd6, 0x70, 0x9f, 0xb7, 0x97, 0xaf, 0x47, 0x26, 0x3a, 0xbe, 0x36,
+    0xe2, 0xb1, 0x2e, 0x2a, 0x78, 0x4d, 0x06, 0x17, 0xd9, 0x2d, 0x35, 0xb0,
+    0xc2, 0xdc, 0xdd, 0x25, 0xda, 0x76, 0x16, 0x0f, 0x3c, 0xce, 0x08, 0xc8,
+    0x45, 0x1b, 0xf8, 0x68, 0xb3, 0x0a, 0x7d, 0xb2, 0x7b, 0xdb, 0xcf, 0xb0,
+    0xeb, 0xfb, 0xe3, 0x7b, 0x1b, 0xed, 0x1d, 0x7b, 0xe0, 0x19, 0x3a, 0xb7,
+    0x3d, 0x2f, 0x19, 0xdf, 0xd8, 0xce, 0x60, 0xa8, 0x75, 0xf2, 0xdf, 0x34,
+    0x75, 0x21, 0xe6, 0x39, 0x65, 0xff, 0xf3, 0x63, 0x5a, 0x85, 0xe7, 0x93,
+    0x5d, 0x73, 0xaf, 0xf0, 0x8c, 0x49, 0x70, 0x87, 0x5f, 0xef, 0x26, 0xc4,
+    0xf4, 0xa0, 0xab, 0x2c, 0xeb, 0xfb, 0x05, 0x4e, 0x42, 0xa8, 0x78, 0x7f,
+    0x4c, 0xeb, 0x13, 0x05, 0x44, 0xdd, 0x39, 0x5f, 0x73, 0xfd, 0xe4, 0x75,
+    0xfe, 0x19, 0x0e, 0x2e, 0x1a, 0x75, 0xe5, 0x87, 0x0e, 0xa8, 0x3e, 0xfc,
+    0x24, 0x73, 0x0b, 0xdb, 0x7f, 0xf8, 0xeb, 0xe7, 0xe3, 0xfd, 0x3a, 0xff,
+    0xf7, 0xa1, 0x68, 0x1c, 0x15, 0x3b, 0x0b, 0x3a, 0x9a, 0x88, 0xad, 0x10,
+    0x78, 0x8a, 0xff, 0xf9, 0x3d, 0xd8, 0xd4, 0x76, 0x12, 0x78, 0x50, 0xeb,
+    0xfd, 0xd8, 0x9a, 0x49, 0xc9, 0x1d, 0x7f, 0xbc, 0x8c, 0xcc, 0x2e, 0xc9,
+    0xd7, 0xef, 0x7b, 0x4e, 0x03, 0xaf, 0xd0, 0xbf, 0x63, 0x4e, 0xb9, 0x27,
+    0x3a, 0xa1, 0x31, 0x80, 0xa7, 0x6e, 0x66, 0x86, 0x9d, 0x27, 0xf1, 0x35,
+    0xf9, 0x94, 0x0e, 0xd2, 0x1d, 0x7f, 0xdd, 0x89, 0x20, 0xe2, 0xe0, 0xeb,
+    0xfe, 0xcf, 0x77, 0x16, 0x2f, 0xe3, 0xaf, 0xed, 0x89, 0xcd, 0xe1, 0x8c,
+    0xeb, 0x08, 0x4f, 0xa3, 0x0d, 0xaf, 0xcb, 0x86, 0xce, 0x13, 0xaf, 0xa5,
+    0x0b, 0x73, 0xaf, 0xdc, 0x02, 0xd3, 0x47, 0x5d, 0xed, 0x61, 0xf7, 0xb9,
+    0x47, 0xd2, 0x0a, 0x84, 0x68, 0x7f, 0x09, 0x5b, 0x68, 0xeb, 0xfa, 0x27,
+    0xc1, 0x45, 0x0e, 0xae, 0x1b, 0xcd, 0x08, 0x5f, 0xfd, 0x02, 0xfd, 0x80,
+    0x2b, 0xcd, 0x68, 0xaa, 0x9d, 0x51, 0xa8, 0x63, 0x6d, 0xc6, 0x45, 0x90,
+    0xdf, 0xe7, 0x0e, 0xb5, 0x1c, 0x91, 0xd7, 0x7f, 0x39, 0xd7, 0xfb, 0x79,
+    0x6f, 0xa4, 0xf4, 0x1d, 0x79, 0x37, 0xd1, 0xd5, 0x87, 0xa0, 0x86, 0x94,
+    0x88, 0x88, 0xeb, 0x45, 0xd8, 0xd3, 0xaf, 0x73, 0x34, 0x77, 0x8b, 0x5b,
+    0xff, 0xe0, 0xfc, 0x74, 0xcd, 0x44, 0xf8, 0x28, 0xa1, 0xd7, 0xfb, 0x8b,
+    0x8d, 0xfc, 0xed, 0x3a, 0xb1, 0x10, 0x48, 0x9f, 0x7c, 0x8b, 0x89, 0x8e,
+    0xbe, 0xc9, 0xff, 0x91, 0xd5, 0x31, 0xe2, 0x32, 0x43, 0x7d, 0xf8, 0x43,
+    0x07, 0x54, 0x1e, 0x33, 0x92, 0x5d, 0x8c, 0x9d, 0x45, 0x5f, 0xda, 0xfb,
+    0x1c, 0x85, 0x95, 0x45, 0x51, 0x54, 0x55, 0x15, 0x52, 0x3e, 0x04, 0x0a,
+    0x01, 0x77, 0xe1, 0x5b, 0x61, 0x5b, 0x41, 0x57, 0x77, 0x0a, 0xbf, 0x9d,
+    0xfd, 0x34, 0x2c, 0xaf, 0x85, 0xad, 0x98, 0x25, 0x51, 0x54, 0x55, 0x48,
+    0xb4, 0x40, 0xaa, 0x2a, 0x8a, 0xa2, 0xa8, 0xaa, 0x2a, 0x8a, 0xa9, 0xcd,
+    0xe0, 0x42, 0x90, 0x28, 0x01, 0x5a, 0x0a, 0xd8, 0x15, 0x45, 0x51, 0x55,
+    0x22, 0xd3, 0x41, 0x54, 0x55, 0x15, 0x45, 0x51, 0x55, 0x23, 0x50, 0x00,
+    0xaf, 0x05, 0x6d, 0x05, 0x51, 0x54, 0x55, 0x15, 0x45, 0x54, 0xe6, 0xa1,
+    0x40, 0xae, 0x05, 0x74, 0x2a, 0xca, 0x15, 0x45, 0x51, 0x54, 0x55, 0x15,
+    0x41, 0x35, 0x1b, 0x85, 0x00, 0x2b, 0xf0, 0xaa, 0x2a, 0x8a, 0xa2, 0xaf,
+    0xdd, 0x80, 0x6b, 0x0a, 0xa2, 0xaa, 0x47, 0x9c, 0xd0, 0xae, 0x85, 0x38,
+    0x50, 0x09, 0xac, 0xd2, 0xa8, 0xaa, 0x2a, 0x8a, 0xa2, 0xaa, 0x46, 0xa3,
+    0x70, 0xa4, 0x0a, 0xd8, 0x15, 0x45, 0x51, 0x54, 0x55, 0x15, 0x52, 0x35,
+    0x01, 0x0a, 0xe8, 0x50, 0x85, 0x5b, 0xa5, 0x51, 0x54, 0x55, 0xa4, 0x55,
+    0x15, 0xb9, 0x61, 0x45, 0x51, 0x54, 0x55, 0x15, 0x53, 0x9f, 0x34, 0x82,
+    0x94, 0x1a, 0x68, 0xd4, 0xc1, 0x40, 0x0a, 0xf0, 0x55, 0xb0, 0xaa, 0x2a,
+    0x8a, 0xb4, 0x8a, 0xa2, 0xb7, 0x2c, 0x28, 0xaa, 0x2a, 0xa0, 0xf4, 0xa4,
+    0x14, 0x83, 0x5c, 0x1a, 0x58, 0x55, 0x15, 0x45, 0x51, 0x54, 0x55, 0x15,
+    0x50, 0x6c, 0xb7, 0x0a, 0xe0, 0x52, 0xc2, 0x84, 0x2a, 0x8a, 0xa2, 0xa8,
+    0xaa, 0xe1, 0x7d, 0xa0, 0xaf, 0x05, 0x51, 0x54, 0x55, 0x15, 0x4b, 0x2f,
+    0x84, 0x2b, 0xc1, 0x56, 0x59, 0x54, 0x55, 0x15, 0x40, 0x2d, 0x3f, 0x0a,
+    0xa2, 0xa8, 0xaa, 0x2a, 0x8a, 0xa8, 0x35, 0x13, 0x05, 0x74, 0x2b, 0xf0,
+    0xaa, 0x85, 0xfa, 0x59, 0xdc, 0x64, 0x7a, 0x12, 0x8c, 0x5b, 0x6b, 0x5e,
+    0xe9, 0x08, 0xcc, 0xc6, 0x7b, 0x31, 0xcf, 0x21, 0x16, 0xb4, 0x8e, 0x9c,
+    0x3b, 0x28, 0x0e, 0x85, 0xdb, 0x4c, 0xde, 0x61, 0xfd, 0xe7, 0x63, 0x2b,
+    0x29, 0x7b, 0x65, 0x9f, 0x49, 0x36, 0x92, 0x6f, 0xd2, 0x18, 0xcd, 0x14,
+    0xaa, 0x6a, 0xd7, 0x92, 0x16, 0x55, 0xf2, 0x35, 0xf8, 0x75, 0xe4, 0x0e,
+    0x1d, 0x65, 0x77, 0x44, 0x6f, 0x0e, 0x7a, 0x35, 0xe2, 0x0b, 0x46, 0xc6,
+    0x52, 0x1f, 0xda, 0x4f, 0xf5, 0xfe, 0xea, 0x32, 0x1e, 0x44, 0xe7, 0x5e,
+    0x4d, 0x8c, 0x13, 0xab, 0x74, 0x47, 0x4c, 0x73, 0xe3, 0x4b, 0xf6, 0x64,
+    0xcf, 0xf4, 0xeb, 0x81, 0x07, 0x5f, 0xdc, 0x71, 0xfb, 0x00, 0x3a, 0xe7,
+    0xe1, 0xd6, 0x43, 0x9a, 0x5a, 0xd9, 0xa7, 0x59, 0x67, 0x5d, 0xb6, 0xaa,
+    0x22, 0x57, 0x82, 0xbd, 0x42, 0x71, 0xef, 0xa2, 0x17, 0xfd, 0xd8, 0x5e,
+    0x4d, 0x03, 0x39, 0xd7, 0xff, 0x7c, 0x76, 0x87, 0xb0, 0x0c, 0x10, 0x1d,
+    0x70, 0x20, 0xea, 0xc3, 0xd9, 0x02, 0x25, 0x62, 0x61, 0x80, 0x5a, 0xfe,
+    0x12, 0x37, 0xff, 0x08, 0xc4, 0xe3, 0x89, 0xb2, 0x36, 0xce, 0xbd, 0x1b,
+    0xe8, 0xea, 0x73, 0xe1, 0xd2, 0x2d, 0xe7, 0xe4, 0x1d, 0x7e, 0x4d, 0xb7,
+    0x10, 0x1d, 0x52, 0x3c, 0x25, 0x8d, 0x5f, 0xf7, 0xd7, 0x0e, 0xb1, 0x70,
+    0xc6, 0x75, 0xec, 0xdd, 0x93, 0xaf, 0x6e, 0x0c, 0xe1, 0xec, 0x89, 0xe5,
+    0xf6, 0xcc, 0xe4, 0x8e, 0xbc, 0x17, 0x13, 0xa9, 0x0d, 0xeb, 0x91, 0xdf,
+    0xff, 0x47, 0xc7, 0xe7, 0x1c, 0x10, 0xab, 0x2c, 0xb2, 0x75, 0x42, 0x6b,
+    0xce, 0xf7, 0xa7, 0x0f, 0xc7, 0xe9, 0x80, 0xdc, 0xb3, 0x43, 0x94, 0xed,
+    0xf2, 0x8c, 0x94, 0x30, 0x9e, 0xc8, 0x5b, 0x36, 0x34, 0x8d, 0xd5, 0xd2,
+    0x52, 0xfb, 0x1a, 0x2c, 0xd0, 0xba, 0xe1, 0xba, 0xe1, 0x59, 0xd8, 0x55,
+    0xbd, 0x2b, 0xc4, 0x06, 0x43, 0x1e, 0x4e, 0xa1, 0x2f, 0xe8, 0xf0, 0x6f,
+    0x2f, 0x4d, 0x3a, 0xf0, 0xb6, 0x0e, 0xaf, 0x86, 0xd9, 0x07, 0x2f, 0xe6,
+    0x5f, 0x9c, 0x7d, 0xce, 0xbf, 0xff, 0x6b, 0x9c, 0x49, 0xb5, 0xc8, 0xf2,
+    0x35, 0x02, 0x75, 0x2d, 0x14, 0xa2, 0x44, 0xc9, 0x75, 0xf2, 0xfd, 0x1a,
+    0x3a, 0xff, 0x7a, 0x3f, 0x6f, 0x53, 0x87, 0x5f, 0xd8, 0xde, 0xc6, 0xf2,
+    0x3a, 0xfe, 0x5e, 0x91, 0x4f, 0x32, 0x75, 0xfa, 0x37, 0xec, 0x48, 0xea,
+    0x14, 0x5b, 0x78, 0xcf, 0xe9, 0x6e, 0xd1, 0x7d, 0xff, 0x66, 0xe3, 0x9e,
+    0xf6, 0x4e, 0x75, 0xdb, 0xf8, 0xeb, 0xf7, 0x9c, 0x7f, 0xc3, 0xaf, 0xf6,
+    0xb1, 0x69, 0xee, 0xb9, 0xd6, 0x8c, 0x3e, 0xe1, 0x17, 0xf1, 0x35, 0xf4,
+    0xbe, 0x2d, 0x0e, 0xbd, 0xb5, 0xc8, 0x3a, 0xff, 0x71, 0x26, 0x1c, 0xd8,
+    0xe7, 0x5d, 0xbe, 0xbe, 0x1f, 0xa4, 0x11, 0xf0, 0x7a, 0xff, 0x86, 0x1e,
+    0x7e, 0xc7, 0x00, 0x75, 0xfe, 0x4e, 0x0f, 0xbd, 0x93, 0x9d, 0x73, 0xec,
+    0x3a, 0xfe, 0x90, 0xa4, 0xbb, 0x87, 0x5f, 0xa7, 0x4e, 0x44, 0x8e, 0xa5,
+    0x11, 0x37, 0x31, 0x97, 0x05, 0xc4, 0xae, 0xfb, 0x02, 0x8a, 0x1d, 0x7f,
+    0xf9, 0xd3, 0xd1, 0xed, 0x75, 0xd3, 0xbf, 0x9d, 0x7c, 0x23, 0xfc, 0x8e,
+    0xbf, 0xf7, 0x63, 0x80, 0x1c, 0x65, 0xc0, 0x75, 0xec, 0xc9, 0x8e, 0xb6,
+    0x74, 0xf6, 0x00, 0x7b, 0x7f, 0x7f, 0xcf, 0xd6, 0xe2, 0x75, 0xf2, 0xe3,
+    0x27, 0x3a, 0xfd, 0x9b, 0x06, 0x37, 0x3a, 0x90, 0xf2, 0x74, 0x43, 0x7d,
+    0x03, 0xe6, 0x9d, 0x41, 0x55, 0xa3, 0x90, 0xd2, 0xe1, 0xf7, 0x48, 0x5d,
+    0x20, 0x5e, 0x74, 0x4f, 0xe7, 0x7d, 0xb2, 0x1b, 0xfc, 0x0f, 0xb8, 0x21,
+    0xec, 0x1d, 0x50, 0x8b, 0x87, 0x84, 0x2d, 0xfd, 0xac, 0x5a, 0x76, 0x0e,
+    0xbd, 0xbc, 0xb4, 0x75, 0x6e, 0x79, 0x1c, 0x2b, 0xbd, 0xa0, 0x32, 0x75,
+    0x41, 0xe0, 0x61, 0x1d, 0xf7, 0xef, 0xc9, 0x1d, 0x7d, 0x1f, 0xb0, 0x74,
+    0x55, 0xfa, 0x4a, 0xb2, 0xcb, 0x27, 0x50, 0x9e, 0x97, 0xe4, 0xd7, 0xcf,
+    0xe5, 0xf8, 0xea, 0x0a, 0x2d, 0xf1, 0xd0, 0x04, 0x57, 0xfb, 0xe8, 0x8b,
+    0xb2, 0xfd, 0x3a, 0xa1, 0x90, 0x83, 0x86, 0x09, 0x0d, 0x7e, 0x20, 0xae,
+    0x14, 0xcf, 0x0a, 0x60, 0x4b, 0xc6, 0x18, 0x57, 0x7f, 0x0d, 0x76, 0x4b,
+    0xef, 0x31, 0x0c, 0x51, 0x80, 0x75, 0xe9, 0x0b, 0x9d, 0x6d, 0xd8, 0x83,
+    0xc5, 0x82, 0xbb, 0xde, 0x70, 0x1d, 0x7f, 0x47, 0x27, 0x8e, 0x4e, 0x75,
+    0xff, 0xa0, 0x7d, 0xdf, 0xde, 0x52, 0x83, 0xaf, 0xdf, 0x83, 0x05, 0xa7,
+    0x5e, 0xe4, 0x4c, 0x75, 0xf2, 0x0b, 0xcc, 0x75, 0xf2, 0x6b, 0x98, 0x75,
+    0xfe, 0xf6, 0x7d, 0x89, 0x93, 0x47, 0x54, 0xe9, 0x9e, 0xc8, 0x6c, 0x25,
+    0xdc, 0x3d, 0x59, 0x3f, 0x47, 0x3c, 0x41, 0xb0, 0x82, 0xff, 0xa1, 0x3b,
+    0x0b, 0x9f, 0x19, 0x3a, 0xfe, 0x8e, 0xa4, 0xee, 0x27, 0x5f, 0xf4, 0xe3,
+    0x92, 0xee, 0x03, 0x47, 0x5f, 0xfb, 0x07, 0x79, 0x6b, 0x9f, 0xc0, 0x0e,
+    0xbf, 0x67, 0xb5, 0x8a, 0x1d, 0x48, 0x7c, 0xcb, 0x3f, 0xbf, 0x87, 0xdf,
+    0x3b, 0x9b, 0x47, 0x5e, 0x0c, 0x6c, 0x3a, 0xff, 0xfb, 0x04, 0x61, 0x90,
+    0x8c, 0x6f, 0x24, 0x13, 0xaf, 0xff, 0x3f, 0xc9, 0xa5, 0x1c, 0x9f, 0xe3,
+    0x39, 0xd3, 0xaa, 0x11, 0xd4, 0x13, 0x1e, 0x8e, 0x8a, 0x65, 0xff, 0x2f,
+    0xb9, 0xec, 0xff, 0x93, 0x9d, 0x7f, 0xfc, 0xa3, 0xfb, 0x48, 0x33, 0x43,
+    0x79, 0x9b, 0x9d, 0x7f, 0xd1, 0xec, 0xe3, 0x5d, 0xda, 0x68, 0xbe, 0x2f,
+    0xd9, 0xc8, 0xde, 0x47, 0x5e, 0xec, 0x2d, 0xa7, 0xd5, 0xe4, 0x3b, 0xff,
+    0xf0, 0xb7, 0xe7, 0x61, 0x38, 0x8b, 0x4d, 0xb8, 0x59, 0xd7, 0x9f, 0x93,
+    0x9a, 0x2f, 0xfa, 0x84, 0x59, 0xe1, 0x9b, 0x55, 0xef, 0xff, 0xf7, 0x5f,
+    0x49, 0x1a, 0xf9, 0xee, 0xe2, 0xf1, 0xaf, 0xc3, 0xae, 0x8d, 0xa3, 0xaf,
+    0xb5, 0xa7, 0x59, 0xd5, 0xd4, 0x4c, 0x81, 0x83, 0xc3, 0x17, 0xdb, 0xcb,
+    0xce, 0x75, 0xff, 0xf0, 0x5b, 0xd4, 0x1c, 0xd8, 0xf2, 0xd2, 0x04, 0xeb,
+    0x4b, 0x0f, 0xc5, 0xc8, 0xaf, 0xfa, 0x17, 0xf0, 0x39, 0x80, 0xd1, 0xd7,
+    0xfc, 0x98, 0x21, 0x51, 0x33, 0x87, 0x52, 0x1f, 0x7e, 0xd1, 0xcd, 0xef,
+    0x66, 0xe7, 0x5f, 0xcf, 0xcd, 0xe5, 0x9e, 0x3a, 0xff, 0xde, 0xd2, 0x73,
+    0xc3, 0xfb, 0xc8, 0xeb, 0xff, 0xcb, 0x8d, 0xbc, 0xfc, 0x73, 0x36, 0x46,
+    0xe7, 0x5f, 0xfa, 0x33, 0x99, 0xc0, 0x2d, 0x34, 0x75, 0xe7, 0xdf, 0x68,
+    0xeb, 0xf9, 0xfd, 0xa8, 0xc9, 0xce, 0xa8, 0x4c, 0xff, 0x0b, 0x50, 0xf8,
+    0x53, 0x76, 0x1e, 0x32, 0x3f, 0x7f, 0xdf, 0xc2, 0xf5, 0x8b, 0x86, 0x33,
+    0xaf, 0xfd, 0xc9, 0xf0, 0x39, 0xde, 0xe3, 0x19, 0xd7, 0xfe, 0xc1, 0xf6,
+    0xbe, 0xec, 0x8c, 0xdc, 0xea, 0xc4, 0x41, 0x69, 0x06, 0xff, 0xfa, 0x51,
+    0xc9, 0xfc, 0x8a, 0x6b, 0x4e, 0x32, 0x3a, 0xfe, 0x9f, 0x58, 0xb8, 0x63,
+    0x3a, 0xcc, 0xcc, 0x88, 0x0f, 0xaa, 0x17, 0x93, 0xa8, 0x75, 0xf4, 0xb8,
+    0x19, 0x1d, 0x7c, 0xbf, 0x24, 0xe7, 0x56, 0x1e, 0x22, 0x11, 0x5f, 0xfd,
+    0xb3, 0xca, 0x40, 0xcb, 0x3a, 0x8b, 0x3a, 0xe9, 0xfc, 0x75, 0xfe, 0xd9,
+    0xd7, 0x94, 0x60, 0x9d, 0x50, 0x79, 0x38, 0x2f, 0x7f, 0xfe, 0x97, 0x63,
+    0x8f, 0xef, 0xfc, 0x9e, 0xd7, 0x50, 0xeb, 0xfb, 0x19, 0xfb, 0xd7, 0xf1,
+    0xd7, 0xff, 0xef, 0x7d, 0x94, 0x6c, 0x41, 0x07, 0x12, 0x17, 0x85, 0x5f,
+    0x77, 0xee, 0xfe, 0x3a, 0xfd, 0x8b, 0xc4, 0xd8, 0x75, 0xe9, 0xe6, 0x63,
+    0x3a, 0xa1, 0x34, 0x79, 0xd5, 0x70, 0xbd, 0xaa, 0xc8, 0x4b, 0xf9, 0x3d,
+    0xde, 0xc3, 0xaf, 0xdc, 0x49, 0xdd, 0x66, 0x98, 0x4e, 0xfb, 0xdf, 0xc3,
+    0x9a, 0x61, 0x3b, 0x81, 0x06, 0xa0, 0x4e, 0xff, 0x0b, 0xa9, 0xe8, 0xe0,
+    0x0d, 0x40, 0x9d, 0xfe, 0xd6, 0x75, 0x35, 0xfc, 0xe6, 0x98, 0x4e, 0xec,
+    0x09, 0xa6, 0x13, 0xb9, 0x96, 0x4f, 0x30, 0x9d, 0x62, 0x69, 0x7b, 0x9a,
+    0x21, 0x72, 0xc8, 0xb4, 0x7f, 0xb1, 0x05, 0x92, 0x2b, 0x78, 0xb3, 0x09,
+    0x95, 0x3e, 0x7b, 0x26, 0xe9, 0xfb, 0xb3, 0x1e, 0x3d, 0x42, 0xe8, 0xfa,
+    0x16, 0xf5, 0x79, 0xc8, 0x06, 0x11, 0xda, 0x8d, 0x9f, 0xd2, 0x93, 0xaf,
+    0x08, 0x16, 0x75, 0xff, 0x47, 0xfe, 0x14, 0xd9, 0xf5, 0x67, 0x5e, 0x1c,
+    0xd6, 0x1e, 0xbf, 0x06, 0xef, 0x04, 0x13, 0x1d, 0x50, 0xce, 0xf6, 0x9e,
+    0x13, 0xc1, 0x8c, 0x2f, 0x0e, 0xd4, 0x3a, 0x6c, 0x6d, 0xa9, 0x0c, 0x79,
+    0xa1, 0x43, 0xc8, 0x4a, 0xac, 0x93, 0xb1, 0xad, 0x8a, 0xbe, 0xa1, 0x7b,
+    0xe9, 0xdc, 0x1d, 0x90, 0xcc, 0xfa, 0x63, 0x7e, 0x0e, 0x71, 0x14, 0x3a,
+    0xfe, 0xec, 0x7d, 0x1d, 0xc0, 0x75, 0xfb, 0xd9, 0x32, 0x2c, 0xeb, 0xf4,
+    0x6e, 0x00, 0x41, 0xd5, 0x07, 0x9c, 0x24, 0xf7, 0xe8, 0xd9, 0x03, 0xe3,
+    0xaf, 0xc9, 0xb3, 0xc9, 0x39, 0xd7, 0xe7, 0x97, 0xb1, 0xa7, 0x5f, 0x87,
+    0x3e, 0xe4, 0xc7, 0x5f, 0xff, 0x0b, 0x51, 0x61, 0xfd, 0xf9, 0x2c, 0xdf,
+    0xc7, 0x5f, 0xfe, 0xc0, 0x6b, 0xa9, 0xf3, 0x79, 0x46, 0x4e, 0x75, 0xff,
+    0x75, 0xd7, 0xd4, 0x8d, 0xe4, 0x75, 0xfd, 0xf4, 0x65, 0xb6, 0xf3, 0x9d,
+    0x50, 0x98, 0x34, 0x94, 0x11, 0x30, 0x07, 0x15, 0x3a, 0xa0, 0x00, 0x90,
+    0x34, 0x9f, 0x85, 0x22, 0x4d, 0xe8, 0xcb, 0xaf, 0xfd, 0x8f, 0xd9, 0x90,
+    0x7b, 0x9b, 0x9d, 0x7f, 0x02, 0x69, 0x47, 0xb4, 0x75, 0xff, 0xff, 0xfb,
+    0x3b, 0x82, 0x0c, 0x1f, 0x77, 0x3b, 0x19, 0x32, 0x72, 0x6e, 0xa6, 0xfe,
+    0x3a, 0xf8, 0x63, 0x19, 0x3a, 0xfa, 0x37, 0xd3, 0x9d, 0x50, 0xda, 0x8b,
+    0x4e, 0xea, 0x13, 0x8c, 0xa7, 0x90, 0xa4, 0x63, 0x0c, 0x64, 0xef, 0x29,
+    0xf4, 0x57, 0xfc, 0x7b, 0xf9, 0x76, 0xc8, 0x40, 0xfd, 0x20, 0xbf, 0xfe,
+    0x41, 0xc5, 0xc7, 0xd1, 0xfe, 0x43, 0x8b, 0x3a, 0xff, 0x82, 0x98, 0x3f,
+    0xcb, 0x34, 0x75, 0xff, 0x75, 0x25, 0xd7, 0x92, 0x2c, 0xeb, 0xff, 0x69,
+    0x07, 0x79, 0x79, 0x34, 0x87, 0x56, 0x1f, 0xa7, 0x8d, 0xef, 0xda, 0x5c,
+    0x06, 0x0e, 0xa9, 0x26, 0x81, 0x89, 0xcb, 0x85, 0x5f, 0x88, 0x6f, 0x86,
+    0x39, 0x23, 0xaf, 0xfb, 0xb1, 0x24, 0x11, 0xff, 0x73, 0xaf, 0xfa, 0x33,
+    0xdf, 0x40, 0x08, 0xdc, 0xeb, 0x72, 0x11, 0x25, 0x84, 0x0b, 0x38, 0xbf,
+    0xff, 0xfd, 0xd7, 0x4f, 0x4b, 0xf1, 0xf6, 0xba, 0xf2, 0xfa, 0x30, 0xde,
+    0x44, 0x8e, 0xbf, 0xf6, 0xbe, 0xf9, 0x07, 0xf9, 0x66, 0x8e, 0xb8, 0x3a,
+    0x3a, 0x98, 0xd1, 0x9d, 0xd7, 0x81, 0x40, 0xbf, 0xff, 0xb3, 0x7c, 0xd3,
+    0x8f, 0x52, 0x3d, 0xdf, 0xdd, 0x67, 0x54, 0x27, 0x1a, 0xf1, 0x81, 0x09,
+    0x95, 0xfc, 0x3f, 0xad, 0x3b, 0x07, 0x5f, 0xff, 0x9c, 0x7c, 0xef, 0xd1,
+    0x8f, 0x69, 0x9c, 0xe9, 0xd7, 0xfe, 0x9d, 0xc7, 0x5e, 0xea, 0x46, 0x8e,
+    0xbf, 0xe8, 0x06, 0x83, 0xfb, 0xf2, 0x47, 0x5e, 0xe6, 0xb4, 0x78, 0x80,
+    0xef, 0x9a, 0xee, 0xd3, 0x44, 0x06, 0xa9, 0xa9, 0xbf, 0xb9, 0x1d, 0x8f,
+    0x99, 0x24, 0x50, 0x71, 0x8a, 0x9d, 0x32, 0x3f, 0xb0, 0xdd, 0xa0, 0x27,
+    0x3f, 0xe8, 0xdd, 0x6f, 0x6c, 0x8e, 0x9d, 0x58, 0xa8, 0x49, 0x23, 0xcb,
+    0xfa, 0x55, 0x7b, 0xae, 0xc6, 0x75, 0xf4, 0x03, 0x6f, 0x0e, 0xa0, 0x1e,
+    0x0f, 0x87, 0xaf, 0x87, 0xc0, 0xfc, 0xeb, 0xf2, 0xd8, 0x86, 0x21, 0x88,
+    0x62, 0x4e, 0xbf, 0xff, 0xa5, 0x9a, 0x4e, 0x71, 0x17, 0xf7, 0xdd, 0xc6,
+    0x7c, 0x75, 0x62, 0x2e, 0xd0, 0x89, 0xcf, 0x2f, 0xff, 0x33, 0x83, 0xec,
+    0x19, 0x66, 0xbe, 0xac, 0xeb, 0xff, 0xd2, 0xcd, 0xe5, 0xf6, 0x00, 0xab,
+    0x2c, 0xb2, 0x55, 0xf9, 0x6c, 0xe2, 0x6c, 0x3a, 0xf4, 0xb0, 0x66, 0x3f,
+    0xaf, 0xaa, 0x35, 0x08, 0xf9, 0x78, 0x62, 0x54, 0x2a, 0x29, 0xec, 0x37,
+    0x46, 0x32, 0x6b, 0xfe, 0x41, 0x96, 0x98, 0xab, 0x12, 0xc4, 0x31, 0x27,
+    0x5f, 0x4d, 0xac, 0x98, 0xeb, 0xf0, 0x23, 0xd8, 0xc6, 0x75, 0xfe, 0x8c,
+    0xe3, 0x5d, 0xda, 0x68, 0x82, 0x6f, 0xfa, 0x3d, 0x9c, 0x6b, 0xbb, 0x4d,
+    0x17, 0xcd, 0xf9, 0xc3, 0xd8, 0x50, 0xeb, 0xc3, 0x9a, 0x0a, 0x29, 0xda,
+    0x7a, 0xb4, 0x3a, 0x14, 0xc4, 0x36, 0x43, 0x42, 0xff, 0xe8, 0xea, 0x29,
+    0x9c, 0x9d, 0x7f, 0xee, 0x75, 0x62, 0x74, 0x89, 0x19, 0x9f, 0x4a, 0xaf,
+    0xf7, 0xfd, 0xdb, 0xea, 0x37, 0xa7, 0x5f, 0xfa, 0x77, 0xdf, 0x6f, 0x3c,
+    0x2f, 0xb0, 0xeb, 0xff, 0xec, 0xf4, 0x0f, 0xb5, 0x98, 0xa2, 0x8f, 0x23,
+    0xaf, 0xfd, 0x81, 0x89, 0x47, 0x70, 0x0e, 0x75, 0xfc, 0xf2, 0xfe, 0x4e,
+    0x13, 0xaf, 0x32, 0xcb, 0x25, 0x5f, 0xbb, 0x8d, 0x7e, 0x14, 0xa9, 0x7f,
+    0x7f, 0xff, 0xa6, 0xe4, 0x6c, 0xf8, 0xa3, 0xfc, 0xfb, 0x36, 0xbe, 0x66,
+    0xfe, 0x3a, 0xbc, 0x8a, 0x5f, 0xa6, 0xd7, 0xff, 0x93, 0x89, 0xef, 0xf3,
+    0xce, 0xbc, 0x13, 0xaa, 0x75, 0x45, 0x2d, 0x43, 0x5a, 0x70, 0x0e, 0xc6,
+    0x1e, 0x3e, 0x25, 0xbf, 0xf2, 0xe3, 0x7d, 0x0e, 0x4f, 0xf6, 0x47, 0x5f,
+    0xff, 0xe4, 0xeb, 0x8e, 0xf2, 0xfb, 0x28, 0x19, 0x3a, 0xf0, 0x27, 0x5f,
+    0xfe, 0xcc, 0xe8, 0x7b, 0x1a, 0xce, 0xa0, 0x0e, 0xbf, 0xca, 0x7c, 0x9a,
+    0x51, 0xcd, 0x1d, 0x53, 0xa6, 0x3f, 0x24, 0x10, 0xb0, 0x22, 0x3d, 0xfc,
+    0xc7, 0x92, 0xec, 0x70, 0xeb, 0xfd, 0xe8, 0x4e, 0xa9, 0x1b, 0x9d, 0x7f,
+    0xfb, 0x71, 0xf8, 0xde, 0xa0, 0x01, 0x1c, 0x91, 0xd5, 0x08, 0xae, 0x42,
+    0xff, 0xa6, 0x77, 0xcc, 0x7a, 0x96, 0xc3, 0xaf, 0xff, 0x44, 0xff, 0x7b,
+    0x1b, 0xfb, 0x27, 0x10, 0x9d, 0x4e, 0x7e, 0x82, 0x4f, 0x7f, 0xa3, 0x07,
+    0xcc, 0x06, 0x5a, 0x75, 0xfe, 0xee, 0x6c, 0xf9, 0xa9, 0x34, 0xeb, 0x7f,
+    0xa3, 0xed, 0xf1, 0xb5, 0xfe, 0x71, 0xf9, 0xf7, 0x9d, 0x73, 0xaf, 0xd9,
+    0xc7, 0xdd, 0x93, 0xaf, 0xff, 0xf4, 0xf8, 0xc8, 0xe0, 0x78, 0x9f, 0xce,
+    0x1e, 0xc0, 0xce, 0x75, 0x4e, 0x88, 0xbd, 0x14, 0x5e, 0x65, 0x96, 0x4a,
+    0xbf, 0xdf, 0x41, 0x03, 0x9b, 0xf8, 0xa5, 0x4b, 0xfb, 0xff, 0xf9, 0x83,
+    0xf1, 0xbd, 0x40, 0x87, 0x19, 0xf9, 0xed, 0x64, 0xe7, 0x57, 0x51, 0x53,
+    0xfa, 0x25, 0x22, 0x62, 0x0f, 0x0e, 0xca, 0x9d, 0x94, 0x81, 0x28, 0xfc,
+    0x42, 0x6a, 0x92, 0x98, 0x39, 0x1b, 0xea, 0xe1, 0xd9, 0xd8, 0x52, 0x0c,
+    0x23, 0x74, 0x53, 0xe8, 0xf4, 0x2f, 0xfd, 0x88, 0x33, 0xb8, 0xfb, 0x16,
+    0x75, 0xff, 0xba, 0x8c, 0x87, 0xb9, 0xed, 0xbc, 0x3a, 0xf6, 0x08, 0x0e,
+    0xbe, 0xcf, 0x4d, 0x23, 0xaf, 0xfe, 0xda, 0x18, 0xda, 0xd3, 0x8f, 0xd0,
+    0x68, 0xea, 0xe9, 0xf6, 0x39, 0x15, 0xff, 0xb3, 0xd1, 0xcd, 0x76, 0x07,
+    0xc7, 0x88, 0x22, 0xfe, 0xce, 0x35, 0xdd, 0xa6, 0x88, 0x21, 0x53, 0xc9,
+    0xbd, 0x01, 0x43, 0xaa, 0x0f, 0x93, 0x49, 0x57, 0xb6, 0x42, 0xce, 0xbf,
+    0x9f, 0xbc, 0xe2, 0x32, 0x75, 0xfc, 0xc6, 0x16, 0x5c, 0x64, 0x75, 0x61,
+    0xfd, 0x08, 0xef, 0xe5, 0xb7, 0xff, 0xe8, 0x0c, 0xd2, 0x41, 0xf4, 0x02,
+    0x61, 0x49, 0x8e, 0xa5, 0x15, 0x39, 0x76, 0x10, 0xc0, 0x86, 0x70, 0xc2,
+    0x6f, 0x61, 0x75, 0xfd, 0xdc, 0xf7, 0x91, 0x67, 0x5f, 0xde, 0xfb, 0x9d,
+    0x7d, 0xce, 0xad, 0xcf, 0x6c, 0x4b, 0x2f, 0xec, 0xdf, 0xdc, 0xe4, 0x1d,
+    0x7f, 0xf6, 0x85, 0xfc, 0xeb, 0xfb, 0x13, 0xe1, 0xd4, 0x13, 0xf1, 0xd1,
+    0x6d, 0x42, 0x2d, 0x7f, 0x84, 0x9d, 0xfd, 0x8d, 0xfb, 0xb3, 0xb8, 0x75,
+    0xd0, 0xa1, 0xd7, 0x20, 0x9d, 0x66, 0x4e, 0xa0, 0x9a, 0x5f, 0xa2, 0x97,
+    0x87, 0xf9, 0xce, 0xbf, 0x75, 0xe5, 0x82, 0x75, 0xfc, 0x9e, 0x1c, 0xea,
+    0x1d, 0x76, 0x77, 0xe1, 0xe7, 0xc1, 0x2d, 0xce, 0xcf, 0xc4, 0x7c, 0x61,
+    0xdf, 0x48, 0xfc, 0xd9, 0x52, 0x4e, 0x6b, 0x0a, 0x06, 0x32, 0x8b, 0xfb,
+    0x48, 0x10, 0xe0, 0x9d, 0x7f, 0xff, 0x7b, 0xb9, 0xad, 0x66, 0x7f, 0xc9,
+    0xf3, 0xf1, 0xf1, 0xd7, 0xfd, 0xd8, 0xe7, 0x86, 0x33, 0x73, 0xaf, 0xff,
+    0xf9, 0x27, 0x89, 0x6b, 0x9c, 0x4d, 0xe6, 0x93, 0xf1, 0x79, 0xb9, 0xd7,
+    0xfa, 0x1e, 0x77, 0xe3, 0xfd, 0x3a, 0xf7, 0x70, 0x42, 0x8d, 0x3e, 0x9b,
+    0xf9, 0xa6, 0xb1, 0x39, 0xa4, 0x2b, 0xf4, 0x65, 0xf7, 0xfe, 0x6f, 0x63,
+    0x39, 0x2d, 0x7e, 0xb3, 0xae, 0x4d, 0x1d, 0x7f, 0xd9, 0x3b, 0xf8, 0x1f,
+    0x46, 0x47, 0x5f, 0xcf, 0xef, 0x91, 0x25, 0x0e, 0xbf, 0xbe, 0xaf, 0x4c,
+    0xbe, 0xe7, 0x54, 0x26, 0x47, 0x86, 0xaa, 0x1f, 0xf0, 0x55, 0xce, 0xbc,
+    0x5f, 0x7b, 0x99, 0xd3, 0xaf, 0x69, 0x16, 0x75, 0xa3, 0x86, 0xdb, 0xc3,
+    0x77, 0xc9, 0x32, 0x32, 0x75, 0xff, 0xcb, 0x7d, 0xfe, 0xf9, 0x39, 0x1f,
+    0xb0, 0x4e, 0xbf, 0xff, 0x7f, 0x38, 0xc6, 0x75, 0x58, 0xf6, 0x77, 0xfe,
+    0x1d, 0x7d, 0xed, 0x7d, 0xd0, 0x51, 0x89, 0x84, 0x5f, 0x52, 0xef, 0xda,
+    0x5e, 0x7b, 0x47, 0x5f, 0xfc, 0x8a, 0x67, 0x93, 0xb9, 0xe8, 0xe1, 0xd7,
+    0xe7, 0x90, 0xa4, 0x1d, 0x7f, 0x43, 0x8f, 0xb0, 0x4e, 0xa9, 0x27, 0xd7,
+    0x90, 0xea, 0x44, 0xbe, 0x13, 0xad, 0x08, 0x49, 0x2f, 0xe6, 0xf5, 0x36,
+    0xd1, 0x43, 0xaf, 0xff, 0x20, 0x23, 0x4b, 0x84, 0xe7, 0x11, 0x93, 0xaf,
+    0x98, 0xfb, 0x93, 0x9d, 0x7f, 0xa0, 0x39, 0xe4, 0xef, 0xe7, 0x59, 0x70,
+    0x7a, 0xe1, 0x25, 0xbf, 0xff, 0xf2, 0xdc, 0x41, 0x24, 0xd7, 0xeb, 0xea,
+    0x47, 0xbb, 0xfb, 0xac, 0xeb, 0xff, 0xe1, 0xff, 0xd2, 0x40, 0x75, 0xd3,
+    0xce, 0xb3, 0xae, 0xf8, 0xc6, 0x75, 0xff, 0xf9, 0xd3, 0xc8, 0x1c, 0x0e,
+    0x79, 0x16, 0x9c, 0x3a, 0xf7, 0x1f, 0x58, 0x8b, 0xae, 0x27, 0x74, 0x6e,
+    0xe4, 0xf3, 0xa6, 0xcd, 0xfc, 0x64, 0xd7, 0x4a, 0x0e, 0xbf, 0xfd, 0x38,
+    0x7b, 0x1d, 0xcd, 0xc1, 0x9e, 0xd1, 0xd4, 0xe7, 0xc1, 0xf8, 0xad, 0x05,
+    0x58, 0x9e, 0x18, 0x24, 0x27, 0xde, 0x38, 0xd1, 0x84, 0xad, 0xfd, 0xc8,
+    0x9d, 0x07, 0xc7, 0x5e, 0x0f, 0xd5, 0x9d, 0x7e, 0x18, 0x0e, 0x4c, 0x75,
+    0xf6, 0xbf, 0xe2, 0x87, 0x5f, 0xa3, 0xbe, 0x89, 0x1d, 0x7c, 0x1f, 0xfd,
+    0xa8, 0x3f, 0x0d, 0xc9, 0x80, 0x49, 0x7e, 0x06, 0x2e, 0x3a, 0x75, 0xfd,
+    0xfc, 0x7c, 0xe0, 0xc8, 0xeb, 0xcc, 0x1e, 0xe1, 0xd4, 0x14, 0xdd, 0xb0,
+    0xb1, 0x21, 0x1c, 0x29, 0x1e, 0x26, 0xfc, 0xbe, 0xf7, 0x3e, 0xe8, 0xeb,
+    0xa1, 0x87, 0x9d, 0x7f, 0xe7, 0x16, 0xe7, 0x1a, 0xee, 0xd3, 0x44, 0x23,
+    0x74, 0xa7, 0x3a, 0xa1, 0x13, 0x00, 0x1e, 0xfc, 0x6f, 0x62, 0x45, 0xfb,
+    0x27, 0xd0, 0x1c, 0xeb, 0xff, 0xff, 0xdd, 0xcf, 0xf8, 0xa7, 0x53, 0x78,
+    0xf7, 0xfd, 0x1c, 0xdf, 0xdf, 0xbe, 0x8e, 0xbf, 0xfb, 0x37, 0xfb, 0xe4,
+    0x1f, 0xe5, 0x9a, 0x3a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x83, 0x38,
+    0xb8, 0x60, 0x67, 0x8e, 0x07, 0x07, 0x3d, 0xa4, 0x6e, 0x0f, 0xd9, 0xf3,
+    0x91, 0xa1, 0x75, 0x35, 0x88, 0x00, 0x7e, 0x01, 0x70, 0xc0, 0xcf, 0x1c,
+    0x3a, 0xa1, 0x34, 0xec, 0x46, 0xbf, 0xfb, 0xce, 0x33, 0xef, 0x21, 0x8c,
+    0xd1, 0xd7, 0xfe, 0xfb, 0x9d, 0x75, 0xaa, 0xcb, 0x2c, 0x9d, 0x7f, 0xfe,
+    0xc6, 0xf6, 0x04, 0x22, 0x93, 0xe0, 0xa2, 0x87, 0x5c, 0xef, 0x3a, 0x25,
+    0xa4, 0x89, 0x7f, 0xff, 0x4c, 0x30, 0x0d, 0x37, 0xa9, 0xc9, 0x86, 0x01,
+    0xa3, 0xaf, 0xfe, 0xf7, 0x53, 0x67, 0x5e, 0x5c, 0x85, 0x0e, 0xbf, 0xbf,
+    0xf2, 0x7e, 0x2a, 0x1d, 0x7f, 0x63, 0x38, 0x3f, 0x80, 0xeb, 0xf4, 0xb3,
+    0xd0, 0x03, 0xae, 0x85, 0xce, 0x7a, 0x7b, 0x96, 0xdf, 0xff, 0xfc, 0x05,
+    0xbc, 0xba, 0xe9, 0xe4, 0x0e, 0x07, 0x3c, 0x8b, 0x4e, 0x1d, 0x5a, 0x44,
+    0xef, 0xe5, 0xf7, 0xff, 0xe1, 0xcd, 0x67, 0x5f, 0x69, 0xbd, 0x45, 0xc3,
+    0x4e, 0xbf, 0x4e, 0xb8, 0x0c, 0x1d, 0x52, 0x5d, 0x53, 0x0c, 0x79, 0x5b,
+    0x91, 0x4d, 0x0d, 0x9e, 0x17, 0x75, 0x6f, 0x48, 0xde, 0x8c, 0x7f, 0x61,
+    0x27, 0xd5, 0x5b, 0xfd, 0x1a, 0xd4, 0x4f, 0x8c, 0x9d, 0x7f, 0xbb, 0x8b,
+    0xce, 0xfe, 0x27, 0x50, 0x4f, 0x97, 0xc6, 0x77, 0xd9, 0xc5, 0x10, 0xea,
+    0x85, 0xec, 0x7c, 0x9d, 0x7a, 0x78, 0xc2, 0xbf, 0x22, 0xbc, 0xcb, 0x2c,
+    0x95, 0x7f, 0xd8, 0x07, 0xe6, 0x6c, 0xc0, 0x94, 0xa9, 0x7f, 0x73, 0x2c,
+    0x95, 0x79, 0x96, 0x59, 0x2a, 0xfe, 0x79, 0xc3, 0xd8, 0xd1, 0x4a, 0x97,
+    0xf4, 0x28, 0xbc, 0x65, 0x23, 0x6c, 0xde, 0xfc, 0xd4, 0x0f, 0xd5, 0x94,
+    0xa9, 0xb3, 0xbc, 0xcb, 0x2c, 0x95, 0x7b, 0x51, 0xc2, 0x95, 0x2f, 0xef,
+    0x9c, 0x77, 0xf1, 0xd6, 0x02, 0x22, 0x97, 0xcb, 0x2c, 0x95, 0xdf, 0xc1,
+    0x18, 0x93, 0xb4, 0xeb, 0xf6, 0xbf, 0x9f, 0x6c, 0x4e, 0xbf, 0x05, 0x36,
+    0x40, 0x4e, 0xbe, 0xc1, 0xc6, 0x33, 0xab, 0x87, 0x94, 0xb2, 0x8a, 0x44,
+    0x4c, 0x7d, 0x76, 0xbf, 0xfb, 0xaf, 0x21, 0x75, 0x26, 0x14, 0x98, 0xeb,
+    0xff, 0xb3, 0x93, 0xc6, 0xfa, 0x41, 0xc0, 0x1d, 0x7f, 0x77, 0x36, 0x67,
+    0xb4, 0x75, 0x35, 0x16, 0xa0, 0x44, 0xf2, 0x1d, 0x71, 0x3c, 0xce, 0xc3,
+    0x0c, 0x61, 0xb3, 0x74, 0xfe, 0x3a, 0xa1, 0x52, 0x9e, 0x4a, 0x02, 0x13,
+    0xab, 0xdb, 0xb1, 0x56, 0x24, 0xeb, 0xff, 0xd8, 0xc6, 0xe2, 0x0c, 0x6c,
+    0x76, 0x16, 0x75, 0xf6, 0xba, 0x93, 0x15, 0x7f, 0xcf, 0xbf, 0xb2, 0x6f,
+    0xf8, 0xa1, 0xd6, 0x6a, 0x1e, 0xf7, 0xe4, 0x57, 0xf8, 0x73, 0x79, 0x69,
+    0x14, 0x3a, 0xf9, 0xdf, 0x8a, 0x1d, 0x5f, 0x0f, 0x52, 0x73, 0x3b, 0xfe,
+    0xcc, 0x68, 0x23, 0x37, 0x91, 0xd7, 0xd0, 0xeb, 0xd8, 0x55, 0xff, 0xdd,
+    0x47, 0x00, 0x20, 0x11, 0xdd, 0x1d, 0x7f, 0x77, 0x16, 0xb7, 0x91, 0xd7,
+    0x99, 0x65, 0x92, 0xaf, 0xf0, 0xfb, 0xa9, 0x03, 0x39, 0x4a, 0x97, 0xf7,
+    0xa0, 0x19, 0x24, 0x46, 0x62, 0x5d, 0x79, 0x30, 0x0f, 0xb0, 0xce, 0xb6,
+    0x35, 0x34, 0xd5, 0xc6, 0x45, 0x7f, 0x02, 0x01, 0x1d, 0xd1, 0xd7, 0xfa,
+    0x3e, 0xf3, 0x89, 0xed, 0x1d, 0x50, 0xae, 0x0e, 0x45, 0x1b, 0xc2, 0x9d,
+    0x1f, 0x26, 0x25, 0xec, 0x70, 0x80, 0x2f, 0x12, 0xcb, 0xf0, 0x31, 0x3a,
+    0xa1, 0xd7, 0xff, 0xd8, 0xd8, 0x17, 0xf6, 0x83, 0xfb, 0xf2, 0x47, 0x56,
+    0xe7, 0xea, 0xb2, 0x7b, 0xff, 0xff, 0x85, 0xd7, 0x1c, 0x68, 0x7b, 0x1a,
+    0xfd, 0xd2, 0x5a, 0xeb, 0xc8, 0xeb, 0xdf, 0xfb, 0x47, 0x5e, 0x6c, 0x68,
+    0xeb, 0xff, 0xbe, 0xcb, 0x3a, 0xfd, 0x4e, 0x72, 0x0e, 0xac, 0x3d, 0xf0,
+    0x0d, 0xdf, 0xa3, 0xda, 0xd9, 0x87, 0x5f, 0xbf, 0xe2, 0x9d, 0x43, 0xaa,
+    0x13, 0x81, 0x72, 0x30, 0x38, 0x0b, 0xe7, 0x88, 0x76, 0xca, 0x2f, 0xf0,
+    0xbb, 0x38, 0x2e, 0xa1, 0xd7, 0xff, 0x67, 0xb5, 0xf7, 0x4b, 0x18, 0xe4,
+    0x1d, 0x7c, 0x9b, 0x30, 0x42, 0x7e, 0xab, 0x31, 0xbf, 0xff, 0xe0, 0xf5,
+    0x19, 0xcd, 0xa4, 0x5b, 0xfb, 0x5f, 0xcb, 0x37, 0xf1, 0xd5, 0x88, 0xa4,
+    0x73, 0x9b, 0xfe, 0x99, 0xbd, 0x45, 0xc7, 0x14, 0x3a, 0xfd, 0x3f, 0xcf,
+    0xe2, 0x63, 0xad, 0x23, 0xaf, 0x7d, 0x19, 0x8e, 0xa9, 0x1a, 0xe0, 0x08,
+    0x56, 0x22, 0xd5, 0xce, 0xb4, 0xb5, 0x50, 0xed, 0xff, 0xe7, 0x94, 0xc3,
+    0x29, 0x48, 0xc1, 0x95, 0x45, 0x94, 0xa7, 0xb5, 0x21, 0x6c, 0xd3, 0xb4,
+    0x95, 0x67, 0x34, 0xb0, 0x7e, 0x4a, 0xf2, 0x5c, 0xa7, 0x7e, 0xcb, 0x6d,
+    0x78, 0xf3, 0x81, 0x0f, 0x31, 0x9f, 0x06, 0xd4, 0xe2, 0x97, 0xa5, 0xdc,
+    0xff, 0x29, 0xcd, 0x98, 0xdc, 0x7e, 0xc3, 0x5a, 0xf6, 0xc8, 0x13, 0xaf,
+    0xff, 0xb0, 0x55, 0xf2, 0x89, 0xbe, 0xbb, 0x80, 0x73, 0xaa, 0x47, 0xd8,
+    0x11, 0xcb, 0xfc, 0xe2, 0xdc, 0xf7, 0x50, 0xeb, 0xff, 0xfe, 0xce, 0xbf,
+    0xdd, 0x62, 0x8e, 0x20, 0x81, 0x89, 0xbb, 0x07, 0x5a, 0x0e, 0xbf, 0xff,
+    0x47, 0x3b, 0x0b, 0xda, 0xfe, 0x06, 0x26, 0xec, 0x1d, 0x7e, 0x4e, 0x4d,
+    0x1d, 0xe2, 0x32, 0xc0, 0xca, 0x21, 0xf5, 0xba, 0x6d, 0x2b, 0x22, 0xfb,
+    0x0f, 0xbb, 0x30, 0xf3, 0xaf, 0xfc, 0xe2, 0x0f, 0x81, 0xfd, 0xf9, 0x23,
+    0xaf, 0x90, 0x67, 0x83, 0xaf, 0x7b, 0x90, 0x75, 0xff, 0x0c, 0x2d, 0x07,
+    0x17, 0x07, 0x5c, 0x81, 0xc3, 0xcf, 0x98, 0x6e, 0x98, 0xd1, 0xb9, 0xc4,
+    0x01, 0x6f, 0xa6, 0x28, 0x99, 0x26, 0x43, 0xca, 0xf4, 0x0c, 0xe7, 0x5f,
+    0x27, 0x51, 0x67, 0x5b, 0xa8, 0x6e, 0xe6, 0x1b, 0xbf, 0xa1, 0xb1, 0xaf,
+    0x21, 0xd7, 0xfd, 0x1e, 0xeb, 0x81, 0xf7, 0xd1, 0xd4, 0x13, 0xe3, 0x12,
+    0xbb, 0xff, 0x70, 0x1f, 0x3a, 0x8d, 0xff, 0x80, 0x3a, 0xf4, 0xdf, 0xf0,
+    0xeb, 0xff, 0x3a, 0x73, 0x37, 0x55, 0x96, 0x59, 0x3a, 0xa1, 0x14, 0x4e,
+    0x85, 0xa1, 0xeb, 0xff, 0xe1, 0x89, 0x7c, 0xfb, 0xe4, 0x1f, 0xe5, 0x9a,
+    0x3a, 0xb1, 0x3c, 0xd6, 0xc2, 0x2b, 0xb0, 0xc3, 0x01, 0x75, 0xe0, 0x3a,
+    0xce, 0xbb, 0x00, 0x75, 0xe1, 0x90, 0xc1, 0xb0, 0xc1, 0xbb, 0xed, 0x35,
+    0xa8, 0x75, 0x41, 0xe8, 0x39, 0x7d, 0xfb, 0x9a, 0x18, 0x9c, 0xeb, 0xff,
+    0xe6, 0x71, 0xba, 0xcf, 0x4d, 0x8a, 0x0e, 0x00, 0xea, 0xc3, 0xf7, 0x42,
+    0x7b, 0xf9, 0xfd, 0xd7, 0x10, 0x1d, 0x7f, 0xe7, 0xf6, 0x4c, 0xf0, 0x31,
+    0x31, 0xd7, 0xfe, 0xea, 0x67, 0xdc, 0x99, 0x98, 0xdc, 0xeb, 0x27, 0x11,
+    0x51, 0xd2, 0xbd, 0x1e, 0x5c, 0xd6, 0x9a, 0x30, 0x4a, 0x92, 0x64, 0x0d,
+    0x86, 0x40, 0x0d, 0x6e, 0xc1, 0x3a, 0xff, 0xf7, 0xa0, 0x5b, 0x9e, 0xea,
+    0x70, 0x0d, 0x3a, 0xfc, 0x14, 0xd7, 0x50, 0xeb, 0xf9, 0x07, 0x3d, 0xd4,
+    0x3a, 0xd1, 0x87, 0xa1, 0xa2, 0x6a, 0x0a, 0x34, 0xb0, 0x53, 0xf8, 0x4c,
+    0x5f, 0xe8, 0x5e, 0xb4, 0xe3, 0x39, 0xd7, 0xfc, 0x0d, 0x49, 0x3a, 0xe9,
+    0x39, 0xd7, 0xda, 0xc1, 0xf1, 0xd7, 0xb6, 0xa3, 0x87, 0x52, 0x1f, 0xb3,
+    0x9c, 0x7e, 0x41, 0x7b, 0xce, 0xc6, 0x75, 0xfe, 0xf7, 0x51, 0x50, 0x3a,
+    0x1d, 0x77, 0xdc, 0x3a, 0x82, 0x9b, 0x97, 0x4d, 0x46, 0x15, 0x1e, 0x2e,
+    0xfc, 0x7b, 0xe9, 0x95, 0xf7, 0x51, 0xe4, 0x75, 0xe0, 0xbc, 0x8e, 0xbb,
+    0xf0, 0x41, 0xbb, 0xc2, 0x0b, 0xfe, 0x6e, 0x7a, 0x36, 0x20, 0x80, 0xeb,
+    0xff, 0xfb, 0xf8, 0xf6, 0xb0, 0x7e, 0x72, 0x10, 0x22, 0xf2, 0x3a, 0xfc,
+    0xde, 0xee, 0xec, 0x67, 0x5f, 0xfc, 0x81, 0x1f, 0xfd, 0xa8, 0x18, 0xd1,
+    0xd4, 0x88, 0xff, 0x13, 0x8f, 0xd6, 0xb6, 0x15, 0xdf, 0xfc, 0x07, 0xe6,
+    0x6c, 0xc0, 0xf0, 0x59, 0x3a, 0xff, 0xfe, 0x1c, 0xd7, 0xff, 0x33, 0xae,
+    0x39, 0x34, 0xa3, 0x73, 0xaf, 0xdc, 0x6b, 0xbb, 0x4d, 0x10, 0x35, 0xfc,
+    0xf3, 0x81, 0xc4, 0x24, 0xac, 0x1f, 0x7b, 0x35, 0xfe, 0x1f, 0x6e, 0xd9,
+    0x9d, 0xee, 0xbc, 0xbe, 0x23, 0xfc, 0x61, 0x93, 0x7f, 0xdd, 0x4c, 0x1c,
+    0x68, 0x70, 0xea, 0x5a, 0x76, 0x7e, 0x8d, 0x13, 0x61, 0xd5, 0xef, 0x7f,
+    0x07, 0x5f, 0xe0, 0x79, 0x27, 0x5c, 0x34, 0xea, 0xdc, 0xf3, 0xc4, 0x72,
+    0xfc, 0x16, 0x2d, 0xc2, 0xc5, 0x9d, 0x50, 0xab, 0x33, 0x23, 0xf1, 0x48,
+    0x44, 0x39, 0x15, 0xfe, 0xcd, 0xfc, 0x1c, 0xc5, 0x0e, 0xbf, 0xb3, 0xd0,
+    0x28, 0x03, 0xaf, 0xf8, 0x3c, 0x17, 0x67, 0xee, 0xec, 0x9d, 0x79, 0xf9,
+    0x39, 0xa3, 0x05, 0xbf, 0xf3, 0xf3, 0x04, 0x1a, 0xf6, 0xb7, 0x3a, 0xff,
+    0xff, 0xfe, 0xcf, 0x75, 0xc5, 0x4f, 0x9a, 0xe3, 0xbf, 0xb6, 0x60, 0x7e,
+    0x62, 0xdc, 0x77, 0x91, 0xe2, 0x0b, 0xbf, 0xf3, 0xba, 0x8d, 0x70, 0xfc,
+    0x51, 0x93, 0xc4, 0x17, 0x7f, 0xf7, 0x53, 0xa9, 0x03, 0xef, 0x8a, 0x32,
+    0x78, 0x82, 0xef, 0xf4, 0x20, 0xfb, 0xe2, 0x8c, 0x9e, 0x20, 0xbb, 0xf9,
+    0x78, 0x1f, 0x8a, 0x32, 0x78, 0x82, 0xef, 0xff, 0xf9, 0xc4, 0x51, 0x7f,
+    0x34, 0xde, 0xa7, 0x11, 0x49, 0xf1, 0x93, 0xc4, 0x17, 0x76, 0xff, 0x02,
+    0x9c, 0xbb, 0x53, 0xf8, 0xa6, 0xe8, 0x42, 0x7d, 0x50, 0xab, 0x1f, 0xa7,
+    0xc3, 0x28, 0xc6, 0xff, 0x24, 0x29, 0xaf, 0x6b, 0x73, 0xaf, 0x9f, 0x80,
+    0x73, 0xaf, 0xfe, 0xea, 0x75, 0x20, 0x7d, 0xf1, 0x46, 0x4f, 0x10, 0x5d,
+    0xff, 0x4d, 0xa6, 0xa4, 0xff, 0x14, 0x64, 0xf1, 0x05, 0xdf, 0xbd, 0xa8,
+    0x5f, 0xc6, 0xa2, 0x7f, 0xea, 0x9d, 0xff, 0xef, 0x8d, 0xea, 0x36, 0x3d,
+    0xaf, 0x8a, 0x32, 0x78, 0x82, 0xef, 0xff, 0xfe, 0x11, 0x45, 0xfc, 0xff,
+    0x3e, 0x69, 0xbd, 0x4e, 0x22, 0x93, 0xe3, 0x27, 0x88, 0x2e, 0xb1, 0x32,
+    0x5d, 0xd1, 0x1d, 0x76, 0xff, 0xba, 0x9c, 0x45, 0x27, 0xc6, 0x4f, 0x10,
+    0x5d, 0xff, 0xf3, 0xbe, 0xf2, 0xd7, 0x50, 0x21, 0x8e, 0x41, 0x57, 0xfe,
+    0xc9, 0x4b, 0xfd, 0x70, 0x67, 0xdb, 0x3c, 0x41, 0x74, 0xd4, 0x72, 0xf1,
+    0x1f, 0x49, 0xd7, 0xfe, 0x6a, 0x73, 0xce, 0x0d, 0x7c, 0x64, 0xf1, 0x05,
+    0xdf, 0xdd, 0x4e, 0xf5, 0x00, 0x68, 0x02, 0xef, 0xd8, 0x0f, 0x8a, 0x32,
+    0x78, 0x82, 0xee, 0xcf, 0x34, 0xfc, 0x7a, 0x73, 0x5b, 0xa3, 0xb3, 0x50,
+    0xbf, 0xbf, 0x97, 0x81, 0xf8, 0xa3, 0x27, 0x88, 0x2e, 0xff, 0xcd, 0xea,
+    0x71, 0x14, 0x9f, 0x19, 0x3c, 0x41, 0x77, 0x67, 0xc7, 0x44, 0x5e, 0x8f,
+    0xaf, 0xf7, 0xe8, 0xb7, 0x1d, 0xe4, 0x78, 0x82, 0xef, 0xfd, 0x89, 0xb3,
+    0x07, 0x02, 0xf2, 0x3c, 0x41, 0x6b, 0x3c, 0x0a, 0x0a, 0xef, 0xef, 0x0d,
+    0xc0, 0x68, 0x31, 0xf2, 0x6a, 0x31, 0x5f, 0x46, 0x39, 0xfc, 0x2d, 0x19,
+    0x6f, 0xb8, 0x10, 0x68, 0x82, 0xd5, 0x44, 0x65, 0xce, 0xd3, 0xad, 0xa6,
+    0xb2, 0x70, 0xc1, 0x49, 0x79, 0xf1, 0xad, 0xd2, 0xda, 0x3a, 0xf4, 0x4b,
+    0x68, 0xea, 0x83, 0x6e, 0x23, 0x35, 0x3b, 0x2b, 0xd8, 0x26, 0x7b, 0x95,
+    0x02, 0x94, 0x00, 0x2f, 0x57, 0xff, 0x64, 0x87, 0x3d, 0xd4, 0xcd, 0xfc,
+    0x75, 0xfa, 0x3d, 0xae, 0xa1, 0xd7, 0xfe, 0xd4, 0xd2, 0xfc, 0x33, 0x4b,
+    0xf0, 0x9d, 0x52, 0x3e, 0xaf, 0x13, 0x5f, 0xfd, 0x1b, 0xcb, 0xea, 0xf5,
+    0xe8, 0xdd, 0x93, 0xaf, 0xd2, 0xda, 0xda, 0xfe, 0x73, 0xad, 0xd4, 0x3f,
+    0x97, 0x49, 0xbf, 0x72, 0x37, 0x96, 0x8e, 0xa9, 0x1e, 0x77, 0x09, 0xaf,
+    0xfe, 0x07, 0xfa, 0xdb, 0xce, 0x01, 0x69, 0xa3, 0xaf, 0xf0, 0x3f, 0xf0,
+    0xc7, 0xb4, 0x75, 0x00, 0xfe, 0xf4, 0x91, 0x50, 0x9d, 0x46, 0x43, 0xa5,
+    0xe1, 0x3b, 0x7f, 0x3c, 0xa3, 0x63, 0xf4, 0xeb, 0xff, 0xd3, 0xe6, 0xfe,
+    0xd2, 0x0c, 0x01, 0xd6, 0x75, 0xf6, 0xfa, 0x8d, 0xce, 0xbc, 0xb8, 0x91,
+    0xd7, 0xec, 0x0f, 0x7f, 0x64, 0xea, 0xf8, 0x7c, 0xee, 0x46, 0x23, 0x77,
+    0x82, 0xfe, 0x3a, 0xb8, 0x79, 0x4e, 0x5f, 0x79, 0x36, 0xf0, 0xeb, 0xcf,
+    0xc0, 0x1d, 0x6d, 0xe0, 0xdc, 0x78, 0x76, 0xf9, 0x9c, 0xeb, 0x9d, 0x7c,
+    0xa7, 0x11, 0x93, 0xaf, 0xd3, 0xbf, 0x61, 0x8c, 0xea, 0x62, 0x4f, 0x37,
+    0x08, 0xea, 0x15, 0x1d, 0xe1, 0x6a, 0x43, 0xe9, 0xd6, 0x40, 0x4e, 0x2d,
+    0xd7, 0xff, 0x84, 0x62, 0x75, 0xf5, 0x39, 0xc7, 0x91, 0xd7, 0xfa, 0x79,
+    0xe0, 0x77, 0xcf, 0x1d, 0x58, 0x7f, 0x88, 0x91, 0x7f, 0xf7, 0x07, 0xfd,
+    0xfc, 0x39, 0x3b, 0x89, 0xd7, 0x9f, 0x93, 0x9d, 0x70, 0x20, 0xeb, 0xe4,
+    0x85, 0xe1, 0xd4, 0x75, 0xfc, 0xea, 0x7a, 0x38, 0x03, 0xa8, 0x26, 0xdc,
+    0x42, 0xaf, 0xff, 0xf4, 0x20, 0x46, 0x3f, 0x6f, 0xb1, 0xa1, 0x86, 0xfd,
+    0x59, 0xd7, 0x02, 0x0e, 0xba, 0x14, 0x3a, 0xff, 0xb3, 0xda, 0x85, 0xfd,
+    0xc9, 0x8e, 0xbf, 0xda, 0xce, 0xa6, 0xbf, 0x9c, 0xeb, 0x99, 0x64, 0xab,
+    0xfe, 0x1c, 0xd8, 0xf2, 0xd2, 0x04, 0xea, 0x6a, 0x7e, 0x28, 0x39, 0xc1,
+    0x55, 0xab, 0x74, 0x80, 0x0c, 0x2c, 0x11, 0x51, 0x16, 0xd1, 0xd3, 0x26,
+    0x9f, 0x46, 0x2f, 0x32, 0xcb, 0x25, 0x59, 0x65, 0x2a, 0x5f, 0xdf, 0x4c,
+    0xef, 0xc2, 0x95, 0x46, 0xef, 0xd8, 0x5e, 0xd4, 0xea, 0xd6, 0x9e, 0x58,
+    0x95, 0xfd, 0xe8, 0xce, 0xe4, 0xe7, 0x5d, 0x8b, 0x3a, 0xb7, 0x3c, 0x1d,
+    0x16, 0x54, 0x3a, 0x25, 0x69, 0x46, 0xbb, 0x92, 0x8d, 0x94, 0x86, 0x3e,
+    0xf1, 0xdb, 0xa4, 0xa7, 0xae, 0x42, 0x6b, 0xb2, 0xfd, 0xde, 0x96, 0x78,
+    0x05, 0x81, 0x94, 0xa9, 0xa9, 0x4e, 0x7e, 0x86, 0xaf, 0xf2, 0xde, 0xb6,
+    0x36, 0xdf, 0xd8, 0x00, 0x27, 0x24, 0x75, 0xcd, 0xc3, 0xa8, 0x27, 0x82,
+    0xe5, 0x97, 0x63, 0x27, 0x5d, 0x1e, 0x3a, 0xa7, 0x35, 0x6d, 0x16, 0xb2,
+    0xce, 0xac, 0x36, 0x5e, 0x22, 0xbf, 0xd2, 0x41, 0xc5, 0xff, 0xd3, 0xaf,
+    0xfd, 0x9e, 0xd7, 0x51, 0x6f, 0x9c, 0x3a, 0xa0, 0xfb, 0x84, 0xca, 0xfb,
+    0xe7, 0xa3, 0x61, 0xd7, 0xd8, 0xbc, 0xf1, 0xd7, 0xbc, 0xea, 0x1d, 0x7f,
+    0xff, 0xf3, 0x5e, 0x6f, 0xe5, 0xfb, 0x7e, 0x75, 0x3d, 0xe8, 0xde, 0x27,
+    0x8d, 0x1d, 0x7f, 0xff, 0xcc, 0x62, 0xef, 0xb2, 0x25, 0xd8, 0xe4, 0xf1,
+    0xed, 0x3c, 0x8e, 0xbc, 0x9b, 0xcc, 0x75, 0xfb, 0x32, 0x7f, 0xf4, 0x75,
+    0xf7, 0x05, 0x00, 0x75, 0xf2, 0x35, 0xf8, 0x75, 0xd0, 0x03, 0xaf, 0xbf,
+    0x9f, 0xf5, 0x7a, 0x6d, 0x7e, 0x90, 0x52, 0x22, 0x53, 0xaa, 0xb7, 0xfd,
+    0xd7, 0xd7, 0x52, 0x77, 0x13, 0xaf, 0x9e, 0x7f, 0xb2, 0x3a, 0x98, 0x4a,
+    0xf1, 0x21, 0xfa, 0x50, 0x8e, 0xc2, 0x0d, 0xc9, 0x50, 0x83, 0x83, 0x8e,
+    0xf0, 0x06, 0x9d, 0x0e, 0xfa, 0x17, 0x9f, 0x48, 0xb6, 0x8d, 0xef, 0xe1,
+    0xfc, 0x2b, 0x79, 0x1d, 0x79, 0x27, 0xfc, 0xeb, 0xf4, 0x01, 0x37, 0xc3,
+    0xae, 0x5e, 0xc3, 0xac, 0x18, 0x37, 0xc2, 0x4d, 0x7f, 0xfa, 0x43, 0x1f,
+    0x16, 0x30, 0xa7, 0x92, 0x73, 0xaf, 0xce, 0xbc, 0xea, 0xce, 0xad, 0xcf,
+    0xc7, 0xc9, 0x77, 0xbd, 0xc8, 0x3a, 0xff, 0x6b, 0xdb, 0x30, 0x70, 0x27,
+    0x5e, 0xec, 0x6c, 0x3a, 0xf6, 0xa5, 0x39, 0xd5, 0x86, 0xeb, 0xe8, 0xed,
+    0x42, 0x7d, 0x72, 0x2d, 0xc5, 0xb4, 0x84, 0xb2, 0xc8, 0xdc, 0x6f, 0xcd,
+    0xb7, 0x9f, 0xe7, 0xd3, 0xaf, 0x4c, 0x9d, 0x3a, 0xfe, 0x8e, 0x3c, 0xc9,
+    0xd3, 0xaf, 0xda, 0x0c, 0x0c, 0xee, 0x79, 0x1a, 0x1c, 0xbc, 0xb8, 0x59,
+    0xd5, 0xb9, 0xec, 0xac, 0xfa, 0xff, 0xf8, 0x65, 0xf3, 0x02, 0x9a, 0xdf,
+    0xdf, 0xbe, 0x8e, 0xbf, 0x77, 0xf1, 0x8d, 0x87, 0x5f, 0xc2, 0xfe, 0x94,
+    0x28, 0x75, 0x41, 0xea, 0xfd, 0x29, 0xbe, 0xcc, 0xde, 0x47, 0x5e, 0xd2,
+    0x4c, 0x75, 0x94, 0x13, 0x7b, 0xa2, 0x1b, 0xff, 0x9e, 0x71, 0x8d, 0xd0,
+    0x23, 0x13, 0x9d, 0x5c, 0x3e, 0xa1, 0x27, 0xbf, 0x7c, 0xec, 0x72, 0x47,
+    0x57, 0xc5, 0x53, 0xd1, 0x0c, 0x0c, 0x23, 0x6c, 0x29, 0xde, 0x19, 0x4c,
+    0x90, 0xde, 0x5e, 0xa0, 0xeb, 0xfa, 0x79, 0xa4, 0xc2, 0xe4, 0xe7, 0x5f,
+    0x2f, 0x1f, 0xa7, 0x5d, 0x29, 0xce, 0xbd, 0xd0, 0xa1, 0xd7, 0xee, 0xe2,
+    0x4b, 0x47, 0x5f, 0xff, 0x76, 0x3e, 0xab, 0xe1, 0x70, 0x6b, 0x50, 0x02,
+    0xaf, 0xdc, 0x6b, 0xbb, 0x4f, 0x10, 0x25, 0xed, 0x46, 0xe7, 0x58, 0x18,
+    0x79, 0xfb, 0x99, 0xde, 0xf2, 0x4e, 0x75, 0xe9, 0xdc, 0x4e, 0xa9, 0x26,
+    0x4a, 0x12, 0x6e, 0x42, 0x81, 0x65, 0x1e, 0x1c, 0xbf, 0x85, 0xae, 0xa7,
+    0x50, 0xeb, 0xb6, 0xa4, 0x75, 0xf7, 0xa7, 0x71, 0x3a, 0xf0, 0xba, 0x87,
+    0x5e, 0x51, 0x3c, 0x75, 0xed, 0x3f, 0x8e, 0xa5, 0x0d, 0xbe, 0xe3, 0x97,
+    0x7c, 0xe9, 0xd7, 0xf2, 0xfc, 0x81, 0xfe, 0x0e, 0xbc, 0xbf, 0x34, 0xeb,
+    0x7a, 0x0f, 0x27, 0x0b, 0x6f, 0xe8, 0x5e, 0x29, 0x1a, 0x3a, 0xa7, 0x4d,
+    0x8b, 0x06, 0x5a, 0x43, 0xd5, 0x20, 0x11, 0x8b, 0x0f, 0x89, 0xae, 0xe7,
+    0xe7, 0x5f, 0xe1, 0x76, 0x75, 0xa8, 0x01, 0xd7, 0xb6, 0xdd, 0x43, 0xaf,
+    0xfa, 0x17, 0x2c, 0x9f, 0x3f, 0x60, 0x9d, 0x7c, 0xfe, 0x60, 0xce, 0x75,
+    0x62, 0x20, 0x90, 0x7d, 0xcf, 0x6f, 0x32, 0xcb, 0x27, 0xab, 0xea, 0xf3,
+    0x88, 0x4b, 0x57, 0xd5, 0x53, 0x59, 0x7d, 0x2f, 0xe1, 0x43, 0xac, 0x03,
+    0xab, 0x0d, 0x9b, 0x91, 0xd4, 0x27, 0x5e, 0x11, 0x7e, 0x42, 0xd0, 0x0b,
+    0x3e, 0x6c, 0xbe, 0x5f, 0x3f, 0x9c, 0xeb, 0xff, 0xe1, 0x45, 0x15, 0xd7,
+    0xbb, 0xfb, 0xca, 0x50, 0x75, 0x41, 0xfa, 0xe1, 0x25, 0x4e, 0x8e, 0x45,
+    0x21, 0x89, 0x7d, 0x81, 0x79, 0x1d, 0x7e, 0x71, 0x14, 0x59, 0xd7, 0xfd,
+    0xd4, 0xe6, 0x22, 0xe1, 0x8c, 0xeb, 0xf2, 0x2d, 0xc7, 0x0e, 0xaf, 0x8b,
+    0xec, 0xec, 0x40, 0xdc, 0x1a, 0xc8, 0x80, 0x22, 0xf9, 0x1a, 0x02, 0x8a,
+    0x09, 0x1c, 0x73, 0xca, 0xf7, 0x01, 0x50, 0x90, 0x7e, 0x49, 0xb6, 0x73,
+    0x7e, 0x4f, 0x47, 0xb4, 0x55, 0xf3, 0x63, 0xda, 0x2a, 0xe6, 0x59, 0x2a,
+    0xa4, 0x7b, 0xf8, 0x4c, 0xc9, 0x0d, 0xd8, 0xc9, 0x4a, 0x9a, 0xfb, 0xff,
+    0xef, 0x43, 0x73, 0x07, 0xdd, 0x48, 0x19, 0xce, 0xa3, 0xab, 0x0f, 0x5b,
+    0x49, 0x94, 0x04, 0x4f, 0x32, 0xfb, 0x7f, 0xef, 0x6b, 0x1b, 0xd7, 0x1f,
+    0x68, 0xeb, 0xf4, 0x6c, 0x41, 0x01, 0xdf, 0x0d, 0xed, 0xfa, 0x5d, 0xfe,
+    0x38, 0x75, 0xff, 0xce, 0xbe, 0x46, 0xc4, 0xd8, 0x3f, 0xe8, 0xea, 0xdc,
+    0xfb, 0xfa, 0x51, 0x7e, 0xcf, 0xd7, 0x1a, 0x3a, 0x8e, 0xbb, 0x26, 0xe1,
+    0xb1, 0xd1, 0x3d, 0xff, 0x27, 0xec, 0x1e, 0xc7, 0xd1, 0x9c, 0xeb, 0xfe,
+    0x89, 0xe3, 0x7f, 0x0e, 0x4e, 0x75, 0x62, 0x29, 0x5a, 0x5a, 0x87, 0xf7,
+    0xe7, 0x58, 0xc6, 0xe7, 0x54, 0xc9, 0xa6, 0xf2, 0x1f, 0x3d, 0x2e, 0xbe,
+    0xce, 0xe4, 0xe7, 0x5e, 0x93, 0xf0, 0xeb, 0xf4, 0xb3, 0xd8, 0x12, 0xaf,
+    0xa0, 0x46, 0x0e, 0xa9, 0x8f, 0x7f, 0xc3, 0x7f, 0x49, 0xaf, 0x81, 0xa5,
+    0xf0, 0xea, 0x51, 0x1a, 0x89, 0x08, 0x0f, 0x19, 0x5f, 0xf0, 0xe7, 0x73,
+    0xe7, 0x72, 0x73, 0xaf, 0xff, 0xfe, 0x04, 0x0b, 0x5f, 0xcf, 0xb8, 0x37,
+    0xf2, 0x2f, 0x5d, 0x8f, 0xa2, 0x75, 0xfd, 0xfb, 0x05, 0x39, 0xcc, 0x3a,
+    0xfb, 0xca, 0x67, 0x4e, 0xbf, 0xf0, 0xe7, 0xbd, 0xfc, 0xfe, 0xc6, 0x9d,
+    0x6d, 0x1d, 0x72, 0x00, 0xeb, 0xba, 0x87, 0x5d, 0xfe, 0xbe, 0x1a, 0xa9,
+    0x85, 0x69, 0xcf, 0xac, 0x07, 0x57, 0x02, 0x0e, 0xb8, 0x10, 0x75, 0xfb,
+    0xf9, 0x60, 0xaa, 0x86, 0xa8, 0x02, 0xb5, 0x09, 0xaa, 0xa8, 0x44, 0x08,
+    0x55, 0x0a, 0x5d, 0xff, 0xf6, 0x0b, 0xef, 0xa5, 0x14, 0x7f, 0x8d, 0x58,
+    0x0e, 0xbf, 0xfb, 0xdd, 0xc5, 0xfd, 0x80, 0x66, 0xfe, 0x3a, 0xff, 0x6e,
+    0xd4, 0xe7, 0xd8, 0x09, 0xd7, 0xc0, 0x5b, 0xcb, 0xe2, 0x33, 0xb4, 0xa7,
+    0xe4, 0x6b, 0xf8, 0x0b, 0xfb, 0xaf, 0xb3, 0x9d, 0x7f, 0x69, 0x04, 0x63,
+    0x73, 0xae, 0xcd, 0xce, 0xad, 0xcf, 0xd3, 0xc6, 0x7b, 0x65, 0x77, 0xc0,
+    0xe2, 0x70, 0xea, 0x84, 0xc4, 0x5e, 0x17, 0xac, 0x99, 0xdf, 0x6b, 0xfd,
+    0xfc, 0x75, 0xd8, 0xc9, 0xd7, 0xfd, 0x1b, 0xe0, 0x23, 0x66, 0x4e, 0x75,
+    0xfc, 0x39, 0xed, 0x38, 0x0e, 0xae, 0x1f, 0xd8, 0x05, 0xb4, 0x75, 0x7f,
+    0xe9, 0xa2, 0x7d, 0x73, 0x1b, 0x13, 0x9d, 0x7f, 0x62, 0xf0, 0x28, 0xc9,
+    0xd7, 0x2e, 0x0e, 0xa5, 0x9e, 0x0b, 0x96, 0x5f, 0xc3, 0x93, 0x75, 0x3c,
+    0x75, 0xf6, 0x67, 0x74, 0x75, 0x62, 0x3b, 0x9e, 0x10, 0x3e, 0x21, 0xda,
+    0x2c, 0xbc, 0xcb, 0x2c, 0x95, 0x7e, 0xc5, 0x07, 0xfd, 0x14, 0xa9, 0x7f,
+    0x7c, 0xab, 0x2c, 0xb2, 0x75, 0xd8, 0x03, 0xab, 0x0d, 0xdf, 0x89, 0xaa,
+    0x11, 0x27, 0xe7, 0x3b, 0xe4, 0xe0, 0x34, 0x75, 0xff, 0x6b, 0x91, 0xff,
+    0x85, 0x36, 0x1d, 0x7f, 0xe1, 0xcd, 0x37, 0xa8, 0xd8, 0x13, 0xaf, 0xff,
+    0xf2, 0x8c, 0xbf, 0x14, 0x57, 0x59, 0x21, 0xfd, 0xf5, 0x82, 0x75, 0x42,
+    0x36, 0x30, 0xe9, 0x0e, 0xef, 0x99, 0x71, 0x91, 0xd7, 0xfd, 0xe8, 0xdc,
+    0x0f, 0xde, 0xa1, 0xd6, 0xe9, 0xd5, 0x87, 0x90, 0xd3, 0x8b, 0xcc, 0xb2,
+    0xc9, 0x57, 0xf2, 0x3a, 0x9d, 0x4f, 0x14, 0xa9, 0x7f, 0x7b, 0xc8, 0xc9,
+    0xd7, 0xb4, 0xfc, 0x3a, 0xb7, 0x36, 0xfe, 0x1c, 0xbd, 0xd8, 0x09, 0xd4,
+    0x86, 0xf5, 0xc8, 0xaf, 0xd8, 0x0c, 0xc9, 0x8e, 0xb6, 0xbe, 0x26, 0x6b,
+    0xc4, 0x0e, 0xc2, 0xc0, 0x47, 0xee, 0xfe, 0x41, 0x4f, 0xa3, 0x23, 0x9e,
+    0xbf, 0x30, 0x7b, 0x13, 0xfe, 0x75, 0x4c, 0xad, 0xc7, 0xb0, 0xf9, 0x19,
+    0x42, 0xbf, 0x9b, 0x5e, 0x8d, 0x90, 0x75, 0x21, 0xf4, 0x0a, 0x65, 0xe1,
+    0x8d, 0x87, 0x5c, 0xc1, 0x43, 0xae, 0x4e, 0x9d, 0x67, 0x9c, 0xd7, 0x70,
+    0x66, 0xfb, 0xda, 0xfd, 0x8c, 0xeb, 0xfd, 0x03, 0x21, 0x48, 0xdc, 0xea,
+    0x86, 0x7d, 0x8c, 0x98, 0x72, 0x3f, 0x55, 0x23, 0x0b, 0x69, 0xae, 0xe7,
+    0x28, 0xe7, 0xc8, 0xe1, 0xbb, 0x28, 0x85, 0xcd, 0x41, 0x09, 0xf1, 0x8c,
+    0x77, 0x50, 0xf5, 0xf4, 0xbf, 0xbd, 0x84, 0x1b, 0x69, 0x5f, 0x49, 0xf6,
+    0x89, 0xaf, 0xc9, 0x34, 0x90, 0x4e, 0xb9, 0x89, 0x43, 0xaf, 0xfa, 0x6f,
+    0x6d, 0x6a, 0x26, 0xff, 0x87, 0x5f, 0xe0, 0xc0, 0xae, 0x03, 0x07, 0x54,
+    0x1f, 0x7b, 0x9f, 0xdf, 0xfd, 0x89, 0xd8, 0x0f, 0x7f, 0x8d, 0xf4, 0x75,
+    0xe0, 0xa8, 0x03, 0xaf, 0xcb, 0xe7, 0x1f, 0xc7, 0x57, 0xc3, 0xc4, 0x81,
+    0xdb, 0xff, 0xcd, 0x99, 0xdb, 0xd8, 0x97, 0x87, 0x16, 0x75, 0xff, 0xf2,
+    0x2f, 0x79, 0x6b, 0xe6, 0x08, 0xe2, 0x00, 0xeb, 0xc9, 0xdf, 0xce, 0xaf,
+    0x8a, 0x8b, 0x98, 0x82, 0x69, 0x42, 0x27, 0x84, 0x1d, 0x84, 0x43, 0x91,
+    0xf9, 0x27, 0x62, 0x7d, 0x95, 0x62, 0x63, 0x8a, 0x1f, 0x60, 0x43, 0x3d,
+    0x8b, 0x8d, 0x55, 0x84, 0xda, 0xc3, 0xe3, 0x1a, 0x62, 0x91, 0x8a, 0x31,
+    0x53, 0xa6, 0x19, 0x5a, 0x29, 0xb8, 0xd3, 0xce, 0x8b, 0x4a, 0x93, 0xf2,
+    0x1a, 0x56, 0x76, 0x5b, 0x9e, 0x15, 0x25, 0xae, 0xb6, 0x97, 0x2b, 0xbd,
+    0x21, 0xd9, 0x29, 0x3d, 0xac, 0x71, 0xb1, 0x4d, 0x4d, 0x72, 0xe5, 0x38,
+    0x69, 0x74, 0x8f, 0xde, 0xd6, 0xf7, 0xaf, 0x5d, 0x3e, 0x02, 0x94, 0xd8,
+    0xc1, 0x87, 0x88, 0xd6, 0xd0, 0x1a, 0xb7, 0x41, 0x1e, 0xb4, 0xb7, 0x5f,
+    0xce, 0x92, 0xec, 0x95, 0x5e, 0xcc, 0xb0, 0x4d, 0xb9, 0xfc, 0xff, 0xb5,
+    0x8d, 0x66, 0xd4, 0xb5, 0xca, 0x56, 0x38, 0xd7, 0x69, 0x67, 0x14, 0xdf,
+    0x7e, 0x54, 0x0b, 0xcf, 0x1d, 0x7f, 0x95, 0xce, 0x35, 0xdd, 0xa6, 0x8b,
+    0x8e, 0xff, 0x2b, 0x9c, 0x6b, 0xbb, 0x4d, 0x17, 0x5d, 0xff, 0xca, 0xbc,
+    0x95, 0xce, 0x35, 0xdd, 0xa6, 0x89, 0x46, 0xa2, 0x39, 0x2a, 0xe9, 0x42,
+    0xf0, 0x25, 0x2a, 0x42, 0x3d, 0xa5, 0x09, 0x1d, 0x13, 0x1b, 0x8b, 0xe7,
+    0x1b, 0x9a, 0x03, 0xbd, 0x14, 0x78, 0xff, 0x68, 0xfe, 0xff, 0xf2, 0xab,
+    0x79, 0x2b, 0x9c, 0x6b, 0xbb, 0x4d, 0x12, 0xd5, 0xff, 0x30, 0xee, 0xa3,
+    0x1b, 0xc6, 0xfb, 0x47, 0x5f, 0xb8, 0xd7, 0x76, 0x9a, 0x23, 0x7b, 0xff,
+    0x3c, 0x95, 0xce, 0x35, 0xdd, 0xa6, 0x89, 0x7e, 0xfe, 0x8f, 0x7d, 0xeb,
+    0xf8, 0xeb, 0xfd, 0x9f, 0x78, 0xa7, 0x7f, 0xd1, 0xd7, 0xa6, 0xd7, 0x0e,
+    0xb2, 0xac, 0x55, 0x34, 0x3c, 0x44, 0x59, 0x9f, 0x52, 0x84, 0xbb, 0xe9,
+    0xbd, 0xfe, 0x57, 0x38, 0xd7, 0x76, 0x9a, 0x2a, 0xbb, 0x93, 0x68, 0xeb,
+    0xe4, 0x5b, 0xec, 0x3a, 0x94, 0x37, 0x5e, 0x18, 0xbc, 0x3b, 0x4c, 0x9d,
+    0x7f, 0x3f, 0x66, 0x18, 0x09, 0xd7, 0xff, 0x7b, 0xb1, 0xa1, 0x7f, 0xd8,
+    0x29, 0xc3, 0xaf, 0x44, 0xb0, 0xea, 0x0a, 0x23, 0x77, 0x2c, 0x99, 0x1e,
+    0xff, 0x94, 0xc1, 0xcd, 0xfc, 0xeb, 0x3a, 0xe0, 0xa1, 0xd7, 0xf6, 0x71,
+    0xae, 0xed, 0x34, 0x48, 0x15, 0xf0, 0xf3, 0x55, 0x15, 0xbf, 0x69, 0xc5,
+    0xf7, 0x3a, 0xef, 0xe0, 0xea, 0x91, 0xf0, 0xee, 0x4b, 0xc2, 0x6b, 0xfd,
+    0x28, 0xe4, 0xf1, 0xc9, 0xce, 0xbf, 0xdc, 0x9d, 0x70, 0x32, 0xd1, 0xd5,
+    0x07, 0xcf, 0x86, 0x97, 0xd9, 0x3b, 0x84, 0xeb, 0xff, 0xd9, 0x37, 0x5d,
+    0x7e, 0xec, 0x7b, 0xf5, 0x9d, 0x53, 0xab, 0x09, 0x09, 0x16, 0x42, 0xb1,
+    0x43, 0x27, 0x87, 0x30, 0xc2, 0x5f, 0xc4, 0x1f, 0x48, 0x6f, 0xfe, 0x1c,
+    0x9d, 0x5d, 0xb8, 0x11, 0xcf, 0x1d, 0x4a, 0xa3, 0x23, 0x90, 0x83, 0xbf,
+    0xca, 0xe7, 0x1a, 0xee, 0xd3, 0x45, 0x91, 0x7f, 0x95, 0xce, 0x35, 0xdd,
+    0xa6, 0x8b, 0x5e, 0xff, 0xf6, 0x7d, 0x89, 0xd5, 0xc9, 0xbc, 0x18, 0x13,
+    0xaf, 0xf2, 0xb9, 0xc6, 0xbb, 0xb4, 0xd1, 0x72, 0x5f, 0xb8, 0xd7, 0x76,
+    0x9a, 0x2e, 0xcb, 0xff, 0x3c, 0x95, 0xce, 0x35, 0xdd, 0xa6, 0x8a, 0x3a,
+    0xca, 0xe1, 0xfe, 0xac, 0xce, 0xf8, 0x62, 0x4b, 0x3a, 0xd2, 0x3a, 0xfd,
+    0xc6, 0xbb, 0xb4, 0xd1, 0x4a, 0xdf, 0xf3, 0x7a, 0x93, 0x76, 0x27, 0xc3,
+    0xaf, 0xff, 0x76, 0x27, 0x8e, 0xa6, 0xc7, 0x0f, 0x50, 0xe5, 0x4d, 0xcd,
+    0xd2, 0x57, 0x11, 0x8f, 0x33, 0x65, 0x6e, 0x98, 0x3b, 0xc3, 0x5e, 0xff,
+    0xce, 0x9e, 0x97, 0xe1, 0x71, 0x01, 0xd6, 0x54, 0x29, 0xc6, 0xae, 0x32,
+    0x7e, 0x94, 0xd4, 0xec, 0x9e, 0xb9, 0x47, 0x35, 0xbb, 0x2a, 0x4e, 0x25,
+    0x2c, 0xa4, 0x07, 0xe2, 0x7f, 0xa4, 0xcf, 0x42, 0xf3, 0x64, 0x76, 0xb7,
+    0xfd, 0x25, 0x73, 0x8d, 0x77, 0x69, 0xa2, 0x38, 0xbf, 0xe4, 0x57, 0x38,
+    0xd7, 0x76, 0x9a, 0x2b, 0x5b, 0x2a, 0xe8, 0x89, 0xf2, 0x2d, 0xff, 0xe5,
+    0x56, 0xf2, 0x57, 0x38, 0xd7, 0x76, 0x9a, 0x25, 0xbb, 0xdf, 0xf0, 0x07,
+    0x5d, 0x9b, 0x9d, 0x7f, 0x83, 0x8b, 0x5c, 0x26, 0x8e, 0xbd, 0xb3, 0xf9,
+    0x1d, 0x4d, 0x44, 0x1e, 0xe3, 0xa8, 0x2d, 0xb0, 0xc6, 0xf7, 0x43, 0x23,
+    0xaf, 0xfb, 0x37, 0x1c, 0x00, 0x1e, 0x47, 0x5c, 0xb6, 0x9d, 0x50, 0x79,
+    0xb2, 0x37, 0xbe, 0x18, 0xde, 0x47, 0x5f, 0xff, 0x9f, 0x70, 0x07, 0xaf,
+    0x2c, 0xd0, 0xfe, 0xff, 0x4e, 0xa6, 0x9f, 0xc7, 0x48, 0x6c, 0xa1, 0xd7,
+    0xf2, 0x70, 0x53, 0xda, 0x3a, 0xfd, 0xc7, 0x1c, 0x83, 0xa8, 0xd1, 0x0d,
+    0xa1, 0xf0, 0x74, 0x45, 0xca, 0xee, 0x81, 0x3a, 0xfe, 0x41, 0x0e, 0x20,
+    0x4e, 0xa8, 0x37, 0xd2, 0x14, 0xbe, 0xc9, 0xa5, 0x87, 0x5f, 0xf9, 0xe4,
+    0xae, 0x71, 0xae, 0xed, 0x34, 0x4c, 0x17, 0xe0, 0x69, 0xc4, 0x07, 0x5f,
+    0xef, 0xf7, 0xe2, 0x42, 0xf0, 0xeb, 0xfe, 0x89, 0xfc, 0x31, 0xff, 0xb4,
+    0x75, 0xbd, 0xd3, 0xec, 0xdb, 0x33, 0xbe, 0xdd, 0xa8, 0xa1, 0xd5, 0x87,
+    0x9d, 0xe2, 0xbb, 0xfd, 0xa4, 0xea, 0x2f, 0x14, 0x3a, 0xff, 0xf3, 0xcf,
+    0xd4, 0x81, 0xc9, 0x93, 0x88, 0x75, 0x78, 0xfe, 0x59, 0x32, 0xb9, 0xb8,
+    0x75, 0xdf, 0x80, 0xaa, 0x43, 0x59, 0xc1, 0x5b, 0xfd, 0x81, 0x1c, 0xf7,
+    0x70, 0xeb, 0x98, 0x4d, 0x3c, 0x61, 0x57, 0xf4, 0xff, 0x76, 0xdc, 0x40,
+    0x75, 0xfd, 0x9e, 0xf4, 0x73, 0x47, 0x5f, 0xce, 0x20, 0x9c, 0x1e, 0x3a,
+    0xa1, 0x11, 0x62, 0x65, 0xb6, 0x59, 0x65, 0x61, 0x77, 0x22, 0x73, 0xf0,
+    0xb4, 0xe4, 0x26, 0x5b, 0x08, 0x2d, 0xdf, 0xb8, 0x40, 0xb2, 0x17, 0x4a,
+    0x18, 0x70, 0x6a, 0x13, 0x5e, 0x4f, 0xd8, 0x40, 0xc9, 0x87, 0xd8, 0x59,
+    0x5e, 0x5f, 0xfc, 0x2a, 0xff, 0xcf, 0x25, 0x73, 0x8d, 0x77, 0x69, 0xa2,
+    0x63, 0xbe, 0x8e, 0x46, 0xd1, 0xd6, 0x55, 0x11, 0x14, 0xb1, 0xde, 0xa5,
+    0x5f, 0x44, 0xf1, 0xc3, 0xaf, 0xd9, 0x13, 0x22, 0xce, 0xa4, 0x3c, 0x7e,
+    0x10, 0xdf, 0xc1, 0x5c, 0x67, 0xb4, 0x75, 0xfe, 0xec, 0x72, 0x7f, 0xbf,
+    0x80, 0xeb, 0x9f, 0x47, 0x5f, 0x7c, 0xf6, 0x74, 0xeb, 0x47, 0x4d, 0xc6,
+    0x85, 0x6f, 0x40, 0xce, 0x75, 0xff, 0xff, 0xf4, 0xb5, 0xdc, 0xfd, 0x9d,
+    0x77, 0x1b, 0x9a, 0xf9, 0x9b, 0xcb, 0x48, 0x28, 0x75, 0xe7, 0x76, 0x9a,
+    0x2b, 0x1b, 0xe7, 0xfb, 0x0a, 0x1d, 0x4d, 0x3c, 0xae, 0x13, 0xdf, 0xfb,
+    0x6f, 0x3c, 0x39, 0xfc, 0x0f, 0x8e, 0xa5, 0x13, 0x6c, 0x69, 0x36, 0xe3,
+    0x7c, 0x86, 0x57, 0x88, 0xaf, 0xfe, 0x1f, 0x29, 0xfc, 0x0e, 0x36, 0x38,
+    0x75, 0xfe, 0xe4, 0xfe, 0xd3, 0xee, 0xd3, 0xaa, 0x0f, 0xe1, 0xd0, 0xef,
+    0xe8, 0xda, 0xf6, 0x6f, 0x31, 0xd7, 0xf7, 0xfb, 0x6d, 0xea, 0x30, 0x4e,
+    0xbf, 0xb3, 0x5b, 0xca, 0x3a, 0x75, 0xd1, 0xb0, 0xeb, 0x07, 0xa7, 0x88,
+    0x25, 0xb7, 0xfd, 0x1b, 0xca, 0x69, 0x3f, 0x27, 0x3a, 0xa1, 0x1b, 0x78,
+    0xf2, 0x84, 0xf7, 0xa2, 0x5e, 0x3a, 0xff, 0xd8, 0x1e, 0x27, 0xf3, 0x83,
+    0x52, 0x3a, 0xf9, 0x6f, 0xbf, 0x8e, 0xbf, 0xfa, 0x78, 0xf7, 0xcf, 0xad,
+    0xfb, 0xb5, 0xf7, 0x47, 0x5f, 0xf7, 0x23, 0x4f, 0xc1, 0x89, 0x1d, 0x5c,
+    0x44, 0x3e, 0xc5, 0x1b, 0xd2, 0x79, 0xce, 0xbd, 0xf2, 0x75, 0x9d, 0x70,
+    0x7c, 0x75, 0x30, 0x93, 0x1f, 0xc8, 0x54, 0xee, 0x4a, 0x83, 0x82, 0x3f,
+    0x7f, 0xe1, 0x70, 0xf6, 0x36, 0x75, 0xc4, 0xeb, 0xff, 0xff, 0x7f, 0x3e,
+    0x37, 0xe0, 0xff, 0xb5, 0xf3, 0x37, 0x96, 0x7e, 0x20, 0xd1, 0xd7, 0xff,
+    0xa7, 0xcd, 0xfd, 0xa4, 0x18, 0x03, 0xac, 0xeb, 0xfd, 0xb8, 0xe0, 0x7a,
+    0xec, 0x9d, 0x58, 0x7f, 0x8e, 0x93, 0x41, 0x4d, 0x40, 0x4f, 0x75, 0x0f,
+    0x3b, 0xfa, 0x79, 0xa4, 0xc2, 0xe4, 0xe7, 0x5f, 0x08, 0xe7, 0x8e, 0xbf,
+    0x23, 0x1f, 0x38, 0x87, 0x53, 0x10, 0x7f, 0xb0, 0x6b, 0xd1, 0xfb, 0xfa,
+    0x7f, 0xbb, 0x6e, 0x20, 0x3a, 0xf9, 0x8e, 0x34, 0x27, 0x5f, 0xfb, 0xae,
+    0xbf, 0x76, 0x3d, 0xfa, 0xce, 0xac, 0x3e, 0x29, 0x88, 0xef, 0xf9, 0x24,
+    0x9d, 0xfd, 0x6b, 0x43, 0xaa, 0x11, 0xdd, 0x90, 0x94, 0xf1, 0x15, 0xee,
+    0xa2, 0xb0, 0xc9, 0x6d, 0x9c, 0x86, 0x45, 0x99, 0x1e, 0xdb, 0x61, 0x95,
+    0xc2, 0x0e, 0xc6, 0x18, 0xe5, 0xa2, 0x37, 0xa8, 0xd7, 0xfd, 0x1d, 0x16,
+    0xdc, 0x2c, 0xbe, 0xc6, 0x43, 0x74, 0x84, 0xeb, 0xfb, 0x9c, 0x80, 0xe2,
+    0xce, 0xbe, 0x9f, 0x91, 0x39, 0xd7, 0x7d, 0x01, 0xd7, 0xba, 0x8b, 0x3a,
+    0xd3, 0x1d, 0x4e, 0x6b, 0x3f, 0x1b, 0xbf, 0x38, 0xcf, 0xfe, 0x8e, 0xbf,
+    0xe8, 0x0f, 0x70, 0x3c, 0x76, 0x9d, 0x48, 0x98, 0x9b, 0x96, 0x00, 0x8c,
+    0x51, 0x34, 0x43, 0xe2, 0x8b, 0x74, 0xeb, 0xda, 0xfb, 0xa3, 0xaf, 0xb7,
+    0x9e, 0x14, 0x3a, 0xa7, 0x3d, 0x20, 0x88, 0x7e, 0x3d, 0x77, 0xa0, 0xeb,
+    0xfd, 0xbf, 0x21, 0x24, 0xfa, 0x3a, 0xfb, 0x06, 0x24, 0x75, 0x61, 0xe8,
+    0xac, 0xca, 0xff, 0x60, 0x35, 0x9e, 0x4e, 0x1d, 0x7d, 0xff, 0xb3, 0x47,
+    0x5f, 0x47, 0x1c, 0x4e, 0xbf, 0xcf, 0xc9, 0x01, 0x37, 0xd1, 0xd7, 0xda,
+    0xd4, 0x00, 0xea, 0x84, 0x73, 0xe1, 0x0a, 0x18, 0xf4, 0x8b, 0xf1, 0xf6,
+    0x4c, 0xef, 0xa4, 0x0f, 0xe4, 0x75, 0xf7, 0x3e, 0xc0, 0x0e, 0xa8, 0x3c,
+    0x64, 0x23, 0xbf, 0xc9, 0x3b, 0xac, 0x00, 0x83, 0xaf, 0xf9, 0x1b, 0xdc,
+    0x98, 0x60, 0x27, 0x5f, 0x4b, 0xd9, 0xf4, 0xeb, 0xcd, 0x80, 0x1d, 0x7b,
+    0x90, 0xb3, 0xa9, 0xcf, 0x67, 0xf2, 0x36, 0x46, 0xef, 0xd1, 0x3f, 0xdc,
+    0x98, 0xeb, 0xd0, 0x32, 0x3a, 0xa6, 0x4d, 0x5b, 0x84, 0x1d, 0x32, 0x18,
+    0x48, 0x68, 0xc3, 0xc5, 0x57, 0xfe, 0x8c, 0xd7, 0xc8, 0x40, 0xfd, 0x91,
+    0xd7, 0xf2, 0x33, 0xa9, 0xf1, 0x93, 0xa8, 0x4f, 0xbf, 0xc8, 0x17, 0xe8,
+    0x0f, 0xb1, 0xa7, 0x5f, 0x76, 0x05, 0xa7, 0x54, 0x8f, 0x9f, 0x44, 0x3e,
+    0x26, 0xbe, 0x71, 0x79, 0x8e, 0xbf, 0x27, 0x87, 0x24, 0x75, 0xf4, 0x33,
+    0x13, 0x1d, 0x77, 0xd5, 0x9d, 0x7f, 0x78, 0x5c, 0x18, 0x27, 0x5f, 0x85,
+    0xc1, 0x82, 0x75, 0xbf, 0xf8, 0x79, 0xde, 0x2a, 0xa9, 0xd1, 0xf0, 0xa1,
+    0x02, 0x12, 0xf4, 0x88, 0x59, 0xaf, 0xf4, 0x32, 0x1f, 0xdf, 0x92, 0x3a,
+    0xfe, 0x4e, 0x6f, 0xa8, 0x91, 0xd6, 0xd8, 0x75, 0x70, 0xfc, 0xfa, 0x69,
+    0xb4, 0x5b, 0x78, 0x51, 0x43, 0xaf, 0xb0, 0x29, 0xb0, 0xeb, 0xa1, 0x78,
+    0x6f, 0x5c, 0x6e, 0xff, 0xb1, 0x97, 0xdf, 0xb1, 0xf4, 0x4e, 0xb6, 0x8e,
+    0xa4, 0x3f, 0x4e, 0x15, 0x39, 0xd5, 0xc0, 0x82, 0xae, 0x65, 0x92, 0xa9,
+    0x0d, 0x6b, 0x22, 0xb7, 0xf9, 0xe4, 0x39, 0xee, 0xa1, 0x4a, 0x9a, 0x1b,
+    0xcf, 0xbe, 0x8e, 0xbe, 0xfb, 0xd7, 0xf1, 0xd4, 0x13, 0x7f, 0xe1, 0xcb,
+    0xd0, 0x33, 0x1d, 0x70, 0xc1, 0xd6, 0x98, 0xea, 0x98, 0xf0, 0x38, 0x36,
+    0xe2, 0x97, 0xff, 0x28, 0x82, 0xdd, 0x42, 0xdf, 0x7f, 0x1d, 0x78, 0x19,
+    0xb4, 0x75, 0x28, 0x7c, 0x5c, 0x44, 0xbe, 0x5e, 0xbf, 0x59, 0xd6, 0x50,
+    0xeb, 0x6d, 0x9d, 0x77, 0x14, 0x3a, 0xa0, 0xf7, 0x90, 0x8f, 0xf1, 0x1f,
+    0xa2, 0x77, 0xff, 0xdd, 0xc9, 0x6a, 0x3d, 0x2c, 0x63, 0x71, 0x01, 0xd7,
+    0xfe, 0x92, 0x7b, 0xb9, 0xbf, 0xbf, 0x83, 0xae, 0xcd, 0x1d, 0x50, 0x7a,
+    0x92, 0x3f, 0xad, 0x23, 0x17, 0xd0, 0xa4, 0xbf, 0x24, 0x2e, 0x16, 0x75,
+    0xb0, 0xea, 0x43, 0xdc, 0xd1, 0x46, 0xd9, 0x2d, 0x42, 0xb0, 0x2c, 0x61,
+    0x48, 0x48, 0xf6, 0x10, 0x2f, 0x1a, 0xf5, 0xed, 0x44, 0xc7, 0x51, 0xd6,
+    0x59, 0xd5, 0xe2, 0xeb, 0x60, 0x55, 0xf8, 0x09, 0xc4, 0x50, 0xeb, 0x9d,
+    0x43, 0xaa, 0x64, 0x4a, 0xf4, 0xd8, 0x04, 0x42, 0x4f, 0x77, 0xa0, 0xeb,
+    0xf4, 0x77, 0x36, 0x39, 0xd4, 0xe6, 0xf0, 0x02, 0xb7, 0xf2, 0x7b, 0x3a,
+    0xea, 0x1d, 0x7f, 0x77, 0xf7, 0x9f, 0xa8, 0x75, 0xe6, 0x59, 0x64, 0xab,
+    0xfe, 0x0c, 0x4f, 0xf7, 0x3a, 0xfb, 0x94, 0xa9, 0x7f, 0x76, 0x4e, 0x75,
+    0x05, 0x15, 0xcd, 0x4d, 0x44, 0xbb, 0xd0, 0xb4, 0x3a, 0xb0, 0xf2, 0x5a,
+    0x5f, 0x7c, 0x9c, 0xda, 0x09, 0xd7, 0xee, 0xc6, 0xee, 0xc6, 0x75, 0xff,
+    0xf4, 0x7b, 0x41, 0xcf, 0x27, 0x7f, 0xcd, 0xfc, 0x75, 0x74, 0xfe, 0xbc,
+    0x55, 0x6e, 0x1d, 0x7f, 0xb3, 0x1b, 0xf7, 0x67, 0x70, 0xeb, 0xbf, 0xd1,
+    0xd7, 0xff, 0xec, 0x0c, 0x66, 0xff, 0x7c, 0x83, 0xfc, 0xb3, 0x47, 0x5c,
+    0xb0, 0x1d, 0x73, 0x89, 0xd5, 0xd3, 0x54, 0xe2, 0xd7, 0xe5, 0xa7, 0x80,
+    0xe7, 0x54, 0xe9, 0xf1, 0x64, 0x27, 0x98, 0xc8, 0xa6, 0x10, 0x73, 0x51,
+    0x17, 0xf4, 0x20, 0x3f, 0x20, 0xbe, 0xef, 0x92, 0x73, 0xaf, 0xf3, 0x53,
+    0x43, 0x9b, 0x1c, 0xeb, 0xe8, 0x9d, 0xe4, 0x75, 0xd9, 0xe3, 0xaf, 0xd9,
+    0x38, 0xe6, 0xe7, 0x56, 0x22, 0xc7, 0x72, 0x2e, 0x19, 0x74, 0x84, 0x45,
+    0x6f, 0xa0, 0x51, 0x8c, 0xeb, 0xdd, 0x80, 0x9d, 0x77, 0x34, 0x75, 0x1c,
+    0x85, 0xb5, 0xfe, 0x81, 0x93, 0xaf, 0x02, 0x75, 0xf7, 0x96, 0xbe, 0x1d,
+    0x7f, 0xf0, 0x20, 0x5a, 0xfe, 0x07, 0xd1, 0x91, 0xd7, 0xa4, 0x9d, 0x3a,
+    0xfb, 0xc3, 0x92, 0x3a, 0xfd, 0x9f, 0xb0, 0x74, 0xe7, 0x5f, 0xfe, 0x4d,
+    0x77, 0x02, 0x39, 0xb0, 0x73, 0x47, 0x54, 0x93, 0x44, 0x50, 0xc3, 0x72,
+    0x29, 0x91, 0x38, 0x36, 0x24, 0x1e, 0x2b, 0xa6, 0x13, 0x6a, 0xe3, 0x11,
+    0x94, 0x4f, 0x0a, 0x79, 0x18, 0x86, 0x34, 0xdc, 0x8f, 0xcb, 0x78, 0xcc,
+    0xd2, 0x32, 0x79, 0xa1, 0x7b, 0xc8, 0x71, 0xad, 0xef, 0xb2, 0xe0, 0x9e,
+    0x1d, 0xa0, 0x79, 0x60, 0x90, 0x0c, 0x64, 0x7a, 0x94, 0x07, 0xe8, 0xcc,
+    0x36, 0x24, 0xb2, 0x45, 0xb6, 0x63, 0xf6, 0x35, 0xcb, 0xfe, 0x57, 0xc9,
+    0x9b, 0x5a, 0xfe, 0x0e, 0xbf, 0xff, 0xef, 0xe1, 0x5f, 0x69, 0x3a, 0xe9,
+    0xec, 0xe0, 0x16, 0xf2, 0x3a, 0x95, 0x54, 0x5d, 0x3c, 0x71, 0x81, 0x3c,
+    0xbf, 0x71, 0xae, 0xed, 0x34, 0x56, 0xf7, 0xfe, 0x79, 0x2b, 0x9c, 0x6b,
+    0xbb, 0x4d, 0x13, 0x85, 0x95, 0xc3, 0xfd, 0x59, 0x9d, 0xcc, 0x20, 0x9d,
+    0x6e, 0x9d, 0x6d, 0x1d, 0x5f, 0x9a, 0x0d, 0xb1, 0x0b, 0xe6, 0xbb, 0xb4,
+    0xd1, 0x68, 0xdf, 0xfe, 0xc0, 0xf5, 0xd4, 0x9a, 0x64, 0xd7, 0xeb, 0x3a,
+    0xb8, 0x7f, 0x5d, 0x2d, 0xbe, 0x6b, 0x88, 0x0e, 0xbf, 0xe9, 0xb1, 0x8f,
+    0x5c, 0xe3, 0xf8, 0xeb, 0xfa, 0x1c, 0x7f, 0x0e, 0x1d, 0x72, 0x28, 0x75,
+    0xff, 0xfa, 0x78, 0xf4, 0x07, 0x91, 0xd7, 0xd0, 0xe0, 0x0e, 0xbf, 0xf4,
+    0x6e, 0xec, 0x7d, 0x17, 0x63, 0x9c, 0xeb, 0xff, 0x47, 0x01, 0x89, 0x9c,
+    0xf7, 0xe7, 0x54, 0x23, 0x53, 0xaa, 0x7a, 0x44, 0xb6, 0x4c, 0x98, 0xce,
+    0xa1, 0xd5, 0x7f, 0xbb, 0xdf, 0xd4, 0x5c, 0x68, 0xeb, 0xff, 0xf2, 0x68,
+    0x73, 0x63, 0xf8, 0x73, 0x5d, 0x79, 0x8e, 0xac, 0x44, 0x4c, 0xc6, 0xb7,
+    0xd8, 0x07, 0xe9, 0xd7, 0x77, 0x47, 0x59, 0x56, 0x02, 0xba, 0xc6, 0x2c,
+    0xeb, 0x21, 0x3e, 0xd2, 0x29, 0x88, 0x16, 0x79, 0xd8, 0xd1, 0x3d, 0x0b,
+    0x8d, 0xb2, 0x3f, 0xa4, 0x17, 0xcd, 0x77, 0x69, 0xa2, 0xda, 0xbf, 0xff,
+    0xa1, 0xfd, 0x1d, 0x8d, 0x22, 0x49, 0x39, 0x81, 0x3a, 0xfe, 0xec, 0x2e,
+    0x10, 0x27, 0x57, 0x11, 0x5d, 0xa2, 0xdf, 0x2b, 0x5f, 0xfb, 0xa8, 0x17,
+    0x90, 0x7a, 0x8b, 0x3a, 0xff, 0xb3, 0x1b, 0xb7, 0xff, 0x53, 0x87, 0x5f,
+    0x46, 0xcc, 0x43, 0xaf, 0xfa, 0x25, 0x1c, 0x9e, 0x39, 0x39, 0xd7, 0xfd,
+    0x1c, 0xf9, 0xa8, 0xeb, 0xa1, 0xd7, 0xfb, 0xa8, 0xf2, 0xf2, 0x4e, 0x75,
+    0x62, 0x6d, 0x8d, 0x30, 0x98, 0xf7, 0x87, 0x62, 0x42, 0xc9, 0xce, 0xd9,
+    0xc5, 0xfc, 0xa3, 0xf0, 0x3f, 0x89, 0xd7, 0xf0, 0xed, 0xa7, 0x31, 0x43,
+    0xaf, 0xc9, 0x3a, 0xe1, 0xa7, 0x5f, 0x9f, 0x79, 0x7d, 0xd1, 0xd7, 0xfe,
+    0x49, 0xb5, 0xb1, 0xc6, 0x7f, 0xc2, 0x75, 0x95, 0x51, 0x1e, 0x02, 0x5d,
+    0xe2, 0xfd, 0x84, 0xff, 0x4a, 0xa9, 0x54, 0xeb, 0x41, 0x1a, 0xc5, 0xcb,
+    0xe9, 0xd7, 0xee, 0x35, 0xdd, 0xa6, 0x8b, 0x96, 0xca, 0x84, 0xf2, 0x70,
+    0x5a, 0xfd, 0xc6, 0xbb, 0xb4, 0xd1, 0x76, 0xdf, 0xf2, 0x4a, 0x48, 0x20,
+    0x89, 0x1d, 0x65, 0x70, 0xfa, 0x5c, 0xce, 0xa1, 0xda, 0x79, 0x4e, 0x53,
+    0x29, 0xea, 0x20, 0xc6, 0xf8, 0xa5, 0x27, 0xa9, 0x2b, 0x89, 0x16, 0x38,
+    0x5b, 0xf6, 0x5e, 0xa0, 0xce, 0x3c, 0xe9, 0xd3, 0xd0, 0x91, 0xbf, 0xca,
+    0xe7, 0x1a, 0xee, 0xd3, 0x45, 0x4f, 0x7e, 0x15, 0x79, 0xad, 0x1d, 0x74,
+    0xeb, 0x3a, 0xfd, 0xba, 0xdd, 0xc4, 0xea, 0x09, 0xbd, 0xfc, 0x5e, 0xde,
+    0x3a, 0xff, 0xa1, 0xe7, 0xf9, 0xbe, 0xa0, 0x27, 0x52, 0x1e, 0x58, 0x88,
+    0x5f, 0x35, 0xdd, 0xa6, 0x8a, 0xe6, 0xff, 0x2b, 0x9c, 0x6b, 0xbb, 0x4d,
+    0x16, 0x75, 0xe7, 0x79, 0x1d, 0x7f, 0x26, 0xb0, 0x5d, 0x93, 0xab, 0x88,
+    0xb1, 0xe9, 0x68, 0x9f, 0xf8, 0x6a, 0xff, 0xf7, 0xa3, 0x5f, 0x3f, 0xd7,
+    0xa2, 0x69, 0x90, 0xeb, 0xf9, 0x17, 0x3f, 0xfc, 0x91, 0xd7, 0xfa, 0x3b,
+    0xf1, 0x6c, 0x5b, 0x03, 0xc7, 0x56, 0x22, 0xef, 0xa9, 0xdb, 0x0b, 0xef,
+    0xdc, 0xcf, 0x22, 0xce, 0xbe, 0x71, 0x80, 0x9d, 0x7e, 0x9a, 0x17, 0x1f,
+    0x4e, 0xba, 0x4b, 0x3a, 0xb0, 0xdf, 0x89, 0x4d, 0xfb, 0x8d, 0x77, 0x69,
+    0xa2, 0x42, 0xbf, 0xf6, 0x2f, 0x1f, 0x93, 0xfc, 0xdd, 0x67, 0x5f, 0xf2,
+    0x6f, 0xaf, 0x0c, 0x2f, 0x47, 0x5d, 0x25, 0x71, 0x15, 0x9d, 0x33, 0x02,
+    0x0d, 0xff, 0xdd, 0x45, 0xe6, 0xbe, 0x6f, 0x2c, 0xf1, 0xd7, 0xd2, 0xef,
+    0xdd, 0x1d, 0x50, 0x7d, 0x58, 0x8d, 0x7c, 0xc5, 0xf6, 0x16, 0x75, 0xfd,
+    0xdd, 0x6b, 0x39, 0x39, 0xd7, 0x43, 0x27, 0x56, 0x1e, 0x22, 0x17, 0x5e,
+    0x5e, 0xc9, 0x1d, 0x7f, 0xfb, 0xb0, 0x05, 0xbc, 0xb5, 0xec, 0xc5, 0x9d,
+    0x65, 0x67, 0x5d, 0x6b, 0x0b, 0x6e, 0x43, 0x45, 0x21, 0xef, 0xc3, 0x15,
+    0x93, 0x75, 0x79, 0xe1, 0x96, 0x30, 0xa6, 0xd1, 0x07, 0x9a, 0xbf, 0x20,
+    0xfa, 0x3d, 0x7f, 0xf2, 0xbd, 0x7d, 0x0e, 0x7b, 0xd0, 0x03, 0xaf, 0xff,
+    0x2a, 0xb7, 0x92, 0xb9, 0xc6, 0xbb, 0xb4, 0xd1, 0x3e, 0x53, 0x57, 0xde,
+    0x50, 0xfd, 0x8e, 0x77, 0x41, 0x70, 0xd0, 0xea, 0x1d, 0xc9, 0xb9, 0xd7,
+    0xff, 0xd2, 0x9d, 0x86, 0x86, 0x2e, 0x76, 0xf3, 0xe7, 0xce, 0xed, 0x9d,
+    0x52, 0x3f, 0xa0, 0x0b, 0x5f, 0xb3, 0x99, 0x93, 0x1d, 0x65, 0x7a, 0x79,
+    0x1f, 0x48, 0xaf, 0xdc, 0x6b, 0xbb, 0x4d, 0x15, 0x95, 0xff, 0x9e, 0x4a,
+    0xe7, 0x1a, 0xee, 0xd3, 0x44, 0xdd, 0x65, 0x70, 0xff, 0x56, 0x67, 0x4d,
+    0x46, 0x82, 0x42, 0xa2, 0xfd, 0xc6, 0xbb, 0xb4, 0xd1, 0x2b, 0x5f, 0x86,
+    0x02, 0xfd, 0x3a, 0xfc, 0xaa, 0xde, 0x4a, 0xe1, 0xec, 0x21, 0x9d, 0xff,
+    0xbd, 0x8a, 0xe7, 0x12, 0x77, 0x59, 0xd7, 0xff, 0x98, 0x96, 0x21, 0x81,
+    0xac, 0x79, 0x26, 0x73, 0x0e, 0xbf, 0xf2, 0x6b, 0xf5, 0x8a, 0x6c, 0xfd,
+    0xce, 0xbf, 0xa0, 0x5d, 0xae, 0xc6, 0x75, 0x48, 0xfb, 0x56, 0x81, 0x70,
+    0x78, 0x75, 0xfb, 0x8d, 0x77, 0x69, 0xa2, 0x5c, 0xbf, 0xe4, 0x79, 0x78,
+    0x61, 0x7a, 0x3a, 0xfd, 0x2d, 0xb4, 0xeb, 0x9d, 0x7a, 0x36, 0xe0, 0xeb,
+    0xc8, 0x30, 0x75, 0x48, 0xf7, 0xc2, 0x53, 0xb0, 0x76, 0xff, 0xfc, 0xfe,
+    0x4f, 0xe4, 0x29, 0x28, 0xf0, 0xff, 0x23, 0xaf, 0xe9, 0x77, 0x07, 0x1a,
+    0x75, 0xe9, 0x77, 0xc7, 0x5d, 0xd8, 0x43, 0xc7, 0xe9, 0x5d, 0xff, 0xc2,
+    0x80, 0xd7, 0x21, 0x24, 0xfa, 0x3a, 0xb0, 0xfb, 0x50, 0xb2, 0xf3, 0xc9,
+    0x56, 0x28, 0xac, 0x6e, 0x21, 0x85, 0x22, 0x2c, 0x16, 0xe9, 0x9b, 0xc2,
+    0x57, 0x46, 0x3e, 0x8c, 0x22, 0xca, 0xa2, 0xbf, 0x15, 0xcb, 0x59, 0xbf,
+    0xf9, 0x57, 0x92, 0xb9, 0xc6, 0xbb, 0xb4, 0xd1, 0x1d, 0xdf, 0xf7, 0xbb,
+    0x92, 0x55, 0xc7, 0x47, 0x5f, 0xcc, 0x21, 0x86, 0xe0, 0x9d, 0x77, 0xfd,
+    0x3a, 0xfe, 0x60, 0x0e, 0x75, 0xfc, 0x75, 0xff, 0xfd, 0xe9, 0x20, 0x7a,
+    0x9b, 0x3e, 0x60, 0x78, 0x9f, 0xb4, 0xeb, 0xfd, 0x8c, 0xea, 0x07, 0xda,
+    0x3a, 0xfe, 0x00, 0xe6, 0xfe, 0xc3, 0xaf, 0xce, 0xa7, 0x70, 0x07, 0x5f,
+    0xc2, 0x07, 0xe3, 0xfd, 0x3a, 0xa1, 0x10, 0x1c, 0x2c, 0x72, 0x7b, 0xff,
+    0x27, 0x3e, 0x68, 0x71, 0x70, 0xd3, 0xaf, 0xfd, 0x03, 0xff, 0x91, 0xf6,
+    0x3c, 0x8e, 0xbf, 0xf0, 0xff, 0x2f, 0x98, 0x83, 0x0b, 0x3a, 0xf9, 0xae,
+    0xed, 0x34, 0x54, 0x37, 0xfd, 0x9d, 0xc1, 0x7e, 0x71, 0x0e, 0xa5, 0x13,
+    0x1c, 0x69, 0xf2, 0x1f, 0x70, 0xfb, 0x45, 0xb7, 0x98, 0xde, 0x0e, 0xba,
+    0x58, 0x75, 0xff, 0x4b, 0xc9, 0xc7, 0x6a, 0x09, 0xd7, 0xd2, 0x06, 0xb0,
+    0xeb, 0xff, 0xce, 0xbc, 0xe0, 0xe2, 0x6c, 0x4e, 0x39, 0xd7, 0xff, 0x74,
+    0x72, 0x6f, 0x77, 0x38, 0x9a, 0x3a, 0xfd, 0xb8, 0xa2, 0xd0, 0xea, 0x84,
+    0x58, 0x62, 0x3a, 0x21, 0xdf, 0xe8, 0xf3, 0xf7, 0xe0, 0x60, 0xeb, 0xff,
+    0x67, 0xb5, 0xcc, 0x9b, 0xa8, 0xa1, 0xd7, 0xfd, 0xf1, 0xc7, 0x36, 0xbe,
+    0x77, 0xf3, 0xa9, 0x0f, 0xfb, 0xf3, 0xfb, 0xfd, 0x28, 0xe4, 0xf1, 0xc9,
+    0xce, 0xbf, 0xf6, 0xb0, 0x7d, 0xac, 0x92, 0x74, 0xeb, 0xfb, 0x59, 0xb0,
+    0x63, 0x73, 0xab, 0x47, 0xd5, 0xe3, 0xcb, 0xff, 0xe8, 0x06, 0x0f, 0xc7,
+    0xf7, 0xce, 0xe0, 0x1c, 0xeb, 0x86, 0x73, 0xaa, 0x13, 0x26, 0xc8, 0x4f,
+    0x21, 0x10, 0xa8, 0x5f, 0xdb, 0x1d, 0x7d, 0x65, 0xce, 0xbf, 0xff, 0xc9,
+    0x1e, 0x7e, 0xab, 0xae, 0xe0, 0xfb, 0xe0, 0x25, 0xa3, 0xad, 0x88, 0x89,
+    0x11, 0x2f, 0xbe, 0xef, 0xb2, 0x73, 0xaf, 0xd9, 0x3b, 0x8e, 0xc3, 0xaf,
+    0xff, 0xff, 0xf4, 0x4b, 0xe7, 0xba, 0x91, 0xaf, 0x99, 0xfb, 0x63, 0x67,
+    0xcc, 0xe7, 0x33, 0x67, 0xef, 0xd3, 0xaf, 0xba, 0x2f, 0xb4, 0x75, 0x62,
+    0x60, 0xa2, 0x45, 0xa2, 0x8f, 0x42, 0x62, 0xff, 0xff, 0xbf, 0x76, 0x34,
+    0x9f, 0xae, 0x9e, 0x8e, 0xa7, 0xb5, 0x81, 0x3a, 0xca, 0xb0, 0x19, 0x23,
+    0xac, 0x59, 0x73, 0x08, 0x5e, 0x0b, 0xe7, 0x5f, 0x0c, 0x2c, 0xb2, 0x34,
+    0xa5, 0x12, 0xda, 0x3b, 0xb8, 0xaa, 0x1b, 0x72, 0x1a, 0x2b, 0x2d, 0xec,
+    0x2c, 0x46, 0x34, 0x8d, 0x43, 0x43, 0xd1, 0x95, 0xed, 0xa0, 0xdf, 0x35,
+    0xdd, 0xa6, 0x8a, 0xa2, 0xff, 0x72, 0x36, 0x6f, 0x2c, 0xf1, 0xd5, 0xc3,
+    0xe2, 0xfc, 0xb6, 0xff, 0xcf, 0x25, 0x73, 0x8d, 0x77, 0x69, 0xa2, 0x6b,
+    0xbc, 0xb7, 0xf1, 0xd6, 0x57, 0x11, 0x10, 0xb2, 0x37, 0x4a, 0xbf, 0x71,
+    0xae, 0xed, 0x34, 0x55, 0x97, 0xfd, 0x12, 0x8e, 0x4f, 0x1c, 0x9c, 0xeb,
+    0x2b, 0x87, 0xd8, 0x26, 0x77, 0xfd, 0xd8, 0xdf, 0xd1, 0xd7, 0x63, 0x3a,
+    0xff, 0xe0, 0x60, 0xab, 0x20, 0x6a, 0x77, 0x13, 0xa9, 0x53, 0xff, 0x83,
+    0xbb, 0xff, 0x95, 0x79, 0x2b, 0x9c, 0x6b, 0xbb, 0x4d, 0x12, 0x25, 0xfb,
+    0x8d, 0x77, 0x69, 0xa2, 0xd2, 0xbf, 0xf3, 0xc9, 0x5c, 0xe3, 0x5d, 0xda,
+    0x68, 0x9f, 0x6c, 0xae, 0x1f, 0xea, 0xcc, 0xef, 0xff, 0x2a, 0xb7, 0x92,
+    0xb9, 0xc6, 0xbb, 0xb4, 0xd1, 0x42, 0x5f, 0xfd, 0x8c, 0xab, 0xe5, 0x1f,
+    0x49, 0xe8, 0x3a, 0xfd, 0xef, 0xda, 0xfa, 0x3a, 0xf9, 0x27, 0x8e, 0x1d,
+    0x4b, 0x3c, 0x9e, 0x94, 0x5f, 0xb8, 0xd7, 0x76, 0x9a, 0x28, 0xfb, 0xfe,
+    0x89, 0x47, 0x27, 0x8e, 0x4e, 0x75, 0xff, 0xff, 0xfe, 0xfa, 0x9c, 0x9a,
+    0x3b, 0xcc, 0xeb, 0xfd, 0xd6, 0x28, 0xe2, 0x08, 0x18, 0x9b, 0xb0, 0x75,
+    0xf9, 0xf4, 0x9e, 0x83, 0xaf, 0xfa, 0x26, 0x81, 0x89, 0xbb, 0x07, 0x54,
+    0x23, 0xb1, 0x48, 0x48, 0x09, 0x2d, 0xff, 0xfd, 0x81, 0xec, 0x7d, 0x57,
+    0xc2, 0xe0, 0xd6, 0xa0, 0x05, 0x5e, 0x79, 0x2b, 0x0a, 0x82, 0xb0, 0x88,
+    0x4c, 0xfd, 0x19, 0x2e, 0xd9, 0xa5, 0xff, 0xd9, 0xd5, 0x7c, 0xa3, 0xe9,
+    0x3d, 0x07, 0x59, 0x59, 0xd5, 0xa0, 0x2e, 0x54, 0xc7, 0x99, 0x2a, 0x1b,
+    0x65, 0xc9, 0xe7, 0x0c, 0x24, 0x65, 0x8a, 0x2a, 0x52, 0x55, 0x5b, 0x28,
+    0x77, 0x78, 0x50, 0xa4, 0x29, 0xa6, 0x22, 0xec, 0x33, 0x80, 0x51, 0xe9,
+    0x72, 0xf7, 0xf9, 0x5c, 0xe3, 0x5d, 0xda, 0x68, 0x88, 0xaf, 0xec, 0xe3,
+    0x5d, 0xda, 0x68, 0x8a, 0xef, 0xf9, 0x8d, 0x5c, 0xe3, 0x5d, 0xda, 0x68,
+    0xae, 0x29, 0x54, 0x40, 0x39, 0xc5, 0xff, 0xe0, 0x40, 0xb5, 0x57, 0xf0,
+    0x3e, 0x8c, 0x8e, 0xbe, 0x56, 0x79, 0x98, 0xce, 0xb2, 0x6e, 0x7e, 0x60,
+    0x4b, 0xbe, 0xce, 0xbf, 0x8e, 0xbf, 0xd8, 0x9c, 0x00, 0x3f, 0xd1, 0xd6,
+    0x60, 0x09, 0xe9, 0xe8, 0x82, 0xff, 0xfe, 0xf6, 0x93, 0xae, 0x92, 0x41,
+    0xf7, 0xfd, 0xe6, 0x1d, 0x7e, 0xe3, 0x5d, 0xda, 0x68, 0xa7, 0xaf, 0xf2,
+    0xd0, 0x3f, 0xbf, 0x24, 0x75, 0xcb, 0x43, 0xaa, 0x0f, 0x21, 0xa6, 0x77,
+    0xff, 0xfa, 0x51, 0xed, 0x7e, 0xb6, 0xa0, 0x23, 0x3a, 0x9f, 0xb4, 0xeb,
+    0xff, 0xfb, 0x9c, 0xff, 0x9c, 0x81, 0xc5, 0x13, 0xbd, 0xcf, 0xa7, 0x5f,
+    0xfc, 0x92, 0xc1, 0x04, 0x2d, 0x39, 0x23, 0xaf, 0xf4, 0xa3, 0x93, 0xc7,
+    0x27, 0x3a, 0xfb, 0xe0, 0xbc, 0x8e, 0xbf, 0x3e, 0x75, 0x16, 0x75, 0x68,
+    0xf1, 0xf6, 0x11, 0x54, 0x22, 0x7f, 0x1e, 0xef, 0xfa, 0x05, 0xb9, 0xb3,
+    0x3d, 0xa3, 0xaf, 0xcf, 0x3c, 0x73, 0xf3, 0xa9, 0x84, 0xac, 0xfe, 0x0a,
+    0xf1, 0x65, 0xaf, 0x7b, 0x90, 0xa3, 0x0b, 0xae, 0x8c, 0x38, 0x36, 0x10,
+    0xed, 0x9c, 0x5f, 0xfe, 0x79, 0x2a, 0x11, 0x76, 0x75, 0xa8, 0x01, 0xd7,
+    0xff, 0x80, 0x0f, 0xf4, 0xaf, 0xd1, 0x75, 0x8c, 0x1d, 0x7f, 0xf0, 0xe0,
+    0x1c, 0x40, 0xaa, 0xd1, 0x67, 0x57, 0x11, 0x1d, 0xe4, 0xca, 0x55, 0x39,
+    0x20, 0xc2, 0x5d, 0x21, 0xb1, 0x6c, 0x3a, 0xfc, 0x31, 0xfb, 0x07, 0x47,
+    0x5f, 0xca, 0x71, 0xc2, 0xe2, 0x75, 0x04, 0xf9, 0xb0, 0x3d, 0xca, 0xef,
+    0xfe, 0x40, 0xf1, 0xf7, 0x57, 0x9c, 0x89, 0xce, 0xa5, 0x4f, 0xcf, 0xa5,
+    0xb7, 0x06, 0x0e, 0xbf, 0xff, 0x76, 0x39, 0x92, 0x47, 0xf6, 0x05, 0x3f,
+    0x69, 0x57, 0xe8, 0x90, 0x3f, 0x91, 0xd7, 0xcd, 0x77, 0x69, 0xa2, 0xb3,
+    0xa9, 0x8f, 0x57, 0x85, 0x17, 0xde, 0x45, 0xe8, 0xeb, 0xfa, 0x75, 0xc0,
+    0xcb, 0x47, 0x5f, 0xb3, 0xda, 0xfb, 0xa3, 0xaf, 0x44, 0xe8, 0x75, 0xfb,
+    0xc0, 0xfa, 0x32, 0x3a, 0xf7, 0xef, 0xa3, 0xaf, 0xfb, 0x24, 0x9f, 0xb1,
+    0xb1, 0x60, 0x59, 0xd7, 0xec, 0x9a, 0x7f, 0xc0, 0x75, 0x95, 0x85, 0x44,
+    0x41, 0x15, 0xc8, 0x54, 0x6e, 0x47, 0xc2, 0x15, 0x96, 0xf4, 0xa5, 0xc6,
+    0xc4, 0xa7, 0x43, 0x9f, 0x50, 0x6f, 0xfd, 0xd4, 0xf3, 0xf2, 0x78, 0x40,
+    0x9d, 0x7e, 0xf2, 0x0e, 0x2c, 0xeb, 0xe9, 0x38, 0xab, 0x87, 0xc5, 0xb4,
+    0x7b, 0x7f, 0xe7, 0x92, 0xb9, 0xc6, 0xbb, 0xb4, 0xd1, 0x22, 0xdf, 0xff,
+    0xbd, 0xdc, 0x15, 0x7c, 0xef, 0xbe, 0x94, 0x51, 0xce, 0xbf, 0xf3, 0xf9,
+    0x58, 0x4e, 0x27, 0xbf, 0x3a, 0x95, 0x46, 0xfc, 0x25, 0x3a, 0xbd, 0xfd,
+    0x9c, 0x6b, 0xbb, 0x4d, 0x16, 0x4d, 0xff, 0xef, 0x6b, 0xee, 0x95, 0xc9,
+    0xd0, 0x65, 0xa3, 0xa9, 0x54, 0x42, 0xe1, 0xc5, 0xff, 0xfe, 0x74, 0xf7,
+    0xfc, 0x7d, 0x2a, 0xde, 0xa7, 0x22, 0x5a, 0x3a, 0xfe, 0xce, 0x35, 0xdd,
+    0xa6, 0x8b, 0x62, 0xff, 0xfe, 0x60, 0x77, 0xe0, 0xe7, 0x3d, 0xae, 0xcd,
+    0xf3, 0xe7, 0x76, 0xce, 0xbd, 0xcf, 0xfa, 0x75, 0xde, 0x56, 0x11, 0x0f,
+    0xc6, 0xaa, 0x55, 0x1d, 0xc9, 0x0b, 0xfb, 0xd9, 0xac, 0x3a, 0xf9, 0xae,
+    0xed, 0x34, 0x5b, 0x77, 0xda, 0x9d, 0xf8, 0x75, 0x70, 0xf3, 0xfc, 0x5b,
+    0x7f, 0x27, 0x7c, 0x80, 0xfc, 0xeb, 0xfe, 0x89, 0x47, 0x27, 0x8e, 0x4e,
+    0x75, 0x95, 0x92, 0x3c, 0x71, 0xa6, 0x62, 0x21, 0x2d, 0xbf, 0xfd, 0x82,
+    0x05, 0x56, 0xe1, 0xcc, 0x15, 0x0e, 0xbc, 0xc2, 0xe8, 0x4e, 0xbd, 0x3f,
+    0x50, 0xeb, 0xff, 0x30, 0x98, 0x4c, 0x3f, 0xdd, 0xc1, 0x80, 0x1d, 0x7f,
+    0x40, 0xc8, 0x3f, 0xac, 0xeb, 0xe6, 0xbb, 0xb4, 0xd1, 0x78, 0x5f, 0xf9,
+    0xfd, 0x1b, 0x39, 0xcc, 0xdf, 0x47, 0x57, 0x0f, 0xb4, 0x4b, 0x6f, 0xbd,
+    0xb7, 0x9d, 0x3a, 0xfc, 0xb8, 0x19, 0x39, 0xd7, 0xfa, 0x50, 0x3e, 0xd8,
+    0xed, 0x3a, 0xff, 0x47, 0x9f, 0xbf, 0x03, 0x07, 0x5f, 0xfb, 0xea, 0xf7,
+    0x97, 0xb0, 0x7d, 0xa3, 0xae, 0xc5, 0x0e, 0xa8, 0x3d, 0x7c, 0x41, 0xbe,
+    0x49, 0xf1, 0x67, 0x5f, 0xb0, 0x41, 0xb5, 0x07, 0x5f, 0xa3, 0xef, 0xef,
+    0xa3, 0xaf, 0xfe, 0x5c, 0x37, 0xe6, 0x0f, 0xf2, 0xcd, 0x1d, 0x7f, 0xff,
+    0xe7, 0x4f, 0x3a, 0xdc, 0x40, 0xde, 0xa7, 0x25, 0xf6, 0x58, 0x27, 0x56,
+    0x22, 0xbf, 0xa8, 0xb7, 0xff, 0x67, 0x7a, 0xf2, 0x5a, 0x47, 0x24, 0x75,
+    0xd0, 0x03, 0xaa, 0x47, 0xaf, 0xe4, 0x2a, 0x60, 0x2e, 0x12, 0x30, 0x88,
+    0x18, 0xa0, 0xe4, 0xe9, 0x79, 0x09, 0xad, 0xc8, 0x50, 0x92, 0x62, 0x55,
+    0x99, 0xf6, 0x11, 0x4e, 0x40, 0x02, 0x11, 0x28, 0xd4, 0x36, 0x3c, 0xf3,
+    0x7f, 0xb7, 0x57, 0x00, 0xfc, 0xd1, 0xd7, 0xf8, 0x0a, 0xcd, 0x28, 0x1f,
+    0x1d, 0x4a, 0xa6, 0xa7, 0x10, 0xeb, 0xe1, 0xa5, 0xe4, 0xcd, 0xce, 0xbe,
+    0x6b, 0xbb, 0x4d, 0x17, 0xa5, 0xff, 0x93, 0xdd, 0x17, 0x90, 0x1c, 0x07,
+    0x57, 0x0f, 0xa5, 0x65, 0xb7, 0x96, 0x9e, 0x3a, 0xff, 0x9f, 0xd2, 0x85,
+    0x3c, 0x93, 0x9d, 0x4b, 0x3d, 0x41, 0x1b, 0xbf, 0x62, 0xfa, 0xe1, 0x3a,
+    0x82, 0x9a, 0x0e, 0x42, 0x13, 0xeb, 0xb6, 0xd1, 0x0d, 0xff, 0xfe, 0xd9,
+    0x82, 0xa8, 0x70, 0x3d, 0xc5, 0xad, 0xe5, 0x82, 0x75, 0xfe, 0x57, 0xd9,
+    0x34, 0x9c, 0x27, 0x52, 0x22, 0x53, 0xac, 0x14, 0xaa, 0x3f, 0x72, 0x1b,
+    0x75, 0x0d, 0xbf, 0xc4, 0xf0, 0xbf, 0x94, 0x25, 0xb2, 0x75, 0x31, 0xb1,
+    0x8a, 0x24, 0xa4, 0x59, 0xa3, 0x07, 0xe4, 0x63, 0x4b, 0x85, 0xa7, 0x48,
+    0xc1, 0x1a, 0x78, 0xc6, 0x33, 0xa4, 0x3f, 0xe7, 0x6f, 0xd9, 0x94, 0xe9,
+    0x77, 0xfd, 0x3a, 0xff, 0xef, 0xe2, 0x61, 0xcd, 0x8e, 0xb5, 0xa1, 0xd7,
+    0xd9, 0xd7, 0xf1, 0xd7, 0xfb, 0x13, 0x80, 0x07, 0xfa, 0x3a, 0xcc, 0x05,
+    0x11, 0x30, 0x28, 0xba, 0x20, 0xbe, 0xf4, 0x6f, 0x39, 0xd7, 0xfd, 0xed,
+    0x66, 0xf2, 0xef, 0xea, 0x1d, 0x48, 0x7b, 0xe2, 0x47, 0x7d, 0x1b, 0x22,
+    0x47, 0x5f, 0xb8, 0xd7, 0x76, 0x9a, 0x22, 0x3b, 0xff, 0xee, 0xff, 0xad,
+    0x62, 0xc7, 0x36, 0x7c, 0x86, 0x24, 0xeb, 0xfe, 0x89, 0xf9, 0x9e, 0xf2,
+    0x78, 0xeb, 0xc3, 0x1b, 0x9d, 0x52, 0x3d, 0x30, 0x9c, 0x5f, 0xf6, 0x73,
+    0x35, 0x8e, 0x33, 0x9d, 0x7b, 0x02, 0xb3, 0xaf, 0xff, 0xf7, 0x5d, 0x3d,
+    0x1d, 0x1c, 0xf7, 0x53, 0xb8, 0x8c, 0x9d, 0x7f, 0xff, 0xfb, 0xde, 0x45,
+    0xf1, 0x33, 0x71, 0xff, 0xd1, 0xdf, 0x9b, 0x13, 0xd3, 0x41, 0xd5, 0x08,
+    0xd9, 0xc5, 0xdb, 0xfc, 0xeb, 0xce, 0x4a, 0x16, 0x75, 0xd3, 0xac, 0xab,
+    0x99, 0x64, 0xab, 0xff, 0x2a, 0xde, 0xa4, 0xdd, 0x89, 0xd5, 0x01, 0xaf,
+    0x64, 0x5e, 0xfb, 0x64, 0x7a, 0x0e, 0xa9, 0x1f, 0xe2, 0x2d, 0x5f, 0xd8,
+    0xeb, 0xcd, 0xfc, 0x75, 0xfe, 0x75, 0x74, 0x9c, 0x70, 0x1d, 0x66, 0x33,
+    0xaf, 0xfa, 0x33, 0x78, 0x79, 0x3c, 0x8e, 0xa6, 0x20, 0xf2, 0x42, 0x27,
+    0x7f, 0x31, 0x8e, 0x75, 0xfc, 0x75, 0xfd, 0x0a, 0x60, 0xa2, 0x87, 0x5f,
+    0xd9, 0xed, 0xaf, 0x67, 0x4e, 0xac, 0x44, 0x48, 0x97, 0x68, 0xb2, 0xff,
+    0xfe, 0x6a, 0xbc, 0x71, 0x4f, 0x2b, 0xc8, 0xf0, 0xb8, 0x0e, 0xa6, 0x2d,
+    0x7a, 0xc5, 0x85, 0x0a, 0xf8, 0x84, 0xcc, 0x88, 0x30, 0x89, 0xa6, 0x7b,
+    0xc2, 0xad, 0x08, 0xa6, 0x36, 0xe4, 0x3d, 0x3a, 0x42, 0xf0, 0xdc, 0x01,
+    0x08, 0x96, 0x69, 0xef, 0xd0, 0xb0, 0xd8, 0x5d, 0x76, 0xd7, 0x4e, 0xbf,
+    0x71, 0xae, 0xed, 0x34, 0x45, 0xd7, 0xef, 0x03, 0xe8, 0xc8, 0xab, 0xf6,
+    0xbd, 0xd8, 0x01, 0xd7, 0xe7, 0x9e, 0x39, 0xf9, 0xd6, 0x56, 0x74, 0x62,
+    0x60, 0xcb, 0x99, 0xfe, 0x53, 0xb6, 0x4f, 0x4a, 0xaa, 0x27, 0x94, 0x7a,
+    0x77, 0xff, 0x2d, 0xe4, 0xae, 0x71, 0xae, 0xed, 0x34, 0x4c, 0xd7, 0xf3,
+    0x0c, 0xc3, 0xd8, 0x1a, 0x8f, 0x1d, 0x7b, 0x78, 0xd1, 0xd7, 0x9a, 0x8b,
+    0x3a, 0xf9, 0x85, 0xe7, 0x13, 0xae, 0xdb, 0x62, 0x0e, 0xbb, 0x3f, 0x3a,
+    0xff, 0xf7, 0x61, 0x6f, 0xec, 0xdc, 0x0b, 0xfb, 0xd3, 0xaf, 0x92, 0x7f,
+    0xc4, 0xeb, 0xf6, 0x4f, 0x80, 0x98, 0xea, 0xf8, 0x79, 0x5e, 0x22, 0xbf,
+    0xdf, 0x30, 0x5f, 0x80, 0xdb, 0x3a, 0xff, 0xfc, 0xb7, 0xee, 0x6e, 0x0e,
+    0xb2, 0xfd, 0x9b, 0xbf, 0x9d, 0x7f, 0x66, 0xa3, 0xe8, 0xc1, 0xd4, 0x14,
+    0x5d, 0xe1, 0xb7, 0x56, 0x6e, 0xd6, 0x1d, 0x76, 0xd7, 0x8e, 0xb3, 0x04,
+    0xeb, 0x02, 0x0d, 0x6f, 0xe3, 0x37, 0xff, 0xfe, 0x41, 0x86, 0x8c, 0x2f,
+    0xe4, 0x73, 0x89, 0xb3, 0x8e, 0xe0, 0x3a, 0x98, 0x85, 0x55, 0x8d, 0x1e,
+    0x41, 0x69, 0xa1, 0x2d, 0xd8, 0x6f, 0xb9, 0x78, 0x10, 0xbc, 0x4f, 0x7f,
+    0x33, 0x02, 0x39, 0xe3, 0xaf, 0x9f, 0xa9, 0x31, 0xd7, 0xdd, 0x9a, 0x02,
+    0x75, 0x61, 0xf7, 0x34, 0xad, 0xc8, 0x6f, 0xf3, 0x53, 0x04, 0x3d, 0x83,
+    0xa8, 0xeb, 0xf7, 0x5f, 0xd2, 0x01, 0xd7, 0xff, 0xbe, 0x75, 0xd3, 0xc0,
+    0xfc, 0x45, 0xe4, 0x75, 0x62, 0x2a, 0xda, 0x60, 0x81, 0x4b, 0x27, 0xbf,
+    0xff, 0xff, 0xff, 0xfc, 0xc5, 0x18, 0x18, 0xc5, 0x18, 0x4c, 0x3d, 0x87,
+    0xb5, 0x83, 0x0c, 0x39, 0x85, 0xc9, 0xf6, 0xb3, 0xf0, 0xb1, 0x58, 0xdb,
+    0xdf, 0xef, 0x58, 0x51, 0x0c, 0x26, 0x36, 0x1b, 0xdf, 0x3e, 0x77, 0x6c,
+    0xeb, 0xff, 0xf0, 0x37, 0x97, 0x7f, 0x8e, 0x2b, 0xd4, 0x6b, 0xf0, 0xeb,
+    0xff, 0xb7, 0x66, 0x3c, 0x14, 0x63, 0xd4, 0x2c, 0xeb, 0xff, 0xff, 0x22,
+    0xd3, 0x9d, 0xff, 0x52, 0x8d, 0x9c, 0x81, 0xf7, 0x72, 0x47, 0x5f, 0xf9,
+    0x3c, 0x8d, 0x40, 0xfb, 0x1a, 0x75, 0x62, 0x3c, 0x7c, 0x91, 0xb4, 0xdb,
+    0x7d, 0xed, 0xbc, 0xe9, 0xd7, 0xff, 0xf9, 0xc5, 0xa3, 0x81, 0xef, 0xff,
+    0x3b, 0x12, 0xe4, 0x4e, 0x75, 0x62, 0x21, 0xbf, 0x24, 0xbf, 0xff, 0xce,
+    0xa0, 0xe0, 0x3f, 0xd7, 0xc9, 0x27, 0x61, 0xa2, 0xe7, 0x5f, 0x79, 0x3a,
+    0x87, 0x5f, 0xf3, 0xf2, 0x5f, 0x31, 0xa1, 0xc3, 0xa9, 0x84, 0xb8, 0x15,
+    0x11, 0x96, 0x64, 0x69, 0x3d, 0x85, 0xc3, 0x91, 0x8b, 0x0f, 0xe4, 0x16,
+    0xe1, 0xd7, 0xf7, 0xb1, 0x7b, 0xe2, 0xce, 0xb7, 0x70, 0xde, 0xa0, 0x85,
+    0xfe, 0xfc, 0x2f, 0x2d, 0x24, 0x8e, 0xbf, 0xff, 0x05, 0x06, 0x7c, 0xd2,
+    0x3f, 0x55, 0x65, 0x96, 0x4a, 0xbf, 0xbd, 0xd8, 0x9f, 0xbf, 0x9d, 0x7f,
+    0x6f, 0x2d, 0x03, 0xf9, 0x8e, 0xbf, 0xe9, 0xf0, 0x01, 0xfd, 0xf9, 0x23,
+    0xaf, 0xe7, 0x70, 0xec, 0xc0, 0x9d, 0x79, 0xdd, 0xa6, 0x8b, 0x3e, 0xfe,
+    0x03, 0x8c, 0x91, 0x67, 0x54, 0xe8, 0xb9, 0x09, 0xd3, 0x4b, 0x40, 0x4f,
+    0x7f, 0xe4, 0xec, 0x49, 0x3d, 0x1e, 0xd1, 0xd7, 0xff, 0xb9, 0xd7, 0xf9,
+    0x9b, 0x07, 0x35, 0x82, 0x75, 0xff, 0x42, 0x07, 0x16, 0xce, 0x74, 0xeb,
+    0xff, 0xb5, 0xe4, 0x99, 0x97, 0x0c, 0x6f, 0xa3, 0xa9, 0x11, 0x8e, 0xe9,
+    0x5f, 0x9b, 0xde, 0x65, 0x96, 0x4a, 0xbf, 0xf3, 0xcb, 0x43, 0x8d, 0x0e,
+    0x70, 0xa5, 0x4b, 0xfb, 0xf6, 0xd7, 0xeb, 0xc0, 0x9d, 0x7f, 0xbd, 0xdc,
+    0xd9, 0xf2, 0x4b, 0x3a, 0xb0, 0xf8, 0xbf, 0x2b, 0xbf, 0xf6, 0xf2, 0x1f,
+    0xc1, 0xf1, 0xab, 0x01, 0xd7, 0x42, 0x87, 0x5f, 0xf0, 0x60, 0x60, 0x12,
+    0xea, 0x1d, 0x50, 0x88, 0xf9, 0xd0, 0xd0, 0x5a, 0xff, 0x75, 0x02, 0x2e,
+    0xf3, 0x1d, 0x7f, 0x83, 0xdf, 0xdc, 0x1b, 0x78, 0x75, 0x41, 0xf3, 0xa1,
+    0x8d, 0xff, 0x20, 0x87, 0xe8, 0x7f, 0xf6, 0x8e, 0xbd, 0x02, 0xa1, 0xd5,
+    0x25, 0xdc, 0x30, 0x92, 0xb4, 0xcf, 0x75, 0x89, 0x8b, 0xf9, 0x0e, 0xa5,
+    0x9f, 0x76, 0x30, 0x30, 0x27, 0x0c, 0x2b, 0xb5, 0x0b, 0x1f, 0x42, 0x5b,
+    0x61, 0x07, 0xd3, 0xbb, 0xfe, 0xff, 0xda, 0x1c, 0x9a, 0x16, 0x75, 0xfe,
+    0x76, 0x7a, 0x91, 0xc8, 0x3a, 0x94, 0x3e, 0xae, 0x1c, 0xdf, 0xfb, 0x89,
+    0xa9, 0x7d, 0xec, 0x0c, 0x1d, 0x7d, 0xc4, 0x85, 0x9d, 0x7f, 0xfe, 0xf2,
+    0x9f, 0xc6, 0x07, 0xb9, 0xad, 0xe5, 0x1d, 0x3a, 0xb8, 0x8b, 0x55, 0x9f,
+    0x09, 0x05, 0xcf, 0x23, 0xaf, 0xff, 0xff, 0xe1, 0x76, 0x7d, 0x9d, 0x1c,
+    0xf7, 0xe0, 0x5b, 0xc9, 0xc3, 0x02, 0xfc, 0x79, 0x1d, 0x7f, 0xb3, 0xbd,
+    0xff, 0xce, 0x27, 0x5f, 0xf3, 0x73, 0xad, 0x7e, 0x3c, 0x8e, 0xbc, 0x93,
+    0x68, 0xea, 0x83, 0xd3, 0x59, 0xbd, 0x90, 0x29, 0xa0, 0x4c, 0x2b, 0xc8,
+    0x42, 0xae, 0x10, 0xb7, 0xf7, 0xc4, 0xeb, 0xad, 0x0e, 0xbd, 0xb3, 0x02,
+    0x75, 0xb9, 0x39, 0xe5, 0x4c, 0x5b, 0x7f, 0xec, 0x67, 0x6b, 0x99, 0xb4,
+    0x3f, 0xb2, 0x75, 0x42, 0xa7, 0x7e, 0xc6, 0xde, 0xf0, 0x98, 0x12, 0xab,
+    0xff, 0xff, 0xe0, 0x6b, 0x30, 0x54, 0xfb, 0xc1, 0x8c, 0xea, 0xba, 0x1c,
+    0x9d, 0x78, 0xb3, 0xaf, 0xdf, 0x60, 0x7e, 0xac, 0xea, 0xc4, 0x54, 0x79,
+    0xfa, 0xfd, 0xb1, 0xfb, 0x1f, 0x4e, 0xbf, 0xfe, 0xff, 0x79, 0x68, 0x3d,
+    0x8e, 0x05, 0xdd, 0x93, 0xab, 0x11, 0x3c, 0x84, 0x42, 0x55, 0x7b, 0x51,
+    0x39, 0xd7, 0xfd, 0x18, 0xde, 0xa6, 0xc7, 0xe1, 0xd7, 0x67, 0x4e, 0xa1,
+    0x3c, 0xdd, 0xb3, 0x8a, 0x92, 0x2e, 0xb4, 0x5b, 0xe6, 0x9b, 0xdd, 0xfd,
+    0x93, 0xaf, 0x03, 0xf6, 0x9d, 0x7b, 0xd9, 0xf4, 0xeb, 0xfa, 0x37, 0xd7,
+    0xce, 0x41, 0xd7, 0x83, 0xfb, 0x4e, 0xbe, 0x08, 0xc4, 0x8e, 0xa4, 0x37,
+    0xae, 0x3b, 0x41, 0x47, 0x1e, 0xe3, 0xc8, 0x3a, 0xb1, 0xde, 0xb6, 0x5d,
+    0x8d, 0x3a, 0xfe, 0xe2, 0x6c, 0xc1, 0xd1, 0xd7, 0xf6, 0xfe, 0xce, 0xfe,
+    0xc6, 0x75, 0xfd, 0xcc, 0xef, 0x7f, 0xf1, 0xd7, 0xee, 0x8c, 0x67, 0x0c,
+    0xbf, 0xb3, 0x93, 0xfe, 0xe1, 0x34, 0x41, 0xaa, 0x9a, 0x5b, 0x72, 0x74,
+    0x4f, 0xc9, 0x4e, 0xa1, 0x1f, 0x69, 0x0d, 0x1b, 0xf3, 0xb5, 0x17, 0x07,
+    0x5f, 0xd2, 0xe8, 0xbe, 0xfe, 0x3a, 0x9a, 0x7a, 0x42, 0x4b, 0x7d, 0xf4,
+    0x5e, 0x73, 0xab, 0x0f, 0x13, 0x44, 0x37, 0xe8, 0xf7, 0xc5, 0xb2, 0x75,
+    0xfe, 0x92, 0x2e, 0x3b, 0xf4, 0x27, 0x5f, 0xfe, 0x8c, 0x1d, 0xfd, 0x9c,
+    0x49, 0xdd, 0x67, 0x5f, 0x9d, 0x9f, 0x67, 0x74, 0x7f, 0x9e, 0x34, 0xa6,
+    0x2d, 0x57, 0xfc, 0x0a, 0xca, 0x32, 0x8c, 0x85, 0xe7, 0x08, 0x46, 0x14,
+    0xd7, 0xb5, 0x92, 0x3a, 0xfc, 0x9b, 0xc9, 0x04, 0xeb, 0xc9, 0xdc, 0x3a,
+    0xe8, 0x5e, 0x1e, 0x03, 0x49, 0xaf, 0xe6, 0x71, 0x71, 0xc5, 0x0e, 0xbe,
+    0x0e, 0xbb, 0x07, 0x5f, 0x87, 0x8c, 0xbc, 0xe7, 0x54, 0x1f, 0xbe, 0x17,
+    0x39, 0x0d, 0xdf, 0x89, 0xd5, 0x09, 0xa0, 0x22, 0xdf, 0x21, 0x47, 0xa2,
+    0xcb, 0xdd, 0xc1, 0x3a, 0xff, 0x4d, 0x13, 0xad, 0xe6, 0x83, 0xaf, 0xff,
+    0x9d, 0x4f, 0x47, 0x01, 0xc8, 0xf0, 0xb8, 0x0e, 0xbf, 0x87, 0x01, 0x83,
+    0x23, 0xaf, 0xff, 0x94, 0xf9, 0xf4, 0x5f, 0xda, 0x4d, 0xfa, 0x8c, 0x9d,
+    0x61, 0xc3, 0xff, 0x72, 0xaa, 0xc4, 0xd0, 0x1c, 0x68, 0x4d, 0x3f, 0x86,
+    0x6d, 0xda, 0xd8, 0x75, 0xf2, 0x0b, 0x84, 0xeb, 0xff, 0x2f, 0x3d, 0xaf,
+    0xba, 0x79, 0x61, 0xd7, 0xed, 0x47, 0x3d, 0x07, 0x2a, 0x6f, 0xe8, 0x28,
+    0x95, 0xd2, 0xf5, 0xfb, 0xec, 0xce, 0xfc, 0x3a, 0xfb, 0xb8, 0x9b, 0x0e,
+    0xbf, 0xb4, 0x9c, 0xcf, 0xf8, 0x75, 0xff, 0xfe, 0x89, 0xbe, 0x23, 0x7f,
+    0xe6, 0xbf, 0xf8, 0xb4, 0xf7, 0x50, 0xea, 0xc4, 0xeb, 0xd2, 0x15, 0xab,
+    0x23, 0xe9, 0x4f, 0x88, 0xb6, 0x8b, 0x6e, 0x5b, 0x00, 0xd1, 0x7e, 0x5f,
+    0x6b, 0x99, 0x87, 0x5f, 0xfd, 0x2f, 0x7f, 0x29, 0x2f, 0xde, 0x85, 0x9d,
+    0x7f, 0xbd, 0xa8, 0x9f, 0x34, 0x13, 0xae, 0xee, 0x1d, 0x7f, 0xfd, 0xd8,
+    0x0e, 0x37, 0xe6, 0x0e, 0x07, 0xb0, 0x75, 0xff, 0xc9, 0x83, 0x99, 0xaf,
+    0x92, 0xd2, 0xce, 0xbf, 0xf3, 0xc6, 0xf2, 0xf9, 0xad, 0xc3, 0x07, 0x50,
+    0x53, 0x80, 0xdc, 0x81, 0x11, 0x98, 0xcc, 0xe6, 0x15, 0xd2, 0x77, 0x90,
+    0xef, 0x29, 0x1c, 0x3a, 0xfe, 0x0c, 0x03, 0x99, 0xb9, 0xd4, 0xa9, 0xe4,
+    0xac, 0x72, 0xff, 0x42, 0xf1, 0x39, 0x34, 0x8e, 0xb9, 0x26, 0x3a, 0xff,
+    0xf7, 0xa3, 0xa2, 0xf3, 0xc7, 0x38, 0xf2, 0x3a, 0xf7, 0x92, 0x73, 0xaf,
+    0xc0, 0x7d, 0xe2, 0x63, 0xaf, 0x0c, 0x34, 0xeb, 0xff, 0x82, 0x93, 0x76,
+    0x39, 0xbc, 0xa3, 0x87, 0x5f, 0xfe, 0x41, 0x7d, 0xf5, 0xac, 0xe0, 0x7b,
+    0x87, 0x57, 0xc4, 0xd2, 0x50, 0x59, 0x69, 0x0e, 0x38, 0x25, 0x1a, 0x1a,
+    0xda, 0x45, 0xb4, 0x1d, 0x7b, 0xa9, 0xe3, 0xad, 0xb3, 0x0d, 0x57, 0xd0,
+    0xfa, 0x85, 0xd1, 0x00, 0xaf, 0x64, 0x74, 0xe9, 0x0b, 0x2e, 0x91, 0xbc,
+    0x6f, 0x60, 0x84, 0x8d, 0xff, 0x60, 0xc8, 0x71, 0x70, 0xd3, 0xaf, 0xdd,
+    0x4d, 0x98, 0x13, 0xaf, 0xfc, 0x18, 0x1c, 0x1f, 0xe5, 0x9a, 0x3a, 0xfc,
+    0xeb, 0x4d, 0xac, 0x3a, 0xf7, 0xa3, 0x73, 0xab, 0x0f, 0x11, 0xca, 0x2f,
+    0x42, 0x4c, 0x75, 0xe1, 0x62, 0x36, 0x8e, 0xbf, 0x64, 0xeb, 0x8d, 0x1d,
+    0x7f, 0xff, 0xe8, 0xea, 0x2d, 0x59, 0xa4, 0xfc, 0xfb, 0xd4, 0xdf, 0x4d,
+    0x49, 0xce, 0xa0, 0xa7, 0xa6, 0xa1, 0xaa, 0x14, 0x4d, 0x08, 0x0e, 0x90,
+    0x08, 0xde, 0x88, 0xf6, 0x89, 0xef, 0xbe, 0x3c, 0x98, 0x93, 0xaf, 0xfe,
+    0xcd, 0x98, 0x1c, 0x1f, 0xe5, 0x9a, 0x3a, 0xfd, 0xc8, 0xef, 0xd0, 0x9d,
+    0x5c, 0x3e, 0xd7, 0x44, 0xbe, 0x84, 0x9e, 0x0e, 0xbe, 0x65, 0xf3, 0x47,
+    0x5f, 0xf4, 0x96, 0xf2, 0xf6, 0xa1, 0x43, 0xaa, 0x0f, 0x69, 0xc8, 0x6f,
+    0x69, 0x04, 0xeb, 0xf0, 0xb7, 0xe6, 0xb7, 0x3a, 0xb0, 0xf1, 0x1c, 0x6a,
+    0x98, 0xd3, 0xb4, 0x78, 0x4a, 0x80, 0x84, 0x5e, 0xbf, 0x64, 0xba, 0x79,
+    0x1d, 0x79, 0x3a, 0x87, 0x56, 0xe6, 0xc7, 0xc2, 0xf7, 0xdf, 0x7f, 0x7d,
+    0x1d, 0x7f, 0x7f, 0xa8, 0x9b, 0xfe, 0x1d, 0x7b, 0xfc, 0xdc, 0xea, 0xe9,
+    0xe6, 0xf8, 0xc2, 0xff, 0x4b, 0xf1, 0x9f, 0x49, 0xb9, 0xd7, 0xc0, 0x06,
+    0x6e, 0x75, 0xfd, 0xb5, 0xec, 0x71, 0x69, 0xd7, 0xfd, 0xfb, 0xc8, 0x39,
+    0x80, 0xd1, 0xd7, 0xf8, 0x09, 0xbe, 0xf2, 0xcf, 0x1d, 0x5d, 0x3e, 0xcd,
+    0x1c, 0x5f, 0xb7, 0xd2, 0xd1, 0x8c, 0xeb, 0xff, 0xf6, 0x6b, 0xe7, 0x5d,
+    0x3c, 0x0f, 0xc4, 0x5e, 0x47, 0x54, 0x22, 0x00, 0x4a, 0xef, 0xe7, 0x9c,
+    0x0e, 0x21, 0x3a, 0x9a, 0xa8, 0x0a, 0x62, 0x2e, 0x1a, 0xf4, 0x8b, 0xd0,
+    0x9a, 0xd9, 0x0a, 0x2d, 0xb2, 0x1b, 0xfd, 0xf6, 0x1b, 0xb7, 0x9c, 0x83,
+    0xaf, 0xe8, 0xea, 0x72, 0x16, 0x75, 0x74, 0xf8, 0x7c, 0x6d, 0x50, 0xad,
+    0xb3, 0x25, 0x39, 0xbc, 0x35, 0xee, 0x9b, 0xf3, 0xac, 0xb3, 0xab, 0x73,
+    0x50, 0xc1, 0x18, 0xbf, 0xfa, 0x39, 0x9b, 0x1e, 0x40, 0xcc, 0x09, 0xd7,
+    0xf3, 0xef, 0x21, 0x80, 0x9d, 0x7f, 0xd1, 0xbc, 0x90, 0x56, 0xfe, 0x3a,
+    0x9c, 0xf8, 0xc4, 0xb2, 0xfc, 0xf2, 0xc9, 0xe0, 0xeb, 0xff, 0xa3, 0x5a,
+    0xc5, 0xf8, 0x61, 0x7a, 0x3a, 0xff, 0xe4, 0x8d, 0x0b, 0xcb, 0xe6, 0xb3,
+    0x87, 0x5f, 0xff, 0xe4, 0xd4, 0xf8, 0xce, 0x0f, 0xfb, 0x50, 0xae, 0x0b,
+    0xf0, 0xeb, 0xfd, 0xbc, 0xb5, 0x34, 0xa2, 0x73, 0xa8, 0x29, 0xa2, 0x34,
+    0x98, 0x50, 0xbc, 0x87, 0xfb, 0x1d, 0xff, 0xff, 0xba, 0x9b, 0xfb, 0x37,
+    0xf7, 0x39, 0x1e, 0x07, 0xd1, 0x97, 0x70, 0xeb, 0xc1, 0x71, 0x3a, 0xf7,
+    0x23, 0x61, 0xd4, 0x13, 0x6f, 0xc1, 0xab, 0xff, 0x4a, 0x07, 0xdc, 0x4d,
+    0x98, 0x13, 0xaf, 0xfc, 0xfd, 0x6a, 0x3f, 0xcd, 0x3f, 0x4e, 0xbf, 0xba,
+    0xe3, 0xbc, 0x90, 0xeb, 0xff, 0xf6, 0x87, 0xe7, 0x5d, 0x3c, 0x0f, 0xc4,
+    0x5e, 0x47, 0x5f, 0xee, 0xa2, 0x9b, 0x7f, 0xf1, 0x43, 0xaf, 0xfa, 0x19,
+    0x5f, 0x61, 0x06, 0x73, 0xaf, 0xff, 0x87, 0x35, 0x8b, 0x86, 0xe7, 0x93,
+    0x98, 0x75, 0xb1, 0xa8, 0xbc, 0xf1, 0xce, 0xc3, 0x8b, 0xfa, 0x7c, 0xe2,
+    0x36, 0x0e, 0xbe, 0x10, 0xc2, 0xce, 0xbf, 0xfe, 0xfc, 0x7d, 0xae, 0xa4,
+    0xc3, 0x0b, 0x79, 0x1d, 0x7d, 0x83, 0xfb, 0x9d, 0x4b, 0x3e, 0xfd, 0x89,
+    0xf7, 0xf3, 0x83, 0x02, 0xf2, 0x3a, 0xa1, 0x1b, 0xd9, 0x08, 0xf4, 0x24,
+    0xa4, 0x4c, 0xf3, 0xb1, 0x85, 0x54, 0x2f, 0x4b, 0xce, 0x4c, 0x18, 0x53,
+    0x64, 0x6c, 0x8d, 0x4b, 0x48, 0x53, 0x4c, 0x43, 0xd3, 0xe7, 0x3e, 0x01,
+    0x60, 0xc6, 0x23, 0xe8, 0xdc, 0xef, 0xfe, 0xc1, 0x06, 0x67, 0x35, 0xe8,
+    0xc3, 0xaf, 0xfb, 0x7f, 0x67, 0x12, 0x77, 0x59, 0xd6, 0xc0, 0x1f, 0xc8,
+    0xa0, 0x5e, 0x60, 0xc9, 0x0e, 0xbe, 0x81, 0x79, 0x1d, 0x7e, 0xc6, 0x37,
+    0x10, 0x7c, 0x37, 0xdc, 0x1f, 0xbf, 0xb6, 0x75, 0x23, 0x9a, 0x3a, 0xff,
+    0xdd, 0x45, 0x87, 0x26, 0x8c, 0xe1, 0xd7, 0xd0, 0x07, 0x59, 0xd7, 0x0c,
+    0xb0, 0xf7, 0x44, 0xf6, 0xfb, 0x49, 0xe8, 0x3a, 0xa0, 0xf2, 0xdc, 0xae,
+    0xf9, 0xbd, 0x49, 0x8e, 0xbf, 0xff, 0x0e, 0x28, 0xa2, 0x07, 0xa9, 0x37,
+    0x53, 0x7f, 0x1d, 0x50, 0x7f, 0x38, 0x45, 0x79, 0xaf, 0xc3, 0xaf, 0xda,
+    0x6c, 0x71, 0x43, 0xab, 0xa7, 0x86, 0x01, 0xbb, 0xfd, 0x92, 0xc4, 0x0f,
+    0x50, 0xeb, 0xff, 0xb3, 0x7f, 0x69, 0x06, 0x00, 0xeb, 0x3a, 0xf4, 0x97,
+    0xd3, 0xaa, 0x73, 0xde, 0xf2, 0x15, 0xf2, 0x28, 0x8c, 0x9d, 0x58, 0x78,
+    0xa2, 0x47, 0x77, 0xcc, 0x3a, 0xfb, 0x43, 0x0b, 0x3a, 0xa0, 0xdb, 0xee,
+    0x2f, 0x7b, 0xb2, 0x59, 0xd7, 0x75, 0x0e, 0xac, 0x36, 0x3e, 0x1c, 0xa8,
+    0x5c, 0x35, 0x93, 0x26, 0x20, 0xa9, 0x0d, 0x6e, 0xc2, 0x65, 0xd8, 0xc4,
+    0x8b, 0x50, 0xd3, 0xfd, 0x5f, 0x6d, 0x4a, 0xf0, 0x56, 0xd3, 0xad, 0xd3,
+    0xac, 0x03, 0xae, 0xd4, 0x8e, 0xa0, 0x1b, 0x6d, 0x08, 0x7e, 0x21, 0x7f,
+    0x4f, 0x34, 0x98, 0x5c, 0x9c, 0xeb, 0xcf, 0x9c, 0x3a, 0xf0, 0xe7, 0x8e,
+    0xae, 0x9b, 0x41, 0x1a, 0xbb, 0xc2, 0x75, 0xe8, 0xdf, 0x47, 0x5f, 0x20,
+    0xcb, 0x0e, 0xbd, 0x3b, 0x89, 0xd4, 0x13, 0xd6, 0x58, 0xe7, 0x87, 0xef,
+    0xd9, 0xee, 0xa7, 0x8e, 0xbf, 0x3e, 0xf9, 0xbf, 0x8e, 0xb2, 0x9d, 0x3c,
+    0xef, 0x13, 0x5c, 0x9c, 0x3a, 0xfe, 0x9f, 0xe4, 0xee, 0xfd, 0x3a, 0x98,
+    0x84, 0xf7, 0xe1, 0xa6, 0x44, 0x18, 0xd6, 0x8f, 0xbd, 0x29, 0x71, 0x5b,
+    0xfe, 0xc0, 0x85, 0x37, 0xcd, 0xfc, 0x75, 0xf3, 0x46, 0x24, 0x75, 0x74,
+    0xf6, 0x5c, 0xe6, 0xff, 0x46, 0x7a, 0x3a, 0xe1, 0x3a, 0xa7, 0x3d, 0x10,
+    0x90, 0xdf, 0xfc, 0x18, 0x0f, 0x23, 0xc8, 0xd4, 0x09, 0xd7, 0xd3, 0x46,
+    0xd4, 0x8e, 0xbf, 0xbc, 0xd0, 0x85, 0x7c, 0x3a, 0xff, 0xa6, 0xd6, 0xc7,
+    0x19, 0xff, 0x09, 0xd7, 0xd9, 0xec, 0x59, 0xd7, 0x0a, 0x87, 0x5b, 0x4e,
+    0x6d, 0xbf, 0x20, 0xbf, 0xbb, 0xfc, 0xf3, 0x75, 0x0e, 0xbe, 0x11, 0xcf,
+    0x1d, 0x50, 0x9d, 0x08, 0x48, 0xf1, 0x09, 0x42, 0x54, 0x2e, 0x99, 0xcf,
+    0xa4, 0xfe, 0x30, 0xbf, 0xbe, 0x4d, 0x1e, 0x1d, 0x87, 0x5f, 0xfe, 0x18,
+    0xd9, 0xc8, 0xe6, 0x27, 0x60, 0x27, 0x5e, 0x17, 0x59, 0xd5, 0x24, 0x49,
+    0xe1, 0x8a, 0x24, 0x59, 0x56, 0x21, 0xf0, 0x41, 0x98, 0xb3, 0xc6, 0x1e,
+    0x38, 0xc5, 0x46, 0xe2, 0x56, 0x84, 0xf0, 0xef, 0x94, 0x36, 0x03, 0x38,
+    0x8b, 0x93, 0xcf, 0x2a, 0x46, 0x96, 0xd9, 0x69, 0xfb, 0xca, 0x47, 0x48,
+    0xc4, 0xe6, 0x96, 0x93, 0xc8, 0xea, 0xd7, 0x1c, 0x0f, 0x67, 0xc0, 0x1e,
+    0x52, 0x60, 0x25, 0x17, 0x30, 0x61, 0x06, 0x32, 0xe3, 0xb5, 0x3d, 0xf5,
+    0xe9, 0xd6, 0xff, 0xe1, 0x3c, 0xca, 0x96, 0xdc, 0xa0, 0xef, 0xb2, 0xac,
+    0x76, 0xa3, 0x04, 0xa5, 0x5f, 0x0e, 0x57, 0xb7, 0x82, 0xad, 0x7f, 0xf9,
+    0x55, 0xbc, 0x95, 0xce, 0x35, 0xdd, 0xa6, 0x89, 0xb2, 0xff, 0x2b, 0x9c,
+    0x6b, 0xbb, 0x4d, 0x15, 0x6d, 0xfe, 0x94, 0xbf, 0xf0, 0xc4, 0x8e, 0xbe,
+    0xce, 0xbf, 0x8e, 0xb3, 0x03, 0x0f, 0x4c, 0x4c, 0xef, 0xfb, 0x07, 0x17,
+    0x12, 0xff, 0x87, 0x5f, 0xee, 0x63, 0x60, 0x1f, 0x56, 0x75, 0xff, 0x47,
+    0x62, 0x7e, 0x46, 0x04, 0xea, 0x6a, 0x28, 0xb8, 0x6f, 0xd3, 0x4b, 0xf4,
+    0x71, 0x7d, 0x09, 0xd7, 0x83, 0x82, 0x75, 0xe7, 0x76, 0x9a, 0x2b, 0x4b,
+    0xf2, 0x9b, 0xeb, 0xfd, 0xce, 0xa6, 0x9e, 0x9a, 0x13, 0xdf, 0xfe, 0x4f,
+    0x4a, 0x1b, 0xd4, 0xf6, 0x9f, 0x73, 0xab, 0x87, 0xd5, 0xb0, 0x86, 0xff,
+    0xf7, 0x51, 0x70, 0xdc, 0x5e, 0x0f, 0xb6, 0xce, 0xbf, 0xfe, 0x6c, 0x73,
+    0x00, 0xeb, 0x79, 0x42, 0x34, 0xeb, 0xff, 0xe9, 0x6b, 0x06, 0x16, 0xf9,
+    0xef, 0x42, 0xce, 0xbb, 0xde, 0x84, 0x4c, 0x3a, 0x65, 0xff, 0xff, 0xe8,
+    0xd8, 0x9e, 0xd6, 0x28, 0xde, 0xa7, 0xb2, 0x61, 0x85, 0xcf, 0x8c, 0x9d,
+    0x7f, 0xa3, 0xcf, 0xdf, 0x81, 0x83, 0xaf, 0xa5, 0xe4, 0x9c, 0xeb, 0xf7,
+    0xdf, 0x0c, 0x00, 0xea, 0xdc, 0xf2, 0xb6, 0x11, 0x5f, 0xe7, 0x97, 0x92,
+    0x7e, 0xa1, 0xd5, 0x07, 0xae, 0x84, 0xb7, 0xec, 0xea, 0x62, 0xce, 0xbf,
+    0xf8, 0x5d, 0x1b, 0xd7, 0xfe, 0x7e, 0x21, 0xd5, 0x39, 0xf4, 0x74, 0x96,
+    0xff, 0x4a, 0x39, 0x3c, 0x72, 0x73, 0xaf, 0x67, 0x00, 0x75, 0xfa, 0x6c,
+    0x0a, 0xd8, 0xce, 0xbf, 0x86, 0x19, 0xde, 0x5a, 0x3a, 0x90, 0xfd, 0x26,
+    0x1b, 0xda, 0x2b, 0xa8, 0x46, 0xd6, 0x42, 0xa2, 0xff, 0xff, 0xfe, 0xc4,
+    0x6e, 0x7a, 0x07, 0xda, 0xf9, 0x08, 0x1c, 0x5f, 0xce, 0x42, 0x49, 0xf4,
+    0x75, 0xfd, 0x9e, 0x71, 0x07, 0xe7, 0x5f, 0xdd, 0xf8, 0x93, 0xb8, 0x9d,
+    0x7f, 0xa1, 0x7a, 0x08, 0xbb, 0x27, 0x54, 0x91, 0x19, 0x85, 0x82, 0x5d,
+    0x65, 0x58, 0x4b, 0xec, 0xf1, 0x0c, 0xc9, 0xcc, 0x02, 0x4f, 0x90, 0xd7,
+    0x69, 0x22, 0x43, 0x8b, 0x85, 0xab, 0x7a, 0xec, 0x35, 0x1e, 0x11, 0x03,
+    0x0f, 0xdd, 0x13, 0x7a, 0x31, 0x3b, 0xf7, 0x1a, 0xee, 0xd3, 0x45, 0x81,
+    0x7e, 0x76, 0xfd, 0xec, 0xc7, 0x59, 0x5c, 0x3d, 0xdd, 0x19, 0xdf, 0xb8,
+    0xd7, 0x76, 0x9a, 0x27, 0x5b, 0xff, 0xfd, 0xd8, 0x9c, 0x38, 0xb5, 0x75,
+    0xac, 0xea, 0x6b, 0xf9, 0xce, 0xbf, 0x2a, 0xb7, 0x92, 0xb8, 0x89, 0x79,
+    0x8c, 0xef, 0x29, 0x0b, 0x3a, 0xf9, 0xdb, 0xf5, 0x67, 0x5e, 0x96, 0x95,
+    0x50, 0xdf, 0xec, 0x1c, 0xbf, 0x71, 0xae, 0xed, 0x34, 0x5b, 0x37, 0xf7,
+    0x9f, 0xbf, 0x03, 0x07, 0x5f, 0xff, 0xd2, 0x57, 0x50, 0x98, 0x14, 0xcd,
+    0x67, 0x86, 0x0e, 0xa8, 0x44, 0x2b, 0x97, 0x5f, 0xf8, 0x11, 0xa5, 0x7a,
+    0x8d, 0x7e, 0x1d, 0x7f, 0xd1, 0x28, 0xe4, 0xf1, 0xc9, 0xce, 0xb2, 0xb8,
+    0x9a, 0x82, 0xe1, 0x70, 0xe4, 0x22, 0x7d, 0x7f, 0xe1, 0x55, 0x7f, 0xa7,
+    0x85, 0xf6, 0x8e, 0xbf, 0xfb, 0xfd, 0x2b, 0x9c, 0x7d, 0x75, 0xe4, 0x75,
+    0xce, 0x0c, 0x44, 0x30, 0x10, 0x6f, 0x9a, 0xee, 0xd3, 0x45, 0xcd, 0x65,
+    0x9d, 0x5c, 0x37, 0xac, 0x96, 0xdf, 0xee, 0x0e, 0x6e, 0x04, 0x91, 0xd7,
+    0x4c, 0xb3, 0xa8, 0xeb, 0x2b, 0x87, 0xea, 0x84, 0x4c, 0x99, 0x6d, 0x8b,
+    0xdf, 0xb8, 0xd7, 0x76, 0x9a, 0x2e, 0xfb, 0xfd, 0x25, 0x75, 0xce, 0x23,
+    0x27, 0x59, 0x5c, 0x3e, 0x87, 0x33, 0xbe, 0x55, 0x40, 0x80, 0xea, 0x87,
+    0xd2, 0xfd, 0xcb, 0xc3, 0xc1, 0x69, 0xbe, 0xea, 0xe9, 0x3f, 0xf3, 0xc8,
+    0xd2, 0x97, 0x0b, 0xf7, 0x84, 0x08, 0x23, 0x87, 0x18, 0x66, 0xea, 0x1b,
+    0xfe, 0x85, 0x6f, 0xd2, 0x7b, 0xff, 0x32, 0xe3, 0x3e, 0x90, 0x77, 0x91,
+    0xd7, 0xff, 0x64, 0xf8, 0xcf, 0x73, 0x58, 0x82, 0x75, 0xc8, 0xaf, 0x51,
+    0x02, 0x27, 0xf7, 0xed, 0x69, 0x6f, 0x23, 0xaf, 0xff, 0xff, 0xfd, 0xd4,
+    0xea, 0x40, 0xf8, 0x5d, 0x4c, 0xf7, 0xfe, 0x4f, 0x6b, 0xa9, 0xc8, 0x9d,
+    0xf8, 0xd3, 0xae, 0xd4, 0x1d, 0x7f, 0xf6, 0xed, 0xfd, 0xf7, 0xf6, 0x60,
+    0xa8, 0x75, 0xe1, 0x75, 0x61, 0x31, 0xa6, 0x93, 0xea, 0x13, 0x1e, 0x15,
+    0xbd, 0xfb, 0xac, 0xeb, 0xf6, 0x6d, 0x7a, 0x14, 0x3a, 0xdb, 0x47, 0x54,
+    0xe6, 0xf7, 0x0a, 0xab, 0x87, 0xf4, 0x2b, 0x37, 0xfe, 0xd3, 0xa9, 0xd4,
+    0x81, 0xfe, 0x0e, 0xbf, 0xf7, 0x5f, 0xcf, 0xdd, 0xe5, 0x9e, 0x3a, 0xb0,
+    0xfe, 0xd0, 0xf6, 0xe7, 0x01, 0xd7, 0xff, 0xff, 0x85, 0xd9, 0x1c, 0xf7,
+    0xb2, 0x78, 0x17, 0x53, 0x4b, 0x8c, 0x10, 0x9d, 0x7b, 0x3e, 0xe8, 0xea,
+    0xc4, 0x53, 0x70, 0x57, 0x69, 0xd2, 0xff, 0x77, 0x02, 0x9b, 0x39, 0x87,
+    0x5e, 0x77, 0x69, 0xa2, 0x57, 0xbf, 0xca, 0x38, 0x83, 0xd9, 0xd3, 0xa9,
+    0xa7, 0xb2, 0x84, 0xf7, 0xff, 0xbd, 0xdc, 0x93, 0x7a, 0x81, 0x81, 0xf1,
+    0xd5, 0x24, 0x7a, 0xf2, 0x11, 0x82, 0x43, 0x74, 0xa7, 0x3a, 0xff, 0xff,
+    0x3e, 0xfa, 0xce, 0x7b, 0xcf, 0x3f, 0xd5, 0x87, 0xa8, 0xa1, 0xd7, 0xf7,
+    0xfb, 0xfb, 0xb0, 0x03, 0xaf, 0xfc, 0x2e, 0xc8, 0x7b, 0x13, 0xe3, 0x27,
+    0x5f, 0xff, 0xb1, 0x01, 0x8b, 0x4f, 0x6a, 0x16, 0xfb, 0xf8, 0xeb, 0xfe,
+    0x85, 0xfb, 0x26, 0x92, 0x78, 0xea, 0x92, 0x22, 0xfc, 0xa7, 0x7d, 0xfb,
+    0xf2, 0x47, 0x5f, 0xf4, 0x34, 0x62, 0x70, 0x3f, 0x8e, 0xbf, 0xff, 0xc9,
+    0xe7, 0x5b, 0x88, 0x3a, 0xcb, 0x8c, 0xed, 0x49, 0xce, 0xa0, 0xa2, 0xe5,
+    0x08, 0x9c, 0xde, 0xff, 0xbf, 0x02, 0xde, 0x5a, 0xe0, 0x4e, 0xbf, 0xff,
+    0xd8, 0x83, 0xec, 0x1f, 0x82, 0xe1, 0x81, 0x9e, 0x38, 0x75, 0xb3, 0xc8,
+    0x97, 0xd8, 0x75, 0x7f, 0xdb, 0x83, 0x39, 0x99, 0xed, 0x1d, 0x41, 0x55,
+    0x9b, 0x90, 0xca, 0xec, 0x37, 0x06, 0x18, 0xbf, 0x4a, 0xaf, 0xfb, 0x37,
+    0xd0, 0x61, 0xc6, 0x73, 0xaf, 0xf9, 0xe5, 0xae, 0xc7, 0x3e, 0x84, 0xea,
+    0xc3, 0xf2, 0xf1, 0xc5, 0xff, 0xde, 0x4d, 0x89, 0xe9, 0xa5, 0x03, 0xe3,
+    0xaf, 0xff, 0x3e, 0x4b, 0xb8, 0x83, 0x80, 0xdb, 0xc3, 0xaf, 0x3c, 0x95,
+    0x85, 0xfb, 0x09, 0x42, 0x70, 0x30, 0xc6, 0xc8, 0xc9, 0xd6, 0x68, 0x01,
+    0x71, 0x65, 0xd4, 0xaf, 0xcf, 0x43, 0x37, 0xe9, 0x0e, 0xd2, 0x2d, 0xff,
+    0xec, 0xea, 0xa3, 0x81, 0x41, 0xf6, 0x74, 0xeb, 0xde, 0x80, 0x95, 0x7f,
+    0xfb, 0xae, 0x9e, 0x89, 0x27, 0x27, 0xfc, 0x05, 0x5f, 0xe7, 0x6a, 0xa1,
+    0xe3, 0x05, 0x58, 0x3e, 0x5d, 0x0d, 0xd9, 0x50, 0xb2, 0xe3, 0x1b, 0x1a,
+    0x42, 0xe9, 0x0f, 0xbe, 0x86, 0x5e, 0xc8, 0x56, 0x5f, 0xfe, 0x55, 0x6f,
+    0x25, 0x73, 0x8d, 0x77, 0x69, 0xa2, 0x61, 0xbf, 0xff, 0xb3, 0x63, 0x87,
+    0xb0, 0xaf, 0xbb, 0x81, 0xff, 0xda, 0x3a, 0xff, 0xf7, 0x1c, 0x0a, 0xa9,
+    0xe9, 0x33, 0x1a, 0x91, 0xd7, 0x62, 0xa2, 0x8a, 0xbf, 0xab, 0xd7, 0xff,
+    0x30, 0x33, 0x79, 0x7e, 0xfe, 0x18, 0x91, 0xd7, 0xec, 0x5f, 0xcd, 0xd8,
+    0xce, 0xbf, 0xa1, 0x78, 0x08, 0xd8, 0x75, 0x04, 0xf6, 0xba, 0x5b, 0x7f,
+    0xb9, 0x8d, 0x80, 0x7d, 0x59, 0xd7, 0xee, 0xc0, 0x51, 0x43, 0xa9, 0x0f,
+    0xf7, 0x84, 0x5b, 0x46, 0x97, 0xfa, 0x1e, 0x7f, 0x28, 0xfc, 0x3a, 0xfc,
+    0xfc, 0x93, 0xac, 0xea, 0x13, 0xd9, 0xfc, 0xce, 0xff, 0x6a, 0x30, 0x43,
+    0xd8, 0x3a, 0xfe, 0x8c, 0x10, 0xf6, 0x0e, 0xbd, 0xff, 0x26, 0xf8, 0x7b,
+    0x5a, 0x30, 0xbf, 0xfd, 0xc4, 0xff, 0x14, 0xcf, 0x7f, 0x1b, 0x84, 0xeb,
+    0xff, 0xf2, 0x73, 0xaf, 0xf0, 0x39, 0x2e, 0xc6, 0xc0, 0xc1, 0xd7, 0xfc,
+    0xcf, 0xde, 0xc3, 0x7a, 0x93, 0x1d, 0x7d, 0xfa, 0xf0, 0x27, 0x5b, 0x37,
+    0x3d, 0xed, 0xa3, 0xcb, 0xfa, 0x39, 0x12, 0xd6, 0x1d, 0x4d, 0x4e, 0x3f,
+    0x87, 0x1d, 0x4c, 0x18, 0x5a, 0xf8, 0xae, 0xfe, 0x5c, 0x60, 0xfb, 0x6c,
+    0xeb, 0x68, 0xeb, 0xf4, 0x60, 0xfb, 0x6c, 0xeb, 0xfb, 0xa9, 0xed, 0x3e,
+    0xff, 0x0f, 0x9a, 0x62, 0xe5, 0x88, 0x5f, 0xe9, 0x7a, 0x17, 0xb0, 0x12,
+    0x3a, 0xff, 0xff, 0x33, 0xb5, 0xec, 0xef, 0xc1, 0xc9, 0xd3, 0x07, 0x79,
+    0x68, 0xeb, 0xf3, 0x3e, 0xce, 0xb4, 0xeb, 0x0e, 0x22, 0x39, 0xd9, 0xaf,
+    0xff, 0x78, 0x5c, 0x1d, 0xc4, 0x0f, 0xfe, 0xd1, 0xd7, 0xfd, 0x13, 0xfd,
+    0x97, 0x7f, 0x79, 0xce, 0xa8, 0x44, 0x37, 0x12, 0x6f, 0xfe, 0xcd, 0xe5,
+    0xf3, 0xae, 0xd8, 0x10, 0x9d, 0x7f, 0x6c, 0xfb, 0xe1, 0x80, 0x1d, 0x7f,
+    0xfa, 0x3c, 0x08, 0x96, 0x6f, 0xe9, 0xff, 0x64, 0xeb, 0xda, 0x70, 0x1d,
+    0x50, 0x89, 0x84, 0x30, 0xf2, 0x6d, 0xfc, 0xe0, 0xe7, 0x13, 0x87, 0x5e,
+    0xf7, 0xcc, 0x3a, 0x80, 0x79, 0x3f, 0x4b, 0x2f, 0xed, 0x22, 0x8b, 0x7f,
+    0x1d, 0x7f, 0xff, 0xee, 0x66, 0xc8, 0x1f, 0x7c, 0xfa, 0x31, 0xd7, 0x4f,
+    0x47, 0xb4, 0x75, 0xfc, 0x39, 0xaf, 0x8d, 0x61, 0x1d, 0x5b, 0xa3, 0x37,
+    0x85, 0xbb, 0x1b, 0xaf, 0xbe, 0x6c, 0xda, 0x9c, 0xea, 0xc3, 0xdd, 0x50,
+    0xce, 0xcc, 0x67, 0x5d, 0xec, 0x3a, 0xff, 0xf3, 0x04, 0x61, 0x6e, 0x9d,
+    0x7f, 0x76, 0x0e, 0xa8, 0x3d, 0xff, 0xc5, 0x6f, 0xf7, 0x52, 0x67, 0x6e,
+    0xa4, 0x75, 0xfc, 0x3e, 0x75, 0xa7, 0x8e, 0xbf, 0xf2, 0x7b, 0xfe, 0x3e,
+    0xbe, 0x2f, 0xc7, 0x54, 0x1f, 0x63, 0x95, 0xdf, 0xf6, 0x26, 0x2c, 0x72,
+    0x77, 0x3a, 0xfd, 0x1e, 0xd0, 0x3f, 0x3a, 0x98, 0x84, 0xec, 0x31, 0xc9,
+    0xa4, 0x5d, 0x84, 0xf8, 0x90, 0x78, 0xd6, 0xff, 0xfd, 0xd1, 0xcf, 0x75,
+    0x33, 0x7f, 0x66, 0xc8, 0xd1, 0xd7, 0xff, 0x38, 0xf6, 0x10, 0x29, 0xac,
+    0x91, 0xd7, 0xa0, 0x1f, 0x4e, 0xbf, 0xb3, 0x67, 0x50, 0x13, 0x1d, 0x58,
+    0x8e, 0x17, 0x55, 0x14, 0x0d, 0x0e, 0xde, 0xfa, 0x1c, 0x3a, 0xf3, 0x07,
+    0x4c, 0x23, 0xa9, 0xcf, 0x07, 0x43, 0xb7, 0xdf, 0x17, 0xf1, 0xa7, 0x5f,
+    0xe1, 0x76, 0x63, 0xd9, 0x39, 0xd7, 0xed, 0xd9, 0x9b, 0x50, 0x75, 0x95,
+    0x61, 0x33, 0x48, 0xa2, 0x31, 0xf0, 0xc2, 0x2b, 0x25, 0x05, 0xb6, 0x16,
+    0xbb, 0xaa, 0xcd, 0x0c, 0x3e, 0x42, 0xb1, 0x64, 0x5d, 0x86, 0xe8, 0x1d,
+    0xc6, 0x34, 0xed, 0x47, 0xa5, 0xe8, 0xd0, 0x7f, 0x7b, 0x64, 0x87, 0x6c,
+    0x9b, 0xe9, 0x95, 0xff, 0xf7, 0x13, 0x79, 0x69, 0x3d, 0xd8, 0xe7, 0xa0,
+    0xeb, 0xf7, 0x1a, 0xee, 0xd3, 0x45, 0x5d, 0x7b, 0x90, 0xb3, 0xaf, 0xfa,
+    0x4a, 0xe7, 0x1a, 0xee, 0xd3, 0x44, 0x79, 0x7f, 0xd1, 0x28, 0xe4, 0xf1,
+    0xc9, 0xce, 0xbf, 0xf4, 0x79, 0x3f, 0x60, 0xe4, 0xa7, 0x98, 0xeb, 0x2a,
+    0x14, 0xd7, 0xf1, 0x3f, 0x86, 0x6e, 0x36, 0x28, 0xba, 0x39, 0xbf, 0x71,
+    0xae, 0xed, 0x34, 0x58, 0x37, 0x94, 0x89, 0xce, 0xbf, 0xff, 0x87, 0xf7,
+    0x9d, 0x79, 0xb7, 0xff, 0x33, 0x92, 0xfb, 0x23, 0xaf, 0xd8, 0x39, 0xed,
+    0x1d, 0x7f, 0xb8, 0xeb, 0xfb, 0xc7, 0xdc, 0xeb, 0x2b, 0x89, 0x86, 0x28,
+    0x66, 0xd1, 0xd7, 0x62, 0xfa, 0x4b, 0x7f, 0x95, 0xce, 0x35, 0xdd, 0xa6,
+    0x8b, 0x2a, 0xfd, 0xc6, 0xbb, 0xb4, 0xd1, 0x69, 0xdf, 0xf3, 0x87, 0xaf,
+    0x37, 0x51, 0x67, 0x59, 0x5c, 0x3e, 0xb5, 0x99, 0xdf, 0x98, 0x7b, 0x14,
+    0x62, 0x18, 0x86, 0x2c, 0xeb, 0xfe, 0x61, 0x75, 0x19, 0x0b, 0xbb, 0x4e,
+    0xbf, 0x30, 0xf6, 0x06, 0xb2, 0x0e, 0xbf, 0xdf, 0x57, 0x9e, 0xd2, 0x68,
+    0xeb, 0x21, 0xd4, 0xc2, 0x3c, 0x3d, 0xb3, 0x4b, 0xff, 0xf9, 0x3a, 0xe3,
+    0xe9, 0x67, 0x32, 0x04, 0x73, 0xc7, 0x5f, 0xb6, 0x38, 0x71, 0x67, 0x5f,
+    0x2e, 0x37, 0xd1, 0xd7, 0xff, 0x26, 0x38, 0x22, 0x5c, 0x8c, 0x13, 0xaa,
+    0x48, 0xde, 0xc5, 0x59, 0x8a, 0x04, 0x8a, 0xfd, 0xf3, 0x9c, 0xff, 0xa7,
+    0x5f, 0x91, 0x48, 0x16, 0x9d, 0x6c, 0xd1, 0xe8, 0xf8, 0xae, 0xff, 0xf8,
+    0x5b, 0xd4, 0xea, 0x72, 0x26, 0x67, 0x3a, 0x75, 0xff, 0x96, 0xb7, 0x96,
+    0xdf, 0xfd, 0x4e, 0x1d, 0x7e, 0x7d, 0x7a, 0x02, 0x75, 0x41, 0xf4, 0x7e,
+    0x85, 0x50, 0x8d, 0x9e, 0xc2, 0xde, 0xfa, 0x3e, 0xc7, 0x4e, 0xbe, 0x6b,
+    0xbb, 0x4d, 0x16, 0xe5, 0xf4, 0xd0, 0x1c, 0x3a, 0xff, 0xd9, 0xcc, 0x1f,
+    0x9d, 0xcd, 0xd9, 0x3a, 0xfc, 0x20, 0x7d, 0xf4, 0x75, 0x41, 0xf3, 0xba,
+    0x05, 0x6e, 0x8f, 0x7e, 0x11, 0x39, 0x6e, 0xa1, 0x11, 0x7f, 0x9c, 0x41,
+    0x30, 0xc2, 0xce, 0xbc, 0xb1, 0x43, 0xac, 0x27, 0x5f, 0xf7, 0x7f, 0x7d,
+    0x66, 0x0a, 0x87, 0x5f, 0xb4, 0xfb, 0xb8, 0x4e, 0xb2, 0x04, 0xf7, 0xfc,
+    0x71, 0x50, 0x8a, 0xfc, 0x1a, 0xeb, 0x75, 0xff, 0x43, 0x8f, 0x73, 0x05,
+    0xa7, 0x5f, 0xef, 0x79, 0x27, 0x5c, 0x09, 0xd5, 0x23, 0xe6, 0xc3, 0x4b,
+    0xfe, 0x81, 0xfd, 0x71, 0xaf, 0x21, 0xd7, 0xa3, 0x38, 0x75, 0xfe, 0xec,
+    0x49, 0x36, 0xf1, 0x67, 0x50, 0x4f, 0x3b, 0x43, 0x57, 0xef, 0x9b, 0xe9,
+    0x14, 0x3a, 0xcf, 0x39, 0xe6, 0xee, 0x45, 0x7f, 0xf4, 0xb3, 0xa9, 0xc0,
+    0xf6, 0x05, 0xa7, 0x5f, 0xed, 0xe5, 0x03, 0xec, 0x01, 0xd7, 0xda, 0x02,
+    0x78, 0xea, 0x74, 0x5f, 0x68, 0xa7, 0xf4, 0x2f, 0xa6, 0x57, 0xff, 0x79,
+    0x01, 0x12, 0x0f, 0x60, 0x5a, 0x75, 0xfd, 0xe9, 0x67, 0x33, 0x47, 0x51,
+    0xd7, 0xbf, 0x7f, 0x1d, 0x77, 0xf0, 0x75, 0x48, 0xd9, 0x78, 0x72, 0x8e,
+    0xbe, 0xdd, 0xa9, 0xc3, 0xaf, 0x42, 0xd5, 0xc4, 0x44, 0xee, 0x78, 0xb2,
+    0x1f, 0x05, 0x54, 0x26, 0x8d, 0x88, 0x49, 0x0b, 0x5b, 0xc3, 0xed, 0xb3,
+    0xaf, 0x7c, 0x62, 0xd8, 0xb3, 0xaf, 0xfa, 0x4a, 0xe7, 0x1a, 0xee, 0xd3,
+    0x45, 0x0f, 0x48, 0x88, 0xb9, 0x87, 0x9c, 0xa2, 0xfc, 0x08, 0x6e, 0x2c,
+    0xeb, 0xe8, 0x9b, 0x02, 0x75, 0x70, 0xf1, 0xf4, 0x4d, 0x7f, 0xd9, 0x01,
+    0xec, 0x6d, 0x44, 0xc7, 0x5f, 0xe0, 0x27, 0x7b, 0x80, 0x73, 0xa9, 0x67,
+    0xd6, 0x03, 0xaa, 0x84, 0x57, 0xbc, 0x23, 0x6f, 0xfc, 0xe1, 0x80, 0xf5,
+    0x05, 0x16, 0x75, 0xff, 0xb6, 0x3f, 0x34, 0xfd, 0xd4, 0x4e, 0x75, 0xfe,
+    0xd7, 0xed, 0xcf, 0x0c, 0x1d, 0x4b, 0x45, 0x6f, 0x4e, 0xfc, 0x81, 0x7f,
+    0xf7, 0xf2, 0xeb, 0xf3, 0x7f, 0x42, 0x4e, 0x75, 0xfe, 0x94, 0x72, 0x78,
+    0xe4, 0xe7, 0x5f, 0x9f, 0x5b, 0x33, 0x47, 0x54, 0x1e, 0xe0, 0x0d, 0x2f,
+    0xc9, 0xed, 0x3a, 0x1d, 0x7f, 0xdc, 0x07, 0x1c, 0x7d, 0x80, 0x3a, 0x80,
+    0x7b, 0x9f, 0x92, 0xde, 0xfb, 0xc9, 0x1d, 0x7f, 0x7d, 0xf7, 0xf1, 0x93,
+    0x9d, 0x52, 0x3c, 0xe9, 0x87, 0xaf, 0xfe, 0x68, 0xc7, 0x87, 0x36, 0x67,
+    0x24, 0x75, 0xff, 0x7e, 0x2a, 0x7d, 0xef, 0x7f, 0xd1, 0xd7, 0xf8, 0x45,
+    0xfd, 0xf6, 0x1a, 0x75, 0xf0, 0x82, 0x70, 0x1d, 0x58, 0x7a, 0x88, 0x65,
+    0x7f, 0xb5, 0xf3, 0xdf, 0x03, 0x82, 0x75, 0x80, 0x75, 0x93, 0x73, 0xc6,
+    0xe1, 0xb5, 0xf9, 0xf7, 0xd7, 0x90, 0xea, 0x84, 0xeb, 0x70, 0x8d, 0x10,
+    0xfb, 0x09, 0x21, 0x66, 0xd1, 0x45, 0xf9, 0xff, 0x52, 0x3e, 0x9d, 0x7e,
+    0x61, 0x67, 0x23, 0x47, 0x54, 0xc7, 0xa8, 0x25, 0x57, 0xfc, 0xfa, 0x89,
+    0xb7, 0x96, 0x6c, 0x3a, 0xff, 0xfc, 0x1e, 0xc7, 0xd5, 0x7c, 0x2e, 0x0d,
+    0x6a, 0x00, 0x55, 0xc1, 0xc3, 0xaf, 0xd3, 0xc4, 0xef, 0xa3, 0xab, 0x11,
+    0x28, 0x8a, 0xee, 0x2b, 0x70, 0x3f, 0x3a, 0xfe, 0x70, 0x4c, 0x30, 0x13,
+    0xaf, 0xf8, 0x72, 0x70, 0xf7, 0x07, 0xc7, 0x54, 0x1f, 0xd7, 0x45, 0xc4,
+    0xb2, 0xca, 0xb1, 0x2d, 0x91, 0x2b, 0x16, 0x86, 0xc5, 0x0f, 0x18, 0x67,
+    0x38, 0x8c, 0x1e, 0x50, 0x8d, 0x0c, 0x60, 0x19, 0x18, 0xf2, 0x88, 0x4d,
+    0x87, 0x06, 0xf0, 0x94, 0x42, 0x19, 0xa3, 0x90, 0xe4, 0x70, 0xab, 0x85,
+    0xf7, 0x63, 0x25, 0x78, 0x69, 0x80, 0xc0, 0x61, 0x45, 0xa7, 0xdf, 0x4a,
+    0x1e, 0xfe, 0x15, 0xbb, 0x08, 0xb6, 0xe1, 0x9f, 0xf6, 0x14, 0xf7, 0xd1,
+    0xc9, 0x2c, 0xeb, 0xcf, 0xc5, 0x0e, 0xb2, 0xb3, 0x9b, 0xd6, 0x48, 0x6f,
+    0xf2, 0xb9, 0xc6, 0xbb, 0xb4, 0xd1, 0x79, 0xd4, 0x3a, 0x88, 0x89, 0x38,
+    0x06, 0x30, 0x2c, 0xa6, 0xa9, 0x6f, 0x2a, 0x7f, 0x91, 0xb4, 0x2d, 0x4f,
+    0xb0, 0xaa, 0x1a, 0xc9, 0x37, 0x52, 0x82, 0xb6, 0x15, 0x5f, 0xe5, 0x73,
+    0x8d, 0x77, 0x69, 0xa2, 0x96, 0xbf, 0x71, 0xae, 0xed, 0x34, 0x58, 0x57,
+    0xff, 0xe8, 0xc1, 0x0c, 0x76, 0x37, 0xf6, 0x0b, 0xac, 0xeb, 0xfb, 0xfe,
+    0x24, 0xee, 0xb3, 0xac, 0xae, 0x22, 0xc9, 0x66, 0x7b, 0x6a, 0x37, 0xf9,
+    0x5c, 0xe3, 0x5d, 0xda, 0x68, 0xb2, 0xee, 0xe2, 0x87, 0x5f, 0x2a, 0xa3,
+    0x0c, 0xc4, 0x9d, 0x45, 0x5e, 0x57, 0xea, 0xce, 0xa6, 0x9e, 0xbe, 0x8b,
+    0xbf, 0x0a, 0xa1, 0x44, 0xf6, 0x9b, 0xae, 0x8e, 0x9d, 0x60, 0x1d, 0x72,
+    0x93, 0x9d, 0x6e, 0x48, 0xd4, 0x60, 0x85, 0x34, 0xf8, 0xdc, 0xf6, 0xff,
+    0x9f, 0x71, 0xcd, 0xfd, 0x0a, 0x1d, 0x7f, 0xa7, 0xdf, 0x50, 0x1f, 0x21,
+    0xd7, 0xe8, 0xcd, 0x91, 0xa3, 0xad, 0x0e, 0x7b, 0x6c, 0x9a, 0x53, 0xa2,
+    0xec, 0x61, 0x29, 0x7c, 0xf2, 0x90, 0x4e, 0xbf, 0x9f, 0x91, 0xe7, 0xe9,
+    0xd7, 0x99, 0x65, 0x92, 0xaf, 0xfa, 0x25, 0xbf, 0xb9, 0x19, 0xb9, 0x4a,
+    0x97, 0xf7, 0xfd, 0xfb, 0xef, 0x9e, 0x4d, 0xd9, 0x3a, 0xe8, 0xd1, 0xd4,
+    0x14, 0xc1, 0x3a, 0x42, 0x29, 0x5a, 0x49, 0xd8, 0x77, 0x73, 0x0c, 0xc4,
+    0x9d, 0x7f, 0x23, 0xe8, 0x1a, 0xfc, 0xeb, 0xff, 0x92, 0x4f, 0xa7, 0x1f,
     0xdb, 0x9a, 0x2a, 0xff, 0xfe, 0xea, 0x7b, 0xb9, 0xa1, 0xc5, 0xff, 0xae,
     0xbc, 0x8e, 0xbf, 0xd1, 0x2f, 0x3f, 0x5c, 0x27, 0x54, 0x23, 0x37, 0x10,
     0xb8, 0xb5, 0x69, 0x1d, 0x69, 0x1d, 0x69, 0x1d, 0x50, 0x6c, 0x14, 0x10,
-    0x41, 0x0b, 0xff, 0xf7, 0xb4, 0x8d, 0xc1, 0xe4, 0x0e, 0x07, 0x14, 0x3a,
-    0xdb, 0x9d, 0x76, 0xbf, 0x3a, 0xb0, 0xfe, 0xb4, 0xa5, 0xe1, 0x1b, 0x92,
-    0x0e, 0xbf, 0x86, 0x16, 0x31, 0x87, 0x5d, 0x28, 0x3a, 0x82, 0x7a, 0x53,
-    0x0a, 0x7e, 0x53, 0x7f, 0xff, 0xfd, 0xd8, 0xf6, 0x93, 0x5a, 0x8f, 0x75,
-    0x23, 0x80, 0x5b, 0xca, 0x5e, 0x50, 0xeb, 0x93, 0x73, 0xae, 0x85, 0x9d,
-    0x7f, 0xfe, 0x81, 0xfe, 0x52, 0x8f, 0x77, 0x17, 0xf6, 0x00, 0x75, 0xff,
-    0xf2, 0x0f, 0xf2, 0xcd, 0x72, 0x12, 0x4f, 0xa2, 0xaa, 0x48, 0xa3, 0xf2,
-    0xb5, 0xcd, 0x56, 0x17, 0xbd, 0x67, 0x84, 0x28, 0x61, 0xb9, 0x91, 0x95,
-    0x35, 0x33, 0x90, 0xfa, 0x75, 0xe1, 0x85, 0x3e, 0xa1, 0x01, 0xe3, 0x1d,
-    0x8f, 0xbb, 0x62, 0xdf, 0x61, 0x71, 0x7f, 0xf9, 0x55, 0xbc, 0x95, 0xce,
-    0x35, 0xdd, 0xa6, 0x8a, 0x32, 0xfd, 0xb2, 0x39, 0x00, 0x3a, 0xfc, 0x2e,
-    0x08, 0xfa, 0x75, 0xff, 0xdb, 0xb5, 0x39, 0xdc, 0xc1, 0x96, 0x8e, 0xb2,
-    0xb0, 0x89, 0x2e, 0x94, 0x78, 0x9e, 0xa4, 0xcb, 0x05, 0xe4, 0x3c, 0x56,
-    0x72, 0xf3, 0xfa, 0x5a, 0x87, 0x57, 0xa1, 0xd3, 0x7f, 0xf2, 0xaf, 0x25,
-    0x73, 0x8d, 0x77, 0x69, 0xa2, 0x39, 0xbf, 0xfc, 0xaa, 0xde, 0x4a, 0xe7,
-    0x1a, 0xee, 0xd3, 0x44, 0xe5, 0x7f, 0x95, 0xce, 0x35, 0xdd, 0xa6, 0x8b,
-    0x32, 0xff, 0xa5, 0xa7, 0x5a, 0xbd, 0xf0, 0x0e, 0xbf, 0xe6, 0x1c, 0x1c,
-    0x5c, 0x6f, 0x0b, 0x3a, 0xff, 0x81, 0xc8, 0xf7, 0x5f, 0x79, 0x1d, 0x7f,
-    0xb3, 0x5c, 0xe6, 0x6f, 0xa3, 0xaf, 0xee, 0x37, 0xae, 0x8c, 0x13, 0xae,
-    0xdd, 0x67, 0x59, 0x56, 0x21, 0x1e, 0x30, 0x7d, 0x23, 0x9f, 0xcc, 0xf6,
-    0xcc, 0x2f, 0xf2, 0xb9, 0xc6, 0xbb, 0xb4, 0xd1, 0x6e, 0xdf, 0xc2, 0xea,
-    0xf2, 0x7e, 0x9d, 0x79, 0x37, 0x01, 0xd7, 0xee, 0x35, 0xdd, 0xa6, 0x8a,
-    0x42, 0xff, 0xd9, 0xd4, 0xd9, 0xdc, 0xc1, 0x69, 0xd7, 0x9e, 0x4a, 0xe1,
-    0xf8, 0x68, 0xce, 0xca, 0xb5, 0x1d, 0xbc, 0x2e, 0x5c, 0x23, 0x2f, 0xfe,
-    0x55, 0xe4, 0xae, 0x71, 0xae, 0xed, 0x34, 0x4a, 0x55, 0x3a, 0xe1, 0x24,
-    0xca, 0x2b, 0x57, 0x73, 0xf0, 0x46, 0x56, 0x2b, 0x3e, 0x8c, 0xb3, 0x68,
-    0xf2, 0xff, 0x49, 0x07, 0xd8, 0x81, 0x3a, 0xf6, 0xbf, 0x59, 0xd6, 0x57,
-    0x73, 0xcd, 0x43, 0x0b, 0xc2, 0xf2, 0x3a, 0xff, 0xcf, 0x25, 0x73, 0x8d,
-    0x77, 0x69, 0xa2, 0x76, 0xba, 0x76, 0x33, 0xaf, 0xff, 0xc8, 0x1f, 0xd7,
-    0x1b, 0x4e, 0x11, 0x81, 0xc6, 0x9d, 0x7f, 0xd1, 0x28, 0xe4, 0xf1, 0xc9,
-    0xce, 0xb2, 0xb8, 0x98, 0x62, 0xc6, 0xba, 0x94, 0xe3, 0x42, 0xab, 0x7f,
-    0xfc, 0xaf, 0xdd, 0xb7, 0x10, 0x67, 0xa0, 0x50, 0x07, 0x5f, 0xfc, 0xeb,
-    0xee, 0x35, 0xfb, 0x1f, 0x64, 0x75, 0xe4, 0x0b, 0x9d, 0x7f, 0xf0, 0xe7,
-    0x5e, 0x7c, 0xd0, 0xbe, 0xe7, 0x5d, 0xb6, 0xa8, 0x51, 0x41, 0xd4, 0x4d,
-    0x0d, 0x54, 0x95, 0x5b, 0x2e, 0x33, 0x5d, 0x27, 0xed, 0xc3, 0xca, 0xff,
-    0xfe, 0x0b, 0xf9, 0x5c, 0xd4, 0x0e, 0xe0, 0xd6, 0xa0, 0x07, 0x5f, 0xb8,
-    0xd7, 0x76, 0x9a, 0x22, 0xcb, 0xff, 0x3c, 0x95, 0xce, 0x35, 0xdd, 0xa6,
-    0x89, 0x76, 0xff, 0xfe, 0xc0, 0xf6, 0x3e, 0xab, 0xe1, 0x70, 0x6b, 0x50,
-    0x02, 0xac, 0xae, 0x23, 0x65, 0x66, 0x7b, 0x69, 0x57, 0xff, 0x2d, 0xe4,
-    0xae, 0x71, 0xae, 0xed, 0x34, 0x4c, 0x57, 0xff, 0xd8, 0xd8, 0x57, 0xae,
-    0x9b, 0x68, 0x0c, 0x09, 0xd4, 0xaa, 0x28, 0x3a, 0xa1, 0x7e, 0xe3, 0x5d,
-    0xda, 0x68, 0xaa, 0x6d, 0x87, 0x56, 0x1e, 0x12, 0x86, 0x77, 0xff, 0xff,
-    0xb8, 0xfd, 0xde, 0x59, 0xe5, 0x7a, 0xfa, 0xe2, 0x33, 0xee, 0xa7, 0x24,
-    0x75, 0x2a, 0x89, 0xc7, 0x22, 0xbf, 0xfc, 0xaa, 0xde, 0x4a, 0xe7, 0x1a,
-    0xee, 0xd3, 0x44, 0xe9, 0x7f, 0x91, 0xf9, 0x12, 0x7d, 0x87, 0x5f, 0xa6,
-    0x89, 0xa3, 0x47, 0x5f, 0xcc, 0xe2, 0x6c, 0xc1, 0x3a, 0x90, 0xf5, 0x74,
-    0x51, 0x79, 0x3b, 0x07, 0x2a, 0x68, 0x6f, 0xfe, 0xff, 0x5e, 0x8d, 0xd5,
-    0xfe, 0x64, 0x59, 0xd4, 0xb3, 0xf4, 0xe9, 0x5d, 0xff, 0x9e, 0x4a, 0xe7,
-    0x1a, 0xee, 0xd3, 0x44, 0xef, 0x7e, 0xf7, 0xee, 0xb4, 0x2a, 0xff, 0xc3,
-    0x1e, 0xcd, 0x66, 0x6f, 0x23, 0xa8, 0x29, 0xf5, 0xe4, 0x63, 0x8b, 0x22,
-    0x74, 0xaf, 0x13, 0xdf, 0xd0, 0xa8, 0x07, 0x02, 0x75, 0x2a, 0x7f, 0x62,
-    0x9f, 0x7f, 0xf9, 0x55, 0xbc, 0x95, 0xce, 0x35, 0xdd, 0xa6, 0x8a, 0x16,
-    0xff, 0xff, 0xf7, 0x7f, 0x5a, 0xde, 0x4a, 0xb7, 0xbf, 0xfa, 0x07, 0x27,
-    0x53, 0xf8, 0x98, 0xeb, 0xf7, 0xfb, 0xf9, 0x1a, 0x75, 0xfb, 0x01, 0x8e,
-    0x27, 0x5e, 0x80, 0x2b, 0x39, 0xe6, 0x89, 0x4d, 0x22, 0x3f, 0xc6, 0x19,
-    0x77, 0xff, 0x95, 0x5b, 0xc9, 0x5c, 0xe3, 0x5d, 0xda, 0x68, 0xa4, 0xaf,
-    0xff, 0xf6, 0x69, 0x5f, 0xb9, 0x37, 0x5d, 0x7e, 0xec, 0x7b, 0xf5, 0x9d,
-    0x50, 0xc8, 0x49, 0x9e, 0x33, 0x49, 0x43, 0x65, 0xb1, 0x81, 0x70, 0x8d,
-    0x72, 0xaf, 0x40, 0x45, 0xe8, 0xd5, 0xbf, 0x26, 0xdb, 0x57, 0xbf, 0xca,
-    0xe7, 0x1a, 0xee, 0xd3, 0x44, 0x49, 0x7f, 0xf9, 0x55, 0xbc, 0x95, 0xce,
-    0x35, 0xdd, 0xa6, 0x89, 0x7a, 0xf3, 0x10, 0xb0, 0x1d, 0x7d, 0xcf, 0xfd,
-    0xa3, 0xaf, 0xdc, 0x02, 0xd3, 0x47, 0x5e, 0x81, 0xdc, 0xeb, 0xf7, 0xbe,
-    0xac, 0x60, 0xeb, 0x27, 0x4f, 0x0c, 0x46, 0xef, 0xff, 0x77, 0x64, 0x08,
-    0x18, 0xf0, 0x39, 0xcd, 0xce, 0xba, 0x3c, 0x75, 0xff, 0xef, 0xc2, 0x9c,
-    0xfb, 0x36, 0xd7, 0xee, 0x33, 0x1d, 0x52, 0x46, 0xda, 0x13, 0x01, 0x3b,
-    0x42, 0xb7, 0xff, 0x3c, 0xda, 0x8d, 0x8f, 0xd8, 0xde, 0x63, 0xaf, 0xd9,
-    0x3e, 0x69, 0x67, 0x5f, 0xfd, 0x37, 0xcf, 0xa3, 0x1b, 0x1f, 0x64, 0x4c,
-    0x75, 0x1d, 0x7f, 0x4d, 0x27, 0xf3, 0xec, 0x3a, 0xa1, 0x10, 0xb8, 0x98,
-    0xe1, 0x57, 0x72, 0x0e, 0xa0, 0xaa, 0xd9, 0x42, 0x39, 0xa3, 0x45, 0xe1,
-    0xe0, 0xa3, 0xec, 0x85, 0x66, 0xd1, 0x6d, 0xe0, 0xe0, 0x9d, 0x70, 0x77,
-    0x3a, 0xff, 0x91, 0xc7, 0xff, 0x4d, 0x0a, 0x1d, 0x7f, 0xf8, 0x31, 0xb8,
-    0x5f, 0xe0, 0xe4, 0xff, 0x76, 0x1d, 0x7f, 0xfc, 0x9c, 0xf9, 0xd8, 0x4f,
-    0x6b, 0xf6, 0xff, 0x07, 0x5f, 0x24, 0xe0, 0x63, 0x3a, 0xf9, 0xae, 0xed,
-    0x34, 0x52, 0xf7, 0xc3, 0xe8, 0xe1, 0xd7, 0xfd, 0x9c, 0x63, 0xc0, 0xe7,
-    0x37, 0x3a, 0x90, 0xf6, 0xf6, 0x10, 0x54, 0x93, 0x72, 0x51, 0x42, 0x65,
-    0x2e, 0x12, 0xf6, 0x11, 0x17, 0xf0, 0x77, 0x8e, 0x26, 0xe7, 0x5f, 0x7a,
-    0x7c, 0x64, 0xea, 0x43, 0xd1, 0x12, 0xeb, 0xff, 0x40, 0xc7, 0x7e, 0x7e,
-    0x3f, 0xb4, 0xeb, 0xdf, 0xbe, 0x8e, 0xbe, 0x9b, 0xf7, 0x98, 0xeb, 0xf4,
-    0x01, 0xf7, 0xd1, 0xd7, 0x85, 0x00, 0x75, 0xec, 0xf6, 0x8e, 0xa8, 0x36,
-    0xba, 0x1a, 0xa0, 0xa3, 0xf2, 0x64, 0x0e, 0x8e, 0x00, 0x93, 0xcb, 0x97,
-    0xe6, 0x37, 0x10, 0xed, 0x1d, 0x7f, 0xc0, 0xd7, 0x23, 0x79, 0x22, 0xce,
-    0xbd, 0xe7, 0xd8, 0x75, 0xff, 0x3c, 0xff, 0x27, 0xfe, 0x68, 0x63, 0x3a,
-    0xa1, 0x12, 0xee, 0x73, 0xf8, 0xed, 0xff, 0x26, 0xa6, 0x41, 0xf4, 0x00,
-    0xea, 0x91, 0xf3, 0x2c, 0xbe, 0xe7, 0x13, 0xaf, 0xfa, 0x01, 0xf3, 0xb0,
-    0xb7, 0x13, 0xad, 0xcd, 0xcf, 0x33, 0x60, 0xa5, 0xfd, 0xbc, 0xb4, 0xe3,
-    0xb9, 0xd5, 0x09, 0xf8, 0x64, 0x65, 0x28, 0xdd, 0xf4, 0xae, 0xf7, 0x21,
-    0x67, 0x5f, 0xd0, 0x33, 0x79, 0x14, 0x3a, 0xff, 0xa5, 0x9c, 0x9b, 0x06,
-    0x16, 0x75, 0xf8, 0x10, 0xdc, 0x59, 0xd4, 0x87, 0xbb, 0xc3, 0x7b, 0xa5,
-    0x87, 0x5e, 0x80, 0x68, 0xea, 0x83, 0xd1, 0x09, 0x0b, 0x22, 0xb7, 0xee,
-    0xfe, 0xa6, 0x09, 0xd7, 0xfd, 0x1d, 0xd3, 0xfa, 0x39, 0xb4, 0x75, 0xff,
-    0x96, 0xe1, 0xfb, 0x34, 0xa0, 0x77, 0x3a, 0x82, 0x7f, 0x68, 0x75, 0x7d,
-    0xc0, 0x7d, 0xd8, 0x75, 0xe4, 0x67, 0xc7, 0x57, 0x4f, 0x0b, 0x44, 0xd4,
-    0x14, 0xca, 0x3b, 0x0a, 0x3f, 0x31, 0xdf, 0xf0, 0x13, 0xb9, 0xc7, 0x9b,
-    0x47, 0x5f, 0xff, 0xa2, 0x43, 0x13, 0xfd, 0x9b, 0x5d, 0xcd, 0xae, 0x00,
-    0xeb, 0xfb, 0xe2, 0xf3, 0xcf, 0xe3, 0xac, 0xd3, 0xae, 0xdf, 0x58, 0x6f,
-    0x9c, 0xba, 0xb7, 0x47, 0xea, 0xce, 0x1e, 0x13, 0x37, 0xfb, 0x19, 0x92,
-    0x6b, 0xf5, 0x9d, 0x76, 0xcd, 0x1d, 0x7e, 0xc9, 0xf3, 0xba, 0x3a, 0xa0,
-    0xdf, 0x88, 0xc5, 0xec, 0xe6, 0x8e, 0xa6, 0x9b, 0xad, 0x83, 0xf7, 0xfc,
-    0x08, 0x07, 0xdd, 0x90, 0x3b, 0x47, 0x54, 0x26, 0x1d, 0x90, 0xad, 0x42,
-    0x3b, 0xff, 0xff, 0xbb, 0x1c, 0xdd, 0xa9, 0xbf, 0xc5, 0x1f, 0xe6, 0xba,
-    0xed, 0x81, 0x09, 0xd7, 0xf7, 0xdf, 0x44, 0xe3, 0xb9, 0xd7, 0x85, 0x16,
-    0x75, 0x00, 0xf2, 0xbc, 0x61, 0x7f, 0x86, 0x1c, 0x7d, 0x82, 0x75, 0xfe,
-    0xeb, 0xcc, 0x9c, 0x89, 0xce, 0xbb, 0x16, 0x75, 0x05, 0x35, 0x9c, 0x86,
-    0x0a, 0xc8, 0x9c, 0xbb, 0x61, 0x9d, 0xfb, 0x69, 0x17, 0x1a, 0x3a, 0xfc,
-    0xfb, 0x33, 0x9a, 0x3a, 0x82, 0x7a, 0x2b, 0x29, 0xbf, 0x75, 0xc5, 0x16,
-    0x75, 0xf2, 0x93, 0x6a, 0x0e, 0xbf, 0xce, 0x0d, 0x47, 0x63, 0x47, 0x54,
-    0x22, 0x6f, 0x08, 0x90, 0x94, 0x48, 0xee, 0x03, 0x4e, 0xb6, 0x8e, 0xb9,
-    0x14, 0xd1, 0xa6, 0xfc, 0x5a, 0xf0, 0x1d, 0xa7, 0x5f, 0xa7, 0x7d, 0x64,
-    0x8e, 0xbf, 0xfe, 0x0e, 0x6c, 0x7e, 0x4d, 0xf6, 0x4f, 0xe7, 0x59, 0xd5,
-    0x07, 0xf4, 0x84, 0xf5, 0x08, 0xb5, 0xe4, 0x25, 0x6c, 0xab, 0x01, 0xb2,
-    0x7c, 0x89, 0x5f, 0x53, 0xba, 0xc8, 0x68, 0x22, 0xf9, 0x1d, 0x5e, 0xf0,
-    0xa3, 0x48, 0xc7, 0x26, 0x94, 0x77, 0xc4, 0x35, 0x8d, 0xf6, 0x1b, 0x6f,
-    0x1a, 0xb8, 0x23, 0x33, 0x18, 0xd0, 0xf5, 0x1c, 0x67, 0xa3, 0x3c, 0xdb,
-    0x5f, 0xfb, 0x0e, 0x3b, 0xfc, 0xae, 0x71, 0xae, 0xed, 0x34, 0x53, 0x97,
-    0xfe, 0x4e, 0x3e, 0xbb, 0x98, 0x2d, 0x3a, 0xfc, 0xbe, 0x73, 0x34, 0x75,
-    0xff, 0xfb, 0xbf, 0xfb, 0x91, 0xed, 0x63, 0x75, 0x1c, 0x69, 0xd7, 0xf9,
-    0x16, 0x18, 0xd7, 0xe2, 0x75, 0xfd, 0x9e, 0xde, 0x50, 0xc9, 0xd7, 0xfe,
-    0x4d, 0xf4, 0x38, 0x1e, 0xbb, 0x27, 0x5f, 0xff, 0x64, 0xf9, 0xbf, 0xb4,
-    0x83, 0x00, 0x75, 0x9d, 0x4a, 0x22, 0x33, 0x47, 0xd7, 0xfe, 0xce, 0xc7,
-    0x31, 0x56, 0x59, 0x64, 0xab, 0x91, 0x93, 0xae, 0x9d, 0x50, 0xaa, 0x1f,
-    0xc3, 0xb6, 0x93, 0xf5, 0x58, 0x4c, 0xbd, 0x0b, 0xad, 0xb2, 0x4d, 0xa4,
-    0x1b, 0xf7, 0x1a, 0xee, 0xd3, 0x45, 0x79, 0x7f, 0xff, 0x60, 0x7b, 0x1f,
-    0x55, 0xf0, 0xb8, 0x35, 0xa8, 0x01, 0x56, 0x57, 0x11, 0x1f, 0xb6, 0x67,
-    0x7f, 0xf2, 0xaf, 0x25, 0x73, 0x8d, 0x77, 0x69, 0xa2, 0x47, 0xbc, 0xdc,
-    0x59, 0xd7, 0x90, 0x10, 0x75, 0xe6, 0xe2, 0xca, 0x54, 0xba, 0xbf, 0x71,
-    0xae, 0xed, 0x34, 0x49, 0x17, 0xff, 0xf4, 0x27, 0x13, 0x6a, 0x06, 0x78,
-    0xf2, 0x75, 0xe7, 0x3a, 0xff, 0xf0, 0xe0, 0x36, 0xf3, 0x91, 0x3b, 0xf1,
-    0xa7, 0x5d, 0x25, 0x61, 0x30, 0x4c, 0x2b, 0xe9, 0x9f, 0x96, 0xef, 0xd9,
-    0xd5, 0x71, 0x67, 0x59, 0x58, 0x4e, 0xa5, 0xe3, 0x39, 0xf2, 0x4d, 0xff,
-    0xca, 0xbc, 0x95, 0xce, 0x35, 0xdd, 0xa6, 0x89, 0x2a, 0xfd, 0xc6, 0xbb,
-    0xb4, 0xd1, 0x78, 0xdf, 0xf4, 0x95, 0xce, 0x35, 0xdd, 0xa6, 0x89, 0x36,
-    0xca, 0xe1, 0xfc, 0x39, 0x9d, 0xcc, 0xf4, 0xeb, 0xf2, 0x03, 0x58, 0x27,
-    0x5f, 0xff, 0x7e, 0xfb, 0xe6, 0x28, 0xa3, 0xcb, 0x37, 0xf1, 0xd5, 0x23,
-    0xf7, 0xd1, 0x2d, 0xef, 0xa3, 0x39, 0xd7, 0x73, 0xc7, 0x5e, 0x98, 0x67,
-    0x3a, 0xc2, 0x75, 0xdf, 0x7e, 0x9d, 0x40, 0x35, 0x3f, 0x43, 0xee, 0xdb,
-    0x56, 0x13, 0x4d, 0xc8, 0x47, 0x74, 0x89, 0xc7, 0xb4, 0x2d, 0xf5, 0x1a,
-    0xa1, 0xbc, 0xee, 0x9c, 0xfe, 0x55, 0x96, 0x98, 0x63, 0x5a, 0x49, 0x4b,
-    0xd3, 0x46, 0x32, 0xb2, 0xce, 0xc7, 0xf5, 0xe3, 0xcf, 0xe1, 0x93, 0xf6,
-    0x37, 0x4a, 0x89, 0xc3, 0x4a, 0xa9, 0xe5, 0x4b, 0x4a, 0x76, 0x78, 0x33,
-    0xb9, 0x19, 0x89, 0x3f, 0xd5, 0x27, 0x1e, 0x5b, 0x7b, 0x43, 0x7b, 0xd6,
-    0x78, 0x69, 0x49, 0x81, 0x63, 0x94, 0x45, 0x35, 0xb3, 0xad, 0xe5, 0xa2,
-    0x76, 0x5e, 0x70, 0x57, 0xbd, 0xa5, 0x5d, 0xbd, 0xb4, 0xd6, 0x05, 0x21,
-    0x49, 0x83, 0x1f, 0x68, 0xd6, 0x7b, 0xfa, 0xad, 0xf6, 0xfd, 0x7b, 0x0e,
-    0x7f, 0xdb, 0x2e, 0x7d, 0x94, 0xbd, 0x56, 0x67, 0x25, 0x76, 0xe5, 0xc3,
-    0x7d, 0xa4, 0x4b, 0x6d, 0x57, 0xb3, 0xf4,
+    0x41, 0x0b, 0xfb, 0xfd, 0x75, 0xe5, 0x87, 0x5f, 0xff, 0x69, 0x1b, 0x83,
+    0xc8, 0x1c, 0x0e, 0x28, 0x75, 0x2c, 0xfe, 0x7c, 0x5b, 0x6d, 0xce, 0xb2,
+    0x87, 0x5b, 0xf3, 0xa8, 0x4d, 0x16, 0x84, 0x6b, 0x0f, 0xd7, 0x44, 0x5e,
+    0x33, 0xb9, 0x20, 0xeb, 0xf8, 0x61, 0x63, 0x18, 0x75, 0xd2, 0x83, 0xa8,
+    0x27, 0xa5, 0x30, 0xa7, 0xe5, 0x37, 0xff, 0xff, 0xdd, 0x8f, 0x69, 0x35,
+    0xa8, 0xf7, 0x52, 0x38, 0x05, 0xbc, 0xa5, 0xe5, 0x0e, 0xb9, 0x37, 0x3a,
+    0xe8, 0x59, 0xd7, 0xff, 0xe8, 0x1f, 0xe5, 0x28, 0xf7, 0x71, 0x7f, 0x60,
+    0x07, 0x5f, 0xff, 0x20, 0xff, 0x2c, 0xd7, 0x21, 0x24, 0xfa, 0x2a, 0xa4,
+    0x8a, 0x3f, 0x2b, 0x5c, 0xd5, 0x61, 0x7e, 0x26, 0x78, 0x42, 0x86, 0x1b,
+    0x99, 0x19, 0x52, 0x89, 0x8d, 0x20, 0xe4, 0x3e, 0x9d, 0x78, 0x63, 0x1b,
+    0xd4, 0x20, 0x3c, 0x63, 0xb1, 0xf7, 0x6c, 0x5b, 0xec, 0x2e, 0x2f, 0xff,
+    0x2a, 0xb7, 0x92, 0xb9, 0xc6, 0xbb, 0xb4, 0xd1, 0x46, 0x5f, 0xb6, 0x47,
+    0x20, 0x07, 0x5f, 0x85, 0xc1, 0x1f, 0x4e, 0xbf, 0xfb, 0x76, 0xa7, 0x3b,
+    0x98, 0x32, 0xd1, 0xd6, 0x56, 0x11, 0x25, 0xd2, 0x8f, 0x13, 0xd4, 0x99,
+    0x75, 0x1c, 0x87, 0x8a, 0xce, 0x5e, 0x90, 0xcd, 0xa8, 0x7c, 0xfa, 0x1d,
+    0x37, 0xff, 0x2a, 0xf2, 0x57, 0x38, 0xd7, 0x76, 0x9a, 0x23, 0x9b, 0xff,
+    0xca, 0xad, 0xe4, 0xae, 0x71, 0xae, 0xed, 0x34, 0x4e, 0x57, 0xf9, 0x5c,
+    0xe3, 0x5d, 0xda, 0x68, 0xb3, 0x2f, 0xfa, 0x5a, 0x75, 0xab, 0xdf, 0x00,
+    0xeb, 0xfe, 0x61, 0xc1, 0xc5, 0xc6, 0xf0, 0xb3, 0xaf, 0xf7, 0x23, 0xdd,
+    0x7d, 0xe4, 0x75, 0xff, 0xff, 0xf4, 0x4d, 0xd8, 0xf4, 0x7d, 0x4e, 0x4d,
+    0x1d, 0xcd, 0x99, 0xdc, 0x0e, 0xcc, 0x3a, 0x80, 0x8b, 0x41, 0x33, 0xbf,
+    0xd9, 0xae, 0x73, 0x37, 0xd1, 0xd7, 0xec, 0xf7, 0x31, 0x67, 0x5f, 0xf9,
+    0x06, 0x35, 0x1e, 0x9f, 0x19, 0x3a, 0xfe, 0xe3, 0x7a, 0xe8, 0xc1, 0x3a,
+    0xed, 0xd6, 0x75, 0x95, 0x62, 0x53, 0xf1, 0x88, 0x79, 0x48, 0x88, 0x26,
+    0x6b, 0x26, 0xfc, 0xf7, 0x6c, 0xc2, 0xff, 0x2b, 0x9c, 0x6b, 0xbb, 0x4d,
+    0x16, 0xed, 0xfc, 0x2e, 0xaf, 0x27, 0xe9, 0xd7, 0x93, 0x70, 0x1d, 0x7e,
+    0xe3, 0x5d, 0xda, 0x68, 0xa4, 0x2f, 0xfd, 0x9d, 0x4d, 0x9d, 0xcc, 0x16,
+    0x9d, 0x79, 0xe4, 0xae, 0x1f, 0x86, 0x8c, 0xec, 0xab, 0x51, 0xdb, 0xc2,
+    0xe5, 0xc2, 0x32, 0xff, 0xe5, 0x5e, 0x4a, 0xe7, 0x1a, 0xee, 0xd3, 0x44,
+    0xa5, 0x53, 0xae, 0xa2, 0x4c, 0xa2, 0xb5, 0x77, 0x3f, 0x04, 0xa2, 0xb1,
+    0x79, 0xf4, 0x65, 0x9b, 0x47, 0x97, 0xfa, 0x48, 0x3e, 0xc4, 0x09, 0xd7,
+    0xb5, 0xfa, 0xce, 0xb2, 0xbb, 0x9e, 0x6a, 0x18, 0x5e, 0x17, 0x91, 0xd7,
+    0xfe, 0x79, 0x2b, 0x9c, 0x6b, 0xbb, 0x4d, 0x13, 0xb5, 0xd3, 0xb1, 0x9d,
+    0x7f, 0xfe, 0x40, 0xfe, 0xb8, 0xda, 0x70, 0x8c, 0x0e, 0x34, 0xeb, 0xfd,
+    0x28, 0xe4, 0xf1, 0xc9, 0xce, 0xbf, 0xf7, 0x45, 0xe5, 0xf8, 0x16, 0xf2,
+    0x3a, 0xa0, 0xfc, 0xb0, 0xd2, 0xca, 0xe2, 0x6c, 0xab, 0x1a, 0xea, 0x53,
+    0x8d, 0x0c, 0x31, 0xef, 0xff, 0x95, 0xfb, 0xb6, 0xe2, 0x0c, 0xf4, 0x0a,
+    0x00, 0xeb, 0xff, 0x9d, 0x7d, 0xc6, 0xbf, 0x63, 0xec, 0x8e, 0xbc, 0x81,
+    0x73, 0xaf, 0xfe, 0x1c, 0xeb, 0xcf, 0x9a, 0x17, 0xdc, 0xeb, 0xb6, 0xd5,
+    0x0a, 0x28, 0x3a, 0x89, 0xa1, 0xaa, 0x92, 0xb1, 0x45, 0xc7, 0x1d, 0xa5,
+    0x4d, 0xb8, 0x79, 0x5f, 0xff, 0xc1, 0x7f, 0x2b, 0x9a, 0x81, 0xdc, 0x1a,
+    0xd4, 0x00, 0xeb, 0xf7, 0x1a, 0xee, 0xd3, 0x44, 0x59, 0x7f, 0xe7, 0x92,
+    0xb9, 0xc6, 0xbb, 0xb4, 0xd1, 0x2e, 0xdf, 0xff, 0xd8, 0x1e, 0xc7, 0xd5,
+    0x7c, 0x2e, 0x0d, 0x6a, 0x00, 0x55, 0x95, 0xc4, 0x6c, 0xac, 0xcf, 0x6d,
+    0x2a, 0xff, 0xe5, 0xbc, 0x95, 0xce, 0x35, 0xdd, 0xa6, 0x89, 0x8a, 0xff,
+    0xfb, 0x1b, 0x0a, 0xf5, 0xd3, 0x6d, 0x01, 0x81, 0x3a, 0x95, 0x45, 0x07,
+    0x54, 0x2f, 0xdc, 0x6b, 0xbb, 0x4d, 0x15, 0x4d, 0xb0, 0xea, 0xc3, 0xc2,
+    0x50, 0xce, 0xff, 0xdf, 0xbf, 0x24, 0x38, 0xcb, 0x80, 0xeb, 0xff, 0x9f,
+    0x5c, 0x46, 0x7d, 0xd4, 0xe4, 0x8e, 0xbf, 0xee, 0x3f, 0x77, 0x96, 0x79,
+    0x50, 0xa2, 0x0b, 0xa7, 0xd4, 0xaa, 0x3d, 0xde, 0x14, 0x97, 0xff, 0x95,
+    0x5b, 0xc9, 0x5c, 0xe3, 0x5d, 0xda, 0x68, 0x9d, 0x2f, 0xf2, 0x3f, 0x22,
+    0x4f, 0xb0, 0xeb, 0xf4, 0xd1, 0x34, 0x68, 0xeb, 0xf9, 0x9c, 0x4d, 0x98,
+    0x27, 0x52, 0x1e, 0xae, 0x8a, 0x2f, 0x27, 0x60, 0xe5, 0x4d, 0x0d, 0xff,
+    0xdf, 0xeb, 0xd1, 0xba, 0xbf, 0xcc, 0x8b, 0x3a, 0x96, 0x7e, 0x9d, 0x2b,
+    0xbf, 0xf3, 0xc9, 0x5c, 0xe3, 0x5d, 0xda, 0x68, 0x9d, 0xef, 0xde, 0xfd,
+    0xd6, 0x85, 0x5f, 0xf8, 0x63, 0xd9, 0xac, 0xcd, 0xe4, 0x75, 0x05, 0x3e,
+    0xbc, 0x8c, 0x71, 0x64, 0x4e, 0x95, 0xe2, 0x7b, 0xfe, 0x0c, 0x4a, 0x15,
+    0x67, 0x40, 0x3a, 0xfe, 0x85, 0x40, 0x38, 0x13, 0xa9, 0x54, 0x5a, 0xe2,
+    0x78, 0x9d, 0x5f, 0xfe, 0x55, 0x6f, 0x25, 0x73, 0x8d, 0x77, 0x69, 0xa2,
+    0x85, 0xbf, 0xff, 0xfd, 0xdf, 0xd6, 0xb7, 0x92, 0xad, 0xef, 0xfe, 0x81,
+    0xc9, 0xd4, 0xfe, 0x26, 0x3a, 0xfd, 0xfe, 0xfe, 0x46, 0x9d, 0x7e, 0xc0,
+    0x63, 0x89, 0xd7, 0xda, 0x46, 0x7c, 0x75, 0xe8, 0x02, 0xb3, 0x9f, 0x78,
+    0x94, 0xf8, 0x92, 0x91, 0x32, 0xe1, 0x87, 0x6d, 0xff, 0xe5, 0x56, 0xf2,
+    0x57, 0x38, 0xd7, 0x76, 0x9a, 0x29, 0x2b, 0xff, 0xfd, 0x9a, 0x57, 0xee,
+    0x4d, 0xd7, 0x5f, 0xbb, 0x1e, 0xfd, 0x67, 0x54, 0x32, 0x48, 0x27, 0x8c,
+    0xd2, 0x50, 0xd9, 0x6c, 0x6b, 0xbc, 0x28, 0x5c, 0xaf, 0x70, 0x17, 0xfa,
+    0x38, 0x5f, 0xc9, 0xf6, 0xd5, 0xef, 0xf2, 0xb9, 0xc6, 0xbb, 0xb4, 0xd1,
+    0x12, 0x5f, 0xfe, 0x55, 0x6f, 0x25, 0x73, 0x8d, 0x77, 0x69, 0xa2, 0x5e,
+    0xbc, 0xc4, 0xac, 0x07, 0x5f, 0x73, 0xff, 0x68, 0xeb, 0xf7, 0x00, 0xb4,
+    0xd1, 0xd7, 0xa0, 0x77, 0x3a, 0xfd, 0xef, 0xab, 0x18, 0x3a, 0xc9, 0xd3,
+    0xc3, 0x11, 0xbb, 0xff, 0xdd, 0xd9, 0x02, 0x06, 0x3c, 0x0e, 0x73, 0x73,
+    0xae, 0x8f, 0x1d, 0x7f, 0xfb, 0xf0, 0xa7, 0x3e, 0xcd, 0xb5, 0xfb, 0x8c,
+    0xc7, 0x54, 0x91, 0xb6, 0x84, 0xc0, 0x4e, 0xd0, 0xad, 0xfc, 0x0e, 0xc7,
+    0x11, 0x67, 0x5f, 0xfa, 0x6d, 0x46, 0xc7, 0xec, 0x6f, 0x31, 0xd5, 0x07,
+    0xdc, 0xe5, 0x97, 0xec, 0x9f, 0x34, 0xb3, 0xaf, 0xfe, 0x9b, 0xe7, 0xd1,
+    0x8d, 0x8f, 0xb2, 0x26, 0x3a, 0x8e, 0xbf, 0xa6, 0x93, 0xf9, 0xf6, 0x1d,
+    0x50, 0x88, 0x5c, 0x4c, 0x70, 0xab, 0xb9, 0x07, 0x50, 0x55, 0x90, 0x21,
+    0x1c, 0xd1, 0xa2, 0xf2, 0x15, 0x42, 0x41, 0xb2, 0x15, 0x9b, 0x45, 0xb7,
+    0x83, 0x82, 0x75, 0xc1, 0xdc, 0xeb, 0xf8, 0x7f, 0xf4, 0xd0, 0xa1, 0xd7,
+    0x98, 0x29, 0xc3, 0xac, 0x8e, 0x79, 0xdf, 0x97, 0xdf, 0x87, 0x27, 0xfb,
+    0xb0, 0xeb, 0xec, 0x9f, 0xee, 0xc3, 0xaf, 0xc1, 0x8d, 0xc2, 0xff, 0x0f,
+    0x44, 0x4a, 0xef, 0xff, 0x93, 0x9f, 0x3b, 0x09, 0xed, 0x7e, 0xdf, 0xe0,
+    0xeb, 0xe4, 0x9c, 0x0c, 0x67, 0x5f, 0x35, 0xdd, 0xa6, 0x8a, 0x5e, 0xf8,
+    0x7d, 0x1c, 0x3a, 0xff, 0xb3, 0x8c, 0x78, 0x1c, 0xe6, 0xe7, 0x52, 0x1e,
+    0xde, 0xc2, 0x0a, 0x92, 0x6c, 0x4a, 0x20, 0x4c, 0xa5, 0xc2, 0x5e, 0xc2,
+    0x22, 0xfe, 0x0e, 0xf1, 0xc4, 0xdc, 0xeb, 0xef, 0x4f, 0x8c, 0x9d, 0x48,
+    0x7a, 0x22, 0x5d, 0x7f, 0xe8, 0x18, 0xef, 0xcf, 0xc7, 0xf6, 0x9d, 0x7b,
+    0xf7, 0xd1, 0xd7, 0xd3, 0x7e, 0xf3, 0x1d, 0x7e, 0x80, 0x3e, 0xfa, 0x3a,
+    0xf0, 0xa0, 0x0e, 0xbd, 0x9e, 0xd1, 0xd5, 0x06, 0xd7, 0x43, 0x54, 0x14,
+    0x7e, 0x4c, 0x81, 0xd1, 0xc0, 0x12, 0x79, 0x72, 0xfc, 0xc6, 0xe2, 0x1d,
+    0xa3, 0xaf, 0xf8, 0x1a, 0xe4, 0x6f, 0x24, 0x59, 0xd7, 0xbc, 0xfb, 0x0e,
+    0xbf, 0x4f, 0xfc, 0xd0, 0xc6, 0x75, 0xf7, 0xf3, 0x43, 0x19, 0xd7, 0x3c,
+    0xff, 0x0f, 0x4e, 0x72, 0xda, 0x84, 0x6d, 0x39, 0xcf, 0xee, 0x17, 0xfc,
+    0x9a, 0x99, 0x07, 0xd0, 0x03, 0xaa, 0x47, 0xcc, 0xb2, 0xfb, 0xfd, 0x0c,
+    0x7a, 0x85, 0xbf, 0x8e, 0xb9, 0xc4, 0xeb, 0xfe, 0x80, 0x7c, 0xec, 0x2d,
+    0xc4, 0xea, 0xdc, 0xf3, 0x36, 0x0a, 0x54, 0x91, 0x4b, 0xc8, 0x40, 0x5f,
+    0xdb, 0xcb, 0x4e, 0x3b, 0x9d, 0x50, 0xaa, 0x27, 0x23, 0x6c, 0x48, 0x63,
+    0xfd, 0x28, 0xbd, 0xc8, 0x59, 0xd7, 0xf4, 0x0c, 0xde, 0x45, 0x0e, 0xbf,
+    0xe9, 0x67, 0x26, 0xc1, 0x85, 0x9d, 0x7e, 0x04, 0x37, 0x16, 0x75, 0x21,
+    0xee, 0xf0, 0xde, 0xe9, 0x61, 0xd7, 0xdc, 0x18, 0x59, 0xd7, 0xa0, 0x1a,
+    0x3a, 0xa0, 0xfc, 0x42, 0x43, 0x82, 0xac, 0x90, 0x5f, 0xbb, 0xfa, 0x98,
+    0x27, 0x5f, 0xf4, 0x77, 0x4f, 0xe8, 0xe6, 0xd1, 0xd7, 0xfe, 0x5b, 0x87,
+    0xec, 0xd2, 0x81, 0xdc, 0xea, 0x09, 0xfd, 0xa1, 0xd5, 0xf7, 0x01, 0xf7,
+    0x61, 0xd7, 0x91, 0x9f, 0x1d, 0x5d, 0x3c, 0x2d, 0x13, 0x50, 0x53, 0x28,
+    0xec, 0x28, 0xfc, 0xc7, 0x7f, 0xc0, 0x4e, 0xe7, 0x1e, 0x6d, 0x1d, 0x7f,
+    0xfe, 0x89, 0x0c, 0x4f, 0xf6, 0x6d, 0x77, 0x36, 0xb8, 0x03, 0xaf, 0xef,
+    0x8b, 0xcf, 0x3f, 0x8e, 0xb3, 0x4e, 0xbb, 0x7d, 0x61, 0xbe, 0x72, 0xeb,
+    0xd0, 0x81, 0x3a, 0xb7, 0x4c, 0x5d, 0x67, 0x0f, 0x09, 0x9d, 0x16, 0x5f,
+    0xec, 0x66, 0x49, 0xaf, 0xd6, 0x75, 0xdb, 0x34, 0x75, 0xfb, 0x27, 0xce,
+    0xe8, 0xea, 0x83, 0x7e, 0x23, 0x17, 0xb3, 0x9a, 0x3a, 0x9a, 0x6e, 0xb6,
+    0x0f, 0xdf, 0xf0, 0x20, 0x1f, 0x76, 0x40, 0xed, 0x1d, 0x50, 0x98, 0x76,
+    0x42, 0xb5, 0x08, 0xef, 0xff, 0xfe, 0xec, 0x73, 0x76, 0xa6, 0xff, 0x14,
+    0x7f, 0x9a, 0xeb, 0xb6, 0x04, 0x27, 0x5f, 0x22, 0x9b, 0x78, 0x75, 0xfd,
+    0xf7, 0xd1, 0x38, 0xee, 0x75, 0xe1, 0x45, 0x9d, 0x5c, 0x3e, 0xe0, 0x12,
+    0x78, 0xc2, 0xff, 0x0c, 0x38, 0xfb, 0x04, 0xeb, 0xfd, 0xd7, 0x99, 0x39,
+    0x13, 0x9d, 0x76, 0x2c, 0xea, 0x0a, 0x71, 0x59, 0x0e, 0x55, 0x97, 0xb9,
+    0x76, 0xc3, 0x3b, 0xf6, 0xd2, 0x2e, 0x34, 0x75, 0xf9, 0xf6, 0x67, 0x34,
+    0x75, 0x04, 0xf4, 0x56, 0x53, 0x7e, 0xeb, 0x8a, 0x2c, 0xeb, 0xe5, 0x26,
+    0xd4, 0x1d, 0x7f, 0x03, 0x70, 0x67, 0x30, 0xeb, 0xf9, 0xc0, 0xb8, 0xcf,
+    0x1d, 0x50, 0x7b, 0x08, 0x5b, 0x7f, 0x9c, 0x1a, 0x8e, 0xc6, 0x8e, 0xa8,
+    0x4c, 0x4f, 0x08, 0x90, 0x97, 0xaf, 0x62, 0x41, 0x70, 0x1a, 0x75, 0xb4,
+    0x75, 0xc8, 0xa6, 0x8d, 0x37, 0xe2, 0xd7, 0x80, 0xed, 0x3a, 0xf9, 0x99,
+    0xb5, 0x07, 0x5f, 0xda, 0x17, 0x9e, 0x3c, 0x75, 0xfa, 0x77, 0xd6, 0x48,
+    0xeb, 0xff, 0xe0, 0xe6, 0xc7, 0xe4, 0xdf, 0x64, 0xfe, 0x75, 0x9d, 0x50,
+    0x7f, 0x48, 0x4f, 0x7f, 0x3e, 0xe0, 0x5a, 0x68, 0xea, 0x84, 0xcc, 0x77,
+    0x1b, 0x98, 0x8f, 0x90, 0xa6, 0xe9, 0x05, 0x95, 0x62, 0xdb, 0x59, 0x58,
+    0x96, 0x83, 0x3b, 0xd4, 0x86, 0x82, 0xcb, 0x91, 0xed, 0x6f, 0x0a, 0x34,
+    0x8c, 0x72, 0x69, 0x5a, 0x9c, 0x49, 0x58, 0xdf, 0x61, 0xf6, 0xf1, 0xb1,
+    0x82, 0x34, 0xd1, 0x8d, 0x47, 0x51, 0xde, 0xfa, 0x3b, 0x4d, 0xb6, 0xdf,
+    0xb1, 0xaf, 0xdf, 0xe5, 0x73, 0x8d, 0x77, 0x69, 0xa2, 0x9c, 0xbf, 0xf2,
+    0x71, 0xf5, 0xdc, 0xc1, 0x69, 0xd7, 0xe5, 0xf3, 0x99, 0xa3, 0xaf, 0xff,
+    0xdd, 0xff, 0xdc, 0x8f, 0x6b, 0x1b, 0xa8, 0xe3, 0x4e, 0xbf, 0xff, 0xbd,
+    0x93, 0x0a, 0x6b, 0xd1, 0xf5, 0x39, 0x34, 0x74, 0xeb, 0xfc, 0x8b, 0x0c,
+    0x6b, 0xf1, 0x3a, 0xfe, 0xcf, 0x6f, 0x28, 0x64, 0xeb, 0xff, 0x26, 0xfa,
+    0x1c, 0x0f, 0x5d, 0x93, 0xaf, 0xff, 0xb2, 0x7c, 0xdf, 0xda, 0x41, 0x80,
+    0x3a, 0xce, 0xa5, 0x11, 0x19, 0xa3, 0xeb, 0xff, 0x67, 0x63, 0x98, 0xab,
+    0x2c, 0xb2, 0x55, 0xc8, 0xc9, 0xd7, 0x4e, 0xa8, 0x55, 0x3d, 0xe1, 0xdb,
+    0x49, 0xd1, 0x5b, 0xab, 0x82, 0x65, 0xe8, 0x5d, 0x6d, 0x92, 0x6d, 0x20,
+    0xdf, 0xb8, 0xd7, 0x76, 0x9a, 0x2b, 0xcb, 0xff, 0xfb, 0x03, 0xd8, 0xfa,
+    0xaf, 0x85, 0xc1, 0xad, 0x40, 0x0a, 0xb2, 0xb8, 0x88, 0xfd, 0xb3, 0x3b,
+    0xff, 0x95, 0x79, 0x2b, 0x9c, 0x6b, 0xbb, 0x4d, 0x12, 0x3d, 0xe6, 0xe2,
+    0xce, 0xbc, 0x80, 0x83, 0xaf, 0x37, 0x16, 0x52, 0xa5, 0xd5, 0xfb, 0x8d,
+    0x77, 0x69, 0xa2, 0x48, 0xbf, 0xff, 0xa1, 0x38, 0x9b, 0x50, 0x33, 0xc7,
+    0x93, 0xaf, 0x39, 0xd7, 0xff, 0x87, 0x01, 0xb7, 0x9c, 0x89, 0xdf, 0x8d,
+    0x3a, 0xe9, 0x2b, 0x09, 0x82, 0x61, 0x5f, 0x4c, 0xfc, 0xb7, 0x7e, 0xce,
+    0xab, 0x8b, 0x3a, 0xca, 0xc2, 0x75, 0x2f, 0x19, 0xcf, 0x92, 0x6f, 0xfe,
+    0x55, 0xe4, 0xae, 0x71, 0xae, 0xed, 0x34, 0x49, 0x57, 0xee, 0x35, 0xdd,
+    0xa6, 0x8b, 0xc6, 0xff, 0xa4, 0xae, 0x71, 0xae, 0xed, 0x34, 0x49, 0xb6,
+    0x57, 0x0f, 0xe1, 0xcc, 0xee, 0x67, 0xa7, 0x5f, 0x90, 0x1a, 0xc1, 0x3a,
+    0xff, 0xfb, 0xf7, 0xdf, 0x31, 0x45, 0x1e, 0x59, 0xbf, 0x8e, 0xa9, 0x1f,
+    0xbe, 0x89, 0x6f, 0x7d, 0x19, 0xce, 0xbb, 0x9e, 0x3a, 0xf4, 0xc3, 0x39,
+    0xd6, 0x13, 0xae, 0xfb, 0xf4, 0xea, 0x01, 0xa9, 0xfa, 0x1f, 0x76, 0xda,
+    0xb0, 0x9a, 0x6e, 0x42, 0x3b, 0xa4, 0x4e, 0x3d, 0xa1, 0x6f, 0xa8, 0xd5,
+    0x0e, 0x81, 0xc6, 0x73, 0xf9, 0x56, 0xbd, 0x81, 0x8d, 0x71, 0x25, 0x5d,
+    0x4d, 0x19, 0x2a, 0xcb, 0x3b, 0x1f, 0xd7, 0x8f, 0x3f, 0x86, 0x4f, 0xd8,
+    0xdd, 0x2a, 0x27, 0x1a, 0x07, 0xe7, 0x95, 0x2f, 0x29, 0xe0, 0x40, 0xce,
+    0xe4, 0x66, 0x26, 0xac, 0xd4, 0x9c, 0xce, 0x6d, 0xef, 0x09, 0x6f, 0x5a,
+    0x2b, 0x25, 0x27, 0xd5, 0x8e, 0x51, 0x3c, 0xd6, 0xd3, 0x6b, 0x96, 0x90,
+    0xed, 0x79, 0xc9, 0xf7, 0x76, 0x95, 0x76, 0xf6, 0xd8, 0x94, 0x14, 0x85,
+    0x36, 0x0c, 0x7d, 0xc3, 0x5b, 0x6d, 0xea, 0xb8, 0xd1, 0xf5, 0xee, 0x78,
+    0xff, 0x6d, 0x61, 0x76, 0x53, 0x1e, 0x19, 0x9d, 0xb6, 0xdb, 0x97, 0xcb,
+    0xf6, 0x92, 0xdb, 0xb5, 0x68, 0x48, 0xa8,
 };
 
-static const unsigned kPreloadedHSTSBits = 280566;
+static const unsigned kPreloadedHSTSBits = 293909;
 
-static const unsigned kHSTSRootPosition = 279951;
+static const unsigned kHSTSRootPosition = 293293;
 
 #endif // NET_HTTP_TRANSPORT_SECURITY_STATE_STATIC_H_
diff --git a/net/http/transport_security_state_static.json b/net/http/transport_security_state_static.json
index 5465026..d89f008 100644
--- a/net/http/transport_security_state_static.json
+++ b/net/http/transport_security_state_static.json
@@ -4062,7 +4062,197 @@
     { "name": "matrip.de", "include_subdomains": true, "mode": "force-https" },
     { "name": "reporturi.com", "include_subdomains": true, "mode": "force-https" },
     { "name": "reporturi.io", "include_subdomains": true, "mode": "force-https" },
-    { "name": "report-uri.com", "include_subdomains": true, "mode": "force-https" }
+    { "name": "report-uri.com", "include_subdomains": true, "mode": "force-https" },
+    { "name": "18f.gov", "include_subdomains": true, "mode": "force-https" },
+    { "name": "1co-jp.net", "include_subdomains": true, "mode": "force-https" },
+    { "name": "1password.com", "include_subdomains": true, "mode": "force-https" },
+    { "name": "ad-notam.pt", "include_subdomains": true, "mode": "force-https" },
+    { "name": "adblock.ovh", "include_subdomains": true, "mode": "force-https" },
+    { "name": "admsel.ec", "include_subdomains": true, "mode": "force-https" },
+    { "name": "alltheducks.com", "include_subdomains": true, "mode": "force-https" },
+    { "name": "alphassl.de", "include_subdomains": true, "mode": "force-https" },
+    { "name": "altedirect.com", "include_subdomains": true, "mode": "force-https" },
+    { "name": "altestore.com", "include_subdomains": true, "mode": "force-https" },
+    { "name": "ankaraprofesyonelnakliyat.com.tr", "include_subdomains": true, "mode": "force-https" },
+    { "name": "ankaraprofesyonelwebtasarim.com", "include_subdomains": true, "mode": "force-https" },
+    { "name": "ankarauzmanlarnakliyat.com", "include_subdomains": true, "mode": "force-https" },
+    { "name": "anzeiger.ag", "include_subdomains": true, "mode": "force-https" },
+    { "name": "apnakliyat.com", "include_subdomains": true, "mode": "force-https" },
+    { "name": "aryasenna.net", "include_subdomains": true, "mode": "force-https" },
+    { "name": "askwhy.cz", "include_subdomains": true, "mode": "force-https" },
+    { "name": "askwhy.eu", "include_subdomains": true, "mode": "force-https" },
+    { "name": "atisoft.com.tr", "include_subdomains": true, "mode": "force-https" },
+    { "name": "atisoft.net", "include_subdomains": true, "mode": "force-https" },
+    { "name": "atisoft.net.tr", "include_subdomains": true, "mode": "force-https" },
+    { "name": "atisoft.web.tr", "include_subdomains": true, "mode": "force-https" },
+    { "name": "balboa.io", "include_subdomains": true, "mode": "force-https" },
+    { "name": "bcsytv.com", "include_subdomains": true, "mode": "force-https" },
+    { "name": "beholdthehurricane.com", "include_subdomains": true, "mode": "force-https" },
+    { "name": "beranovi.com", "include_subdomains": true, "mode": "force-https" },
+    { "name": "betterhelp.com", "include_subdomains": true, "mode": "force-https" },
+    { "name": "borysek.net", "include_subdomains": true, "mode": "force-https" },
+    { "name": "broadsheet.com.au", "include_subdomains": true, "mode": "force-https" },
+    { "name": "broersma.com", "include_subdomains": true, "mode": "force-https" },
+    { "name": "brownfieldstsc.org", "include_subdomains": true, "mode": "force-https" },
+    { "name": "bulmafox.com", "include_subdomains": true, "mode": "force-https" },
+    { "name": "byrtz.de", "include_subdomains": true, "mode": "force-https" },
+    { "name": "callsigns.ca", "include_subdomains": true, "mode": "force-https" },
+    { "name": "chimeratool.com", "include_subdomains": true, "mode": "force-https" },
+    { "name": "classicspublishing.com", "include_subdomains": true, "mode": "force-https" },
+    { "name": "clickandgo.com", "include_subdomains": true, "mode": "force-https" },
+    { "name": "colognegaming.net", "include_subdomains": true, "mode": "force-https" },
+    { "name": "compucorner.mx", "include_subdomains": true, "mode": "force-https" },
+    { "name": "concentrade.de", "include_subdomains": true, "mode": "force-https" },
+    { "name": "crepererum.net", "include_subdomains": true, "mode": "force-https" },
+    { "name": "cryptoparty.dk", "include_subdomains": true, "mode": "force-https" },
+    { "name": "dannyrohde.de", "include_subdomains": true, "mode": "force-https" },
+    { "name": "devdoodle.net", "include_subdomains": true, "mode": "force-https" },
+    { "name": "diasp.cz", "include_subdomains": true, "mode": "force-https" },
+    { "name": "dime-staging.com", "include_subdomains": true, "mode": "force-https" },
+    { "name": "docket.news", "include_subdomains": true, "mode": "force-https" },
+    { "name": "econsumer.gov", "include_subdomains": true, "mode": "force-https" },
+    { "name": "elephpant.cz", "include_subdomains": true, "mode": "force-https" },
+    { "name": "elimdengelen.com", "include_subdomains": true, "mode": "force-https" },
+    { "name": "elisa.ee", "include_subdomains": true, "mode": "force-https" },
+    { "name": "entersynapse.com", "include_subdomains": true, "mode": "force-https" },
+    { "name": "epay.bg", "include_subdomains": true, "mode": "force-https" },
+    { "name": "escalate.eu", "include_subdomains": true, "mode": "force-https" },
+    { "name": "espci.fr", "include_subdomains": true, "mode": "force-https" },
+    { "name": "ev-zertifikate.de", "include_subdomains": true, "mode": "force-https" },
+    { "name": "evdenevenakliyatankara.pw", "include_subdomains": true, "mode": "force-https" },
+    { "name": "exfiles.cz", "include_subdomains": true, "mode": "force-https" },
+    { "name": "expxkcd.com", "include_subdomains": true, "mode": "force-https" },
+    { "name": "eyyit.com", "include_subdomains": true, "mode": "force-https" },
+    { "name": "fandomservices.com", "include_subdomains": true, "mode": "force-https" },
+    { "name": "fasdoutreach.ca", "include_subdomains": true, "mode": "force-https" },
+    { "name": "fca-tools.com", "include_subdomains": true, "mode": "force-https" },
+    { "name": "fetch.co.uk", "include_subdomains": true, "mode": "force-https" },
+    { "name": "findmybottleshop.com.au", "include_subdomains": true, "mode": "force-https" },
+    { "name": "flamewall.net", "include_subdomains": true, "mode": "force-https" },
+    { "name": "freelance.boutique", "include_subdomains": true, "mode": "force-https" },
+    { "name": "freifunk-luenen.de", "include_subdomains": true, "mode": "force-https" },
+    { "name": "frtr.gov", "include_subdomains": true, "mode": "force-https" },
+    { "name": "g-m-w.eu", "include_subdomains": true, "mode": "force-https" },
+    { "name": "gamingzoneservers.com", "include_subdomains": true, "mode": "force-https" },
+    { "name": "garbage-juice.com", "include_subdomains": true, "mode": "force-https" },
+    { "name": "getbutterfly.com", "include_subdomains": true, "mode": "force-https" },
+    { "name": "glws.org", "include_subdomains": true, "mode": "force-https" },
+    { "name": "gmw-ingenieurbuero.de", "include_subdomains": true, "mode": "force-https" },
+    { "name": "granular.ag", "include_subdomains": true, "mode": "force-https" },
+    { "name": "gsm-map.com", "include_subdomains": true, "mode": "force-https" },
+    { "name": "gyboche.com", "include_subdomains": true, "mode": "force-https" },
+    { "name": "harristony.com", "include_subdomains": true, "mode": "force-https" },
+    { "name": "harvester.fr", "include_subdomains": true, "mode": "force-https" },
+    { "name": "haselsteiner.me", "include_subdomains": true, "mode": "force-https" },
+    { "name": "helgakristoffer.com", "include_subdomains": true, "mode": "force-https" },
+    { "name": "helgakristoffer.wedding", "include_subdomains": true, "mode": "force-https" },
+    { "name": "heutger.net", "include_subdomains": true, "mode": "force-https" },
+    { "name": "hpkp-faq.de", "include_subdomains": true, "mode": "force-https" },
+    { "name": "imoni-blog.net", "include_subdomains": true, "mode": "force-https" },
+    { "name": "insideaudit.com", "include_subdomains": true, "mode": "force-https" },
+    { "name": "instela.com", "include_subdomains": true, "mode": "force-https" },
+    { "name": "interisaudit.com", "include_subdomains": true, "mode": "force-https" },
+    { "name": "intxt.net", "include_subdomains": true, "mode": "force-https" },
+    { "name": "itsg-faq.de", "include_subdomains": true, "mode": "force-https" },
+    { "name": "j3e.de", "include_subdomains": true, "mode": "force-https" },
+    { "name": "jakubboucek.cz", "include_subdomains": true, "mode": "force-https" },
+    { "name": "jennedebleser.com", "include_subdomains": true, "mode": "force-https" },
+    { "name": "jhalderm.com", "include_subdomains": true, "mode": "force-https" },
+    { "name": "jirav.io", "include_subdomains": true, "mode": "force-https" },
+    { "name": "josefjanosec.com", "include_subdomains": true, "mode": "force-https" },
+    { "name": "klasfauseweh.de", "include_subdomains": true, "mode": "force-https" },
+    { "name": "lashstuff.com", "include_subdomains": true, "mode": "force-https" },
+    { "name": "linux.fi", "include_subdomains": true, "mode": "force-https" },
+    { "name": "linuxgeek.ro", "include_subdomains": true, "mode": "force-https" },
+    { "name": "liquid.cz", "include_subdomains": true, "mode": "force-https" },
+    { "name": "lukasunger.net", "include_subdomains": true, "mode": "force-https" },
+    { "name": "mac-torrents.me", "include_subdomains": true, "mode": "force-https" },
+    { "name": "marlen.cz", "include_subdomains": true, "mode": "force-https" },
+    { "name": "maveris.com", "include_subdomains": true, "mode": "force-https" },
+    { "name": "melted.pw", "include_subdomains": true, "mode": "force-https" },
+    { "name": "mexicansbook.ru", "include_subdomains": true, "mode": "force-https" },
+    { "name": "milanpala.cz", "include_subdomains": true, "mode": "force-https" },
+    { "name": "missdream.org", "include_subdomains": true, "mode": "force-https" },
+    { "name": "moreapp.co.uk", "include_subdomains": true, "mode": "force-https" },
+    { "name": "murraycoin.org", "include_subdomains": true, "mode": "force-https" },
+    { "name": "nakliyatsirketi.biz", "include_subdomains": true, "mode": "force-https" },
+    { "name": "nbb.io", "include_subdomains": true, "mode": "force-https" },
+    { "name": "nder.be", "include_subdomains": true, "mode": "force-https" },
+    { "name": "netwarc.nl", "include_subdomains": true, "mode": "force-https" },
+    { "name": "nikao-tech.com", "include_subdomains": true, "mode": "force-https" },
+    { "name": "nikobradshaw.com", "include_subdomains": true, "mode": "force-https" },
+    { "name": "nikolasbradshaw.com", "include_subdomains": true, "mode": "force-https" },
+    { "name": "nomial.co.uk", "include_subdomains": true, "mode": "force-https" },
+    { "name": "npmcdn.com", "include_subdomains": true, "mode": "force-https" },
+    { "name": "nutritionculture.com", "include_subdomains": true, "mode": "force-https" },
+    { "name": "oasis.mobi", "include_subdomains": true, "mode": "force-https" },
+    { "name": "offshoot.rentals", "include_subdomains": true, "mode": "force-https" },
+    { "name": "opsbears.com", "include_subdomains": true, "mode": "force-https" },
+    { "name": "otchecker.com", "include_subdomains": true, "mode": "force-https" },
+    { "name": "penfold.fr", "include_subdomains": true, "mode": "force-https" },
+    { "name": "pgmann.cf", "include_subdomains": true, "mode": "force-https" },
+    { "name": "pier28.com", "include_subdomains": true, "mode": "force-https" },
+    { "name": "piligrimname.com", "include_subdomains": true, "mode": "force-https" },
+    { "name": "poleartschool.com", "include_subdomains": true, "mode": "force-https" },
+    { "name": "posterspy.com", "include_subdomains": true, "mode": "force-https" },
+    { "name": "postn.eu", "include_subdomains": true, "mode": "force-https" },
+    { "name": "powercloud.technology", "include_subdomains": true, "mode": "force-https" },
+    { "name": "proos.nl", "include_subdomains": true, "mode": "force-https" },
+    { "name": "psw-group.de", "include_subdomains": true, "mode": "force-https" },
+    { "name": "psw.academy", "include_subdomains": true, "mode": "force-https" },
+    { "name": "psw.consulting", "include_subdomains": true, "mode": "force-https" },
+    { "name": "psw.net", "include_subdomains": true, "mode": "force-https" },
+    { "name": "realcapoeira.ru", "include_subdomains": true, "mode": "force-https" },
+    { "name": "ricki-z.com", "include_subdomains": true, "mode": "force-https" },
+    { "name": "right-to-love.name", "include_subdomains": true, "mode": "force-https" },
+    { "name": "robandjanine.com", "include_subdomains": true, "mode": "force-https" },
+    { "name": "robspc.repair", "include_subdomains": true, "mode": "force-https" },
+    { "name": "rodolfo.gs", "include_subdomains": true, "mode": "force-https" },
+    { "name": "safematix.com", "include_subdomains": true, "mode": "force-https" },
+    { "name": "sanderdorigo.nl", "include_subdomains": true, "mode": "force-https" },
+    { "name": "sandervankasteel.nl", "include_subdomains": true, "mode": "force-https" },
+    { "name": "sdrobs.com", "include_subdomains": true, "mode": "force-https" },
+    { "name": "securedevelop.net", "include_subdomains": true, "mode": "force-https" },
+    { "name": "shopbakersnook.com", "include_subdomains": true, "mode": "force-https" },
+    { "name": "signing-milter.org", "include_subdomains": true, "mode": "force-https" },
+    { "name": "simonkjellberg.com", "include_subdomains": true, "mode": "force-https" },
+    { "name": "simphony.cz", "include_subdomains": true, "mode": "force-https" },
+    { "name": "snapappts.com", "include_subdomains": true, "mode": "force-https" },
+    { "name": "socialhead.io", "include_subdomains": true, "mode": "force-https" },
+    { "name": "sogutma.com.tr", "include_subdomains": true, "mode": "force-https" },
+    { "name": "soporte.cc", "include_subdomains": true, "mode": "force-https" },
+    { "name": "ssl-zertifikate.de", "include_subdomains": true, "mode": "force-https" },
+    { "name": "sslzilla.de", "include_subdomains": true, "mode": "force-https" },
+    { "name": "steamdb.info", "include_subdomains": true, "mode": "force-https" },
+    { "name": "stupus.com", "include_subdomains": true, "mode": "force-https" },
+    { "name": "taborsky.cz", "include_subdomains": true, "mode": "force-https" },
+    { "name": "teampaddymurphy.ie", "include_subdomains": true, "mode": "force-https" },
+    { "name": "teampoint.cz", "include_subdomains": true, "mode": "force-https" },
+    { "name": "therewill.be", "include_subdomains": true, "mode": "force-https" },
+    { "name": "thomspooren.nl", "include_subdomains": true, "mode": "force-https" },
+    { "name": "threelions.ch", "include_subdomains": true, "mode": "force-https" },
+    { "name": "tm-solutions.eu", "include_subdomains": true, "mode": "force-https" },
+    { "name": "tomasjacik.cz", "include_subdomains": true, "mode": "force-https" },
+    { "name": "trainex.org", "include_subdomains": true, "mode": "force-https" },
+    { "name": "trinitycore.org", "include_subdomains": true, "mode": "force-https" },
+    { "name": "twaka.com", "include_subdomains": true, "mode": "force-https" },
+    { "name": "twist.party", "include_subdomains": true, "mode": "force-https" },
+    { "name": "urandom.eu.org", "include_subdomains": true, "mode": "force-https" },
+    { "name": "vallis.net", "include_subdomains": true, "mode": "force-https" },
+    { "name": "viscopic.com", "include_subdomains": true, "mode": "force-https" },
+    { "name": "viva-french.com", "include_subdomains": true, "mode": "force-https" },
+    { "name": "vyberodhadce.cz", "include_subdomains": true, "mode": "force-https" },
+    { "name": "webtasarim.pw", "include_subdomains": true, "mode": "force-https" },
+    { "name": "welldrake.com", "include_subdomains": true, "mode": "force-https" },
+    { "name": "werdeeintimo.de", "include_subdomains": true, "mode": "force-https" },
+    { "name": "wo2forum.nl", "include_subdomains": true, "mode": "force-https" },
+    { "name": "wrara.org", "include_subdomains": true, "mode": "force-https" },
+    { "name": "wyeworks.com", "include_subdomains": true, "mode": "force-https" },
+    { "name": "xetown.com", "include_subdomains": true, "mode": "force-https" },
+    { "name": "xss.sk", "include_subdomains": true, "mode": "force-https" },
+    { "name": "yingyj.com", "include_subdomains": true, "mode": "force-https" },
+    { "name": "zgrep.org", "include_subdomains": true, "mode": "force-https" },
+    { "name": "zortium.report", "include_subdomains": true, "mode": "force-https" }
   ],
 
   // |ReportUMAOnPinFailure| uses these to report which domain was associated
diff --git a/net/http/transport_security_state_unittest.cc b/net/http/transport_security_state_unittest.cc
index 21160fbd..afcc42c 100644
--- a/net/http/transport_security_state_unittest.cc
+++ b/net/http/transport_security_state_unittest.cc
@@ -1254,12 +1254,6 @@
   MockCertificateReportSender mock_report_sender;
   state.SetReportSender(&mock_report_sender);
 
-  // Check that a report is not sent for a Report-Only header with no
-  // violation.
-  std::string header =
-      "pin-sha256=\"" + std::string(kGoodPin1) + "\";pin-sha256=\"" +
-      std::string(kGoodPin2) + "\";pin-sha256=\"" + std::string(kGoodPin3) +
-      "\";report-uri=\"" + report_uri.spec() + "\";includeSubdomains";
   SSLInfo ssl_info;
   ssl_info.is_issued_by_known_root = true;
   ssl_info.unverified_cert = cert1;
@@ -1267,6 +1261,25 @@
   for (size_t i = 0; kGoodPath[i]; i++)
     EXPECT_TRUE(AddHash(kGoodPath[i], &ssl_info.public_key_hashes));
 
+  // HTTPS report URIs on the same host as the pin violation should not
+  // be allowed, to avoid going into a report-sending loop.
+  std::string header = "pin-sha256=\"" + std::string(kGoodPin1) +
+                       "\";pin-sha256=\"" + std::string(kGoodPin2) +
+                       "\";pin-sha256=\"" + std::string(kGoodPin3) +
+                       "\";report-uri=\"https://" + host_port_pair.host() +
+                       "/report\";includeSubdomains";
+  EXPECT_TRUE(
+      state.ProcessHPKPReportOnlyHeader(header, host_port_pair, ssl_info));
+  EXPECT_TRUE(mock_report_sender.latest_report_uri().is_empty());
+
+  // Check that a report is not sent for a Report-Only header with no
+  // violation.
+  mock_report_sender.Clear();
+  header = "pin-sha256=\"" + std::string(kGoodPin1) + "\";pin-sha256=\"" +
+           std::string(kGoodPin2) + "\";pin-sha256=\"" +
+           std::string(kGoodPin3) + "\";report-uri=\"" + report_uri.spec() +
+           "\";includeSubdomains";
+
   EXPECT_TRUE(
       state.ProcessHPKPReportOnlyHeader(header, host_port_pair, ssl_info));
   EXPECT_EQ(GURL(), mock_report_sender.latest_report_uri());
@@ -1286,17 +1299,6 @@
   ASSERT_NO_FATAL_FAILURE(CheckHPKPReport(report, host_port_pair, true, kHost,
                                           cert1.get(), cert2.get(),
                                           ssl_info.public_key_hashes));
-
-  // HTTPS report URIs on the same host as the pin violation should not
-  // be allowed, to avoid going into a report-sending loop.
-  mock_report_sender.Clear();
-  header = "pin-sha256=\"" + std::string(kGoodPin1) + "\";pin-sha256=\"" +
-           std::string(kGoodPin2) + "\";pin-sha256=\"" +
-           std::string(kGoodPin3) + "\";report-uri=\"https://" +
-           host_port_pair.host() + "/report\";includeSubdomains";
-  EXPECT_TRUE(
-      state.ProcessHPKPReportOnlyHeader(header, host_port_pair, ssl_info));
-  EXPECT_TRUE(mock_report_sender.latest_report_uri().is_empty());
 }
 
 // Tests that Report-Only reports are not sent on certs that chain to
@@ -1474,4 +1476,75 @@
   EXPECT_EQ(http_report_uri, mock_report_sender.latest_report_uri());
 }
 
+// Tests that redundant reports are rate-limited.
+TEST_F(TransportSecurityStateTest, HPKPReportRateLimiting) {
+  HostPortPair host_port_pair(kHost, kPort);
+  HostPortPair subdomain_host_port_pair(kSubdomain, kPort);
+  GURL report_uri(kReportUri);
+  // Two dummy certs to use as the server-sent and validated chains. The
+  // contents don't matter.
+  scoped_refptr<X509Certificate> cert1 =
+      ImportCertFromFile(GetTestCertsDirectory(), "test_mail_google_com.pem");
+  scoped_refptr<X509Certificate> cert2 =
+      ImportCertFromFile(GetTestCertsDirectory(), "expired_cert.pem");
+  ASSERT_TRUE(cert1);
+  ASSERT_TRUE(cert2);
+
+  HashValueVector good_hashes, bad_hashes;
+
+  for (size_t i = 0; kGoodPath[i]; i++)
+    EXPECT_TRUE(AddHash(kGoodPath[i], &good_hashes));
+  for (size_t i = 0; kBadPath[i]; i++)
+    EXPECT_TRUE(AddHash(kBadPath[i], &bad_hashes));
+
+  TransportSecurityState state;
+  MockCertificateReportSender mock_report_sender;
+  state.SetReportSender(&mock_report_sender);
+
+  const base::Time current_time = base::Time::Now();
+  const base::Time expiry = current_time + base::TimeDelta::FromSeconds(1000);
+  state.AddHPKP(kHost, expiry, true, good_hashes, report_uri);
+
+  EXPECT_EQ(GURL(), mock_report_sender.latest_report_uri());
+  EXPECT_EQ(std::string(), mock_report_sender.latest_report());
+
+  std::string failure_log;
+  EXPECT_FALSE(state.CheckPublicKeyPins(
+      host_port_pair, true, bad_hashes, cert1.get(), cert2.get(),
+      TransportSecurityState::ENABLE_PIN_REPORTS, &failure_log));
+
+  // A report should have been sent. Check that it contains the
+  // right information.
+  EXPECT_EQ(report_uri, mock_report_sender.latest_report_uri());
+  std::string report = mock_report_sender.latest_report();
+  ASSERT_FALSE(report.empty());
+  ASSERT_NO_FATAL_FAILURE(CheckHPKPReport(report, host_port_pair, true, kHost,
+                                          cert1.get(), cert2.get(),
+                                          good_hashes));
+  mock_report_sender.Clear();
+
+  // Now trigger the same violation; a duplicative report should not be
+  // sent.
+  EXPECT_FALSE(state.CheckPublicKeyPins(
+      host_port_pair, true, bad_hashes, cert1.get(), cert2.get(),
+      TransportSecurityState::ENABLE_PIN_REPORTS, &failure_log));
+  EXPECT_EQ(GURL(), mock_report_sender.latest_report_uri());
+  EXPECT_EQ(std::string(), mock_report_sender.latest_report());
+
+  // Trigger the same violation but with a different report-uri: it
+  // should be sent.
+  GURL report_uri2("http://report-example2.test/test");
+  state.AddHPKP(kHost, expiry, true, good_hashes, report_uri2);
+  EXPECT_FALSE(state.CheckPublicKeyPins(
+      host_port_pair, true, bad_hashes, cert1.get(), cert2.get(),
+      TransportSecurityState::ENABLE_PIN_REPORTS, &failure_log));
+  EXPECT_EQ(report_uri2, mock_report_sender.latest_report_uri());
+  report = mock_report_sender.latest_report();
+  ASSERT_FALSE(report.empty());
+  ASSERT_NO_FATAL_FAILURE(CheckHPKPReport(report, host_port_pair, true, kHost,
+                                          cert1.get(), cert2.get(),
+                                          good_hashes));
+  mock_report_sender.Clear();
+}
+
 }  // namespace net
diff --git a/net/tools/epoll_server/epoll_server.cc b/net/tools/epoll_server/epoll_server.cc
index aa1c2da..4c1d34b 100644
--- a/net/tools/epoll_server/epoll_server.cc
+++ b/net/tools/epoll_server/epoll_server.cc
@@ -489,7 +489,7 @@
 }
 
 int64 EpollServer::NowInUsec() const {
-  return base::Time::Now().ToInternalValue();
+  return (base::Time::Now() - base::Time::UnixEpoch()).InMicroseconds();
 }
 
 int64 EpollServer::ApproximateNowInUsec() const {
diff --git a/net/url_request/url_request_job.cc b/net/url_request/url_request_job.cc
index 812d8d8..2747f22 100644
--- a/net/url_request/url_request_job.cc
+++ b/net/url_request/url_request_job.cc
@@ -962,7 +962,7 @@
   DCHECK_GE(total_received_bytes, last_notified_total_received_bytes_);
   if (total_received_bytes > last_notified_total_received_bytes_) {
     network_delegate_->NotifyNetworkBytesReceived(
-        *request_, total_received_bytes - last_notified_total_received_bytes_);
+        request_, total_received_bytes - last_notified_total_received_bytes_);
   }
   last_notified_total_received_bytes_ = total_received_bytes;
 
@@ -971,7 +971,7 @@
   DCHECK_GE(total_sent_bytes, last_notified_total_sent_bytes_);
   if (total_sent_bytes > last_notified_total_sent_bytes_) {
     network_delegate_->NotifyNetworkBytesSent(
-        *request_, total_sent_bytes - last_notified_total_sent_bytes_);
+        request_, total_sent_bytes - last_notified_total_sent_bytes_);
   }
   last_notified_total_sent_bytes_ = total_sent_bytes;
 }
diff --git a/net/url_request/url_request_test_util.cc b/net/url_request/url_request_test_util.cc
index 0c240b8..f98894a 100644
--- a/net/url_request/url_request_test_util.cc
+++ b/net/url_request/url_request_test_util.cc
@@ -506,15 +506,15 @@
   }
 }
 
-void TestNetworkDelegate::OnNetworkBytesReceived(const URLRequest& request,
+void TestNetworkDelegate::OnNetworkBytesReceived(URLRequest* request,
                                                  int64_t bytes_received) {
-  event_order_[request.identifier()] += "OnNetworkBytesReceived\n";
+  event_order_[request->identifier()] += "OnNetworkBytesReceived\n";
   total_network_bytes_received_ += bytes_received;
 }
 
-void TestNetworkDelegate::OnNetworkBytesSent(const URLRequest& request,
+void TestNetworkDelegate::OnNetworkBytesSent(URLRequest* request,
                                              int64_t bytes_sent) {
-  event_order_[request.identifier()] += "OnNetworkBytesSent\n";
+  event_order_[request->identifier()] += "OnNetworkBytesSent\n";
   total_network_bytes_sent_ += bytes_sent;
 }
 
diff --git a/net/url_request/url_request_test_util.h b/net/url_request/url_request_test_util.h
index 74987d6..07728cbd 100644
--- a/net/url_request/url_request_test_util.h
+++ b/net/url_request/url_request_test_util.h
@@ -321,10 +321,9 @@
       GURL* allowed_unsafe_redirect_url) override;
   void OnBeforeRedirect(URLRequest* request, const GURL& new_location) override;
   void OnResponseStarted(URLRequest* request) override;
-  void OnNetworkBytesReceived(const URLRequest& request,
+  void OnNetworkBytesReceived(URLRequest* request,
                               int64_t bytes_received) override;
-  void OnNetworkBytesSent(const URLRequest& request,
-                          int64_t bytes_sent) override;
+  void OnNetworkBytesSent(URLRequest* request, int64_t bytes_sent) override;
   void OnCompleted(URLRequest* request, bool started) override;
   void OnURLRequestDestroyed(URLRequest* request) override;
   void OnPACScriptError(int line_number, const base::string16& error) override;
diff --git a/styleguide/c++/c++11.html b/styleguide/c++/c++11.html
index 3da5810..ce6535a 100644
--- a/styleguide/c++/c++11.html
+++ b/styleguide/c++/c++11.html
@@ -30,16 +30,15 @@
 more restrictive if they need to compile on more toolchains than Chromium.</p>
 
 <p>You can propose to make a feature available or to ban a
-feature by sending an email to chromium-dev. Ideally include a short blurb
-on what the feature is, and why you think it should or should not be allowed.
-Ideally, the list will arrive at some consensus and the wiki page will be
-updated to mention that consensus. If there's no consensus,
-<code>src/styleguide/C++/OWNERS</code> get to decide -- for divisive features, we expect
-the decision to be to not use the feature yet and possibly discuss it again a
-few months later, when we have more experience with the language.</p>
-
-<p class="warning">Unless otherwise noted, <strong>no</strong> C++11
-<strong>library</strong> features are allowed.</p>
+feature by sending an email to <a
+href="https://groups.google.com/a/chromium.org/forum/#!forum/cxx">cxx@chromium.org</a>.
+Ideally include a short blurb on what the feature is, and why you think it
+should or should not be allowed.  Ideally, the list will arrive at some
+consensus and the wiki page will be updated to mention that consensus. If
+there's no consensus, <code>src/styleguide/C++/OWNERS</code> get to decide --
+for divisive features, we expect the decision to be to not use the feature yet
+and possibly discuss it again a few months later, when we have more experience
+with the language.</p>
 
 <h2 id="whitelist">C++11 Allowed Features</h2>
 
@@ -199,7 +198,7 @@
 <td>Recommended for new code.
 <a href="https://groups.google.com/a/chromium.org/forum/#!topic/chromium-dev/4mijeJHzxLg">Discussion thread</a>.
 <a href="https://google-styleguide.googlecode.com/svn/trunk/cppguide.html#0_and_nullptr/NULL">Google Style Guide</a>.
-Note: <code>std::nullptr_t</code> is a library feature and not available.
+<code>std::nullptr_t</code> can be used too.
 </td>
 </tr>
 
@@ -260,6 +259,31 @@
 </tbody>
 </table>
 
+<h2 id="whitelist">C++11 Allowed Library Features</h2>
+
+<p>The following library features are currently allowed.</p>
+
+<table id="whitelist_lib_list" class="unlined striped">
+<tbody>
+
+<tr>
+<th style='width:240px;'>Feature or Library</th>
+<th style='width:240px;'>Snippet</th>
+<th style='width:240px;'>Description</th>
+<th style='width:240px;'>Documentation Link</th>
+<th style='width:240px;'>Notes</th>
+</tr>
+
+<tr>
+<td>Containers containing movable types</td>
+<td><code>vector&lt;scoped_ptr&gt;</code></td>
+<td>Enables containers that contain move-only types like <code>scoped_ptr</code></td>
+<td>TODO</td>
+<td>Allows getting rid of <a href="http://crbug.com/554289">ScopedVector</a></td>
+</tr>
+</tbody>
+</table>
+
 <h2 id="blacklist">C++11 Blacklist (Disallowed and Banned Features)</h2>
 
 <p>This section lists features that are not allowed to be used yet.
@@ -387,6 +411,50 @@
 </tbody>
 </table>
 
+<h3 id="whitelist">C++11 Banned Library Features</h3>
+
+<p>This section lists C++11 library features that are not allowed in the Chromium codebase.</p>
+
+<table id="blacklist_lib_list" class="unlined striped">
+<tbody>
+
+<tr>
+<th style='width:240px;'>Feature</th>
+<th style='width:240px;'>Snippet</th>
+<th style='width:240px;'>Description</th>
+<th style='width:240px;'>Documentation Link</th>
+<th style='width:240px;'>Notes</th>
+</tr>
+
+<tr>
+<td>Chrono Library</td>
+<td><code>&lt;chrono&gt;</code></td>
+<td>Provides a standard date and time library</td>
+<td><a href="http://en.cppreference.com/w/cpp/chrono">Date and time utilities</a></td>
+<td>Duplicated <code>Time</code> APIs in <code>base/</code>. Keep using the <code>base/</code> classes.</td>
+</tr>
+
+<tr>
+<td>Regex Library</td>
+<td><code>&lt;regex&gt;</code></td>
+<td>Provides a standard regular expressions library</td>
+<td><a href="http://en.cppreference.com/w/cpp/regex">Regular expressions library</a></td>
+<td>We already have too many regular expression libraries in Chromium. Use re2 when in doubt.</td>
+</tr>
+
+<tr>
+<td>Thread Library</td>
+<td><code>&lt;thread&gt; support, including &lt;future&gt;,
+&lt;mutex&gt;, &lt;condition_variable&gt;</code></td>
+<td>Provides a standard mulitthreading library using <code>std::thread</code> and associates</td>
+<td><a href="http://en.cppreference.com/w/cpp/thread">Thread support library</a></td>
+<td>C++11 has all kinds of classes for threads, mutexes, etc. Since we already have good code for this in <code>base/</code>, we should keep using the base classes, at least at first. <code>base::Thread</code> is tightly coupled to <code>MessageLoop</code> which would make it hard to replace. We should investigate using standard mutexes, or unique_lock, etc. to replace our locking/synchronization classes.</td>
+</tr>
+
+</tbody>
+</table>
+
+
 <h3 id="blacklist_review">C++11 Features To Be Discussed</h3>
 
 <p>The following C++ language features are currently disallowed.
@@ -459,6 +527,15 @@
 </tr>
 
 <tr>
+<td>Ref-qualified Member Functions</td>
+<td><code>class T {<br/>&nbsp;&nbsp;void f() & {}<br/>&nbsp;&nbsp;void f() && {}<br/>};<br/>t.f();  // first<br/>T().f(); // second<br/>std::move(t).f(); // second</code></td>
+<td>Allows class member functions to only bind to |this| as an rvalue or lvalue.</td>
+<td><a href="http://en.cppreference.com/w/cpp/language/member_functions">
+Member functions</a></td>
+<td>Banned in the google3 C++11 library style guide, but being considered for use in bind/callback in google3 and the standard library.</td>
+</tr>
+
+<tr>
 <td>Union Class Members</td>
 <td><code>union <i>name</i> { <i>class</i> <i>var</i>}</code></td>
 <td>Allows class type members</td>
@@ -479,15 +556,9 @@
 </tbody>
 </table>
 
-<h3 id="blacklist_stdlib">C++11 Standard Library features</h3>
+<h3 id="blacklist_stdlib">C++11 Standard Library Features To Be Discussed</h3>
 
-<details>
-
-<p><summary class="note">All C++11 <strong>Standard Library features are currently
-banned</strong>, because they are not supported on all of our toolchains yet.
-In particular, chromium/android is currently using STLport, and chromium/mac is
-currently using libstdc++4.2, which predate C++11.
-</summary></p>
+<p>The following C++ library features are currently disallowed. See the top of this page on how to propose moving a feature from this list into the allowed or banned sections. Note that not all of these features work in all our compilers yet.</p>
 
 <table id="banned_stdlib" class="unlined striped">
 
@@ -577,14 +648,6 @@
 </tr>
 
 <tr>
-<td>Chrono Library</td>
-<td><code>&lt;chrono&gt;</code></td>
-<td>Provides a standard date and time library</td>
-<td><a href="http://en.cppreference.com/w/cpp/chrono">Date and time utilities</a></td>
-<td></td>
-</tr>
-
-<tr>
 <td>Complex Inverse Trigonometric and Hyperbolic Functions</td>
 <td>Functions within <code>&lt;complex&gt;</code></td>
 <td>Adds inverse trigonomentric and hyperbolic non-member functions to
@@ -785,14 +848,6 @@
 </tr>
 
 <tr>
-<td>Regex Library</td>
-<td><code>&lt;regex&gt;</code></td>
-<td>Provides a standard regular expressions library</td>
-<td><a href="http://en.cppreference.com/w/cpp/regex">Regular expressions library</a></td>
-<td></td>
-</tr>
-
-<tr>
 <td>Shared Pointers</td>
 <td><code>std::shared_ptr</code></td>
 <td>Allows shared ownership of a pointer through reference counts</td>
@@ -867,15 +922,6 @@
 </tr>
 
 <tr>
-<td>Thread Library</td>
-<td><code>&lt;thread&gt; support, including &lt;future&gt;,
-&lt;mutex&gt;, &lt;condition_variable&gt;</code></td>
-<td>Provides a standard mulitthreading library using <code>std::thread</code> and associates</td>
-<td><a href="http://en.cppreference.com/w/cpp/thread">Thread support library</a></td>
-<td></td>
-</tr>
-
-<tr>
 <td>Tuples</td>
 <td><code>std::tuple</code></td>
 <td>A fixed-size ordered collection of values of mixed types</td>
@@ -981,8 +1027,6 @@
 </tbody>
 </table>
 
-</details>
-
 </div>
 </body>
 </html>
diff --git a/sync/BUILD.gn b/sync/BUILD.gn
index 16ce82de..a1ee2bebb 100644
--- a/sync/BUILD.gn
+++ b/sync/BUILD.gn
@@ -609,6 +609,7 @@
     "api/attachments/attachment_id_unittest.cc",
     "api/attachments/attachment_metadata_unittest.cc",
     "api/attachments/attachment_unittest.cc",
+    "api/entity_data_unittest.cc",
     "api/sync_change_unittest.cc",
     "api/sync_data_unittest.cc",
     "api/sync_error_unittest.cc",
diff --git a/sync/android/javatests/src/org/chromium/sync/AndroidSyncSettingsTest.java b/sync/android/javatests/src/org/chromium/sync/AndroidSyncSettingsTest.java
index 7e81802..cabdced 100644
--- a/sync/android/javatests/src/org/chromium/sync/AndroidSyncSettingsTest.java
+++ b/sync/android/javatests/src/org/chromium/sync/AndroidSyncSettingsTest.java
@@ -7,6 +7,7 @@
 import android.accounts.Account;
 import android.content.Context;
 import android.os.Bundle;
+import android.test.FlakyTest;
 import android.test.InstrumentationTestCase;
 import android.test.suitebuilder.annotation.SmallTest;
 
@@ -144,8 +145,12 @@
         });
     }
 
-    @SmallTest
-    @Feature({"Sync"})
+    @FlakyTest
+    /*
+     * http://crbug.com/554154
+     * @SmallTest
+     * @Feature({"Sync"})
+     */
     public void testAccountInitialization() throws InterruptedException {
         // mAccount was set to be syncable and not have periodic syncs.
         assertEquals(1, mSyncContentResolverDelegate.mSetIsSyncableCalls);
diff --git a/sync/api/entity_data.cc b/sync/api/entity_data.cc
index bfff4c7..fdb9b47 100644
--- a/sync/api/entity_data.cc
+++ b/sync/api/entity_data.cc
@@ -4,54 +4,38 @@
 
 #include "sync/api/entity_data.h"
 
-#include "sync/protocol/entity_metadata.pb.h"
-#include "sync/protocol/sync.pb.h"
-#include "sync/util/time.h"
+#include "base/logging.h"
 
 namespace syncer_v2 {
 
-EntityData::EntityData(const std::string& client_id,
-                       const std::string& non_unique_name,
-                       const sync_pb::EntitySpecifics* specifics,
-                       bool is_deleted)
-    : client_id_(client_id),
-      non_unique_name_(non_unique_name),
-      is_deleted_(is_deleted) {
-  if (!is_deleted) {
-    DCHECK(specifics);
-    specifics_.set_value(*specifics);
-  }
-}
-
+EntityData::EntityData() {}
 EntityData::~EntityData() {}
 
-// Static.
-EntityData EntityData::CreateData(const std::string& client_id,
-                                  const std::string& non_unique_name,
-                                  const sync_pb::EntitySpecifics& specifics) {
-  return EntityData(client_id, non_unique_name, &specifics, false);
+void EntityData::Swap(EntityData* other) {
+  server_id.swap(other->server_id);
+  client_tag_hash.swap(other->client_tag_hash);
+  non_unique_name.swap(other->non_unique_name);
+
+  specifics.Swap(&other->specifics);
+
+  std::swap(creation_time, other->creation_time);
+  std::swap(modification_time, other->modification_time);
+
+  parent_id.swap(other->parent_id);
+  unique_position.Swap(&other->unique_position);
 }
 
-// Static.
-EntityData EntityData::CreateDelete(const std::string& sync_tag,
-                                    const std::string& non_unique_name) {
-  return EntityData(sync_tag, non_unique_name, nullptr, true);
+void EntityDataTraits::SwapValue(EntityData* dest, EntityData* src) {
+  dest->Swap(src);
 }
 
-const sync_pb::EntitySpecifics& EntityData::specifics() const {
-  DCHECK(!is_deleted());
-  return specifics_.value();
+bool EntityDataTraits::HasValue(const EntityData& value) {
+  return !value.client_tag_hash.empty();
 }
 
-bool EntityData::HasMetadata() const {
-  return metadata_.client_id() == client_id_;
-}
-
-void EntityData::SetMetadata(const sync_pb::EntityMetadata& metadata) {
-  DCHECK(!HasMetadata());
-  DCHECK_EQ(client_id_, metadata.client_id());
-  modification_time_ = syncer::ProtoTimeToTime(metadata.modification_time());
-  metadata_ = metadata;
+const EntityData& EntityDataTraits::DefaultValue() {
+  CR_DEFINE_STATIC_LOCAL(EntityData, default_instance, ());
+  return default_instance;
 }
 
 }  // namespace syncer_v2
diff --git a/sync/api/entity_data.h b/sync/api/entity_data.h
index c5c2de1a..5c966b9 100644
--- a/sync/api/entity_data.h
+++ b/sync/api/entity_data.h
@@ -8,70 +8,71 @@
 #include <string>
 #include <vector>
 
+#include "base/macros.h"
 #include "base/time/time.h"
 #include "sync/base/sync_export.h"
 #include "sync/internal_api/public/util/proto_value_ptr.h"
-#include "sync/protocol/entity_metadata.pb.h"
-
-namespace sync_pb {
-class EntityMetadata;
-class EntitySpecifics;
-}  // namespace sync_pb
+#include "sync/protocol/sync.pb.h"
 
 namespace syncer_v2 {
 
-// A light-weight container for sync entity data.
-//
-// EntityData objects either have specifics data or represent a deleted
-// entity that does not have specifics. This component is immutable.
-//
-// EntityData objects can also be modified by adding EntityMetadata to them,
-// which is stored in its serialized form for persistence to storage.
-class SYNC_EXPORT EntityData {
+// A light-weight container for sync entity data which represents either
+// local data created on the ModelTypeService side or remote data created
+// on ModelTypeWorker.
+// EntityData is supposed to be wrapped and passed by reference.
+struct SYNC_EXPORT EntityData {
  public:
+  EntityData();
   ~EntityData();
 
-  // Default copy and assign welcome.
+  // Typically this is a server assigned sync ID, although for a local change
+  // that represents a new entity this field might be either empty or contain
+  // a temporary client sync ID.
+  std::string server_id;
 
-  static EntityData CreateData(const std::string& client_id,
-                               const std::string& non_unique_name,
-                               const sync_pb::EntitySpecifics& specifics);
+  // A hash based on the client tag and model type.
+  // Used for various map lookups. Should always be available.
+  // Sent to the server as SyncEntity::client_defined_unique_tag.
+  std::string client_tag_hash;
 
-  static EntityData CreateDelete(const std::string& client_id,
-                                 const std::string& non_unique_name);
+  // Entity name, used mostly for Debug purposes.
+  std::string non_unique_name;
 
-  const std::string& client_id() const { return client_id_; }
-  const std::string& non_unique_name() const { return non_unique_name_; }
-  bool is_deleted() const { return is_deleted_; }
-  const sync_pb::EntitySpecifics& specifics() const;
-  bool HasMetadata() const;
-  void SetMetadata(const sync_pb::EntityMetadata& metadata);
-  // Maybe this should be private with SMTP and ModelTypeWorker as friends?
-  const sync_pb::EntityMetadata& GetMetadata() const { return metadata_; }
+  // Model type specific sync data.
+  sync_pb::EntitySpecifics specifics;
+
+  // Entity creation and modification timestamps.
+  base::Time creation_time;
+  base::Time modification_time;
+
+  // Sync ID of the parent entity. This is supposed to be set only for
+  // hierarchical datatypes (e.g. Bookmarks).
+  std::string parent_id;
+
+  // Unique position of an entity among its siblings. This is supposed to be
+  // set only for datatypes that support positioning (e.g. Bookmarks).
+  sync_pb::UniquePosition unique_position;
+
+  // True if EntityData represents deleted entity; otherwise false.
+  // Note that EntityData would be considered to represent a deletion if it
+  // specifics hasn't been set.
+  bool is_deleted() { return specifics.ByteSize() == 0; }
 
  private:
-  EntityData(const std::string& client_id,
-             const std::string& non_unique_name,
-             const sync_pb::EntitySpecifics* specifics,
-             bool is_deleted);
+  friend struct EntityDataTraits;
+  // Used to transfer the data without copying.
+  void Swap(EntityData* other);
 
-  // Fields that are always present and don't change.
-  const std::string client_id_;
-  const std::string non_unique_name_;
-  syncer::syncable::EntitySpecificsPtr specifics_;
-  // TODO(maxbogue): This might be replaced by a ChangeType enum.
-  const bool is_deleted_;
-
-  // Present sometimes.
-  base::Time modification_time_;
-  sync_pb::EntityMetadata metadata_;
-
-  // Only set for bookmarks; should really be in bookmark specifics.
-  // std::string parent_tag_hash_;
-  // sync_pb::UniquePosition unique_position_;
+  DISALLOW_COPY_AND_ASSIGN(EntityData);
 };
 
-typedef std::vector<EntityData> EntityDataList;
+struct SYNC_EXPORT EntityDataTraits {
+  static void SwapValue(EntityData* dest, EntityData* src);
+  static bool HasValue(const EntityData& value);
+  static const EntityData& DefaultValue();
+};
+
+typedef syncer::ProtoValuePtr<EntityData, EntityDataTraits> EntityDataPtr;
 
 }  // namespace syncer_v2
 
diff --git a/sync/api/entity_data_unittest.cc b/sync/api/entity_data_unittest.cc
new file mode 100644
index 0000000..b61f086
--- /dev/null
+++ b/sync/api/entity_data_unittest.cc
@@ -0,0 +1,66 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "sync/api/entity_data.h"
+
+#include "sync/internal_api/public/base/model_type.h"
+#include "sync/internal_api/public/base/unique_position.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace syncer_v2 {
+
+class EntityDataTest : public testing::Test {
+ protected:
+  EntityDataTest() {}
+  ~EntityDataTest() override {}
+};
+
+TEST_F(EntityDataTest, IsDeleted) {
+  EntityData data;
+  EXPECT_TRUE(data.is_deleted());
+
+  syncer::AddDefaultFieldValue(syncer::BOOKMARKS, &data.specifics);
+  EXPECT_FALSE(data.is_deleted());
+}
+
+TEST_F(EntityDataTest, Swap) {
+  EntityData data;
+  syncer::AddDefaultFieldValue(syncer::BOOKMARKS, &data.specifics);
+  data.server_id = "server_id";
+  data.client_tag_hash = "client_tag_hash";
+  data.non_unique_name = "non_unique_name";
+  data.creation_time = base::Time::FromTimeT(10);
+  data.modification_time = base::Time::FromTimeT(20);
+  data.parent_id = "parent_id";
+
+  using syncer::UniquePosition;
+  UniquePosition unique_position =
+      UniquePosition::InitialPosition(UniquePosition::RandomSuffix());
+
+  unique_position.ToProto(&data.unique_position);
+
+  // Remember addresses of some data within EntitySpecific and UniquePosition
+  // to make sure that the underlying data isn't copied.
+  const sync_pb::BookmarkSpecifics* bookmark_specifics =
+      &data.specifics.bookmark();
+  const std::string* unique_position_value = &data.unique_position.value();
+
+  EntityDataPtr ptr;
+  ptr.swap_value(&data);
+
+  // Compare addresses of the data wrapped by EntityDataPtr to make sure that
+  // the underlying objects are exactly the same.
+  EXPECT_EQ(bookmark_specifics, &ptr->specifics.bookmark());
+  EXPECT_EQ(unique_position_value, &ptr->unique_position.value());
+
+  // Compare other fields.
+  EXPECT_EQ("server_id", ptr->server_id);
+  EXPECT_EQ("client_tag_hash", ptr->client_tag_hash);
+  EXPECT_EQ("non_unique_name", ptr->non_unique_name);
+  EXPECT_EQ("parent_id", ptr->parent_id);
+  EXPECT_EQ(base::Time::FromTimeT(10), ptr->creation_time);
+  EXPECT_EQ(base::Time::FromTimeT(20), ptr->modification_time);
+}
+
+}  // namespace syncer_v2
diff --git a/sync/internal_api/public/util/proto_value_ptr.h b/sync/internal_api/public/util/proto_value_ptr.h
index 540abd7..e634f7b8 100644
--- a/sync/internal_api/public/util/proto_value_ptr.h
+++ b/sync/internal_api/public/util/proto_value_ptr.h
@@ -7,15 +7,16 @@
 
 #include "base/gtest_prod_util.h"
 #include "base/memory/ref_counted.h"
-#include "sync/protocol/attachments.pb.h"
-#include "sync/protocol/sync.pb.h"
 
 namespace syncer_v2 {
-class EntityData;
-}
+FORWARD_DECLARE_TEST(EntityDataTest, Swap);
+}  // namespace syncable
 
 namespace syncer {
+
 namespace syncable {
+struct EntryKernel;
+}  // namespace syncable
 
 // Default traits struct for ProtoValuePtr - adapts a
 // ::google::protobuf::MessageLite derived type to be used with ProtoValuePtr.
@@ -23,6 +24,8 @@
 struct DefaultProtoValuePtrTraits {
   // Deep copy the value from |src| to |dest|.
   static void CopyValue(T* dest, const T& src) { dest->CopyFrom(src); }
+  // Swap the value with the source (to avoid deep copying).
+  static void SwapValue(T* dest, T* src) { dest->Swap(src); }
   // Parse the value from BLOB.
   static void ParseFromBlob(T* dest, const void* blob, int length) {
     dest->ParseFromArray(blob, length);
@@ -54,6 +57,8 @@
   class Wrapper : public base::RefCountedThreadSafe<Wrapper> {
    public:
     Wrapper(const T& value) { Traits::CopyValue(&value_, value); }
+    Wrapper(T* value) { Traits::SwapValue(&value_, value); }
+
     const T& value() const { return value_; }
     // Create wrapper by deserializing a BLOB.
     static Wrapper* ParseFromBlob(const void* blob, int length) {
@@ -84,12 +89,14 @@
   }
 
  private:
-  friend class syncer_v2::EntityData;
-  friend struct EntryKernel;
-  FRIEND_TEST_ALL_PREFIXES(ProtoValuePtrTest, BasicTest);
+  friend struct syncable::EntryKernel;
+  FRIEND_TEST_ALL_PREFIXES(ProtoValuePtrTest, ValueAssignment);
+  FRIEND_TEST_ALL_PREFIXES(ProtoValuePtrTest, ValueSwap);
   FRIEND_TEST_ALL_PREFIXES(ProtoValuePtrTest, SharingTest);
   FRIEND_TEST_ALL_PREFIXES(ProtoValuePtrTest, ParsingTest);
+  FRIEND_TEST_ALL_PREFIXES(syncer_v2::EntityDataTest, Swap);
 
+  // set the value to copy of |new_value|.
   void set_value(const T& new_value) {
     if (Traits::HasValue(new_value)) {
       wrapper_ = new Wrapper(new_value);
@@ -99,6 +106,16 @@
     }
   }
 
+  // Take over |src| value (swap).
+  void swap_value(T* src) {
+    if (Traits::HasValue(*src)) {
+      wrapper_ = new Wrapper(src);
+    } else {
+      // Don't store default value.
+      wrapper_ = nullptr;
+    }
+  }
+
   void load(const void* blob, int length) {
     wrapper_ = Wrapper::ParseFromBlob(blob, length);
   }
@@ -106,10 +123,6 @@
   scoped_refptr<Wrapper> wrapper_;
 };
 
-typedef ProtoValuePtr<sync_pb::EntitySpecifics> EntitySpecificsPtr;
-typedef ProtoValuePtr<sync_pb::AttachmentMetadata> AttachmentMetadataPtr;
-
-}  // namespace syncable
 }  // namespace syncer
 
 #endif  // SYNC_SYNCABLE_ENTRY_PROTO_FIELD_PTR_H_
diff --git a/sync/internal_api/public/util/proto_value_ptr_unittest.cc b/sync/internal_api/public/util/proto_value_ptr_unittest.cc
index 4479b5d..7d1c51553 100644
--- a/sync/internal_api/public/util/proto_value_ptr_unittest.cc
+++ b/sync/internal_api/public/util/proto_value_ptr_unittest.cc
@@ -4,19 +4,29 @@
 
 #include "sync/internal_api/public/util/proto_value_ptr.h"
 
+#include "base/memory/scoped_ptr.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace syncer {
-namespace syncable {
 
 namespace {
 
+// Simple test struct that wraps an integer
+struct IntValue {
+ public:
+  explicit IntValue(int value) { value_ = value; }
+  int value() { return value_; }
+
+ private:
+  int value_;
+};
+
 // TestValue class is used as a template argument with ProtoValuePtr<T>
 class TestValue {
  public:
-  TestValue() : value_(0), is_initialized_(false), is_default_(false) {}
+  TestValue() : value_(nullptr), is_default_(false) {}
   explicit TestValue(int value)
-      : value_(value), is_initialized_(true), is_default_(false) {}
+      : value_(new IntValue(value)), is_default_(false) {}
 
   ~TestValue() { g_delete_count++; }
 
@@ -30,8 +40,9 @@
   static int parse_count() { return g_parse_count; }
   static int delete_count() { return g_delete_count; }
 
-  int value() const { return value_; }
-  bool is_initialized() const { return is_initialized_; }
+  int value() const { return value_->value(); }
+  IntValue* value_ptr() const { return value_.get(); }
+  bool is_initialized() const { return value_; }
   bool is_default() const { return is_default_; }
 
   // TestValue uses the default traits struct with ProtoValuePtr<TestValue>.
@@ -45,11 +56,22 @@
     ASSERT_FALSE(is_default());
     ASSERT_TRUE(from.is_initialized());
     ASSERT_FALSE(from.is_default());
-    value_ = from.value();
-    is_initialized_ = true;
+    value_.reset(new IntValue(from.value()));
     g_copy_count++;
   }
 
+  void Swap(TestValue* src) {
+    // Expected to always swap with an initialized instance.
+    // The current instance must always be an uninitialized one.
+    // Not expected either value to be default.
+    ASSERT_FALSE(is_initialized());
+    ASSERT_FALSE(is_default());
+    ASSERT_TRUE(src->is_initialized());
+    ASSERT_FALSE(src->is_default());
+    // Not exactly swap, but good enough for the test.
+    value_ = src->value_.Pass();
+  }
+
   void ParseFromArray(const void* blob, int length) {
     // Similarly to CopyFrom this is expected to be called on
     // an uninitialized instance.
@@ -57,8 +79,7 @@
     ASSERT_FALSE(is_default());
     // The blob is an address of an integer
     ASSERT_EQ(static_cast<int>(sizeof(int)), length);
-    value_ = *static_cast<const int*>(blob);
-    is_initialized_ = true;
+    value_.reset(new IntValue(*static_cast<const int*>(blob)));
     g_parse_count++;
   }
 
@@ -75,7 +96,7 @@
   static int g_parse_count;
   static int g_delete_count;
 
-  int value_;
+  scoped_ptr<IntValue> value_;
   bool is_initialized_;
   bool is_default_;
 
@@ -103,7 +124,7 @@
   }
 };
 
-TEST_F(ProtoValuePtrTest, BasicTest) {
+TEST_F(ProtoValuePtrTest, ValueAssignment) {
   // Basic assignment and default value.
   TestValue t1(1);
   {
@@ -119,6 +140,24 @@
   EXPECT_EQ(1, TestValue::delete_count());
 }
 
+TEST_F(ProtoValuePtrTest, ValueSwap) {
+  TestValue t2(2);
+  {
+    TestPtr ptr2;
+    EXPECT_TRUE(ptr2->is_default());
+
+    IntValue* inner_ptr = t2.value_ptr();
+
+    ptr2.swap_value(&t2);
+    EXPECT_FALSE(ptr2->is_default());
+    EXPECT_EQ(2, ptr2->value());
+    EXPECT_EQ(inner_ptr, ptr2->value_ptr());
+  }
+
+  EXPECT_EQ(0, TestValue::copy_count());
+  EXPECT_EQ(1, TestValue::delete_count());
+}
+
 TEST_F(ProtoValuePtrTest, SharingTest) {
   // Sharing between two pointers.
   TestValue empty;
@@ -204,5 +243,4 @@
   EXPECT_EQ(1, TestValue::delete_count());
 }
 
-}  // namespace syncable
 }  // namespace syncer
diff --git a/sync/protocol/entity_metadata.proto b/sync/protocol/entity_metadata.proto
index db655f6..4b02cf61 100644
--- a/sync/protocol/entity_metadata.proto
+++ b/sync/protocol/entity_metadata.proto
@@ -14,7 +14,7 @@
   // A hash based on the client tag and model type.
   // Used for various map lookups. Should always be available.
   // Sent to the server as SyncEntity::client_defined_unique_tag.
-  optional string client_id = 1;
+  optional string client_tag_hash = 1;
 
   // The entity's server-assigned ID.
   //
@@ -48,13 +48,8 @@
   optional int64 creation_time = 7;
   optional int64 modification_time = 8;
 
-  // A non-unique name associated with this entity.
-  //
-  // It is sometimes used for debugging. It gets saved to and restored from
-  // the sync server.
-  //
-  // Its value is often related to the item's unhashed client tag, though this
-  // is not guaranteed and should not be relied on. May be hidden when
-  // encryption is enabled.
-  optional string non_unique_name = 9;
+  // A hash of the current entity specifics value. Used to detect whether
+  // entity's specifics value has changed without having to keep specifics in
+  // memory.
+  optional string specifics_hash = 9;
 }
diff --git a/sync/sync_tests.gypi b/sync/sync_tests.gypi
index c595fc6..d425408 100644
--- a/sync/sync_tests.gypi
+++ b/sync/sync_tests.gypi
@@ -267,6 +267,7 @@
         'api/attachments/attachment_id_unittest.cc',
         'api/attachments/attachment_metadata_unittest.cc',
         'api/attachments/attachment_unittest.cc',
+        'api/entity_data_unittest.cc',
         'api/sync_change_unittest.cc',
         'api/sync_data_unittest.cc',
         'api/sync_error_unittest.cc',
diff --git a/sync/syncable/entry_kernel.h b/sync/syncable/entry_kernel.h
index 4e901ce..0257f2f 100644
--- a/sync/syncable/entry_kernel.h
+++ b/sync/syncable/entry_kernel.h
@@ -14,6 +14,8 @@
 #include "sync/internal_api/public/base/unique_position.h"
 #include "sync/internal_api/public/util/immutable.h"
 #include "sync/internal_api/public/util/proto_value_ptr.h"
+#include "sync/protocol/attachments.pb.h"
+#include "sync/protocol/sync.pb.h"
 #include "sync/syncable/metahandle_set.h"
 #include "sync/syncable/syncable_id.h"
 #include "sync/util/time.h"
@@ -193,6 +195,10 @@
 
 struct SYNC_EXPORT_PRIVATE EntryKernel {
  private:
+  typedef syncer::ProtoValuePtr<sync_pb::EntitySpecifics> EntitySpecificsPtr;
+  typedef syncer::ProtoValuePtr<sync_pb::AttachmentMetadata>
+      AttachmentMetadataPtr;
+
   std::string string_fields[STRING_FIELDS_COUNT];
   EntitySpecificsPtr specifics_fields[PROTO_FIELDS_COUNT];
   int64 int64_fields[INT64_FIELDS_COUNT];
diff --git a/third_party/WebKit/LayoutTests/OilpanExpectations b/third_party/WebKit/LayoutTests/OilpanExpectations
index 0a8f440e..9bf81c0 100644
--- a/third_party/WebKit/LayoutTests/OilpanExpectations
+++ b/third_party/WebKit/LayoutTests/OilpanExpectations
@@ -40,4 +40,6 @@
 crbug.com/501229 fast/forms/associatedFormControls-leak-nodes.html [ Failure ]
 
 crbug.com/506186 accessibility/axobjectcache-leaks-node.html [ Failure ]
+crbug.com/506186 fast/spatial-navigation/snav-imagemap-leak-document.html [ Failure ]
+
 crbug.com/417181 http/tests/xmlhttprequest/abort-on-changestate-headers-received.html [ Failure Pass ]
diff --git a/third_party/WebKit/LayoutTests/TestExpectations b/third_party/WebKit/LayoutTests/TestExpectations
index 690ab95..930470c 100644
--- a/third_party/WebKit/LayoutTests/TestExpectations
+++ b/third_party/WebKit/LayoutTests/TestExpectations
@@ -802,8 +802,6 @@
 crbug.com/524160 [ Debug ] http/tests/media/media-source/mediasource-appendbuffer-quota-exceeded.html [ Timeout ]
 crbug.com/524160 [ Debug ] http/tests/media/media-source/mediasource-appendstream-quota-exceeded.html [ Timeout ]
 
-crbug.com/527152 http/tests/media/media-source/mediasource-duration.html [ Pass Crash ]
-
 crbug.com/517449 [ Android ] css3/images/optimize-contrast-image.html [ Failure ]
 
 crbug.com/309675 compositing/gestures/gesture-tapHighlight-simple-longPress.html [ Failure ]
@@ -1354,8 +1352,6 @@
 crbug.com/538717 [ Win Mac Linux ] http/tests/permissions/chromium/test-request-multiple-worker.html [ Failure Pass Timeout ]
 crbug.com/538717 [ Win Mac Linux ] http/tests/permissions/chromium/test-request-multiple-sharedworker.html [ Failure Pass Timeout ]
 
-crbug.com/552033 inspector/console/console-format-es6.html [ NeedsManualRebaseline ]
-
 crbug.com/541601 svg/overflow/overflow-on-outermost-svg-element-in-xhtml-defaults.xhtml [ Failure ]
 
 crbug.com/543369 [ Linux ] fast/forms/select/popup-menu-appearance-tall.html [ Failure ]
diff --git a/third_party/WebKit/LayoutTests/accessibility/animation-policy-expected.html b/third_party/WebKit/LayoutTests/accessibility/animation-policy-expected.html
index 12c0aea2..9dfaec8 100644
--- a/third_party/WebKit/LayoutTests/accessibility/animation-policy-expected.html
+++ b/third_party/WebKit/LayoutTests/accessibility/animation-policy-expected.html
@@ -1,2 +1,2 @@
 <img width="100" height="100"
-src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB5klEQVR4nO2b0W6CUBAFD6R/2v//BvrSGrjSIF5kBzKTNJrVuKnbs+PVOuQ7U5JkSH6vSSHj45rDQDBu3+XmDM1lcc2BTM1lcc2BwHAgMBwIDAcCw4HAOH4gQ0dNPjCQtQPmqzVxZdE4ZiDzU2d7At2qyYKvQx6l53QqC5Q6jOMG8vcET2/U5MFxA+l9ddWTrBulcr9D5h9k9f6Ca3757/ZP1WDsT0j7JCr0Q+lbWRdYAVdj/0DaIfR8QiZPcFaWUk/Sm5C1U3h21OYo9SSkhEgSpY5DqcPgrCylnkSp4+AkRJIodRxKHcb+d3u33qF9l7WvQ5xRg8H5JwelnuSVgbhiTuV5IEPzc9ZfVfU5pKp/U3t2SFWsq1dWVf+mtkzIRU+3d2I5kIuK8E4odRhKvbq/Uof1V+pslDoMpQ5DqVf3V+qw/kqdjVKHodRhKPXq/kod1l+ps1HqMJQ6DKVe3V+pw/ordTZKHYZSh6HUq/srdVh/pc5GqcPgfB1BkjgQHA4Exqi0WYxKm4UJgWFCYCh1GK4sGK4sGCYEhgmBodRhuLJguLJgmBAYJgSGUofhyoLhyoJhQmCYEBhKHYYrC4YrC4YJgWFCYCh1GK4sGK4sGCYEhgmBodRhuLJguLJgmBAYJgTGD3U74EhlifEGAAAAAElFTkSuQmCC" />
\ No newline at end of file
+src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB5klEQVR4nO2b0W6CUBAFD6R/2v//BvrSGrjSIF5kBzKTNJrVuKnbs+PVOuQ7U5JkSH6vSSHj45rDQDBu3+XmDM1lcc2BTM1lcc2BwHAgMBwIDAcCw4HAOH4gQ0dNPjCQtQPmqzVxZdE4ZiDzU2d7At2qyYKvQx6l53QqC5Q6jOMG8vcET2/U5MFxA+l9ddWTrBulcr9D5h9k9f6Ca3757/ZP1WDsT0j7JCr0Q+lbWRdYAVdj/0DaIfR8QiZPcFaWUk/Sm5C1U3h21OYo9SSkhEgSpY5DqcPgrCylnkSp4+AkRJIodRxKHcb+d3u33qF9l7WvQ5xRg8H5JwelnuSVgbhiTuV5IEPzc9ZfVfU5pKp/U3t2SFWsq1dWVf+mtkzIRU+3d2I5kIuK8E4odRhKvbq/Uof1V+pslDoMpQ5DqVf3V+qw/kqdjVKHodRhKPXq/kod1l+ps1HqMJQ6DKVe3V+pw/ordTZKHYZSh6HUq/srdVh/pc5GqcPgfB1BkjgQHA4Exqi0WYxKm4UJgWFCYCh1GK4sGK4sGCYEhgmBodRhuLJguLJgmBAYJgSGUofhyoLhyoJhQmCYEBhKHYYrC4YrC4YJgWFCYCh1GK4sGK4sGCYEhgmBodRhuLJguLJgmBAYJgTGD3U74EhlifEGAAAAAElFTkSuQmCC" />
diff --git a/third_party/WebKit/LayoutTests/accessibility/animation-policy.html b/third_party/WebKit/LayoutTests/accessibility/animation-policy.html
index 365cbabc..2d96c4ca 100644
--- a/third_party/WebKit/LayoutTests/accessibility/animation-policy.html
+++ b/third_party/WebKit/LayoutTests/accessibility/animation-policy.html
@@ -34,4 +34,4 @@
 </script>
 <body onload="changeImage()">
 <img id="target" src="animation-blue.gif" onload="imageLoaded()">
-</body>
\ No newline at end of file
+</body>
diff --git a/third_party/WebKit/LayoutTests/accessibility/aria-describedby-on-input-expected.txt b/third_party/WebKit/LayoutTests/accessibility/aria-describedby-on-input-expected.txt
index 136d469..416df5c 100644
--- a/third_party/WebKit/LayoutTests/accessibility/aria-describedby-on-input-expected.txt
+++ b/third_party/WebKit/LayoutTests/accessibility/aria-describedby-on-input-expected.txt
@@ -1,4 +1,4 @@
 This computer will self-destruct in   minutes.
 Allows you to specify the number of minutes after which the computer will self-destruct.
 
-The accessibility description is "AXHelp: Allows you to specify the number of minutes after which the computer will self-destruct."
+The accessibility description is "Allows you to specify the number of minutes after which the computer will self-destruct."
diff --git a/third_party/WebKit/LayoutTests/accessibility/aria-describedby-on-input.html b/third_party/WebKit/LayoutTests/accessibility/aria-describedby-on-input.html
index e2e5938..8ce4da9 100644
--- a/third_party/WebKit/LayoutTests/accessibility/aria-describedby-on-input.html
+++ b/third_party/WebKit/LayoutTests/accessibility/aria-describedby-on-input.html
@@ -15,7 +15,7 @@
             var labeledItem = document.getElementById("time");
             labeledItem.focus();
             var result = document.getElementById("result");
-            result.innerText = "\nThe accessibility description is \"" + accessibilityController.focusedElement.deprecatedHelpText + "\"";
+            result.innerText = "\nThe accessibility description is \"" + accessibilityController.focusedElement.description + "\"";
         }
     </script>
 </body>
diff --git a/third_party/WebKit/LayoutTests/accessibility/aria-help-expected.txt b/third_party/WebKit/LayoutTests/accessibility/aria-help-expected.txt
deleted file mode 100644
index c92a7f08..0000000
--- a/third_party/WebKit/LayoutTests/accessibility/aria-help-expected.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-button
-This tests that aria-help attribute works as expected.
-
-On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
-
-
-PASS button.deprecatedHelpText is 'AXHelp: click here'
-PASS successfullyParsed is true
-
-TEST COMPLETE
-
diff --git a/third_party/WebKit/LayoutTests/accessibility/aria-help.html b/third_party/WebKit/LayoutTests/accessibility/aria-help.html
deleted file mode 100644
index c946578..0000000
--- a/third_party/WebKit/LayoutTests/accessibility/aria-help.html
+++ /dev/null
@@ -1,29 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
-<html>
-<head>
-<script src="../resources/js-test.js"></script>
-</head>
-<body id="body">
-
-<div id="button" tabindex=0 role="button" aria-label="title" aria-help="click here">
-button
-</div>
-
-<p id="description"></p>
-<div id="console"></div>
-
-<script>
-
-    description("This tests that aria-help attribute works as expected.");
-
-    if (window.accessibilityController) {
-
-        document.getElementById("button").focus();
-        var button = accessibilityController.focusedElement;
-        shouldBe("button.deprecatedHelpText", "'AXHelp: click here'");
-    }
-
-</script>
-
-</body>
-</html>
diff --git a/third_party/WebKit/LayoutTests/accessibility/aria-hidden-children-not-in-text-from-content-expected.txt b/third_party/WebKit/LayoutTests/accessibility/aria-hidden-children-not-in-text-from-content-expected.txt
index ecfa0a9..89e2380a34 100644
--- a/third_party/WebKit/LayoutTests/accessibility/aria-hidden-children-not-in-text-from-content-expected.txt
+++ b/third_party/WebKit/LayoutTests/accessibility/aria-hidden-children-not-in-text-from-content-expected.txt
@@ -4,8 +4,8 @@
 
 
 
-PASS checkbox1.deprecatedTitle.trim() is 'AXTitle:'
-PASS checkbox2.deprecatedTitle.trim() is 'AXTitle: Non-hidden descendant content'
+PASS checkbox1.name.trim() is ''
+PASS checkbox2.name.trim() is 'Non-hidden descendant content'
 PASS successfullyParsed is true
 
 TEST COMPLETE
diff --git a/third_party/WebKit/LayoutTests/accessibility/aria-hidden-children-not-in-text-from-content.html b/third_party/WebKit/LayoutTests/accessibility/aria-hidden-children-not-in-text-from-content.html
index e34d7a04..e0cd158 100644
--- a/third_party/WebKit/LayoutTests/accessibility/aria-hidden-children-not-in-text-from-content.html
+++ b/third_party/WebKit/LayoutTests/accessibility/aria-hidden-children-not-in-text-from-content.html
@@ -26,11 +26,11 @@
 
 if (window.testRunner && window.accessibilityController) {
     var checkbox1 = accessibilityController.accessibleElementById('checkbox1');
-    shouldBe('checkbox1.deprecatedTitle.trim()', "'AXTitle:'");
+    shouldBe('checkbox1.name.trim()', "''");
 
     var checkbox2 = accessibilityController.accessibleElementById('checkbox2');
-    shouldBe('checkbox2.deprecatedTitle.trim()',
-             "'AXTitle: Non-hidden descendant content'");
+    shouldBe('checkbox2.name.trim()',
+             "'Non-hidden descendant content'");
 
     document.getElementById('content').style.visibility = 'hidden';
 }
diff --git a/third_party/WebKit/LayoutTests/accessibility/aria-hidden-expected.txt b/third_party/WebKit/LayoutTests/accessibility/aria-hidden-expected.txt
index 4208128..b05dc8f 100644
--- a/third_party/WebKit/LayoutTests/accessibility/aria-hidden-expected.txt
+++ b/third_party/WebKit/LayoutTests/accessibility/aria-hidden-expected.txt
@@ -7,7 +7,7 @@
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
 
 
-PASS h2.deprecatedTitle is 'AXTitle: h2'
+PASS h2.name is 'h2'
 PASS successfullyParsed is true
 
 TEST COMPLETE
diff --git a/third_party/WebKit/LayoutTests/accessibility/aria-hidden.html b/third_party/WebKit/LayoutTests/accessibility/aria-hidden.html
index 94507f3..4fce4bcf 100644
--- a/third_party/WebKit/LayoutTests/accessibility/aria-hidden.html
+++ b/third_party/WebKit/LayoutTests/accessibility/aria-hidden.html
@@ -18,7 +18,7 @@
           var body = document.getElementById("body");
           body.focus();
           var h2 = accessibilityController.focusedElement.childAtIndex(0);
-          shouldBe("h2.deprecatedTitle", "'AXTitle: h2'");
+          shouldBe("h2.name", "'h2'");
     }
 
 </script>
diff --git a/third_party/WebKit/LayoutTests/accessibility/aria-label.html b/third_party/WebKit/LayoutTests/accessibility/aria-label.html
index 28edafc..6daa5ee 100644
--- a/third_party/WebKit/LayoutTests/accessibility/aria-label.html
+++ b/third_party/WebKit/LayoutTests/accessibility/aria-label.html
@@ -18,11 +18,11 @@
           var body = document.getElementById("body");
           body.focus();
           var obj = accessibilityController.focusedElement.childAtIndex(0).childAtIndex(0);
-          var succeeded = obj.deprecatedDescription == "AXDescription: aria label";
+          var succeeded = obj.name == "aria label";
           shouldBe("succeeded", "true");
 
           obj = accessibilityController.focusedElement.childAtIndex(0).childAtIndex(1);
-          succeeded = obj.deprecatedDescription == "AXDescription: aria link";
+          succeeded = obj.name == "aria link";
           shouldBe("succeeded", "true");
     }
 
diff --git a/third_party/WebKit/LayoutTests/accessibility/aria-labelledby-on-input-expected.txt b/third_party/WebKit/LayoutTests/accessibility/aria-labelledby-on-input-expected.txt
index c9b6426..d165cd40 100644
--- a/third_party/WebKit/LayoutTests/accessibility/aria-labelledby-on-input-expected.txt
+++ b/third_party/WebKit/LayoutTests/accessibility/aria-labelledby-on-input-expected.txt
@@ -1,3 +1,3 @@
 This computer will self-destruct in   minutes.
 
-The accessibility description is "AXDescription: Note: This computer will self-destruct in 10 minutes."
+The accessibility description is "Note: This computer will self-destruct in 10 minutes."
diff --git a/third_party/WebKit/LayoutTests/accessibility/aria-labelledby-on-input.html b/third_party/WebKit/LayoutTests/accessibility/aria-labelledby-on-input.html
index f8cff72..ddade85 100644
--- a/third_party/WebKit/LayoutTests/accessibility/aria-labelledby-on-input.html
+++ b/third_party/WebKit/LayoutTests/accessibility/aria-labelledby-on-input.html
@@ -15,7 +15,7 @@
             var labeledItem = document.getElementById("time");
             labeledItem.focus();
             var result = document.getElementById("result");
-            result.innerText = "\nThe accessibility description is \"" + accessibilityController.focusedElement.deprecatedDescription + "\"";
+            result.innerText = "\nThe accessibility description is \"" + accessibilityController.focusedElement.name + "\"";
         }
     </script>
 </body>
diff --git a/third_party/WebKit/LayoutTests/accessibility/aria-labelledby-overrides-aria-label-expected.txt b/third_party/WebKit/LayoutTests/accessibility/aria-labelledby-overrides-aria-label-expected.txt
index cff61a3..dd119a1 100644
--- a/third_party/WebKit/LayoutTests/accessibility/aria-labelledby-overrides-aria-label-expected.txt
+++ b/third_party/WebKit/LayoutTests/accessibility/aria-labelledby-overrides-aria-label-expected.txt
@@ -1,12 +1,8 @@
 This tests that if aria-labelledby is used, then aria-label attributes are not used.
 
 Alpha Beta Delta Eta Epsilon Theta
-usingNone.deprecatedTitle: [AXTitle: Alpha]
-usingNone.deprecatedDescription: [AXDescription: ]
-usingLabel.deprecatedTitle: [AXTitle: Beta]
-usingLabel.deprecatedDescription: [AXDescription: Gamma]
-usingLabelledby.deprecatedTitle: [AXTitle: Delta]
-usingLabelledby.deprecatedDescription: [AXDescription: Epsilon]
-usingLabeledby.deprecatedTitle: [AXTitle: Eta]
-usingLabeledby.deprecatedDescription: [AXDescription: Theta]
+usingNone.name: [Alpha]
+usingLabel.name: [Gamma]
+usingLabelledby.name: [Epsilon]
+usingLabeledby.name: [Theta]
 
diff --git a/third_party/WebKit/LayoutTests/accessibility/aria-labelledby-overrides-aria-label.html b/third_party/WebKit/LayoutTests/accessibility/aria-labelledby-overrides-aria-label.html
index a1b3516a..ac8193e 100644
--- a/third_party/WebKit/LayoutTests/accessibility/aria-labelledby-overrides-aria-label.html
+++ b/third_party/WebKit/LayoutTests/accessibility/aria-labelledby-overrides-aria-label.html
@@ -34,20 +34,16 @@
 
     if (window.accessibilityController) {
         var usingNone = getAccessibilityObject("using-none");
-        output("usingNone.deprecatedTitle: [" + usingNone.deprecatedTitle + "]");
-        output("usingNone.deprecatedDescription:  [" + usingNone.deprecatedDescription + "]");
+        output("usingNone.name: [" + usingNone.name + "]");
 
         var usingLabel = getAccessibilityObject("using-label");
-        output("usingLabel.deprecatedTitle: [" + usingLabel.deprecatedTitle + "]");
-        output("usingLabel.deprecatedDescription:  [" + usingLabel.deprecatedDescription + "]");
+        output("usingLabel.name: [" + usingLabel.name + "]");
 
         var usingLabelledby = getAccessibilityObject("using-labelledby");
-        output("usingLabelledby.deprecatedTitle: [" + usingLabelledby.deprecatedTitle + "]");
-        output("usingLabelledby.deprecatedDescription:  [" + usingLabelledby.deprecatedDescription + "]");
+        output("usingLabelledby.name: [" + usingLabelledby.name + "]");
 
         var usingLabeledby = getAccessibilityObject("using-labeledby");
-        output("usingLabeledby.deprecatedTitle: [" + usingLabeledby.deprecatedTitle + "]");
-        output("usingLabeledby.deprecatedDescription:  [" + usingLabeledby.deprecatedDescription + "]");
+        output("usingLabeledby.name: [" + usingLabeledby.name + "]");
     }
 
     successfullyParsed = true;
diff --git a/third_party/WebKit/LayoutTests/accessibility/aria-labelledby-overrides-aria-labeledby-expected.txt b/third_party/WebKit/LayoutTests/accessibility/aria-labelledby-overrides-aria-labeledby-expected.txt
index 0c6a87f..7695254 100644
--- a/third_party/WebKit/LayoutTests/accessibility/aria-labelledby-overrides-aria-labeledby-expected.txt
+++ b/third_party/WebKit/LayoutTests/accessibility/aria-labelledby-overrides-aria-labeledby-expected.txt
@@ -1,10 +1,7 @@
 This tests that if both aria-labeledby and aria-labelledby are used (for reasons best known to the page author), then aria-labelledby is preferred.
 
 Delta Eta Eta Using aria-labelledby Using aria-labeledby
-usingLabelledby.deprecatedTitle: [AXTitle: Delta]
-usingLabelledby.deprecatedDescription: [AXDescription: Using aria-labelledby]
-usingLabeledby.deprecatedTitle: [AXTitle: Eta]
-usingLabeledby.deprecatedDescription: [AXDescription: Using aria-labeledby]
-usingLabeledbyAndLabelledby.deprecatedTitle: [AXTitle: Eta]
-usingLabeledbyAndLabelledby.deprecatedDescription: [AXDescription: Using aria-labelledby]
+usingLabelledby.name: [Using aria-labelledby]
+usingLabeledby.name: [Using aria-labeledby]
+usingLabeledbyAndLabelledby.name: [Using aria-labelledby]
 
diff --git a/third_party/WebKit/LayoutTests/accessibility/aria-labelledby-overrides-aria-labeledby.html b/third_party/WebKit/LayoutTests/accessibility/aria-labelledby-overrides-aria-labeledby.html
index c90f9666..e908966 100644
--- a/third_party/WebKit/LayoutTests/accessibility/aria-labelledby-overrides-aria-labeledby.html
+++ b/third_party/WebKit/LayoutTests/accessibility/aria-labelledby-overrides-aria-labeledby.html
@@ -33,16 +33,13 @@
 
     if (window.accessibilityController) {
         var usingLabelledby = getAccessibilityObject("using-labelledby");
-        output("usingLabelledby.deprecatedTitle: [" + usingLabelledby.deprecatedTitle + "]");
-        output("usingLabelledby.deprecatedDescription:  [" + usingLabelledby.deprecatedDescription + "]");
+        output("usingLabelledby.name: [" + usingLabelledby.name + "]");
 
         var usingLabeledby = getAccessibilityObject("using-labeledby");
-        output("usingLabeledby.deprecatedTitle: [" + usingLabeledby.deprecatedTitle + "]");
-        output("usingLabeledby.deprecatedDescription:  [" + usingLabeledby.deprecatedDescription + "]");
+        output("usingLabeledby.name: [" + usingLabeledby.name + "]");
 
         var usingLabeledbyAndLabelledby = getAccessibilityObject("using-labeledby-and-labelledby");
-        output("usingLabeledbyAndLabelledby.deprecatedTitle: [" + usingLabeledbyAndLabelledby.deprecatedTitle + "]");
-        output("usingLabeledbyAndLabelledby.deprecatedDescription:  [" + usingLabeledbyAndLabelledby.deprecatedDescription + "]");
+        output("usingLabeledbyAndLabelledby.name: [" + usingLabeledbyAndLabelledby.name + "]");
 
     }
 
diff --git a/third_party/WebKit/LayoutTests/accessibility/aria-labelledby-overrides-label-expected.txt b/third_party/WebKit/LayoutTests/accessibility/aria-labelledby-overrides-label-expected.txt
index 7c8fda717..446dd2f 100644
--- a/third_party/WebKit/LayoutTests/accessibility/aria-labelledby-overrides-label-expected.txt
+++ b/third_party/WebKit/LayoutTests/accessibility/aria-labelledby-overrides-label-expected.txt
@@ -1,12 +1,15 @@
-Shut down computer after  minutes
+Label
+A
+B
+C
+
 This tests that if aria-labelledby is used, then label elements are not used
 
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
 
 
-PASS text.deprecatedDescription is 'AXDescription: Shut down computer after 10 minutes'
-PASS text.deprecatedTitleUIElement() != null && text.deprecatedTitleUIElement().isValid is false
-Label element role is: AXRole: AXLabel
+PASS axTarget.name is 'A B C'
+PASS axTarget.nameElementCount() is 3
 PASS successfullyParsed is true
 
 TEST COMPLETE
diff --git a/third_party/WebKit/LayoutTests/accessibility/aria-labelledby-overrides-label.html b/third_party/WebKit/LayoutTests/accessibility/aria-labelledby-overrides-label.html
index 5427ae5..0d61a73 100644
--- a/third_party/WebKit/LayoutTests/accessibility/aria-labelledby-overrides-label.html
+++ b/third_party/WebKit/LayoutTests/accessibility/aria-labelledby-overrides-label.html
@@ -5,9 +5,13 @@
 </head>
 <body id="body">
 
-<span id="labelShutdown"><label id="labelElement" for="shutdownTime">Shut down computer after</label></span>
-<input id="shutdownTime" type="text" value="10" aria-labelledby="labelShutdown shutdownTime shutdownUnit" />
-<span id="shutdownUnit">minutes</span>
+<label for="target">Label</label>
+
+<div id="a">A</div>
+<div id="b">B</div>
+<div id="c">C</div>
+
+<input id="target" aria-labelledby="a b c" value="10">
 
 <p id="description"></p>
 <div id="console"></div>
@@ -17,20 +21,9 @@
     description("This tests that if aria-labelledby is used, then label elements are not used");
 
     if (window.accessibilityController) {
-
-          var text = document.getElementById("shutdownTime");
-          text.focus();
-          text = accessibilityController.focusedElement;
-
-          shouldBe("text.deprecatedDescription", "'AXDescription: Shut down computer after 10 minutes'");
-
-          // There should be no title UI element.
-          shouldBe("text.deprecatedTitleUIElement() != null && text.deprecatedTitleUIElement().isValid", "false");
-          
-          var labelElement = accessibilityController.accessibleElementById("labelElement");
-          // This just makes sure that the label element is still visible in the AX hierarchy, even though
-          // it's a label element (sometimes they are ignored).
-          debug("Label element role is: " + labelElement.role);
+          var axTarget = accessibilityController.accessibleElementById("target");
+          shouldBe("axTarget.name", "'A B C'");
+          shouldBe("axTarget.nameElementCount()", "3");
     }
 
 </script>
diff --git a/third_party/WebKit/LayoutTests/accessibility/aria-labelledby-stay-within.html b/third_party/WebKit/LayoutTests/accessibility/aria-labelledby-stay-within.html
index f17a684..5b13ff3 100644
--- a/third_party/WebKit/LayoutTests/accessibility/aria-labelledby-stay-within.html
+++ b/third_party/WebKit/LayoutTests/accessibility/aria-labelledby-stay-within.html
@@ -32,11 +32,11 @@
             var labeledItem = document.getElementById("rep");
             labeledItem.focus();
             var result = document.getElementById("result");
-            if ( accessibilityController.focusedElement.deprecatedDescription == "AXDescription: Reply Item Five" ) {
+            if ( accessibilityController.focusedElement.name == "Reply Item Five" ) {
                result.innerText = "Passed";
             }
             else { 
-               result.innerText = "Failed. Result ==" + accessibilityController.focusedElement.deprecatedDescription + "==";
+               result.innerText = "Failed. Result ==" + accessibilityController.focusedElement.name + "==";
             }
         }
     </script>
diff --git a/third_party/WebKit/LayoutTests/accessibility/aria-option-role-expected.txt b/third_party/WebKit/LayoutTests/accessibility/aria-option-role-expected.txt
index 53b7f87..125fa092 100644
--- a/third_party/WebKit/LayoutTests/accessibility/aria-option-role-expected.txt
+++ b/third_party/WebKit/LayoutTests/accessibility/aria-option-role-expected.txt
@@ -6,9 +6,9 @@
 
 
 firstChild.role is AXRole: AXListBoxOption
-PASS firstChild.deprecatedTitle is 'AXTitle: option 1'
+PASS firstChild.name is 'option 1'
 secondChild.role is AXRole: AXListBoxOption
-PASS secondChild.deprecatedDescription is 'AXDescription: label 2'
+PASS secondChild.name is 'label 2'
 PASS firstChild.childrenCount is 0
 PASS secondChild.childrenCount is 0
 PASS successfullyParsed is true
diff --git a/third_party/WebKit/LayoutTests/accessibility/aria-option-role.html b/third_party/WebKit/LayoutTests/accessibility/aria-option-role.html
index 0fb65ab..139f074 100644
--- a/third_party/WebKit/LayoutTests/accessibility/aria-option-role.html
+++ b/third_party/WebKit/LayoutTests/accessibility/aria-option-role.html
@@ -26,10 +26,10 @@
           var firstChild = listBox.childAtIndex(0);
           var secondChild = listBox.childAtIndex(1);
           debug("firstChild.role is " + firstChild.role);
-          shouldBe("firstChild.deprecatedTitle", "'AXTitle: option 1'");
+          shouldBe("firstChild.name", "'option 1'");
 
           debug("secondChild.role is " + secondChild.role);
-          shouldBe("secondChild.deprecatedDescription", "'AXDescription: label 2'");
+          shouldBe("secondChild.name", "'label 2'");
 
           shouldBe("firstChild.childrenCount", "0");
           shouldBe("secondChild.childrenCount", "0");
diff --git a/third_party/WebKit/LayoutTests/accessibility/aria-owns.html b/third_party/WebKit/LayoutTests/accessibility/aria-owns.html
index 68d9ca8..c47022c 100644
--- a/third_party/WebKit/LayoutTests/accessibility/aria-owns.html
+++ b/third_party/WebKit/LayoutTests/accessibility/aria-owns.html
@@ -25,14 +25,14 @@
     assert_equals(axList1.childrenCount, 3);
 
     var axItem = axList1.childAtIndex(0);
-    assert_equals(axList1.childAtIndex(0).deprecatedTitle, "AXTitle: One");
-    assert_equals(axList1.childAtIndex(1).deprecatedTitle, "AXTitle: Two");
-    assert_equals(axList1.childAtIndex(2).deprecatedTitle, "AXTitle: Three");
+    assert_equals(axList1.childAtIndex(0).name, "One");
+    assert_equals(axList1.childAtIndex(1).name, "Two");
+    assert_equals(axList1.childAtIndex(2).name, "Three");
 
     var axList2 = accessibilityController.accessibleElementById("list2");
     assert_equals(axList2.role, "AXRole: AXList");
     assert_equals(axList2.childrenCount, 1);
-    assert_equals(axList2.childAtIndex(0).deprecatedTitle, "AXTitle: Four");
+    assert_equals(axList2.childAtIndex(0).name, "Four");
 }, "Aria-owns moves an element from one part of the tree to another.");
 </script>
 
@@ -57,12 +57,12 @@
     assert_true(axActualParent.isEqual(axParent1) || axActualParent.isEqual(axParent2));
     if (axActualParent.isEqual(axParent1)) {
         assert_equals(axParent1.childrenCount, 1);
-        assert_equals(axParent1.childAtIndex(0).deprecatedTitle, "AXTitle: Child");
+        assert_equals(axParent1.childAtIndex(0).name, "Child");
         assert_equals(axParent2.childrenCount, 0);
     } else {
         assert_equals(axParent1.childrenCount, 0);
         assert_equals(axParent2.childrenCount, 1);
-        assert_equals(axParent2.childAtIndex(0).deprecatedTitle, "AXTitle: Child");
+        assert_equals(axParent2.childAtIndex(0).name, "Child");
     }
     assert_equals(axParent3.childrenCount, 0);
 }, "If two nodes own (using aria-owns) the same element by id, only one gets to be the owner.");
diff --git a/third_party/WebKit/LayoutTests/accessibility/aria-tab-roles-expected.txt b/third_party/WebKit/LayoutTests/accessibility/aria-tab-roles-expected.txt
index 279579df..bb19768 100644
--- a/third_party/WebKit/LayoutTests/accessibility/aria-tab-roles-expected.txt
+++ b/third_party/WebKit/LayoutTests/accessibility/aria-tab-roles-expected.txt
@@ -9,10 +9,10 @@
 
 tabList.role = AXRole: AXTabList
 tab1.role = AXRole: AXTab
-PASS tab1.deprecatedTitle is 'AXTitle: Crust'
+PASS tab1.name is 'Crust'
 PASS tab1.childrenCount is 0
 tab2.role = AXRole: AXTab
-PASS tab2.deprecatedTitle is 'AXTitle: Veges'
+PASS tab2.name is 'Veges'
 tabPanel.role = AXRole: AXTabPanel
 tabPanel.subrole = undefined
 PASS successfullyParsed is true
diff --git a/third_party/WebKit/LayoutTests/accessibility/aria-tab-roles.html b/third_party/WebKit/LayoutTests/accessibility/aria-tab-roles.html
index 0c12e307..313a984 100644
--- a/third_party/WebKit/LayoutTests/accessibility/aria-tab-roles.html
+++ b/third_party/WebKit/LayoutTests/accessibility/aria-tab-roles.html
@@ -34,10 +34,10 @@
 
           debug("tabList.role = " + tabList.role);
           debug("tab1.role = " + tab1.role);
-          shouldBe("tab1.deprecatedTitle", "'AXTitle: Crust'");
+          shouldBe("tab1.name", "'Crust'");
           shouldBe("tab1.childrenCount", "0");
           debug("tab2.role = " + tab2.role);
-          shouldBe("tab2.deprecatedTitle", "'AXTitle: Veges'");
+          shouldBe("tab2.name", "'Veges'");
           debug("tabPanel.role = " + tabPanel.role);
           debug("tabPanel.subrole = " + tabPanel.subrole);
     }
diff --git a/third_party/WebKit/LayoutTests/accessibility/aria-toggle-button-with-title-expected.txt b/third_party/WebKit/LayoutTests/accessibility/aria-toggle-button-with-title-expected.txt
index fdd5929..d10cef3 100644
--- a/third_party/WebKit/LayoutTests/accessibility/aria-toggle-button-with-title-expected.txt
+++ b/third_party/WebKit/LayoutTests/accessibility/aria-toggle-button-with-title-expected.txt
@@ -9,7 +9,7 @@
 
 TEST COMPLETE
 Role: AXRole: AXToggleButton
-PASS tbutton1.deprecatedTitle is 'AXTitle: Toggle button'
+PASS tbutton1.name is 'Toggle button'
 Role: AXRole: AXButton
-PASS button.deprecatedTitle is 'AXTitle: Button title'
+PASS button.name is 'Button title'
 
diff --git a/third_party/WebKit/LayoutTests/accessibility/aria-toggle-button-with-title.html b/third_party/WebKit/LayoutTests/accessibility/aria-toggle-button-with-title.html
index 3e11c14..cf786f07 100644
--- a/third_party/WebKit/LayoutTests/accessibility/aria-toggle-button-with-title.html
+++ b/third_party/WebKit/LayoutTests/accessibility/aria-toggle-button-with-title.html
@@ -11,12 +11,12 @@
     document.getElementById("tbutton").focus();
     tbutton1 = accessibilityController.focusedElement;
     debug("Role: " + tbutton1.role);
-    shouldBe("tbutton1.deprecatedTitle", "'AXTitle: Toggle button'");
+    shouldBe("tbutton1.name", "'Toggle button'");
 
     document.getElementById("button").focus();
     button = accessibilityController.focusedElement;
     debug("Role: " + button.role);
-    shouldBe("button.deprecatedTitle", "'AXTitle: Button title'");
+    shouldBe("button.name", "'Button title'");
   }
 }
 </script>
diff --git a/third_party/WebKit/LayoutTests/accessibility/br-element-has-correct-title-expected.txt b/third_party/WebKit/LayoutTests/accessibility/br-element-has-correct-title-expected.txt
index eadd0aa..c4f13fd7 100644
--- a/third_party/WebKit/LayoutTests/accessibility/br-element-has-correct-title-expected.txt
+++ b/third_party/WebKit/LayoutTests/accessibility/br-element-has-correct-title-expected.txt
@@ -6,7 +6,7 @@
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
 
 
-PASS brElement.deprecatedTitle is 'AXTitle: \n'
+PASS brElement.name is '\n'
 PASS successfullyParsed is true
 
 TEST COMPLETE
diff --git a/third_party/WebKit/LayoutTests/accessibility/br-element-has-correct-title.html b/third_party/WebKit/LayoutTests/accessibility/br-element-has-correct-title.html
index 34860f1..943ff6c 100644
--- a/third_party/WebKit/LayoutTests/accessibility/br-element-has-correct-title.html
+++ b/third_party/WebKit/LayoutTests/accessibility/br-element-has-correct-title.html
@@ -15,7 +15,7 @@
 
     if (window.accessibilityController) {
         var brElement = accessibilityController.accessibleElementById("br");
-        shouldBe("brElement.deprecatedTitle", "'AXTitle: \\n'");
+        shouldBe("brElement.name", "'\\n'");
     }
 </script>
 
diff --git a/third_party/WebKit/LayoutTests/accessibility/button-title-uses-inner-img-alt-expected.txt b/third_party/WebKit/LayoutTests/accessibility/button-title-uses-inner-img-alt-expected.txt
index 730af57..f5382f5 100644
--- a/third_party/WebKit/LayoutTests/accessibility/button-title-uses-inner-img-alt-expected.txt
+++ b/third_party/WebKit/LayoutTests/accessibility/button-title-uses-inner-img-alt-expected.txt
@@ -5,7 +5,7 @@
 
 
 PASS document.activeElement == button is true
-PASS axButton.deprecatedTitle.indexOf('Button with image of cake') >= 0 is true
+PASS axButton.name.indexOf('Button with image of cake') >= 0 is true
 PASS successfullyParsed is true
 
 TEST COMPLETE
diff --git a/third_party/WebKit/LayoutTests/accessibility/button-title-uses-inner-img-alt.html b/third_party/WebKit/LayoutTests/accessibility/button-title-uses-inner-img-alt.html
index e9aa803..d996412 100644
--- a/third_party/WebKit/LayoutTests/accessibility/button-title-uses-inner-img-alt.html
+++ b/third_party/WebKit/LayoutTests/accessibility/button-title-uses-inner-img-alt.html
@@ -22,7 +22,7 @@
     button.focus();
     shouldBe("document.activeElement == button", "true");
     window.axButton = accessibilityController.focusedElement;
-    shouldBe("axButton.deprecatedTitle.indexOf('Button with image of cake') >= 0", "true");
+    shouldBe("axButton.name.indexOf('Button with image of cake') >= 0", "true");
 }
 
 </script>
diff --git a/third_party/WebKit/LayoutTests/accessibility/calling-accessibility-methods-with-pending-layout-causes-crash.html b/third_party/WebKit/LayoutTests/accessibility/calling-accessibility-methods-with-pending-layout-causes-crash.html
index 95117474e..5af91d28 100644
--- a/third_party/WebKit/LayoutTests/accessibility/calling-accessibility-methods-with-pending-layout-causes-crash.html
+++ b/third_party/WebKit/LayoutTests/accessibility/calling-accessibility-methods-with-pending-layout-causes-crash.html
@@ -12,6 +12,6 @@
     var link = document.getElementById("link");
     link.focus();
     link.style.display = "block";
-    accessibilityController.focusedElement.deprecatedDescription;
+    accessibilityController.focusedElement.name;
 </script>
 </body>
diff --git a/third_party/WebKit/LayoutTests/accessibility/canvas-description-and-role-expected.txt b/third_party/WebKit/LayoutTests/accessibility/canvas-description-and-role-expected.txt
index d17fa8b..c9e1b6c 100644
--- a/third_party/WebKit/LayoutTests/accessibility/canvas-description-and-role-expected.txt
+++ b/third_party/WebKit/LayoutTests/accessibility/canvas-description-and-role-expected.txt
@@ -4,9 +4,9 @@
 
 
 PASS axContainer.childrenCount is 2
-Canvas 1 description: AXDescription: Canvas label
+Canvas 1 description: Canvas label
 Canvas 1 role: AXRole: AXCanvas
-Canvas 2 description: AXDescription: 
+Canvas 2 description: 
 Canvas 2 role: AXRole: AXCanvasWithFallbackContent
 PASS successfullyParsed is true
 
diff --git a/third_party/WebKit/LayoutTests/accessibility/canvas-description-and-role.html b/third_party/WebKit/LayoutTests/accessibility/canvas-description-and-role.html
index 82dbcbbb..67f1057 100644
--- a/third_party/WebKit/LayoutTests/accessibility/canvas-description-and-role.html
+++ b/third_party/WebKit/LayoutTests/accessibility/canvas-description-and-role.html
@@ -21,11 +21,11 @@
     shouldBe("axContainer.childrenCount", "2");
 
     var axCanvas1 = axContainer.childAtIndex(0);
-    debug('Canvas 1 description: ' + axCanvas1.deprecatedDescription);
+    debug('Canvas 1 description: ' + axCanvas1.name);
     debug('Canvas 1 role: ' + axCanvas1.role);
 
     var axCanvas2 = axContainer.childAtIndex(1);
-    debug('Canvas 2 description: ' + axCanvas2.deprecatedDescription);
+    debug('Canvas 2 description: ' + axCanvas2.name);
     debug('Canvas 2 role: ' + axCanvas2.role);
 }
 
diff --git a/third_party/WebKit/LayoutTests/accessibility/canvas-fallback-content-2-expected.txt b/third_party/WebKit/LayoutTests/accessibility/canvas-fallback-content-2-expected.txt
index f6e8601..eb95df6 100644
--- a/third_party/WebKit/LayoutTests/accessibility/canvas-fallback-content-2-expected.txt
+++ b/third_party/WebKit/LayoutTests/accessibility/canvas-fallback-content-2-expected.txt
@@ -19,7 +19,7 @@
 PASS document.activeElement == element2 is true
 PASS axElement2.role is axElement1.role
 PASS axElement2.roleDescription is axElement1.roleDescription
-PASS axElement2.deprecatedTitle is axElement1.deprecatedTitle
+PASS axElement2.name is axElement1.deprecatedTitle
 PASS axElement2.deprecatedDescription is axElement1.deprecatedDescription
 PASS axElement2.deprecatedHelpText is axElement1.deprecatedHelpText
 PASS axElement2.stringValue is axElement1.stringValue
@@ -36,7 +36,7 @@
 PASS document.activeElement == element2 is true
 PASS axElement2.role is axElement1.role
 PASS axElement2.roleDescription is axElement1.roleDescription
-PASS axElement2.deprecatedTitle is axElement1.deprecatedTitle
+PASS axElement2.name is axElement1.deprecatedTitle
 PASS axElement2.deprecatedDescription is axElement1.deprecatedDescription
 PASS axElement2.deprecatedHelpText is axElement1.deprecatedHelpText
 PASS axElement2.stringValue is axElement1.stringValue
@@ -53,7 +53,7 @@
 PASS document.activeElement == element2 is true
 PASS axElement2.role is axElement1.role
 PASS axElement2.roleDescription is axElement1.roleDescription
-PASS axElement2.deprecatedTitle is axElement1.deprecatedTitle
+PASS axElement2.name is axElement1.deprecatedTitle
 PASS axElement2.deprecatedDescription is axElement1.deprecatedDescription
 PASS axElement2.deprecatedHelpText is axElement1.deprecatedHelpText
 PASS axElement2.stringValue is axElement1.stringValue
@@ -70,7 +70,7 @@
 PASS document.activeElement == element2 is true
 PASS axElement2.role is axElement1.role
 PASS axElement2.roleDescription is axElement1.roleDescription
-PASS axElement2.deprecatedTitle is axElement1.deprecatedTitle
+PASS axElement2.name is axElement1.deprecatedTitle
 PASS axElement2.deprecatedDescription is axElement1.deprecatedDescription
 PASS axElement2.deprecatedHelpText is axElement1.deprecatedHelpText
 PASS axElement2.stringValue is axElement1.stringValue
@@ -87,7 +87,7 @@
 PASS document.activeElement == element2 is true
 PASS axElement2.role is axElement1.role
 PASS axElement2.roleDescription is axElement1.roleDescription
-PASS axElement2.deprecatedTitle is axElement1.deprecatedTitle
+PASS axElement2.name is axElement1.deprecatedTitle
 PASS axElement2.deprecatedDescription is axElement1.deprecatedDescription
 PASS axElement2.deprecatedHelpText is axElement1.deprecatedHelpText
 PASS axElement2.stringValue is axElement1.stringValue
@@ -104,7 +104,7 @@
 PASS document.activeElement == element2 is true
 PASS axElement2.role is axElement1.role
 PASS axElement2.roleDescription is axElement1.roleDescription
-PASS axElement2.deprecatedTitle is axElement1.deprecatedTitle
+PASS axElement2.name is axElement1.deprecatedTitle
 PASS axElement2.deprecatedDescription is axElement1.deprecatedDescription
 PASS axElement2.deprecatedHelpText is axElement1.deprecatedHelpText
 PASS axElement2.stringValue is axElement1.stringValue
@@ -121,7 +121,7 @@
 PASS document.activeElement == element2 is true
 PASS axElement2.role is axElement1.role
 PASS axElement2.roleDescription is axElement1.roleDescription
-PASS axElement2.deprecatedTitle is axElement1.deprecatedTitle
+PASS axElement2.name is axElement1.deprecatedTitle
 PASS axElement2.deprecatedDescription is axElement1.deprecatedDescription
 PASS axElement2.deprecatedHelpText is axElement1.deprecatedHelpText
 PASS axElement2.stringValue is axElement1.stringValue
@@ -138,7 +138,7 @@
 PASS document.activeElement == element2 is true
 PASS axElement2.role is axElement1.role
 PASS axElement2.roleDescription is axElement1.roleDescription
-PASS axElement2.deprecatedTitle is axElement1.deprecatedTitle
+PASS axElement2.name is axElement1.deprecatedTitle
 PASS axElement2.deprecatedDescription is axElement1.deprecatedDescription
 PASS axElement2.deprecatedHelpText is axElement1.deprecatedHelpText
 PASS axElement2.stringValue is axElement1.stringValue
@@ -155,7 +155,7 @@
 PASS document.activeElement == element2 is true
 PASS axElement2.role is axElement1.role
 PASS axElement2.roleDescription is axElement1.roleDescription
-PASS axElement2.deprecatedTitle is axElement1.deprecatedTitle
+PASS axElement2.name is axElement1.deprecatedTitle
 PASS axElement2.deprecatedDescription is axElement1.deprecatedDescription
 PASS axElement2.deprecatedHelpText is axElement1.deprecatedHelpText
 PASS axElement2.stringValue is axElement1.stringValue
@@ -172,7 +172,7 @@
 PASS document.activeElement == element2 is true
 PASS axElement2.role is axElement1.role
 PASS axElement2.roleDescription is axElement1.roleDescription
-PASS axElement2.deprecatedTitle is axElement1.deprecatedTitle
+PASS axElement2.name is axElement1.deprecatedTitle
 PASS axElement2.deprecatedDescription is axElement1.deprecatedDescription
 PASS axElement2.deprecatedHelpText is axElement1.deprecatedHelpText
 PASS axElement2.stringValue is axElement1.stringValue
@@ -189,7 +189,7 @@
 PASS document.activeElement == element2 is true
 PASS axElement2.role is axElement1.role
 PASS axElement2.roleDescription is axElement1.roleDescription
-PASS axElement2.deprecatedTitle is axElement1.deprecatedTitle
+PASS axElement2.name is axElement1.deprecatedTitle
 PASS axElement2.deprecatedDescription is axElement1.deprecatedDescription
 PASS axElement2.deprecatedHelpText is axElement1.deprecatedHelpText
 PASS axElement2.stringValue is axElement1.stringValue
@@ -206,7 +206,7 @@
 PASS document.activeElement == element2 is true
 PASS axElement2.role is axElement1.role
 PASS axElement2.roleDescription is axElement1.roleDescription
-PASS axElement2.deprecatedTitle is axElement1.deprecatedTitle
+PASS axElement2.name is axElement1.deprecatedTitle
 PASS axElement2.deprecatedDescription is axElement1.deprecatedDescription
 PASS axElement2.deprecatedHelpText is axElement1.deprecatedHelpText
 PASS axElement2.stringValue is axElement1.stringValue
@@ -223,7 +223,7 @@
 PASS document.activeElement == element2 is true
 PASS axElement2.role is axElement1.role
 PASS axElement2.roleDescription is axElement1.roleDescription
-PASS axElement2.deprecatedTitle is axElement1.deprecatedTitle
+PASS axElement2.name is axElement1.deprecatedTitle
 PASS axElement2.deprecatedDescription is axElement1.deprecatedDescription
 PASS axElement2.deprecatedHelpText is axElement1.deprecatedHelpText
 PASS axElement2.stringValue is axElement1.stringValue
@@ -240,7 +240,7 @@
 PASS document.activeElement == element2 is true
 PASS axElement2.role is axElement1.role
 PASS axElement2.roleDescription is axElement1.roleDescription
-PASS axElement2.deprecatedTitle is axElement1.deprecatedTitle
+PASS axElement2.name is axElement1.deprecatedTitle
 PASS axElement2.deprecatedDescription is axElement1.deprecatedDescription
 PASS axElement2.deprecatedHelpText is axElement1.deprecatedHelpText
 PASS axElement2.stringValue is axElement1.stringValue
@@ -257,7 +257,7 @@
 PASS document.activeElement == element2 is true
 PASS axElement2.role is axElement1.role
 PASS axElement2.roleDescription is axElement1.roleDescription
-PASS axElement2.deprecatedTitle is axElement1.deprecatedTitle
+PASS axElement2.name is axElement1.deprecatedTitle
 PASS axElement2.deprecatedDescription is axElement1.deprecatedDescription
 PASS axElement2.deprecatedHelpText is axElement1.deprecatedHelpText
 PASS axElement2.stringValue is axElement1.stringValue
@@ -274,7 +274,7 @@
 PASS document.activeElement == element2 is true
 PASS axElement2.role is axElement1.role
 PASS axElement2.roleDescription is axElement1.roleDescription
-PASS axElement2.deprecatedTitle is axElement1.deprecatedTitle
+PASS axElement2.name is axElement1.deprecatedTitle
 PASS axElement2.deprecatedDescription is axElement1.deprecatedDescription
 PASS axElement2.deprecatedHelpText is axElement1.deprecatedHelpText
 PASS axElement2.stringValue is axElement1.stringValue
@@ -291,7 +291,7 @@
 PASS document.activeElement == element2 is true
 PASS axElement2.role is axElement1.role
 PASS axElement2.roleDescription is axElement1.roleDescription
-PASS axElement2.deprecatedTitle is axElement1.deprecatedTitle
+PASS axElement2.name is axElement1.deprecatedTitle
 PASS axElement2.deprecatedDescription is axElement1.deprecatedDescription
 PASS axElement2.deprecatedHelpText is axElement1.deprecatedHelpText
 PASS axElement2.stringValue is axElement1.stringValue
@@ -308,7 +308,7 @@
 PASS document.activeElement == element2 is true
 PASS axElement2.role is axElement1.role
 PASS axElement2.roleDescription is axElement1.roleDescription
-PASS axElement2.deprecatedTitle is axElement1.deprecatedTitle
+PASS axElement2.name is axElement1.deprecatedTitle
 PASS axElement2.deprecatedDescription is axElement1.deprecatedDescription
 PASS axElement2.deprecatedHelpText is axElement1.deprecatedHelpText
 PASS axElement2.stringValue is axElement1.stringValue
@@ -325,7 +325,7 @@
 PASS document.activeElement == element2 is true
 PASS axElement2.role is axElement1.role
 PASS axElement2.roleDescription is axElement1.roleDescription
-PASS axElement2.deprecatedTitle is axElement1.deprecatedTitle
+PASS axElement2.name is axElement1.deprecatedTitle
 PASS axElement2.deprecatedDescription is axElement1.deprecatedDescription
 PASS axElement2.deprecatedHelpText is axElement1.deprecatedHelpText
 PASS axElement2.stringValue is axElement1.stringValue
@@ -342,7 +342,7 @@
 PASS document.activeElement == element2 is true
 PASS axElement2.role is axElement1.role
 PASS axElement2.roleDescription is axElement1.roleDescription
-PASS axElement2.deprecatedTitle is axElement1.deprecatedTitle
+PASS axElement2.name is axElement1.deprecatedTitle
 PASS axElement2.deprecatedDescription is axElement1.deprecatedDescription
 PASS axElement2.deprecatedHelpText is axElement1.deprecatedHelpText
 PASS axElement2.stringValue is axElement1.stringValue
@@ -359,7 +359,7 @@
 PASS document.activeElement == element2 is true
 PASS axElement2.role is axElement1.role
 PASS axElement2.roleDescription is axElement1.roleDescription
-PASS axElement2.deprecatedTitle is axElement1.deprecatedTitle
+PASS axElement2.name is axElement1.deprecatedTitle
 PASS axElement2.deprecatedDescription is axElement1.deprecatedDescription
 PASS axElement2.deprecatedHelpText is axElement1.deprecatedHelpText
 PASS axElement2.stringValue is axElement1.stringValue
diff --git a/third_party/WebKit/LayoutTests/accessibility/canvas-fallback-content-2.html b/third_party/WebKit/LayoutTests/accessibility/canvas-fallback-content-2.html
index 714bba2..c8158bfb 100644
--- a/third_party/WebKit/LayoutTests/accessibility/canvas-fallback-content-2.html
+++ b/third_party/WebKit/LayoutTests/accessibility/canvas-fallback-content-2.html
@@ -73,9 +73,9 @@
 
         shouldBe("axElement2.role", "axElement1.role");
         shouldBe("axElement2.roleDescription", "axElement1.roleDescription");
-        shouldBe("axElement2.deprecatedTitle", "axElement1.deprecatedTitle");
-        shouldBe("axElement2.deprecatedDescription", "axElement1.deprecatedDescription");
-        shouldBe("axElement2.deprecatedHelpText", "axElement1.deprecatedHelpText");
+        shouldBe("axElement2.name", "axElement1.name");
+        shouldBe("axElement2.name", "axElement1.name");
+        shouldBe("axElement2.description", "axElement1.deprecatedHelpText");
         shouldBe("axElement2.stringValue", "axElement1.stringValue");
         shouldBe("axElement2.isEnabled", "axElement1.isEnabled");
         shouldBe("axElement2.isRequired", "axElement1.isRequired");
diff --git a/third_party/WebKit/LayoutTests/accessibility/canvas-fallback-content-labels-expected.txt b/third_party/WebKit/LayoutTests/accessibility/canvas-fallback-content-labels-expected.txt
index fdcd6624..dd28050 100644
--- a/third_party/WebKit/LayoutTests/accessibility/canvas-fallback-content-labels-expected.txt
+++ b/third_party/WebKit/LayoutTests/accessibility/canvas-fallback-content-labels-expected.txt
@@ -1,4 +1,3 @@
-Nothing Text   Checkbox   Radio   Slider   List   Text with label for 
 This tests that labels and elements with labels in canvas fallback content have the same accessibility properties as those same elements outside of a canvas.
 
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
@@ -6,64 +5,64 @@
 
 Checking accessibility properties for ids: nothing1, nothing2
 PASS axElement2.role is axElement1.role
-PASS collapseWhitespace(axElement2.deprecatedTitle) is collapseWhitespace(axElement1.deprecatedTitle)
-PASS axElement2.deprecatedTitleUIElement is axElement1.deprecatedTitleUIElement
+PASS collapseWhitespace(axElement2.name) is collapseWhitespace(axElement1.name)
+PASS axElement2.nameElementCount() is axElement1.nameElementCount()
 
 Checking accessibility properties for ids: text_label1, text_label2
 PASS axElement2.role is axElement1.role
-PASS collapseWhitespace(axElement2.deprecatedTitle) is collapseWhitespace(axElement1.deprecatedTitle)
-PASS axElement2.deprecatedTitleUIElement is axElement1.deprecatedTitleUIElement
+PASS collapseWhitespace(axElement2.name) is collapseWhitespace(axElement1.name)
+PASS axElement2.nameElementCount() is axElement1.nameElementCount()
 
 Checking accessibility properties for ids: text1, text2
 PASS axElement2.role is axElement1.role
-PASS collapseWhitespace(axElement2.deprecatedTitle) is collapseWhitespace(axElement1.deprecatedTitle)
-PASS axElement2.deprecatedTitleUIElement is axElement1.deprecatedTitleUIElement
+PASS collapseWhitespace(axElement2.name) is collapseWhitespace(axElement1.name)
+PASS axElement2.nameElementCount() is axElement1.nameElementCount()
 
 Checking accessibility properties for ids: check_label1, check_label2
 PASS axElement1 == null && axElement2 == null is true
 
 Checking accessibility properties for ids: check1, check2
 PASS axElement2.role is axElement1.role
-PASS collapseWhitespace(axElement2.deprecatedTitle) is collapseWhitespace(axElement1.deprecatedTitle)
-PASS axElement2.deprecatedTitleUIElement is axElement1.deprecatedTitleUIElement
+PASS collapseWhitespace(axElement2.name) is collapseWhitespace(axElement1.name)
+PASS axElement2.nameElementCount() is axElement1.nameElementCount()
 
 Checking accessibility properties for ids: radio_label1, radio_label2
 PASS axElement1 == null && axElement2 == null is true
 
 Checking accessibility properties for ids: radio1, radio2
 PASS axElement2.role is axElement1.role
-PASS collapseWhitespace(axElement2.deprecatedTitle) is collapseWhitespace(axElement1.deprecatedTitle)
-PASS axElement2.deprecatedTitleUIElement is axElement1.deprecatedTitleUIElement
+PASS collapseWhitespace(axElement2.name) is collapseWhitespace(axElement1.name)
+PASS axElement2.nameElementCount() is axElement1.nameElementCount()
 
 Checking accessibility properties for ids: slider_label1, slider_label2
 PASS axElement2.role is axElement1.role
-PASS collapseWhitespace(axElement2.deprecatedTitle) is collapseWhitespace(axElement1.deprecatedTitle)
-PASS axElement2.deprecatedTitleUIElement is axElement1.deprecatedTitleUIElement
+PASS collapseWhitespace(axElement2.name) is collapseWhitespace(axElement1.name)
+PASS axElement2.nameElementCount() is axElement1.nameElementCount()
 
 Checking accessibility properties for ids: slider1, slider2
 PASS axElement2.role is axElement1.role
-PASS collapseWhitespace(axElement2.deprecatedTitle) is collapseWhitespace(axElement1.deprecatedTitle)
-PASS axElement2.deprecatedTitleUIElement is axElement1.deprecatedTitleUIElement
+PASS collapseWhitespace(axElement2.name) is collapseWhitespace(axElement1.name)
+PASS axElement2.nameElementCount() is axElement1.nameElementCount()
 
 Checking accessibility properties for ids: list_label1, list_label2
 PASS axElement2.role is axElement1.role
-PASS collapseWhitespace(axElement2.deprecatedTitle) is collapseWhitespace(axElement1.deprecatedTitle)
-PASS axElement2.deprecatedTitleUIElement is axElement1.deprecatedTitleUIElement
+PASS collapseWhitespace(axElement2.name) is collapseWhitespace(axElement1.name)
+PASS axElement2.nameElementCount() is axElement1.nameElementCount()
 
 Checking accessibility properties for ids: list1, list2
 PASS axElement2.role is axElement1.role
-PASS collapseWhitespace(axElement2.deprecatedTitle) is collapseWhitespace(axElement1.deprecatedTitle)
-PASS axElement2.deprecatedTitleUIElement is axElement1.deprecatedTitleUIElement
+PASS collapseWhitespace(axElement2.name) is collapseWhitespace(axElement1.name)
+PASS axElement2.nameElementCount() is axElement1.nameElementCount()
 
 Checking accessibility properties for ids: label_for1, label_for2
 PASS axElement2.role is axElement1.role
-PASS collapseWhitespace(axElement2.deprecatedTitle) is collapseWhitespace(axElement1.deprecatedTitle)
-PASS axElement2.deprecatedTitleUIElement is axElement1.deprecatedTitleUIElement
+PASS collapseWhitespace(axElement2.name) is collapseWhitespace(axElement1.name)
+PASS axElement2.nameElementCount() is axElement1.nameElementCount()
 
 Checking accessibility properties for ids: text_for1, text_for2
 PASS axElement2.role is axElement1.role
-PASS collapseWhitespace(axElement2.deprecatedTitle) is collapseWhitespace(axElement1.deprecatedTitle)
-PASS axElement2.deprecatedTitleUIElement is axElement1.deprecatedTitleUIElement
+PASS collapseWhitespace(axElement2.name) is collapseWhitespace(axElement1.name)
+PASS axElement2.nameElementCount() is axElement1.nameElementCount()
 
 PASS successfullyParsed is true
 
diff --git a/third_party/WebKit/LayoutTests/accessibility/canvas-fallback-content-labels.html b/third_party/WebKit/LayoutTests/accessibility/canvas-fallback-content-labels.html
index 136eb02f..d3452e2 100644
--- a/third_party/WebKit/LayoutTests/accessibility/canvas-fallback-content-labels.html
+++ b/third_party/WebKit/LayoutTests/accessibility/canvas-fallback-content-labels.html
@@ -3,7 +3,7 @@
 <body>
 <script src="../resources/js-test.js"></script>
 
-<div>
+<div id="container">
   <label id="nothing1">Nothing</label>
   <label id="text_label1">
     Text
@@ -81,8 +81,8 @@
             return;
         }
         shouldBe("axElement2.role", "axElement1.role");
-        shouldBe("collapseWhitespace(axElement2.deprecatedTitle)", "collapseWhitespace(axElement1.deprecatedTitle)");
-        shouldBe("axElement2.deprecatedTitleUIElement", "axElement1.deprecatedTitleUIElement");
+        shouldBe("collapseWhitespace(axElement2.name)", "collapseWhitespace(axElement1.name)");
+        shouldBe("axElement2.nameElementCount()", "axElement1.nameElementCount()");
         debug("");
     }
 
@@ -99,6 +99,8 @@
     check("list1", "list2");
     check("label_for1", "label_for2");
     check("text_for1", "text_for2");
+
+    document.getElementById("container").style.display = "none";
 }
 
 </script>
diff --git a/third_party/WebKit/LayoutTests/accessibility/computed-text-with-height-0.html b/third_party/WebKit/LayoutTests/accessibility/computed-text-with-height-0.html
index f074dbb..7cd2e8ab 100644
--- a/third_party/WebKit/LayoutTests/accessibility/computed-text-with-height-0.html
+++ b/third_party/WebKit/LayoutTests/accessibility/computed-text-with-height-0.html
@@ -15,7 +15,7 @@
 <script>
 test(function(t){
     var axButton = accessibilityController.accessibleElementById("button");
-    assert_equals(axButton.deprecatedTitle, "AXTitle: Friend Requests: 0");
+    assert_equals(axButton.name, "Friend Requests: 0");
     assert_equals(axButton.name, "Friend Requests: 0");
 }, "Text with height:0, position:absolute, and overflow:hidden should still be included in the accessible text computation.");
 </script>
diff --git a/third_party/WebKit/LayoutTests/accessibility/display-none-change.html b/third_party/WebKit/LayoutTests/accessibility/display-none-change.html
index 7b19112..9697088 100644
--- a/third_party/WebKit/LayoutTests/accessibility/display-none-change.html
+++ b/third_party/WebKit/LayoutTests/accessibility/display-none-change.html
@@ -11,9 +11,9 @@
 
     // Get the AXObject for the label indirectly, even though it's display:none.
     // Ensure that it's valid.
-    var axLabel = axButton.deprecatedTitleUIElement();
+    var axLabel = axButton.nameElementAtIndex(0);
     assert_equals(axLabel.isValid, true);
-    assert_equals(axLabel.deprecatedDescription, 'AXDescription: AriaLabel');
+    assert_equals(axLabel.name, 'AriaLabel');
 
     // Now un-hide the label.
     var label = document.getElementById('label');
@@ -21,10 +21,10 @@
 
     // Ensure that the previous AXObject we had for the label is now invalid, but if
     // we fetch an AXObject for it, we get a new valid object.
-    var axLabel2 = axButton.deprecatedTitleUIElement();
+    var axLabel2 = axButton.nameElementAtIndex(0);
     assert_equals(axLabel.isValid, false);
     assert_equals(axLabel2.isValid, true);
-    assert_equals(axLabel2.deprecatedDescription, 'AXDescription: AriaLabel');
+    assert_equals(axLabel2.name, 'AriaLabel');
     assert_equals(axLabel.isEqual(axLabel2), false);
 
     // Now hide the label again.
@@ -32,11 +32,11 @@
 
     // Check once more: the second AXObject is now invalid, but if we fetch
     // an AXObject for the label a third time, we get a valid object again.
-    var axLabel3 = axButton.deprecatedTitleUIElement();
+    var axLabel3 = axButton.nameElementAtIndex(0);
     assert_equals(axLabel.isValid, false);
     assert_equals(axLabel2.isValid, false);
     assert_equals(axLabel3.isValid, true);
-    assert_equals(axLabel3.deprecatedDescription, 'AXDescription: AriaLabel');
+    assert_equals(axLabel3.name, 'AriaLabel');
     assert_equals(axLabel.isEqual(axLabel3), false);
     assert_equals(axLabel2.isEqual(axLabel3), false);
 }, "Accessibility objects for display:none elements");
diff --git a/third_party/WebKit/LayoutTests/accessibility/dl-role.html b/third_party/WebKit/LayoutTests/accessibility/dl-role.html
index 5e0f9df..59d24764 100644
--- a/third_party/WebKit/LayoutTests/accessibility/dl-role.html
+++ b/third_party/WebKit/LayoutTests/accessibility/dl-role.html
@@ -18,4 +18,4 @@
     var ddElement = accessibilityController.accessibleElementById("ddElem");
     shouldBe("ddElement.role", "'AXRole: AXDescriptionListDetail'");
 }
-</script>
\ No newline at end of file
+</script>
diff --git a/third_party/WebKit/LayoutTests/accessibility/element-role-mapping-normal.html b/third_party/WebKit/LayoutTests/accessibility/element-role-mapping-normal.html
index d8b649be..f525dbd 100644
--- a/third_party/WebKit/LayoutTests/accessibility/element-role-mapping-normal.html
+++ b/third_party/WebKit/LayoutTests/accessibility/element-role-mapping-normal.html
@@ -92,4 +92,4 @@
 if (window.accessibilityController)
   buildAccessibilityTree(accessibilityController.focusedElement, 0, 1);
 </script>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/WebKit/LayoutTests/accessibility/focusable-div-expected.txt b/third_party/WebKit/LayoutTests/accessibility/focusable-div-expected.txt
index 8e5c8bee..27be1b0 100644
--- a/third_party/WebKit/LayoutTests/accessibility/focusable-div-expected.txt
+++ b/third_party/WebKit/LayoutTests/accessibility/focusable-div-expected.txt
@@ -12,23 +12,21 @@
 
 
 PASS document.activeElement == link is true
-PASS lastChar(axLink.deprecatedTitle) is "A"
+PASS axLink.name is "A"
 PASS document.activeElement == div is true
-PASS lastChar(axDiv.deprecatedTitle) is "B"
+PASS axDiv.name is ""
 PASS document.activeElement == div2 is true
-PASS lastChar(axDiv2.deprecatedTitle) is "C"
+PASS axDiv2.name is ""
 PASS document.activeElement == div3 is true
-PASS lastChar(axDiv3.deprecatedDescription) is "D"
+PASS axDiv3.name is "D"
 PASS document.activeElement == div4 is true
-PASS axDiv4.deprecatedTitle.indexOf('Link') is -1
+PASS axDiv4.name is ""
 PASS document.activeElement == div5 is true
-PASS axDiv5.deprecatedTitle.indexOf('Link') is -1
-PASS axDiv5.deprecatedTitle.indexOf('Initial text before link') >= 0 is true
+PASS axDiv5.name is ""
 PASS document.activeElement == div6 is true
-PASS axDiv6.deprecatedTitle.indexOf('List item') is -1
+PASS axDiv6.name is ""
 PASS document.activeElement == div7 is true
-PASS axDiv7.deprecatedTitle.indexOf('List item') is -1
-PASS axDiv7.deprecatedTitle.indexOf('Initial text before list') >= 0 is true
+PASS axDiv7.name is ""
 PASS successfullyParsed is true
 
 TEST COMPLETE
diff --git a/third_party/WebKit/LayoutTests/accessibility/focusable-div.html b/third_party/WebKit/LayoutTests/accessibility/focusable-div.html
index a04be0a..242d0fc 100644
--- a/third_party/WebKit/LayoutTests/accessibility/focusable-div.html
+++ b/third_party/WebKit/LayoutTests/accessibility/focusable-div.html
@@ -6,12 +6,10 @@
 <!-- A link always gets its accessible text from contents. -->
 <a id="link" href="#">A</a>
 
-<!-- A generic focusable div should also get its accessible text from contents. -->
+<!-- A generic focusable div not get its accessible text from contents. -->
 <div id="div" tabindex="0">B</div>
 <div id="div2" tabindex="0"><div></div>C</div>
 <div id="div3" tabindex="0" aria-label="D"></div>
-
-<!-- A generic focusable div should not get accessible text from children that are focusable or containers. -->
 <div id="div4" tabindex="0"><a href="#">Link</a></div>
 <div id="div5" tabindex="0">Initial text before link<a href="#">Link</a></div>
 <div id="div6" tabindex="0"><ul><li>List item</li></ul></div>
@@ -24,59 +22,53 @@
 if (window.testRunner && window.accessibilityController) {
     window.testRunner.dumpAsText();
 
-    function lastChar(str) {
-        return str.substr(str.length - 1);
-    }
-
     var link = document.getElementById('link');
     link.focus();
     shouldBe("document.activeElement == link", "true");
     window.axLink = accessibilityController.focusedElement;
-    shouldBe("lastChar(axLink.deprecatedTitle)", "\"A\"");
+    shouldBe("axLink.name", "\"A\"");
 
     var div = document.getElementById('div');
     div.focus();
     shouldBe("document.activeElement == div", "true");
     window.axDiv = accessibilityController.focusedElement;
-    shouldBe("lastChar(axDiv.deprecatedTitle)", "\"B\"");
+    shouldBe("axDiv.name", "\"\"");
 
     var div2 = document.getElementById('div2');
     div2.focus();
     shouldBe("document.activeElement == div2", "true");
     window.axDiv2 = accessibilityController.focusedElement;
-    shouldBe("lastChar(axDiv2.deprecatedTitle)", "\"C\"");
+    shouldBe("axDiv2.name", "\"\"");
 
     var div3 = document.getElementById('div3');
     div3.focus();
     shouldBe("document.activeElement == div3", "true");
     window.axDiv3 = accessibilityController.focusedElement;
-    shouldBe("lastChar(axDiv3.deprecatedDescription)", "\"D\"");
+    shouldBe("axDiv3.name", "\"D\"");
 
     var div4 = document.getElementById('div4');
     div4.focus();
     shouldBe("document.activeElement == div4", "true");
     window.axDiv4 = accessibilityController.focusedElement;
-    shouldBe("axDiv4.deprecatedTitle.indexOf('Link')", "-1");
+    shouldBe("axDiv4.name", "\"\"");
 
     var div5 = document.getElementById('div5');
     div5.focus();
     shouldBe("document.activeElement == div5", "true");
     window.axDiv5 = accessibilityController.focusedElement;
-    shouldBe("axDiv5.deprecatedTitle.indexOf('Link')", "-1");
-    shouldBe("axDiv5.deprecatedTitle.indexOf('Initial text before link') >= 0", "true");
+    shouldBe("axDiv5.name", "\"\"");
 
     var div6 = document.getElementById('div6');
     div6.focus();
     shouldBe("document.activeElement == div6", "true");
     window.axDiv6 = accessibilityController.focusedElement;
-    shouldBe("axDiv6.deprecatedTitle.indexOf('List item')", "-1");
+    shouldBe("axDiv6.name", "\"\"");
 
     var div7 = document.getElementById('div7');
     div7.focus();
     shouldBe("document.activeElement == div7", "true");
     window.axDiv7 = accessibilityController.focusedElement;
-    shouldBe("axDiv7.deprecatedTitle.indexOf('List item')", "-1");
-    shouldBe("axDiv7.deprecatedTitle.indexOf('Initial text before list') >= 0", "true");
+    shouldBe("axDiv7.name", "\"\"");
 }
 
 </script>
diff --git a/third_party/WebKit/LayoutTests/accessibility/heading-level.html b/third_party/WebKit/LayoutTests/accessibility/heading-level.html
index 44ad362..7566eaa 100644
--- a/third_party/WebKit/LayoutTests/accessibility/heading-level.html
+++ b/third_party/WebKit/LayoutTests/accessibility/heading-level.html
@@ -62,4 +62,4 @@
 }
 </script>
 </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/WebKit/LayoutTests/accessibility/image-link-expected.txt b/third_party/WebKit/LayoutTests/accessibility/image-link-expected.txt
index 931dbbb..ad12b2d2d 100644
--- a/third_party/WebKit/LayoutTests/accessibility/image-link-expected.txt
+++ b/third_party/WebKit/LayoutTests/accessibility/image-link-expected.txt
@@ -3,13 +3,11 @@
 This test checks that the right accessibility tree is generated for a link inside an image
 
 
-AXTitle: Delicious cake
+Delicious cake
 AXRole: AXLink
-AXDescription: 
 
 Child 0:
-AXTitle: 
+Delicious cake
 AXRole: AXImage
-AXDescription: Delicious cake
 
 
diff --git a/third_party/WebKit/LayoutTests/accessibility/image-map-title-causes-crash.html b/third_party/WebKit/LayoutTests/accessibility/image-map-title-causes-crash.html
index 7eb404f..127345b 100644
--- a/third_party/WebKit/LayoutTests/accessibility/image-map-title-causes-crash.html
+++ b/third_party/WebKit/LayoutTests/accessibility/image-map-title-causes-crash.html
@@ -8,7 +8,7 @@
     }
 
     function queryTitleOnDecendants(accessibilityObject) {
-        accessibilityObject.deprecatedTitle
+        accessibilityObject.name
 
         var count = accessibilityObject.childrenCount;
         for (var i = 0; i < count; ++i)
diff --git a/third_party/WebKit/LayoutTests/accessibility/image-map1-expected.txt b/third_party/WebKit/LayoutTests/accessibility/image-map1-expected.txt
index 6d22ddc..27aa4fd 100644
--- a/third_party/WebKit/LayoutTests/accessibility/image-map1-expected.txt
+++ b/third_party/WebKit/LayoutTests/accessibility/image-map1-expected.txt
@@ -4,12 +4,12 @@
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
 
 
-PASS body.childAtIndex(3).role is 'AXRole: AXLink'
-PASS body.childAtIndex(3).deprecatedTitle is 'AXTitle: Link1'
-PASS body.childAtIndex(4).role is 'AXRole: AXLink'
-PASS body.childAtIndex(4).deprecatedTitle is 'AXTitle: Link2'
-PASS body.childAtIndex(5).role is 'AXRole: AXLink'
-PASS body.childAtIndex(5).deprecatedTitle is 'AXTitle: Link3'
+PASS body.childAtIndex(0).role is 'AXRole: AXLink'
+PASS body.childAtIndex(0).name is 'Link1'
+PASS body.childAtIndex(1).role is 'AXRole: AXLink'
+PASS body.childAtIndex(1).name is 'Link2'
+PASS body.childAtIndex(2).role is 'AXRole: AXLink'
+PASS body.childAtIndex(2).name is 'Link3'
 PASS successfullyParsed is true
 
 TEST COMPLETE
diff --git a/third_party/WebKit/LayoutTests/accessibility/image-map1.html b/third_party/WebKit/LayoutTests/accessibility/image-map1.html
index 8159bbd..b19498b5a 100644
--- a/third_party/WebKit/LayoutTests/accessibility/image-map1.html
+++ b/third_party/WebKit/LayoutTests/accessibility/image-map1.html
@@ -7,7 +7,7 @@
         testRunner.dumpAsText();
 </script>
 <body id="body">
-    
+
     <!-- Test image map -->
     <map id="apple" name="imagemap1">
       <area shape="rect" coords="10,10,133,72" href="http://www.apple.com" title="Link1" />
@@ -20,7 +20,7 @@
 
 <p id="description"></p>
 <div id="console"></div>
-     
+
     <script>
         description("This tests that you can reach the links within an image map.");
 
@@ -28,14 +28,14 @@
             document.getElementById("body").focus();
 
             var body = accessibilityController.focusedElement;
-            shouldBe("body.childAtIndex(3).role", "'AXRole: AXLink'");
-            shouldBe("body.childAtIndex(3).deprecatedTitle", "'AXTitle: Link1'");
+            shouldBe("body.childAtIndex(0).role", "'AXRole: AXLink'");
+            shouldBe("body.childAtIndex(0).name", "'Link1'");
 
-            shouldBe("body.childAtIndex(4).role", "'AXRole: AXLink'");
-            shouldBe("body.childAtIndex(4).deprecatedTitle", "'AXTitle: Link2'");
+            shouldBe("body.childAtIndex(1).role", "'AXRole: AXLink'");
+            shouldBe("body.childAtIndex(1).name", "'Link2'");
 
-            shouldBe("body.childAtIndex(5).role", "'AXRole: AXLink'");
-            shouldBe("body.childAtIndex(5).deprecatedTitle", "'AXTitle: Link3'");
+            shouldBe("body.childAtIndex(2).role", "'AXRole: AXLink'");
+            shouldBe("body.childAtIndex(2).name", "'Link3'");
         }
 </script>
 
diff --git a/third_party/WebKit/LayoutTests/accessibility/image-map2-expected.txt b/third_party/WebKit/LayoutTests/accessibility/image-map2-expected.txt
index 229a206b..475c87f 100644
--- a/third_party/WebKit/LayoutTests/accessibility/image-map2-expected.txt
+++ b/third_party/WebKit/LayoutTests/accessibility/image-map2-expected.txt
@@ -2,24 +2,13 @@
 ----------------------
 
 ------------
-AXTitle: 
+
 AXRole: AXDiv
-AXDescription: 
 ------------
-AXTitle: 
+Link1
 AXRole: AXLink
-AXDescription: 
 ------------
-AXTitle: 
+Link2
 AXRole: AXLink
-AXDescription: 
-------------
-AXTitle: 
-AXRole: AXLink
-AXDescription: Link1
-------------
-AXTitle: 
-AXRole: AXLink
-AXDescription: Link2
 
  
diff --git a/third_party/WebKit/LayoutTests/accessibility/image-map2.html b/third_party/WebKit/LayoutTests/accessibility/image-map2.html
index 6922396..dff9001 100644
--- a/third_party/WebKit/LayoutTests/accessibility/image-map2.html
+++ b/third_party/WebKit/LayoutTests/accessibility/image-map2.html
@@ -4,9 +4,9 @@
         testRunner.dumpAsText();
 </script>
 <body id="body">
-    
+
     <div id="result"></div>
-    
+
     <!-- Test image map -->
     <map id="apple" name="imagemap1">
       <area shape="rect" coords="10,10,133,72" href="http://www.apple.com" alt="Link1" />
@@ -15,7 +15,7 @@
 
     <img src="resources/cake.png"  border="0" align="left" usemap="#imagemap1" vspace="1">
 
-     
+
     <script>
         if (window.accessibilityController) {
             var result = document.getElementById("result");
@@ -24,7 +24,7 @@
             body.focus();
             result.innerText += "Image map - test 2 - 2 Links (alt tags)\n";
             result.innerText += "----------------------\n";
-            result.innerText += accessibilityController.focusedElement.attributesOfChildren() + "\n\n"; 
+            result.innerText += accessibilityController.focusedElement.attributesOfChildren() + "\n\n";
         }
     </script>
 </body>
diff --git a/third_party/WebKit/LayoutTests/accessibility/img-alt-tag-only-whitespace-expected.txt b/third_party/WebKit/LayoutTests/accessibility/img-alt-tag-only-whitespace-expected.txt
index 90e8b15..fbd2c8b 100644
--- a/third_party/WebKit/LayoutTests/accessibility/img-alt-tag-only-whitespace-expected.txt
+++ b/third_party/WebKit/LayoutTests/accessibility/img-alt-tag-only-whitespace-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE MESSAGE: line 26: Image description: AXDescription:    Image 
+CONSOLE MESSAGE: line 26: Image description: Image
 
 
 
diff --git a/third_party/WebKit/LayoutTests/accessibility/img-alt-tag-only-whitespace.html b/third_party/WebKit/LayoutTests/accessibility/img-alt-tag-only-whitespace.html
index 444839a..5a57e28 100644
--- a/third_party/WebKit/LayoutTests/accessibility/img-alt-tag-only-whitespace.html
+++ b/third_party/WebKit/LayoutTests/accessibility/img-alt-tag-only-whitespace.html
@@ -23,7 +23,7 @@
         document.getElementById("images").focus();
         var imagesGroup = accessibilityController.focusedElement;
         shouldBe("imagesGroup.childrenCount", "4");
-        console.log("Image description: " + imagesGroup.childAtIndex(2).deprecatedDescription);
+        console.log("Image description: " + imagesGroup.childAtIndex(2).name);
     }
 
 </script>
diff --git a/third_party/WebKit/LayoutTests/accessibility/img-aria-button-alt-tag-expected.txt b/third_party/WebKit/LayoutTests/accessibility/img-aria-button-alt-tag-expected.txt
index c784910..8b31f9df 100644
--- a/third_party/WebKit/LayoutTests/accessibility/img-aria-button-alt-tag-expected.txt
+++ b/third_party/WebKit/LayoutTests/accessibility/img-aria-button-alt-tag-expected.txt
@@ -4,7 +4,7 @@
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
 
 
-PASS imgUIElement.deprecatedDescription is 'AXDescription: alternate'
+PASS imgUIElement.name is 'alternate'
 PASS successfullyParsed is true
 
 TEST COMPLETE
diff --git a/third_party/WebKit/LayoutTests/accessibility/img-aria-button-alt-tag.html b/third_party/WebKit/LayoutTests/accessibility/img-aria-button-alt-tag.html
index 5812bcf..1b3ee437 100644
--- a/third_party/WebKit/LayoutTests/accessibility/img-aria-button-alt-tag.html
+++ b/third_party/WebKit/LayoutTests/accessibility/img-aria-button-alt-tag.html
@@ -21,7 +21,7 @@
 
             var body = document.getElementById("body").focus();
             var imgUIElement = accessibilityController.focusedElement.childAtIndex(0).childAtIndex(0);
-            shouldBe("imgUIElement.deprecatedDescription", "'AXDescription: alternate'");
+            shouldBe("imgUIElement.name", "'alternate'");
         }
     </script>
     
diff --git a/third_party/WebKit/LayoutTests/accessibility/img-fallsback-to-title-expected.txt b/third_party/WebKit/LayoutTests/accessibility/img-fallsback-to-title-expected.txt
index 35be43f..8c795541 100644
--- a/third_party/WebKit/LayoutTests/accessibility/img-fallsback-to-title-expected.txt
+++ b/third_party/WebKit/LayoutTests/accessibility/img-fallsback-to-title-expected.txt
@@ -6,17 +6,17 @@
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
 
 
-Image1 description: AXDescription: test1
-Image1 help: AXHelp: 
+Image1 name: test1
+Image1 description: 
 
-Image2 description: AXDescription: alt
-Image2 help: AXHelp: test2
+Image2 name: alt
+Image2 description: test2
 
-Image3 description: AXDescription: test3
-Image3 help: AXHelp: 
+Image3 name: test3
+Image3 description: 
 
-Image4 description: AXDescription: alt
-Image4 help: AXHelp: test4
+Image4 name: test4
+Image4 description: 
 
 PASS imagesGroup.childAtIndex(0).childrenCount is 2
 PASS successfullyParsed is true
diff --git a/third_party/WebKit/LayoutTests/accessibility/img-fallsback-to-title.html b/third_party/WebKit/LayoutTests/accessibility/img-fallsback-to-title.html
index 1de678f7..932957a8 100644
--- a/third_party/WebKit/LayoutTests/accessibility/img-fallsback-to-title.html
+++ b/third_party/WebKit/LayoutTests/accessibility/img-fallsback-to-title.html
@@ -26,26 +26,26 @@
         var imagesGroup = accessibilityController.focusedElement;
 
         // First image should have a description of "test1" because there is no alt tag (it should use the title).
-        // The title should NOT be in the help text.
+        // The title should NOT be in the description.
         var image1 = imagesGroup.childAtIndex(0).childAtIndex(0);
-        debug("Image1 description: " + image1.deprecatedDescription);
-        debug("Image1 help: " + image1.deprecatedHelpText + "<br>");
+        debug("Image1 name: " + image1.name);
+        debug("Image1 description: " + image1.description + "<br>");
 
-        // Second image should use the description from the alt tag instead of the title.
-        // The help text should reflect what's in the title.
+        // Second image should use the alt tag instead of the title.
+        // The description should reflect what's in the title.
         var image2 = imagesGroup.childAtIndex(0).childAtIndex(1);
-        debug("Image2 description: " + image2.deprecatedDescription);
-        debug("Image2 help: " + image2.deprecatedHelpText + "<br>");
+        debug("Image2 name: " + image2.name);
+        debug("Image2 description: " + image2.description + "<br>");
 
         // Now do the same checks for ARIA type images.
         var image3 = imagesGroup.childAtIndex(1);
-        debug("Image3 description: " + image3.deprecatedDescription);
-        debug("Image3 help: " + image3.deprecatedHelpText + "<br>");
+        debug("Image3 name: " + image3.name);
+        debug("Image3 description: " + image3.description + "<br>");
 
         // Now do the same checks for ARIA type images.
         var image4 = imagesGroup.childAtIndex(2);
-        debug("Image4 description: " + image4.deprecatedDescription);
-        debug("Image4 help: " + image4.deprecatedHelpText + "<br>");
+        debug("Image4 name: " + image4.name);
+        debug("Image4 description: " + image4.description + "<br>");
 
         // Verify that the first image (with an empty alt tag) is ignored
         // by checking the children count of the group containing the native images == 2.
diff --git a/third_party/WebKit/LayoutTests/accessibility/input-file-causes-crash.html b/third_party/WebKit/LayoutTests/accessibility/input-file-causes-crash.html
index 370eb92..7c8e0fd 100644
--- a/third_party/WebKit/LayoutTests/accessibility/input-file-causes-crash.html
+++ b/third_party/WebKit/LayoutTests/accessibility/input-file-causes-crash.html
@@ -17,7 +17,7 @@
     if (window.accessibilityController) {
         document.getElementById("file-input").focus();
         var element = accessibilityController.focusedElement;
-        var title = element.deprecatedTitle;
+        var title = element.name;
         shouldBeNonNull("title");
     }
 </script>
diff --git a/third_party/WebKit/LayoutTests/accessibility/input-image-alt-expected.txt b/third_party/WebKit/LayoutTests/accessibility/input-image-alt-expected.txt
index 60a99633..b3360a5 100644
--- a/third_party/WebKit/LayoutTests/accessibility/input-image-alt-expected.txt
+++ b/third_party/WebKit/LayoutTests/accessibility/input-image-alt-expected.txt
@@ -4,7 +4,7 @@
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
 
 
-PASS img.deprecatedDescription is 'AXDescription: Submit'
+PASS img.name is 'Submit'
 PASS successfullyParsed is true
 
 TEST COMPLETE
diff --git a/third_party/WebKit/LayoutTests/accessibility/input-image-alt.html b/third_party/WebKit/LayoutTests/accessibility/input-image-alt.html
index 28a2031..4e6cb3f 100644
--- a/third_party/WebKit/LayoutTests/accessibility/input-image-alt.html
+++ b/third_party/WebKit/LayoutTests/accessibility/input-image-alt.html
@@ -17,7 +17,7 @@
             var image1 = document.getElementById("image1").focus();
             var img = accessibilityController.focusedElement;
 
-            shouldBe("img.deprecatedDescription", "'AXDescription: Submit'");
+            shouldBe("img.name", "'Submit'");
         }
     </script>
 
diff --git a/third_party/WebKit/LayoutTests/accessibility/legend.html b/third_party/WebKit/LayoutTests/accessibility/legend.html
index b377517..4d46fdf4 100644
--- a/third_party/WebKit/LayoutTests/accessibility/legend.html
+++ b/third_party/WebKit/LayoutTests/accessibility/legend.html
@@ -24,7 +24,7 @@
         document.body.focus();
         var body = accessibilityController.focusedElement;
         var fieldset = body.childAtIndex(0);
-        var titleUIElement = fieldset.deprecatedTitleUIElement();
+        var titleUIElement = fieldset.nameElementAtIndex(0);
 
         // Print out the tree of accessible objects, indicating the titleUIElement so
         // that each platform can verify their expected object has been found
diff --git a/third_party/WebKit/LayoutTests/accessibility/link-inside-button-accessible-text-expected.txt b/third_party/WebKit/LayoutTests/accessibility/link-inside-button-accessible-text-expected.txt
index ef72e01..00bb1110 100644
--- a/third_party/WebKit/LayoutTests/accessibility/link-inside-button-accessible-text-expected.txt
+++ b/third_party/WebKit/LayoutTests/accessibility/link-inside-button-accessible-text-expected.txt
@@ -3,8 +3,8 @@
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
 
 
-PASS button1.deprecatedTitle is 'AXTitle: foo1'
-PASS button2.deprecatedTitle is 'AXTitle: foo2'
+PASS button1.name is 'foo1'
+PASS button2.name is 'foo2'
 PASS successfullyParsed is true
 
 TEST COMPLETE
diff --git a/third_party/WebKit/LayoutTests/accessibility/link-inside-button-accessible-text.html b/third_party/WebKit/LayoutTests/accessibility/link-inside-button-accessible-text.html
index 27d94cd..2fe4f7c4 100644
--- a/third_party/WebKit/LayoutTests/accessibility/link-inside-button-accessible-text.html
+++ b/third_party/WebKit/LayoutTests/accessibility/link-inside-button-accessible-text.html
@@ -20,9 +20,9 @@
     description("This tests that when a link is inside a button, its visible text is still available for the button.");
     if (window.accessibilityController) {
           var button1 = accessibilityController.accessibleElementById("button1");
-          shouldBe("button1.deprecatedTitle", "'AXTitle: foo1'");
+          shouldBe("button1.name", "'foo1'");
           var button2 = accessibilityController.accessibleElementById("button2");
-          shouldBe("button2.deprecatedTitle", "'AXTitle: foo2'");
+          shouldBe("button2.name", "'foo2'");
           document.getElementById("content").style.visibility = 'hidden';
     }
 </script>
diff --git a/third_party/WebKit/LayoutTests/accessibility/loading-iframe-sends-notification.html b/third_party/WebKit/LayoutTests/accessibility/loading-iframe-sends-notification.html
index 5dec56bc..2a3262b 100644
--- a/third_party/WebKit/LayoutTests/accessibility/loading-iframe-sends-notification.html
+++ b/third_party/WebKit/LayoutTests/accessibility/loading-iframe-sends-notification.html
@@ -37,7 +37,7 @@
 
                 // Ignore this notification if it's not within the subtree of the iframe.
                 var frameTarget = target.parentElement().parentElement();
-                if (frameTarget.deprecatedDescription.indexOf("InnerFrame") == -1)
+                if (frameTarget.name.indexOf("InnerFrame") == -1)
                     return;
 
                 // Even still we'll get LayoutComplete notifications sooner than we want.
diff --git a/third_party/WebKit/LayoutTests/accessibility/meter-value.html b/third_party/WebKit/LayoutTests/accessibility/meter-value.html
index 91be52033..ac6cecc2 100644
--- a/third_party/WebKit/LayoutTests/accessibility/meter-value.html
+++ b/third_party/WebKit/LayoutTests/accessibility/meter-value.html
@@ -21,4 +21,4 @@
     shouldBe("axMeter1.intValue", "5");
 }
 </script>
-</body>
\ No newline at end of file
+</body>
diff --git a/third_party/WebKit/LayoutTests/accessibility/non-data-table-cell-title-ui-element.html b/third_party/WebKit/LayoutTests/accessibility/non-data-table-cell-title-ui-element.html
index 1fdc9a9..8562ac8 100644
--- a/third_party/WebKit/LayoutTests/accessibility/non-data-table-cell-title-ui-element.html
+++ b/third_party/WebKit/LayoutTests/accessibility/non-data-table-cell-title-ui-element.html
@@ -31,7 +31,7 @@
             body.focus();
             // get the <th>skip</th> element
             var group = accessibilityController.focusedElement.childAtIndex(5);
-            var titleUI = group.deprecatedTitleUIElement();
+            var titleUI = group.nameElementAtIndex(0);
             var allAttributes = "";
             if (titleUI)
                 allAttributes = titleUI.allAttributes();
diff --git a/third_party/WebKit/LayoutTests/accessibility/radio-button-title-label-expected.txt b/third_party/WebKit/LayoutTests/accessibility/radio-button-title-label-expected.txt
index fac2f2c..dc250f65 100644
--- a/third_party/WebKit/LayoutTests/accessibility/radio-button-title-label-expected.txt
+++ b/third_party/WebKit/LayoutTests/accessibility/radio-button-title-label-expected.txt
@@ -3,14 +3,14 @@
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
 
 
-PASS focusedElement.deprecatedTitle is 'AXTitle: LABEL'
-PASS !titleUIElement || titleUIElement.deprecatedTitle == 'AXTitle: ' is true
-PASS focusedElement.deprecatedDescription is 'AXDescription: LABEL2a'
-PASS focusedElement.deprecatedTitle is 'AXTitle: '
-PASS !titleUIElement || titleUIElement.deprecatedTitle == 'AXTitle: ' is true
-PASS focusedElement.deprecatedDescription is 'AXDescription: radio3'
-PASS focusedElement.deprecatedTitle is 'AXTitle: '
-PASS !titleUIElement || titleUIElement.deprecatedTitle == 'AXTitle: ' is true
+PASS focusedElement.name is 'LABEL'
+PASS !titleUIElement || titleUIElement.name == '' is true
+PASS focusedElement.name is 'LABEL2a'
+PASS focusedElement.description is ''
+PASS !titleUIElement || titleUIElement.name == '' is true
+PASS focusedElement.name is 'radio3'
+PASS focusedElement.description is ''
+PASS !titleUIElement || titleUIElement.name == '' is true
 PASS successfullyParsed is true
 
 TEST COMPLETE
diff --git a/third_party/WebKit/LayoutTests/accessibility/radio-button-title-label.html b/third_party/WebKit/LayoutTests/accessibility/radio-button-title-label.html
index a01582f..f4de4d175 100644
--- a/third_party/WebKit/LayoutTests/accessibility/radio-button-title-label.html
+++ b/third_party/WebKit/LayoutTests/accessibility/radio-button-title-label.html
@@ -10,7 +10,7 @@
 
 <p id="description"></p>
 <div id="console"></div>
-    
+
     <input type="radio" name="r1" id="r1" title="TITLE">Test<br>
     <label for="r1">LABEL</label>
 
@@ -32,25 +32,25 @@
 
             // 1) Even though a checkbox has a title attribute, the title ui element should still be exposed.
             var focusedElement = accessibilityController.focusedElement;
-            var titleUIElement = focusedElement.deprecatedTitleUIElement();
-            shouldBe("focusedElement.deprecatedTitle", "'AXTitle: LABEL'");
-            shouldBeTrue("!titleUIElement || titleUIElement.deprecatedTitle == 'AXTitle: '");
+            var titleUIElement = focusedElement.nameElementAtIndex(0);
+            shouldBe("focusedElement.name", "'LABEL'");
+            shouldBeTrue("!titleUIElement || titleUIElement.name == ''");
 
             // 2) aria-labeledby should override the native label semantics and return a title for the radio button, instead of a title ui element.
             document.getElementById("r2").focus();
             focusedElement = accessibilityController.focusedElement;
-            titleUIElement = focusedElement.deprecatedTitleUIElement();
-            shouldBe("focusedElement.deprecatedDescription", "'AXDescription: LABEL2a'");
-            shouldBe("focusedElement.deprecatedTitle", "'AXTitle: '");
-            shouldBeTrue("!titleUIElement || titleUIElement.deprecatedTitle == 'AXTitle: '");
+            titleUIElement = focusedElement.nameElementAtIndex(0);
+            shouldBe("focusedElement.name", "'LABEL2a'");
+            shouldBe("focusedElement.description", "''");
+            shouldBeTrue("!titleUIElement || titleUIElement.name == ''");
 
             // 3) If a radio button has an aria-label and a <label>, the aria-label should be the title.
             document.getElementById("r3").focus();
             focusedElement = accessibilityController.focusedElement;
-            titleUIElement = focusedElement.deprecatedTitleUIElement();
-            shouldBe("focusedElement.deprecatedDescription", "'AXDescription: radio3'");
-            shouldBe("focusedElement.deprecatedTitle", "'AXTitle: '");
-            shouldBeTrue("!titleUIElement || titleUIElement.deprecatedTitle == 'AXTitle: '");
+            titleUIElement = focusedElement.nameElementAtIndex(0);
+            shouldBe("focusedElement.name", "'radio3'");
+            shouldBe("focusedElement.description", "''");
+            shouldBeTrue("!titleUIElement || titleUIElement.name == ''");
 
         }
     </script>
diff --git a/third_party/WebKit/LayoutTests/accessibility/role-attribute.html b/third_party/WebKit/LayoutTests/accessibility/role-attribute.html
index 839c5a8..d8c51f75 100644
--- a/third_party/WebKit/LayoutTests/accessibility/role-attribute.html
+++ b/third_party/WebKit/LayoutTests/accessibility/role-attribute.html
@@ -32,4 +32,4 @@
     testRunner.dumpAsText();
 if (window.accessibilityController)
     buildAccessibilityTree(accessibilityController.focusedElement, 0, 1);
-</script>
\ No newline at end of file
+</script>
diff --git a/third_party/WebKit/LayoutTests/accessibility/secure-textfield-title-ui.html b/third_party/WebKit/LayoutTests/accessibility/secure-textfield-title-ui.html
index fba35b55..38514b1 100644
--- a/third_party/WebKit/LayoutTests/accessibility/secure-textfield-title-ui.html
+++ b/third_party/WebKit/LayoutTests/accessibility/secure-textfield-title-ui.html
@@ -19,7 +19,7 @@
 
             var pass = document.getElementById("accountpassword");
             pass.focus();
-            var titleUIElement = accessibilityController.focusedElement.deprecatedTitleUIElement();
+            var titleUIElement = accessibilityController.focusedElement.nameElementAtIndex(0);
             var titleText = titleUIElement.childAtIndex(0);
             if (titleText.stringValue == "AXValue: Password") {
                 result.innerText += "Test passed\n";
diff --git a/third_party/WebKit/LayoutTests/accessibility/spinbutton-value-expected.txt b/third_party/WebKit/LayoutTests/accessibility/spinbutton-value-expected.txt
index 7727e42..3644944 100644
--- a/third_party/WebKit/LayoutTests/accessibility/spinbutton-value-expected.txt
+++ b/third_party/WebKit/LayoutTests/accessibility/spinbutton-value-expected.txt
@@ -9,7 +9,7 @@
 PASS endsWith(axSpin.minValue, '1') is true
 PASS endsWith(axSpin.maxValue, '9') is true
 PASS endsWith(axSpin.valueDescription, '5 of 9') is true
-PASS axSpin.deprecatedTitle is axUntitled.deprecatedTitle
+PASS axSpin.name is axUntitled.name
 PASS successfullyParsed is true
 
 TEST COMPLETE
diff --git a/third_party/WebKit/LayoutTests/accessibility/spinbutton-value.html b/third_party/WebKit/LayoutTests/accessibility/spinbutton-value.html
index 1e61300..2a1c06b 100644
--- a/third_party/WebKit/LayoutTests/accessibility/spinbutton-value.html
+++ b/third_party/WebKit/LayoutTests/accessibility/spinbutton-value.html
@@ -41,7 +41,7 @@
 
     // Make sure the title doesn't come from the inner text. It should just be empty if
     // not otherwise specified.
-    shouldBe("axSpin.deprecatedTitle", "axUntitled.deprecatedTitle");
+    shouldBe("axSpin.name", "axUntitled.name");
 }
 
 </script>
diff --git a/third_party/WebKit/LayoutTests/accessibility/svg-bounds-expected.txt b/third_party/WebKit/LayoutTests/accessibility/svg-bounds-expected.txt
index bd777aa..f3e5831 100644
--- a/third_party/WebKit/LayoutTests/accessibility/svg-bounds-expected.txt
+++ b/third_party/WebKit/LayoutTests/accessibility/svg-bounds-expected.txt
@@ -6,25 +6,25 @@
 
 container location: (607, 107)
 Face role: AXRole: AXButton
-Face label: AXDescription: face
+Face label: face
 FaceX: 0
 FaceY: 0
 
 
 Eye role: AXRole: AXButton
-Eye label: AXDescription: left-eye
+Eye label: left-eye
 EyeX: 103
 EyeY: 148
 
 
 Nose role: AXRole: AXButton
-Nose label: AXDescription: nose
+Nose label: nose
 NoseX: 193
 NoseY: 206
 
 
 Mouth role: AXRole: AXButton
-Mouth label: AXDescription: smile
+Mouth label: smile
 MouthX: 114
 MouthY: 274
 
@@ -35,7 +35,7 @@
 
 
 Image role: AXRole: AXImage
-Image label: AXDescription: Test Image
+Image label: Test Image
 ImageX: 21
 ImageY: 21
 PASS successfullyParsed is true
diff --git a/third_party/WebKit/LayoutTests/accessibility/svg-bounds.html b/third_party/WebKit/LayoutTests/accessibility/svg-bounds.html
index d99acda..236cbe1 100644
--- a/third_party/WebKit/LayoutTests/accessibility/svg-bounds.html
+++ b/third_party/WebKit/LayoutTests/accessibility/svg-bounds.html
@@ -46,28 +46,28 @@
 
     var face = container.childAtIndex(0);
     debug('Face role: ' + face.role);
-    debug('Face label: ' + face.deprecatedDescription);
+    debug('Face label: ' + face.name);
     debug('FaceX: ' + (pageX(face) - x));
     debug('FaceY: ' + Math.abs(pageY(face) - y));
     debug('<br>');
 
     var eye = container.childAtIndex(1);
     debug('Eye role: ' + eye.role);
-    debug('Eye label: ' + eye.deprecatedDescription);
+    debug('Eye label: ' + eye.name);
     debug('EyeX: ' + (pageX(eye) - x));
     debug('EyeY: ' + Math.abs(pageY(eye) - y));
     debug('<br>');
 
     var nose = container.childAtIndex(3);
     debug('Nose role: ' + nose.role);
-    debug('Nose label: ' + nose.deprecatedDescription);
+    debug('Nose label: ' + nose.name);
     debug('NoseX: ' + (pageX(nose) - x));
     debug('NoseY: ' + Math.abs(pageY(nose) - y));
     debug('<br>');
 
     var mouth = container.childAtIndex(4);
     debug('Mouth role: ' + mouth.role);
-    debug('Mouth label: ' + mouth.deprecatedDescription);
+    debug('Mouth label: ' + mouth.name);
     debug('MouthX: ' + (pageX(mouth) - x));
     debug('MouthY: ' + Math.floor(Math.abs(pageY(mouth) - y)));
     debug('<br>');
@@ -82,7 +82,7 @@
 
     var image = container.childAtIndex(6);
     debug('Image role: ' + image.role);
-    debug('Image label: ' + image.deprecatedDescription);
+    debug('Image label: ' + image.name);
     debug('ImageX: ' + (pageX(image) - x));
     debug('ImageY: ' + Math.abs(pageY(image) - y));
 }
diff --git a/third_party/WebKit/LayoutTests/accessibility/svg-image-expected.txt b/third_party/WebKit/LayoutTests/accessibility/svg-image-expected.txt
index a3187d2..f04856e7 100644
--- a/third_party/WebKit/LayoutTests/accessibility/svg-image-expected.txt
+++ b/third_party/WebKit/LayoutTests/accessibility/svg-image-expected.txt
@@ -5,9 +5,9 @@
 
 
 PASS svgImage.role is realImage.role
-PASS svgImage.deprecatedDescription is realImage.deprecatedDescription
+PASS svgImage.name is realImage.name
 SVG Image Role: AXRole: AXImage
-SVG Image Description: AXDescription: TestImage
+SVG Image Description: TestImage
 PASS successfullyParsed is true
 
 TEST COMPLETE
diff --git a/third_party/WebKit/LayoutTests/accessibility/svg-image.html b/third_party/WebKit/LayoutTests/accessibility/svg-image.html
index c3581a9f..f94755c 100644
--- a/third_party/WebKit/LayoutTests/accessibility/svg-image.html
+++ b/third_party/WebKit/LayoutTests/accessibility/svg-image.html
@@ -27,10 +27,10 @@
         document.getElementById("svgimage").focus();
         var svgImage = accessibilityController.focusedElement;
         shouldBe("svgImage.role", "realImage.role");
-        shouldBe("svgImage.deprecatedDescription", "realImage.deprecatedDescription");
+        shouldBe("svgImage.name", "realImage.name");
        
         debug("SVG Image Role: " + svgImage.role);
-        debug("SVG Image Description: " + svgImage.deprecatedDescription);
+        debug("SVG Image Description: " + svgImage.name);
     }
 
 </script>
diff --git a/third_party/WebKit/LayoutTests/accessibility/table-cell-spans-expected.txt b/third_party/WebKit/LayoutTests/accessibility/table-cell-spans-expected.txt
index 775d4be..782a57c 100644
--- a/third_party/WebKit/LayoutTests/accessibility/table-cell-spans-expected.txt
+++ b/third_party/WebKit/LayoutTests/accessibility/table-cell-spans-expected.txt
@@ -8,37 +8,32 @@
 4,2	4,3	4,4
 ----------------------
 { 0, 0 }
-AXTitle: 
+
 AXRole: AXCell
-AXDescription: 
 {0, 2}, {0, 2}
 
 ----------------------
 { 1, 1 }
-AXTitle: 
+
 AXRole: AXCell
-AXDescription: 
 {0, 2}, {0, 2}
 
 ----------------------
 { 3, 0 }
-AXTitle: 
+
 AXRole: AXCell
-AXDescription: 
 {2, 2}, {0, 1}
 
 ----------------------
 { 2, 0 }
-AXTitle: 
+
 AXRole: AXCell
-AXDescription: 
 {2, 2}, {0, 1}
 
 ----------------------
 { 2, 3 }
-AXTitle: 
+
 AXRole: AXCell
-AXDescription: 
 {2, 1}, {3, 1}
 
 ----------------------
diff --git a/third_party/WebKit/LayoutTests/accessibility/table-cells-expected.txt b/third_party/WebKit/LayoutTests/accessibility/table-cells-expected.txt
index 16996e9..cdfe6e9 100644
--- a/third_party/WebKit/LayoutTests/accessibility/table-cells-expected.txt
+++ b/third_party/WebKit/LayoutTests/accessibility/table-cells-expected.txt
@@ -10,29 +10,24 @@
 South	3333	1111	2222
 ------------------------
 [0,0]
-AXTitle: 
+
 AXRole: AXColumnHeader
-AXDescription: 
 ------------------------
 [3,1]
-AXTitle: 
+
 AXRole: AXColumnHeader
-AXDescription: 
 ------------------------
 [1,1]
-AXTitle: 
+
 AXRole: AXColumnHeader
-AXDescription: 
 ------------------------
 [2,2]
-AXTitle: 
+
 AXRole: AXCell
-AXDescription: 
 ------------------------
 [3,5]
-AXTitle: 
+
 AXRole: AXCell
-AXDescription: 
 ------------------------
 [100,0]
 
diff --git a/third_party/WebKit/LayoutTests/accessibility/table-detection-expected.txt b/third_party/WebKit/LayoutTests/accessibility/table-detection-expected.txt
index bb91a28..1520799f 100644
--- a/third_party/WebKit/LayoutTests/accessibility/table-detection-expected.txt
+++ b/third_party/WebKit/LayoutTests/accessibility/table-detection-expected.txt
@@ -1,99 +1,87 @@
 
 This should be a table because it has a thead.
 
-AXTitle: 
+
 AXRole: AXTable
-AXDescription: 
 
 asdf	asdf
 asdf	asdf
 
 This should be a table because cells have borders.
 
-AXTitle: 
+
 AXRole: AXTable
-AXDescription: 
 
 asdf	asdf
 
 This should not be a table because its cells do not have borders.
 
-AXTitle: 
+
 AXRole: AXGroup
-AXDescription: 
 
 asdf	asdf
 
 This should be a table because a cell has a special attribute
 
-AXTitle: 
+
 AXRole: AXTable
-AXDescription: 
 
 asdf	asdf
 
 This should be a table because a cell has a special attribute.
 
-AXTitle: 
+
 AXRole: AXTable
-AXDescription: 
 
 asdf	asdf
 
 This should be a table because a cell has a special attribute.
 
-AXTitle: 
+
 AXRole: AXTable
-AXDescription: 
 
 asdf	asdf
 asdf	asdf
 
 This should be a table because cells have different colors.
 
-AXTitle: 
+
 AXRole: AXTable
-AXDescription: 
 
 asdf	asdf
 
 This should not be a table because cells have different but no spacing.
 
-AXTitle: 
+
 AXRole: AXGroup
-AXDescription: 
 
 asdf	asdf
 
 This should not be a table because cells have the same colors even though there is spacing.
 
-AXTitle: 
+
 AXRole: AXGroup
-AXDescription: 
 
 asdf	asdf
 
 This should be a table because it has the "rules" attr.
 
-AXTitle: 
+
 AXRole: AXTable
-AXDescription: 
 
 asdf	asdf
 
 This should not be a table because it only has one valid cell (need more than one).
 
-AXTitle: 
+
 AXRole: AXGroup
-AXDescription: 
 
 Contributions
 
 This should not be a table because it does not have enough cell borders or background colors
 
-AXTitle: 
+
 AXRole: AXGroup
-AXDescription: 
 
 Politics
 Decision '08
@@ -105,35 +93,31 @@
 
 This should be a table because it's editable.
 
-AXTitle: 
+
 AXRole: AXTable
-AXDescription: 
 
 asdf	asdf
 
 This should be a table because most cells have a top border.
 
-AXTitle: 
+
 AXRole: AXTable
-AXDescription: 
 
 asdf	asdf
 asdf	asdf
 
 This should not be a table because cells have different borders.
 
-AXTitle: 
+
 AXRole: AXGroup
-AXDescription: 
 
 asdf	asdf
 asdf	asdf
 
 This should be a table because it sets empty-cells: hide on the table.
 
-AXTitle: 
+
 AXRole: AXTable
-AXDescription: 
 
 asdf	asdf
 asdf
@@ -141,9 +125,8 @@
 
 This should be a table because it sets empty-cells: hide on a cell.
 
-AXTitle: 
+
 AXRole: AXTable
-AXDescription: 
 
 asdf	asdf
 asdf
@@ -151,18 +134,16 @@
 
 This should be a table because it has a col.
 
-AXTitle: 
+
 AXRole: AXTable
-AXDescription: 
 
 asdf	asdf
 asdf	asdf
 
 This should be a table because it has at least 20 rows
 
-AXTitle: 
+
 AXRole: AXTable
-AXDescription: 
 
 asdf
 asdf
diff --git a/third_party/WebKit/LayoutTests/accessibility/table-one-cell-expected.txt b/third_party/WebKit/LayoutTests/accessibility/table-one-cell-expected.txt
index 9b24e45e..fb9f9f2c 100644
--- a/third_party/WebKit/LayoutTests/accessibility/table-one-cell-expected.txt
+++ b/third_party/WebKit/LayoutTests/accessibility/table-one-cell-expected.txt
@@ -1,6 +1,5 @@
 Pick Your Location!
 Get specific content for your area. 
 http://web.apple.com
-AXTitle: 
+
 AXRole: AXParagraph
-AXDescription:
diff --git a/third_party/WebKit/LayoutTests/accessibility/table-with-aria-role-expected.txt b/third_party/WebKit/LayoutTests/accessibility/table-with-aria-role-expected.txt
index bb6fea2..155e2a4 100644
--- a/third_party/WebKit/LayoutTests/accessibility/table-with-aria-role-expected.txt
+++ b/third_party/WebKit/LayoutTests/accessibility/table-with-aria-role-expected.txt
@@ -4,10 +4,8 @@
 test	test	test
 
 ------------
-AXTitle: test test test test test test
+test test test test test test
 AXRole: AXButton
-AXDescription: 
 ------------
-AXTitle: 
+
 AXRole: AXMenu
-AXDescription:
diff --git a/third_party/WebKit/LayoutTests/accessibility/table-with-rules-expected.txt b/third_party/WebKit/LayoutTests/accessibility/table-with-rules-expected.txt
index a3201661..5cdd71b 100644
--- a/third_party/WebKit/LayoutTests/accessibility/table-with-rules-expected.txt
+++ b/third_party/WebKit/LayoutTests/accessibility/table-with-rules-expected.txt
@@ -5,24 +5,19 @@
 asdf	asdf
 
 ------------------------------------
-AXTitle: 
-AXRole: AXTable
-AXDescription: 
 
-AXTitle: 
 AXRole: AXTable
-AXDescription: 
 
-AXTitle: 
+
 AXRole: AXTable
-AXDescription: 
 
-AXTitle: 
+
+AXRole: AXTable
+
+
 AXRole: AXGroup
-AXDescription: 
 
-AXTitle: 
+
 AXRole: AXGroup
-AXDescription: 
 
 
diff --git a/third_party/WebKit/LayoutTests/accessibility/th-as-title-ui-expected.txt b/third_party/WebKit/LayoutTests/accessibility/th-as-title-ui-expected.txt
deleted file mode 100644
index dee2dae..0000000
--- a/third_party/WebKit/LayoutTests/accessibility/th-as-title-ui-expected.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-Header for button	
-Header for button	
-Pass
diff --git a/third_party/WebKit/LayoutTests/accessibility/th-as-title-ui.html b/third_party/WebKit/LayoutTests/accessibility/th-as-title-ui.html
deleted file mode 100644
index 124101e..0000000
--- a/third_party/WebKit/LayoutTests/accessibility/th-as-title-ui.html
+++ /dev/null
@@ -1,42 +0,0 @@
-<html>
-<script>
-    if (window.testRunner)
-        testRunner.dumpAsText();
-</script>
-<body id="body">
-    
-    <!-- the AXGroup that comes from the <td> should have the <th> as its title ui element 
-         In the 2nd case, it should not have a title ui element -->
-
-    <table width="90" border="0">
-    <tr>
-    <th>Header for button</th>
-    <td><input type="button" value="button"></td>
-    </tr>
-    </table>
-
-    <table width="90" border="0">
-    <tr>
-    <td>Header for button</td>
-    <td><input type="button" value="button"></td>
-    </tr>
-    </table>
-    
-    <div id="result"></div>
-    
-    <script>
-        if (window.accessibilityController) {
-            var result = document.getElementById("result");
-
-            var body = document.getElementById("body");
-            body.focus();
-            var group = accessibilityController.focusedElement.childAtIndex(1);
-            var group2 = accessibilityController.focusedElement.childAtIndex(3);
-            if (group.deprecatedTitleUIElement().allAttributes() != "" && (group2.deprecatedTitleUIElement() == null || group2.deprecatedTitleUIElement().allAttributes() == "")) 
-                result.innerText += "Pass";
-            else
-                result.innerText += "Fail";
-        }
-    </script>
-</body>
-</html>
diff --git a/third_party/WebKit/LayoutTests/accessibility/title-ui-element-correctness-expected.txt b/third_party/WebKit/LayoutTests/accessibility/title-ui-element-correctness-expected.txt
index 964c681f..eae10b4 100644
--- a/third_party/WebKit/LayoutTests/accessibility/title-ui-element-correctness-expected.txt
+++ b/third_party/WebKit/LayoutTests/accessibility/title-ui-element-correctness-expected.txt
@@ -3,20 +3,20 @@
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
 
 
-PASS axElement('control1').deprecatedTitleUIElement().isEqual(axElement('label1')) is true
-PASS axElement('control2').deprecatedTitleUIElement().isEqual(axElement('label2')) is true
+PASS axElement('control1').nameElementAtIndex(0).isEqual(axElement('label1')) is true
+PASS axElement('control2').nameElementAtIndex(0).isEqual(axElement('label2')) is true
 PASS hasTitleUIElement(axElement('control3')) is false
-PASS document.getElementById('label3').setAttribute('for', 'control3'); axElement('control3').deprecatedTitleUIElement().isEqual(axElement('label3')) is true
+PASS document.getElementById('label3').setAttribute('for', 'control3'); axElement('control3').nameElementAtIndex(0).isEqual(axElement('label3')) is true
 PASS var label4Element = createLabelWithIdAndForAttribute('label4', 'control4'); hasTitleUIElement(axElement('control4')) is false
 PASS document.getElementById('container').appendChild(label4Element); hasTitleUIElement(axElement('control4')) is true
-PASS axElement('control4').deprecatedTitleUIElement().isEqual(axElement('label4')) is true
+PASS axElement('control4').nameElementAtIndex(0).isEqual(axElement('label4')) is true
 PASS label4Element.parentElement.removeChild(label4Element); hasTitleUIElement(axElement('control4')) is false
 PASS hasTitleUIElement(axElement('control5')) is false
-PASS reparentNodeIntoContainer(document.getElementById('control5'), document.getElementById('label5')); axElement('control5').deprecatedTitleUIElement() != null is true
-PASS axElement('control5').deprecatedTitleUIElement().isEqual(axElement('label5')) is true
-PASS axElement('control6').deprecatedTitleUIElement().isEqual(axElement('label6b')) is true
-PASS newLabel6Element = createLabelWithIdAndForAttribute('label6a', 'control6'); document.body.insertBefore(newLabel6Element, document.body.firstChild); axElement('control6').deprecatedTitleUIElement().isEqual(axElement('label6a')) is true
-PASS document.body.removeChild(newLabel6Element); axElement('control6').deprecatedTitleUIElement().isEqual(axElement('label6b')) is true
+PASS reparentNodeIntoContainer(document.getElementById('control5'), document.getElementById('label5')); axElement('control5').nameElementAtIndex(0) != null is true
+PASS axElement('control5').nameElementAtIndex(0).isEqual(axElement('label5')) is true
+PASS axElement('control6').nameElementAtIndex(0).isEqual(axElement('label6b')) is true
+PASS newLabel6Element = createLabelWithIdAndForAttribute('label6a', 'control6'); document.body.insertBefore(newLabel6Element, document.body.firstChild); axElement('control6').nameElementAtIndex(0).isEqual(axElement('label6a')) is true
+PASS document.body.removeChild(newLabel6Element); axElement('control6').nameElementAtIndex(0).isEqual(axElement('label6b')) is true
 PASS successfullyParsed is true
 
 TEST COMPLETE
diff --git a/third_party/WebKit/LayoutTests/accessibility/title-ui-element-correctness.html b/third_party/WebKit/LayoutTests/accessibility/title-ui-element-correctness.html
index 0db9179..c0ebfd7c 100644
--- a/third_party/WebKit/LayoutTests/accessibility/title-ui-element-correctness.html
+++ b/third_party/WebKit/LayoutTests/accessibility/title-ui-element-correctness.html
@@ -49,7 +49,7 @@
 
     function hasTitleUIElement(axElement) {
         var label1 = accessibilityController.accessibleElementById("label1");
-        var titleUIElement = axElement.deprecatedTitleUIElement();
+        var titleUIElement = axElement.nameElementAtIndex(0);
         if (titleUIElement == null)
             return false;
         return titleUIElement.role == label1.role;
@@ -72,13 +72,13 @@
         return accessibilityController.accessibleElementById(id);
     }
 
-    shouldBe("axElement('control1').deprecatedTitleUIElement().isEqual(axElement('label1'))", "true");
+    shouldBe("axElement('control1').nameElementAtIndex(0).isEqual(axElement('label1'))", "true");
 
-    shouldBe("axElement('control2').deprecatedTitleUIElement().isEqual(axElement('label2'))", "true");
+    shouldBe("axElement('control2').nameElementAtIndex(0).isEqual(axElement('label2'))", "true");
 
     // Test changing the "for" attribute dynamically.
     shouldBe("hasTitleUIElement(axElement('control3'))", "false");
-    shouldBe("document.getElementById('label3').setAttribute('for', 'control3'); axElement('control3').deprecatedTitleUIElement().isEqual(axElement('label3'))", "true");
+    shouldBe("document.getElementById('label3').setAttribute('for', 'control3'); axElement('control3').nameElementAtIndex(0).isEqual(axElement('label3'))", "true");
 
     // Test unattached label element that's subsequently attached.
     var label4Element = document.createElement("label");
@@ -87,7 +87,7 @@
     label4Element.innerText = "Label 4";
     shouldBe("var label4Element = createLabelWithIdAndForAttribute('label4', 'control4'); hasTitleUIElement(axElement('control4'))", "false");
     shouldBe("document.getElementById('container').appendChild(label4Element); hasTitleUIElement(axElement('control4'))", "true");
-    shouldBe("axElement('control4').deprecatedTitleUIElement().isEqual(axElement('label4'))", "true");
+    shouldBe("axElement('control4').nameElementAtIndex(0).isEqual(axElement('label4'))", "true");
 
     // Test what happens when the label is detached.
     shouldBe("label4Element.parentElement.removeChild(label4Element); hasTitleUIElement(axElement('control4'))", "false");
@@ -95,13 +95,13 @@
     // Test label that gets a control reparented into it.
     shouldBe("hasTitleUIElement(axElement('control5'))", "false");
 
-    shouldBe("reparentNodeIntoContainer(document.getElementById('control5'), document.getElementById('label5')); axElement('control5').deprecatedTitleUIElement() != null", "true");
-    shouldBe("axElement('control5').deprecatedTitleUIElement().isEqual(axElement('label5'))", "true");
+    shouldBe("reparentNodeIntoContainer(document.getElementById('control5'), document.getElementById('label5')); axElement('control5').nameElementAtIndex(0) != null", "true");
+    shouldBe("axElement('control5').nameElementAtIndex(0).isEqual(axElement('label5'))", "true");
 
     // Make sure the first label is returned, even as labels are added and removed.
-    shouldBe("axElement('control6').deprecatedTitleUIElement().isEqual(axElement('label6b'))", "true");
-    shouldBe("newLabel6Element = createLabelWithIdAndForAttribute('label6a', 'control6'); document.body.insertBefore(newLabel6Element, document.body.firstChild); axElement('control6').deprecatedTitleUIElement().isEqual(axElement('label6a'))", "true");
-    shouldBe("document.body.removeChild(newLabel6Element); axElement('control6').deprecatedTitleUIElement().isEqual(axElement('label6b'))", "true");
+    shouldBe("axElement('control6').nameElementAtIndex(0).isEqual(axElement('label6b'))", "true");
+    shouldBe("newLabel6Element = createLabelWithIdAndForAttribute('label6a', 'control6'); document.body.insertBefore(newLabel6Element, document.body.firstChild); axElement('control6').nameElementAtIndex(0).isEqual(axElement('label6a'))", "true");
+    shouldBe("document.body.removeChild(newLabel6Element); axElement('control6').nameElementAtIndex(0).isEqual(axElement('label6b'))", "true");
 
     document.getElementById('container').style.display = 'none';
 }
diff --git a/third_party/WebKit/LayoutTests/accessibility/whitespace-in-name-calc.html b/third_party/WebKit/LayoutTests/accessibility/whitespace-in-name-calc.html
index 11fd349a..f014542d 100644
--- a/third_party/WebKit/LayoutTests/accessibility/whitespace-in-name-calc.html
+++ b/third_party/WebKit/LayoutTests/accessibility/whitespace-in-name-calc.html
@@ -42,7 +42,7 @@
 
     function accessibleTitle(id) {
       var axObject = accessibilityController.accessibleElementById(id);
-      return axObject.deprecatedTitle.replace('AXTitle: ', '');
+      return axObject.name.replace('', '');
     }
 
     shouldBe('accessibleTitle("n1")', '"HelloWorld"');
diff --git a/third_party/WebKit/LayoutTests/fast/dom/shadow/hostcontext-pseudo-class-expected.txt b/third_party/WebKit/LayoutTests/fast/dom/shadow/hostcontext-pseudo-class-expected.txt
index c1b4996..0e9ed2fa 100644
--- a/third_party/WebKit/LayoutTests/fast/dom/shadow/hostcontext-pseudo-class-expected.txt
+++ b/third_party/WebKit/LayoutTests/fast/dom/shadow/hostcontext-pseudo-class-expected.txt
@@ -20,6 +20,8 @@
 PASS backgroundColorOf('host') is "rgb(0, 128, 0)"
 :host-context with :host in a shadow tree should match its shadow host.
 PASS backgroundColorOf('host') is "rgb(0, 128, 0)"
+crbug.com/552602 :host-context with non-matching selector with :host should not crash.
+PASS backgroundColorOf('host') is "rgba(0, 0, 0, 0)"
 :host-context takes simple selectors and matches when one of the simple selectors matches.
 PASS backgroundColorOf('host') is "rgb(0, 128, 0)"
 :host-context matches a shadow host in just a nested shadow tree, not all enclosing shadow trees.
diff --git a/third_party/WebKit/LayoutTests/fast/dom/shadow/hostcontext-pseudo-class.html b/third_party/WebKit/LayoutTests/fast/dom/shadow/hostcontext-pseudo-class.html
index c770bc1..80eb210030 100644
--- a/third_party/WebKit/LayoutTests/fast/dom/shadow/hostcontext-pseudo-class.html
+++ b/third_party/WebKit/LayoutTests/fast/dom/shadow/hostcontext-pseudo-class.html
@@ -133,6 +133,20 @@
 
 cleanUp();
 
+debug('crbug.com/552602 :host-context with non-matching selector with :host should not crash.');
+
+sandbox.appendChild(
+    createDOM('host-element', {'id': 'host'},
+        createShadowRoot(
+            createDOM('style', {},
+                document.createTextNode(':host-context(div:host) { background-color: green; }')),
+            createDOM('div', {},
+                document.createTextNode('Hello')))));
+
+backgroundColorShouldBe('host', 'rgba(0, 0, 0, 0)');
+
+cleanUp();
+
 debug(':host-context takes simple selectors and matches when one of the simple selectors matches.');
 
 sandbox.appendChild(
diff --git a/third_party/WebKit/LayoutTests/fast/forms/calendar-picker/date-picker-ax-expected.txt b/third_party/WebKit/LayoutTests/fast/forms/calendar-picker/date-picker-ax-expected.txt
index 22f28d5..f17477c 100644
--- a/third_party/WebKit/LayoutTests/fast/forms/calendar-picker/date-picker-ax-expected.txt
+++ b/third_party/WebKit/LayoutTests/fast/forms/calendar-picker/date-picker-ax-expected.txt
@@ -3,23 +3,23 @@
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
 
 
-Focused: AXDescription: 
-Focused: AXDescription: 
-Focused: AXDescription: Sunday January 2 2000
+Focused: 
+Focused: 
+Focused: Sunday January 2 2000
 PASS Received ActiveDescendantChanged
-Focused: AXDescription: Monday January 3 2000
+Focused: Monday January 3 2000
 PASS Received ActiveDescendantChanged
-Focused: AXDescription: Show next month
-Focused: AXDescription: <<CalendarToday>>
-Focused: AXDescription: Show previous month
-Focused: AXDescription: Show month selection panel
+Focused: Show next month
+Focused: <<CalendarToday>>
+Focused: Show previous month
+Focused: Show month selection panel
 Open the month popup. This should notify the third ActiveDescendantChanged.
-Focused: AXDescription: 
-Focused: AXDescription: January 2000
+Focused: 
+Focused: January 2000
 PASS Received ActiveDescendantChanged
-Focused: AXDescription: February 2000
+Focused: February 2000
 PASS Received ActiveDescendantChanged
-Focused: AXDescription: October 1999
+Focused: October 1999
 PASS Received ActiveDescendantChanged
 PASS successfullyParsed is true
 
diff --git a/third_party/WebKit/LayoutTests/fast/forms/calendar-picker/date-picker-ax.html b/third_party/WebKit/LayoutTests/fast/forms/calendar-picker/date-picker-ax.html
index a7c0e590..b5aad16 100644
--- a/third_party/WebKit/LayoutTests/fast/forms/calendar-picker/date-picker-ax.html
+++ b/third_party/WebKit/LayoutTests/fast/forms/calendar-picker/date-picker-ax.html
@@ -14,7 +14,7 @@
 window.accessibilityController.setNotificationListener(function(axnode, type) {
     if (type == 'Focus') {
         // Remove ',' to reduce platform differences.
-        debug('Focused: ' + escapeHTML(accessibilityController.focusedElement.deprecatedDescription.replace(/,/g, '')));
+        debug('Focused: ' + escapeHTML(accessibilityController.focusedElement.name.replace(/,/g, '')));
     } else if (type == 'ActiveDescendantChanged') {
         testPassed('Received ActiveDescendantChanged');
         if (++activeDescendantCounter == 2) {
diff --git a/third_party/WebKit/LayoutTests/fast/forms/calendar-picker/month-picker-ax-expected.txt b/third_party/WebKit/LayoutTests/fast/forms/calendar-picker/month-picker-ax-expected.txt
index 3cf911a5..82c9a9b 100644
--- a/third_party/WebKit/LayoutTests/fast/forms/calendar-picker/month-picker-ax-expected.txt
+++ b/third_party/WebKit/LayoutTests/fast/forms/calendar-picker/month-picker-ax-expected.txt
@@ -3,11 +3,11 @@
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
 
 
-Focused: AXDescription: 
-Focused: AXDescription: 
-Focused: AXDescription: January 2000
+Focused: 
+Focused: 
+Focused: January 2000
 PASS Received ActiveDescendantChanged
-Focused: AXDescription: February 2000
+Focused: February 2000
 PASS Received ActiveDescendantChanged
 PASS successfullyParsed is true
 
diff --git a/third_party/WebKit/LayoutTests/fast/forms/calendar-picker/month-picker-ax.html b/third_party/WebKit/LayoutTests/fast/forms/calendar-picker/month-picker-ax.html
index b38a17b8..1b644929 100644
--- a/third_party/WebKit/LayoutTests/fast/forms/calendar-picker/month-picker-ax.html
+++ b/third_party/WebKit/LayoutTests/fast/forms/calendar-picker/month-picker-ax.html
@@ -14,7 +14,7 @@
 window.accessibilityController.setNotificationListener(function(axnode, type) {
     if (type == 'Focus') {
         // Remove ',' to reduce platform differences.
-        debug('Focused: ' + escapeHTML(accessibilityController.focusedElement.deprecatedDescription.replace(/,/g, '')));
+        debug('Focused: ' + escapeHTML(accessibilityController.focusedElement.name.replace(/,/g, '')));
     } else if (type == 'ActiveDescendantChanged') {
         testPassed('Received ActiveDescendantChanged');
         if (++activeDescendantCounter == 2)
diff --git a/third_party/WebKit/LayoutTests/fast/forms/calendar-picker/week-picker-ax-expected.txt b/third_party/WebKit/LayoutTests/fast/forms/calendar-picker/week-picker-ax-expected.txt
index 43a4b50b..82c9f5d2 100644
--- a/third_party/WebKit/LayoutTests/fast/forms/calendar-picker/week-picker-ax-expected.txt
+++ b/third_party/WebKit/LayoutTests/fast/forms/calendar-picker/week-picker-ax-expected.txt
@@ -3,11 +3,11 @@
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
 
 
-Focused: AXDescription: 
-Focused: AXDescription: 
-Focused: AXDescription: Week 13 2000 starting on Monday March 27 2000
+Focused: 
+Focused: 
+Focused: Week 13 2000 starting on Monday March 27 2000
 PASS Received ActiveDescendantChanged
-Focused: AXDescription: Week 14 2000 starting on Monday April 3 2000
+Focused: Week 14 2000 starting on Monday April 3 2000
 PASS Received ActiveDescendantChanged
 PASS successfullyParsed is true
 
diff --git a/third_party/WebKit/LayoutTests/fast/forms/calendar-picker/week-picker-ax.html b/third_party/WebKit/LayoutTests/fast/forms/calendar-picker/week-picker-ax.html
index 3dcfee0..dd13df7 100644
--- a/third_party/WebKit/LayoutTests/fast/forms/calendar-picker/week-picker-ax.html
+++ b/third_party/WebKit/LayoutTests/fast/forms/calendar-picker/week-picker-ax.html
@@ -14,7 +14,7 @@
 window.accessibilityController.setNotificationListener(function(axnode, type) {
     if (type == 'Focus') {
         // Remove ',' to reduce platform differences.
-        debug('Focused: ' + escapeHTML(accessibilityController.focusedElement.deprecatedDescription.replace(/,/g, '')));
+        debug('Focused: ' + escapeHTML(accessibilityController.focusedElement.name.replace(/,/g, '')));
     } else if (type == 'ActiveDescendantChanged') {
         testPassed('Received ActiveDescendantChanged');
         if (++activeDescendantCounter == 2)
diff --git a/third_party/WebKit/LayoutTests/fast/forms/date-multiple-fields/date-multiple-fields-ax-aria-attributes-expected.txt b/third_party/WebKit/LayoutTests/fast/forms/date-multiple-fields/date-multiple-fields-ax-aria-attributes-expected.txt
index e3e2de36..d6eef08 100644
--- a/third_party/WebKit/LayoutTests/fast/forms/date-multiple-fields/date-multiple-fields-ax-aria-attributes-expected.txt
+++ b/third_party/WebKit/LayoutTests/fast/forms/date-multiple-fields/date-multiple-fields-ax-aria-attributes-expected.txt
@@ -4,17 +4,17 @@
 
 
 Initial empty state
-PASS focusedElementDescription() is "AXHelp: Month, AXValueDescription: blank, intValue:0, range:1-12"
-PASS focusedElementDescription() is "AXHelp: Day, AXValueDescription: blank, intValue:0, range:1-31"
-PASS focusedElementDescription() is "AXHelp: Year, AXValueDescription: blank, intValue:0, range:1-275760"
+PASS focusedElementDescription() is "Month, AXValueDescription: blank, intValue:0, range:1-12"
+PASS focusedElementDescription() is "Day, AXValueDescription: blank, intValue:0, range:1-31"
+PASS focusedElementDescription() is "Year, AXValueDescription: blank, intValue:0, range:1-275760"
 Non-empty value
-PASS focusedElementDescription() is "AXHelp: Month, AXValueDescription: 10, intValue:10, range:1-12"
-PASS focusedElementDescription() is "AXHelp: Day, AXValueDescription: 09, intValue:9, range:1-31"
-PASS focusedElementDescription() is "AXHelp: Year, AXValueDescription: 2012, intValue:2012, range:1-275760"
+PASS focusedElementDescription() is "Month, AXValueDescription: 10, intValue:10, range:1-12"
+PASS focusedElementDescription() is "Day, AXValueDescription: 09, intValue:9, range:1-31"
+PASS focusedElementDescription() is "Year, AXValueDescription: 2012, intValue:2012, range:1-275760"
 Empty value
-PASS focusedElementDescription() is "AXHelp: Year, AXValueDescription: blank, intValue:0, range:1-275760"
-PASS focusedElementDescription() is "AXHelp: Day, AXValueDescription: blank, intValue:0, range:1-31"
-PASS focusedElementDescription() is "AXHelp: Month, AXValueDescription: blank, intValue:0, range:1-12"
+PASS focusedElementDescription() is "Year, AXValueDescription: blank, intValue:0, range:1-275760"
+PASS focusedElementDescription() is "Day, AXValueDescription: blank, intValue:0, range:1-31"
+PASS focusedElementDescription() is "Month, AXValueDescription: blank, intValue:0, range:1-12"
 
 PASS successfullyParsed is true
 
diff --git a/third_party/WebKit/LayoutTests/fast/forms/date-multiple-fields/date-multiple-fields-ax-aria-attributes.html b/third_party/WebKit/LayoutTests/fast/forms/date-multiple-fields/date-multiple-fields-ax-aria-attributes.html
index 22efaeb..4fd07a5 100644
--- a/third_party/WebKit/LayoutTests/fast/forms/date-multiple-fields/date-multiple-fields-ax-aria-attributes.html
+++ b/third_party/WebKit/LayoutTests/fast/forms/date-multiple-fields/date-multiple-fields-ax-aria-attributes.html
@@ -16,31 +16,31 @@
 else {
     testInput.focus();
     debug('Initial empty state');
-    checkFocusedElementAXAttributes('AXHelp: Month, AXValueDescription: blank, intValue:0, range:1-12');
+    checkFocusedElementAXAttributes('Month, AXValueDescription: blank, intValue:0, range:1-12');
     eventSender.keyDown('\t');
-    checkFocusedElementAXAttributes('AXHelp: Day, AXValueDescription: blank, intValue:0, range:1-31');
+    checkFocusedElementAXAttributes('Day, AXValueDescription: blank, intValue:0, range:1-31');
     eventSender.keyDown('\t');
-    checkFocusedElementAXAttributes('AXHelp: Year, AXValueDescription: blank, intValue:0, range:1-275760');
+    checkFocusedElementAXAttributes('Year, AXValueDescription: blank, intValue:0, range:1-275760');
 
     eventSender.keyDown('\t', ['shiftKey']);
     eventSender.keyDown('\t', ['shiftKey']);
     debug('Non-empty value');
     testInput.value = "2012-10-09";
-    checkFocusedElementAXAttributes('AXHelp: Month, AXValueDescription: 10, intValue:10, range:1-12');
+    checkFocusedElementAXAttributes('Month, AXValueDescription: 10, intValue:10, range:1-12');
     eventSender.keyDown('\t');
-    checkFocusedElementAXAttributes('AXHelp: Day, AXValueDescription: 09, intValue:9, range:1-31');
+    checkFocusedElementAXAttributes('Day, AXValueDescription: 09, intValue:9, range:1-31');
     eventSender.keyDown('\t');
-    checkFocusedElementAXAttributes('AXHelp: Year, AXValueDescription: 2012, intValue:2012, range:1-275760');
+    checkFocusedElementAXAttributes('Year, AXValueDescription: 2012, intValue:2012, range:1-275760');
 
     debug('Empty value');
     eventSender.keyDown('\b');
-    checkFocusedElementAXAttributes('AXHelp: Year, AXValueDescription: blank, intValue:0, range:1-275760');
+    checkFocusedElementAXAttributes('Year, AXValueDescription: blank, intValue:0, range:1-275760');
     eventSender.keyDown('\t', ['shiftKey']);
     eventSender.keyDown('\b');
-    checkFocusedElementAXAttributes('AXHelp: Day, AXValueDescription: blank, intValue:0, range:1-31');
+    checkFocusedElementAXAttributes('Day, AXValueDescription: blank, intValue:0, range:1-31');
     eventSender.keyDown('\t', ['shiftKey']);
     eventSender.keyDown('\b');
-    checkFocusedElementAXAttributes('AXHelp: Month, AXValueDescription: blank, intValue:0, range:1-12');
+    checkFocusedElementAXAttributes('Month, AXValueDescription: blank, intValue:0, range:1-12');
 
     debug('');
     testInput.parentNode.removeChild(testInput);
diff --git a/third_party/WebKit/LayoutTests/fast/forms/date-multiple-fields/date-multiple-fields-ax-value-changed-notification-expected.txt b/third_party/WebKit/LayoutTests/fast/forms/date-multiple-fields/date-multiple-fields-ax-value-changed-notification-expected.txt
index 5666f5d7..011158e 100644
--- a/third_party/WebKit/LayoutTests/fast/forms/date-multiple-fields/date-multiple-fields-ax-value-changed-notification-expected.txt
+++ b/third_party/WebKit/LayoutTests/fast/forms/date-multiple-fields/date-multiple-fields-ax-value-changed-notification-expected.txt
@@ -3,13 +3,13 @@
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
 
 
-Focus AXHelp: Month=AXValueDescription: 10
-Focus AXHelp: Day=AXValueDescription: 09
-Focus AXHelp: Year=AXValueDescription: 2012
-ValueChanged AXHelp: Day=AXValueDescription: 04
-ValueChanged AXHelp: Day=AXValueDescription: 04
-ValueChanged AXHelp: Year=AXValueDescription: 2013
-ValueChanged AXHelp: Year=AXValueDescription: 2013
+Focus Month=AXValueDescription: 10
+Focus Day=AXValueDescription: 09
+Focus Year=AXValueDescription: 2012
+ValueChanged Day=AXValueDescription: 04
+ValueChanged Day=AXValueDescription: 04
+ValueChanged Year=AXValueDescription: 2013
+ValueChanged Year=AXValueDescription: 2013
 
 PASS successfullyParsed is true
 
diff --git a/third_party/WebKit/LayoutTests/fast/forms/date-multiple-fields/date-multiple-fields-ax-value-changed-notification.html b/third_party/WebKit/LayoutTests/fast/forms/date-multiple-fields/date-multiple-fields-ax-value-changed-notification.html
index 0cb36f3..227b46a 100644
--- a/third_party/WebKit/LayoutTests/fast/forms/date-multiple-fields/date-multiple-fields-ax-value-changed-notification.html
+++ b/third_party/WebKit/LayoutTests/fast/forms/date-multiple-fields/date-multiple-fields-ax-value-changed-notification.html
@@ -15,7 +15,7 @@
 else {
     accessibilityController.addNotificationListener(function (element, notification) {
         if (notification == 'Focus' || notification == 'ValueChanged') {
-            debug(notification + ' ' + element.deprecatedHelpText + '=' + element.valueDescription);
+            debug(notification + ' ' + element.description + '=' + element.valueDescription);
         }
     });
 
diff --git a/third_party/WebKit/LayoutTests/fast/forms/datetimelocal-multiple-fields/datetimelocal-multiple-fields-ax-aria-attributes-expected.txt b/third_party/WebKit/LayoutTests/fast/forms/datetimelocal-multiple-fields/datetimelocal-multiple-fields-ax-aria-attributes-expected.txt
index 5c48f4a8..b7f8dfd 100644
--- a/third_party/WebKit/LayoutTests/fast/forms/datetimelocal-multiple-fields/datetimelocal-multiple-fields-ax-aria-attributes-expected.txt
+++ b/third_party/WebKit/LayoutTests/fast/forms/datetimelocal-multiple-fields/datetimelocal-multiple-fields-ax-aria-attributes-expected.txt
@@ -4,23 +4,23 @@
 
 
 Non-empty value
-PASS focusedFieldValueDescription() is "AXHelp: Month, AXValueDescription: 10, 1, 12"
-PASS focusedFieldValueDescription() is "AXHelp: Day, AXValueDescription: 09, 1, 31"
-PASS focusedFieldValueDescription() is "AXHelp: Year, AXValueDescription: 2012, 1, 275760"
-PASS focusedFieldValueDescription() is "AXHelp: Hours, AXValueDescription: 12, 1, 12"
-PASS focusedFieldValueDescription() is "AXHelp: Minutes, AXValueDescription: 34, 0, 59"
-PASS focusedFieldValueDescription() is "AXHelp: Seconds, AXValueDescription: 56, 0, 59"
-PASS focusedFieldValueDescription() is "AXHelp: Milliseconds, AXValueDescription: 789, 0, 999"
-PASS focusedFieldValueDescription() is "AXHelp: AM/PM, AXValueDescription: PM, 1, 2"
+PASS focusedFieldValueDescription() is "Month, AXValueDescription: 10, 1, 12"
+PASS focusedFieldValueDescription() is "Day, AXValueDescription: 09, 1, 31"
+PASS focusedFieldValueDescription() is "Year, AXValueDescription: 2012, 1, 275760"
+PASS focusedFieldValueDescription() is "Hours, AXValueDescription: 12, 1, 12"
+PASS focusedFieldValueDescription() is "Minutes, AXValueDescription: 34, 0, 59"
+PASS focusedFieldValueDescription() is "Seconds, AXValueDescription: 56, 0, 59"
+PASS focusedFieldValueDescription() is "Milliseconds, AXValueDescription: 789, 0, 999"
+PASS focusedFieldValueDescription() is "AM/PM, AXValueDescription: PM, 1, 2"
 Empty value
-PASS focusedFieldValueDescription() is "AXHelp: AM/PM, AXValueDescription: blank, 1, 2"
-PASS focusedFieldValueDescription() is "AXHelp: Milliseconds, AXValueDescription: blank, 0, 999"
-PASS focusedFieldValueDescription() is "AXHelp: Seconds, AXValueDescription: blank, 0, 59"
-PASS focusedFieldValueDescription() is "AXHelp: Minutes, AXValueDescription: blank, 0, 59"
-PASS focusedFieldValueDescription() is "AXHelp: Hours, AXValueDescription: blank, 1, 12"
-PASS focusedFieldValueDescription() is "AXHelp: Year, AXValueDescription: blank, 1, 275760"
-PASS focusedFieldValueDescription() is "AXHelp: Day, AXValueDescription: blank, 1, 31"
-PASS focusedFieldValueDescription() is "AXHelp: Month, AXValueDescription: blank, 1, 12"
+PASS focusedFieldValueDescription() is "AM/PM, AXValueDescription: blank, 1, 2"
+PASS focusedFieldValueDescription() is "Milliseconds, AXValueDescription: blank, 0, 999"
+PASS focusedFieldValueDescription() is "Seconds, AXValueDescription: blank, 0, 59"
+PASS focusedFieldValueDescription() is "Minutes, AXValueDescription: blank, 0, 59"
+PASS focusedFieldValueDescription() is "Hours, AXValueDescription: blank, 1, 12"
+PASS focusedFieldValueDescription() is "Year, AXValueDescription: blank, 1, 275760"
+PASS focusedFieldValueDescription() is "Day, AXValueDescription: blank, 1, 31"
+PASS focusedFieldValueDescription() is "Month, AXValueDescription: blank, 1, 12"
 
 PASS successfullyParsed is true
 
diff --git a/third_party/WebKit/LayoutTests/fast/forms/datetimelocal-multiple-fields/datetimelocal-multiple-fields-ax-aria-attributes.html b/third_party/WebKit/LayoutTests/fast/forms/datetimelocal-multiple-fields/datetimelocal-multiple-fields-ax-aria-attributes.html
index 5e9c0cd..cc69301 100644
--- a/third_party/WebKit/LayoutTests/fast/forms/datetimelocal-multiple-fields/datetimelocal-multiple-fields-ax-aria-attributes.html
+++ b/third_party/WebKit/LayoutTests/fast/forms/datetimelocal-multiple-fields/datetimelocal-multiple-fields-ax-aria-attributes.html
@@ -11,7 +11,7 @@
 function focusedFieldValueDescription()
 {
     var element = accessibilityController.focusedElement;
-    return element.deprecatedHelpText + ', ' +  element.valueDescription + ', ' + element.minValue + ', ' + element.maxValue;
+    return element.description + ', ' +  element.valueDescription + ', ' + element.minValue + ', ' + element.maxValue;
 }
 
 var testInput = document.getElementById('test');
@@ -21,46 +21,46 @@
 else {
     debug('Non-empty value');
     testInput.focus();
-    shouldBeEqualToString('focusedFieldValueDescription()', 'AXHelp: Month, AXValueDescription: 10, 1, 12');
+    shouldBeEqualToString('focusedFieldValueDescription()', 'Month, AXValueDescription: 10, 1, 12');
     eventSender.keyDown('\t');
-    shouldBeEqualToString('focusedFieldValueDescription()', 'AXHelp: Day, AXValueDescription: 09, 1, 31');
+    shouldBeEqualToString('focusedFieldValueDescription()', 'Day, AXValueDescription: 09, 1, 31');
     eventSender.keyDown('\t');
-    shouldBeEqualToString('focusedFieldValueDescription()', 'AXHelp: Year, AXValueDescription: 2012, 1, 275760');
+    shouldBeEqualToString('focusedFieldValueDescription()', 'Year, AXValueDescription: 2012, 1, 275760');
     eventSender.keyDown('\t');
-    shouldBeEqualToString('focusedFieldValueDescription()', 'AXHelp: Hours, AXValueDescription: 12, 1, 12');
+    shouldBeEqualToString('focusedFieldValueDescription()', 'Hours, AXValueDescription: 12, 1, 12');
     eventSender.keyDown('\t');
-    shouldBeEqualToString('focusedFieldValueDescription()', 'AXHelp: Minutes, AXValueDescription: 34, 0, 59');
+    shouldBeEqualToString('focusedFieldValueDescription()', 'Minutes, AXValueDescription: 34, 0, 59');
     eventSender.keyDown('\t');
-    shouldBeEqualToString('focusedFieldValueDescription()', 'AXHelp: Seconds, AXValueDescription: 56, 0, 59');
+    shouldBeEqualToString('focusedFieldValueDescription()', 'Seconds, AXValueDescription: 56, 0, 59');
     eventSender.keyDown('\t');
-    shouldBeEqualToString('focusedFieldValueDescription()', 'AXHelp: Milliseconds, AXValueDescription: 789, 0, 999');
+    shouldBeEqualToString('focusedFieldValueDescription()', 'Milliseconds, AXValueDescription: 789, 0, 999');
     eventSender.keyDown('\t');
-    shouldBeEqualToString('focusedFieldValueDescription()', 'AXHelp: AM/PM, AXValueDescription: PM, 1, 2');
+    shouldBeEqualToString('focusedFieldValueDescription()', 'AM/PM, AXValueDescription: PM, 1, 2');
 
     debug('Empty value');
     eventSender.keyDown('\b');
-    shouldBeEqualToString('focusedFieldValueDescription()', 'AXHelp: AM/PM, AXValueDescription: blank, 1, 2');
+    shouldBeEqualToString('focusedFieldValueDescription()', 'AM/PM, AXValueDescription: blank, 1, 2');
     eventSender.keyDown('\t', ['shiftKey']);
     eventSender.keyDown('\b');
-    shouldBeEqualToString('focusedFieldValueDescription()', 'AXHelp: Milliseconds, AXValueDescription: blank, 0, 999');
+    shouldBeEqualToString('focusedFieldValueDescription()', 'Milliseconds, AXValueDescription: blank, 0, 999');
     eventSender.keyDown('\t', ['shiftKey']);
     eventSender.keyDown('\b');
-    shouldBeEqualToString('focusedFieldValueDescription()', 'AXHelp: Seconds, AXValueDescription: blank, 0, 59');
+    shouldBeEqualToString('focusedFieldValueDescription()', 'Seconds, AXValueDescription: blank, 0, 59');
     eventSender.keyDown('\t', ['shiftKey']);
     eventSender.keyDown('\b');
-    shouldBeEqualToString('focusedFieldValueDescription()', 'AXHelp: Minutes, AXValueDescription: blank, 0, 59');
+    shouldBeEqualToString('focusedFieldValueDescription()', 'Minutes, AXValueDescription: blank, 0, 59');
     eventSender.keyDown('\t', ['shiftKey']);
     eventSender.keyDown('\b');
-    shouldBeEqualToString('focusedFieldValueDescription()', 'AXHelp: Hours, AXValueDescription: blank, 1, 12');
+    shouldBeEqualToString('focusedFieldValueDescription()', 'Hours, AXValueDescription: blank, 1, 12');
     eventSender.keyDown('\t', ['shiftKey']);
     eventSender.keyDown('\b');
-    shouldBeEqualToString('focusedFieldValueDescription()', 'AXHelp: Year, AXValueDescription: blank, 1, 275760');
+    shouldBeEqualToString('focusedFieldValueDescription()', 'Year, AXValueDescription: blank, 1, 275760');
     eventSender.keyDown('\t', ['shiftKey']);
     eventSender.keyDown('\b');
-    shouldBeEqualToString('focusedFieldValueDescription()', 'AXHelp: Day, AXValueDescription: blank, 1, 31');
+    shouldBeEqualToString('focusedFieldValueDescription()', 'Day, AXValueDescription: blank, 1, 31');
     eventSender.keyDown('\t', ['shiftKey']);
     eventSender.keyDown('\b');
-    shouldBeEqualToString('focusedFieldValueDescription()', 'AXHelp: Month, AXValueDescription: blank, 1, 12');
+    shouldBeEqualToString('focusedFieldValueDescription()', 'Month, AXValueDescription: blank, 1, 12');
 
     debug('');
     testInput.parentNode.removeChild(testInput);
diff --git a/third_party/WebKit/LayoutTests/fast/forms/datetimelocal-multiple-fields/datetimelocal-multiple-fields-ax-value-changed-notification-expected.txt b/third_party/WebKit/LayoutTests/fast/forms/datetimelocal-multiple-fields/datetimelocal-multiple-fields-ax-value-changed-notification-expected.txt
index 775a2a50..6424c54 100644
--- a/third_party/WebKit/LayoutTests/fast/forms/datetimelocal-multiple-fields/datetimelocal-multiple-fields-ax-value-changed-notification-expected.txt
+++ b/third_party/WebKit/LayoutTests/fast/forms/datetimelocal-multiple-fields/datetimelocal-multiple-fields-ax-value-changed-notification-expected.txt
@@ -3,19 +3,19 @@
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
 
 
-Focus AXHelp: Month=AXValueDescription: 10
-Focus AXHelp: Day=AXValueDescription: 09
-Focus AXHelp: Year=AXValueDescription: 2012
-Focus AXHelp: Hours=AXValueDescription: 12
-Focus AXHelp: Minutes=AXValueDescription: 34
-ValueChanged AXHelp: Day=AXValueDescription: 04
-ValueChanged AXHelp: Day=AXValueDescription: 04
-ValueChanged AXHelp: Year=AXValueDescription: 2013
-ValueChanged AXHelp: Year=AXValueDescription: 2013
-ValueChanged AXHelp: Hours=AXValueDescription: 02
-ValueChanged AXHelp: Hours=AXValueDescription: 02
-ValueChanged AXHelp: Minutes=AXValueDescription: 33
-ValueChanged AXHelp: Minutes=AXValueDescription: 33
+Focus Month=AXValueDescription: 10
+Focus Day=AXValueDescription: 09
+Focus Year=AXValueDescription: 2012
+Focus Hours=AXValueDescription: 12
+Focus Minutes=AXValueDescription: 34
+ValueChanged Day=AXValueDescription: 04
+ValueChanged Day=AXValueDescription: 04
+ValueChanged Year=AXValueDescription: 2013
+ValueChanged Year=AXValueDescription: 2013
+ValueChanged Hours=AXValueDescription: 02
+ValueChanged Hours=AXValueDescription: 02
+ValueChanged Minutes=AXValueDescription: 33
+ValueChanged Minutes=AXValueDescription: 33
 
 PASS successfullyParsed is true
 
diff --git a/third_party/WebKit/LayoutTests/fast/forms/datetimelocal-multiple-fields/datetimelocal-multiple-fields-ax-value-changed-notification.html b/third_party/WebKit/LayoutTests/fast/forms/datetimelocal-multiple-fields/datetimelocal-multiple-fields-ax-value-changed-notification.html
index 3cba922..9b99a01 100644
--- a/third_party/WebKit/LayoutTests/fast/forms/datetimelocal-multiple-fields/datetimelocal-multiple-fields-ax-value-changed-notification.html
+++ b/third_party/WebKit/LayoutTests/fast/forms/datetimelocal-multiple-fields/datetimelocal-multiple-fields-ax-value-changed-notification.html
@@ -15,7 +15,7 @@
 else {
     accessibilityController.addNotificationListener(function (element, notification) {
         if (notification == 'Focus' || notification == 'ValueChanged') {
-            debug(notification + ' ' + element.deprecatedHelpText + '=' + element.valueDescription);
+            debug(notification + ' ' + element.description + '=' + element.valueDescription);
         }
     });
 
diff --git a/third_party/WebKit/LayoutTests/fast/forms/month-multiple-fields/month-multiple-fields-ax-aria-attributes-expected.txt b/third_party/WebKit/LayoutTests/fast/forms/month-multiple-fields/month-multiple-fields-ax-aria-attributes-expected.txt
index 9e58939a..a5a4c5e 100644
--- a/third_party/WebKit/LayoutTests/fast/forms/month-multiple-fields/month-multiple-fields-ax-aria-attributes-expected.txt
+++ b/third_party/WebKit/LayoutTests/fast/forms/month-multiple-fields/month-multiple-fields-ax-aria-attributes-expected.txt
@@ -4,11 +4,11 @@
 
 
 Non-empty value
-PASS focusedElementDescription() is "AXHelp: Month, AXValueDescription: October, intValue:10, range:1-12"
-PASS focusedElementDescription() is "AXHelp: Year, AXValueDescription: 2012, intValue:2012, range:1-275760"
+PASS focusedElementDescription() is "Month, AXValueDescription: October, intValue:10, range:1-12"
+PASS focusedElementDescription() is "Year, AXValueDescription: 2012, intValue:2012, range:1-275760"
 Empty value
-PASS focusedElementDescription() is "AXHelp: Year, AXValueDescription: blank, intValue:0, range:1-275760"
-PASS focusedElementDescription() is "AXHelp: Month, AXValueDescription: blank, intValue:0, range:1-12"
+PASS focusedElementDescription() is "Year, AXValueDescription: blank, intValue:0, range:1-275760"
+PASS focusedElementDescription() is "Month, AXValueDescription: blank, intValue:0, range:1-12"
 
 PASS successfullyParsed is true
 
diff --git a/third_party/WebKit/LayoutTests/fast/forms/month-multiple-fields/month-multiple-fields-ax-aria-attributes.html b/third_party/WebKit/LayoutTests/fast/forms/month-multiple-fields/month-multiple-fields-ax-aria-attributes.html
index 0ac92ca..b9473010 100644
--- a/third_party/WebKit/LayoutTests/fast/forms/month-multiple-fields/month-multiple-fields-ax-aria-attributes.html
+++ b/third_party/WebKit/LayoutTests/fast/forms/month-multiple-fields/month-multiple-fields-ax-aria-attributes.html
@@ -16,16 +16,16 @@
 else {
     debug('Non-empty value');
     testInput.focus();
-    checkFocusedElementAXAttributes('AXHelp: Month, AXValueDescription: October, intValue:10, range:1-12');
+    checkFocusedElementAXAttributes('Month, AXValueDescription: October, intValue:10, range:1-12');
     eventSender.keyDown('\t');
-    checkFocusedElementAXAttributes('AXHelp: Year, AXValueDescription: 2012, intValue:2012, range:1-275760');
+    checkFocusedElementAXAttributes('Year, AXValueDescription: 2012, intValue:2012, range:1-275760');
 
     debug('Empty value');
     eventSender.keyDown('\b');
-    checkFocusedElementAXAttributes('AXHelp: Year, AXValueDescription: blank, intValue:0, range:1-275760');
+    checkFocusedElementAXAttributes('Year, AXValueDescription: blank, intValue:0, range:1-275760');
     eventSender.keyDown('\t', ['shiftKey']);
     eventSender.keyDown('\b');
-    checkFocusedElementAXAttributes('AXHelp: Month, AXValueDescription: blank, intValue:0, range:1-12');
+    checkFocusedElementAXAttributes('Month, AXValueDescription: blank, intValue:0, range:1-12');
 
     debug('');
     testInput.remove();
diff --git a/third_party/WebKit/LayoutTests/fast/forms/month-multiple-fields/month-multiple-fields-ax-value-changed-notification-expected.txt b/third_party/WebKit/LayoutTests/fast/forms/month-multiple-fields/month-multiple-fields-ax-value-changed-notification-expected.txt
index 3926e79..346aee5 100644
--- a/third_party/WebKit/LayoutTests/fast/forms/month-multiple-fields/month-multiple-fields-ax-value-changed-notification-expected.txt
+++ b/third_party/WebKit/LayoutTests/fast/forms/month-multiple-fields/month-multiple-fields-ax-value-changed-notification-expected.txt
@@ -3,12 +3,12 @@
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
 
 
-Focus AXHelp: Month=AXValueDescription: October
-Focus AXHelp: Year=AXValueDescription: 2012
-ValueChanged AXHelp: Year=AXValueDescription: 0005
-ValueChanged AXHelp: Year=AXValueDescription: 0005
-ValueChanged AXHelp: Year=AXValueDescription: 0005
-ValueChanged AXHelp: Year=AXValueDescription: 0005
+Focus Month=AXValueDescription: October
+Focus Year=AXValueDescription: 2012
+ValueChanged Year=AXValueDescription: 0005
+ValueChanged Year=AXValueDescription: 0005
+ValueChanged Year=AXValueDescription: 0005
+ValueChanged Year=AXValueDescription: 0005
 
 PASS successfullyParsed is true
 
diff --git a/third_party/WebKit/LayoutTests/fast/forms/month-multiple-fields/month-multiple-fields-ax-value-changed-notification.html b/third_party/WebKit/LayoutTests/fast/forms/month-multiple-fields/month-multiple-fields-ax-value-changed-notification.html
index fab823f..16efb6e5 100644
--- a/third_party/WebKit/LayoutTests/fast/forms/month-multiple-fields/month-multiple-fields-ax-value-changed-notification.html
+++ b/third_party/WebKit/LayoutTests/fast/forms/month-multiple-fields/month-multiple-fields-ax-value-changed-notification.html
@@ -15,7 +15,7 @@
 else {
     accessibilityController.addNotificationListener(function (element, notification) {
         if (notification == 'Focus' || notification == 'ValueChanged') {
-            debug(notification + ' ' + element.deprecatedHelpText + '=' + element.valueDescription);
+            debug(notification + ' ' + element.description + '=' + element.valueDescription);
         }
     });
 
diff --git a/third_party/WebKit/LayoutTests/fast/forms/resources/multiple-fields-ax-aria-attributes.js b/third_party/WebKit/LayoutTests/fast/forms/resources/multiple-fields-ax-aria-attributes.js
index 5c56d3e..f8e2a91d 100644
--- a/third_party/WebKit/LayoutTests/fast/forms/resources/multiple-fields-ax-aria-attributes.js
+++ b/third_party/WebKit/LayoutTests/fast/forms/resources/multiple-fields-ax-aria-attributes.js
@@ -1,7 +1,7 @@
 function focusedElementDescription()
 {
     var element = accessibilityController.focusedElement;
-    return element.deprecatedHelpText + ', ' +  element.valueDescription + ', intValue:' + element.intValue + ', range:'+ element.minValue + '-' + element.maxValue;
+    return element.description + ', ' +  element.valueDescription + ', intValue:' + element.intValue + ', range:'+ element.minValue + '-' + element.maxValue;
 }
 
 function checkFocusedElementAXAttributes(expected) {
diff --git a/third_party/WebKit/LayoutTests/fast/forms/time-multiple-fields/time-multiple-fields-ax-aria-attributes-expected.txt b/third_party/WebKit/LayoutTests/fast/forms/time-multiple-fields/time-multiple-fields-ax-aria-attributes-expected.txt
index b7b32a28..c501862 100644
--- a/third_party/WebKit/LayoutTests/fast/forms/time-multiple-fields/time-multiple-fields-ax-aria-attributes-expected.txt
+++ b/third_party/WebKit/LayoutTests/fast/forms/time-multiple-fields/time-multiple-fields-ax-aria-attributes-expected.txt
@@ -4,17 +4,17 @@
 
 
 Non-empty value
-PASS focusedElementDescription() is "AXHelp: Hours, AXValueDescription: 12, intValue:12, range:1-12"
-PASS focusedElementDescription() is "AXHelp: Minutes, AXValueDescription: 34, intValue:34, range:0-59"
-PASS focusedElementDescription() is "AXHelp: Seconds, AXValueDescription: 56, intValue:56, range:0-59"
-PASS focusedElementDescription() is "AXHelp: Milliseconds, AXValueDescription: 789, intValue:789, range:0-999"
-PASS focusedElementDescription() is "AXHelp: AM/PM, AXValueDescription: PM, intValue:2, range:1-2"
+PASS focusedElementDescription() is "Hours, AXValueDescription: 12, intValue:12, range:1-12"
+PASS focusedElementDescription() is "Minutes, AXValueDescription: 34, intValue:34, range:0-59"
+PASS focusedElementDescription() is "Seconds, AXValueDescription: 56, intValue:56, range:0-59"
+PASS focusedElementDescription() is "Milliseconds, AXValueDescription: 789, intValue:789, range:0-999"
+PASS focusedElementDescription() is "AM/PM, AXValueDescription: PM, intValue:2, range:1-2"
 Empty value
-PASS focusedElementDescription() is "AXHelp: AM/PM, AXValueDescription: blank, intValue:0, range:1-2"
-PASS focusedElementDescription() is "AXHelp: Milliseconds, AXValueDescription: blank, intValue:0, range:0-999"
-PASS focusedElementDescription() is "AXHelp: Seconds, AXValueDescription: blank, intValue:0, range:0-59"
-PASS focusedElementDescription() is "AXHelp: Minutes, AXValueDescription: blank, intValue:0, range:0-59"
-PASS focusedElementDescription() is "AXHelp: Hours, AXValueDescription: blank, intValue:0, range:1-12"
+PASS focusedElementDescription() is "AM/PM, AXValueDescription: blank, intValue:0, range:1-2"
+PASS focusedElementDescription() is "Milliseconds, AXValueDescription: blank, intValue:0, range:0-999"
+PASS focusedElementDescription() is "Seconds, AXValueDescription: blank, intValue:0, range:0-59"
+PASS focusedElementDescription() is "Minutes, AXValueDescription: blank, intValue:0, range:0-59"
+PASS focusedElementDescription() is "Hours, AXValueDescription: blank, intValue:0, range:1-12"
 
 PASS successfullyParsed is true
 
diff --git a/third_party/WebKit/LayoutTests/fast/forms/time-multiple-fields/time-multiple-fields-ax-aria-attributes.html b/third_party/WebKit/LayoutTests/fast/forms/time-multiple-fields/time-multiple-fields-ax-aria-attributes.html
index 629842a73..fc53951 100644
--- a/third_party/WebKit/LayoutTests/fast/forms/time-multiple-fields/time-multiple-fields-ax-aria-attributes.html
+++ b/third_party/WebKit/LayoutTests/fast/forms/time-multiple-fields/time-multiple-fields-ax-aria-attributes.html
@@ -31,31 +31,31 @@
 
 debug('Non-empty value');
 testInput.focus();
-checkFocusedElementAXAttributes('AXHelp: Hours, AXValueDescription: 12, intValue:12, range:1-12');
+checkFocusedElementAXAttributes('Hours, AXValueDescription: 12, intValue:12, range:1-12');
 keyDown('\t');
-checkFocusedElementAXAttributes('AXHelp: Minutes, AXValueDescription: 34, intValue:34, range:0-59');
+checkFocusedElementAXAttributes('Minutes, AXValueDescription: 34, intValue:34, range:0-59');
 keyDown('\t');
-checkFocusedElementAXAttributes('AXHelp: Seconds, AXValueDescription: 56, intValue:56, range:0-59');
+checkFocusedElementAXAttributes('Seconds, AXValueDescription: 56, intValue:56, range:0-59');
 keyDown('\t');
-checkFocusedElementAXAttributes('AXHelp: Milliseconds, AXValueDescription: 789, intValue:789, range:0-999');
+checkFocusedElementAXAttributes('Milliseconds, AXValueDescription: 789, intValue:789, range:0-999');
 keyDown('\t');
-checkFocusedElementAXAttributes('AXHelp: AM/PM, AXValueDescription: PM, intValue:2, range:1-2');
+checkFocusedElementAXAttributes('AM/PM, AXValueDescription: PM, intValue:2, range:1-2');
 
 debug('Empty value');
 keyDown('\b');
-checkFocusedElementAXAttributes('AXHelp: AM/PM, AXValueDescription: blank, intValue:0, range:1-2');
+checkFocusedElementAXAttributes('AM/PM, AXValueDescription: blank, intValue:0, range:1-2');
 keyDown('\t', ['shiftKey']);
 keyDown('\b');
-checkFocusedElementAXAttributes('AXHelp: Milliseconds, AXValueDescription: blank, intValue:0, range:0-999');
+checkFocusedElementAXAttributes('Milliseconds, AXValueDescription: blank, intValue:0, range:0-999');
 keyDown('\t', ['shiftKey']);
 keyDown('\b');
-checkFocusedElementAXAttributes('AXHelp: Seconds, AXValueDescription: blank, intValue:0, range:0-59');
+checkFocusedElementAXAttributes('Seconds, AXValueDescription: blank, intValue:0, range:0-59');
 keyDown('\t', ['shiftKey']);
 keyDown('\b');
-checkFocusedElementAXAttributes('AXHelp: Minutes, AXValueDescription: blank, intValue:0, range:0-59');
+checkFocusedElementAXAttributes('Minutes, AXValueDescription: blank, intValue:0, range:0-59');
 keyDown('\t', ['shiftKey']);
 keyDown('\b');
-checkFocusedElementAXAttributes('AXHelp: Hours, AXValueDescription: blank, intValue:0, range:1-12');
+checkFocusedElementAXAttributes('Hours, AXValueDescription: blank, intValue:0, range:1-12');
 
 debug('');
 testInput.parentNode.removeChild(testInput);
diff --git a/third_party/WebKit/LayoutTests/fast/forms/time-multiple-fields/time-multiple-fields-ax-value-changed-notification-expected.txt b/third_party/WebKit/LayoutTests/fast/forms/time-multiple-fields/time-multiple-fields-ax-value-changed-notification-expected.txt
index da90a6e5..2c8451abc 100644
--- a/third_party/WebKit/LayoutTests/fast/forms/time-multiple-fields/time-multiple-fields-ax-value-changed-notification-expected.txt
+++ b/third_party/WebKit/LayoutTests/fast/forms/time-multiple-fields/time-multiple-fields-ax-value-changed-notification-expected.txt
@@ -3,12 +3,12 @@
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
 
 
-Focus AXHelp: Hours=AXValueDescription: 12
-Focus AXHelp: Minutes=AXValueDescription: 34
-ValueChanged AXHelp: Minutes=AXValueDescription: 05
-ValueChanged AXHelp: Minutes=AXValueDescription: 05
-ValueChanged AXHelp: Minutes=AXValueDescription: 05
-ValueChanged AXHelp: Minutes=AXValueDescription: 05
+Focus Hours=AXValueDescription: 12
+Focus Minutes=AXValueDescription: 34
+ValueChanged Minutes=AXValueDescription: 05
+ValueChanged Minutes=AXValueDescription: 05
+ValueChanged Minutes=AXValueDescription: 05
+ValueChanged Minutes=AXValueDescription: 05
 
 PASS successfullyParsed is true
 
diff --git a/third_party/WebKit/LayoutTests/fast/forms/time-multiple-fields/time-multiple-fields-ax-value-changed-notification.html b/third_party/WebKit/LayoutTests/fast/forms/time-multiple-fields/time-multiple-fields-ax-value-changed-notification.html
index c3b95109..0fe3230 100644
--- a/third_party/WebKit/LayoutTests/fast/forms/time-multiple-fields/time-multiple-fields-ax-value-changed-notification.html
+++ b/third_party/WebKit/LayoutTests/fast/forms/time-multiple-fields/time-multiple-fields-ax-value-changed-notification.html
@@ -17,7 +17,7 @@
 
     accessibilityController.addNotificationListener(function (element, notification) {
         if (notification == 'Focus' || notification == 'ValueChanged') {
-            debug(notification + ' ' + element.deprecatedHelpText + '=' + element.valueDescription);
+            debug(notification + ' ' + element.description + '=' + element.valueDescription);
         }
     });
 }
diff --git a/third_party/WebKit/LayoutTests/fast/forms/week-multiple-fields/week-multiple-fields-ax-aria-attributes-expected.txt b/third_party/WebKit/LayoutTests/fast/forms/week-multiple-fields/week-multiple-fields-ax-aria-attributes-expected.txt
index 9d192c3..fbd3a047 100644
--- a/third_party/WebKit/LayoutTests/fast/forms/week-multiple-fields/week-multiple-fields-ax-aria-attributes-expected.txt
+++ b/third_party/WebKit/LayoutTests/fast/forms/week-multiple-fields/week-multiple-fields-ax-aria-attributes-expected.txt
@@ -4,11 +4,11 @@
 
 
 Non-empty value
-PASS focusedFieldValueDescription() is "AXHelp: Week, AXValueDescription: 10, 1, 53"
-PASS focusedFieldValueDescription() is "AXHelp: Year, AXValueDescription: 2012, 1, 275760"
+PASS focusedFieldValueDescription() is "Week, AXValueDescription: 10, 1, 53"
+PASS focusedFieldValueDescription() is "Year, AXValueDescription: 2012, 1, 275760"
 Empty value
-PASS focusedFieldValueDescription() is "AXHelp: Year, AXValueDescription: blank, 1, 275760"
-PASS focusedFieldValueDescription() is "AXHelp: Week, AXValueDescription: blank, 1, 53"
+PASS focusedFieldValueDescription() is "Year, AXValueDescription: blank, 1, 275760"
+PASS focusedFieldValueDescription() is "Week, AXValueDescription: blank, 1, 53"
 
 PASS successfullyParsed is true
 
diff --git a/third_party/WebKit/LayoutTests/fast/forms/week-multiple-fields/week-multiple-fields-ax-aria-attributes.html b/third_party/WebKit/LayoutTests/fast/forms/week-multiple-fields/week-multiple-fields-ax-aria-attributes.html
index 339c03e..bb829e0 100644
--- a/third_party/WebKit/LayoutTests/fast/forms/week-multiple-fields/week-multiple-fields-ax-aria-attributes.html
+++ b/third_party/WebKit/LayoutTests/fast/forms/week-multiple-fields/week-multiple-fields-ax-aria-attributes.html
@@ -11,7 +11,7 @@
 function focusedFieldValueDescription()
 {
     var element = accessibilityController.focusedElement;
-    return element.deprecatedHelpText + ', ' +  element.valueDescription + ', ' + element.minValue + ', ' + element.maxValue;
+    return element.description + ', ' +  element.valueDescription + ', ' + element.minValue + ', ' + element.maxValue;
 }
 
 var testInput = document.getElementById('test');
@@ -21,16 +21,16 @@
 else {
     debug('Non-empty value');
     testInput.focus();
-    shouldBeEqualToString('focusedFieldValueDescription()', 'AXHelp: Week, AXValueDescription: 10, 1, 53');
+    shouldBeEqualToString('focusedFieldValueDescription()', 'Week, AXValueDescription: 10, 1, 53');
     eventSender.keyDown('\t');
-    shouldBeEqualToString('focusedFieldValueDescription()', 'AXHelp: Year, AXValueDescription: 2012, 1, 275760');
+    shouldBeEqualToString('focusedFieldValueDescription()', 'Year, AXValueDescription: 2012, 1, 275760');
 
     debug('Empty value');
     eventSender.keyDown('\b');
-    shouldBeEqualToString('focusedFieldValueDescription()', 'AXHelp: Year, AXValueDescription: blank, 1, 275760');
+    shouldBeEqualToString('focusedFieldValueDescription()', 'Year, AXValueDescription: blank, 1, 275760');
     eventSender.keyDown('\t', ['shiftKey']);
     eventSender.keyDown('\b');
-    shouldBeEqualToString('focusedFieldValueDescription()', 'AXHelp: Week, AXValueDescription: blank, 1, 53');
+    shouldBeEqualToString('focusedFieldValueDescription()', 'Week, AXValueDescription: blank, 1, 53');
 
     debug('');
     testInput.remove();
diff --git a/third_party/WebKit/LayoutTests/fast/forms/week-multiple-fields/week-multiple-fields-ax-value-changed-notification-expected.txt b/third_party/WebKit/LayoutTests/fast/forms/week-multiple-fields/week-multiple-fields-ax-value-changed-notification-expected.txt
index 4a59bcb6..6df1b1b 100644
--- a/third_party/WebKit/LayoutTests/fast/forms/week-multiple-fields/week-multiple-fields-ax-value-changed-notification-expected.txt
+++ b/third_party/WebKit/LayoutTests/fast/forms/week-multiple-fields/week-multiple-fields-ax-value-changed-notification-expected.txt
@@ -3,12 +3,12 @@
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
 
 
-Focus AXHelp: Week=AXValueDescription: 10
-Focus AXHelp: Year=AXValueDescription: 2012
-ValueChanged AXHelp: Year=AXValueDescription: 0005
-ValueChanged AXHelp: Year=AXValueDescription: 0005
-ValueChanged AXHelp: Year=AXValueDescription: 0005
-ValueChanged AXHelp: Year=AXValueDescription: 0005
+Focus Week=AXValueDescription: 10
+Focus Year=AXValueDescription: 2012
+ValueChanged Year=AXValueDescription: 0005
+ValueChanged Year=AXValueDescription: 0005
+ValueChanged Year=AXValueDescription: 0005
+ValueChanged Year=AXValueDescription: 0005
 
 PASS successfullyParsed is true
 
diff --git a/third_party/WebKit/LayoutTests/fast/forms/week-multiple-fields/week-multiple-fields-ax-value-changed-notification.html b/third_party/WebKit/LayoutTests/fast/forms/week-multiple-fields/week-multiple-fields-ax-value-changed-notification.html
index 818d2db..ed21915 100644
--- a/third_party/WebKit/LayoutTests/fast/forms/week-multiple-fields/week-multiple-fields-ax-value-changed-notification.html
+++ b/third_party/WebKit/LayoutTests/fast/forms/week-multiple-fields/week-multiple-fields-ax-value-changed-notification.html
@@ -15,7 +15,7 @@
 else {
     accessibilityController.addNotificationListener(function (element, notification) {
         if (notification == 'Focus' || notification == 'ValueChanged') {
-            debug(notification + ' ' + element.deprecatedHelpText + '=' + element.valueDescription);
+            debug(notification + ' ' + element.description + '=' + element.valueDescription);
         }
     });
 
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/suborigins/resources/post-document-to-parent.php b/third_party/WebKit/LayoutTests/http/tests/security/suborigins/resources/post-document-to-parent.php
index 88cff523..1e96423 100644
--- a/third_party/WebKit/LayoutTests/http/tests/security/suborigins/resources/post-document-to-parent.php
+++ b/third_party/WebKit/LayoutTests/http/tests/security/suborigins/resources/post-document-to-parent.php
@@ -6,6 +6,15 @@
 <!DOCTYPE html>
 <html>
 <script>
-window.parent.postMessage(document.suborigin, '*');
+var type = '<?php echo $_GET["type"]; ?>';
+var is_iframe = (type === 'iframe');
+var p = window.opener;
+if (is_iframe)
+    p = window.parent;
+
+p.postMessage({
+  'suborigin': document.suborigin,
+  'type': type
+}, '*');
 </script>
 </html>
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/suborigins/suborigin-document-suborigin.html b/third_party/WebKit/LayoutTests/http/tests/security/suborigins/suborigin-document-suborigin.html
index 159629b..c257fd2 100644
--- a/third_party/WebKit/LayoutTests/http/tests/security/suborigins/suborigin-document-suborigin.html
+++ b/third_party/WebKit/LayoutTests/http/tests/security/suborigins/suborigin-document-suborigin.html
@@ -7,9 +7,10 @@
 </head>
 <script>
 window.onmessage = function(event) {
-    assert_equals(event.data, undefined, "document.suborigin should exist when page has a suborigin.");
+    assert_equals(event.data.type, 'iframe');
+    assert_equals(event.data.suborigin, "foobar", "document.suborigin should exist when page has a suborigin.");
     done();
 }
 </script>
-<iframe src="resources/post-document-to-parent.php?suborigin=foobar"></iframe>
+<iframe src="resources/post-document-to-parent.php?suborigin=foobar&type=iframe"></iframe>
 </html>
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/suborigins/suborigin-no-document-suborigin.html b/third_party/WebKit/LayoutTests/http/tests/security/suborigins/suborigin-no-document-suborigin.html
index 73ea841b..54be4bc 100644
--- a/third_party/WebKit/LayoutTests/http/tests/security/suborigins/suborigin-no-document-suborigin.html
+++ b/third_party/WebKit/LayoutTests/http/tests/security/suborigins/suborigin-no-document-suborigin.html
@@ -6,7 +6,7 @@
 <script src="/resources/testharnessreport.js"></script>
 </head>
 <script>
-assert_equals(document.suborigin, undefined, "document.suborigin should not exist when the page doesn't have a suborigin.");
+assert_equals(document.suborigin, "", "document.suborigin should not exist when the page doesn't have a suborigin.");
 done();
 </script>
 </html>
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/suborigins/suborigin-postmessage.html b/third_party/WebKit/LayoutTests/http/tests/security/suborigins/suborigin-postmessage.html
new file mode 100644
index 0000000..f4e7a3a
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/http/tests/security/suborigins/suborigin-postmessage.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>Validate serialization of event.origin and event.suborigin in postMessage.</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+</head>
+<script>
+var iframe_test = async_test("Validate serialization of event.origin and event.suborigin in postMessage from an iframe");
+var window_test = async_test("Validate serialization of event.origin and event.suborigin in postMessage from a window");
+
+window.onmessage = function(event) {
+    if (event.data.type === 'iframe') {
+        iframe_test.step(function() {
+            assert_equals(event.origin, "http://foobar1_127.0.0.1:8000");
+            assert_equals(event.suborigin, "foobar1");
+            assert_equals(event.data.suborigin,  "foobar1");
+            iframe_test.done();
+        });
+    } else if (event.data.type === 'window') {
+        window_test.step(function() {
+            assert_equals(event.origin, "http://foobar2_127.0.0.1:8000");
+            assert_equals(event.suborigin, "foobar2");
+            assert_equals(event.data.suborigin, "foobar2");;
+            window_test.done();
+        });
+    } else {
+        assert_unreached();
+    }
+
+}
+
+window.open('resources/post-document-to-parent.php?suborigin=foobar2&type=window');
+</script>
+<iframe src="resources/post-document-to-parent.php?suborigin=foobar1&type=iframe"></iframe>
+</html>
diff --git a/third_party/WebKit/LayoutTests/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt b/third_party/WebKit/LayoutTests/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt
index 9c844f4..c9d39c1 100644
--- a/third_party/WebKit/LayoutTests/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt
+++ b/third_party/WebKit/LayoutTests/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt
@@ -404,6 +404,7 @@
     getter origin
     getter ports
     getter source
+    getter suborigin
     method constructor
     method initMessageEvent
 interface MessagePort : EventTarget
diff --git a/third_party/WebKit/LayoutTests/inspector/console/console-format-es6-expected.txt b/third_party/WebKit/LayoutTests/inspector/console/console-format-es6-expected.txt
index dc51def..05b5249 100644
--- a/third_party/WebKit/LayoutTests/inspector/console/console-format-es6-expected.txt
+++ b/third_party/WebKit/LayoutTests/inspector/console/console-format-es6-expected.txt
@@ -1,5 +1,5 @@
-CONSOLE MESSAGE: line 11: [object Object]
-CONSOLE MESSAGE: line 12: [object Object]
+CONSOLE MESSAGE: line 11: [object Promise]
+CONSOLE MESSAGE: line 12: [object Promise]
 CONSOLE MESSAGE: line 11: Symbol()
 CONSOLE MESSAGE: line 12: Symbol()
 CONSOLE MESSAGE: line 11: Symbol(a)
diff --git a/third_party/WebKit/LayoutTests/inspector/sources/debugger-breakpoints/breakpoint-manager-expected.txt b/third_party/WebKit/LayoutTests/inspector/sources/debugger-breakpoints/breakpoint-manager-expected.txt
index a3bce05..0704bfc3 100644
--- a/third_party/WebKit/LayoutTests/inspector/sources/debugger-breakpoints/breakpoint-manager-expected.txt
+++ b/third_party/WebKit/LayoutTests/inspector/sources/debugger-breakpoints/breakpoint-manager-expected.txt
@@ -132,6 +132,10 @@
   Adding script: a.js
   Adding UISourceCode: a.js
     breakpointRemoved(a.js, 10, 0)
+    breakpointRemoved(a.js, 20, 0)
+    breakpointAdded(a.js, 10, 0, foo == bar, true)
+    breakpointAdded(a.js, 20, 0, , false)
+    breakpointRemoved(a.js, 10, 0)
     breakpointAdded(a.js, 10, 0, foo == bar, true)
     Location created: a.js:10
   Dumping Breakpoint Locations
diff --git a/third_party/WebKit/LayoutTests/inspector/sources/debugger-pause/debugger-eval-on-call-frame-inside-iframe.html b/third_party/WebKit/LayoutTests/inspector/sources/debugger-pause/debugger-eval-on-call-frame-inside-iframe.html
index 0a223e43b..bf4b41ee 100644
--- a/third_party/WebKit/LayoutTests/inspector/sources/debugger-pause/debugger-eval-on-call-frame-inside-iframe.html
+++ b/third_party/WebKit/LayoutTests/inspector/sources/debugger-pause/debugger-eval-on-call-frame-inside-iframe.html
@@ -34,7 +34,7 @@
     iframe.contentWindow.pauseInsideIframe.call({foo: 42});
 }
 
-var test = function()
+function test()
 {
     var expressions = [
         "dir()",
diff --git a/third_party/WebKit/LayoutTests/inspector/sources/debugger-ui/scripts-with-same-source-url-expected.txt b/third_party/WebKit/LayoutTests/inspector/sources/debugger-ui/scripts-with-same-source-url-expected.txt
new file mode 100644
index 0000000..d3ccca51
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/inspector/sources/debugger-ui/scripts-with-same-source-url-expected.txt
@@ -0,0 +1,10 @@
+Tests that script is replaced with the newer version when the names match.
+
+Added: MyScript.js to network
+Added: MyScript.js to debugger
+Removed: MyScript.js from network
+Added: MyScript.js to network
+Added: MyScript.js to debugger
+Content: function foo() { return 1; } //# sourceURL=MyScript.js
+Content: function foo() { return 2; } //# sourceURL=MyScript.js
+
diff --git a/third_party/WebKit/LayoutTests/inspector/sources/debugger-ui/scripts-with-same-source-url.html b/third_party/WebKit/LayoutTests/inspector/sources/debugger-ui/scripts-with-same-source-url.html
new file mode 100644
index 0000000..d122d51
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/inspector/sources/debugger-ui/scripts-with-same-source-url.html
@@ -0,0 +1,52 @@
+<html>
+<head>
+<script src="../../../http/tests/inspector/inspector-test.js"></script>
+<script src="../../../http/tests/inspector/debugger-test.js"></script>
+<script>
+function injectScript(value)
+{
+    eval("function foo() { return " + value + "; } //# sourceURL=MyScript.js");
+}
+
+function test()
+{
+    InspectorTest.evaluateInPage("injectScript(1);");
+    InspectorTest.evaluateInPage("injectScript(2);");
+
+    WebInspector.workspace.addEventListener(WebInspector.Workspace.Events.UISourceCodeAdded, reportAdded);
+    WebInspector.workspace.addEventListener(WebInspector.Workspace.Events.UISourceCodeRemoved, reportRemoved);
+
+    var iteration = 0;
+
+    function reportAdded(event)
+    {
+        if (event.data.originURL() !== "MyScript.js")
+            return;
+        InspectorTest.addResult("Added: " + event.data.originURL() + " to " + event.data.project().type());
+        if (event.data.project().type() !== "network")
+            return;
+        event.data.requestContent(function(it, content) {
+            InspectorTest.addResult("Content: " + content);
+            if (it)
+                InspectorTest.completeTest();
+        }.bind(null, iteration++));
+    }
+
+    function reportRemoved(event)
+    {
+        if (event.data.originURL() !== "MyScript.js")
+            return;
+        InspectorTest.addResult("Removed: " + event.data.originURL() + " from " + event.data.project().type());
+    }
+}
+
+</script>
+</head>
+
+<body onload="runTest()">
+<p>
+Tests that script is replaced with the newer version when the names match.
+</p>
+
+</body>
+</html>
diff --git a/third_party/WebKit/LayoutTests/platform/linux/accessibility/canvas-fallback-content-labels-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/accessibility/canvas-fallback-content-labels-expected.txt
deleted file mode 100644
index fdcd6624..0000000
--- a/third_party/WebKit/LayoutTests/platform/linux/accessibility/canvas-fallback-content-labels-expected.txt
+++ /dev/null
@@ -1,71 +0,0 @@
-Nothing Text   Checkbox   Radio   Slider   List   Text with label for 
-This tests that labels and elements with labels in canvas fallback content have the same accessibility properties as those same elements outside of a canvas.
-
-On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
-
-
-Checking accessibility properties for ids: nothing1, nothing2
-PASS axElement2.role is axElement1.role
-PASS collapseWhitespace(axElement2.deprecatedTitle) is collapseWhitespace(axElement1.deprecatedTitle)
-PASS axElement2.deprecatedTitleUIElement is axElement1.deprecatedTitleUIElement
-
-Checking accessibility properties for ids: text_label1, text_label2
-PASS axElement2.role is axElement1.role
-PASS collapseWhitespace(axElement2.deprecatedTitle) is collapseWhitespace(axElement1.deprecatedTitle)
-PASS axElement2.deprecatedTitleUIElement is axElement1.deprecatedTitleUIElement
-
-Checking accessibility properties for ids: text1, text2
-PASS axElement2.role is axElement1.role
-PASS collapseWhitespace(axElement2.deprecatedTitle) is collapseWhitespace(axElement1.deprecatedTitle)
-PASS axElement2.deprecatedTitleUIElement is axElement1.deprecatedTitleUIElement
-
-Checking accessibility properties for ids: check_label1, check_label2
-PASS axElement1 == null && axElement2 == null is true
-
-Checking accessibility properties for ids: check1, check2
-PASS axElement2.role is axElement1.role
-PASS collapseWhitespace(axElement2.deprecatedTitle) is collapseWhitespace(axElement1.deprecatedTitle)
-PASS axElement2.deprecatedTitleUIElement is axElement1.deprecatedTitleUIElement
-
-Checking accessibility properties for ids: radio_label1, radio_label2
-PASS axElement1 == null && axElement2 == null is true
-
-Checking accessibility properties for ids: radio1, radio2
-PASS axElement2.role is axElement1.role
-PASS collapseWhitespace(axElement2.deprecatedTitle) is collapseWhitespace(axElement1.deprecatedTitle)
-PASS axElement2.deprecatedTitleUIElement is axElement1.deprecatedTitleUIElement
-
-Checking accessibility properties for ids: slider_label1, slider_label2
-PASS axElement2.role is axElement1.role
-PASS collapseWhitespace(axElement2.deprecatedTitle) is collapseWhitespace(axElement1.deprecatedTitle)
-PASS axElement2.deprecatedTitleUIElement is axElement1.deprecatedTitleUIElement
-
-Checking accessibility properties for ids: slider1, slider2
-PASS axElement2.role is axElement1.role
-PASS collapseWhitespace(axElement2.deprecatedTitle) is collapseWhitespace(axElement1.deprecatedTitle)
-PASS axElement2.deprecatedTitleUIElement is axElement1.deprecatedTitleUIElement
-
-Checking accessibility properties for ids: list_label1, list_label2
-PASS axElement2.role is axElement1.role
-PASS collapseWhitespace(axElement2.deprecatedTitle) is collapseWhitespace(axElement1.deprecatedTitle)
-PASS axElement2.deprecatedTitleUIElement is axElement1.deprecatedTitleUIElement
-
-Checking accessibility properties for ids: list1, list2
-PASS axElement2.role is axElement1.role
-PASS collapseWhitespace(axElement2.deprecatedTitle) is collapseWhitespace(axElement1.deprecatedTitle)
-PASS axElement2.deprecatedTitleUIElement is axElement1.deprecatedTitleUIElement
-
-Checking accessibility properties for ids: label_for1, label_for2
-PASS axElement2.role is axElement1.role
-PASS collapseWhitespace(axElement2.deprecatedTitle) is collapseWhitespace(axElement1.deprecatedTitle)
-PASS axElement2.deprecatedTitleUIElement is axElement1.deprecatedTitleUIElement
-
-Checking accessibility properties for ids: text_for1, text_for2
-PASS axElement2.role is axElement1.role
-PASS collapseWhitespace(axElement2.deprecatedTitle) is collapseWhitespace(axElement1.deprecatedTitle)
-PASS axElement2.deprecatedTitleUIElement is axElement1.deprecatedTitleUIElement
-
-PASS successfullyParsed is true
-
-TEST COMPLETE
-
diff --git a/third_party/WebKit/LayoutTests/platform/win/accessibility/canvas-fallback-content-labels-expected.txt b/third_party/WebKit/LayoutTests/platform/win/accessibility/canvas-fallback-content-labels-expected.txt
deleted file mode 100644
index 915882d..0000000
--- a/third_party/WebKit/LayoutTests/platform/win/accessibility/canvas-fallback-content-labels-expected.txt
+++ /dev/null
@@ -1,71 +0,0 @@
-Nothing Text   Checkbox   Radio   Slider   List   Text with label for  
-This tests that labels and elements with labels in canvas fallback content have the same accessibility properties as those same elements outside of a canvas.
-
-On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
-
-
-Checking accessibility properties for ids: nothing1, nothing2
-PASS axElement2.role is axElement1.role
-PASS collapseWhitespace(axElement2.deprecatedTitle) is collapseWhitespace(axElement1.deprecatedTitle)
-PASS axElement2.deprecatedTitleUIElement is axElement1.deprecatedTitleUIElement
-
-Checking accessibility properties for ids: text_label1, text_label2
-PASS axElement2.role is axElement1.role
-PASS collapseWhitespace(axElement2.deprecatedTitle) is collapseWhitespace(axElement1.deprecatedTitle)
-PASS axElement2.deprecatedTitleUIElement is axElement1.deprecatedTitleUIElement
-
-Checking accessibility properties for ids: text1, text2
-PASS axElement2.role is axElement1.role
-PASS collapseWhitespace(axElement2.deprecatedTitle) is collapseWhitespace(axElement1.deprecatedTitle)
-PASS axElement2.deprecatedTitleUIElement is axElement1.deprecatedTitleUIElement
-
-Checking accessibility properties for ids: check_label1, check_label2
-PASS axElement1 == null && axElement2 == null is true
-
-Checking accessibility properties for ids: check1, check2
-PASS axElement2.role is axElement1.role
-PASS collapseWhitespace(axElement2.deprecatedTitle) is collapseWhitespace(axElement1.deprecatedTitle)
-PASS axElement2.deprecatedTitleUIElement is axElement1.deprecatedTitleUIElement
-
-Checking accessibility properties for ids: radio_label1, radio_label2
-PASS axElement1 == null && axElement2 == null is true
-
-Checking accessibility properties for ids: radio1, radio2
-PASS axElement2.role is axElement1.role
-PASS collapseWhitespace(axElement2.deprecatedTitle) is collapseWhitespace(axElement1.deprecatedTitle)
-PASS axElement2.deprecatedTitleUIElement is axElement1.deprecatedTitleUIElement
-
-Checking accessibility properties for ids: slider_label1, slider_label2
-PASS axElement2.role is axElement1.role
-PASS collapseWhitespace(axElement2.deprecatedTitle) is collapseWhitespace(axElement1.deprecatedTitle)
-PASS axElement2.deprecatedTitleUIElement is axElement1.deprecatedTitleUIElement
-
-Checking accessibility properties for ids: slider1, slider2
-PASS axElement2.role is axElement1.role
-PASS collapseWhitespace(axElement2.deprecatedTitle) is collapseWhitespace(axElement1.deprecatedTitle)
-PASS axElement2.deprecatedTitleUIElement is axElement1.deprecatedTitleUIElement
-
-Checking accessibility properties for ids: list_label1, list_label2
-PASS axElement2.role is axElement1.role
-PASS collapseWhitespace(axElement2.deprecatedTitle) is collapseWhitespace(axElement1.deprecatedTitle)
-PASS axElement2.deprecatedTitleUIElement is axElement1.deprecatedTitleUIElement
-
-Checking accessibility properties for ids: list1, list2
-PASS axElement2.role is axElement1.role
-PASS collapseWhitespace(axElement2.deprecatedTitle) is collapseWhitespace(axElement1.deprecatedTitle)
-PASS axElement2.deprecatedTitleUIElement is axElement1.deprecatedTitleUIElement
-
-Checking accessibility properties for ids: label_for1, label_for2
-PASS axElement2.role is axElement1.role
-PASS collapseWhitespace(axElement2.deprecatedTitle) is collapseWhitespace(axElement1.deprecatedTitle)
-PASS axElement2.deprecatedTitleUIElement is axElement1.deprecatedTitleUIElement
-
-Checking accessibility properties for ids: text_for1, text_for2
-PASS axElement2.role is axElement1.role
-PASS collapseWhitespace(axElement2.deprecatedTitle) is collapseWhitespace(axElement1.deprecatedTitle)
-PASS axElement2.deprecatedTitleUIElement is axElement1.deprecatedTitleUIElement
-
-PASS successfullyParsed is true
-
-TEST COMPLETE
-
diff --git a/third_party/WebKit/LayoutTests/webaudio/biquad-automation-expected.txt b/third_party/WebKit/LayoutTests/webaudio/biquad-automation-expected.txt
deleted file mode 100644
index 57a2ae7..0000000
--- a/third_party/WebKit/LayoutTests/webaudio/biquad-automation-expected.txt
+++ /dev/null
@@ -1,15 +0,0 @@
-Test Automation of Biquad Filters
-
-On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
-
-
-PASS Output of bandpass filter with frequency automation equals [0,0.0782652199268341,0.11744670569896698,-0.002010007156059146,-0.031139623373746872,0.0723838210105896,0.04615558311343193,-0.06974676996469498,-0.02473430149257183,0.06254426389932632,-0.02191624790430069,-0.09223899245262146,0.007647276856005192,0.04232903569936752,-0.07107919454574585,-0.07092036306858063,...] with an element-wise tolerance of 0.00005.
-PASS Output of bandpass filter with Q automation equals [0,0.014149743132293224,0.05313149467110634,0.11025312542915344,0.17868348956108093,0.25172680616378784,0.3230687975883484,0.3869902193546295,0.4385446012020111,0.47369763255119324,0.48942655324935913,0.48377954959869385,0.455895334482193,0.40598464012145996,0.3352759778499603,0.24592919647693634,...] with an element-wise tolerance of 0.0000014.
-PASS Output of lowshelf filter with gain automation equals [0,0.47856831550598145,1.5545729398727417,3.054399251937866,4.675719738006592,6.195427417755127,7.4982218742370605,8.538782119750977,9.301715850830078,9.779485702514648,9.966057777404785,9.858304977416992,9.459100723266602,8.779397964477539,7.838820934295654,6.665206432342529,...] with an element-wise tolerance of 0.000008.
-PASS Output of bandpass filter with detune automation equals [0,0.0008333204896189272,0.0014042853144928813,0.0003864644968416542,0.0001289713109144941,0.0012249316787347198,0.0011354259913787246,0.00006134019349701703,0.00048309186240658164,0.0014227250358089805,0.0007017588941380382,-0.000017982178178499453,0.0009253751486539841,0.0013467228272929788,0.0002655529824551195,0.00017780107737053186,...] with an element-wise tolerance of 0.000005.
-PASS Output of peaking filter with automation of all parameters equals [0,0.9876883625984192,-0.30901700258255005,-0.8910065293312073,0.5877852439880371,0.7071067690849304,-0.80901700258255,-0.45399048924446106,0.9510565400123596,0.15643446147441864,-1,0.15643446147441864,0.9510565400123596,-0.45399048924446106,-0.80901700258255,0.7071067690849304,...] with an element-wise tolerance of 0.00033.
-PASS Output of bandpass filter with sinusoidal modulation of bandpass center frequency equals [0,0.0018003738950937986,0.00716581242159009,0.015862563624978065,0.027496544644236565,0.04151911661028862,0.05723972246050835,0.07384545356035233,0.09042731672525406,0.10601259768009186,0.11960244923830032,0.13021349906921387,0.13692189753055573,0.13890819251537323,0.13550083339214325,0.12621651589870453,...] with an element-wise tolerance of 0.000004.
-PASS successfullyParsed is true
-
-TEST COMPLETE
-
diff --git a/third_party/WebKit/LayoutTests/webaudio/biquad-automation.html b/third_party/WebKit/LayoutTests/webaudio/biquad-automation.html
deleted file mode 100644
index df36b8f..0000000
--- a/third_party/WebKit/LayoutTests/webaudio/biquad-automation.html
+++ /dev/null
@@ -1,356 +0,0 @@
-<!doctype html>
-<html>
-  <head>
-    <title>Biquad Automation Test</title>
-    <script src="../resources/js-test.js"></script>
-    <script src="resources/compatibility.js"></script>
-    <script src="resources/audio-testing.js"></script>
-    <script src="resources/biquad-testing.js"></script>
-    <script src="resources/audioparam-testing.js"></script>
-  </head>
-  <body>
-    <script>
-      description("Test Automation of Biquad Filters");
-
-      window.jsTestIsAsync = true;
-
-      // Don't need to run these tests at high sampling rate, so just use a low one to reduce memory
-      // usage and complexity.
-      var sampleRate = 16000;
-
-      // How long to render for each test.
-      var renderDuration = 1;
-
-      var audit = Audit.createTaskRunner();
-
-      // The definition of the linear ramp automation function.
-      function linearRamp(t, v0, v1, t0, t1) {
-        return v0 + (v1 - v0) * (t - t0) / (t1 - t0);
-      }
-
-      // Generate the filter coefficients for the specified filter using the given parameters for
-      // the given duration.  |filterTypeFunction| is a function that returns the filter
-      // coefficients for one set of parameters.  |parameters| is a property bag that contains the
-      // start and end values (as an array) for each of the biquad attributes.  The properties are
-      // |freq|, |Q|, |gain|, and |detune|.  |duration| is the number of seconds for which the
-      // coefficients are generated.
-      //
-      // A property bag with properties |b0|, |b1|, |b2|, |a1|, |a2|.  Each propery is an array
-      // consisting of the coefficients for the time-varying biquad filter.
-      function generateFilterCoefficients(filterTypeFunction, parameters, duration) {
-         var endFrame = Math.ceil(duration * sampleRate);
-         var nCoef = endFrame;
-         var b0 = new Float64Array(nCoef);
-         var b1 = new Float64Array(nCoef);
-         var b2 = new Float64Array(nCoef);
-         var a1 = new Float64Array(nCoef);
-         var a2 = new Float64Array(nCoef);
-
-         var k = 0;
-         // If the property is not given, use the defaults.
-         var freqs = parameters.freq || [350, 350];
-         var qs = parameters.Q || [1, 1];
-         var gains = parameters.gain || [0, 0];
-         var detunes = parameters.detune || [0, 0];
-
-         for (var frame = 0; frame < endFrame; ++frame) {
-            // Apply linear ramp at frame |frame|.
-            var f = linearRamp(frame / sampleRate, freqs[0], freqs[1], 0, duration);
-            var q = linearRamp(frame / sampleRate, qs[0], qs[1], 0, duration);
-            var g = linearRamp(frame / sampleRate, gains[0], gains[1], 0, duration);
-            var d = linearRamp(frame / sampleRate, detunes[0], detunes[1], 0, duration);
-
-            // Compute actual frequency parameter
-            f = f * Math.pow(2, d / 1200);
-
-            // Compute filter coefficients
-            var coef = filterTypeFunction(f / (sampleRate / 2), q, g);
-            b0[k] = coef.b0;
-            b1[k] = coef.b1;
-            b2[k] = coef.b2;
-            a1[k] = coef.a1;
-            a2[k] = coef.a2;
-            ++k;
-         }
-
-         return {b0: b0, b1: b1, b2: b2, a1: a1, a2: a2};
-      }
-
-      // Apply the given time-varying biquad filter to the given signal, |signal|.  |coef| should be
-      // the time-varying coefficients of the filter, as returned by |generateFilterCoefficients|.
-      function timeVaryingFilter(signal, coef) {
-        var length = signal.length;
-        // Use double precision for the internal computations.
-        var y = new Float64Array(length);
-
-        // Prime the pump. (Assumes the signal has length >= 2!)
-        y[0] = coef.b0[0] * signal[0];
-        y[1] = coef.b0[1] * signal[1] + coef.b1[1] * signal[0] - coef.a1[1] * y[0];
-
-        for (var n = 2; n < length; ++n) {
-          y[n] = coef.b0[n] * signal[n] + coef.b1[n] * signal[n-1] + coef.b2[n] * signal[n-2];
-          y[n] -= coef.a1[n] * y[n-1] + coef.a2[n] * y[n-2];
-        }
-
-        // But convert the result to single precision for comparison.
-        return y.map(Math.fround);
-      }
-
-      // Configure the audio graph using |context|.  Returns the biquad filter node and the
-      // AudioBuffer used for the source.
-      function configureGraph(context, toneFrequency) {
-        // The source is just a simple sine wave.
-        var src = context.createBufferSource();
-        var b = context.createBuffer(1, renderDuration * sampleRate, sampleRate);
-        var data = b.getChannelData(0);
-        var omega = 2 * Math.PI * toneFrequency / sampleRate;
-        for (var k = 0; k < data.length; ++k) {
-          data[k] = Math.sin(omega * k);
-        }
-        src.buffer = b;
-        var f = context.createBiquadFilter();
-        src.connect(f);
-        f.connect(context.destination);
-
-        src.start();
-
-        return {filter: f, source: b};
-      }
-
-      function createFilterVerifier(filterCreator, threshold, parameters, input, message) {
-        return function (resultBuffer) {
-          var actual = resultBuffer.getChannelData(0);
-          var coefs = generateFilterCoefficients(filterCreator, parameters, renderDuration);
-
-          reference = timeVaryingFilter(input, coefs);
-
-          Should(message, actual).beCloseToArray(reference, threshold);
-        };
-      }
-
-      // Automate just the frequency parameter.  A bandpass filter is used where the center
-      // frequency is swept across the source (which is a simple tone).
-      audit.defineTask("automate-freq", function (done) {
-        var context = new OfflineAudioContext(1, renderDuration * sampleRate, sampleRate);
-
-        // Center frequency of bandpass filter and also the frequency of the test tone.
-        var centerFreq = 10*440;
-
-        // Sweep the frequency +/- 9*440 Hz from the center.  This should cause the output to low at
-        // the beginning and end of the test where the done is outside the pass band of the filter,
-        // but high in the center where the tone is near the center of the pass band.
-        var parameters = {
-          freq: [centerFreq - 9*440, centerFreq + 9*440]
-        }
-        var graph = configureGraph(context, centerFreq);
-        var f = graph.filter;
-        var b = graph.source;
-
-        f.type = "bandpass";
-        f.frequency.setValueAtTime(parameters.freq[0], 0);
-        f.frequency.linearRampToValueAtTime(parameters.freq[1], renderDuration);
-
-        context.startRendering()
-          .then(createFilterVerifier(createBandpassFilter, 5e-5, parameters, b.getChannelData(0),
-            "Output of bandpass filter with frequency automation"))
-          .then(done);
-      });
-
-      // Automate just the Q parameter.  A bandpass filter is used where the Q of the filter is
-      // swept.
-      audit.defineTask("automate-q", function (done) {
-        var context = new OfflineAudioContext(1, renderDuration * sampleRate, sampleRate);
-
-        // The frequency of the test tone.
-        var centerFreq = 440;
-
-        // Sweep the Q paramter between 1 and 200.  This will cause the output of the filter to pass
-        // most of the tone at the beginning to passing less of the tone at the end.  This is
-        // because we set center frequency of the bandpass filter to be slightly off from the actual
-        // tone.
-        var parameters = {
-          Q: [1, 200],
-          // Center frequency of the bandpass filter is just 25 Hz above the tone frequency.
-          freq: [centerFreq + 25, centerFreq + 25]
-        };
-        var graph = configureGraph(context, centerFreq);
-        var f = graph.filter;
-        var b = graph.source;
-
-        f.type = "bandpass";
-        f.frequency.value = parameters.freq[0];
-        f.Q.setValueAtTime(parameters.Q[0], 0);
-        f.Q.linearRampToValueAtTime(parameters.Q[1], renderDuration);
-
-        context.startRendering()
-          .then(createFilterVerifier(createBandpassFilter, 1.4e-6, parameters, b.getChannelData(0),
-            "Output of bandpass filter with Q automation"))
-          .then(done);
-      });
-
-      // Automate just the gain of the lowshelf filter.  A test tone will be in the lowshelf part of
-      // the filter.  The output will vary as the gain of the lowshelf is changed.
-      audit.defineTask("automate-gain", function (done) {
-        var context = new OfflineAudioContext(1, renderDuration * sampleRate, sampleRate);
-
-        // Frequency of the test tone.
-        var centerFreq = 440;
-
-        // Set the cutoff frequency of the lowshelf to be significantly higher than the test tone.
-        // Sweep the gain from 20 dB to -20 dB.  (We go from 20 to -20 to easily verify that the
-        // filter didn't go unstable.)
-        var parameters = {
-          freq: [3500, 3500],
-          gain: [20, -20]
-        }
-        var graph = configureGraph(context, centerFreq);
-        var f = graph.filter;
-        var b = graph.source;
-
-        f.type = "lowshelf";
-        f.frequency.value = parameters.freq[0];
-        f.gain.setValueAtTime(parameters.gain[0], 0);
-        f.gain.linearRampToValueAtTime(parameters.gain[1], renderDuration);
-
-        context.startRendering()
-          .then(createFilterVerifier(createLowShelfFilter, 8e-6, parameters, b.getChannelData(0),
-            "Output of lowshelf filter with gain automation"))
-          .then(done);
-      });
-
-      // Automate just the detune parameter.  Basically the same test as for the frequncy parameter
-      // but we just use the detune parameter to modulate the frequency parameter.
-      audit.defineTask("automate-detune", function (done) {
-        var context = new OfflineAudioContext(1, renderDuration * sampleRate, sampleRate);
-        var centerFreq = 10*440;
-        var parameters = {
-          freq: [centerFreq, centerFreq],
-          detune: [-10*1200, 10*1200]
-        };
-        var graph = configureGraph(context, centerFreq);
-        var f = graph.filter;
-        var b = graph.source;
-
-        f.type = "bandpass";
-        f.frequency.value = parameters.freq[0];
-        f.detune.setValueAtTime(parameters.detune[0], 0);
-        f.detune.linearRampToValueAtTime(parameters.detune[1], renderDuration);
-
-        context.startRendering()
-          .then(createFilterVerifier(createBandpassFilter, 5e-6, parameters, b.getChannelData(0),
-            "Output of bandpass filter with detune automation"))
-          .then(done);
-      });
-
-      // Automate all of the filter parameters at once.  This is a basic check that everything is
-      // working.  A peaking filter is used because it uses all of the parameters.
-      audit.defineTask("automate-all", function (done) {
-        var context = new OfflineAudioContext(1, renderDuration * sampleRate, sampleRate);
-        var graph = configureGraph(context, 10*440);
-        var f = graph.filter;
-        var b = graph.source;
-
-        // Sweep all of the filter parameters.  These are pretty much arbitrary.
-        var parameters = {
-          freq: [10000, 100],
-          Q: [f.Q.value, .0001],
-          gain: [f.gain.value, 20],
-          detune: [2400, -2400]
-        };
-
-        f.type = "peaking";
-        // Set starting points for all parameters of the filter.  Start at 10 kHz for the center
-        // frequency, and the defaults for Q and gain.
-        f.frequency.setValueAtTime(parameters.freq[0], 0);
-        f.Q.setValueAtTime(parameters.Q[0], 0);
-        f.gain.setValueAtTime(parameters.gain[0], 0);
-        f.detune.setValueAtTime(parameters.detune[0], 0);
-
-        // Linear ramp each parameter
-        f.frequency.linearRampToValueAtTime(parameters.freq[1], renderDuration);
-        f.Q.linearRampToValueAtTime(parameters.Q[1], renderDuration);
-        f.gain.linearRampToValueAtTime(parameters.gain[1], renderDuration);
-        f.detune.linearRampToValueAtTime(parameters.detune[1], renderDuration);
-
-        context.startRendering()
-          .then(createFilterVerifier(createPeakingFilter, 3.3e-4, parameters, b.getChannelData(0),
-            "Output of peaking filter with automation of all parameters"))
-          .then(done);
-      });
-
-      // Test that modulation of the frequency parameter of the filter works.  A sinusoid of 440 Hz
-      // is the test signal that is applied to a bandpass biquad filter.  The frequency parameter of
-      // the filter is modulated by a sinusoid at 103 Hz, and the frequency modulation varies from
-      // 116 to 412 Hz.  (This test was taken from the description in
-      // https://github.com/WebAudio/web-audio-api/issues/509#issuecomment-94731355)
-      audit.defineTask("modulation", function (done) {
-        var context = new OfflineAudioContext(1, renderDuration * sampleRate, sampleRate);
-
-        // Create a graph with the sinusoidal source at 440 Hz as the input to a biquad filter.
-        var graph = configureGraph(context, 440);
-        var f = graph.filter;
-        var b = graph.source;
-
-        f.type = "bandpass";
-        f.Q.value = 5;
-        f.frequency.value = 264;
-
-        // Create the modulation source, a sinusoid with frequency 103 Hz and amplitude 148.  (The
-        // amplitude of 148 is added to the filter's frequency value of 264 to produce a sinusoidal
-        // modulation of the frequency parameter from 116 to 412 Hz.)
-        var mod = context.createBufferSource();
-        var mbuffer = context.createBuffer(1, renderDuration * sampleRate, sampleRate);
-        var d = mbuffer.getChannelData(0);
-        var omega = 2 * Math.PI * 103 / sampleRate;
-        for (var k = 0; k < d.length; ++k) {
-          d[k] = 148 * Math.sin(omega * k);
-        }
-        mod.buffer = mbuffer;
-
-        mod.connect(f.frequency);
-      
-        mod.start();
-        context.startRendering()
-          .then(function (resultBuffer) {
-             var actual = resultBuffer.getChannelData(0);
-             // Compute the filter coefficients using the mod sine wave
-             
-             var endFrame = Math.ceil(renderDuration * sampleRate);
-             var nCoef = endFrame;
-             var b0 = new Float64Array(nCoef);
-             var b1 = new Float64Array(nCoef);
-             var b2 = new Float64Array(nCoef);
-             var a1 = new Float64Array(nCoef);
-             var a2 = new Float64Array(nCoef);
-
-             // Generate the filter coefficients when the frequency varies from 116 to 248 Hz using
-             // the 103 Hz sinusoid.
-             for (var k = 0; k < nCoef; ++k) {
-               var freq = f.frequency.value + d[k];
-               var c = createBandpassFilter(freq / (sampleRate / 2), f.Q.value, f.gain.value);
-               b0[k] = c.b0;
-               b1[k] = c.b1;
-               b2[k] = c.b2;
-               a1[k] = c.a1;
-               a2[k] = c.a2;
-             }
-             reference = timeVaryingFilter(b.getChannelData(0),
-               {b0: b0, b1: b1, b2: b2, a1: a1, a2: a2});
-
-             Should("Output of bandpass filter with sinusoidal modulation of bandpass center frequency",
-               actual)
-               .beCloseToArray(reference, 4e-6);
-           })
-          .then(done);
-      });
-
-      // All done!
-      audit.defineTask("finish", function (done) {
-        finishJSTest();
-        done();
-      });
-
-      audit.runTasks();
-    </script>
-  </body>
-</html>
diff --git a/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-dedicated-worker-expected.txt b/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-dedicated-worker-expected.txt
index 0b3329e..f259c402 100644
--- a/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-dedicated-worker-expected.txt
+++ b/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-dedicated-worker-expected.txt
@@ -390,6 +390,7 @@
 [Worker]     getter origin
 [Worker]     getter ports
 [Worker]     getter source
+[Worker]     getter suborigin
 [Worker]     method constructor
 [Worker]     method initMessageEvent
 [Worker] interface MessagePort : EventTarget
diff --git a/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt b/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt
index f797356..eaff1f67 100644
--- a/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt
+++ b/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt
@@ -1053,6 +1053,7 @@
     getter scrollingElement
     getter selectedStylesheetSet
     getter styleSheets
+    getter suborigin
     getter timeline
     getter title
     getter visibilityState
@@ -3336,6 +3337,7 @@
     getter origin
     getter ports
     getter source
+    getter suborigin
     method constructor
     method initMessageEvent
 interface MessagePort : EventTarget
diff --git a/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-shared-worker-expected.txt b/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-shared-worker-expected.txt
index 99cd75dd..4a97076 100644
--- a/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-shared-worker-expected.txt
+++ b/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-shared-worker-expected.txt
@@ -380,6 +380,7 @@
 [Worker]     getter origin
 [Worker]     getter ports
 [Worker]     getter source
+[Worker]     getter suborigin
 [Worker]     method constructor
 [Worker]     method initMessageEvent
 [Worker] interface MessagePort : EventTarget
diff --git a/third_party/WebKit/Source/core/css/SelectorChecker.cpp b/third_party/WebKit/Source/core/css/SelectorChecker.cpp
index 4cefe5e..ca0c2f9 100644
--- a/third_party/WebKit/Source/core/css/SelectorChecker.cpp
+++ b/third_party/WebKit/Source/core/css/SelectorChecker.cpp
@@ -1054,6 +1054,8 @@
     if (m_mode == SharingRules)
         return true;
     // :host only matches a shadow host when :host is in a shadow tree of the shadow host.
+    if (!context.scope)
+        return false;
     const ContainerNode* shadowHost = context.scope->shadowHost();
     if (!shadowHost || shadowHost != element)
         return false;
diff --git a/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp b/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp
index 83558c2..5d66b86f 100644
--- a/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp
+++ b/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp
@@ -1596,6 +1596,11 @@
     return consumeLength(range, cssParserMode, ValueRangeNonNegative);
 }
 
+static PassRefPtrWillBeRawPtr<CSSPrimitiveValue> consumeBorderWidth(CSSParserTokenRange& range, CSSParserMode cssParserMode)
+{
+    return consumeLineWidth(range, cssParserMode);
+}
+
 PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::parseSingleValue(CSSPropertyID unresolvedProperty)
 {
     CSSPropertyID property = resolveCSSPropertyID(unresolvedProperty);
@@ -1699,9 +1704,18 @@
     case CSSPropertyWebkitTextFillColor:
     case CSSPropertyWebkitTapHighlightColor:
     case CSSPropertyWebkitTextEmphasisColor:
+    case CSSPropertyWebkitBorderStartColor:
+    case CSSPropertyWebkitBorderEndColor:
+    case CSSPropertyWebkitBorderBeforeColor:
+    case CSSPropertyWebkitBorderAfterColor:
         return consumeColor(m_range, m_context);
     case CSSPropertyColor:
         return consumeColor(m_range, m_context, inQuirksMode());
+    case CSSPropertyWebkitBorderStartWidth:
+    case CSSPropertyWebkitBorderEndWidth:
+    case CSSPropertyWebkitBorderBeforeWidth:
+    case CSSPropertyWebkitBorderAfterWidth:
+        return consumeBorderWidth(m_range, m_context.mode());
     case CSSPropertyZIndex:
         return consumeZIndex(m_range);
     case CSSPropertyTextShadow: // CSS2 property, dropped in CSS2.1, back in CSS3, so treat as CSS3
@@ -2210,6 +2224,14 @@
         return consumeShorthandGreedily(webkitTextEmphasisShorthand(), important);
     case CSSPropertyOutline:
         return consumeShorthandGreedily(outlineShorthand(), important);
+    case CSSPropertyWebkitBorderStart:
+        return consumeShorthandGreedily(webkitBorderStartShorthand(), important);
+    case CSSPropertyWebkitBorderEnd:
+        return consumeShorthandGreedily(webkitBorderEndShorthand(), important);
+    case CSSPropertyWebkitBorderBefore:
+        return consumeShorthandGreedily(webkitBorderBeforeShorthand(), important);
+    case CSSPropertyWebkitBorderAfter:
+        return consumeShorthandGreedily(webkitBorderAfterShorthand(), important);
     default:
         m_currentShorthand = oldShorthand;
         return false;
diff --git a/third_party/WebKit/Source/core/css/parser/LegacyCSSPropertyParser.cpp b/third_party/WebKit/Source/core/css/parser/LegacyCSSPropertyParser.cpp
index 3b39657f..eae576e 100644
--- a/third_party/WebKit/Source/core/css/parser/LegacyCSSPropertyParser.cpp
+++ b/third_party/WebKit/Source/core/css/parser/LegacyCSSPropertyParser.cpp
@@ -424,10 +424,6 @@
     case CSSPropertyBorderRightColor:
     case CSSPropertyBorderBottomColor:
     case CSSPropertyBorderLeftColor:
-    case CSSPropertyWebkitBorderStartColor:
-    case CSSPropertyWebkitBorderEndColor:
-    case CSSPropertyWebkitBorderBeforeColor:
-    case CSSPropertyWebkitBorderAfterColor:
     case CSSPropertyWebkitColumnRuleColor:
     case CSSPropertyWebkitTextStrokeColor:
         parsedValue = parseColor(m_valueList->current(), acceptQuirkyColors(propId));
@@ -599,10 +595,6 @@
             unitless = FUnitlessQuirk;
         // fall through
     case CSSPropertyWebkitTextStrokeWidth:
-    case CSSPropertyWebkitBorderStartWidth:
-    case CSSPropertyWebkitBorderEndWidth:
-    case CSSPropertyWebkitBorderBeforeWidth:
-    case CSSPropertyWebkitBorderAfterWidth:
     case CSSPropertyWebkitColumnRuleWidth:
         if (id == CSSValueThin || id == CSSValueMedium || id == CSSValueThick)
             validPrimitive = true;
@@ -1001,14 +993,6 @@
     case CSSPropertyBorderLeft:
         // [ 'border-left-width' || 'border-style' || <color> ] | inherit
         return parseShorthand(propId, borderLeftShorthand(), important);
-    case CSSPropertyWebkitBorderStart:
-        return parseShorthand(propId, webkitBorderStartShorthand(), important);
-    case CSSPropertyWebkitBorderEnd:
-        return parseShorthand(propId, webkitBorderEndShorthand(), important);
-    case CSSPropertyWebkitBorderBefore:
-        return parseShorthand(propId, webkitBorderBeforeShorthand(), important);
-    case CSSPropertyWebkitBorderAfter:
-        return parseShorthand(propId, webkitBorderAfterShorthand(), important);
     case CSSPropertyBorderColor:
         // <color>{1,4} | inherit
         return parse4Values(propId, borderColorShorthand().properties(), important);
@@ -1177,6 +1161,18 @@
     case CSSPropertyOutlineColor:
     case CSSPropertyOutlineWidth:
     case CSSPropertyOutlineOffset:
+    case CSSPropertyWebkitBorderStartColor:
+    case CSSPropertyWebkitBorderEndColor:
+    case CSSPropertyWebkitBorderBeforeColor:
+    case CSSPropertyWebkitBorderAfterColor:
+    case CSSPropertyWebkitBorderStartWidth:
+    case CSSPropertyWebkitBorderEndWidth:
+    case CSSPropertyWebkitBorderBeforeWidth:
+    case CSSPropertyWebkitBorderAfterWidth:
+    case CSSPropertyWebkitBorderStart:
+    case CSSPropertyWebkitBorderEnd:
+    case CSSPropertyWebkitBorderBefore:
+    case CSSPropertyWebkitBorderAfter:
         validPrimitive = false;
         break;
 
diff --git a/third_party/WebKit/Source/core/dom/Document.cpp b/third_party/WebKit/Source/core/dom/Document.cpp
index fb40bcc7..d1a47d0 100644
--- a/third_party/WebKit/Source/core/dom/Document.cpp
+++ b/third_party/WebKit/Source/core/dom/Document.cpp
@@ -375,8 +375,6 @@
 Document::Document(const DocumentInit& initializer, DocumentClassFlags documentClasses)
     : ContainerNode(0, CreateDocument)
     , TreeScope(*this)
-    , m_detachingDocumentLoader(false)
-    , m_loadEventProgress(LoadEventNotRun)
     , m_hasNodesWithPlaceholderStyle(false)
     , m_evaluateMediaQueriesOnStyleRecalc(false)
     , m_pendingSheetLayout(NoLayoutWithPendingSheets)
@@ -410,6 +408,7 @@
     , m_markers(adoptPtrWillBeNoop(new DocumentMarkerController))
     , m_updateFocusAppearanceTimer(this, &Document::updateFocusAppearanceTimerFired)
     , m_cssTarget(nullptr)
+    , m_loadEventProgress(LoadEventNotRun)
     , m_startTime(currentTime())
     , m_scriptRunner(ScriptRunner::create(this))
     , m_xmlVersion("1.0")
diff --git a/third_party/WebKit/Source/core/dom/Document.h b/third_party/WebKit/Source/core/dom/Document.h
index b1a529e..885d0ad1 100644
--- a/third_party/WebKit/Source/core/dom/Document.h
+++ b/third_party/WebKit/Source/core/dom/Document.h
@@ -330,6 +330,7 @@
     KURL baseURI() const final;
 
     String origin() const { return securityOrigin()->toString(); }
+    String suborigin() const { return securityOrigin()->suboriginName(); }
 
     String visibilityState() const;
     PageVisibilityState pageVisibilityState() const;
@@ -1044,9 +1045,6 @@
     WebTaskRunner* loadingTaskRunner() const;
     WebTaskRunner* timerTaskRunner() const;
 
-    // TODO(bokan): Temporary to help track down crash in crbug.com/519752.
-    bool m_detachingDocumentLoader;
-
 protected:
     Document(const DocumentInit&, DocumentClassFlags = DefaultDocumentClass);
 
@@ -1153,10 +1151,6 @@
 
     const OriginAccessEntry& accessEntryFromURL();
 
-    // TODO(bokan): Temporarily moved this to the top of memebers so it's likely
-    // to be included in a minidump memory region. crbug.com/519752
-    LoadEventProgress m_loadEventProgress;
-
     DocumentLifecycle m_lifecycle;
 
     bool m_hasNodesWithPlaceholderStyle;
@@ -1263,6 +1257,8 @@
 
     RawPtrWillBeMember<Element> m_cssTarget;
 
+    LoadEventProgress m_loadEventProgress;
+
     double m_startTime;
 
     OwnPtrWillBeMember<ScriptRunner> m_scriptRunner;
diff --git a/third_party/WebKit/Source/core/dom/Document.idl b/third_party/WebKit/Source/core/dom/Document.idl
index 3f71ed5..6b2833c 100644
--- a/third_party/WebKit/Source/core/dom/Document.idl
+++ b/third_party/WebKit/Source/core/dom/Document.idl
@@ -35,6 +35,7 @@
     // FIXME: documentURI should not be nullable.
     [ImplementedAs=url] readonly attribute DOMString? documentURI;
     readonly attribute DOMString origin;
+    [RuntimeEnabled=suborigins] readonly attribute DOMString suborigin;
     readonly attribute DOMString compatMode;
 
     readonly attribute DOMString characterSet;
diff --git a/third_party/WebKit/Source/core/editing/FrameSelection.cpp b/third_party/WebKit/Source/core/editing/FrameSelection.cpp
index ff9ded7..902a4e3 100644
--- a/third_party/WebKit/Source/core/editing/FrameSelection.cpp
+++ b/third_party/WebKit/Source/core/editing/FrameSelection.cpp
@@ -279,7 +279,7 @@
         s.setIsDirectional(true);
 
     if (!m_frame) {
-        m_selectionEditor->setVisibleSelection(s);
+        m_selectionEditor->setVisibleSelection(s, options);
         return;
     }
 
@@ -323,7 +323,7 @@
     const VisibleSelectionTemplate<Strategy> oldSelection = visibleSelection<Strategy>();
     const VisibleSelection oldSelectionInDOMTree = selection();
 
-    m_selectionEditor->setVisibleSelection(s);
+    m_selectionEditor->setVisibleSelection(s, options);
     setCaretRectNeedsUpdate();
 
     if (!s.isNone() && !(options & DoNotSetFocus))
diff --git a/third_party/WebKit/Source/core/editing/FrameSelection.h b/third_party/WebKit/Source/core/editing/FrameSelection.h
index bc4d7e41..abc035b 100644
--- a/third_party/WebKit/Source/core/editing/FrameSelection.h
+++ b/third_party/WebKit/Source/core/editing/FrameSelection.h
@@ -83,6 +83,7 @@
         DoNotSetFocus = 1 << 4,
         DoNotUpdateAppearance = 1 << 5,
         DoNotClearStrategy = 1 << 6,
+        DoNotAdjustInComposedTree = 1 << 7,
     };
     typedef unsigned SetSelectionOptions; // Union of values in SetSelectionOption and EUserTriggered
     static inline EUserTriggered selectionOptionsToUserTriggered(SetSelectionOptions options)
diff --git a/third_party/WebKit/Source/core/editing/SelectionEditor.cpp b/third_party/WebKit/Source/core/editing/SelectionEditor.cpp
index 9d0301e..4d0cd695 100644
--- a/third_party/WebKit/Source/core/editing/SelectionEditor.cpp
+++ b/third_party/WebKit/Source/core/editing/SelectionEditor.cpp
@@ -80,14 +80,24 @@
     return m_selectionInComposedTree;
 }
 
-void SelectionEditor::setVisibleSelection(const VisibleSelection& newSelection)
+void SelectionEditor::setVisibleSelection(const VisibleSelection& newSelection, FrameSelection::SetSelectionOptions options)
 {
     m_selection = newSelection;
+    if (options & FrameSelection::DoNotAdjustInComposedTree) {
+        const auto& base = toPositionInComposedTree(m_selection.base());
+        const auto& extent = toPositionInComposedTree(m_selection.extent());
+        base.anchorNode()->updateDistribution();
+        extent.anchorNode()->updateDistribution();
+        m_selectionInComposedTree.setWithoutValidation(base, extent);
+        return;
+    }
+
     adjustVisibleSelectionInComposedTree();
 }
 
-void SelectionEditor::setVisibleSelection(const VisibleSelectionInComposedTree& newSelection)
+void SelectionEditor::setVisibleSelection(const VisibleSelectionInComposedTree& newSelection, FrameSelection::SetSelectionOptions options)
 {
+    ASSERT(!(options & FrameSelection::DoNotAdjustInComposedTree));
     m_selectionInComposedTree = newSelection;
     adjustVisibleSelectionInDOMTree();
 }
diff --git a/third_party/WebKit/Source/core/editing/SelectionEditor.h b/third_party/WebKit/Source/core/editing/SelectionEditor.h
index 285622a..c142ecb 100644
--- a/third_party/WebKit/Source/core/editing/SelectionEditor.h
+++ b/third_party/WebKit/Source/core/editing/SelectionEditor.h
@@ -57,8 +57,8 @@
 
     template <typename Strategy>
     const VisibleSelectionTemplate<Strategy>& visibleSelection() const;
-    void setVisibleSelection(const VisibleSelection&);
-    void setVisibleSelection(const VisibleSelectionInComposedTree&);
+    void setVisibleSelection(const VisibleSelection&, FrameSelection::SetSelectionOptions);
+    void setVisibleSelection(const VisibleSelectionInComposedTree&, FrameSelection::SetSelectionOptions);
 
     void setIsDirectional(bool);
     void setWithoutValidation(const Position& start, const Position& end);
diff --git a/third_party/WebKit/Source/core/editing/VisibleSelection.cpp b/third_party/WebKit/Source/core/editing/VisibleSelection.cpp
index 504a98c..3369e7f 100644
--- a/third_party/WebKit/Source/core/editing/VisibleSelection.cpp
+++ b/third_party/WebKit/Source/core/editing/VisibleSelection.cpp
@@ -650,8 +650,11 @@
 template <typename Strategy>
 void VisibleSelectionTemplate<Strategy>::setWithoutValidation(const PositionTemplate<Strategy>& base, const PositionTemplate<Strategy>& extent)
 {
-    ASSERT(!base.isNull());
-    ASSERT(!extent.isNull());
+    if (base.isNull() || extent.isNull()) {
+        m_base = m_extent = m_start = m_end = PositionTemplate<Strategy>();
+        updateSelectionType();
+        return;
+    }
 
     // TODO(hajimehoshi): We doubt this assertion is needed. This was introduced
     // by http://trac.webkit.org/browser/trunk/WebCore/editing/Selection.cpp?annotate=blame&rev=21071
diff --git a/third_party/WebKit/Source/core/events/MessageEvent.cpp b/third_party/WebKit/Source/core/events/MessageEvent.cpp
index b969056a..1b3484c 100644
--- a/third_party/WebKit/Source/core/events/MessageEvent.cpp
+++ b/third_party/WebKit/Source/core/events/MessageEvent.cpp
@@ -62,7 +62,7 @@
     ASSERT(isValidSource(m_source.get()));
 }
 
-MessageEvent::MessageEvent(const String& origin, const String& lastEventId, PassRefPtrWillBeRawPtr<EventTarget> source, MessagePortArray* ports)
+MessageEvent::MessageEvent(const String& origin, const String& lastEventId, PassRefPtrWillBeRawPtr<EventTarget> source, MessagePortArray* ports, const String& suborigin)
     : Event(EventTypeNames::message, false, false)
     , m_dataType(DataTypeScriptValue)
     , m_origin(origin)
@@ -73,7 +73,7 @@
     ASSERT(isValidSource(m_source.get()));
 }
 
-MessageEvent::MessageEvent(PassRefPtr<SerializedScriptValue> data, const String& origin, const String& lastEventId, PassRefPtrWillBeRawPtr<EventTarget> source, MessagePortArray* ports)
+MessageEvent::MessageEvent(PassRefPtr<SerializedScriptValue> data, const String& origin, const String& lastEventId, PassRefPtrWillBeRawPtr<EventTarget> source, MessagePortArray* ports, const String& suborigin)
     : Event(EventTypeNames::message, false, false)
     , m_dataType(DataTypeSerializedScriptValue)
     , m_dataAsSerializedScriptValue(data)
@@ -87,7 +87,7 @@
     ASSERT(isValidSource(m_source.get()));
 }
 
-MessageEvent::MessageEvent(PassRefPtr<SerializedScriptValue> data, const String& origin, const String& lastEventId, PassRefPtrWillBeRawPtr<EventTarget> source, PassOwnPtr<MessagePortChannelArray> channels)
+MessageEvent::MessageEvent(PassRefPtr<SerializedScriptValue> data, const String& origin, const String& lastEventId, PassRefPtrWillBeRawPtr<EventTarget> source, PassOwnPtr<MessagePortChannelArray> channels, const String& suborigin)
     : Event(EventTypeNames::message, false, false)
     , m_dataType(DataTypeSerializedScriptValue)
     , m_dataAsSerializedScriptValue(data)
@@ -95,13 +95,14 @@
     , m_lastEventId(lastEventId)
     , m_source(source)
     , m_channels(channels)
+    , m_suborigin(suborigin)
 {
     if (m_dataAsSerializedScriptValue)
         m_dataAsSerializedScriptValue->registerMemoryAllocatedWithCurrentScriptContext();
     ASSERT(isValidSource(m_source.get()));
 }
 
-MessageEvent::MessageEvent(const String& data, const String& origin)
+MessageEvent::MessageEvent(const String& data, const String& origin, const String& suborigin)
     : Event(EventTypeNames::message, false, false)
     , m_dataType(DataTypeString)
     , m_dataAsString(data)
@@ -109,7 +110,7 @@
 {
 }
 
-MessageEvent::MessageEvent(Blob* data, const String& origin)
+MessageEvent::MessageEvent(Blob* data, const String& origin, const String& suborigin)
     : Event(EventTypeNames::message, false, false)
     , m_dataType(DataTypeBlob)
     , m_dataAsBlob(data)
@@ -117,7 +118,7 @@
 {
 }
 
-MessageEvent::MessageEvent(PassRefPtr<DOMArrayBuffer> data, const String& origin)
+MessageEvent::MessageEvent(PassRefPtr<DOMArrayBuffer> data, const String& origin, const String& suborigin)
     : Event(EventTypeNames::message, false, false)
     , m_dataType(DataTypeArrayBuffer)
     , m_dataAsArrayBuffer(data)
@@ -151,6 +152,7 @@
     m_lastEventId = lastEventId;
     m_source = source;
     m_ports = ports;
+    m_suborigin = "";
 }
 
 void MessageEvent::initMessageEvent(const AtomicString& type, bool canBubble, bool cancelable, PassRefPtr<SerializedScriptValue> data, const String& origin, const String& lastEventId, DOMWindow* source, MessagePortArray* ports)
@@ -166,6 +168,7 @@
     m_lastEventId = lastEventId;
     m_source = source;
     m_ports = ports;
+    m_suborigin = "";
 
     if (m_dataAsSerializedScriptValue)
         m_dataAsSerializedScriptValue->registerMemoryAllocatedWithCurrentScriptContext();
diff --git a/third_party/WebKit/Source/core/events/MessageEvent.h b/third_party/WebKit/Source/core/events/MessageEvent.h
index 9c7fd7b..958f126 100644
--- a/third_party/WebKit/Source/core/events/MessageEvent.h
+++ b/third_party/WebKit/Source/core/events/MessageEvent.h
@@ -47,29 +47,29 @@
     {
         return adoptRefWillBeNoop(new MessageEvent);
     }
-    static PassRefPtrWillBeRawPtr<MessageEvent> create(MessagePortArray* ports, const String& origin = String(), const String& lastEventId = String(), PassRefPtrWillBeRawPtr<EventTarget> source = nullptr)
+    static PassRefPtrWillBeRawPtr<MessageEvent> create(MessagePortArray* ports, const String& origin = String(), const String& lastEventId = String(), PassRefPtrWillBeRawPtr<EventTarget> source = nullptr, const String& suborigin = String())
     {
-        return adoptRefWillBeNoop(new MessageEvent(origin, lastEventId, source, ports));
+        return adoptRefWillBeNoop(new MessageEvent(origin, lastEventId, source, ports, suborigin));
     }
-    static PassRefPtrWillBeRawPtr<MessageEvent> create(MessagePortArray* ports, PassRefPtr<SerializedScriptValue> data, const String& origin = String(), const String& lastEventId = String(), PassRefPtrWillBeRawPtr<EventTarget> source = nullptr)
+    static PassRefPtrWillBeRawPtr<MessageEvent> create(MessagePortArray* ports, PassRefPtr<SerializedScriptValue> data, const String& origin = String(), const String& lastEventId = String(), PassRefPtrWillBeRawPtr<EventTarget> source = nullptr, const String& suborigin = String())
     {
-        return adoptRefWillBeNoop(new MessageEvent(data, origin, lastEventId, source, ports));
+        return adoptRefWillBeNoop(new MessageEvent(data, origin, lastEventId, source, ports, suborigin));
     }
-    static PassRefPtrWillBeRawPtr<MessageEvent> create(PassOwnPtr<MessagePortChannelArray> channels, PassRefPtr<SerializedScriptValue> data, const String& origin = String(), const String& lastEventId = String(), PassRefPtrWillBeRawPtr<EventTarget> source = nullptr)
+    static PassRefPtrWillBeRawPtr<MessageEvent> create(PassOwnPtr<MessagePortChannelArray> channels, PassRefPtr<SerializedScriptValue> data, const String& origin = String(), const String& lastEventId = String(), PassRefPtrWillBeRawPtr<EventTarget> source = nullptr, const String& suborigin = String())
     {
-        return adoptRefWillBeNoop(new MessageEvent(data, origin, lastEventId, source, channels));
+        return adoptRefWillBeNoop(new MessageEvent(data, origin, lastEventId, source, channels, suborigin));
     }
-    static PassRefPtrWillBeRawPtr<MessageEvent> create(const String& data, const String& origin = String())
+    static PassRefPtrWillBeRawPtr<MessageEvent> create(const String& data, const String& origin = String(), const String& suborigin = String())
     {
-        return adoptRefWillBeNoop(new MessageEvent(data, origin));
+        return adoptRefWillBeNoop(new MessageEvent(data, origin, suborigin));
     }
-    static PassRefPtrWillBeRawPtr<MessageEvent> create(Blob* data, const String& origin = String())
+    static PassRefPtrWillBeRawPtr<MessageEvent> create(Blob* data, const String& origin = String(), const String& suborigin = String())
     {
-        return adoptRefWillBeNoop(new MessageEvent(data, origin));
+        return adoptRefWillBeNoop(new MessageEvent(data, origin, suborigin));
     }
-    static PassRefPtrWillBeRawPtr<MessageEvent> create(PassRefPtr<DOMArrayBuffer> data, const String& origin = String())
+    static PassRefPtrWillBeRawPtr<MessageEvent> create(PassRefPtr<DOMArrayBuffer> data, const String& origin = String(), const String& suborigin = String())
     {
-        return adoptRefWillBeNoop(new MessageEvent(data, origin));
+        return adoptRefWillBeNoop(new MessageEvent(data, origin, suborigin));
     }
     static PassRefPtrWillBeRawPtr<MessageEvent> create(const AtomicString& type, const MessageEventInit& initializer, ExceptionState&);
     ~MessageEvent() override;
@@ -78,6 +78,7 @@
     void initMessageEvent(const AtomicString& type, bool canBubble, bool cancelable, PassRefPtr<SerializedScriptValue> data, const String& origin, const String& lastEventId, DOMWindow* source, MessagePortArray*);
 
     const String& origin() const { return m_origin; }
+    const String& suborigin() const { return m_suborigin; }
     const String& lastEventId() const { return m_lastEventId; }
     EventTarget* source() const { return m_source.get(); }
     MessagePortArray ports(bool& isNull) const;
@@ -115,13 +116,13 @@
 private:
     MessageEvent();
     MessageEvent(const AtomicString&, const MessageEventInit&);
-    MessageEvent(const String& origin, const String& lastEventId, PassRefPtrWillBeRawPtr<EventTarget> source, MessagePortArray*);
-    MessageEvent(PassRefPtr<SerializedScriptValue> data, const String& origin, const String& lastEventId, PassRefPtrWillBeRawPtr<EventTarget> source, MessagePortArray*);
-    MessageEvent(PassRefPtr<SerializedScriptValue> data, const String& origin, const String& lastEventId, PassRefPtrWillBeRawPtr<EventTarget> source, PassOwnPtr<MessagePortChannelArray>);
+    MessageEvent(const String& origin, const String& lastEventId, PassRefPtrWillBeRawPtr<EventTarget> source, MessagePortArray*, const String& suborigin);
+    MessageEvent(PassRefPtr<SerializedScriptValue> data, const String& origin, const String& lastEventId, PassRefPtrWillBeRawPtr<EventTarget> source, MessagePortArray*, const String& suborigin);
+    MessageEvent(PassRefPtr<SerializedScriptValue> data, const String& origin, const String& lastEventId, PassRefPtrWillBeRawPtr<EventTarget> source, PassOwnPtr<MessagePortChannelArray>, const String& suborigin);
 
-    MessageEvent(const String& data, const String& origin);
-    MessageEvent(Blob* data, const String& origin);
-    MessageEvent(PassRefPtr<DOMArrayBuffer> data, const String& origin);
+    MessageEvent(const String& data, const String& origin, const String& suborigin);
+    MessageEvent(Blob* data, const String& origin, const String& suborigin);
+    MessageEvent(PassRefPtr<DOMArrayBuffer> data, const String& origin, const String& suborigin);
 
     DataType m_dataType;
     ScriptValue m_dataAsScriptValue;
@@ -137,6 +138,7 @@
     // non-empty at a time. entangleMessagePorts() moves between the states.
     PersistentWillBeMember<MessagePortArray> m_ports;
     OwnPtr<MessagePortChannelArray> m_channels;
+    String m_suborigin;
 };
 
 } // namespace blink
diff --git a/third_party/WebKit/Source/core/events/MessageEvent.idl b/third_party/WebKit/Source/core/events/MessageEvent.idl
index 588a9397..536ba1f 100644
--- a/third_party/WebKit/Source/core/events/MessageEvent.idl
+++ b/third_party/WebKit/Source/core/events/MessageEvent.idl
@@ -38,6 +38,7 @@
     // TODO(bashi): |source| should be (WindowProxy or MessagePort)?
     readonly attribute EventTarget? source;
     readonly attribute MessagePort[]? ports;
+    [RuntimeEnabled=suborigins] readonly attribute DOMString suborigin;
 
     // TODO(philipj): None of the initMessageEvent() arguments should be
     // optional, and |sourceArg| and |portsArg| are of the wrong type.
diff --git a/third_party/WebKit/Source/core/frame/DOMWindow.cpp b/third_party/WebKit/Source/core/frame/DOMWindow.cpp
index 7faf9ae..442a2d7 100644
--- a/third_party/WebKit/Source/core/frame/DOMWindow.cpp
+++ b/third_party/WebKit/Source/core/frame/DOMWindow.cpp
@@ -200,6 +200,7 @@
     if (!sourceDocument)
         return;
     String sourceOrigin = sourceDocument->securityOrigin()->toString();
+    String sourceSuborigin = sourceDocument->securityOrigin()->suboriginName();
 
     // FIXME: MixedContentChecker needs to be refactored for OOPIF.  For now,
     // create the url using replicated origins for remote frames.
@@ -212,7 +213,7 @@
     // Give the embedder a chance to intercept this postMessage.  If the
     // target is a remote frame, the message will be forwarded through the
     // browser process.
-    RefPtrWillBeRawPtr<MessageEvent> event = MessageEvent::create(channels.release(), message, sourceOrigin, String(), source);
+    RefPtrWillBeRawPtr<MessageEvent> event = MessageEvent::create(channels.release(), message, sourceOrigin, String(), source, sourceSuborigin);
     bool didHandleMessageEvent = frame()->client()->willCheckAndDispatchMessageEvent(target.get(), event.get(), source->document()->frame());
     if (!didHandleMessageEvent) {
         // Capture stack trace only when inspector front-end is loaded as it may be time consuming.
diff --git a/third_party/WebKit/Source/core/frame/LocalFrame.cpp b/third_party/WebKit/Source/core/frame/LocalFrame.cpp
index 7811c10..16bb9bb 100644
--- a/third_party/WebKit/Source/core/frame/LocalFrame.cpp
+++ b/third_party/WebKit/Source/core/frame/LocalFrame.cpp
@@ -127,25 +127,8 @@
 
 } // namespace
 
-// TODO(bokan): Temporary to help track down crash in crbug.com/519752
-static void checkCanLoad(Document* doc)
-{
-    if (!doc)
-        return;
-
-    // I added this flag that gets set to true just before detaching the document loader. This
-    // should trip and will hopefully illuminate why the loadEventProgress state isn't stopping
-    // navigation.
-    RELEASE_ASSERT(!doc->m_detachingDocumentLoader);
-
-    checkCanLoad(doc->parentDocument());
-}
-
 PassRefPtrWillBeRawPtr<LocalFrame> LocalFrame::create(FrameLoaderClient* client, FrameHost* host, FrameOwner* owner)
 {
-    if (owner && owner->isLocal())
-        checkCanLoad(&toHTMLFrameOwnerElement(owner)->document());
-
     RefPtrWillBeRawPtr<LocalFrame> frame = adoptRefWillBeNoop(new LocalFrame(client, host, owner));
     InspectorInstrumentation::frameAttachedToParent(frame.get());
     return frame.release();
diff --git a/third_party/WebKit/Source/core/html/HTMLTextFormControlElement.cpp b/third_party/WebKit/Source/core/html/HTMLTextFormControlElement.cpp
index b3421b1..9f9c354c 100644
--- a/third_party/WebKit/Source/core/html/HTMLTextFormControlElement.cpp
+++ b/third_party/WebKit/Source/core/html/HTMLTextFormControlElement.cpp
@@ -377,12 +377,14 @@
     ASSERT(start == indexForPosition(innerEditor, startPosition));
     ASSERT(end == indexForPosition(innerEditor, endPosition));
 
+#if ENABLE(ASSERT)
     // startPosition and endPosition can be null position for example when
     // "-webkit-user-select: none" style attribute is specified.
     if (startPosition.isNotNull() && endPosition.isNotNull()) {
         ASSERT(startPosition.anchorNode()->shadowHost() == this
             && endPosition.anchorNode()->shadowHost() == this);
     }
+#endif // ENABLE(ASSERT)
     VisibleSelection newSelection;
     if (direction == SelectionHasBackwardDirection)
         newSelection.setWithoutValidation(endPosition, startPosition);
@@ -390,7 +392,7 @@
         newSelection.setWithoutValidation(startPosition, endPosition);
     newSelection.setIsDirectional(direction != SelectionHasNoDirection);
 
-    frame->selection().setSelection(newSelection, FrameSelection::CloseTyping | FrameSelection::ClearTypingStyle | (selectionOption == ChangeSelectionAndFocus ? 0 : FrameSelection::DoNotSetFocus));
+    frame->selection().setSelection(newSelection, FrameSelection::DoNotAdjustInComposedTree | FrameSelection::CloseTyping | FrameSelection::ClearTypingStyle | (selectionOption == ChangeSelectionAndFocus ? 0 : FrameSelection::DoNotSetFocus));
     if (eventBehaviour == DispatchSelectEvent)
         scheduleSelectEvent();
 }
diff --git a/third_party/WebKit/Source/core/inspector/v8/V8DebuggerAgentImpl.cpp b/third_party/WebKit/Source/core/inspector/v8/V8DebuggerAgentImpl.cpp
index 5285c29..2a7121c 100644
--- a/third_party/WebKit/Source/core/inspector/v8/V8DebuggerAgentImpl.cpp
+++ b/third_party/WebKit/Source/core/inspector/v8/V8DebuggerAgentImpl.cpp
@@ -1456,6 +1456,7 @@
 
     bool isContentScript = script.isContentScript();
     bool isInternalScript = script.isInternalScript();
+    bool isLiveEdit = script.isLiveEdit();
     bool hasSourceURL = script.hasSourceURL();
     String scriptURL = script.sourceURL();
     String sourceMapURL = sourceMapURLForScript(script, parsedScript.compileResult);
@@ -1463,9 +1464,10 @@
     const String* sourceMapURLParam = sourceMapURL.isNull() ? nullptr : &sourceMapURL;
     const bool* isContentScriptParam = isContentScript ? &isContentScript : nullptr;
     const bool* isInternalScriptParam = isInternalScript ? &isInternalScript : nullptr;
+    const bool* isLiveEditParam = isLiveEdit ? &isLiveEdit : nullptr;
     const bool* hasSourceURLParam = hasSourceURL ? &hasSourceURL : nullptr;
     if (!hasSyntaxError)
-        m_frontend->scriptParsed(parsedScript.scriptId, scriptURL, script.startLine(), script.startColumn(), script.endLine(), script.endColumn(), isContentScriptParam, isInternalScriptParam, sourceMapURLParam, hasSourceURLParam);
+        m_frontend->scriptParsed(parsedScript.scriptId, scriptURL, script.startLine(), script.startColumn(), script.endLine(), script.endColumn(), isContentScriptParam, isInternalScriptParam, isLiveEditParam, sourceMapURLParam, hasSourceURLParam);
     else
         m_frontend->scriptFailedToParse(parsedScript.scriptId, scriptURL, script.startLine(), script.startColumn(), script.endLine(), script.endColumn(), isContentScriptParam, isInternalScriptParam, sourceMapURLParam, hasSourceURLParam);
 
diff --git a/third_party/WebKit/Source/core/inspector/v8/V8DebuggerImpl.cpp b/third_party/WebKit/Source/core/inspector/v8/V8DebuggerImpl.cpp
index ee81bdf..f4ca12cc 100644
--- a/third_party/WebKit/Source/core/inspector/v8/V8DebuggerImpl.cpp
+++ b/third_party/WebKit/Source/core/inspector/v8/V8DebuggerImpl.cpp
@@ -49,6 +49,8 @@
 const char stepOutV8MethodName[] = "stepOutOfFunction";
 }
 
+static bool inLiveEditScope = false;
+
 v8::MaybeLocal<v8::Value> V8DebuggerImpl::callDebuggerMethod(const char* functionName, int argc, v8::Local<v8::Value> argv[])
 {
     v8::Local<v8::Object> debuggerScript = m_debuggerScript.Get(m_isolate);
@@ -354,8 +356,16 @@
 {
     class EnableLiveEditScope {
     public:
-        explicit EnableLiveEditScope(v8::Isolate* isolate) : m_isolate(isolate) { v8::Debug::SetLiveEditEnabled(m_isolate, true); }
-        ~EnableLiveEditScope() { v8::Debug::SetLiveEditEnabled(m_isolate, false); }
+        explicit EnableLiveEditScope(v8::Isolate* isolate) : m_isolate(isolate)
+        {
+            v8::Debug::SetLiveEditEnabled(m_isolate, true);
+            inLiveEditScope = true;
+        }
+        ~EnableLiveEditScope()
+        {
+            v8::Debug::SetLiveEditEnabled(m_isolate, false);
+            inLiveEditScope = false;
+        }
     private:
         v8::Isolate* m_isolate;
     };
@@ -665,7 +675,8 @@
         .setEndLine(object->Get(v8InternalizedString("endLine"))->ToInteger(m_isolate)->Value())
         .setEndColumn(object->Get(v8InternalizedString("endColumn"))->ToInteger(m_isolate)->Value())
         .setIsContentScript(object->Get(v8InternalizedString("isContentScript"))->ToBoolean(m_isolate)->Value())
-        .setIsInternalScript(object->Get(v8InternalizedString("isInternalScript"))->ToBoolean(m_isolate)->Value());
+        .setIsInternalScript(object->Get(v8InternalizedString("isInternalScript"))->ToBoolean(m_isolate)->Value())
+        .setIsLiveEdit(inLiveEditScope);
     parsedScript.compileResult = compileResult;
     return parsedScript;
 }
diff --git a/third_party/WebKit/Source/core/inspector/v8/V8DebuggerListener.cpp b/third_party/WebKit/Source/core/inspector/v8/V8DebuggerListener.cpp
index 033e487..edef09e 100644
--- a/third_party/WebKit/Source/core/inspector/v8/V8DebuggerListener.cpp
+++ b/third_party/WebKit/Source/core/inspector/v8/V8DebuggerListener.cpp
@@ -17,6 +17,8 @@
     , m_endLine(0)
     , m_endColumn(0)
     , m_isContentScript(false)
+    , m_isInternalScript(false)
+    , m_isLiveEdit(false)
     , m_isBlackboxedURL(false)
     , m_blackboxGeneration(kBlackboxUnknown)
 {
@@ -104,4 +106,10 @@
     return *this;
 }
 
+V8DebuggerListener::Script& V8DebuggerListener::Script::setIsLiveEdit(bool isLiveEdit)
+{
+    m_isLiveEdit = isLiveEdit;
+    return *this;
+}
+
 } // namespace blink
diff --git a/third_party/WebKit/Source/core/inspector/v8/V8DebuggerListener.h b/third_party/WebKit/Source/core/inspector/v8/V8DebuggerListener.h
index d4dd99ac..f75a67b7 100644
--- a/third_party/WebKit/Source/core/inspector/v8/V8DebuggerListener.h
+++ b/third_party/WebKit/Source/core/inspector/v8/V8DebuggerListener.h
@@ -59,6 +59,7 @@
         int endColumn() const { return m_endColumn; }
         bool isContentScript() const { return m_isContentScript; }
         bool isInternalScript() const { return m_isInternalScript; }
+        bool isLiveEdit() const { return m_isLiveEdit; }
 
         bool getBlackboxedState(unsigned blackboxGeneration, bool* isBlackboxed) const;
         void setBlackboxedState(unsigned blackboxGeneration, bool isBlackboxed);
@@ -73,6 +74,7 @@
         Script& setEndColumn(int);
         Script& setIsContentScript(bool);
         Script& setIsInternalScript(bool);
+        Script& setIsLiveEdit(bool);
 
     private:
         String m_url;
@@ -85,6 +87,7 @@
         int m_endColumn;
         bool m_isContentScript;
         bool m_isInternalScript;
+        bool m_isLiveEdit;
         // Used from outside for caching.
         bool m_isBlackboxedURL;
         unsigned m_blackboxGeneration;
diff --git a/third_party/WebKit/Source/core/loader/FrameLoader.cpp b/third_party/WebKit/Source/core/loader/FrameLoader.cpp
index 71a27dae..28d99d96 100644
--- a/third_party/WebKit/Source/core/loader/FrameLoader.cpp
+++ b/third_party/WebKit/Source/core/loader/FrameLoader.cpp
@@ -1054,16 +1054,8 @@
     if (pdl != m_provisionalDocumentLoader)
         return false;
     if (m_documentLoader) {
-        // TODO(bokan): Temporarily added this flag to help track down how we're attaching
-        // new frames during the DocumentLoader detachment. crbug.com/519752.
-        if (m_frame->document())
-            m_frame->document()->m_detachingDocumentLoader = true;
-
         FrameNavigationDisabler navigationDisabler(m_frame);
         detachDocumentLoader(m_documentLoader);
-
-        if (m_frame->document())
-            m_frame->document()->m_detachingDocumentLoader = false;
     }
     // detachFromFrame() will abort XHRs that haven't completed, which can
     // trigger event listeners for 'abort'. These event listeners might detach
diff --git a/third_party/WebKit/Source/devtools/front_end/bindings/ContentProviderBasedProjectDelegate.js b/third_party/WebKit/Source/devtools/front_end/bindings/ContentProviderBasedProjectDelegate.js
index e1e5135..781783c1 100644
--- a/third_party/WebKit/Source/devtools/front_end/bindings/ContentProviderBasedProjectDelegate.js
+++ b/third_party/WebKit/Source/devtools/front_end/bindings/ContentProviderBasedProjectDelegate.js
@@ -350,7 +350,7 @@
     {
         var path = parentPath ? parentPath + "/" + name : name;
         if (this._contentProviders[path])
-            return path;
+            this.dispatchEventToListeners(WebInspector.ProjectDelegate.Events.FileRemoved, path);
         var fileDescriptor = new WebInspector.FileDescriptor(parentPath, name, originURL, contentProvider.contentType());
         this._contentProviders[path] = contentProvider;
         this.dispatchEventToListeners(WebInspector.ProjectDelegate.Events.FileAdded, fileDescriptor);
diff --git a/third_party/WebKit/Source/devtools/front_end/bindings/NetworkProject.js b/third_party/WebKit/Source/devtools/front_end/bindings/NetworkProject.js
index 95de11be..c4b43b3 100644
--- a/third_party/WebKit/Source/devtools/front_end/bindings/NetworkProject.js
+++ b/third_party/WebKit/Source/devtools/front_end/bindings/NetworkProject.js
@@ -154,7 +154,6 @@
     this._workspace = workspace;
     this._networkMapping = networkMapping;
     this._projectDelegates = {};
-    this._processedURLs = {};
     target[WebInspector.NetworkProject._networkProjectSymbol] = this;
 
     target.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.ResourceAdded, this._resourceAdded, this);
@@ -267,13 +266,14 @@
     /**
      * @param {string} url
      */
-    removeFileForURL: function(url)
+    _removeFileForURL: function(url)
     {
-        delete this._processedURLs[url];
         var splitURL = WebInspector.ParsedURL.splitURLIntoPathComponents(url);
         var projectURL = splitURL[0];
         var path = splitURL.slice(1).join("/");
         var projectDelegate = this._projectDelegates[WebInspector.NetworkProject.projectId(this.target(), projectURL, false)];
+        if (!projectDelegate)
+            return;
         projectDelegate.removeFile(path);
     },
 
@@ -304,7 +304,7 @@
     _parsedScriptSource: function(event)
     {
         var script = /** @type {!WebInspector.Script} */ (event.data);
-        if (!script.sourceURL || (script.isInlineScript() && !script.hasSourceURL))
+        if (!script.sourceURL || script.isLiveEdit() || (script.isInlineScript() && !script.hasSourceURL))
             return;
         // Filter out embedder injected content scripts.
         if (script.isContentScript() && !script.hasSourceURL) {
@@ -336,7 +336,7 @@
         if (header.isInline && !header.hasSourceURL && header.origin !== "inspector")
             return;
 
-        this.removeFileForURL(header.resourceURL());
+        this._removeFileForURL(header.resourceURL());
     },
 
     /**
@@ -353,8 +353,14 @@
      */
     _addResource: function(resource)
     {
-        if (resource.resourceType() === WebInspector.resourceTypes.Document)
-            this._addFile(resource.url, resource);
+        // Only load documents from resources.
+        if (resource.resourceType() !== WebInspector.resourceTypes.Document)
+            return;
+
+        // Never load document twice.
+        if (this._workspace.uiSourceCodeForOriginURL(resource.url))
+            return;
+        this._addFile(resource.url, resource);
     },
 
     /**
@@ -387,9 +393,6 @@
         var type = contentProvider.contentType();
         if (type !== WebInspector.resourceTypes.Stylesheet && type !== WebInspector.resourceTypes.Document && type !== WebInspector.resourceTypes.Script)
             return;
-        if (this._processedURLs[url])
-            return;
-        this._processedURLs[url] = true;
         var uiSourceCode = this.addFileForURL(url, contentProvider, isContentScript);
         uiSourceCode[WebInspector.NetworkProject._contentTypeSymbol] = type;
     },
@@ -415,7 +418,6 @@
 
     _reset: function()
     {
-        this._processedURLs = {};
         for (var projectId in this._projectDelegates)
             this._projectDelegates[projectId].reset();
         this._projectDelegates = {};
diff --git a/third_party/WebKit/Source/devtools/front_end/bindings/SASSSourceMapping.js b/third_party/WebKit/Source/devtools/front_end/bindings/SASSSourceMapping.js
index 946653a..7942d19 100644
--- a/third_party/WebKit/Source/devtools/front_end/bindings/SASSSourceMapping.js
+++ b/third_party/WebKit/Source/devtools/front_end/bindings/SASSSourceMapping.js
@@ -159,8 +159,6 @@
                 var sassURL = sources[i];
                 if (!this._networkMapping.hasMappingForURL(sassURL)) {
                     var contentProvider = sourceMap.sourceContentProvider(sassURL, WebInspector.resourceTypes.Stylesheet);
-                    // Override source map content providers.
-                    this._networkProject.removeFileForURL(sassURL);
                     this._networkProject.addFileForURL(sassURL, contentProvider);
                 }
             }
diff --git a/third_party/WebKit/Source/devtools/front_end/sdk/DebuggerModel.js b/third_party/WebKit/Source/devtools/front_end/sdk/DebuggerModel.js
index 968ac81d..4e6f0c8 100644
--- a/third_party/WebKit/Source/devtools/front_end/sdk/DebuggerModel.js
+++ b/third_party/WebKit/Source/devtools/front_end/sdk/DebuggerModel.js
@@ -585,14 +585,15 @@
      * @param {number} endColumn
      * @param {boolean} isContentScript
      * @param {boolean} isInternalScript
+     * @param {boolean} isLiveEdit
      * @param {string=} sourceMapURL
      * @param {boolean=} hasSourceURL
      * @param {boolean=} hasSyntaxError
      * @return {!WebInspector.Script}
      */
-    _parsedScriptSource: function(scriptId, sourceURL, startLine, startColumn, endLine, endColumn, isContentScript, isInternalScript, sourceMapURL, hasSourceURL, hasSyntaxError)
+    _parsedScriptSource: function(scriptId, sourceURL, startLine, startColumn, endLine, endColumn, isContentScript, isInternalScript, isLiveEdit, sourceMapURL, hasSourceURL, hasSyntaxError)
     {
-        var script = new WebInspector.Script(this, scriptId, sourceURL, startLine, startColumn, endLine, endColumn, isContentScript, isInternalScript, sourceMapURL, hasSourceURL);
+        var script = new WebInspector.Script(this, scriptId, sourceURL, startLine, startColumn, endLine, endColumn, isContentScript, isInternalScript, isLiveEdit, sourceMapURL, hasSourceURL);
         this._registerScript(script);
         if (!hasSyntaxError)
             this.dispatchEventToListeners(WebInspector.DebuggerModel.Events.ParsedScriptSource, script);
@@ -1009,12 +1010,13 @@
      * @param {number} endColumn
      * @param {boolean=} isContentScript
      * @param {boolean=} isInternalScript
+     * @param {boolean=} isLiveEdit
      * @param {string=} sourceMapURL
      * @param {boolean=} hasSourceURL
      */
-    scriptParsed: function(scriptId, sourceURL, startLine, startColumn, endLine, endColumn, isContentScript, isInternalScript, sourceMapURL, hasSourceURL)
+    scriptParsed: function(scriptId, sourceURL, startLine, startColumn, endLine, endColumn, isContentScript, isInternalScript, isLiveEdit, sourceMapURL, hasSourceURL)
     {
-        this._debuggerModel._parsedScriptSource(scriptId, sourceURL, startLine, startColumn, endLine, endColumn, !!isContentScript, !!isInternalScript, sourceMapURL, hasSourceURL, false);
+        this._debuggerModel._parsedScriptSource(scriptId, sourceURL, startLine, startColumn, endLine, endColumn, !!isContentScript, !!isInternalScript, !!isLiveEdit, sourceMapURL, hasSourceURL, false);
     },
 
     /**
@@ -1032,7 +1034,7 @@
      */
     scriptFailedToParse: function(scriptId, sourceURL, startLine, startColumn, endLine, endColumn, isContentScript, isInternalScript, sourceMapURL, hasSourceURL)
     {
-        this._debuggerModel._parsedScriptSource(scriptId, sourceURL, startLine, startColumn, endLine, endColumn, !!isContentScript, !!isInternalScript, sourceMapURL, hasSourceURL, true);
+        this._debuggerModel._parsedScriptSource(scriptId, sourceURL, startLine, startColumn, endLine, endColumn, !!isContentScript, !!isInternalScript, false, sourceMapURL, hasSourceURL, true);
     },
 
     /**
diff --git a/third_party/WebKit/Source/devtools/front_end/sdk/Script.js b/third_party/WebKit/Source/devtools/front_end/sdk/Script.js
index 46a7842..55a12edb 100644
--- a/third_party/WebKit/Source/devtools/front_end/sdk/Script.js
+++ b/third_party/WebKit/Source/devtools/front_end/sdk/Script.js
@@ -36,10 +36,11 @@
  * @param {number} endColumn
  * @param {boolean} isContentScript
  * @param {boolean} isInternalScript
+ * @param {boolean} isLiveEdit
  * @param {string=} sourceMapURL
  * @param {boolean=} hasSourceURL
  */
-WebInspector.Script = function(debuggerModel, scriptId, sourceURL, startLine, startColumn, endLine, endColumn, isContentScript, isInternalScript, sourceMapURL, hasSourceURL)
+WebInspector.Script = function(debuggerModel, scriptId, sourceURL, startLine, startColumn, endLine, endColumn, isContentScript, isInternalScript, isLiveEdit, sourceMapURL, hasSourceURL)
 {
     WebInspector.SDKObject.call(this, debuggerModel.target());
     this.debuggerModel = debuggerModel;
@@ -51,6 +52,7 @@
     this.endColumn = endColumn;
     this._isContentScript = isContentScript;
     this._isInternalScript = isInternalScript;
+    this._isLiveEdit = isLiveEdit;
     this.sourceMapURL = sourceMapURL;
     this.hasSourceURL = hasSourceURL;
 }
@@ -90,6 +92,14 @@
     },
 
     /**
+     * @return {boolean}
+     */
+    isLiveEdit: function()
+    {
+        return this._isLiveEdit;
+    },
+
+    /**
      * @override
      * @return {string}
      */
diff --git a/third_party/WebKit/Source/devtools/protocol.json b/third_party/WebKit/Source/devtools/protocol.json
index 099a0fa..eb6d7bd 100644
--- a/third_party/WebKit/Source/devtools/protocol.json
+++ b/third_party/WebKit/Source/devtools/protocol.json
@@ -3957,6 +3957,7 @@
                     { "name": "endColumn", "type": "integer", "description": "Length of the last line of the script." },
                     { "name": "isContentScript", "type": "boolean", "optional": true, "description": "Determines whether this script is a user extension script." },
                     { "name": "isInternalScript", "type": "boolean", "optional": true, "description": "Determines whether this script is an internal script.", "hidden": true },
+                    { "name": "isLiveEdit", "type": "boolean", "optional": true, "description": "True, if this script is generated as a result of the live edit operation.", "hidden": true },
                     { "name": "sourceMapURL", "type": "string", "optional": true, "description": "URL of source map associated with script (if any)." },
                     { "name": "hasSourceURL", "type": "boolean", "optional": true, "description": "True, if this script has sourceURL.", "hidden": true }
                 ],
@@ -5197,7 +5198,7 @@
             },
             { "id": "AXValueNativeSourceType",
               "type": "string",
-              "enum": [ "figcaption", "label", "labelfor", "labelwrapped", "tablecaption", "other" ],
+              "enum": [ "figcaption", "label", "labelfor", "labelwrapped", "legend", "tablecaption", "other" ],
               "description": "Enum of possible native property sources (as a subtype of a particular AXValueSourceType)."
             },
             {
diff --git a/third_party/WebKit/Source/modules/accessibility/AXImageMapLink.cpp b/third_party/WebKit/Source/modules/accessibility/AXImageMapLink.cpp
index 4ad21ce2..f222e23f 100644
--- a/third_party/WebKit/Source/modules/accessibility/AXImageMapLink.cpp
+++ b/third_party/WebKit/Source/modules/accessibility/AXImageMapLink.cpp
@@ -29,6 +29,7 @@
 #include "config.h"
 #include "modules/accessibility/AXImageMapLink.h"
 
+#include "core/dom/ElementTraversal.h"
 #include "modules/accessibility/AXLayoutObject.h"
 #include "modules/accessibility/AXObjectCacheImpl.h"
 
@@ -36,36 +37,26 @@
 
 using namespace HTMLNames;
 
-AXImageMapLink::AXImageMapLink(AXObjectCacheImpl& axObjectCache)
-    : AXMockObject(axObjectCache)
-    , m_areaElement(nullptr)
-    , m_mapElement(nullptr)
+AXImageMapLink::AXImageMapLink(HTMLAreaElement* area, AXObjectCacheImpl& axObjectCache)
+    : AXNodeObject(area, axObjectCache)
 {
 }
 
 AXImageMapLink::~AXImageMapLink()
 {
-    ASSERT(!m_areaElement);
-    ASSERT(!m_mapElement);
 }
 
-void AXImageMapLink::detach()
+AXImageMapLink* AXImageMapLink::create(HTMLAreaElement* area, AXObjectCacheImpl& axObjectCache)
 {
-    AXMockObject::detach();
-    m_areaElement = nullptr;
-    m_mapElement = nullptr;
+    return new AXImageMapLink(area, axObjectCache);
 }
 
-void AXImageMapLink::detachFromParent()
+HTMLMapElement* AXImageMapLink::mapElement() const
 {
-    AXMockObject::detachFromParent();
-    m_areaElement = nullptr;
-    m_mapElement = nullptr;
-}
-
-AXImageMapLink* AXImageMapLink::create(AXObjectCacheImpl& axObjectCache)
-{
-    return new AXImageMapLink(axObjectCache);
+    HTMLAreaElement* area = areaElement();
+    if (!area)
+        return nullptr;
+    return Traversal<HTMLMapElement>::firstAncestor(*area);
 }
 
 AXObject* AXImageMapLink::computeParent() const
@@ -73,17 +64,14 @@
     if (m_parent)
         return m_parent;
 
-    if (!m_mapElement.get() || !m_mapElement->layoutObject())
-        return 0;
+    if (!mapElement())
+        return nullptr;
 
-    return axObjectCache().getOrCreate(m_mapElement->layoutObject());
+    return axObjectCache().getOrCreate(mapElement()->layoutObject());
 }
 
 AccessibilityRole AXImageMapLink::roleValue() const
 {
-    if (!m_areaElement)
-        return LinkRole;
-
     const AtomicString& ariaRole = getAttribute(roleAttr);
     if (!ariaRole.isEmpty())
         return AXObject::ariaRoleToWebCoreRole(ariaRole);
@@ -91,6 +79,11 @@
     return LinkRole;
 }
 
+bool AXImageMapLink::computeAccessibilityIsIgnored(IgnoredReasons* ignoredReasons) const
+{
+    return accessibilityIsIgnoredByDefault(ignoredReasons);
+}
+
 Element* AXImageMapLink::actionElement() const
 {
     return anchorElement();
@@ -98,15 +91,15 @@
 
 Element* AXImageMapLink::anchorElement() const
 {
-    return m_areaElement.get();
+    return node() ? toElement(node()) : nullptr;
 }
 
 KURL AXImageMapLink::url() const
 {
-    if (!m_areaElement.get())
+    if (!areaElement())
         return KURL();
 
-    return m_areaElement->href();
+    return areaElement()->href();
 }
 
 String AXImageMapLink::deprecatedAccessibilityDescription() const
@@ -135,26 +128,26 @@
 
 LayoutRect AXImageMapLink::elementRect() const
 {
-    if (!m_mapElement.get() || !m_areaElement.get())
+    HTMLAreaElement* area = areaElement();
+    HTMLMapElement* map = mapElement();
+    if (!area || !map)
         return LayoutRect();
 
     LayoutObject* layoutObject;
     if (m_parent && m_parent->isAXLayoutObject())
         layoutObject = toAXLayoutObject(m_parent)->layoutObject();
     else
-        layoutObject = m_mapElement->layoutObject();
+        layoutObject = map->layoutObject();
 
     if (!layoutObject)
         return LayoutRect();
 
-    return m_areaElement->computeRect(layoutObject);
+    return area->computeRect(layoutObject);
 }
 
 DEFINE_TRACE(AXImageMapLink)
 {
-    visitor->trace(m_areaElement);
-    visitor->trace(m_mapElement);
-    AXMockObject::trace(visitor);
+    AXNodeObject::trace(visitor);
 }
 
 } // namespace blink
diff --git a/third_party/WebKit/Source/modules/accessibility/AXImageMapLink.h b/third_party/WebKit/Source/modules/accessibility/AXImageMapLink.h
index 58d8648f..27ac9f4 100644
--- a/third_party/WebKit/Source/modules/accessibility/AXImageMapLink.h
+++ b/third_party/WebKit/Source/modules/accessibility/AXImageMapLink.h
@@ -31,32 +31,29 @@
 
 #include "core/html/HTMLAreaElement.h"
 #include "core/html/HTMLMapElement.h"
-#include "modules/accessibility/AXMockObject.h"
+#include "modules/accessibility/AXNodeObject.h"
 
 namespace blink {
 
 class AXObjectCacheImpl;
 
-class AXImageMapLink final : public AXMockObject {
+class AXImageMapLink final : public AXNodeObject {
 
 private:
-    explicit AXImageMapLink(AXObjectCacheImpl&);
+    explicit AXImageMapLink(HTMLAreaElement*, AXObjectCacheImpl&);
 
 public:
-    static AXImageMapLink* create(AXObjectCacheImpl&);
+    static AXImageMapLink* create(HTMLAreaElement*, AXObjectCacheImpl&);
     ~AXImageMapLink() override;
     DECLARE_VIRTUAL_TRACE();
 
-    void setHTMLAreaElement(HTMLAreaElement* element) { m_areaElement = element; }
-    HTMLAreaElement* areaElement() const { return m_areaElement.get(); }
+    HTMLAreaElement* areaElement() const { return toHTMLAreaElement(node()); }
 
-    void setHTMLMapElement(HTMLMapElement* element) { m_mapElement = element; }
-    HTMLMapElement* mapElement() const { return m_mapElement.get(); }
-
-    Node* node() const override { return m_areaElement.get(); }
+    HTMLMapElement* mapElement() const;
 
     AccessibilityRole roleValue() const override;
     bool isEnabled() const override { return true; }
+    bool computeAccessibilityIsIgnored(IgnoredReasons* = nullptr) const override;
 
     Element* anchorElement() const override;
     Element* actionElement() const override;
@@ -70,12 +67,6 @@
     LayoutRect elementRect() const override;
 
 private:
-    RefPtrWillBeMember<HTMLAreaElement> m_areaElement;
-    RefPtrWillBeMember<HTMLMapElement> m_mapElement;
-
-    void detach() override;
-    void detachFromParent() override;
-
     bool isImageMapLink() const override { return true; }
 };
 
diff --git a/third_party/WebKit/Source/modules/accessibility/AXLayoutObject.cpp b/third_party/WebKit/Source/modules/accessibility/AXLayoutObject.cpp
index fb97ce9..655ecc9 100644
--- a/third_party/WebKit/Source/modules/accessibility/AXLayoutObject.cpp
+++ b/third_party/WebKit/Source/modules/accessibility/AXLayoutObject.cpp
@@ -2474,10 +2474,9 @@
 
     for (HTMLAreaElement& area : Traversal<HTMLAreaElement>::descendantsOf(*map)) {
         // add an <area> element for this child if it has a link
-        if (area.isLink()) {
-            AXImageMapLink* areaObject = toAXImageMapLink(axObjectCache().getOrCreate(ImageMapLinkRole));
-            areaObject->setHTMLAreaElement(&area);
-            areaObject->setHTMLMapElement(map);
+        AXObject* obj = axObjectCache().getOrCreate(&area);
+        if (obj) {
+            AXImageMapLink* areaObject = toAXImageMapLink(obj);
             areaObject->setParent(this);
             ASSERT(areaObject->axObjectID() != 0);
             if (!areaObject->accessibilityIsIgnored())
diff --git a/third_party/WebKit/Source/modules/accessibility/AXNodeObject.cpp b/third_party/WebKit/Source/modules/accessibility/AXNodeObject.cpp
index 2dbb8dc..e2103b1 100644
--- a/third_party/WebKit/Source/modules/accessibility/AXNodeObject.cpp
+++ b/third_party/WebKit/Source/modules/accessibility/AXNodeObject.cpp
@@ -30,6 +30,7 @@
 #include "modules/accessibility/AXNodeObject.h"
 
 #include "core/InputTypeNames.h"
+#include "core/dom/Element.h"
 #include "core/dom/NodeTraversal.h"
 #include "core/dom/Text.h"
 #include "core/dom/shadow/ComposedTreeTraversal.h"
@@ -1499,6 +1500,15 @@
     if (node->isTextNode())
         return deprecatedTextUnderElement(TextUnderElementAll);
 
+    return stringValueOfControl();
+}
+
+String AXNodeObject::stringValueOfControl() const
+{
+    Node* node = this->node();
+    if (!node)
+        return String();
+
     if (isHTMLSelectElement(*node)) {
         HTMLSelectElement& selectElement = toHTMLSelectElement(*node);
         int selectedIndex = selectElement.selectedIndex();
@@ -1516,10 +1526,15 @@
     if (isNativeTextControl())
         return text();
 
-    // FIXME: We might need to implement a value here for more types
-    // FIXME: It would be better not to advertise a value at all for the types for which we don't implement one;
-    // this would require subclassing or making accessibilityAttributeNames do something other than return a
-    // single static array.
+    // Handle other HTML input elements that aren't text controls, like date and time
+    // controls, by returning the string value, with the exception of checkboxes
+    // and radio buttons (which would return "on").
+    if (isHTMLInputElement(node)) {
+        HTMLInputElement* input = toHTMLInputElement(node);
+        if (input->type() != InputTypeNames::checkbox && input->type() != InputTypeNames::radio)
+            return input->value();
+    }
+
     return String();
 }
 
@@ -1925,14 +1940,14 @@
     // Step 2E from: http://www.w3.org/TR/accname-aam-1.1
     if (recursive && !inAriaLabelledByTraversal && isControl()) {
         // No need to set any name source info in a recursive call.
-        if (roleValue() == TextFieldRole || roleValue() == ComboBoxRole)
-            return text();
         if (isRange()) {
             const AtomicString& ariaValuetext = getAttribute(aria_valuetextAttr);
             if (!ariaValuetext.isNull())
                 return ariaValuetext.string();
             return String::number(valueForRange());
         }
+
+        return stringValueOfControl();
     }
 
     // Step 2F / 2G from: http://www.w3.org/TR/accname-aam-1.1
@@ -1946,6 +1961,8 @@
         Node* node = this->node();
         if (node && node->isTextNode())
             textAlternative = toText(node)->wholeText();
+        else if (isHTMLBRElement(node))
+            textAlternative = String("\n");
         else
             textAlternative = textFromDescendants(visited);
 
@@ -1998,6 +2015,10 @@
     StringBuilder accumulatedText;
     AXObject* previous = nullptr;
     for (AXObject* child = firstChild(); child; child = child->nextSibling()) {
+        // Skip hidden children
+        if (child->isInertOrAriaHidden())
+            continue;
+
         // If we're going between two layoutObjects that are in separate LayoutBoxes, add
         // whitespace if it wasn't there already. Intuitively if you have
         // <span>Hello</span><span>World</span>, those are part of the same LayoutBox
@@ -2225,6 +2246,9 @@
     if (!node() && !isAXLayoutObject())
         return false;
 
+    if (node() && isHTMLMapElement(node()))
+        return false;
+
     // Elements that should not have children
     switch (roleValue()) {
     case ImageRole:
@@ -2762,8 +2786,8 @@
         return textAlternative;
     }
 
-    // 5.8 img Element
-    if (isHTMLImageElement(node())) {
+    // 5.8 img or area Element
+    if (isHTMLImageElement(node()) || isHTMLAreaElement(node()) || (layoutObject() && layoutObject()->isSVGImage())) {
         // alt
         nameFrom = AXNameFromAttribute;
         if (nameSources) {
@@ -2840,6 +2864,39 @@
         return textAlternative;
     }
 
+    // Fieldset / legend.
+    if (isHTMLFieldSetElement(node())) {
+        nameFrom = AXNameFromRelatedElement;
+        if (nameSources) {
+            nameSources->append(NameSource(*foundTextAlternative));
+            nameSources->last().type = nameFrom;
+            nameSources->last().nativeSource = AXTextFromNativeHTMLLegend;
+        }
+        HTMLElement* legend = toHTMLFieldSetElement(node())->legend();
+        if (legend) {
+            AXObject* legendAXObject = axObjectCache().getOrCreate(legend);
+            // Avoid an infinite loop
+            if (legendAXObject && !visited.contains(legendAXObject)) {
+                textAlternative = recursiveTextAlternative(*legendAXObject, false, visited);
+
+                if (relatedObjects) {
+                    localRelatedObjects.append(new NameSourceRelatedObject(legendAXObject, textAlternative));
+                    *relatedObjects = localRelatedObjects;
+                    localRelatedObjects.clear();
+                }
+
+                if (nameSources) {
+                    NameSource& source = nameSources->last();
+                    source.relatedObjects = *relatedObjects;
+                    source.text = textAlternative;
+                    *foundTextAlternative = true;
+                } else {
+                    return textAlternative;
+                }
+            }
+        }
+    }
+
     return textAlternative;
 }
 
@@ -3019,6 +3076,24 @@
         }
     }
 
+    // aria-help.
+    // FIXME: this is not part of the official standard, but it's needed because the built-in date/time controls use it.
+    descriptionFrom = AXDescriptionFromAttribute;
+    if (descriptionSources) {
+        descriptionSources->append(DescriptionSource(foundDescription, aria_helpAttr));
+        descriptionSources->last().type = descriptionFrom;
+    }
+    const AtomicString& help = getAttribute(aria_helpAttr);
+    if (!help.isEmpty()) {
+        description = help;
+        if (descriptionSources) {
+            foundDescription = true;
+            descriptionSources->last().text = description;
+        } else {
+            return description;
+        }
+    }
+
     descriptionFrom = AXDescriptionFromUninitialized;
 
     if (foundDescription) {
@@ -3042,4 +3117,4 @@
     AXObject::trace(visitor);
 }
 
-} // namespace blink
+} // namespace blin
diff --git a/third_party/WebKit/Source/modules/accessibility/AXNodeObject.h b/third_party/WebKit/Source/modules/accessibility/AXNodeObject.h
index 576ab621..0061dbb9 100644
--- a/third_party/WebKit/Source/modules/accessibility/AXNodeObject.h
+++ b/third_party/WebKit/Source/modules/accessibility/AXNodeObject.h
@@ -108,7 +108,7 @@
     bool isImage() const final;
     bool isImageButton() const;
     bool isInputImage() const final;
-    bool isLink() const final;
+    bool isLink() const override;
     bool isMenu() const final;
     bool isMenuButton() const final;
     bool isMeter() const final;
@@ -190,7 +190,7 @@
     void insertChild(AXObject*, unsigned index);
 
     // DOM and Render tree access.
-    Element* actionElement() const final;
+    Element* actionElement() const override;
     Element* anchorElement() const override;
     Document* document() const override;
     Node* node() const override { return m_node; }
@@ -228,6 +228,7 @@
     float stepValueForRange() const;
     AXObject* findChildWithTagName(const HTMLQualifiedName&) const;
     bool isDescendantOfElementType(const HTMLQualifiedName& tagName) const;
+    String stringValueOfControl() const;
 };
 
 DEFINE_AX_OBJECT_TYPE_CASTS(AXNodeObject, isAXNodeObject());
diff --git a/third_party/WebKit/Source/modules/accessibility/AXObject.cpp b/third_party/WebKit/Source/modules/accessibility/AXObject.cpp
index 3b68f15f..a42851d 100644
--- a/third_party/WebKit/Source/modules/accessibility/AXObject.cpp
+++ b/third_party/WebKit/Source/modules/accessibility/AXObject.cpp
@@ -36,6 +36,7 @@
 #include "core/frame/Settings.h"
 #include "core/html/HTMLDialogElement.h"
 #include "core/html/HTMLFrameOwnerElement.h"
+#include "core/html/parser/HTMLParserIdioms.h"
 #include "core/layout/LayoutListItem.h"
 #include "core/layout/LayoutTheme.h"
 #include "core/layout/LayoutView.h"
@@ -680,6 +681,10 @@
     HeapHashSet<Member<const AXObject>> visited;
     AXRelatedObjectVector relatedObjects;
     String text = textAlternative(false, false, visited, nameFrom, &relatedObjects, nullptr);
+
+    if (!node() || !isHTMLBRElement(node()))
+        text = text.simplifyWhiteSpace(isHTMLSpace<UChar>);
+
     if (nameObjects) {
         nameObjects->clear();
         for (size_t i = 0; i < relatedObjects.size(); i++)
@@ -693,7 +698,9 @@
     AXObjectSet visited;
     AXNameFrom tmpNameFrom;
     AXRelatedObjectVector tmpRelatedObjects;
-    return textAlternative(false, false, visited, tmpNameFrom, &tmpRelatedObjects, nameSources);
+    String text = textAlternative(false, false, visited, tmpNameFrom, &tmpRelatedObjects, nameSources);
+    text = text.simplifyWhiteSpace(isHTMLSpace<UChar>);
+    return text;
 }
 
 String AXObject::recursiveTextAlternative(const AXObject& axObj, bool inAriaLabelledByTraversal, AXObjectSet& visited)
@@ -1462,21 +1469,23 @@
     switch (roleValue()) {
     case ButtonRole:
     case CheckBoxRole:
-    case CellRole:
-    case ColumnHeaderRole:
     case DirectoryRole:
     case DisclosureTriangleRole:
+    case HeadingRole:
+    case LineBreakRole:
     case LinkRole:
+    case ListBoxOptionRole:
     case ListItemRole:
     case MenuItemRole:
     case MenuItemCheckBoxRole:
     case MenuItemRadioRole:
     case MenuListOptionRole:
     case RadioButtonRole:
-    case RowHeaderRole:
     case StaticTextRole:
     case StatusRole:
     case SwitchRole:
+    case TabRole:
+    case ToggleButtonRole:
     case TreeItemRole:
         return true;
     default:
diff --git a/third_party/WebKit/Source/modules/accessibility/AXObject.h b/third_party/WebKit/Source/modules/accessibility/AXObject.h
index dc5b6a4..d7c86a49 100644
--- a/third_party/WebKit/Source/modules/accessibility/AXObject.h
+++ b/third_party/WebKit/Source/modules/accessibility/AXObject.h
@@ -335,6 +335,7 @@
     AXTextFromNativeHTMLLabel,
     AXTextFromNativeHTMLLabelFor,
     AXTextFromNativeHTMLLabelWrapped,
+    AXTextFromNativeHTMLLegend,
     AXTextFromNativeHTMLTableCaption,
 };
 
diff --git a/third_party/WebKit/Source/modules/accessibility/AXObjectCacheImpl.cpp b/third_party/WebKit/Source/modules/accessibility/AXObjectCacheImpl.cpp
index faab5b8..c786f17c 100644
--- a/third_party/WebKit/Source/modules/accessibility/AXObjectCacheImpl.cpp
+++ b/third_party/WebKit/Source/modules/accessibility/AXObjectCacheImpl.cpp
@@ -231,13 +231,18 @@
     if (!node)
         return 0;
 
-    AXID layoutID = node->layoutObject() ? m_layoutObjectMapping.get(node->layoutObject()) : 0;
+    // Menu list option and HTML area elements are indexed by DOM node, never by layout object.
+    LayoutObject* layoutObject = node->layoutObject();
+    if (isMenuListOption(node) || isHTMLAreaElement(node))
+        layoutObject = nullptr;
+
+    AXID layoutID = layoutObject ? m_layoutObjectMapping.get(layoutObject) : 0;
     ASSERT(!HashTraits<AXID>::isDeletedValue(layoutID));
 
     AXID nodeID = m_nodeObjectMapping.get(node);
     ASSERT(!HashTraits<AXID>::isDeletedValue(nodeID));
 
-    if (node->layoutObject() && nodeID && !layoutID && !isMenuListOption(node)) {
+    if (layoutObject && nodeID && !layoutID) {
         // This can happen if an AXNodeObject is created for a node that's not
         // laid out, but later something changes and it gets a layoutObject (like if it's
         // reparented).
@@ -338,6 +343,9 @@
     if (isMenuListOption(node))
         return AXMenuListOption::create(toHTMLOptionElement(node), *this);
 
+    if (isHTMLAreaElement(node))
+        return AXImageMapLink::create(toHTMLAreaElement(node), *this);
+
     return AXNodeObject::create(node, *this);
 }
 
@@ -392,7 +400,9 @@
     if (AXObject* obj = get(node))
         return obj;
 
-    if (node->layoutObject())
+    // If the node has a layout object, prefer using that as the primary key for the AXObject,
+    // with the exception of an HTMLAreaElement, which is created based on its node.
+    if (node->layoutObject() && !isHTMLAreaElement(node))
         return getOrCreate(node->layoutObject());
 
     if (!node->parentElement())
@@ -479,9 +489,6 @@
 
     // will be filled in...
     switch (role) {
-    case ImageMapLinkRole:
-        obj = AXImageMapLink::create(*this);
-        break;
     case ColumnRole:
         obj = AXTableColumn::create(*this);
         break;
diff --git a/third_party/WebKit/Source/modules/accessibility/InspectorTypeBuilderHelper.cpp b/third_party/WebKit/Source/modules/accessibility/InspectorTypeBuilderHelper.cpp
index 9c85f45..2200acb8 100644
--- a/third_party/WebKit/Source/modules/accessibility/InspectorTypeBuilderHelper.cpp
+++ b/third_party/WebKit/Source/modules/accessibility/InspectorTypeBuilderHelper.cpp
@@ -214,6 +214,8 @@
         return AXValueNativeSourceType::Labelwrapped;
     case AXTextFromNativeHTMLTableCaption:
         return AXValueNativeSourceType::Tablecaption;
+    case AXTextFromNativeHTMLLegend:
+        return AXValueNativeSourceType::Legend;
     default:
         return AXValueNativeSourceType::Other;
     }
diff --git a/third_party/WebKit/Source/modules/webaudio/BiquadDSPKernel.cpp b/third_party/WebKit/Source/modules/webaudio/BiquadDSPKernel.cpp
index a11c895..112fc98 100644
--- a/third_party/WebKit/Source/modules/webaudio/BiquadDSPKernel.cpp
+++ b/third_party/WebKit/Source/modules/webaudio/BiquadDSPKernel.cpp
@@ -27,7 +27,6 @@
 #include "modules/webaudio/BiquadDSPKernel.h"
 
 #include "platform/FloatConversion.h"
-#include "platform/audio/AudioUtilities.h"
 #include "wtf/Vector.h"
 #include <limits.h>
 
@@ -39,79 +38,73 @@
 // settings of the Biquad.
 static const double MaxBiquadDelayTime = 0.2;
 
-void BiquadDSPKernel::updateCoefficientsIfNecessary(int framesToProcess)
+void BiquadDSPKernel::updateCoefficientsIfNecessary()
 {
     if (biquadProcessor()->filterCoefficientsDirty()) {
-        float cutoffFrequency[AudioUtilities::kRenderQuantumFrames];
-        float Q[AudioUtilities::kRenderQuantumFrames];
-        float gain[AudioUtilities::kRenderQuantumFrames];
-        float detune[AudioUtilities::kRenderQuantumFrames]; // in Cents
+        double cutoffFrequency;
+        double Q;
+        double gain;
+        double detune; // in Cents
 
         if (biquadProcessor()->hasSampleAccurateValues()) {
-            biquadProcessor()->parameter1().calculateSampleAccurateValues(cutoffFrequency, framesToProcess);
-            biquadProcessor()->parameter2().calculateSampleAccurateValues(Q, framesToProcess);
-            biquadProcessor()->parameter3().calculateSampleAccurateValues(gain, framesToProcess);
-            biquadProcessor()->parameter4().calculateSampleAccurateValues(detune, framesToProcess);
-            updateCoefficients(framesToProcess, cutoffFrequency, Q, gain, detune);
+            cutoffFrequency = biquadProcessor()->parameter1().finalValue();
+            Q = biquadProcessor()->parameter2().finalValue();
+            gain = biquadProcessor()->parameter3().finalValue();
+            detune = biquadProcessor()->parameter4().finalValue();
         } else {
-            cutoffFrequency[0] = biquadProcessor()->parameter1().smoothedValue();
-            Q[0] = biquadProcessor()->parameter2().smoothedValue();
-            gain[0] = biquadProcessor()->parameter3().smoothedValue();
-            detune[0] = biquadProcessor()->parameter4().smoothedValue();
-            updateCoefficients(1, cutoffFrequency, Q, gain, detune);
+            cutoffFrequency = biquadProcessor()->parameter1().smoothedValue();
+            Q = biquadProcessor()->parameter2().smoothedValue();
+            gain = biquadProcessor()->parameter3().smoothedValue();
+            detune = biquadProcessor()->parameter4().smoothedValue();
         }
+
+        updateCoefficients(cutoffFrequency, Q, gain, detune);
     }
 }
 
-void BiquadDSPKernel::updateCoefficients(int numberOfFrames, const float* cutoffFrequency, const float* Q, const float* gain, const float* detune)
+void BiquadDSPKernel::updateCoefficients(double cutoffFrequency, double Q, double gain, double detune)
 {
     // Convert from Hertz to normalized frequency 0 -> 1.
     double nyquist = this->nyquist();
+    double normalizedFrequency = cutoffFrequency / nyquist;
 
+    // Offset frequency by detune.
+    if (detune)
+        normalizedFrequency *= pow(2, detune / 1200);
 
-    m_biquad.setHasSampleAccurateValues(numberOfFrames > 1);
+    // Configure the biquad with the new filter parameters for the appropriate type of filter.
+    switch (biquadProcessor()->type()) {
+    case BiquadProcessor::LowPass:
+        m_biquad.setLowpassParams(normalizedFrequency, Q);
+        break;
 
-    for (int k = 0; k < numberOfFrames; ++k) {
-        double normalizedFrequency = cutoffFrequency[k] / nyquist;
+    case BiquadProcessor::HighPass:
+        m_biquad.setHighpassParams(normalizedFrequency, Q);
+        break;
 
-        // Offset frequency by detune.
-        if (detune[k])
-            normalizedFrequency *= pow(2, detune[k] / 1200);
+    case BiquadProcessor::BandPass:
+        m_biquad.setBandpassParams(normalizedFrequency, Q);
+        break;
 
-        // Configure the biquad with the new filter parameters for the appropriate type of filter.
-        switch (biquadProcessor()->type()) {
-        case BiquadProcessor::LowPass:
-            m_biquad.setLowpassParams(k, normalizedFrequency, Q[k]);
-            break;
+    case BiquadProcessor::LowShelf:
+        m_biquad.setLowShelfParams(normalizedFrequency, gain);
+        break;
 
-        case BiquadProcessor::HighPass:
-            m_biquad.setHighpassParams(k, normalizedFrequency, Q[k]);
-            break;
+    case BiquadProcessor::HighShelf:
+        m_biquad.setHighShelfParams(normalizedFrequency, gain);
+        break;
 
-        case BiquadProcessor::BandPass:
-            m_biquad.setBandpassParams(k, normalizedFrequency, Q[k]);
-            break;
+    case BiquadProcessor::Peaking:
+        m_biquad.setPeakingParams(normalizedFrequency, Q, gain);
+        break;
 
-        case BiquadProcessor::LowShelf:
-            m_biquad.setLowShelfParams(k, normalizedFrequency, gain[k]);
-            break;
+    case BiquadProcessor::Notch:
+        m_biquad.setNotchParams(normalizedFrequency, Q);
+        break;
 
-        case BiquadProcessor::HighShelf:
-            m_biquad.setHighShelfParams(k, normalizedFrequency, gain[k]);
-            break;
-
-        case BiquadProcessor::Peaking:
-            m_biquad.setPeakingParams(k, normalizedFrequency, Q[k], gain[k]);
-            break;
-
-        case BiquadProcessor::Notch:
-            m_biquad.setNotchParams(k, normalizedFrequency, Q[k]);
-            break;
-
-        case BiquadProcessor::Allpass:
-            m_biquad.setAllpassParams(k, normalizedFrequency, Q[k]);
-            break;
-        }
+    case BiquadProcessor::Allpass:
+        m_biquad.setAllpassParams(normalizedFrequency, Q);
+        break;
     }
 }
 
@@ -131,7 +124,7 @@
     {
         MutexTryLocker tryLocker(m_processLock);
         if (tryLocker.locked())
-            updateCoefficientsIfNecessary(framesToProcess);
+            updateCoefficientsIfNecessary();
     }
 
     m_biquad.process(source, destination, framesToProcess);
@@ -153,10 +146,10 @@
     for (int k = 0; k < nFrequencies; ++k)
         frequency[k] = narrowPrecisionToFloat(frequencyHz[k] / nyquist);
 
-    float cutoffFrequency;
-    float Q;
-    float gain;
-    float detune; // in Cents
+    double cutoffFrequency;
+    double Q;
+    double gain;
+    double detune; // in Cents
 
     {
         // Get a copy of the current biquad filter coefficients so we can update the biquad with
@@ -179,7 +172,7 @@
         detune = biquadProcessor()->parameter4().value();
     }
 
-    updateCoefficients(1, &cutoffFrequency, &Q, &gain, &detune);
+    updateCoefficients(cutoffFrequency, Q, gain, detune);
 
     m_biquad.getFrequencyResponse(nFrequencies, frequency.data(), magResponse, phaseResponse);
 }
diff --git a/third_party/WebKit/Source/modules/webaudio/BiquadDSPKernel.h b/third_party/WebKit/Source/modules/webaudio/BiquadDSPKernel.h
index 971ef5e..fff8fa9 100644
--- a/third_party/WebKit/Source/modules/webaudio/BiquadDSPKernel.h
+++ b/third_party/WebKit/Source/modules/webaudio/BiquadDSPKernel.h
@@ -59,9 +59,9 @@
 
     // To prevent audio glitches when parameters are changed,
     // dezippering is used to slowly change the parameters.
-    void updateCoefficientsIfNecessary(int);
+    void updateCoefficientsIfNecessary();
     // Update the biquad cofficients with the given parameters
-    void updateCoefficients(int, const float* frequency, const float* Q, const float* gain, const float* detune);
+    void updateCoefficients(double frequency, double Q, double gain, double detune);
 
 private:
     // Synchronize process() with getting and setting the filter coefficients.
diff --git a/third_party/WebKit/Source/modules/webusb/USB.cpp b/third_party/WebKit/Source/modules/webusb/USB.cpp
index 213b3aaf..af7db903 100644
--- a/third_party/WebKit/Source/modules/webusb/USB.cpp
+++ b/third_party/WebKit/Source/modules/webusb/USB.cpp
@@ -18,6 +18,7 @@
 #include "modules/webusb/USBDeviceFilter.h"
 #include "modules/webusb/USBDeviceRequestOptions.h"
 #include "modules/webusb/USBError.h"
+#include "platform/UserGestureIndicator.h"
 #include "public/platform/Platform.h"
 #include "public/platform/WebVector.h"
 #include "public/platform/modules/webusb/WebUSBClient.h"
@@ -93,6 +94,10 @@
     if (!m_client)
         return ScriptPromise::rejectWithDOMException(scriptState, DOMException::create(NotSupportedError));
 
+    String errorMessage;
+    if (!scriptState->executionContext()->isSecureContext(errorMessage))
+        return ScriptPromise::rejectWithDOMException(scriptState, DOMException::create(SecurityError, errorMessage));
+
     ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState);
     ScriptPromise promise = resolver->promise();
     m_client->getDevices(new CallbackPromiseAdapter<DeviceArray, USBError>(resolver));
@@ -105,6 +110,13 @@
     if (!m_client)
         return ScriptPromise::rejectWithDOMException(scriptState, DOMException::create(NotSupportedError));
 
+    String errorMessage;
+    if (!scriptState->executionContext()->isSecureContext(errorMessage))
+        return ScriptPromise::rejectWithDOMException(scriptState, DOMException::create(SecurityError, errorMessage));
+
+    if (!UserGestureIndicator::consumeUserGesture())
+        return ScriptPromise::rejectWithDOMException(scriptState, DOMException::create(SecurityError, "Must be handling a user gesture to show a permission request."));
+
     ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState);
     ScriptPromise promise = resolver->promise();
 
diff --git a/third_party/WebKit/Source/platform/audio/AudioUtilities.h b/third_party/WebKit/Source/platform/audio/AudioUtilities.h
index 68bf2a3..6e0d9cb 100644
--- a/third_party/WebKit/Source/platform/audio/AudioUtilities.h
+++ b/third_party/WebKit/Source/platform/audio/AudioUtilities.h
@@ -31,10 +31,6 @@
 namespace blink {
 namespace AudioUtilities {
 
-// Rendering quantum size.  This is how many frames are processed at a time for each node in the
-// audio graph.
-static const unsigned kRenderQuantumFrames = 128;
-
 // Standard functions for converting to and from decibel values from linear.
 PLATFORM_EXPORT float linearToDecibels(float);
 PLATFORM_EXPORT float decibelsToLinear(float);
diff --git a/third_party/WebKit/Source/platform/audio/Biquad.cpp b/third_party/WebKit/Source/platform/audio/Biquad.cpp
index 9fb50056..e614c7c 100644
--- a/third_party/WebKit/Source/platform/audio/Biquad.cpp
+++ b/third_party/WebKit/Source/platform/audio/Biquad.cpp
@@ -32,13 +32,11 @@
 
 #include "platform/audio/Biquad.h"
 
-#include "platform/audio/AudioUtilities.h"
+#include <stdio.h>
+#include <algorithm>
 #include "platform/audio/DenormalDisabler.h"
 #include "wtf/MathExtras.h"
 
-#include <algorithm>
-#include <stdio.h>
-
 #if OS(MACOSX)
 #include <Accelerate/Accelerate.h>
 #endif
@@ -50,7 +48,6 @@
 #endif
 
 Biquad::Biquad()
-    : m_hasSampleAccurateValues(false)
 {
 #if OS(MACOSX)
     // Allocate two samples more for filter history
@@ -64,16 +61,8 @@
     m_ippInternalBuffer = ippsMalloc_8u(bufferSize);
 #endif // USE(WEBAUDIO_IPP)
 
-    // Allocate enough space for the a-rate filter coefficients to handle a rendering quantum of 128
-    // frames.
-    m_b0.allocate(AudioUtilities::kRenderQuantumFrames);
-    m_b1.allocate(AudioUtilities::kRenderQuantumFrames);
-    m_b2.allocate(AudioUtilities::kRenderQuantumFrames);
-    m_a1.allocate(AudioUtilities::kRenderQuantumFrames);
-    m_a2.allocate(AudioUtilities::kRenderQuantumFrames);
-
     // Initialize as pass-thru (straight-wire, no filter effect)
-    setNormalizedCoefficients(0, 1, 0, 0, 1, 0, 0);
+    setNormalizedCoefficients(1, 0, 0, 1, 0, 0);
 
     reset(); // clear filter memory
 }
@@ -87,111 +76,55 @@
 
 void Biquad::process(const float* sourceP, float* destP, size_t framesToProcess)
 {
-    if (hasSampleAccurateValues()) {
-        int n = framesToProcess;
-
-        // Create local copies of member variables
-        double x1 = m_x1;
-        double x2 = m_x2;
-        double y1 = m_y1;
-        double y2 = m_y2;
-
-        const double* b0 = m_b0.data();
-        const double* b1 = m_b1.data();
-        const double* b2 = m_b2.data();
-        const double* a1 = m_a1.data();
-        const double* a2 = m_a2.data();
-
-        for (int k = 0; k < n; ++k) {
-            // FIXME: this can be optimized by pipelining the multiply adds...
-            float x = *sourceP++;
-            float y = b0[k]*x + b1[k]*x1 + b2[k]*x2 - a1[k]*y1 - a2[k]*y2;
-
-            *destP++ = y;
-
-            // Update state variables
-            x2 = x1;
-            x1 = x;
-            y2 = y1;
-            y1 = y;
-        }
-
-        // Local variables back to member. Flush denormals here so we
-        // don't slow down the inner loop above.
-        m_x1 = DenormalDisabler::flushDenormalFloatToZero(x1);
-        m_x2 = DenormalDisabler::flushDenormalFloatToZero(x2);
-        m_y1 = DenormalDisabler::flushDenormalFloatToZero(y1);
-        m_y2 = DenormalDisabler::flushDenormalFloatToZero(y2);
-
-        // There is an assumption here that once we have sample accurate values we can never go back
-        // to not having sample accurate values.  This is currently true in the way
-        // AudioParamTimline is implemented: once an event is inserted, sample accurate processing
-        // is always enabled.
-        //
-        // If so, then we never have to update the state variables for the MACOSX or WEBAUDIO_IPP
-        // path.  The structure of the state variable in these cases aren't well documented so it's
-        // not clear how to update them anyway.
-    } else {
 #if OS(MACOSX)
-        // Use vecLib if available
-        processFast(sourceP, destP, framesToProcess);
-
-        // Copy the last inputs and outputs to the filter memory variables.  This is needed because
-        // the next rendering quantum might be an automation which needs the history to continue
-        // correctly.
-        m_x1 = sourceP[framesToProcess - 1];
-        m_x2 = sourceP[framesToProcess - 2];
-        m_y1 = destP[framesToProcess - 1];
-        m_y2 = destP[framesToProcess - 2];
+    // Use vecLib if available
+    processFast(sourceP, destP, framesToProcess);
 
 #elif USE(WEBAUDIO_IPP)
-        ippsIIR64f_32f(sourceP, destP, static_cast<int>(framesToProcess), m_biquadState);
-
-        // Copy the last inputs and outputs to the filter memory variables.  This is needed because
-        // the next rendering quantum might be an automation which needs the history to continue
-        // correctly.
-        m_x1 = sourceP[framesToProcess - 1];
-        m_x2 = sourceP[framesToProcess - 2];
-        m_y1 = destP[framesToProcess - 1];
-        m_y2 = destP[framesToProcess - 2];
+    ippsIIR64f_32f(sourceP, destP, static_cast<int>(framesToProcess), m_biquadState);
 #else // USE(WEBAUDIO_IPP)
 
-        int n = framesToProcess;
+    int n = framesToProcess;
 
-        // Create local copies of member variables
-        double x1 = m_x1;
-        double x2 = m_x2;
-        double y1 = m_y1;
-        double y2 = m_y2;
+    // Create local copies of member variables
+    double x1 = m_x1;
+    double x2 = m_x2;
+    double y1 = m_y1;
+    double y2 = m_y2;
 
-        double b0 = m_b0[0];
-        double b1 = m_b1[0];
-        double b2 = m_b2[0];
-        double a1 = m_a1[0];
-        double a2 = m_a2[0];
+    double b0 = m_b0;
+    double b1 = m_b1;
+    double b2 = m_b2;
+    double a1 = m_a1;
+    double a2 = m_a2;
 
-        while (n--) {
-            // FIXME: this can be optimized by pipelining the multiply adds...
-            float x = *sourceP++;
-            float y = b0*x + b1*x1 + b2*x2 - a1*y1 - a2*y2;
+    while (n--) {
+        // FIXME: this can be optimized by pipelining the multiply adds...
+        float x = *sourceP++;
+        float y = b0*x + b1*x1 + b2*x2 - a1*y1 - a2*y2;
 
-            *destP++ = y;
+        *destP++ = y;
 
-            // Update state variables
-            x2 = x1;
-            x1 = x;
-            y2 = y1;
-            y1 = y;
-        }
-
-        // Local variables back to member. Flush denormals here so we
-        // don't slow down the inner loop above.
-        m_x1 = DenormalDisabler::flushDenormalFloatToZero(x1);
-        m_x2 = DenormalDisabler::flushDenormalFloatToZero(x2);
-        m_y1 = DenormalDisabler::flushDenormalFloatToZero(y1);
-        m_y2 = DenormalDisabler::flushDenormalFloatToZero(y2);
-#endif
+        // Update state variables
+        x2 = x1;
+        x1 = x;
+        y2 = y1;
+        y1 = y;
     }
+
+    // Local variables back to member. Flush denormals here so we
+    // don't slow down the inner loop above.
+    m_x1 = DenormalDisabler::flushDenormalFloatToZero(x1);
+    m_x2 = DenormalDisabler::flushDenormalFloatToZero(x2);
+    m_y1 = DenormalDisabler::flushDenormalFloatToZero(y1);
+    m_y2 = DenormalDisabler::flushDenormalFloatToZero(y2);
+
+    m_b0 = b0;
+    m_b1 = b1;
+    m_b2 = b2;
+    m_a1 = a1;
+    m_a2 = a2;
+#endif
 }
 
 #if OS(MACOSX)
@@ -201,11 +134,11 @@
 void Biquad::processFast(const float* sourceP, float* destP, size_t framesToProcess)
 {
     double filterCoefficients[5];
-    filterCoefficients[0] = m_b0[0];
-    filterCoefficients[1] = m_b1[0];
-    filterCoefficients[2] = m_b2[0];
-    filterCoefficients[3] = m_a1[0];
-    filterCoefficients[4] = m_a2[0];
+    filterCoefficients[0] = m_b0;
+    filterCoefficients[1] = m_b1;
+    filterCoefficients[2] = m_b2;
+    filterCoefficients[3] = m_a1;
+    filterCoefficients[4] = m_a2;
 
     double* inputP = m_inputBuffer.data();
     double* outputP = m_outputBuffer.data();
@@ -268,20 +201,20 @@
     ippsIIRGetStateSize64f_BiQuad_32f(1, &bufferSize);
     ippsZero_8u(m_ippInternalBuffer, bufferSize);
 
-#endif
+#else
     m_x1 = m_x2 = m_y1 = m_y2 = 0;
+#endif
 }
 
-void Biquad::setLowpassParams(int index, double cutoff, double resonance)
+void Biquad::setLowpassParams(double cutoff, double resonance)
 {
     // Limit cutoff to 0 to 1.
     cutoff = std::max(0.0, std::min(cutoff, 1.0));
 
     if (cutoff == 1) {
         // When cutoff is 1, the z-transform is 1.
-        setNormalizedCoefficients(index,
-            1, 0, 0,
-            1, 0, 0);
+        setNormalizedCoefficients(1, 0, 0,
+                                  1, 0, 0);
     } else if (cutoff > 0) {
         // Compute biquad coefficients for lowpass filter
         resonance = std::max(0.0, resonance); // can't go negative
@@ -300,26 +233,24 @@
         double a1 = 2 * -gamma;
         double a2 = 2 * beta;
 
-        setNormalizedCoefficients(index, b0, b1, b2, 1, a1, a2);
+        setNormalizedCoefficients(b0, b1, b2, 1, a1, a2);
     } else {
         // When cutoff is zero, nothing gets through the filter, so set
         // coefficients up correctly.
-        setNormalizedCoefficients(index,
-            0, 0, 0,
-            1, 0, 0);
+        setNormalizedCoefficients(0, 0, 0,
+                                  1, 0, 0);
     }
 }
 
-void Biquad::setHighpassParams(int index, double cutoff, double resonance)
+void Biquad::setHighpassParams(double cutoff, double resonance)
 {
     // Limit cutoff to 0 to 1.
     cutoff = std::max(0.0, std::min(cutoff, 1.0));
 
     if (cutoff == 1) {
         // The z-transform is 0.
-        setNormalizedCoefficients(index,
-            0, 0, 0,
-            1, 0, 0);
+        setNormalizedCoefficients(0, 0, 0,
+                                  1, 0, 0);
     } else if (cutoff > 0) {
         // Compute biquad coefficients for highpass filter
         resonance = std::max(0.0, resonance); // can't go negative
@@ -338,43 +269,42 @@
         double a1 = 2 * -gamma;
         double a2 = 2 * beta;
 
-        setNormalizedCoefficients(index, b0, b1, b2, 1, a1, a2);
+        setNormalizedCoefficients(b0, b1, b2, 1, a1, a2);
     } else {
-        // When cutoff is zero, we need to be careful because the above
-        // gives a quadratic divided by the same quadratic, with poles
-        // and zeros on the unit circle in the same place. When cutoff
-        // is zero, the z-transform is 1.
-        setNormalizedCoefficients(index,
-            1, 0, 0,
-            1, 0, 0);
+      // When cutoff is zero, we need to be careful because the above
+      // gives a quadratic divided by the same quadratic, with poles
+      // and zeros on the unit circle in the same place. When cutoff
+      // is zero, the z-transform is 1.
+        setNormalizedCoefficients(1, 0, 0,
+                                  1, 0, 0);
     }
 }
 
-void Biquad::setNormalizedCoefficients(int index, double b0, double b1, double b2, double a0, double a1, double a2)
+void Biquad::setNormalizedCoefficients(double b0, double b1, double b2, double a0, double a1, double a2)
 {
     double a0Inverse = 1 / a0;
 
-    m_b0[index] = b0 * a0Inverse;
-    m_b1[index] = b1 * a0Inverse;
-    m_b2[index] = b2 * a0Inverse;
-    m_a1[index] = a1 * a0Inverse;
-    m_a2[index] = a2 * a0Inverse;
+    m_b0 = b0 * a0Inverse;
+    m_b1 = b1 * a0Inverse;
+    m_b2 = b2 * a0Inverse;
+    m_a1 = a1 * a0Inverse;
+    m_a2 = a2 * a0Inverse;
 
 #if USE(WEBAUDIO_IPP)
     Ipp64f taps[6];
-    taps[0] = m_b0[0];
-    taps[1] = m_b1[0];
-    taps[2] = m_b2[0];
+    taps[0] = m_b0;
+    taps[1] = m_b1;
+    taps[2] = m_b2;
     taps[3] = 1;
-    taps[4] = m_a1[0];
-    taps[5] = m_a2[0];
+    taps[4] = m_a1;
+    taps[5] = m_a2;
     m_biquadState = 0;
 
     ippsIIRInit64f_BiQuad_32f(&m_biquadState, taps, 1, 0, m_ippInternalBuffer);
 #endif // USE(WEBAUDIO_IPP)
 }
 
-void Biquad::setLowShelfParams(int index, double frequency, double dbGain)
+void Biquad::setLowShelfParams(double frequency, double dbGain)
 {
     // Clip frequencies to between 0 and 1, inclusive.
     frequency = std::max(0.0, std::min(frequency, 1.0));
@@ -383,9 +313,8 @@
 
     if (frequency == 1) {
         // The z-transform is a constant gain.
-        setNormalizedCoefficients(index,
-            A * A, 0, 0,
-            1, 0, 0);
+        setNormalizedCoefficients(A * A, 0, 0,
+                                  1, 0, 0);
     } else if (frequency > 0) {
         double w0 = piDouble * frequency;
         double S = 1; // filter slope (1 is max value)
@@ -402,16 +331,15 @@
         double a1 = -2 * (aMinusOne + aPlusOne * k);
         double a2 = aPlusOne + aMinusOne * k - k2;
 
-        setNormalizedCoefficients(index, b0, b1, b2, a0, a1, a2);
+        setNormalizedCoefficients(b0, b1, b2, a0, a1, a2);
     } else {
         // When frequency is 0, the z-transform is 1.
-        setNormalizedCoefficients(index,
-            1, 0, 0,
-            1, 0, 0);
+        setNormalizedCoefficients(1, 0, 0,
+                                  1, 0, 0);
     }
 }
 
-void Biquad::setHighShelfParams(int index, double frequency, double dbGain)
+void Biquad::setHighShelfParams(double frequency, double dbGain)
 {
     // Clip frequencies to between 0 and 1, inclusive.
     frequency = std::max(0.0, std::min(frequency, 1.0));
@@ -420,9 +348,8 @@
 
     if (frequency == 1) {
         // The z-transform is 1.
-        setNormalizedCoefficients(index,
-            1, 0, 0,
-            1, 0, 0);
+        setNormalizedCoefficients(1, 0, 0,
+                                  1, 0, 0);
     } else if (frequency > 0) {
         double w0 = piDouble * frequency;
         double S = 1; // filter slope (1 is max value)
@@ -439,18 +366,15 @@
         double a1 = 2 * (aMinusOne - aPlusOne * k);
         double a2 = aPlusOne - aMinusOne * k - k2;
 
-        setNormalizedCoefficients(index,
-            b0, b1, b2,
-            a0, a1, a2);
+        setNormalizedCoefficients(b0, b1, b2, a0, a1, a2);
     } else {
         // When frequency = 0, the filter is just a gain, A^2.
-        setNormalizedCoefficients(index,
-            A * A, 0, 0,
-            1, 0, 0);
+        setNormalizedCoefficients(A * A, 0, 0,
+                                  1, 0, 0);
     }
 }
 
-void Biquad::setPeakingParams(int index, double frequency, double Q, double dbGain)
+void Biquad::setPeakingParams(double frequency, double Q, double dbGain)
 {
     // Clip frequencies to between 0 and 1, inclusive.
     frequency = std::max(0.0, std::min(frequency, 1.0));
@@ -473,26 +397,22 @@
             double a1 = -2 * k;
             double a2 = 1 - alpha / A;
 
-            setNormalizedCoefficients(index,
-                b0, b1, b2,
-                a0, a1, a2);
+            setNormalizedCoefficients(b0, b1, b2, a0, a1, a2);
         } else {
             // When Q = 0, the above formulas have problems. If we look at
             // the z-transform, we can see that the limit as Q->0 is A^2, so
             // set the filter that way.
-            setNormalizedCoefficients(index,
-                A * A, 0, 0,
-                1, 0, 0);
+            setNormalizedCoefficients(A * A, 0, 0,
+                                      1, 0, 0);
         }
     } else {
         // When frequency is 0 or 1, the z-transform is 1.
-        setNormalizedCoefficients(index,
-            1, 0, 0,
-            1, 0, 0);
+        setNormalizedCoefficients(1, 0, 0,
+                                  1, 0, 0);
     }
 }
 
-void Biquad::setAllpassParams(int index, double frequency, double Q)
+void Biquad::setAllpassParams(double frequency, double Q)
 {
     // Clip frequencies to between 0 and 1, inclusive.
     frequency = std::max(0.0, std::min(frequency, 1.0));
@@ -513,26 +433,22 @@
             double a1 = -2 * k;
             double a2 = 1 - alpha;
 
-            setNormalizedCoefficients(index,
-                b0, b1, b2,
-                a0, a1, a2);
+            setNormalizedCoefficients(b0, b1, b2, a0, a1, a2);
         } else {
             // When Q = 0, the above formulas have problems. If we look at
             // the z-transform, we can see that the limit as Q->0 is -1, so
             // set the filter that way.
-            setNormalizedCoefficients(index,
-                -1, 0, 0,
-                1, 0, 0);
+            setNormalizedCoefficients(-1, 0, 0,
+                                      1, 0, 0);
         }
     } else {
         // When frequency is 0 or 1, the z-transform is 1.
-        setNormalizedCoefficients(index,
-            1, 0, 0,
-            1, 0, 0);
+        setNormalizedCoefficients(1, 0, 0,
+                                  1, 0, 0);
     }
 }
 
-void Biquad::setNotchParams(int index, double frequency, double Q)
+void Biquad::setNotchParams(double frequency, double Q)
 {
     // Clip frequencies to between 0 and 1, inclusive.
     frequency = std::max(0.0, std::min(frequency, 1.0));
@@ -553,26 +469,22 @@
             double a1 = -2 * k;
             double a2 = 1 - alpha;
 
-            setNormalizedCoefficients(index,
-                b0, b1, b2,
-                a0, a1, a2);
+            setNormalizedCoefficients(b0, b1, b2, a0, a1, a2);
         } else {
             // When Q = 0, the above formulas have problems. If we look at
             // the z-transform, we can see that the limit as Q->0 is 0, so
             // set the filter that way.
-            setNormalizedCoefficients(index,
-                0, 0, 0,
-                1, 0, 0);
+            setNormalizedCoefficients(0, 0, 0,
+                                      1, 0, 0);
         }
     } else {
         // When frequency is 0 or 1, the z-transform is 1.
-        setNormalizedCoefficients(index,
-            1, 0, 0,
-            1, 0, 0);
+        setNormalizedCoefficients(1, 0, 0,
+                                  1, 0, 0);
     }
 }
 
-void Biquad::setBandpassParams(int index, double frequency, double Q)
+void Biquad::setBandpassParams(double frequency, double Q)
 {
     // No negative frequencies allowed.
     frequency = std::max(0.0, frequency);
@@ -593,16 +505,13 @@
             double a1 = -2 * k;
             double a2 = 1 - alpha;
 
-            setNormalizedCoefficients(index,
-                b0, b1, b2,
-                a0, a1, a2);
+            setNormalizedCoefficients(b0, b1, b2, a0, a1, a2);
         } else {
             // When Q = 0, the above formulas have problems. If we look at
             // the z-transform, we can see that the limit as Q->0 is 1, so
             // set the filter that way.
-            setNormalizedCoefficients(index,
-                1, 0, 0,
-                1, 0, 0);
+            setNormalizedCoefficients(1, 0, 0,
+                                      1, 0, 0);
         }
     } else {
         // When the cutoff is zero, the z-transform approaches 0, if Q
@@ -610,9 +519,8 @@
         // pretty much undefined. What should we do in this case?
         // For now, just make the filter 0. When the cutoff is 1, the
         // z-transform also approaches 0.
-        setNormalizedCoefficients(index,
-            0, 0, 0,
-            1, 0, 0);
+        setNormalizedCoefficients(0, 0, 0,
+                                  1, 0, 0);
     }
 }
 
@@ -628,9 +536,7 @@
 
     double poleMag = abs(pole);
     double a2 = poleMag * poleMag;
-    setNormalizedCoefficients(0,
-        b0, b1, b2,
-        1, a1, a2);
+    setNormalizedCoefficients(b0, b1, b2, 1, a1, a2);
 }
 
 void Biquad::setAllpassPole(const std::complex<double>&pole)
@@ -661,11 +567,11 @@
     // with z1 = 1/z and z = exp(j*pi*frequency). Hence z1 = exp(-j*pi*frequency)
 
     // Make local copies of the coefficients as a micro-optimization.
-    double b0 = m_b0[0];
-    double b1 = m_b1[0];
-    double b2 = m_b2[0];
-    double a1 = m_a1[0];
-    double a2 = m_a2[0];
+    double b0 = m_b0;
+    double b1 = m_b1;
+    double b2 = m_b2;
+    double a1 = m_a1;
+    double a2 = m_a2;
 
     for (int k = 0; k < nFrequencies; ++k) {
         double omega = -piDouble * frequency[k];
diff --git a/third_party/WebKit/Source/platform/audio/Biquad.h b/third_party/WebKit/Source/platform/audio/Biquad.h
index a2d082f..25f1895 100644
--- a/third_party/WebKit/Source/platform/audio/Biquad.h
+++ b/third_party/WebKit/Source/platform/audio/Biquad.h
@@ -52,19 +52,16 @@
 
     void process(const float* sourceP, float* destP, size_t framesToProcess);
 
-    bool hasSampleAccurateValues() const { return m_hasSampleAccurateValues; }
-    void setHasSampleAccurateValues(bool isSampleAccurate) { m_hasSampleAccurateValues = isSampleAccurate; }
-
     // frequency is 0 - 1 normalized, resonance and dbGain are in decibels.
     // Q is a unitless quality factor.
-    void setLowpassParams(int, double frequency, double resonance);
-    void setHighpassParams(int, double frequency, double resonance);
-    void setBandpassParams(int, double frequency, double Q);
-    void setLowShelfParams(int, double frequency, double dbGain);
-    void setHighShelfParams(int, double frequency, double dbGain);
-    void setPeakingParams(int, double frequency, double Q, double dbGain);
-    void setAllpassParams(int, double frequency, double Q);
-    void setNotchParams(int, double frequency, double Q);
+    void setLowpassParams(double frequency, double resonance);
+    void setHighpassParams(double frequency, double resonance);
+    void setBandpassParams(double frequency, double Q);
+    void setLowShelfParams(double frequency, double dbGain);
+    void setHighShelfParams(double frequency, double dbGain);
+    void setPeakingParams(double frequency, double Q, double dbGain);
+    void setAllpassParams(double frequency, double Q);
+    void setNotchParams(double frequency, double Q);
 
     // Set the biquad coefficients given a single zero (other zero will be conjugate)
     // and a single pole (other pole will be conjugate)
@@ -85,20 +82,16 @@
                               float* magResponse,
                               float* phaseResponse);
 private:
-    void setNormalizedCoefficients(int, double b0, double b1, double b2, double a0, double a1, double a2);
-
-    // If true, the filter coefficients are (possibly) time-varying due to a timeline automation on
-    // at least one filter parameter.
-    bool m_hasSampleAccurateValues;
+    void setNormalizedCoefficients(double b0, double b1, double b2, double a0, double a1, double a2);
 
     // Filter coefficients. The filter is defined as
     //
     // y[n] + m_a1*y[n-1] + m_a2*y[n-2] = m_b0*x[n] + m_b1*x[n-1] + m_b2*x[n-2].
-    AudioDoubleArray m_b0;
-    AudioDoubleArray m_b1;
-    AudioDoubleArray m_b2;
-    AudioDoubleArray m_a1;
-    AudioDoubleArray m_a2;
+    double m_b0;
+    double m_b1;
+    double m_b2;
+    double m_a1;
+    double m_a2;
 
 #if OS(MACOSX)
     void processFast(const float* sourceP, float* destP, size_t framesToProcess);
@@ -111,12 +104,13 @@
     IppsIIRState64f_32f* m_biquadState;
     Ipp8u* m_ippInternalBuffer;
 
-#endif
+#else
     // Filter memory
     double m_x1; // input delayed by 1 sample
     double m_x2; // input delayed by 2 samples
     double m_y1; // output delayed by 1 sample
     double m_y2; // output delayed by 2 samples
+#endif
 };
 
 } // namespace blink
diff --git a/third_party/WebKit/Source/platform/heap/Handle.h b/third_party/WebKit/Source/platform/heap/Handle.h
index b5e0eb39..64e43fd7 100644
--- a/third_party/WebKit/Source/platform/heap/Handle.h
+++ b/third_party/WebKit/Source/platform/heap/Handle.h
@@ -238,7 +238,7 @@
 
     void checkPointer()
     {
-#if ENABLE(ASSERT)
+#if ENABLE(ASSERT) && defined(ADDRESS_SANITIZER)
         if (!m_raw)
             return;
 
@@ -779,7 +779,7 @@
 protected:
     void checkPointer()
     {
-#if ENABLE(ASSERT)
+#if ENABLE(ASSERT) && defined(ADDRESS_SANITIZER)
         if (!m_raw)
             return;
         // HashTable can store a special value (which is not aligned to the
diff --git a/third_party/WebKit/Source/platform/image-decoders/jpeg/JPEGImageDecoder.cpp b/third_party/WebKit/Source/platform/image-decoders/jpeg/JPEGImageDecoder.cpp
index 9f07924..01b8f3f8 100644
--- a/third_party/WebKit/Source/platform/image-decoders/jpeg/JPEGImageDecoder.cpp
+++ b/third_party/WebKit/Source/platform/image-decoders/jpeg/JPEGImageDecoder.cpp
@@ -916,6 +916,7 @@
     size_t rowBytesU = imagePlanes->rowBytes(1);
     size_t rowBytesV = imagePlanes->rowBytes(2);
 
+    // Request 8 or 16 scanlines: returns 0 or more scanlines.
     int yScanlinesToRead = DCTSIZE * v;
     JSAMPROW yLastRow = *samples;
     JSAMPROW uLastRow = yLastRow + rowBytesY;
@@ -923,11 +924,10 @@
     JSAMPROW dummyRow = vLastRow + rowBytesY;
 
     while (info->output_scanline < info->output_height) {
-        // Request 8 or 16 scanlines: returns 0 or more scanlines.
-        bool hasYLastRow(false), hasUVLastRow(false);
         // Assign 8 or 16 rows of memory to read the Y channel.
+        bool hasYLastRow = false;
         for (int i = 0; i < yScanlinesToRead; ++i) {
-            int scanline = (info->output_scanline + i);
+            int scanline = info->output_scanline + i;
             if (scanline < yMaxH) {
                 bufferraw2[i] = &outputY[scanline * rowBytesY];
             } else if (scanline == yMaxH) {
@@ -938,10 +938,11 @@
             }
         }
 
-        int scaledScanline = info->output_scanline / v;
         // Assign 8 rows of memory to read the U and V channels.
+        bool hasUVLastRow = false;
+        int scaledScanline = info->output_scanline / v;
         for (int i = 0; i < 8; ++i) {
-            int scanline = (scaledScanline + i);
+            int scanline = scaledScanline + i;
             if (scanline < uvMaxH) {
                 bufferraw2[16 + i] = &outputU[scanline * rowBytesU];
                 bufferraw2[24 + i] = &outputV[scanline * rowBytesV];
diff --git a/third_party/WebKit/Source/platform/image-decoders/png/PNGImageDecoder.cpp b/third_party/WebKit/Source/platform/image-decoders/png/PNGImageDecoder.cpp
index 88d8c69c..643a2dc5 100644
--- a/third_party/WebKit/Source/platform/image-decoders/png/PNGImageDecoder.cpp
+++ b/third_party/WebKit/Source/platform/image-decoders/png/PNGImageDecoder.cpp
@@ -108,10 +108,8 @@
 #if USE(QCMSLIB)
         clearColorTransform();
 #endif
-        if (m_png && m_info) {
-            // This will zero the pointers.
-            png_destroy_read_struct(&m_png, &m_info, 0);
-        }
+        png_destroy_read_struct(m_png ? &m_png : 0, m_info ? &m_info : 0, 0);
+        ASSERT(!m_png && !m_info);
 
         m_readOffset = 0;
     }
diff --git a/third_party/WebKit/Source/web/WebHistoryItem.cpp b/third_party/WebKit/Source/web/WebHistoryItem.cpp
index a56c5a1..d2095c4 100644
--- a/third_party/WebKit/Source/web/WebHistoryItem.cpp
+++ b/third_party/WebKit/Source/web/WebHistoryItem.cpp
@@ -105,16 +105,6 @@
     m_private->setVisualViewportScrollPoint(scrollOffset);
 }
 
-WebFloatPoint WebHistoryItem::pinchViewportScrollOffset() const
-{
-    return visualViewportScrollOffset();
-}
-
-void WebHistoryItem::setPinchViewportScrollOffset(const WebFloatPoint& scrollOffset)
-{
-    setVisualViewportScrollOffset(scrollOffset);
-}
-
 WebPoint WebHistoryItem::scrollOffset() const
 {
     return m_private->scrollPoint();
diff --git a/third_party/WebKit/Source/web/WebLocalFrameImpl.cpp b/third_party/WebKit/Source/web/WebLocalFrameImpl.cpp
index 804222b..926efa6 100644
--- a/third_party/WebKit/Source/web/WebLocalFrameImpl.cpp
+++ b/third_party/WebKit/Source/web/WebLocalFrameImpl.cpp
@@ -1237,11 +1237,7 @@
     if (pluginContainer)
         return pluginContainer->plugin()->selectionAsText();
 
-    const EphemeralRange range = frame()->selection().selection().toNormalizedEphemeralRange();
-    if (range.isNull())
-        return WebString();
-
-    String text = plainText(range, TextIteratorEmitsObjectReplacementCharacter);
+    String text = frame()->selection().selectedText(TextIteratorEmitsObjectReplacementCharacter);
 #if OS(WIN)
     replaceNewlinesWithWindowsStyleNewlines(text);
 #endif
diff --git a/third_party/WebKit/public/web/WebHistoryItem.h b/third_party/WebKit/public/web/WebHistoryItem.h
index 6f34c61..72fa149 100644
--- a/third_party/WebKit/public/web/WebHistoryItem.h
+++ b/third_party/WebKit/public/web/WebHistoryItem.h
@@ -87,11 +87,6 @@
     BLINK_EXPORT WebFloatPoint visualViewportScrollOffset() const;
     BLINK_EXPORT void setVisualViewportScrollOffset(const WebFloatPoint&);
 
-    // TODO(bokan): Renamed to the above versions. Remove once chromium
-    // callers are renamed.
-    BLINK_EXPORT WebFloatPoint pinchViewportScrollOffset() const;
-    BLINK_EXPORT void setPinchViewportScrollOffset(const WebFloatPoint&);
-
     BLINK_EXPORT WebPoint scrollOffset() const;
     BLINK_EXPORT void setScrollOffset(const WebPoint&);
 
diff --git a/third_party/closure_compiler/externs/OWNERS b/third_party/closure_compiler/externs/OWNERS
new file mode 100644
index 0000000..33acaf1
--- /dev/null
+++ b/third_party/closure_compiler/externs/OWNERS
@@ -0,0 +1,3 @@
+michaelpg@chromium.org
+rdevlin.cronin@chromium.org
+stevenjb@chromium.org
diff --git a/third_party/libjingle/README.chromium b/third_party/libjingle/README.chromium
index 300342aa..c03fb78 100644
--- a/third_party/libjingle/README.chromium
+++ b/third_party/libjingle/README.chromium
@@ -1,7 +1,7 @@
 Name: libjingle
 URL: http://code.google.com/p/webrtc/
 Version: unknown
-Revision: 10491
+Revision: 10588
 License: BSD
 License File: source/talk/COPYING
 Security Critical: yes
diff --git a/tools/accessibility/OWNERS b/tools/accessibility/OWNERS
new file mode 100644
index 0000000..11e8fd83
--- /dev/null
+++ b/tools/accessibility/OWNERS
@@ -0,0 +1,2 @@
+dmazzoni@chromium.org
+dtseng@chromium.org
diff --git a/tools/cfi/OWNERS b/tools/cfi/OWNERS
new file mode 100644
index 0000000..ba0dc32
--- /dev/null
+++ b/tools/cfi/OWNERS
@@ -0,0 +1,2 @@
+krasin@chromium.org
+pcc@chromium.org
diff --git a/tools/gn/action_target_generator.cc b/tools/gn/action_target_generator.cc
index 40523fe0..b2d7e27 100644
--- a/tools/gn/action_target_generator.cc
+++ b/tools/gn/action_target_generator.cc
@@ -48,6 +48,9 @@
   if (!FillScriptArgs())
     return;
 
+  if (!FillResponseFileContents())
+    return;
+
   if (!FillOutputs(output_type_ == Target::ACTION_FOREACH))
     return;
 
@@ -65,6 +68,29 @@
 
   // Action outputs don't depend on the current toolchain so we can skip adding
   // that dependency.
+
+  // response_file_contents and {{response_file_name}} in the args must go
+  // together.
+  const auto& required_args_substitutions =
+      target_->action_values().args().required_types();
+  bool has_rsp_file_name = std::find(required_args_substitutions.begin(),
+                                     required_args_substitutions.end(),
+                                     SUBSTITUTION_RSP_FILE_NAME) !=
+      required_args_substitutions.end();
+  if (target_->action_values().uses_rsp_file() && !has_rsp_file_name) {
+    *err_ = Err(function_call_, "Missing {{response_file_name}} in args.",
+        "This target defines response_file_contents but doesn't use\n"
+        "{{response_file_name}} in the args, which means the response file\n"
+        "will be unused.");
+    return;
+  }
+  if (!target_->action_values().uses_rsp_file() && has_rsp_file_name) {
+    *err_ = Err(function_call_, "Missing response_file_content definition.",
+        "This target uses {{response_file_name}} in the args, but does not\n"
+        "define response_file_content which means the response file\n"
+        "will be empty.");
+    return;
+  }
 }
 
 bool ActionTargetGenerator::FillScript() {
@@ -95,6 +121,13 @@
   return target_->action_values().args().Parse(*value, err_);
 }
 
+bool ActionTargetGenerator::FillResponseFileContents() {
+  const Value* value = scope_->GetValue(variables::kResponseFileContents, true);
+  if (!value)
+    return true;
+  return target_->action_values().rsp_file_contents().Parse(*value, err_);
+}
+
 bool ActionTargetGenerator::FillDepfile() {
   const Value* value = scope_->GetValue(variables::kDepfile, true);
   if (!value)
diff --git a/tools/gn/action_target_generator.h b/tools/gn/action_target_generator.h
index fc41273..0a69eda 100644
--- a/tools/gn/action_target_generator.h
+++ b/tools/gn/action_target_generator.h
@@ -25,6 +25,7 @@
  private:
   bool FillScript();
   bool FillScriptArgs();
+  bool FillResponseFileContents();
   bool FillDepfile();
   bool FillConsole();
 
diff --git a/tools/gn/action_values.h b/tools/gn/action_values.h
index 3b3c2a6..879ccf6 100644
--- a/tools/gn/action_values.h
+++ b/tools/gn/action_values.h
@@ -43,6 +43,13 @@
   bool has_depfile() const { return !depfile_.ranges().empty(); }
   void set_depfile(const SubstitutionPattern& depfile) { depfile_ = depfile; }
 
+  // Response file contents. Empty means no response file.
+  SubstitutionList& rsp_file_contents() { return rsp_file_contents_; }
+  const SubstitutionList& rsp_file_contents() const {
+    return rsp_file_contents_;
+  }
+  bool uses_rsp_file() const { return !rsp_file_contents_.list().empty(); }
+
   // Console pool option
   bool is_console() const { return console_; }
   void set_console(bool value) { console_ = value; }
@@ -52,6 +59,7 @@
   SubstitutionList args_;
   SubstitutionList outputs_;
   SubstitutionPattern depfile_;
+  SubstitutionList rsp_file_contents_;
   bool console_;
 
   DISALLOW_COPY_AND_ASSIGN(ActionValues);
diff --git a/tools/gn/exec_process.cc b/tools/gn/exec_process.cc
index e15f595d..1079657 100644
--- a/tools/gn/exec_process.cc
+++ b/tools/gn/exec_process.cc
@@ -14,9 +14,8 @@
 
 #include "base/win/scoped_handle.h"
 #include "base/win/scoped_process_information.h"
-#endif
-
-#if defined(OS_POSIX)
+#else
+#include <errno.h>
 #include <fcntl.h>
 #include <unistd.h>
 
diff --git a/tools/gn/function_write_file.cc b/tools/gn/function_write_file.cc
index d24abc1..02acca4 100644
--- a/tools/gn/function_write_file.cc
+++ b/tools/gn/function_write_file.cc
@@ -82,10 +82,15 @@
     "  written, the file will not be updated. This will prevent unnecessary\n"
     "  rebuilds of targets that depend on this file.\n"
     "\n"
+    "  One use for write_file is to write a list of inputs to an script\n"
+    "  that might be too long for the command line. However, it is\n"
+    "  preferrable to use response files for this purpose. See\n"
+    "  \"gn help response_file_contents\".\n"
+    "\n"
     "  TODO(brettw) we probably need an optional third argument to control\n"
     "  list formatting.\n"
     "\n"
-    "Arguments:\n"
+    "Arguments\n"
     "\n"
     "  filename\n"
     "      Filename to write. This must be within the output directory.\n"
diff --git a/tools/gn/functions_target.cc b/tools/gn/functions_target.cc
index 79af5351..b04fea8 100644
--- a/tools/gn/functions_target.cc
+++ b/tools/gn/functions_target.cc
@@ -108,6 +108,9 @@
     "  if an input file changes) by writing a depfile when the script is run\n"
     "  (see \"gn help depfile\"). This is more flexible than \"inputs\".\n"
     "\n"
+    "  If the command line length is very long, you can use response files\n"
+    "  to pass args to your script. See \"gn help response_file_contents\".\n"
+    "\n"
     "  It is recommended you put inputs to your script in the \"sources\"\n"
     "  variable, and stuff like other Python files required to run your\n"
     "  script in the \"inputs\" variable.\n"
@@ -127,8 +130,8 @@
     "\n"
     "Variables\n"
     "\n"
-    "  args, console, data, data_deps, depfile, deps, outputs*, script*,\n"
-    "  inputs, sources\n"
+    "  args, console, data, data_deps, depfile, deps, inputs, outputs*,\n"
+    "  response_file_contents, script*, sources\n"
     "  * = required\n"
     "\n"
     "Example\n"
@@ -182,6 +185,9 @@
     "  listed in the \"inputs\" variable. These files are treated as\n"
     "  dependencies of each script invocation.\n"
     "\n"
+    "  If the command line length is very long, you can use response files\n"
+    "  to pass args to your script. See \"gn help response_file_contents\".\n"
+    "\n"
     "  You can dynamically write input dependencies (for incremental rebuilds\n"
     "  if an input file changes) by writing a depfile when the script is run\n"
     "  (see \"gn help depfile\"). This is more flexible than \"inputs\".\n"
@@ -198,8 +204,8 @@
     "\n"
     "Variables\n"
     "\n"
-    "  args, console, data, data_deps, depfile, deps, outputs*, script*,\n"
-    "  inputs, sources*\n"
+    "  args, console, data, data_deps, depfile, deps, inputs, outputs*,\n"
+    "  response_file_contents, script*, sources*\n"
     "  * = required\n"
     "\n"
     "Example\n"
diff --git a/tools/gn/ninja_action_target_writer.cc b/tools/gn/ninja_action_target_writer.cc
index e2440a4..d0edc34 100644
--- a/tools/gn/ninja_action_target_writer.cc
+++ b/tools/gn/ninja_action_target_writer.cc
@@ -105,53 +105,43 @@
   EscapeOptions args_escape_options;
   args_escape_options.mode = ESCAPE_NINJA_COMMAND;
 
-  if (settings_->IsWin()) {
-    // Send through gyp-win-tool and use a response file.
+  out_ << "rule " << custom_rule_name << std::endl;
+
+  if (target_->action_values().uses_rsp_file()) {
+    // Needs a response file. The unique_name part is for action_foreach so
+    // each invocation of the rule gets a different response file. This isn't
+    // strictly necessary for regular one-shot actions, but it's easier to
+    // just always define unique_name.
     std::string rspfile = custom_rule_name;
     if (!target_->sources().empty())
       rspfile += ".$unique_name";
     rspfile += ".rsp";
-
-    out_ << "rule " << custom_rule_name << std::endl;
-    out_ << "  command = ";
-    path_output_.WriteFile(out_, settings_->build_settings()->python_path());
-    // TODO(brettw) this hardcodes "environment.x86" which is something that
-    // the Chrome Windows toolchain writes. We should have a way to invoke
-    // python without requiring this gyp_win_tool thing.
-    out_ << " gyp-win-tool action-wrapper environment.x86 " << rspfile
-         << std::endl;
-    out_ << "  description = ACTION " << target_label << std::endl;
-    out_ << "  restat = 1" << std::endl;
     out_ << "  rspfile = " << rspfile << std::endl;
 
-    // The build command goes in the rsp file.
-    out_ << "  rspfile_content = ";
-    path_output_.WriteFile(out_, settings_->build_settings()->python_path());
-    out_ << " ";
-    path_output_.WriteFile(out_, target_->action_values().script());
-    for (const auto& arg : args.list()) {
+    // Response file contents.
+    out_ << "  rspfile_content =";
+    for (const auto& arg :
+         target_->action_values().rsp_file_contents().list()) {
       out_ << " ";
       SubstitutionWriter::WriteWithNinjaVariables(
           arg, args_escape_options, out_);
     }
     out_ << std::endl;
-  } else {
-    // Posix can execute Python directly.
-    out_ << "rule " << custom_rule_name << std::endl;
-    out_ << "  command = ";
-    path_output_.WriteFile(out_, settings_->build_settings()->python_path());
-    out_ << " ";
-    path_output_.WriteFile(out_, target_->action_values().script());
-    for (const auto& arg : args.list()) {
-      out_ << " ";
-      SubstitutionWriter::WriteWithNinjaVariables(
-          arg, args_escape_options, out_);
-    }
-    out_ << std::endl;
-    out_ << "  description = ACTION " << target_label << std::endl;
-    out_ << "  restat = 1" << std::endl;
   }
 
+  out_ << "  command = ";
+  path_output_.WriteFile(out_, settings_->build_settings()->python_path());
+  out_ << " ";
+  path_output_.WriteFile(out_, target_->action_values().script());
+  for (const auto& arg : args.list()) {
+    out_ << " ";
+    SubstitutionWriter::WriteWithNinjaVariables(
+        arg, args_escape_options, out_);
+  }
+  out_ << std::endl;
+  out_ << "  description = ACTION " << target_label << std::endl;
+  out_ << "  restat = 1" << std::endl;
+
   return custom_rule_name;
 }
 
@@ -165,9 +155,6 @@
   // they will get pasted into the real command line.
   args_escape_options.inhibit_quoting = true;
 
-  const std::vector<SubstitutionType>& args_substitutions_used =
-      target_->action_values().args().required_types();
-
   const Target::FileList& sources = target_->sources();
   for (size_t i = 0; i < sources.size(); i++) {
     out_ << "build";
@@ -185,12 +172,22 @@
     }
     out_ << std::endl;
 
-    // Windows needs a unique ID for the response file.
-    if (target_->settings()->IsWin())
+    // Response files require a unique name be defined.
+    if (target_->action_values().uses_rsp_file())
       out_ << "  unique_name = " << i << std::endl;
 
+    // The required types is the union of the args and response file. This
+    // might theoretically duplicate a definition if the same substitution is
+    // used in both the args and the reponse file. However, this should be
+    // very unusual (normally the substitutions will go in one place or the
+    // other) and the redundant assignment won't bother Ninja.
     SubstitutionWriter::WriteNinjaVariablesForSource(
-        settings_, sources[i], args_substitutions_used,
+        settings_, sources[i],
+        target_->action_values().args().required_types(),
+        args_escape_options, out_);
+    SubstitutionWriter::WriteNinjaVariablesForSource(
+        settings_, sources[i],
+        target_->action_values().rsp_file_contents().required_types(),
         args_escape_options, out_);
 
     if (target_->action_values().has_depfile()) {
diff --git a/tools/gn/ninja_action_target_writer_unittest.cc b/tools/gn/ninja_action_target_writer_unittest.cc
index 99adf1f..a7dd21b4 100644
--- a/tools/gn/ninja_action_target_writer_unittest.cc
+++ b/tools/gn/ninja_action_target_writer_unittest.cc
@@ -140,57 +140,26 @@
   target.SetToolchain(setup.toolchain());
   ASSERT_TRUE(target.OnResolved(&err));
 
-  // Posix.
-  {
-    setup.settings()->set_target_os(Settings::LINUX);
-    setup.build_settings()->set_python_path(base::FilePath(FILE_PATH_LITERAL(
-        "/usr/bin/python")));
+  setup.settings()->set_target_os(Settings::LINUX);
+  setup.build_settings()->set_python_path(base::FilePath(FILE_PATH_LITERAL(
+      "/usr/bin/python")));
 
-    std::ostringstream out;
-    NinjaActionTargetWriter writer(&target, out);
-    writer.Run();
+  std::ostringstream out;
+  NinjaActionTargetWriter writer(&target, out);
+  writer.Run();
 
-    const char expected_linux[] =
-        "rule __foo_bar___rule\n"
-        "  command = /usr/bin/python ../../foo/script.py\n"
-        "  description = ACTION //foo:bar()\n"
-        "  restat = 1\n"
-        "build obj/foo/bar.inputdeps.stamp: stamp ../../foo/script.py "
-            "../../foo/included.txt ../../foo/source.txt\n"
-        "\n"
-        "build foo.out: __foo_bar___rule | obj/foo/bar.inputdeps.stamp\n"
-        "\n"
-        "build obj/foo/bar.stamp: stamp foo.out\n";
-    EXPECT_EQ(expected_linux, out.str());
-  }
-
-  // Windows.
-  {
-    // Note: we use forward slashes here so that the output will be the same on
-    // Linux and Windows.
-    setup.build_settings()->set_python_path(base::FilePath(FILE_PATH_LITERAL(
-        "C:/python/python.exe")));
-    setup.settings()->set_target_os(Settings::WIN);
-
-    std::ostringstream out;
-    NinjaActionTargetWriter writer(&target, out);
-    writer.Run();
-
-    const char expected_win[] =
-        "rule __foo_bar___rule\n"
-        "  command = C$:/python/python.exe gyp-win-tool action-wrapper environment.x86 __foo_bar___rule.$unique_name.rsp\n"
-        "  description = ACTION //foo:bar()\n"
-        "  restat = 1\n"
-        "  rspfile = __foo_bar___rule.$unique_name.rsp\n"
-        "  rspfile_content = C$:/python/python.exe ../../foo/script.py\n"
-        "build obj/foo/bar.inputdeps.stamp: stamp ../../foo/script.py "
-            "../../foo/included.txt ../../foo/source.txt\n"
-        "\n"
-        "build foo.out: __foo_bar___rule | obj/foo/bar.inputdeps.stamp\n"
-        "\n"
-        "build obj/foo/bar.stamp: stamp foo.out\n";
-    EXPECT_EQ(expected_win, out.str());
-  }
+  const char expected_linux[] =
+      "rule __foo_bar___rule\n"
+      "  command = /usr/bin/python ../../foo/script.py\n"
+      "  description = ACTION //foo:bar()\n"
+      "  restat = 1\n"
+      "build obj/foo/bar.inputdeps.stamp: stamp ../../foo/script.py "
+          "../../foo/included.txt ../../foo/source.txt\n"
+      "\n"
+      "build foo.out: __foo_bar___rule | obj/foo/bar.inputdeps.stamp\n"
+      "\n"
+      "build obj/foo/bar.stamp: stamp foo.out\n";
+  EXPECT_EQ(expected_linux, out.str());
 }
 
 TEST(NinjaActionTargetWriter, ForEach) {
@@ -237,86 +206,43 @@
   target.SetToolchain(setup.toolchain());
   ASSERT_TRUE(target.OnResolved(&err));
 
-  // Posix.
-  {
-    setup.settings()->set_target_os(Settings::LINUX);
-    setup.build_settings()->set_python_path(base::FilePath(FILE_PATH_LITERAL(
-        "/usr/bin/python")));
+  setup.settings()->set_target_os(Settings::LINUX);
+  setup.build_settings()->set_python_path(base::FilePath(FILE_PATH_LITERAL(
+      "/usr/bin/python")));
 
-    std::ostringstream out;
-    NinjaActionTargetWriter writer(&target, out);
-    writer.Run();
+  std::ostringstream out;
+  NinjaActionTargetWriter writer(&target, out);
+  writer.Run();
 
-    const char expected_linux[] =
-        "rule __foo_bar___rule\n"
-        "  command = /usr/bin/python ../../foo/script.py -i ${in} "
-            // Escaping is different between Windows and Posix.
+  const char expected_linux[] =
+      "rule __foo_bar___rule\n"
+      "  command = /usr/bin/python ../../foo/script.py -i ${in} "
+          // Escaping is different between Windows and Posix.
 #if defined(OS_WIN)
-            "\"--out=foo$ bar${source_name_part}.o\"\n"
+          "\"--out=foo$ bar${source_name_part}.o\"\n"
 #else
-            "--out=foo\\$ bar${source_name_part}.o\n"
+          "--out=foo\\$ bar${source_name_part}.o\n"
 #endif
-        "  description = ACTION //foo:bar()\n"
-        "  restat = 1\n"
-        "build obj/foo/bar.inputdeps.stamp: stamp ../../foo/script.py "
-            "../../foo/included.txt obj/foo/dep.stamp\n"
-        "\n"
-        "build input1.out: __foo_bar___rule ../../foo/input1.txt | "
-            "obj/foo/bar.inputdeps.stamp\n"
-        "  source_name_part = input1\n"
-        "build input2.out: __foo_bar___rule ../../foo/input2.txt | "
-            "obj/foo/bar.inputdeps.stamp\n"
-        "  source_name_part = input2\n"
-        "\n"
-        "build obj/foo/bar.stamp: "
-            "stamp input1.out input2.out || obj/foo/datadep.stamp\n";
+      "  description = ACTION //foo:bar()\n"
+      "  restat = 1\n"
+      "build obj/foo/bar.inputdeps.stamp: stamp ../../foo/script.py "
+          "../../foo/included.txt obj/foo/dep.stamp\n"
+      "\n"
+      "build input1.out: __foo_bar___rule ../../foo/input1.txt | "
+          "obj/foo/bar.inputdeps.stamp\n"
+      "  source_name_part = input1\n"
+      "build input2.out: __foo_bar___rule ../../foo/input2.txt | "
+          "obj/foo/bar.inputdeps.stamp\n"
+      "  source_name_part = input2\n"
+      "\n"
+      "build obj/foo/bar.stamp: "
+          "stamp input1.out input2.out || obj/foo/datadep.stamp\n";
 
-    std::string out_str = out.str();
+  std::string out_str = out.str();
 #if defined(OS_WIN)
-    std::replace(out_str.begin(), out_str.end(), '\\', '/');
+  std::replace(out_str.begin(), out_str.end(), '\\', '/');
 #endif
-    EXPECT_EQ(expected_linux, out_str);
-  }
-
-  // Windows.
-  {
-    setup.build_settings()->set_python_path(base::FilePath(FILE_PATH_LITERAL(
-        "C:/python/python.exe")));
-    setup.settings()->set_target_os(Settings::WIN);
-
-    std::ostringstream out;
-    NinjaActionTargetWriter writer(&target, out);
-    writer.Run();
-
-    const char expected_win[] =
-        "rule __foo_bar___rule\n"
-        "  command = C$:/python/python.exe gyp-win-tool action-wrapper "
-            "environment.x86 __foo_bar___rule.$unique_name.rsp\n"
-        "  description = ACTION //foo:bar()\n"
-        "  restat = 1\n"
-        "  rspfile = __foo_bar___rule.$unique_name.rsp\n"
-        "  rspfile_content = C$:/python/python.exe ../../foo/script.py -i "
-#if defined(OS_WIN)
-            "${in} \"--out=foo$ bar${source_name_part}.o\"\n"
-#else
-            "${in} --out=foo\\$ bar${source_name_part}.o\n"
-#endif
-        "build obj/foo/bar.inputdeps.stamp: stamp ../../foo/script.py "
-            "../../foo/included.txt obj/foo/dep.stamp\n"
-        "\n"
-        "build input1.out: __foo_bar___rule ../../foo/input1.txt | "
-            "obj/foo/bar.inputdeps.stamp\n"
-        "  unique_name = 0\n"
-        "  source_name_part = input1\n"
-        "build input2.out: __foo_bar___rule ../../foo/input2.txt | "
-            "obj/foo/bar.inputdeps.stamp\n"
-        "  unique_name = 1\n"
-        "  source_name_part = input2\n"
-        "\n"
-        "build obj/foo/bar.stamp: "
-            "stamp input1.out input2.out || obj/foo/datadep.stamp\n";
-    EXPECT_EQ(expected_win, out.str());
-  }
+  EXPECT_EQ(expected_linux, out_str);
 }
 
 TEST(NinjaActionTargetWriter, ForEachWithDepfile) {
@@ -349,80 +275,96 @@
 
   target.inputs().push_back(SourceFile("//foo/included.txt"));
 
-  // Posix.
-  {
-    setup.settings()->set_target_os(Settings::LINUX);
-    setup.build_settings()->set_python_path(base::FilePath(FILE_PATH_LITERAL(
-        "/usr/bin/python")));
+  setup.settings()->set_target_os(Settings::LINUX);
+  setup.build_settings()->set_python_path(base::FilePath(FILE_PATH_LITERAL(
+      "/usr/bin/python")));
 
-    std::ostringstream out;
-    NinjaActionTargetWriter writer(&target, out);
-    writer.Run();
+  std::ostringstream out;
+  NinjaActionTargetWriter writer(&target, out);
+  writer.Run();
 
-    const char expected_linux[] =
-        "rule __foo_bar___rule\n"
-        "  command = /usr/bin/python ../../foo/script.py -i ${in} "
+  const char expected_linux[] =
+      "rule __foo_bar___rule\n"
+      "  command = /usr/bin/python ../../foo/script.py -i ${in} "
 #if defined(OS_WIN)
-            "\"--out=foo$ bar${source_name_part}.o\"\n"
+          "\"--out=foo$ bar${source_name_part}.o\"\n"
 #else
-            "--out=foo\\$ bar${source_name_part}.o\n"
+          "--out=foo\\$ bar${source_name_part}.o\n"
 #endif
-        "  description = ACTION //foo:bar()\n"
-        "  restat = 1\n"
-        "build obj/foo/bar.inputdeps.stamp: stamp ../../foo/script.py "
-            "../../foo/included.txt\n"
-        "\n"
-        "build input1.out: __foo_bar___rule ../../foo/input1.txt"
-            " | obj/foo/bar.inputdeps.stamp\n"
-        "  source_name_part = input1\n"
-        "  depfile = gen/input1.d\n"
-        "build input2.out: __foo_bar___rule ../../foo/input2.txt"
-            " | obj/foo/bar.inputdeps.stamp\n"
-        "  source_name_part = input2\n"
-        "  depfile = gen/input2.d\n"
-        "\n"
-        "build obj/foo/bar.stamp: stamp input1.out input2.out\n";
-    EXPECT_EQ(expected_linux, out.str());
-  }
+      "  description = ACTION //foo:bar()\n"
+      "  restat = 1\n"
+      "build obj/foo/bar.inputdeps.stamp: stamp ../../foo/script.py "
+          "../../foo/included.txt\n"
+      "\n"
+      "build input1.out: __foo_bar___rule ../../foo/input1.txt"
+          " | obj/foo/bar.inputdeps.stamp\n"
+      "  source_name_part = input1\n"
+      "  depfile = gen/input1.d\n"
+      "build input2.out: __foo_bar___rule ../../foo/input2.txt"
+          " | obj/foo/bar.inputdeps.stamp\n"
+      "  source_name_part = input2\n"
+      "  depfile = gen/input2.d\n"
+      "\n"
+      "build obj/foo/bar.stamp: stamp input1.out input2.out\n";
+  EXPECT_EQ(expected_linux, out.str());
+}
 
-  // Windows.
-  {
-    setup.build_settings()->set_python_path(base::FilePath(FILE_PATH_LITERAL(
-        "C:/python/python.exe")));
-    setup.settings()->set_target_os(Settings::WIN);
+TEST(NinjaActionTargetWriter, ForEachWithResponseFile) {
+  TestWithScope setup;
+  Err err;
 
-    std::ostringstream out;
-    NinjaActionTargetWriter writer(&target, out);
-    writer.Run();
+  setup.build_settings()->SetBuildDir(SourceDir("//out/Debug/"));
+  Target target(setup.settings(), Label(SourceDir("//foo/"), "bar"));
+  target.set_output_type(Target::ACTION_FOREACH);
 
-    const char expected_win[] =
-        "rule __foo_bar___rule\n"
-        "  command = C$:/python/python.exe gyp-win-tool action-wrapper "
-            "environment.x86 __foo_bar___rule.$unique_name.rsp\n"
-        "  description = ACTION //foo:bar()\n"
-        "  restat = 1\n"
-        "  rspfile = __foo_bar___rule.$unique_name.rsp\n"
-        "  rspfile_content = C$:/python/python.exe ../../foo/script.py -i "
-#if defined(OS_WIN)
-            "${in} \"--out=foo$ bar${source_name_part}.o\"\n"
-#else
-            "${in} --out=foo\\$ bar${source_name_part}.o\n"
-#endif
-        "build obj/foo/bar.inputdeps.stamp: stamp ../../foo/script.py "
-            "../../foo/included.txt\n"
-        "\n"
-        "build input1.out: __foo_bar___rule ../../foo/input1.txt"
-            " | obj/foo/bar.inputdeps.stamp\n"
-        "  unique_name = 0\n"
-        "  source_name_part = input1\n"
-        "  depfile = gen/input1.d\n"
-        "build input2.out: __foo_bar___rule ../../foo/input2.txt"
-            " | obj/foo/bar.inputdeps.stamp\n"
-        "  unique_name = 1\n"
-        "  source_name_part = input2\n"
-        "  depfile = gen/input2.d\n"
-        "\n"
-        "build obj/foo/bar.stamp: stamp input1.out input2.out\n";
-    EXPECT_EQ(expected_win, out.str());
-  }
+  target.sources().push_back(SourceFile("//foo/input1.txt"));
+  target.action_values().set_script(SourceFile("//foo/script.py"));
+
+  target.SetToolchain(setup.toolchain());
+  ASSERT_TRUE(target.OnResolved(&err));
+
+  // Make sure we get interesting substitutions for both the args and the
+  // response file contents.
+  target.action_values().args() = SubstitutionList::MakeForTest(
+      "{{source}}",
+      "{{source_file_part}}",
+      "{{response_file_name}}");
+  target.action_values().rsp_file_contents() = SubstitutionList::MakeForTest(
+      "-j",
+      "{{source_name_part}}");
+  target.action_values().outputs() = SubstitutionList::MakeForTest(
+      "//out/Debug/{{source_name_part}}.out");
+
+  setup.settings()->set_target_os(Settings::LINUX);
+  setup.build_settings()->set_python_path(base::FilePath(FILE_PATH_LITERAL(
+      "/usr/bin/python")));
+
+  std::ostringstream out;
+  NinjaActionTargetWriter writer(&target, out);
+  writer.Run();
+
+  const char expected_linux[] =
+      "rule __foo_bar___rule\n"
+      // This name is autogenerated from the target rule name.
+      "  rspfile = __foo_bar___rule.$unique_name.rsp\n"
+      // These come from rsp_file_contents above.
+      "  rspfile_content = -j ${source_name_part}\n"
+      // These come from the args.
+      "  command = /usr/bin/python ../../foo/script.py ${in} "
+          "${source_file_part} ${rspfile}\n"
+      "  description = ACTION //foo:bar()\n"
+      "  restat = 1\n"
+      "build obj/foo/bar.inputdeps.stamp: stamp ../../foo/script.py\n"
+      "\n"
+      "build input1.out: __foo_bar___rule ../../foo/input1.txt"
+          " | obj/foo/bar.inputdeps.stamp\n"
+      // Necessary for the rspfile defined in the rule.
+      "  unique_name = 0\n"
+      // Substitution for the args.
+      "  source_file_part = input1.txt\n"
+      // Substitution for the rspfile contents.
+      "  source_name_part = input1\n"
+      "\n"
+      "build obj/foo/bar.stamp: stamp input1.out\n";
+  EXPECT_EQ(expected_linux, out.str());
 }
diff --git a/tools/gn/substitution_type.cc b/tools/gn/substitution_type.cc
index c185ae1..1b74d58 100644
--- a/tools/gn/substitution_type.cc
+++ b/tools/gn/substitution_type.cc
@@ -44,6 +44,8 @@
   "{{libs}}",  // SUBSTITUTION_LIBS
   "{{output_extension}}",  // SUBSTITUTION_OUTPUT_EXTENSION
   "{{solibs}}",  // SUBSTITUTION_SOLIBS
+
+  "{{response_file_name}}",  // SUBSTITUTION_RSP_FILE_NAME
 };
 
 const char* kSubstitutionNinjaNames[SUBSTITUTION_NUM_TYPES] = {
@@ -85,6 +87,8 @@
     "libs",              // SUBSTITUTION_LIBS
     "output_extension",  // SUBSTITUTION_OUTPUT_EXTENSION
     "solibs",            // SUBSTITUTION_SOLIBS
+
+    "rspfile",  // SUBSTITUTION_RSP_FILE_NAME
 };
 
 SubstitutionBits::SubstitutionBits() : used() {
diff --git a/tools/gn/substitution_type.h b/tools/gn/substitution_type.h
index 7d7ea127..dfe9b54 100644
--- a/tools/gn/substitution_type.h
+++ b/tools/gn/substitution_type.h
@@ -59,6 +59,9 @@
   SUBSTITUTION_OUTPUT_EXTENSION,  // {{output_extension}}
   SUBSTITUTION_SOLIBS,  // {{solibs}}
 
+  // Used only for the args of actions.
+  SUBSTITUTION_RSP_FILE_NAME,  // {{response_file_name}}
+
   SUBSTITUTION_NUM_TYPES  // Must be last.
 };
 
diff --git a/tools/gn/substitution_writer.cc b/tools/gn/substitution_writer.cc
index 0351eb17..2af2e18 100644
--- a/tools/gn/substitution_writer.cc
+++ b/tools/gn/substitution_writer.cc
@@ -310,8 +310,10 @@
     std::ostream& out) {
   for (const auto& type : types) {
     // Don't write SOURCE since that just maps to Ninja's $in variable, which
-    // is implicit in the rule.
-    if (type != SUBSTITUTION_SOURCE) {
+    // is implicit in the rule. RESPONSE_FILE_NAME is written separately
+    // only when writing target rules since it can never be used in any
+    // other context (like process_file_template).
+    if (type != SUBSTITUTION_SOURCE && type != SUBSTITUTION_RSP_FILE_NAME) {
       out << "  " << kSubstitutionNinjaNames[type] << " = ";
         EscapeStringToStream(
             out,
diff --git a/tools/gn/variables.cc b/tools/gn/variables.cc
index d4e978d3..5a9b840 100644
--- a/tools/gn/variables.cc
+++ b/tools/gn/variables.cc
@@ -1164,6 +1164,45 @@
     "    public_deps = [ \":c\" ]\n"
     "  }\n";
 
+const char kResponseFileContents[] = "response_file_contents";
+const char kResponseFileContents_HelpShort[] =
+    "response_file_contents: [string list] Contents of .rsp file for actions.";
+const char kResponseFileContents_Help[] =
+    "response_file_contents: Contents of a response file for actions.\n"
+    "\n"
+    "  Sometimes the arguments passed to a script can be too long for the\n"
+    "  system's command-line capabilities. This is especially the case on\n"
+    "  Windows where the maximum command-line length is less than 8K. A\n"
+    "  response file allows you to pass an unlimited amount of data to a\n"
+    "  script in a temporary file for an action or action_foreach target.\n"
+    "\n"
+    "  If the response_file_contents variable is defined and non-empty, the\n"
+    "  list will be treated as script args (including possibly substitution\n"
+    "  patterns) that will be written to a temporary file at build time.\n"
+    "  The name of the temporary file will be substituted for\n"
+    "  \"{{response_file_name}}\" in the script args.\n"
+    "\n"
+    "  The response file contents will always be quoted and escaped\n"
+    "  according to Unix shell rules. To parse the response file, the Python\n"
+    "  script should use \"shlex.split(file_contents)\".\n"
+    "\n"
+    "Example\n"
+    "\n"
+    "  action(\"process_lots_of_files\") {\n"
+    "    script = \"process.py\",\n"
+    "    inputs = [ ... huge list of files ... ]\n"
+    "\n"
+    "    # Write all the inputs to a response file for the script. Also,\n"
+    "    # make the paths relative to the script working directory.\n"
+    "    response_file_contents = rebase_path(inputs, root_build_dir)\n"
+    "\n"
+    "    # The script expects the name of the response file in --file-list.\n"
+    "    args = [\n"
+    "      \"--enable-foo\",\n"
+    "      \"--file-list={{response_file_name}}\",\n"
+    "    ]\n"
+    "  }\n";
+
 const char kScript[] = "script";
 const char kScript_HelpShort[] =
     "script: [file name] Script file for actions.";
@@ -1358,6 +1397,7 @@
     INSERT_VARIABLE(Public)
     INSERT_VARIABLE(PublicConfigs)
     INSERT_VARIABLE(PublicDeps)
+    INSERT_VARIABLE(ResponseFileContents)
     INSERT_VARIABLE(Script)
     INSERT_VARIABLE(Sources)
     INSERT_VARIABLE(Testonly)
diff --git a/tools/gn/variables.h b/tools/gn/variables.h
index 074f731..d02d2c6f 100644
--- a/tools/gn/variables.h
+++ b/tools/gn/variables.h
@@ -195,6 +195,10 @@
 extern const char kPublicDeps_HelpShort[];
 extern const char kPublicDeps_Help[];
 
+extern const char kResponseFileContents[];
+extern const char kResponseFileContents_HelpShort[];
+extern const char kResponseFileContents_Help[];
+
 extern const char kScript[];
 extern const char kScript_HelpShort[];
 extern const char kScript_Help[];
diff --git a/tools/linux/OWNERS b/tools/linux/OWNERS
new file mode 100644
index 0000000..2e285e4
--- /dev/null
+++ b/tools/linux/OWNERS
@@ -0,0 +1,2 @@
+thakis@chromium.org
+thestig@chromium.org
diff --git a/tools/mac/OWNERS b/tools/mac/OWNERS
new file mode 100644
index 0000000..2e285e4
--- /dev/null
+++ b/tools/mac/OWNERS
@@ -0,0 +1,2 @@
+thakis@chromium.org
+thestig@chromium.org
diff --git a/tools/metrics/actions/extract_actions.py b/tools/metrics/actions/extract_actions.py
index efb23b7..042775e1 100755
--- a/tools/metrics/actions/extract_actions.py
+++ b/tools/metrics/actions/extract_actions.py
@@ -57,8 +57,26 @@
   """,
   re.VERBOSE | re.DOTALL      # Verbose syntax and makes . also match new lines.
 )
+USER_METRICS_ACTION_RE_JS = re.compile(r"""
+  chrome\.send                # Start of function call.
+  \(                          # Opening parenthesis.
+  \s*                         # Any amount of whitespace, including new lines.
+  # WebUI message handled by CoreOptionsHandler.
+  'coreOptionsUserMetricsAction'
+  ,                           # Separator after first parameter.
+  \s*                         # Any amount of whitespace, including new lines.
+  \[                          # Opening bracket for arguments for C++ function.
+  \s*                         # Any amount of whitespace, including new lines.
+  (.+?)                       # A sequence of characters for the param.
+  \s*                         # Any amount of whitespace, including new lines.
+  \]                          # Closing bracket.
+  \s*                         # Any amount of whitespace, including new lines.
+  \)                          # Closing parenthesis.
+  """,
+  re.VERBOSE | re.DOTALL      # Verbose syntax and makes . also match new lines.
+)
 COMPUTED_ACTION_RE = re.compile(r'RecordComputedAction')
-QUOTED_STRING_RE = re.compile(r'\"(.+?)\"')
+QUOTED_STRING_RE = re.compile(r"""('[^']+'|"[^"]+")$""")
 
 # Files that are known to use content::RecordComputedAction(), which means
 # they require special handling code in this script.
@@ -318,10 +336,11 @@
 class ActionNameFinder:
   """Helper class to find action names in source code file."""
 
-  def __init__(self, path, contents):
+  def __init__(self, path, contents, action_re):
     self.__path = path
     self.__pos = 0
     self.__contents = contents
+    self.__action_re = action_re
 
   def FindNextAction(self):
     """Finds the next action name in the file.
@@ -333,15 +352,20 @@
       and could not be parsed. There may still be more actions in the file,
       so FindNextAction() can continue to be called to find following ones.
     """
-    match = USER_METRICS_ACTION_RE.search(self.__contents, pos=self.__pos)
+    match = self.__action_re.search(self.__contents, pos=self.__pos)
     if not match:
       return None
     match_start = match.start()
     self.__pos = match.end()
+
     match = QUOTED_STRING_RE.match(match.group(1))
     if not match:
+      if self.__action_re == USER_METRICS_ACTION_RE_JS:
+        return None
       self._RaiseException(match_start, self.__pos)
-    return match.group(1)
+
+    # Remove surrounding quotation marks.
+    return match.group(1)[1:-1]
 
   def _RaiseException(self, match_start, match_end):
     """Raises an InvalidStatementException for the specified code range."""
@@ -363,7 +387,14 @@
   global number_of_files_total
   number_of_files_total = number_of_files_total + 1
 
-  finder = ActionNameFinder(path, open(path).read())
+  # Check the extension, using the regular expression for C++ syntax by default.
+  ext = os.path.splitext(path)[1].lower()
+  if ext == '.js':
+    action_re = USER_METRICS_ACTION_RE_JS
+  else:
+    action_re = USER_METRICS_ACTION_RE
+
+  finder = ActionNameFinder(path, open(path).read(), action_re)
   while True:
     try:
       action_name = finder.FindNextAction()
@@ -373,6 +404,9 @@
     except InvalidStatementException, e:
       logging.warning(str(e))
 
+  if action_re != USER_METRICS_ACTION_RE:
+    return
+
   line_number = 0
   for line in open(path):
     line_number = line_number + 1
@@ -487,6 +521,7 @@
   resources_root = os.path.join(REPOSITORY_ROOT, 'chrome', 'browser',
                                 'resources')
   WalkDirectory(resources_root, actions, ('.html'), GrepForWebUIActions)
+  WalkDirectory(resources_root, actions, ('.js'), GrepForActions)
 
 def AddHistoryPageActions(actions):
   """Add actions that are used in History page.
diff --git a/tools/metrics/actions/extract_actions_test.py b/tools/metrics/actions/extract_actions_test.py
index f755cd5..d1bc37b 100755
--- a/tools/metrics/actions/extract_actions_test.py
+++ b/tools/metrics/actions/extract_actions_test.py
@@ -507,25 +507,29 @@
 
   def testUserMetricsActionSpanningTwoLines(self):
     code = 'base::UserMetricsAction(\n"Foo.Bar"));'
-    finder = extract_actions.ActionNameFinder('dummy', code)
+    finder = extract_actions.ActionNameFinder('dummy', code,
+        extract_actions.USER_METRICS_ACTION_RE)
     self.assertEqual('Foo.Bar', finder.FindNextAction())
     self.assertFalse(finder.FindNextAction())
 
   def testUserMetricsActionAsAParam(self):
     code = 'base::UserMetricsAction("Test.Foo"), "Test.Bar");'
-    finder = extract_actions.ActionNameFinder('dummy', code)
+    finder = extract_actions.ActionNameFinder('dummy', code,
+        extract_actions.USER_METRICS_ACTION_RE)
     self.assertEqual('Test.Foo', finder.FindNextAction())
     self.assertFalse(finder.FindNextAction())
 
   def testNonLiteralUserMetricsAction(self):
     code = 'base::UserMetricsAction(FOO)'
-    finder = extract_actions.ActionNameFinder('dummy', code)
+    finder = extract_actions.ActionNameFinder('dummy', code,
+        extract_actions.USER_METRICS_ACTION_RE)
     with self.assertRaises(Exception):
       finder.FindNextAction()
 
   def testTernaryUserMetricsAction(self):
     code = 'base::UserMetricsAction(foo ? "Foo.Bar" : "Bar.Foo"));'
-    finder = extract_actions.ActionNameFinder('dummy', code)
+    finder = extract_actions.ActionNameFinder('dummy', code,
+        extract_actions.USER_METRICS_ACTION_RE)
     with self.assertRaises(Exception):
       finder.FindNextAction()
 
@@ -533,10 +537,78 @@
     code = """base::UserMetricsAction(
       foo_bar ? "Bar.Foo" :
       "Foo.Car")"""
-    finder = extract_actions.ActionNameFinder('dummy', code)
+    finder = extract_actions.ActionNameFinder('dummy', code,
+        extract_actions.USER_METRICS_ACTION_RE)
     with self.assertRaises(extract_actions.InvalidStatementException):
       finder.FindNextAction()
 
+  def testUserMetricsActionWithExtraWhitespace(self):
+    code = """base::UserMetricsAction("Foo.Bar" )"""
+    finder = extract_actions.ActionNameFinder('dummy', code,
+        extract_actions.USER_METRICS_ACTION_RE)
+    with self.assertRaises(extract_actions.InvalidStatementException):
+      finder.FindNextAction()
+
+  def testUserMetricsActionSpanningTwoLinesJs(self):
+    code = "chrome.send('coreOptionsUserMetricsAction',\n['Foo.Bar']);"
+    finder = extract_actions.ActionNameFinder('dummy', code,
+        extract_actions.USER_METRICS_ACTION_RE_JS)
+    self.assertEqual('Foo.Bar', finder.FindNextAction())
+    self.assertFalse(finder.FindNextAction())
+
+  def testNonLiteralUserMetricsActionJs(self):
+    code = "chrome.send('coreOptionsUserMetricsAction',\n[FOO]);"
+    finder = extract_actions.ActionNameFinder('dummy', code,
+        extract_actions.USER_METRICS_ACTION_RE_JS)
+    self.assertFalse(finder.FindNextAction())
+
+  def testTernaryUserMetricsActionJs(self):
+    code = ("chrome.send('coreOptionsUserMetricsAction', "
+            "[foo ? 'Foo.Bar' : 'Bar.Foo']);")
+    finder = extract_actions.ActionNameFinder('dummy', code,
+        extract_actions.USER_METRICS_ACTION_RE_JS)
+    self.assertFalse(finder.FindNextAction())
+
+  def testTernaryUserMetricsActionWithNewLinesJs(self):
+    code = """chrome.send('coreOptionsUserMetricsAction',
+      [foo ? 'Foo.Bar' :
+      'Bar.Foo']);"""
+    finder = extract_actions.ActionNameFinder('dummy', code,
+        extract_actions.USER_METRICS_ACTION_RE_JS)
+    self.assertFalse(finder.FindNextAction())
+
+  def testUserMetricsActionWithExtraCharactersJs(self):
+    code = """chrome.send('coreOptionsUserMetricsAction',
+      ['Foo.Bar' + 1]);"""
+    finder = extract_actions.ActionNameFinder('dummy', code,
+        extract_actions.USER_METRICS_ACTION_RE_JS)
+    self.assertFalse(finder.FindNextAction())
+
+  def testComputedUserMetricsActionJs(self):
+    code = """chrome.send('coreOptionsUserMetricsAction',
+      ['Foo.' + foo_bar ? 'Bar' : 'Foo']);"""
+    finder = extract_actions.ActionNameFinder('dummy', code,
+        extract_actions.USER_METRICS_ACTION_RE_JS)
+    self.assertFalse(finder.FindNextAction())
+
+  def testUserMetricsActionWithMismatchedQuotes(self):
+    code = "chrome.send('coreOptionsUserMetricsAction', [\"Foo.Bar']);"
+    finder = extract_actions.ActionNameFinder('dummy', code,
+        extract_actions.USER_METRICS_ACTION_RE_JS)
+    self.assertFalse(finder.FindNextAction())
+
+  def testUserMetricsActionFromPropertyJs(self):
+    code = "chrome.send('coreOptionsUserMetricsAction', [objOrArray[key]]);"
+    finder = extract_actions.ActionNameFinder('dummy', code,
+        extract_actions.USER_METRICS_ACTION_RE_JS)
+    self.assertFalse(finder.FindNextAction())
+
+  def testUserMetricsActionFromFunctionJs(self):
+    code = "chrome.send('coreOptionsUserMetricsAction', [getAction(param)]);"
+    finder = extract_actions.ActionNameFinder('dummy', code,
+        extract_actions.USER_METRICS_ACTION_RE_JS)
+    self.assertFalse(finder.FindNextAction())
+
 
 if __name__ == '__main__':
   unittest.main()
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml
index 4a6c7fee..cc85b8f6 100644
--- a/tools/metrics/histograms/histograms.xml
+++ b/tools/metrics/histograms/histograms.xml
@@ -2358,6 +2358,9 @@
     enum="PasswordFormQueryVolume">
   <owner>dvadym@chromium.org</owner>
   <owner>gcasto@chromium.org</owner>
+  <obsolete>
+    Deprecated 10/2015.
+  </obsolete>
   <summary>
     Tracks the increased load on the Autofill server if the restriction on
     querying for password forms with fewer than 3 fields were omitted.
@@ -6410,6 +6413,25 @@
   </summary>
 </histogram>
 
+<histogram name="DataUse.UIAction" enum="DataUseUIAction">
+  <owner>bengr@chromium.org</owner>
+  <owner>megjablon@chromium.org</owner>
+  <summary>
+    Samples of user interactions with the Data Use snackbar and dialog. These
+    samples include:
+
+    Displays of the snackbar that indicates the start of data use tracking and
+    clicks on its &quot;More&quot; button. Displays of snackbar that indicates
+    the end of data use tracking and clicks on its &quot;More&quot; button.
+    Displays of the dialog that indicates the end of data use tracking and the
+    user interactions with it, which include: clicking &quot;Continue&quot;,
+    clicking &quot;Cancel&quot;, clicking &quot;Learn more&quot;, and opting out
+    of seeing the dialog. If the user opts out of seeing the dialog, he or she
+    will see the snackbar that indicates the end of data use tracking from then
+    on.
+  </summary>
+</histogram>
+
 <histogram name="DefaultBrowser.AsyncSetAsDefault.Duration"
     units="milliseconds">
   <owner>pmonette@chromium.org</owner>
@@ -28908,6 +28930,11 @@
   </summary>
 </histogram>
 
+<histogram name="NewTabPage.AnimatedLogoDownloadTime" units="milliseconds">
+  <owner>ianwen@chromium.org</owner>
+  <summary>The amount of time it takes to download the animated logo.</summary>
+</histogram>
+
 <histogram name="NewTabPage.AppsPageDragSource" enum="AppsPageDragSource">
   <owner>Please list the metric's owners. Add more owner tags as needed.</owner>
   <summary>
@@ -28981,6 +29008,20 @@
   </summary>
 </histogram>
 
+<histogram name="NewTabPage.LogoDownloadOutcome"
+    enum="NewTabPageLogoDownloadOutcome">
+  <owner>ianwen@chromium.org</owner>
+  <summary>
+    Outcome of downloading search provider's logos. It measures whether
+    download/parsing is successful, revalidation and parsing work properly, etc.
+  </summary>
+</histogram>
+
+<histogram name="NewTabPage.LogoDownloadTime" units="milliseconds">
+  <owner>ianwen@chromium.org</owner>
+  <summary>The amount of time it takes to download the static logo.</summary>
+</histogram>
+
 <histogram name="NewTabPage.MobileIsUserOnline" enum="Boolean">
   <owner>fserb@chromium.org</owner>
   <owner>zmin@chromium.org</owner>
@@ -38026,6 +38067,14 @@
   </summary>
 </histogram>
 
+<histogram name="RenderViewContextMenu.OpenLinkAsUserShown" units="profiles">
+  <owner>jochen@chromium.org</owner>
+  <summary>
+    Count of the profiles shown for the &quot;Open Link as User&quot; context
+    menu. Logged when the context menu is created.
+  </summary>
+</histogram>
+
 <histogram name="RenderViewContextMenu.Shown" enum="RenderViewContextMenuItem">
   <owner>vitalybuka@chromium.org</owner>
   <summary>Count of renderer view context menu items shown.</summary>
@@ -54960,6 +55009,7 @@
   <int value="0" label="Unknown Bubble"/>
   <int value="1" label="Mock Bubble"/>
   <int value="10" label="Extension Installed Bubble"/>
+  <int value="20" label="Translate Bubble"/>
 </enum>
 
 <enum name="CacheResult" type="int">
@@ -56403,6 +56453,22 @@
   <int value="14" label="Spell Checker"/>
 </enum>
 
+<enum name="DataUseUIAction" type="int">
+  <int value="0" label="Data use tracking started snackbar shown"/>
+  <int value="1"
+      label="Data use tracking started snackbar 'More' link clicked"/>
+  <int value="2" label="Data use tracking ended snackbar shown"/>
+  <int value="3" label="Data use tracking ended snackbar 'More' link clicked"/>
+  <int value="4" label="Data use tracking ended dialog shown"/>
+  <int value="5"
+      label="Data use tracking ended dialog 'Continue' button clicked"/>
+  <int value="6"
+      label="Data use tracking ended dialog 'Cancel' button clicked"/>
+  <int value="7"
+      label="Data use tracking ended dialog 'Learn more' link clicked"/>
+  <int value="8" label="Data use tracking ended dialog opted out"/>
+</enum>
+
 <enum name="DecodedImageType" type="int">
   <int value="0" label="kImageUnknown"/>
   <int value="1" label="kImageJPEG"/>
@@ -65524,6 +65590,7 @@
   <int value="-1662447331" label="wake-on-packets"/>
   <int value="-1660972490" label="gpu-rasterization-msaa-sample-count"/>
   <int value="-1654344175" label="disable-extension-info-dialog"/>
+  <int value="-1649778035" label="disable-clear-browsing-data-counters"/>
   <int value="-1630419335" label="enable-download-notification"/>
   <int value="-1619757314" label="touch-scrolling-mode"/>
   <int value="-1614912400" label="enable-link-disambiguation-popup"/>
@@ -68104,6 +68171,19 @@
   <int value="3" label="Renamed root partner folder"/>
 </enum>
 
+<enum name="NewTabPageLogoDownloadOutcome" type="int">
+  <summary>
+    These values are defined in LogoDownloadOutcome enum in
+    components/search_provider_logos/logo_tracker.h.
+  </summary>
+  <int value="0" label="New logo success"/>
+  <int value="1" label="No logo today"/>
+  <int value="2" label="Download failed"/>
+  <int value="3" label="Parsing failed"/>
+  <int value="4" label="Decoding failed"/>
+  <int value="5" label="Logo revalidated"/>
+</enum>
+
 <enum name="NewTabPageMobilePromo" type="int">
   <summary>
     These values are defined inside the PromoImpressionBuckets enum in
diff --git a/tools/perf/benchmarks/dummy_benchmark.py b/tools/perf/benchmarks/dummy_benchmark.py
index 2011be2f..ef6c04c7 100644
--- a/tools/perf/benchmarks/dummy_benchmark.py
+++ b/tools/perf/benchmarks/dummy_benchmark.py
@@ -40,7 +40,7 @@
   """ A low noise benchmark with mean=100 & std=1. """
 
   def CreatePageTest(self, options):
-    return _DummyTest(100, 1)
+    return _DummyTest(120, 1)
 
   @classmethod
   def Name(cls):
diff --git a/tools/perf/measurements/startup.py b/tools/perf/measurements/startup.py
index e1cbc3ac..6acf9d2c 100644
--- a/tools/perf/measurements/startup.py
+++ b/tools/perf/measurements/startup.py
@@ -29,6 +29,10 @@
     ])
     keychain_metric.KeychainMetric.CustomizeBrowserOptions(options)
 
+  def RunNavigateSteps(self, page, tab):
+    # Overriden so that no page navigation occurs - startup to the NTP.
+    pass
+
   def ValidateAndMeasurePage(self, page, tab, results):
     keychain_metric.KeychainMetric().AddResults(tab, results)
     startup_metric.StartupMetric().AddResults(tab, results)
diff --git a/tools/perf/page_sets/blank_page.py b/tools/perf/page_sets/blank_page.py
index fb2ac71..6f87074 100644
--- a/tools/perf/page_sets/blank_page.py
+++ b/tools/perf/page_sets/blank_page.py
@@ -9,18 +9,6 @@
   def __init__(self, url, page_set):
     super(BlankPage, self).__init__(url, page_set=page_set)
 
-  def RunPageInteractions(self, action_runner):
-    # Request a RAF and wait for it to be processed to ensure that the metric
-    # Startup.FirstWebContents.NonEmptyPaint2 is recorded.
-    action_runner.ExecuteJavaScript(
-        """
-        this.hasRunRAF = 0;
-        requestAnimationFrame(function() {
-            this.hasRunRAF = 1;
-        });
-        """
-    )
-    action_runner.WaitForJavaScriptCondition("this.hasRunRAF == 1")
 
 class BlankPageSet(story.StorySet):
   """A single blank page."""
diff --git a/tools/security/OWNERS b/tools/security/OWNERS
new file mode 100644
index 0000000..0102bf5
--- /dev/null
+++ b/tools/security/OWNERS
@@ -0,0 +1,2 @@
+jschuh@chromium.org
+tsepez@chromium.org
diff --git a/tools/vim/OWNERS b/tools/vim/OWNERS
new file mode 100644
index 0000000..4480539fa
--- /dev/null
+++ b/tools/vim/OWNERS
@@ -0,0 +1,3 @@
+asanka@chromium.org
+eroman@chromium.org
+scottmg@chromium.org
diff --git a/ui/android/java/src/org/chromium/ui/autofill/AutofillKeyboardAccessory.java b/ui/android/java/src/org/chromium/ui/autofill/AutofillKeyboardAccessory.java
index 558fc05..d7a5cca6 100644
--- a/ui/android/java/src/org/chromium/ui/autofill/AutofillKeyboardAccessory.java
+++ b/ui/android/java/src/org/chromium/ui/autofill/AutofillKeyboardAccessory.java
@@ -12,6 +12,7 @@
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.accessibility.AccessibilityEvent;
+import android.widget.HorizontalScrollView;
 import android.widget.ImageView;
 import android.widget.LinearLayout;
 import android.widget.TextView;
@@ -64,7 +65,7 @@
      * @param isRtl Gives the layout direction for the <input> field.
      */
     @SuppressLint("InlinedApi")
-    public void showWithSuggestions(AutofillSuggestion[] suggestions, boolean isRtl) {
+    public void showWithSuggestions(AutofillSuggestion[] suggestions, final boolean isRtl) {
         removeAllViews();
         int separatorPosition = -1;
         for (int i = 0; i < suggestions.length; i++) {
@@ -127,12 +128,20 @@
         ApiCompatibilityUtils.setLayoutDirection(
                 this, isRtl ? View.LAYOUT_DIRECTION_RTL : View.LAYOUT_DIRECTION_LTR);
 
+        final HorizontalScrollView container =
+                (HorizontalScrollView) mWindowAndroid.getKeyboardAccessoryView();
         if (getParent() == null) {
-            ViewGroup container = mWindowAndroid.getKeyboardAccessoryView();
             container.addView(this);
             container.setVisibility(View.VISIBLE);
             container.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);
         }
+
+        container.post(new Runnable() {
+            @Override
+            public void run() {
+                container.scrollTo(isRtl ? getRight() : 0, 0);
+            }
+        });
     }
 
     /**
diff --git a/ui/app_list/app_list_view_delegate.h b/ui/app_list/app_list_view_delegate.h
index 7eb30fef..349b976 100644
--- a/ui/app_list/app_list_view_delegate.h
+++ b/ui/app_list/app_list_view_delegate.h
@@ -129,7 +129,8 @@
   virtual void OpenFeedback() = 0;
 
   // Invoked to toggle the status of speech recognition.
-  virtual void ToggleSpeechRecognition() = 0;
+  virtual void StartSpeechRecognition() = 0;
+  virtual void StopSpeechRecognition() = 0;
 
   // Shows the app list for the profile specified by |profile_path|.
   virtual void ShowForProfileByPath(const base::FilePath& profile_path) = 0;
diff --git a/ui/app_list/test/app_list_test_view_delegate.cc b/ui/app_list/test/app_list_test_view_delegate.cc
index 99b2cd2b..08989cbe 100644
--- a/ui/app_list/test/app_list_test_view_delegate.cc
+++ b/ui/app_list/test/app_list_test_view_delegate.cc
@@ -20,7 +20,7 @@
 
 AppListTestViewDelegate::AppListTestViewDelegate()
     : dismiss_count_(0),
-      toggle_speech_recognition_count_(0),
+      stop_speech_recognition_count_(0),
       open_search_result_count_(0),
       next_profile_app_count_(0),
       model_(new AppListTestModel) {
@@ -29,9 +29,9 @@
 
 AppListTestViewDelegate::~AppListTestViewDelegate() {}
 
-int AppListTestViewDelegate::GetToggleSpeechRecognitionCountAndReset() {
-  int count = toggle_speech_recognition_count_;
-  toggle_speech_recognition_count_ = 0;
+int AppListTestViewDelegate::GetStopSpeechRecognitionCountAndReset() {
+  int count = stop_speech_recognition_count_;
+  stop_speech_recognition_count_ = 0;
   return count;
 }
 
@@ -83,8 +83,8 @@
   ++dismiss_count_;
 }
 
-void AppListTestViewDelegate::ToggleSpeechRecognition() {
-  ++toggle_speech_recognition_count_;
+void AppListTestViewDelegate::StopSpeechRecognition() {
+  ++stop_speech_recognition_count_;
 }
 
 gfx::ImageSkia AppListTestViewDelegate::GetWindowIcon() {
diff --git a/ui/app_list/test/app_list_test_view_delegate.h b/ui/app_list/test/app_list_test_view_delegate.h
index cc2670c8..d8fb7e9 100644
--- a/ui/app_list/test/app_list_test_view_delegate.h
+++ b/ui/app_list/test/app_list_test_view_delegate.h
@@ -44,9 +44,9 @@
     auto_launch_timeout_ = timeout;
   }
 
-  // Returns the value of |toggle_speech_recognition_count_| and then
-  // resets this value to 0.
-  int GetToggleSpeechRecognitionCountAndReset();
+  // Returns the value of |stop_speech_recognition_count_| and then resets this
+  // value to 0.
+  int GetStopSpeechRecognitionCountAndReset();
 
   // AppListViewDelegate overrides:
   bool ForceNativeDesktop() const override;
@@ -73,7 +73,8 @@
   void OpenSettings() override {}
   void OpenHelp() override {}
   void OpenFeedback() override {}
-  void ToggleSpeechRecognition() override;
+  void StartSpeechRecognition() override {}
+  void StopSpeechRecognition() override;
   void ShowForProfileByPath(const base::FilePath& profile_path) override {}
 #if defined(TOOLKIT_VIEWS)
   views::View* CreateStartPageWebView(const gfx::Size& size) override;
@@ -96,7 +97,7 @@
 
  private:
   int dismiss_count_;
-  int toggle_speech_recognition_count_;
+  int stop_speech_recognition_count_;
   int open_search_result_count_;
   int next_profile_app_count_;
   std::map<size_t, int> open_search_result_counts_;
diff --git a/ui/app_list/views/search_box_view.cc b/ui/app_list/views/search_box_view.cc
index 191dd43..1676f0a 100644
--- a/ui/app_list/views/search_box_view.cc
+++ b/ui/app_list/views/search_box_view.cc
@@ -397,7 +397,7 @@
   if (back_button_ && sender == back_button_)
     delegate_->BackButtonPressed();
   else if (speech_button_ && sender == speech_button_)
-    view_delegate_->ToggleSpeechRecognition();
+    view_delegate_->StartSpeechRecognition();
   else
     NOTREACHED();
 }
diff --git a/ui/app_list/views/speech_view.cc b/ui/app_list/views/speech_view.cc
index 2daf2e7..b721b3f6 100644
--- a/ui/app_list/views/speech_view.cc
+++ b/ui/app_list/views/speech_view.cc
@@ -197,7 +197,7 @@
 }
 
 void SpeechView::ButtonPressed(views::Button* sender, const ui::Event& event) {
-  delegate_->ToggleSpeechRecognition();
+  delegate_->StopSpeechRecognition();
 }
 
 void SpeechView::OnSpeechSoundLevelChanged(uint8 level) {
diff --git a/ui/app_list/views/speech_view_unittest.cc b/ui/app_list/views/speech_view_unittest.cc
index de190fb..d87ecc11d 100644
--- a/ui/app_list/views/speech_view_unittest.cc
+++ b/ui/app_list/views/speech_view_unittest.cc
@@ -37,8 +37,8 @@
   SpeechView* view() { return view_; }
   views::Widget* widget() { return widget_; }
 
-  int GetToggleSpeechRecognitionCountAndReset() {
-    return view_delegate_.GetToggleSpeechRecognitionCountAndReset();
+  int GetStopSpeechRecognitionCountAndReset() {
+    return view_delegate_.GetStopSpeechRecognitionCountAndReset();
   }
 
  private:
@@ -50,10 +50,10 @@
 };
 
 // Tests that clicking within the circular hit-test mask of MicButton invokes
-// SpeechView::ToggleSpeechRecognition() and clicking outside of the
+// SpeechView::StopSpeechRecognition() and clicking outside of the
 // hit-test mask does not.
 TEST_F(SpeechViewTest, ClickMicButton) {
-  EXPECT_EQ(0, GetToggleSpeechRecognitionCountAndReset());
+  EXPECT_EQ(0, GetStopSpeechRecognitionCountAndReset());
   gfx::Rect screen_bounds(view()->mic_button()->GetBoundsInScreen());
 
   // Simulate a mouse click in the center of the MicButton.
@@ -65,7 +65,7 @@
                          ui::EF_LEFT_MOUSE_BUTTON, 0);
   widget()->OnMouseEvent(&press);
   widget()->OnMouseEvent(&release);
-  EXPECT_EQ(1, GetToggleSpeechRecognitionCountAndReset());
+  EXPECT_EQ(1, GetStopSpeechRecognitionCountAndReset());
 
   // Simulate a mouse click in the bottom right-hand corner of the
   // MicButton's view bounds (which would fall outside of its
@@ -78,7 +78,7 @@
                            ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON, 0);
   widget()->OnMouseEvent(&press);
   widget()->OnMouseEvent(&release);
-  EXPECT_EQ(0, GetToggleSpeechRecognitionCountAndReset());
+  EXPECT_EQ(0, GetStopSpeechRecognitionCountAndReset());
 }
 
 }  // namespace test
diff --git a/ui/gfx/gpu_memory_buffer.h b/ui/gfx/gpu_memory_buffer.h
index 217aae2..47d277e 100644
--- a/ui/gfx/gpu_memory_buffer.h
+++ b/ui/gfx/gpu_memory_buffer.h
@@ -39,6 +39,7 @@
   GpuMemoryBufferId id;
   base::SharedMemoryHandle handle;
   uint32_t offset;
+  int32_t stride;
 #if defined(USE_OZONE)
   NativePixmapHandle native_pixmap_handle;
 #endif
diff --git a/ui/gl/gl_image_memory.cc b/ui/gl/gl_image_memory.cc
index 03391ba..3bdf596 100644
--- a/ui/gl/gl_image_memory.cc
+++ b/ui/gl/gl_image_memory.cc
@@ -5,6 +5,7 @@
 #include "ui/gl/gl_image_memory.h"
 
 #include "base/logging.h"
+#include "base/numerics/safe_conversions.h"
 #include "base/trace_event/trace_event.h"
 #include "ui/gfx/buffer_format_util.h"
 #include "ui/gl/gl_bindings.h"
@@ -71,9 +72,11 @@
     case BufferFormat::RGBA_8888:
     case BufferFormat::BGRX_8888:
     case BufferFormat::BGRA_8888:
+      return false;
     case BufferFormat::YUV_420:
     case BufferFormat::YUV_420_BIPLANAR:
     case BufferFormat::UYVY_422:
+      NOTREACHED();
       return false;
   }
 
@@ -129,10 +132,12 @@
     case BufferFormat::DXT1:
     case BufferFormat::DXT5:
     case BufferFormat::ETC1:
+      return TextureFormat(format);
     case BufferFormat::YUV_420:
     case BufferFormat::YUV_420_BIPLANAR:
     case BufferFormat::UYVY_422:
-      return TextureFormat(format);
+      NOTREACHED();
+      return 0;
   }
 
   NOTREACHED();
@@ -165,59 +170,17 @@
   return 0;
 }
 
-template <typename F>
-scoped_ptr<uint8_t[]> GLES2RGBData(const gfx::Size& size,
-                                   BufferFormat format,
-                                   const uint8_t* data,
-                                   F const& data_to_rgb,
-                                   GLenum* data_format,
-                                   GLenum* data_type) {
-  TRACE_EVENT2("gpu", "GLES2RGBData", "width", size.width(), "height",
-               size.height());
-
-  // Four-byte row alignment as specified by glPixelStorei with argument
-  // GL_UNPACK_ALIGNMENT set to 4.
-  size_t gles2_rgb_data_stride = (size.width() * 3 + 3) & ~3;
-  scoped_ptr<uint8_t[]> gles2_rgb_data(
-      new uint8_t[gles2_rgb_data_stride * size.height()]);
-  size_t data_stride = RowSizeForBufferFormat(size.width(), format, 0);
-
-  for (int y = 0; y < size.height(); ++y) {
-    for (int x = 0; x < size.width(); ++x) {
-      data_to_rgb(&data[y * data_stride + x * 4],
-                  &gles2_rgb_data[y * gles2_rgb_data_stride + x * 3]);
-    }
-  }
-
-  *data_format = GL_RGB;
-  *data_type = GL_UNSIGNED_BYTE;
-  return gles2_rgb_data.Pass();
-}
-
-scoped_ptr<uint8_t[]> GLES2Data(const gfx::Size& size,
-                                BufferFormat format,
-                                const uint8_t* data,
-                                GLenum* data_format,
-                                GLenum* data_type) {
+GLint DataRowLength(size_t stride, BufferFormat format) {
   switch (format) {
-    case BufferFormat::RGBX_8888:
-      return GLES2RGBData(size, format,
-                          data, [](const uint8_t* src, uint8_t* dst) {
-                            dst[0] = src[0];
-                            dst[1] = src[1];
-                            dst[2] = src[2];
-                          }, data_format, data_type);
-    case BufferFormat::BGRX_8888:
-      return GLES2RGBData(size, format,
-                          data, [](const uint8_t* src, uint8_t* dst) {
-                            dst[0] = src[2];
-                            dst[1] = src[1];
-                            dst[2] = src[0];
-                          }, data_format, data_type);
     case BufferFormat::RGBA_4444:
+      return base::checked_cast<GLint>(stride) / 2;
+    case BufferFormat::RGBX_8888:
     case BufferFormat::RGBA_8888:
+    case BufferFormat::BGRX_8888:
     case BufferFormat::BGRA_8888:
+      return base::checked_cast<GLint>(stride) / 4;
     case BufferFormat::R_8:
+      return base::checked_cast<GLint>(stride);
     case BufferFormat::ATC:
     case BufferFormat::ATCIA:
     case BufferFormat::DXT1:
@@ -226,28 +189,121 @@
     case BufferFormat::YUV_420:
     case BufferFormat::YUV_420_BIPLANAR:
     case BufferFormat::UYVY_422:
-      // No data conversion needed.
-      return nullptr;
+      NOTREACHED();
+      return 0;
   }
 
   NOTREACHED();
   return 0;
 }
 
+template <typename F>
+scoped_ptr<uint8_t[]> GLES2RGBData(const gfx::Size& size,
+                                   BufferFormat format,
+                                   size_t stride,
+                                   const uint8_t* data,
+                                   F const& data_to_rgb,
+                                   GLenum* data_format,
+                                   GLenum* data_type,
+                                   GLint* data_row_length) {
+  TRACE_EVENT2("gpu", "GLES2RGBData", "width", size.width(), "height",
+               size.height());
+
+  // Four-byte row alignment as specified by glPixelStorei with argument
+  // GL_UNPACK_ALIGNMENT set to 4.
+  size_t gles2_rgb_data_stride = (size.width() * 3 + 3) & ~3;
+  scoped_ptr<uint8_t[]> gles2_rgb_data(
+      new uint8_t[gles2_rgb_data_stride * size.height()]);
+
+  for (int y = 0; y < size.height(); ++y) {
+    for (int x = 0; x < size.width(); ++x) {
+      data_to_rgb(&data[y * stride + x * 4],
+                  &gles2_rgb_data[y * gles2_rgb_data_stride + x * 3]);
+    }
+  }
+
+  *data_format = GL_RGB;
+  *data_type = GL_UNSIGNED_BYTE;
+  *data_row_length = size.width();
+  return gles2_rgb_data.Pass();
+}
+
+scoped_ptr<uint8_t[]> GLES2Data(const gfx::Size& size,
+                                BufferFormat format,
+                                size_t stride,
+                                const uint8_t* data,
+                                GLenum* data_format,
+                                GLenum* data_type,
+                                GLint* data_row_length) {
+  TRACE_EVENT2("gpu", "GLES2Data", "width", size.width(), "height",
+               size.height());
+
+  switch (format) {
+    case BufferFormat::RGBX_8888:
+      return GLES2RGBData(size, format, stride,
+                          data, [](const uint8_t* src, uint8_t* dst) {
+                            dst[0] = src[0];
+                            dst[1] = src[1];
+                            dst[2] = src[2];
+                          }, data_format, data_type, data_row_length);
+    case BufferFormat::BGRX_8888:
+      return GLES2RGBData(size, format, stride,
+                          data, [](const uint8_t* src, uint8_t* dst) {
+                            dst[0] = src[2];
+                            dst[1] = src[1];
+                            dst[2] = src[0];
+                          }, data_format, data_type, data_row_length);
+    case BufferFormat::RGBA_4444:
+    case BufferFormat::RGBA_8888:
+    case BufferFormat::BGRA_8888:
+    case BufferFormat::R_8: {
+      size_t gles2_data_stride =
+          RowSizeForBufferFormat(size.width(), format, 0);
+      if (stride == gles2_data_stride)
+        return nullptr;  // No data conversion needed
+
+      scoped_ptr<uint8_t[]> gles2_data(
+          new uint8_t[gles2_data_stride * size.height()]);
+      for (int y = 0; y < size.height(); ++y) {
+        memcpy(&gles2_data[y * gles2_data_stride], &data[y * stride],
+               gles2_data_stride);
+      }
+      *data_row_length = size.width();
+      return gles2_data.Pass();
+    }
+    case BufferFormat::ATC:
+    case BufferFormat::ATCIA:
+    case BufferFormat::DXT1:
+    case BufferFormat::DXT5:
+    case BufferFormat::ETC1:
+      return nullptr;  // No data conversion needed
+    case BufferFormat::YUV_420:
+    case BufferFormat::YUV_420_BIPLANAR:
+    case BufferFormat::UYVY_422:
+      NOTREACHED();
+      return nullptr;
+  }
+
+  NOTREACHED();
+  return nullptr;
+}
+
 }  // namespace
 
 GLImageMemory::GLImageMemory(const gfx::Size& size, unsigned internalformat)
     : size_(size),
       internalformat_(internalformat),
       memory_(nullptr),
-      format_(BufferFormat::RGBA_8888) {}
+      format_(BufferFormat::RGBA_8888),
+      stride_(0) {}
 
 GLImageMemory::~GLImageMemory() {
   DCHECK(!memory_);
 }
 
 bool GLImageMemory::Initialize(const unsigned char* memory,
-                               BufferFormat format) {
+                               BufferFormat format,
+                               size_t stride) {
   if (!ValidInternalFormat(internalformat_)) {
     LOG(ERROR) << "Invalid internalformat: " << internalformat_;
     return false;
@@ -258,12 +314,18 @@
     return false;
   }
 
+  if (stride < RowSizeForBufferFormat(size_.width(), format, 0) || stride & 3) {
+    LOG(ERROR) << "Invalid stride: " << stride;
+    return false;
+  }
+
   DCHECK(memory);
   DCHECK(!memory_);
   DCHECK(!IsCompressedFormat(format) || size_.width() % 4 == 0);
   DCHECK(!IsCompressedFormat(format) || size_.height() % 4 == 0);
   memory_ = memory;
   format_ = format;
+  stride_ = stride;
   return true;
 }
 
@@ -297,16 +359,25 @@
         static_cast<GLsizei>(BufferSizeForBufferFormat(size_, format_)),
         memory_);
   } else {
-    scoped_ptr<uint8_t[]> gles2_data;
     GLenum data_format = DataFormat(format_);
     GLenum data_type = DataType(format_);
+    GLint data_row_length = DataRowLength(stride_, format_);
+    scoped_ptr<uint8_t[]> gles2_data;
 
-    if (gfx::GLContext::GetCurrent()->GetVersionInfo()->is_es)
-      gles2_data = GLES2Data(size_, format_, memory_, &data_format, &data_type);
+    if (gfx::GLContext::GetCurrent()->GetVersionInfo()->is_es) {
+      gles2_data = GLES2Data(size_, format_, stride_, memory_, &data_format,
+                             &data_type, &data_row_length);
+    }
+
+    if (data_row_length != size_.width())
+      glPixelStorei(GL_UNPACK_ROW_LENGTH, data_row_length);
 
     glTexImage2D(target, 0, TextureFormat(format_), size_.width(),
                  size_.height(), 0, data_format, data_type,
                  gles2_data ? gles2_data.get() : memory_);
+
+    if (data_row_length != size_.width())
+      glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
   }
 
   return true;
@@ -326,13 +397,12 @@
   if (rect.width() != size_.width())
     return false;
 
-  // Height must be a multiple of 4 if compressed.
-  if (IsCompressedFormat(format_) && rect.height() % 4)
-    return false;
-
-  const uint8_t* data =
-      memory_ + rect.y() * RowSizeForBufferFormat(size_.width(), format_, 0);
+  const uint8_t* data = memory_ + rect.y() * stride_;
   if (IsCompressedFormat(format_)) {
+    // Height must be a multiple of 4.
+    if (rect.height() % 4)
+      return false;
+
     glCompressedTexSubImage2D(
         target, 0, offset.x(), offset.y(), rect.width(), rect.height(),
         DataFormat(format_),
@@ -341,16 +411,23 @@
   } else {
     GLenum data_format = DataFormat(format_);
     GLenum data_type = DataType(format_);
+    GLint data_row_length = DataRowLength(stride_, format_);
     scoped_ptr<uint8_t[]> gles2_data;
 
     if (gfx::GLContext::GetCurrent()->GetVersionInfo()->is_es) {
-      gles2_data =
-          GLES2Data(rect.size(), format_, data, &data_format, &data_type);
+      gles2_data = GLES2Data(rect.size(), format_, stride_, data, &data_format,
+                             &data_type, &data_row_length);
     }
 
+    if (data_row_length != rect.width())
+      glPixelStorei(GL_UNPACK_ROW_LENGTH, data_row_length);
+
     glTexSubImage2D(target, 0, offset.x(), offset.y(), rect.width(),
                     rect.height(), data_format, data_type,
                     gles2_data ? gles2_data.get() : data);
+
+    if (data_row_length != rect.width())
+      glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
   }
 
   return true;
diff --git a/ui/gl/gl_image_memory.h b/ui/gl/gl_image_memory.h
index 3ce04401..5492ec3 100644
--- a/ui/gl/gl_image_memory.h
+++ b/ui/gl/gl_image_memory.h
@@ -16,7 +16,9 @@
  public:
   GLImageMemory(const gfx::Size& size, unsigned internalformat);
 
-  bool Initialize(const unsigned char* memory, gfx::BufferFormat format);
+  bool Initialize(const unsigned char* memory,
+                  gfx::BufferFormat format,
+                  size_t stride);
 
   // Overridden from GLImage:
   void Destroy(bool have_context) override;
@@ -40,12 +42,14 @@
   ~GLImageMemory() override;
 
   gfx::BufferFormat format() const { return format_; }
+  size_t stride() const { return stride_; }
 
  private:
   const gfx::Size size_;
   const unsigned internalformat_;
   const unsigned char* memory_;
   gfx::BufferFormat format_;
+  size_t stride_;
 
   DISALLOW_COPY_AND_ASSIGN(GLImageMemory);
 };
diff --git a/ui/gl/gl_image_ref_counted_memory.cc b/ui/gl/gl_image_ref_counted_memory.cc
index a417f15..1831c08 100644
--- a/ui/gl/gl_image_ref_counted_memory.cc
+++ b/ui/gl/gl_image_ref_counted_memory.cc
@@ -9,6 +9,7 @@
 #include "base/trace_event/memory_allocator_dump.h"
 #include "base/trace_event/memory_dump_manager.h"
 #include "base/trace_event/process_memory_dump.h"
+#include "ui/gfx/buffer_format_util.h"
 
 namespace gl {
 
@@ -23,8 +24,11 @@
 bool GLImageRefCountedMemory::Initialize(
     base::RefCountedMemory* ref_counted_memory,
     gfx::BufferFormat format) {
-  if (!GLImageMemory::Initialize(ref_counted_memory->front(), format))
+  if (!GLImageMemory::Initialize(
+          ref_counted_memory->front(), format,
+          gfx::RowSizeForBufferFormat(GetSize().width(), format, 0))) {
     return false;
+  }
 
   DCHECK(!ref_counted_memory_.get());
   ref_counted_memory_ = ref_counted_memory;
diff --git a/ui/gl/gl_image_shared_memory.cc b/ui/gl/gl_image_shared_memory.cc
index 6ea55532..21c72c11 100644
--- a/ui/gl/gl_image_shared_memory.cc
+++ b/ui/gl/gl_image_shared_memory.cc
@@ -28,9 +28,14 @@
     const base::SharedMemoryHandle& handle,
     gfx::GenericSharedMemoryId shared_memory_id,
     gfx::BufferFormat format,
-    size_t offset) {
-  size_t size_in_bytes;
-  if (!BufferSizeForBufferFormatChecked(GetSize(), format, &size_in_bytes))
+    size_t offset,
+    size_t stride) {
+  if (NumberOfPlanesForBufferFormat(format) != 1)
+    return false;
+
+  base::CheckedNumeric<size_t> checked_size = stride;
+  checked_size *= GetSize().height();
+  if (!checked_size.IsValid())
     return false;
 
   if (!base::SharedMemory::IsHandleValid(handle))
@@ -52,22 +57,21 @@
   size_t map_offset = base::SysInfo::VMAllocationGranularity() *
                       (offset / base::SysInfo::VMAllocationGranularity());
 
-  base::CheckedNumeric<size_t> checked_size_to_map_in_bytes = size_in_bytes;
-  checked_size_to_map_in_bytes += memory_offset;
-  if (!checked_size_to_map_in_bytes.IsValid())
+  checked_size += memory_offset;
+  if (!checked_size.IsValid())
     return false;
 
   scoped_ptr<base::SharedMemory> duped_shared_memory(
       new base::SharedMemory(duped_shared_memory_handle, true));
   if (!duped_shared_memory->MapAt(static_cast<off_t>(map_offset),
-                                  checked_size_to_map_in_bytes.ValueOrDie())) {
+                                  checked_size.ValueOrDie())) {
     DVLOG(0) << "Failed to map shared memory.";
     return false;
   }
 
   if (!GLImageMemory::Initialize(
           static_cast<uint8_t*>(duped_shared_memory->memory()) + memory_offset,
-          format)) {
+          format, stride)) {
     return false;
   }
 
@@ -89,7 +93,7 @@
   size_t size_in_bytes = 0;
 
   if (shared_memory_)
-    size_in_bytes = BufferSizeForBufferFormat(GetSize(), format());
+    size_in_bytes = stride() * GetSize().height();
 
   // Dump under "/shared_memory", as the base class may also dump to
   // "/texture_memory".
diff --git a/ui/gl/gl_image_shared_memory.h b/ui/gl/gl_image_shared_memory.h
index e3425d2..3c1564ea 100644
--- a/ui/gl/gl_image_shared_memory.h
+++ b/ui/gl/gl_image_shared_memory.h
@@ -23,7 +23,8 @@
   bool Initialize(const base::SharedMemoryHandle& handle,
                   gfx::GenericSharedMemoryId shared_memory_id,
                   gfx::BufferFormat format,
-                  size_t offset);
+                  size_t offset,
+                  size_t stride);
 
   // Overridden from GLImage:
   void Destroy(bool have_context) override;
diff --git a/ui/gl/gl_image_shared_memory_unittest.cc b/ui/gl/gl_image_shared_memory_unittest.cc
index 276996078..da6feac3 100644
--- a/ui/gl/gl_image_shared_memory_unittest.cc
+++ b/ui/gl/gl_image_shared_memory_unittest.cc
@@ -30,7 +30,8 @@
         size, gl::GLImageMemory::GetInternalFormatForTesting(format)));
     rv = image->Initialize(
         base::SharedMemory::DuplicateHandle(shared_memory.handle()),
-        gfx::GenericSharedMemoryId(0), format, 0);
+        gfx::GenericSharedMemoryId(0), format, 0,
+        gfx::RowSizeForBufferFormat(size.width(), format, 0));
     EXPECT_TRUE(rv);
     return image;
   }
@@ -55,10 +56,13 @@
   scoped_refptr<gl::GLImage> CreateSolidColorImage(
       const gfx::Size& size,
       const uint8_t color[4]) const {
-    // Create a shared memory segment that is 2 pages larger than image.
+    // Create a shared memory segment that holds an image with a stride that is
+    // twice the row size and 2 pages larger than image.
+    size_t stride = gfx::RowSizeForBufferFormat(
+                        size.width(), gfx::BufferFormat::RGBA_8888, 0) *
+                    2;
     size_t pool_size =
-        gfx::BufferSizeForBufferFormat(size, gfx::BufferFormat::RGBA_8888) +
-        base::SysInfo::VMAllocationGranularity() * 3;
+        stride * size.height() + base::SysInfo::VMAllocationGranularity() * 3;
     base::SharedMemory shared_memory;
     bool rv = shared_memory.CreateAndMapAnonymous(pool_size);
     DCHECK(rv);
@@ -67,9 +71,7 @@
     // Place buffer at a non-zero non-page-aligned offset in shared memory.
     size_t buffer_offset = 3 * base::SysInfo::VMAllocationGranularity() / 2;
     GLImageTestSupport::SetBufferDataToColor(
-        size.width(), size.height(),
-        static_cast<int>(RowSizeForBufferFormat(
-            size.width(), gfx::BufferFormat::RGBA_8888, 0)),
+        size.width(), size.height(), static_cast<int>(stride),
         gfx::BufferFormat::RGBA_8888, color,
         reinterpret_cast<uint8_t*>(shared_memory.memory()) + buffer_offset);
     scoped_refptr<gl::GLImageSharedMemory> image(
@@ -77,7 +79,7 @@
     rv = image->Initialize(
         base::SharedMemory::DuplicateHandle(shared_memory.handle()),
         gfx::GenericSharedMemoryId(0), gfx::BufferFormat::RGBA_8888,
-        buffer_offset);
+        buffer_offset, stride);
     EXPECT_TRUE(rv);
     return image;
   }
diff --git a/ui/views/mus/BUILD.gn b/ui/views/mus/BUILD.gn
index e65c390..e5cad8b 100644
--- a/ui/views/mus/BUILD.gn
+++ b/ui/views/mus/BUILD.gn
@@ -14,6 +14,8 @@
     "input_method_mus.h",
     "native_widget_mus.cc",
     "native_widget_mus.h",
+    "platform_window_mus.cc",
+    "platform_window_mus.h",
     "surface_binding.cc",
     "surface_binding.h",
     "surface_context_factory.cc",
diff --git a/ui/views/mus/native_widget_mus.cc b/ui/views/mus/native_widget_mus.cc
index 5fc56f3..cf96b76 100644
--- a/ui/views/mus/native_widget_mus.cc
+++ b/ui/views/mus/native_widget_mus.cc
@@ -17,6 +17,7 @@
 #include "ui/compositor/paint_recorder.h"
 #include "ui/gfx/canvas.h"
 #include "ui/native_theme/native_theme_aura.h"
+#include "ui/views/mus/platform_window_mus.h"
 #include "ui/views/mus/window_manager_client_area_insets.h"
 #include "ui/views/mus/window_tree_host_mus.h"
 #include "ui/views/widget/widget_delegate.h"
@@ -445,6 +446,9 @@
 void NativeWidgetMus::ShowWithWindowState(ui::WindowShowState state) {
   window_tree_host_->Show();
   GetNativeWindow()->Show();
+  if (state != ui::SHOW_STATE_INACTIVE)
+    Activate();
+  GetWidget()->SetInitialFocus(state);
 }
 
 bool NativeWidgetMus::IsVisible() const {
@@ -453,7 +457,7 @@
 }
 
 void NativeWidgetMus::Activate() {
-  // NOTIMPLEMENTED();
+  window_tree_host_->platform_window()->Activate();
 }
 
 void NativeWidgetMus::Deactivate() {
diff --git a/ui/views/mus/platform_window_mus.cc b/ui/views/mus/platform_window_mus.cc
new file mode 100644
index 0000000..5bffcf3
--- /dev/null
+++ b/ui/views/mus/platform_window_mus.cc
@@ -0,0 +1,174 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/views/mus/platform_window_mus.h"
+
+#include "components/mus/public/cpp/property_type_converters.h"
+#include "components/mus/public/cpp/window_property.h"
+#include "components/mus/public/interfaces/window_manager.mojom.h"
+#include "mojo/converters/input_events/input_events_type_converters.h"
+#include "ui/platform_window/platform_window_delegate.h"
+#include "ui/views/mus/window_manager_connection.h"
+
+namespace views {
+
+namespace {
+void WindowManagerCallback(mus::mojom::WindowManagerErrorCode error_code) {}
+}  // namespace
+
+PlatformWindowMus::PlatformWindowMus(ui::PlatformWindowDelegate* delegate,
+                                     mus::Window* mus_window)
+    : delegate_(delegate),
+      mus_window_(mus_window),
+      show_state_(mus::mojom::SHOW_STATE_RESTORED) {
+  DCHECK(delegate_);
+  DCHECK(mus_window_);
+  mus_window_->AddObserver(this);
+
+  delegate_->OnAcceleratedWidgetAvailable(
+      gfx::kNullAcceleratedWidget,
+      mus_window_->viewport_metrics().device_pixel_ratio);
+}
+
+PlatformWindowMus::~PlatformWindowMus() {
+  if (!mus_window_)
+    return;
+  mus_window_->RemoveObserver(this);
+  mus_window_->Destroy();
+}
+
+
+void PlatformWindowMus::Activate() {
+  mus_window_->SetFocus();
+}
+
+void PlatformWindowMus::Show() {
+  mus_window_->SetVisible(true);
+}
+
+void PlatformWindowMus::Hide() {
+  mus_window_->SetVisible(false);
+}
+
+void PlatformWindowMus::Close() {
+  NOTIMPLEMENTED();
+}
+
+void PlatformWindowMus::SetBounds(const gfx::Rect& bounds) {
+  mus_window_->SetBounds(bounds);
+}
+
+gfx::Rect PlatformWindowMus::GetBounds() {
+  return mus_window_->bounds();
+}
+
+void PlatformWindowMus::SetTitle(const base::string16& title) {
+  NOTIMPLEMENTED();
+}
+
+void PlatformWindowMus::SetCapture() {
+  NOTIMPLEMENTED();
+}
+
+void PlatformWindowMus::ReleaseCapture() {
+  NOTIMPLEMENTED();
+}
+
+void PlatformWindowMus::ToggleFullscreen() {
+  NOTIMPLEMENTED();
+}
+
+void PlatformWindowMus::Maximize() {
+  SetShowState(mus::mojom::SHOW_STATE_MAXIMIZED);
+}
+
+void PlatformWindowMus::Minimize() {
+  SetShowState(mus::mojom::SHOW_STATE_MINIMIZED);
+}
+
+void PlatformWindowMus::Restore() {
+  SetShowState(mus::mojom::SHOW_STATE_RESTORED);
+}
+
+void PlatformWindowMus::SetCursor(ui::PlatformCursor cursor) {
+  NOTIMPLEMENTED();
+}
+
+void PlatformWindowMus::MoveCursorTo(const gfx::Point& location) {
+  NOTIMPLEMENTED();
+}
+
+void PlatformWindowMus::ConfineCursorToBounds(const gfx::Rect& bounds) {
+  NOTIMPLEMENTED();
+}
+
+ui::PlatformImeController* PlatformWindowMus::GetPlatformImeController() {
+  return nullptr;
+}
+
+void PlatformWindowMus::SetShowState(mus::mojom::ShowState show_state) {
+  WindowManagerConnection::Get()->window_manager()->SetShowState(
+      mus_window_->id(), show_state, base::Bind(&WindowManagerCallback));
+}
+
+void PlatformWindowMus::OnWindowDestroyed(mus::Window* window) {
+  DCHECK_EQ(mus_window_, window);
+  delegate_->OnClosed();
+  mus_window_ = nullptr;
+}
+
+void PlatformWindowMus::OnWindowBoundsChanged(mus::Window* window,
+                                              const gfx::Rect& old_bounds,
+                                              const gfx::Rect& new_bounds) {
+  delegate_->OnBoundsChanged(new_bounds);
+}
+
+void PlatformWindowMus::OnWindowFocusChanged(mus::Window* gained_focus,
+                                             mus::Window* lost_focus) {
+  if (gained_focus == mus_window_)
+    delegate_->OnActivationChanged(true);
+  else if (lost_focus == mus_window_)
+    delegate_->OnActivationChanged(false);
+}
+
+void PlatformWindowMus::OnWindowInputEvent(mus::Window* view,
+                                           const mus::mojom::EventPtr& event) {
+  scoped_ptr<ui::Event> ui_event(event.To<scoped_ptr<ui::Event>>());
+  delegate_->DispatchEvent(ui_event.get());
+}
+
+void PlatformWindowMus::OnWindowSharedPropertyChanged(
+    mus::Window* window,
+    const std::string& name,
+    const std::vector<uint8_t>* old_data,
+    const std::vector<uint8_t>* new_data) {
+  if (name != mus::mojom::WindowManager::kShowState_Property)
+    return;
+  mus::mojom::ShowState show_state =
+      static_cast<mus::mojom::ShowState>(window->GetSharedProperty<int32_t>(
+          mus::mojom::WindowManager::kShowState_Property));
+  if (show_state == show_state_)
+    return;
+  show_state_ = show_state;
+  ui::PlatformWindowState state = ui::PLATFORM_WINDOW_STATE_UNKNOWN;
+  switch (show_state_) {
+    case mus::mojom::SHOW_STATE_MINIMIZED:
+      state = ui::PLATFORM_WINDOW_STATE_MINIMIZED;
+      break;
+    case mus::mojom::SHOW_STATE_MAXIMIZED:
+      state = ui::PLATFORM_WINDOW_STATE_MAXIMIZED;
+      break;
+    case mus::mojom::SHOW_STATE_RESTORED:
+      state = ui::PLATFORM_WINDOW_STATE_NORMAL;
+      break;
+    case mus::mojom::SHOW_STATE_IMMERSIVE:
+    case mus::mojom::SHOW_STATE_PRESENTATION:
+      // This may not be sufficient.
+      state = ui::PLATFORM_WINDOW_STATE_FULLSCREEN;
+      break;
+  }
+  delegate_->OnWindowStateChanged(state);
+}
+
+}  // namespace views
diff --git a/ui/views/mus/platform_window_mus.h b/ui/views/mus/platform_window_mus.h
new file mode 100644
index 0000000..6628cf9b
--- /dev/null
+++ b/ui/views/mus/platform_window_mus.h
@@ -0,0 +1,71 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_VIEWS_MUS_PLATFORM_WINDOW_MUS_H_
+#define UI_VIEWS_MUS_PLATFORM_WINDOW_MUS_H_
+
+#include <string>
+#include <vector>
+
+#include "base/macros.h"
+#include "components/mus/public/cpp/window_observer.h"
+#include "ui/platform_window/platform_window.h"
+
+namespace views {
+
+class PlatformWindowMus : public ui::PlatformWindow,
+                          public mus::WindowObserver {
+ public:
+  PlatformWindowMus(ui::PlatformWindowDelegate* delegate,
+                    mus::Window* mus_window);
+  ~PlatformWindowMus() override;
+
+  void Activate();
+
+  // ui::PlatformWindow:
+  void Show() override;
+  void Hide() override;
+  void Close() override;
+  void SetBounds(const gfx::Rect& bounds) override;
+  gfx::Rect GetBounds() override;
+  void SetTitle(const base::string16& title) override;
+  void SetCapture() override;
+  void ReleaseCapture() override;
+  void ToggleFullscreen() override;
+  void Maximize() override;
+  void Minimize() override;
+  void Restore() override;
+  void SetCursor(ui::PlatformCursor cursor) override;
+  void MoveCursorTo(const gfx::Point& location) override;
+  void ConfineCursorToBounds(const gfx::Rect& bounds) override;
+  ui::PlatformImeController* GetPlatformImeController() override;
+
+ private:
+  void SetShowState(mus::mojom::ShowState show_state);
+
+  // mus::WindowObserver:
+  void OnWindowDestroyed(mus::Window* window) override;
+  void OnWindowBoundsChanged(mus::Window* window,
+                             const gfx::Rect& old_bounds,
+                             const gfx::Rect& new_bounds) override;
+  void OnWindowFocusChanged(mus::Window* gained_focus,
+                            mus::Window* lost_focus) override;
+  void OnWindowInputEvent(mus::Window* view,
+                          const mus::mojom::EventPtr& event) override;
+  void OnWindowSharedPropertyChanged(
+      mus::Window* window,
+      const std::string& name,
+      const std::vector<uint8_t>* old_data,
+      const std::vector<uint8_t>* new_data) override;
+
+  ui::PlatformWindowDelegate* delegate_;
+  mus::Window* mus_window_;
+  mus::mojom::ShowState show_state_;
+
+  DISALLOW_COPY_AND_ASSIGN(PlatformWindowMus);
+};
+
+}  // namespace views
+
+#endif  // UI_VIEWS_MUS_PLATFORM_WINDOW_MUS_H_
diff --git a/ui/views/mus/window_tree_host_mus.cc b/ui/views/mus/window_tree_host_mus.cc
index 61c6f46..402eacd 100644
--- a/ui/views/mus/window_tree_host_mus.cc
+++ b/ui/views/mus/window_tree_host_mus.cc
@@ -4,159 +4,16 @@
 
 #include "ui/views/mus/window_tree_host_mus.h"
 
-#include "components/mus/public/cpp/property_type_converters.h"
-#include "components/mus/public/cpp/window_observer.h"
-#include "components/mus/public/cpp/window_property.h"
-#include "components/mus/public/cpp/window_tree_connection.h"
-#include "components/mus/public/interfaces/window_manager.mojom.h"
 #include "mojo/application/public/interfaces/shell.mojom.h"
-#include "mojo/converters/geometry/geometry_type_converters.h"
-#include "mojo/converters/input_events/input_events_type_converters.h"
 #include "ui/aura/env.h"
 #include "ui/aura/window.h"
-#include "ui/aura/window_event_dispatcher.h"
 #include "ui/events/event.h"
-#include "ui/events/event_constants.h"
-#include "ui/platform_window/platform_window.h"
-#include "ui/platform_window/platform_window_delegate.h"
 #include "ui/views/mus/input_method_mus.h"
 #include "ui/views/mus/native_widget_mus.h"
+#include "ui/views/mus/platform_window_mus.h"
 #include "ui/views/mus/surface_context_factory.h"
-#include "ui/views/mus/window_manager_connection.h"
 
 namespace views {
-namespace {
-
-void WindowManagerCallback(mus::mojom::WindowManagerErrorCode error_code) {}
-
-class PlatformWindowMus : public ui::PlatformWindow,
-                          public mus::WindowObserver {
- public:
-  PlatformWindowMus(ui::PlatformWindowDelegate* delegate,
-            mus::Window* mus_window)
-      : delegate_(delegate),
-        mus_window_(mus_window),
-        show_state_(mus::mojom::SHOW_STATE_RESTORED) {
-    DCHECK(delegate_);
-    DCHECK(mus_window_);
-    mus_window_->AddObserver(this);
-
-    delegate_->OnAcceleratedWidgetAvailable(gfx::kNullAcceleratedWidget,
-        mus_window_->viewport_metrics().device_pixel_ratio);
-  }
-
-  ~PlatformWindowMus() override {
-    if (!mus_window_)
-      return;
-    mus_window_->RemoveObserver(this);
-    mus_window_->Destroy();
-  }
-
- private:
-  void SetShowState(mus::mojom::ShowState show_state) {
-    WindowManagerConnection::Get()->window_manager()->SetShowState(
-        mus_window_->id(), show_state, base::Bind(&WindowManagerCallback));
-  }
-
-  // ui::PlatformWindow:
-  void Show() override { mus_window_->SetVisible(true); }
-  void Hide() override { mus_window_->SetVisible(false); }
-  void Close() override { NOTIMPLEMENTED(); }
-
-  void SetBounds(const gfx::Rect& bounds) override {
-    mus_window_->SetBounds(bounds);
-  }
-  gfx::Rect GetBounds() override { return mus_window_->bounds(); }
-  void SetTitle(const base::string16& title) override { NOTIMPLEMENTED(); }
-  void SetCapture() override { NOTIMPLEMENTED(); }
-  void ReleaseCapture() override { NOTIMPLEMENTED(); }
-  void ToggleFullscreen() override { NOTIMPLEMENTED(); }
-  void Maximize() override {
-    SetShowState(mus::mojom::SHOW_STATE_MAXIMIZED);
-  }
-  void Minimize() override {
-    SetShowState(mus::mojom::SHOW_STATE_MINIMIZED);
-  }
-  void Restore() override {
-    SetShowState(mus::mojom::SHOW_STATE_RESTORED);
-  }
-  void SetCursor(ui::PlatformCursor cursor) override { NOTIMPLEMENTED(); }
-  void MoveCursorTo(const gfx::Point& location) override { NOTIMPLEMENTED(); }
-  void ConfineCursorToBounds(const gfx::Rect& bounds) override {
-    NOTIMPLEMENTED();
-  }
-  ui::PlatformImeController* GetPlatformImeController() override {
-    return nullptr;
-  }
-
-  // mus::WindowObserver:
-  void OnWindowDestroyed(mus::Window* window) override {
-    DCHECK_EQ(mus_window_, window);
-    delegate_->OnClosed();
-    mus_window_ = nullptr;
-  }
-
-  void OnWindowBoundsChanged(mus::Window* window,
-                             const gfx::Rect& old_bounds,
-                             const gfx::Rect& new_bounds) override {
-    delegate_->OnBoundsChanged(new_bounds);
-  }
-
-  void OnWindowFocusChanged(mus::Window* gained_focus,
-                            mus::Window* lost_focus) override {
-    if (gained_focus == mus_window_)
-      delegate_->OnActivationChanged(true);
-    else if (lost_focus == mus_window_)
-      delegate_->OnActivationChanged(false);
-  }
-
-  void OnWindowInputEvent(mus::Window* view,
-                          const mus::mojom::EventPtr& event) override {
-    scoped_ptr<ui::Event> ui_event(event.To<scoped_ptr<ui::Event>>());
-    delegate_->DispatchEvent(ui_event.get());
-  }
-
-  void OnWindowSharedPropertyChanged(
-      mus::Window* window,
-      const std::string& name,
-      const std::vector<uint8_t>* old_data,
-      const std::vector<uint8_t>* new_data) override {
-    if (name != mus::mojom::WindowManager::kShowState_Property)
-      return;
-    mus::mojom::ShowState show_state = static_cast<mus::mojom::ShowState>(
-        window->GetSharedProperty<int32_t>(
-            mus::mojom::WindowManager::kShowState_Property));
-    if (show_state == show_state_)
-      return;
-    show_state_ = show_state;
-    ui::PlatformWindowState state = ui::PLATFORM_WINDOW_STATE_UNKNOWN;
-    switch (show_state_) {
-      case mus::mojom::SHOW_STATE_MINIMIZED:
-        state = ui::PLATFORM_WINDOW_STATE_MINIMIZED;
-        break;
-      case mus::mojom::SHOW_STATE_MAXIMIZED:
-        state = ui::PLATFORM_WINDOW_STATE_MAXIMIZED;
-        break;
-      case mus::mojom::SHOW_STATE_RESTORED:
-        state = ui::PLATFORM_WINDOW_STATE_NORMAL;
-        break;
-      case mus::mojom::SHOW_STATE_IMMERSIVE:
-      case mus::mojom::SHOW_STATE_PRESENTATION:
-        // This may not be sufficient.
-        state = ui::PLATFORM_WINDOW_STATE_FULLSCREEN;
-        break;
-    }
-    delegate_->OnWindowStateChanged(state);
-  }
-
-  ui::PlatformWindowDelegate* delegate_;
-  mus::Window* mus_window_;
-  mus::mojom::ShowState show_state_;
-
-  DISALLOW_COPY_AND_ASSIGN(PlatformWindowMus);
-};
-
-}  // namespace
 
 ////////////////////////////////////////////////////////////////////////////////
 // WindowTreeHostMus, public:
@@ -189,6 +46,11 @@
   DestroyDispatcher();
 }
 
+PlatformWindowMus* WindowTreeHostMus::platform_window() {
+  return static_cast<PlatformWindowMus*>(
+      WindowTreeHostPlatform::platform_window());
+}
+
 void WindowTreeHostMus::DispatchEvent(ui::Event* event) {
   if (event->IsKeyEvent() && GetInputMethod()) {
     GetInputMethod()->DispatchKeyEvent(static_cast<ui::KeyEvent*>(event));
diff --git a/ui/views/mus/window_tree_host_mus.h b/ui/views/mus/window_tree_host_mus.h
index 758e97b..73fc425 100644
--- a/ui/views/mus/window_tree_host_mus.h
+++ b/ui/views/mus/window_tree_host_mus.h
@@ -8,7 +8,6 @@
 #include "base/macros.h"
 #include "components/mus/public/interfaces/window_tree.mojom.h"
 #include "ui/aura/window_tree_host_platform.h"
-#include "ui/views/widget/native_widget_private.h"
 
 class SkBitmap;
 
@@ -28,6 +27,7 @@
 
 class InputMethodMUS;
 class NativeWidgetMus;
+class PlatformWindowMus;
 class SurfaceContextFactory;
 
 class WindowTreeHostMus : public aura::WindowTreeHostPlatform {
@@ -38,7 +38,7 @@
                     mus::mojom::SurfaceType surface_type);
   ~WindowTreeHostMus() override;
 
-  using WindowTreeHostPlatform::platform_window;
+  PlatformWindowMus* platform_window();
   ui::PlatformWindowState show_state() const { return show_state_; }
 
  private: